Sei sulla pagina 1di 49

El lenguaje Pascal

El lenguaje Pascal estndar presenta una seria de caractersticas que los hacen idneo como primero o segundo lenguaje de programacin, desde el punto de vista del aprendizaje y como lenguaje de propsito general para la resolucin de aplicaciones de todo tipo: gestion, cientficas, ingenieria, etc. Las caractersticas ms sobresalientes son: Lenguaje excelente para el aprendizaje de la programacin Lenguaje de propsito general. Lenguaje procedural (imperativo, orientado a ordenes). Lenguaje estructurado (soporta las estructuras bsicas while, for y repeat; no necesita el uso de la sentencia goto). Lenguaje recursivo (soporta la recursividad: propiedad de llamarse a si mismo una funcin o procedimiento). Gran riqueza de tipos(fuertemente tipeado), con tipos de datos simples y estructurados, as como datos definidos por el usuario. Produccin por los compiladores de programas ejecutables rpidos y eficientes. Facilidad para realizar programacin modular debido a la posibilidad de disear subprogramas o mdulos del tipo procedimiento y funcin.

El entorno Turbo Pascal contiene todos los recursos y herramientas necesarios para desarrollar, compilar, depurar y verificar sus propios programas Pascal. El acceso a estos recursos y herramientas se realiza mediante ordenes incorporadas a una serie de mens desplegables que aparecen en pantalla. Los resultados se producen en la ventana de salida Output. Las etapas que siempre debe seguir para crear un programa son: Editar el texto del programa fuente con el editor de Turbo Pascal (.pas). Examinar el texto y utilizar las ordenes del editor para corregir los errores. Compilar el programa. o Si el compilador encuentra un error, se retorna al editor al probable lugar del error. Ejecutar el programa y verificar los resultados. Verificar el programa. Si el programa no produce los resultados esperados, deber recurrir al depurador de Turbo Pascal para analizar la ejecucin del programa. Ejecutar el programa .EXE creado directamente desde Turbo Cambiar la opcin Destination del compilador en disco y compilar el programa una ultima vez.

TUTORIAL DE TURBO PASCAL


HISTORIA Y DESARROLLO DEL TURBO PASCAL La versin original de Turbo Pascal fue escrita en 1982 por un joven dans llamado Anders Heilsberg y vendida en Europa como Kompass Pascal. Philipe Kahn la llevo a Estados Unidos y cre la empresa Borland International con la filosofa de venta directa del compilador a los usuarios y a un precio mdico. El primer compilador comercializado incorporaba un editor y un compilador integrado, lo cual supuso una novedad en el campo de los compiladores, ya que normalmente se comercializaban ambos programas por separado. Esta primera versin(1.0) estaba disponible para mquinas que corran bajo CP/M y MS-DOS. Posteriormente, las versiones 2.0 y 3.0 que se comercializaron en 1984 y 1985 respectivamente; incrementaron las caractersticas del compilador, permitiendo 64k para cdigo, datos y pila. La versin 3.0 (1985) incluy soporte de solapamientos, grficos, rutinas de configuracin de pantallas y cajas de herramientas; esta versin supuso el auge de Pascal. En 1987 apareci la versin 4.0, que supuso la aparicin del concepto de unidades. Cada unidad tena su propio segmento de cdigo, hasta 64k, y una vez que una unidad era compilada, otros programas o unidades podan utilizarla sin recompilacin. El resultado fue que los programas Turbo Pascal (ahora archivos .EXE en lugar de .COM) estaban limitados en tamao solo por la memoria disponible. Con la versin 4.0 lleg el entorno integrado de desarrollo, EID (Integrated Development Environment, IDE). La versin 5.0 lleg en 1988 y aport esencialmente herramientas de depuracin. El depurador integrador incorporado a TP 5.0 permita seguimiento (traza) del cdigo, establecer puntos de ruptura y observar a modificar variables, todo ello sin dejar el EID. Otras caractersticas fueron la emulacin de coprocesadores matemticos y la incorporacin del Turbo Debbugger. En el ao 1989 supuso la introduccin de los conceptos de programacin orientada a objetos (POO), en un compilador potente y econmico: La versin 5.5. El Turbo Debbugger fue mejorado para manejar objetos. Por fin, la profesionalizacin de la POO lleg en 1990 con la incorporacin al programa de Turbo Vision (Una librera de objetos y la nueva versin 6.0). Otras propiedades especficas son: nuevo EID con soporte ratn, ensamblador incoprporado(BASM), campos privados y mtodos para objetos y compilador en la lnea de rdenes con modo protegido. En el ao 1992 Borland present la que sera ltima versin de Turbo Pascal 7.0, compatible con todas la anteriores y que ha introducido mejoras significativas, tanto el entorno integrado de desarrollo como el propio lenguaje Pascal y bibliotecas en tiempo de ejecucin, as como nuevas directivas y unidades. Turbo Pascal es un "lenguaje de programacin de alto nivel" bajo entorno ms-dos, con esta poderosa herramienta, se pueden crear un sin nmero de aplicaciones que van desde simples operaciones aritmticas como sumas, restas, hasta sistemas operativos, lenguajes de programacin, simulacines, videojuegos, manejadores de base de datos, virus y una amplia gama de programas cuyo nico lmite es solo la imaginacin del programador.

Armar un programa en Turbo Pascal es como jugar con bloques de construccin o legos; en estos se unen bajo un orden determinado una serie de piezas para lograr componer una figura determinada, al final a muchos no les interesa el resultado sino la forma que se constituyo; de igual modo, Pascal se compone de una serie de "PIEZAS" (Comandos, procedimientos, funciones, ciclos, sentencias, etc) las cuales permiten armar una determinada aplicacin para dar solucin a una necesidad o problema, esto se hace colocando cuidadosamente en su sitio correcto la "PIEZA" a "ENSAMBLAR" para que al final toda esta serie de partes "EMPALMEN" corretamente (como quien arma el motor de un automovil) y den marcha a la aplicacin perseguida. A pesar de que Turbo Pascal es un lenguaje orientado a objetos, este tutor esta orientado a programacin estructurada. En el recorrido que vayas haciendo se explicarn los comandos bsicos, con varios cdigos fuente y archivos ejecutables para cada uno de ellos, los cuales los puedes descargar, y correr en tu computadora. Para ello debes tener instalado el Turbo Pascal sea Versin 6.0 o 7.0. Esta lnea de cdigo consiste en la palabra program seguida de un nombre identificador que se lo da el usuario de acuerdo al tipo de programa que s este realizando, cabe destacar de que al igual que otros lenguajes no se permiten el uso de palabras reservadas porque s producirn errores de compilacin y por consiguiente los primeros dolores de cabeza en tus primeros pasos como programador.

Estructura De Un Programa En Pascal Hecha la introducin ahora empezaremos a meternos en materia. Esta vez ya atacamos fuerte y nos metemos con cmo se "monta" un programa en Pascal. Al Pascal no se le llama programacin estructurada porque s. A la hora de ponerse a hacer un programa hay que seguir una estructura bastante estricta. El esquema general de un programa sera este:

Nombre del programa * USES * Definicin de tipos globales * Definicin de constantes globales * Definicin de variables globales * Procedimientos * Declaracin * Tipos locales * Constantes locales * Variables locales * Codigo del procedimiento Cdigo principal

Nombre Del Programa Pues algo tan tonto como lo que podeis estar pensando. Consiste en darle un nombre al programa. Se hace poniendo al principio del programa una linea como esta: Program Programa_Que_Dice_Hola; "Program" es una palabra reservada del Pascal que sirve para indicar que a continuacin ponemos el nombre del programa. El nombre del programa NO puede contener espacios ni algunos otros caracteres "raros" como, por ejemplo, la "". El punto y coma final es IMPRESCINDIBLE. En Pascal ese punto y como se pone como "separador" de instruciones. As, despus de cada instrucin pondremos un punto y coma. Ya lo iremos viendo. Uses Uses es la palabra reservada de Pascal para incluir libreras. Como ya he dicho antes, una librera no es ms que un conjunto de funciones, que nosotros mismo podemos hacernos. Cualquier compilador de Pascal viene con unas libreras standar que traen funciones para trabajar con archivos, memoria, directorios, servicios del Dos, servicios de video, etc... Sin esas libreras no podramos hacer prcticamente nada. Siempre podramos hacernoslas nosotros, pero sera un trabajo inmenso. De entre todas las libreras del Pascal hay una que es especial, la librera SYSTEM.TPU. Es especial porque contiene las funciones ms bsicas, como pueden ser las que nos sirven para escribir en la pantalla, y esta librera se incluye SIEMPRE en nuestros programas. Otras libreras muy utilizadas con CRT.TPU, DOS.TPU y GRAPH.TPU, por ejemplo, pero de esto ya nos encargaremos cuando hablemos especficamente de las libreras. Para incluir una o varias libreras hay que aadir una linea de este estilo al programa: USES Crt, Dos, Graph; Definicion De Tipos Globales En esta secin de declaran las estructuras globales que vamos a utilizar. Se les llama globales porque las estructuras que definamos aqu podrn ser utilizadas en cualquier punto del programa. Procedimientos Un procedimiento podramos definirlo como un trozo de programa "autnomo". Es lo que antes he llamado una funcin. Aunque en un principio puede parecer una chorrada tener que ir partiendo los programa en procedimientos, esto resulta muy til para hacer un programa. Para dejarlo claro pondr un ejemplo sencillo:

Pongamos que tenemos que hacer un programa que dibuje muchos cuadrados. Cada cuadrado se dibuja a base de 4 lineas. Y cada linea se dibuja a base de muchos puntos colocados en linea. Podramos hacer un programa como este: Dibujar_Punto Dibujar_Punto Dibujar_Punto ....... Dibujar_Punto en 0,0 en 1,0 en 2,0 en 20,20

Este programa lo que hara sera dibujar todos los puntos de todos los cuadrados uno a uno. Si nos equivocamos en un slo punto ms nos vale volver a empezar porque seguro que no encontraremos en qu linea nos hemos equivocado. Nos quedara un cdigo muy "enborronado". Ahora pongamos que para hacer el mismo programa declaramos un procedimiento que dibuje una linea entera. As, para dibujar un cuadrado ahora ya slo tenemos que poner: Dibuja_Linea de 0,0 a 20,0 Dibuja_Linea de 0,0 a 0,20 Dibuja_Linea de 20,0 a 20,20 Dibuja_Linea de 0,20 a 20,20 Y ya tendramos dibujado un cuadrado. Y si ahora al trozo de programa que acabamos de escribir lo llamamos Dibuja_Cuadrado, podramos poner: Dibuja_Cuadrado de 0,0 a 20,20 De esta manera el procedimiento Dibuja_Cuadrado "llamara" 4 veces al procedimiento Dibuja_Linea para dibujar las 4 lineas correspondientes. Y cada procedimiento Dibuja_Linea llamara a Dibuja_Punto las veces necesarias para dibujar la linea en cuestin. Vendra a ser como si se repartiesen la faena. As, el mismo programa del principio lo podramos escribir as: Dibuja_Cuadrado de 0,0 a 20,20 Dibuja_Cuadrado de 10,10 a 30,30 ....... Espero que con este ejemplo quede demostrada la utilidad de dividir un programa en procedimientos. Ya iremos viendo ms adelante cmo se hace concretamente esto. Codigo Principal Se trata del cuerpo del programa. Normalmente consistir slo en llamadas a los procedimientos que hayamos definido, pero en la realidad no es solo eso. Programa De Ejemplo Para empezar a concretar las cosas y para que os empeceis a acostumbrar a los listados en Pascal os pongo aqu un pequeo programa de ejemplo.

Program Programa_Que_Dice_Hola; Uses Crt; { incluir la librera CRT } Const { declaracin de constantes globales } Texto = 'Hola!!! Qu tal? ;)'; Procedure Escribe_Texto; { Declaracin del procedimiento } Begin WriteLn(Texto); { escribe la constante "Texto" } End; Begin Escribe_Texto; End. Palabras reservadas Para poder programar en cualquier lenguaje es necesario conocer los cdigos mediante los cuales podamos expresar las tareas que queremos realizar. El Turbo Pascal, como lenguaje de programacin pose su propio cdigo con palabras de uso exclusivo para ciertas funciones, a estas palabras les llamaremos palabras reservadas de Turbo Pascal. Las palabras reservadas de Turbo Pascal (versiones 6.0 o mayores) son: Pascal Estandar y Turbo Pascal 6.0 AND CONST ELSE FORWARD IN NOT SET UNTIL ARRAY DIV END LABEL OF THEN VAR BEGIN DO FILE MOD OR TO WHILE CASE DOWNTO FOR IF NIL PACKED TYPE WITH { inicio del cdigo principal } { llamada al procedimiento }

FUNCTION GOTO

PROCEDURE PROGRAM RECORD REPEAT

Turbo Pascal ABSOLUTE PRIVATE VIRTUAL INLINE STRING ASM SHR INTERRUPT USES DESTRUCTOR OBJECT UNIT SHL XOR

IMPLEMENTATION INTERFACE

CONSTRUCTOR EXTERNAL

Estas palabras no pueden ser usadas como identificadores (siguiente tpico) ya que cada una de ellas tiene una funcin definida en Turbo Pascal. Tipos de datos

El manejo de la informacin en Turbo Pascal se realiza mediante diferentes clases de datos. BYTE (8 bits, 0..255) En tipo byte define una variable que ocupar 8 bits de memoria (un byte) y esta variable podr contener valores desde el 0 hasta el 255, ambos incluidos. SHORTINT (8 bits, -128..127) Define una variable que ocupa 8 bits y puede tomar valores de -128 a 127. Con estas variables hay que tener cuidado porque 127+1=-128. CHAR (8 bits, caracter) Define una variable de 8 bits pero que no contiene valores sino cualquier caracter ASCII. BOOLEAN (8 bits, verdadero-falso) Define una variable de 8 bits que slo puede contener dos valores: TRUE (verdadero) o FALSE (falso). INTEGER (16 bits, -32768..32767) Define una variable de 16 bits (2 bytes) que puede contener valores desde -32768 hasta 32767. Sucede lo mismo que con el tipo Shortint: 32767+1=-32768. WORD (16 bits, 0..65535) Define una variable de 16 bits que soporta valores de 0 a 65535. LONGINT (32 bits, -2Gb..(2Gb-1) ) Define una variable de 32 bits (4 bytes) que puede contener valores desde -2147483648 hasta 2147483647. REAL, SINGLE, DOUBLE (punto flotante) Estos tipos son tambin numricos pero son un tanto peculiares. Estn pensados para poder trabajar con nmeros muy grandes pero no tienen mucha precisin, es decir 4+1 no siempre ser 5. Una caracterstica de estos tipos de datos, adems de poder trabajar con nmeros de hasta 1.1e4932, es que con ellos podemos usar nmeros con decimales. A una variable SINGLE le podemos asignar el valor 1.5 (y tal vez lo que se guarde realmente sea 1.49, como ya he dicho) pero en cambio no le podemos asignar ese mismo valor a una variable de tipo INTEGER, por ejemplo. Las operaciones con los tipos SINGLE y DOUBLE se realizarn bastante ms rpido si se ejecutan en un ordenador con coprocesador matemtico y se ha activado la opcin del compilador para usarlo. Los REAL en cambio no irn ms rpido ya que no son un formato standar sino que es un formato que se ha inventado Borland para sus compiladores de Pascal. STRING (cadena) Define una variable de 256 bytes que puede contener una cadena de hasta 255 caracteres. (Una frase de hasta 255 letras, para entendernos.

Program Programa_Demo_De_Variables; Const { Definimos constantes, como ya habamos visto } Numero = 8; Cadena = 'Esto es una cadena ;)'; Var { Declaramos unas cuantas variables... } Tipo_Int : Integer; { Usamos el Integer como ejemplo para: BYTE, SHORTINT, INTEGER ,WORD y LONGINT } Tipo_Bool : Boolean; Tipo_Real : Single; { Usamos el tipo SINGLE como ejemplo para: REAL, SINGLE y DOUBLE } Tipo_Char : Char; Tipo_Cad : String; Begin Tipo_Int := Numero; { Asignamos el valor 8 a Tipo_Int } WriteLn(Tipo_Int); { Sacamos por pantalla el contenido de Tipo_Int } Tipo_Int := 4; WriteLn(Tipo_Int); Tipo_Bool := True; WriteLn(Tipo_Bool); { Asignamos el valor 4 a Tipo_Int } { Sacamos por pantalla el contenido de Tipo_Int } { Asignamos el valor True a Tipo_Bool } { Sacamos por pantalla el contenido de Tipo_Bool }

Tipo_Real := 87.724; { Asignamos el valor 87.724 a Tipo_Real } WriteLn(Tipo_Real:0:3);{ Sacamos por pantalla el contenido de Tipo_Real } Tipo_Char := 'A'; { Asignamos la letra 'A' a Tipo_Char } WriteLn(Tipo_Char); { Sacamos por pantalla el contenido de Tipo_Char } Tipo_Cad := Cadena; { Asignamos "Esto es una cadena ;)" a Tipo_Cad } WriteLn(Tipo_Cad); { Sacamos por pantalla el contenido de Tipo_Cad } End. TEXT Una variable de tipo TEXT declara una variable que servir para contener los datos de un archivo. Esos datos los necesita el programa para controlar el archivo, pero nosostros nunca los trataremos. Las funciones de la librera se encargan de modificar/tratar todo lo necesario en este tipo de variables. As, por ejemplo, al llamar a la funcin Reset, sta rellenar la variable que le indiquemos con los datos del archivo que hemos abierto. Las variables TEXT sirven para trabajar con archivo de texto. Todo lo referente a la gestin de archivos lo trataremos ms adelante, cuando hablemos de las funciones de la librera para trabajar con archivos. FILE Una variable de tipo FILE tiene exactamente la misma funcin que una TEXT slo que en vez de

10

tratarse de archivos de texto nos permitir trabajar con archivo binarios. Podemos definir variables FILE de varios tipos, dependiendo del tipo de elementos que integren el archivo o incluso podemos definir una variable FILE sin tipo, pero esto, como ya he dicho, lo trataremos ms adelante. ARRAY Define una variable que es un conjunto de elementos de un tipo. Es decir, si definimos un array de CHARs, por ejemplo, la variable en cuestin no contendr un solo elemento de tipo CHAR sino varios, la cantidad que nosotros le indiquemos. Pongamos un ejemplo: ESTRUCTURAS Una estructura define una variable formada por varios campos, y cada campo puede ser de un tipo diferente. Por ejemplo, pongamos que en una variable queremos guardar los datos de un amigo. Identificadores Los identificadores son palabras que representan constantes, variables, tipos de datos, procedimientos, funciones y algunos otros datos. Existen dos tipos de identificadores: los predefinidos de Turbo Pascal y los definidos por el programador. Algunos de los identificadores predefinidos son: integer, real, byte, sin, ... Los identificadores definidos por el programador son los elementos del lenguaje tales como variables, procedimientos, funciones, etc. Un identificador es una secuencia de 1 a 127 caracteres, que inicia con una letra, no tienen espacios ni smbolos: &, !, *, etc. y no es alguna palabra reservada. Para el Turbo Pascal no existen diferencias entre maysculas y minsculas, as que a un identificador denominado "valor" se le puede referir como "VALOR" o "VaLoR". Todo identificador en Pascal debe ser definido previamente a su utilizacin. Variables y constantes Los tipos de datos que manejaremos en nuestro programa pueden ser de dos clases: variables o constantes. Como su nombre lo indica las variables pueden cambiar a lo largo de la ejecucin de un programa, en cambio las constantes sern valores fijos durante todo el proceso. Un ejemplo de una variable es cuando vamos a sumar dos nmeros que sern introducidos por el usuario del programa, ste puede introducir dos valores cualesquiera y no sera nada til restringirlo a dos valores predefinidos, as que dejamos que use los valores que el necesite sumar. Ahora, si nuestro programa de operaciones matemticas va a utilizar el valor de PI para algunos clculos podemos definir un identificador PI con el valor de 3.1415926 constante, de tal forma que PI no pueda cambiar de valor, ahora en lugar de escribir todo el nmero cada vez que se necesite en nuestro programa, solo tenemos que escribir PI.

11

Las variables y constantes pueden ser de todos los tipos vistos anteriormente: numricos tanto enteros como reales, caracteres, cadenas de caracteres, etc. Comentarios Es posible introducir comentarios en nuestro programa que sirvan unicamente para mejorar la comprensin del cdigo fuente. Un comentario no es tomado en cuenta al momento de la compilacin del programa y es de enorme importancia al momento de crearlo, modificarlo o mantenerlo. Existen dos formas de colocar comentarios en un programa de Turbo Pascal, entre llaves: {Comentario} o entre parentesis y asteriscos: (*Comentario*). Declaracin de unidades Las unidades son mdulos independientes del programa que, aunque no son ejecutables por si mismos, pueden ser utilizados por el programa principal sin necesidad de reescribir el cdigo que contienen. Para la utilizacin de estos "subprogramas" es necesaria su declaracin. Crt (catode ray tube) Esta unidad provee rutinas de control sobre el modo de la pantalla, cdigos extendidos de teclado, colores, ventanas y sonidos. Graph Esta es una de las mas divertidas unidades, pues con la diversidad de funciones y procedimientos que provee, sumados a unos sencillos algoritmos permite hacer desde una simple linea o un crculo hasta una simulacin matemtica o un videojuego como pacman o tetrix. Dos Esta unidad nos brinda las rutinas necesarias para interactuar con el sistema operativo D.O.S. permitiendo tomar desde la hora o fecha del sistema hasta ejecutar programas o comandos. Printer Permite imprimir lineas y archivos de tipo texto, si se quieren imprimir grficos hay que recurrir a una serie de truquitos. Aunque hay muchas mas unidades, os aseguro que para aprender a programar en Turbo Pascal solo se necesitan las cuatro anteriores, eso s, teniendo en cuenta que el programador puede crear sus propias unidades. La palabra reservada USES cumple el propsito de declarar las unidades en el formato siguiente: USES crt, dos; Esta linea declara y habilita para su uso a la unidad crt y a la unidad dos Cada unidad que se declara debera estar separada de la siguiente por una coma. Al final de todas las unidades declaradas se deber colocar un punto y coma ";". Declaracin de constantes y variables Para declarar las constantes se utiliza la palabra reservada CONST seguida de un identificador al que se le dar un valor determinado, un signo de igual "=", el valor que recibir el identificador y al final un punto y coma ";". Ejemplo:

12

CONST pi = 3.1415926; De esta forma el identificador pi recibir el valor de 3.1415926 y no ser posible cambiarlo en el transcurso del programa. Es posible declarar varias constantes sucesivamente, puede ser una por rengln o varias en un solo rengln. Cuando se hace sto, la palabra CONST solo se pone una sola vez como cabecera y a continuacin todas las constantes por definir. Ejemplos: CONST PI = 3.1415926; Nombre = 'Juan Gutirrez'; Unidad = 1; Asignacin o igualacin La operacin de asignacin es una de las ms utilizadas en Turbo Pascal ya que nos permite darle un valor determinado a las variables que declaramos en el programa o lo que es lo mismo, igualarla a algn valor determinado. El smbolo utilizado para la operacin es los dos puntos seguidos por un signo de igual := , a la izquierda de dicho smbolo se coloca el identificador al que se le asignar un nuevo valor y a la derecha se colocar un identificador o algn valor directo que se almacenar en el primer identificador. Ejemplo: Nombre := 'Juan Prez'; {Nombre guardar la cadena "Juan Prez"} Resta := Numero1 - Numero2; {Resta gurdar el resultado de la resta de Numero2 a Numero1} Area := (Base*Altura)/2; {Obtiene el area de un triangulo y la guarda en el identificador rea Expresiones Hoy nos toca hablar sobre las expresiones. Es un asunto sencillo pero que es importante que quede claro. Una expresin, para decirlo de manera sencilla, podramos decir que es un clculo. Por ejemplo, una expresin podra ser esto: (7+8*15-34)/10 Puesto que es un clculo podemos indicar operaciones. Tenemos dos tipos de operaciones las numricas y las lgicas. Las numricas las realizamos con nmeros y dan como resultado un nmero. Las lgicas las podemos realizar con nmeros o con valores booleanos y dan como resultado un valor booleano. Operaciones Numericas Empecemos por las numricas. Como operaciones numricas tenemos estas:

13

+ * %

: Suma. : Resta. : Producto. : Mdulo. (es decir, haya el resto de la divisin) EJ: 4 % 3. Da el resto de 4 / 3, que es 1. : Divisin de reales. Esta divisin da como resultado un nmero real. Acepta como operandos / tantos nmeros reales como enteros. : Divisin de enteros. Esta divisin da como resultado un nmero entero y no acepta como Div operandos nmeros reales. Los operandos que podemos utilizar son: valores inmediatos, constantes o variables. Por ejemplo, en este caso: Const Constante = 7; Var Tabla : Array [0..10] of Byte; A : Word; Begin A := 8 + Tabla[9] - Constante; End.

Aqu "8" sera un valor inmediato, "Tabla[9]" una variable, y "Constante" una constante. As de sencillo. Un punto importante a tener en cuenta es la preferencia de las operaciones. Es decir, que " 8 + 3 * 2 " NO es lo mismo que " (8 + 3) * 2 ". En el primer caso se calcula primero 3*2 y al resultado se le suman 8 mientras que en el segundo se calcula primero 8 + 3 y el resultado se multiplica por 2. La preferencia es la misma que utilizamos normalmente para hacer operaciones matemticas: primero los parntesis, luego las multiplicaciones/divisiones/mdulos y por ltimo las sumas. Una expresin numrica puede utilizarse en una asignacin, como en el ejemplo anterior, para pasar un parmetro a una funcin, etc... Por ejemplo, en lugar de "A := 8 + Tabla[9] - Constante" podramos cambiarlo y poner "A := 8 + Tabla[Tabla[3]+Constante*2] - Constante". Con esto se calculara 7 * 2 (7 es el valor de "constante"), se le sumara el valor almacenado en la posicin 3 de la tabla y ese resultado se utilizara como ndice de la tabla. Se leera en valor que indique esa posicin y se le sumara 8 y se le restara 7. (la constante) Entrada y salida de datos Es indispensable para todo programa que cuente con la capacidad de manejar entradas y salidas de informacin, ya que sin estas capacidades sera un programa intil.

Salida de datos a la pantalla

14

Las instrucciones que permiten mostrar datos en la pantalla de la computadora son: Write y WriteLn. Aunque ya se hizo uso de ellas en los pequeos programas anteriores de ejemplo, aqui se describirn a fondo. La sintaxis de los procedimientos es la siguiente: Write (indentificadores); WriteLn (indentificadores); Donde los identificadores son aquellos que contienen la informacin que se desea mandar a la pantalla. Es posible utilizar varios de ellos por cada instruccin Write o WriteLn, unicamente se separan unos de otros por comas ",". Ejemplo: Write (Nombre, ApellidoP, ApellidoM); Esta linea de cdigo desplegar consecutivamente los contenidos de los identificadores Nombre, ApellidoP y ApellidoM. En caso de que la variable Nombre almacenara el valor 'Rodrigo ', la variable ApellidoP 'Gonzlez ' y la variable ApellidoM 'Garca', el resultado en pantalla sera: Rodrigo Gonzlez Garca Podemos obtener el mismo resultado si utilizamos la siguiente estructura: Write (Nombre); Write (ApellidoP); Write (ApellidoM); Si en lugar de utilizar la instruccin Write hacemos uso de WriteLn con la misma sintaxis del ejemplo anterior: WriteLn (Nombre); WriteLn (ApellidoP); WriteLn (ApellidoM); lo que obtendriamos sera: Rodrigo Gonzlez Garca De este ejemplo es posible concluir que la diferencia entre las instrucciones Write y WriteLn es que esta ltima imprime el contenido de los identificadores y cambia el cursor al siguiente rengln de la pantalla, y la primera solo escribe el contenido y deja el cursor al final del dato escrito. Entrada de datos desde teclado Las instrucciones estandar de Turbo Pascal para obtener datos desde el teclado son Read y ReadLn. La sintaxis de estas instrucciones es muy parecida a la de Write y WriteLn:

Read (Identificador);

15

El identificador puede ser cualquier variable definida previamente, NO puede ser una constante. Puede ser tambin un conjunto de variables, separadas entre comas, en este caso se guardara el primer valor dado antes del [Enter] en el primer identificador proporcionado, luego el segundo y as sucesivamente hasta el ltimo identificador. La diferencia en el uso de la instruccin Read con respecto a ReadLn es que en la primera, si se le dan mas datos de los que se introducirn se guardan en un buffer y se usarn en la siguiente instruccin Read o ReadLn del programa, en cambio ReadLn ignora todo dato posterior a los que esten definidos en la instruccin. En caso de que se le indique a Read o ReadLn que lea un tipo especfico de valor, y se le proporcione otro diferente se generar un error y se detendr la ejecucin del programa. Estructuras de control Las operaciones lgicas devuelven siempre verdadero (true) o falso (false). Se utilizan para hacer comprobaciones. Las operaciones lgicas de que disponemos son estas: = <> > < >= <= and or not : : : : : : : : : Devuelve verdadero si Devuelve verdadero si Devuelve verdadero si Devuelve verdadero si Verdadero si el primer Verdadero si el primer Devuelve verdadero si Verdadero si una o las Devuelve verdadero si los dos operandos son iguales los dos operandos son diferentes el primer operando es mayor que el segundo el segundo operando es mayor que el primero operando es mayor o igual que el segundo operando es menor o igual que el segundo las dos expresiones lgicas son verdaderas dos expresiones lgicas son verdaderas la expresin es falsa

Sentencias Condicionales Para crear un buen programa es necesario dotarlo con capacidad de desicin con base en las variables o eventos definidos por el programador, para que el programa sea aplicable en un entorno ms generalizado y no solo para un problema especfico. Para lograr este control se cuenta con las estructuras de control que, en Turbo Pascal, son las siguientes: Sentencia IF...THEN...ELSE Esta expresin es utilizada para ejecutar una sentencia en el caso que una condicin establecida sea verdadera, de lo contrario se podra ejecutar una sentencia distinta. Una sentencia condicional es algo como esto:

IF <expresin lgica> THEN <cdigo1>

16

ELSE <cdigo2>; De manera que si la expresin lgica es cierta se ejecuta el cdigo1 mientras que si es falsa se ejecuta el cdigo2. Tambin puede escribirse as: IF <expresin lgica> THEN <cdigo>; De esta manera si la expresin es cierta se ejecutar el cdigo y si es falsa no se har nada. Normalmente lo que se hace es encerrar entre un BEGIN y un END todo el cdigo que ser afectado por la sentencia condicional, as, un ejemplo sera este: IF Variable1 BEGIN Variable2 Variable1 END ELSE BEGIN Variable2 Variable1 END; = 0 THEN := 1; := 4;

:= 2; := 7;

Y aqu ATENCION a dnde estn puestos los puntos y coma. Los puntos y coma se usan en Pascal para marcar el final de una instrucin. As despus de cada una de las asignaciones hay uno. Y tambin debe ir otro al final de la sentencia condicional. (Despus del ltimo END)

La seccin ELSE con su correspondiente sentencia son opcionales y pueden omitirse en caso de no necesitarse. Sentencias IF anidadas Es posible utilizar en una expresin del tipo IF..THEN..ELSE una sentencia compuesta como la sentencia a ejecutarse en caso de que la condicin sea verdadera, as como en la sentencia posterior a un ELSE, de esta forma podemos utilizar otra sentencia IF..THEN..ELSE dentro de la anterior, para de esta forma evaluar varias condiciones una dentro de otra. Ejemplo: IF Numero > 5 THEN BEGIN IF Numero <10 THEN Opcion :="Numero; IF Numero <30 THEN Opcion2 :="Numero; END;

Selecciones CASE Esta forma de control se utiliza cuando se va a evaluar una expresin que puede contener varios datos diferentes y en cada dato deber realizar una accin especial. Por ejemplo, si se crea un men con diferentes opciones se realizar un determinado proceso para cada accin, aunque la seleccin por parte del usuario se haga desde el mismo lugar.

17

El siguiente programa ilustra el uso de la forma CASE, el programa preguntar un nmero al usuario y lo clasificar de acuerdo a su valor. PROGRAM Case; VAR Numero : Integer; BEGIN WriteLn('Introduzca un nmero entero del 1 al 5: '); ReadLn(Numero); CASE Numero OF 1 : WriteLn('El nmero fu 1'); 2 : WriteLn('El nmero fu 2'); 3 : WriteLn('El nmero fu 3'); 4 : WriteLn('El nmero fu 4'); 5 : WriteLn('El nmero fu 5'); ELSE WriteLn('El nmero no estaba en el rango indicado'); END.

Estructuras de control repetitivas BUCLES Los bucles nos sirven para repetir unas mismas instruciones varias veces. Para esto tenemos 5 tipos de bucles: FOR...TO Este tipo de bucle sigue esta estructura: FOR <variable> := <inicio> TO <fin> DO <cdigo>; Donde variable es cualquier numrica. (no podemos usar un String), donde es el nmero a partir del que empezamos a contar y donde es el nmero al que tenemos que llegar para parar de ejecutar . Pongamos un ejemplo: FOR Contador := 1 TO 5 DO BEGIN Variable1 := Contador; Variable2 := Variable2 + Contador; END; Aqu la sentencia FOR empezara a contar desde el 1 y ejecutando una vez el cdigo antes de sumarle uno a . Cuando contador llegue a 5 ya no se ejecutar ms el cdigo. Por lo tanto se ejecutar una vez para Contador=1, otra para Contador=2, para Contador=3, para Contador=4 y para Contador=5. Por lo tanto el cdigo se ejecutar 5 veces. Cuidado a la hora de usar 0 como inicio para el contador, porque de 0 a 5 el cdigo se ejecutara 6 veces! Tambin podemos usar DOWNTO en lugar de TO en esta sentencia y entonces lo que har ser

18

restar uno al contador en vez de sumarlo. Entonces el nmero al que ha de llegar tiene que ser MENOR que el inicial, es decir, ha de ser algo como esto: FOR Contador := 5 DOWNTO 1 DO Variable := Contador; DO...WHILE Este otro bucle sigue esta estructura: DO <cdigo> WHILE <expresin>; En este caso no hace falta encerrar entre BEGIN-END el cdigo porque ya queda delimitado por el DO-WHILE y no hay lugar a confusin. Este bucle es similar al FOR. Lo que hace es repetir el cdigo mientras la expresin sea cierta. PERO la comprobacin la hace despus de haber ejecutado el cdigo. Esto es importante porque gracias a eso el cdigo se ejecutar SIEMPRE una vez, como mnimo. As, esto se ejecutara una vez: A := 8; DO A := 8; WHILE A = 9; En cambio esto se ejecutara 3 veces: A := 1; DO A := A + 1; WHILE A <= 3; Al acabar la primera ejecucin A sera igual a 2, al acabar la 2 A sera igual a 3 y al acabar la tercera A sera igual a 4. Como 4 no es ni menor ni igual a 3 el bucle de para. WHILE...DO Este es prcticamente idntico al anterior. Tiene esta estructura: WHILE <expresin> DO <cdigo>; En este caso vuelve a ser necesario el BEGIN-END si queremos que lo que se repita sea ms de una instrucin. En este bucle la comprobacin se hace ANTES de ejecutar el cdigo y por eso puede que el cdigo no se ejecute ninguna vez en el caso de que la condicin sea ya al principio falsa. REPAT...UNTIL Este bucle sigue la siguente estructura: REPEAT <cdigo>

19

UNTIL <expresin> En este caso no es necesario el BEGIN-END y lo que hace este bucle es repetir el cdigo hasta que la expresin sea cierta, o lo que es lo mismo: lo repite mientras la expresin sea falsa. Es decir, algo como esto no parara nunca de ejecutarse: REPEAT A := A + 1; UNTIL 2 = 3; Aqu le estamos diciendo que repita el cdigo hasta que 2 sea igual a 3. Y... como yo creo que va a tardar un ratito en que 2 sea igual a 3 pues... este bucle no acabara nunca y tendramos que hacer un reset o pulsar CTRL+C si estamos ejecutndolo desde el IDE. Programacin Modular En algunas ocasiones se debe llamar un bloque de cdigo mas de una vez, una forma de hacerlo es escribir las instrucciones tantas veces como se necesite, tornando de esta manera programas con exceso de cdigo y dificultad para descubrir posibles errores, la otra es meter las instrucciones en subprogramas que se invocan cada vez que se necesiten. Los procedimientos y funciones se declaran o escriben antes del begin principal, un procedimiento o funcin puede contener otros procedimientos y funciones. En resumen: Las subrutinas son esencialmente partes separadas de cdigo que ejecutan tareas pequeas de un programa GRANDE. Procedimientos Un procedimiento es un grupo de sentencias que realizan una tarea concreta. En lugar de reescribir el cdigo completo de esa tarea cada vez que se necesite, unicamente se hace una referencia al procedimiento. Por ejemplo, es muy comn que se quiera visualizar un ttulo determinado varias veces en un programa, para evitar teclear ese ttulo en nuestro programa fuente todas las veces que sea necesario creamos un procedimiento llamado "Titulo" que se encargar de escribirlo. Una vez creado un procedimiento actuar como una instruccin ms de Turbo Pascal, y para ejecutarlo unicamente teclearemos el nombre de dicho procedimiento. Para poder ejecutar un procedimiento es necesario declararlo en el programa que se este utilizando.

Creacin de los procedimientos El crear primer paso para un procedimiento es

20

saber que queremos que haga. Una vez definiendo este punto declaramos el procedimiento despues de haber declarado variables y constantes, antes del cuerpo del programa principal. La palabra reservada para su declaracin es Procedure seguida del nombre del procedimiento. Vamos a crear un procedimiento encargado de escribir en pantalla el enunciado "Programa de Turbo Pascal":

PROCEDURE Titulo; BEGIN WriteLn ('Programa de Turbo Pascal'); END; Uso de los procedimientos Una vez declarado el procedimiento es posible utilizarlo como una instruccin de Turbo Pascal. Al uso de un procedimiento se le conoce como llamada al procedimiento. El siguiente programa ilustra el uso o la llamada al procedimiento creado anteriormente: PROGRAM Procedimientos; PROCEDURE Titulo; BEGIN WriteLn ('Programa de Turbo Pascal'); END; BEGIN WriteLn ('Programa ejemplo del uso de procedimientos'); Titulo; {Llama al procedimiento} WriteLn; Titulo; {Vuelve a llamar al procedimiento} END;

Variables locales y globales

21

En Turbo Pascal cada identificador tiene un campo de accin, solo dentro de ste campo es posible utilizarlo. Los ejemplos ms claros son las variables, que pueden ser globales o locales. La diferencia estriba en que una variable global puede ser utilizada por cualquier parte del programa, incluyendo a todos los procedimientos, en cambio una variable local puede ser utilizada unicamente por el procedimiento en el que esta declarada, el programa principal y los otros procedimientos la toman como inexistente. Ejemplo: PROGRAM Variables; VAR Hola : String; PROCEDURE prueba; VAR Adios : String; BEGIN {En esta seccin si es posible usar la variable Hola} Adios := 'Adios, que les vaya bien'; WriteLn (Adios); END; BEGIN {En esta seccin no se reconoce a la variable Adios} Hola := 'Hola, bienvenidos al programa'; WriteLn (Hola); WriteLn (Adios); {Al compilar el programa se generar un error ya que la variable Adios es inexistente en esta seccin, para eliminar el problema quites esta linea} prueba; END.

Es posible darle el mismo nombre a una variable local y a una global en el mismo programa, pero entonces el procedimiento no podr utilizar la variable global ya que le da preferencia a las locales sobre las globales. Por ejemplo: PROGRAM Variables_2; VAR Saludo : String; PROCEDURE Mensaje; VAR Saludo : String; BEGIN Saludo := 'Este mensaje solo es vlido para el procedimiento "Mensaje"'; WriteLn('Saludo'); END; BEGIN Saludo := 'Primer saludo (Global)'; WriteLn (Saludo); Mensaje; WriteLn (Saludo); {Se escribir el mensaje "Primer saludo"} END.

22

Parmetros Para poder pasar informacin entre el programa principal y procedimientos, o entre los mismos procedimientos usamos los parmetros, que son los canales de comunicacin de datos. Los parmetros son opcionales y si no se necesitan no se deben usar. Para utilizarlos es necesario declararlos son la siguiente sintaxis: Pasar un parmetro significa direccionar el valor de una variable del programa principal al procedimiento hay dos clases: Paso de parmetros por REFERENCIA Cuando se pasa una variable a un procedimiento como parmetro por referencia, los cambios que se efecten sobre dicha variable dentro del procedimiento se mantienen incluso despus de que este haya terminado, es decir los cambios afectan al programa principal. Los cambios producidos POR PARAMETRO POR REFERENCIA son permanentes, pues TURBO PASCAL no pasa al procedimiento el valor de la variable sino la direccin de memoria de esta. Para que un parmetro se pase por referencia tenemos que declararlo de una manera especial: tenemos que preceder su nombre de la palabra reservada "var".

Sintaxis PROCEDURE Nombre_procedimiento( VAR variable : tipo de dato) BEGIN {Bloque de instrucciones} END; Paso de parmetros por VALOR La diferencia de pasar parmetros por referencia respecto a parmetros por valor radica en que en estos ltimos se guarda en memoria una copia temporal de la variable, dentro del procedimiento solo se utiliza la copia, cuando se modifica el valor del parmetro solo afecta al almacenamiento temporal, la variable actual fuera del procedimiento nunca se toca.

Sintaxis PROCEDURE Nombre_procedimiento(variable : tipo de dato)

23

BEGIN {Bloque de instrucciones} END;

Ejemplo: program Ambos_procedimientos; var Contador : integer; Indice : integer; procedure Imprime_Datos(estable : integer); {Este es un procedimiento de PARAMETRO por VALOR} begin Writeln('Esta es la rutina : ',estable); estable := 12; end; procedure Imprime_y_modifica(var cambia : integer); {Este es un procedimiento de PARAMETRO por REFERENCIA} begin Writeln('Esta es el procedimiento de impresin y modificacin ', Cambia); Cambia := 35; end; begin (* Programa principal *) for Contador := 1 to 3 do begin Indice := Contador; Imprime_Datos(indice); Writeln('Volvemos al procedimiento de impresin, Indice =',Indice); Imprime_y_modifica(Indice); Writeln('Volvemos al procedimiento de impresin, Indice =',Indice); Imprime_datos(indice); Writeln('Regresamos de nuevo a la impresin de nuevo y el valor del ndice es =',Indice); Writeln; {Imprimimos una linea en blanco} end;{Final del ciclo for} readln;{Se hace una espera hasta que se presiona la tecla ENTER} end. (* Final del programa principal *)

Definicin de las funciones

24

Las funciones son, al igual que los procedimientos, un conjunto de sentencias que se ejecutan constantemente, la diferencia entre stas y los procedimientos es que las funciones regresan un valor. La declaracin de las funciones se realiza de la siguiente forma: FUNCTION nombre(parmetros) : tipo_de_datos; Las funciones son, al igual que los procedimientos, un conjunto de sentencias que se ejecutan constantemente, la diferencia entre stas y los procedimientos es que las funciones regresan un valor. La declaracin de las funciones se realiza de la siguiente forma: FUNCTION nombre(parmetros) : tipo_de_datos; A continuacin se escribe el contenido de la funcin como una sentencia normal (sencilla o compuesta), normalmente terminando con la igualacin de la funcin al valor que regresar. A continuacin se escribe el contenido de la funcin como una sentencia normal (sencilla o compuesta), normalmente terminando con la igualacin de la funcin al valor que regresar. Ejemplo: FUNCTION Promedio (a, b : Real) : Real; {Promedio de dos nmeros reales} BEGIN Promedio := (a + b) / 2; END; Como las funciones devuelven un valor especfico la forma ms usual de utilizarlas es por medio de asignaciones de una variable a la funcin. Ejemplo: PROGRAM Funciones; VAR X, Y, Z : Real; FUNCTION Promedio (a, b : Real) : Real; {Promedio de dos nmeros reales} BEGIN Promedio := (a + b) / 2; END; BEGIN X := 5.89; Y := 9.23; Z := Promedio (X, Y); {Iguala Z al valor devuelto por la funcin Promedio} WriteLn('El promedio de ',X,' y ',Y,' es: ',Z); END. Funciones predefinidas en Turbo Pascal Truncamiento y redondeo La funcin Round (nmero) redondea un nmero real al entero ms cercano y devuelve el resultado como un nmero real. La funcin Trunc (nmero) elimina la parte decimal del nmero real y devuelve el resultado como tipo entero. Ejemplo:

25

PROGRAM Redondeo; VAR Entero : Integer; ValorReal1, ValorReal2 : Real; BEGIN ValorReal1 := 123.435; ValorReal2 := Round(ValorReal1); Entero := Trunc (ValorReal1); WriteLn('El resultado de la funcin Round sobre el valor'); WriteLn(ValorReal1, ' es: ','ValorReal2, ' (Nmero real)'); WriteLn('El resultado de la funcin Trunc sobre el valor'); WriteLn(ValorReal1, ' es: ', Entero, ' (Nmero entero)'); END. Funciones exponenciales y logartmicas La funcin Sqr devuelve el cuadrado del valor utilizado como parmetro. Sqrt regresa la raz cuadrada del valor dado como parmetro, el resultado siempre es real aunque se utilice un nmero de tipo entero como argumento. Ejemplo: PROGRAM Exponentes; VAR Dato, Cuadrado : Integer; Raiz : Real; BEGIN Dato := 45; Cuadrado := Sqr(Dato); Raiz := Sqrt(Dato); WriteLn(' El cuadrado de ',Dato, ' es: ',Cuadrado); WriteLn('La raz cuadrada de ',Dato,' es: ',Raiz); END. Funciones aritmticas Abs regresa el valor absluto del identificador que se le pase como parmetro. El valor que devuelve ser del mismo tipo que el argumento. Abs(-24) {Regresa el valor 24} La funcin Int devuelve la parte entera de un valor real, como tipo real. La funcin Frac regresa la parte decimal de un valor real, tambin como valor real. Funciones trigonomtricas Las funciones trigonometricas definidas en Turbo Pascal son: Sin(valor), Cos(valor) y Arctan(valor), todas las demas pueden definirse desde estas:

Tan(x) Sin(x) / Cos(x) Cot(x) Cos(x) / Sin(x)

26

Sec(x) 1 / Cos(x) Csc(x) 1 / Sin(x)

Generacin de nmeros aleatorios Para generar nmeros aleatorios Turbo Pascal cuenta con la funcin Random y el procedimiento Randomize. La funcin Random genera un nmero aleatorio de tipo real comprendido entre 0 y 1, en cambio la funcin Random (x) genera un entero aleatorio entre 0 y x. Sin embargo el uso de la funcin Random es en ocasiones insuficiente por si sola para la generacin de valores aleatorios ya que los nmeros son realmente pseudoaleatorios, y cada vez que se ejecute el programa se obtendran los mismos valores. Para evitar esto debemos utilizar en todo programa que utilice valores aleatorios el procedimiento Randomize, que inicializa el generador de nmeros aleatorios, en otras palabras, asegura que los nmeros que obtendr sern diferentes cada vez que se ejecute el programa. Es recomendable usar este procedimiento antes de cada funcin random del programa. Ejemplo de un programa generador de nmeros aleatorios: PROGRAM Nums_Aleatorios; VAR x : Integer; BEGIN Randomize WriteLn('Lista de nmeros aleatorios'); For x := 1 to 20 do WriteLn(Random); END. El control de pantalla y teclado Modo de Pantalla Las constantes definidas de Turbo Pascal para indicar el modo de pantalla que se utilizar son: Constante Valor Modo de video BW40 CO40 BW80 CO80 Mono Colores 0 1 2 3 7 40x25 Blanco y negro en tarjeta de color 40x25 Color 80x25 Blanco y negro en tarjeta de color 80x25 Color 80x25 Monocromtico

27

Las constantes definidas para los colores son: Colores para primer plano y fondo: Constante Valor Color Black Blue Green Cyan Red Magenta Brown 0 1 2 3 4 5 6 Negro Azul Verde Cyan Rojo Magenta Marrn Gris claro Colores para primer plano: Constante Dark gray Light Blue Light Green Light Cyan Light Red Yellow White Parpadeo Blink 128 La unidad CRT provee un conjunto de variables utilizadas para modificar aspectos referentes a entradas de teclado, modo de la pantalla, etc. A continuacin se listan las principales con su funcin especfica. CheckBreak Tipo : boolean. Cuando el contenido de esta variable es True se encuentra activada la terminacin de un programa por medio de las teclas Crtl-Break. Si se cambia su valor a False se desactiva esta opcin. Su valor por defecto es True. DirectVideo Tipo : boolean. Cuando existen problemas de entrada/salida de texto se debe desactivar esta variable (guardar en ella el valor false) que inhibe la escritura directa de caracteres a la memoria de video. LastMode Tipo : Word La variable LastMode contiene el valor del modo de texto actual. Se inicializa al momento de iniciar el programa y se utiliza comunmente para restaurar el modo original al momento de terminar el programa. TextAttr Tipo : Byte Valor Color 8 9 10 11 12 14 15 Gris oscuro Azul claro Verde claro Cyan claro Rojo claro Magenta claro Amarillo Blanco

Light Magenta 13

Light Gray 7

28

Usualmente se utiliza para cambiar los atributos de colores en la pantalla, es ms rpido que los procedimientos TextColor y TextBackground que tienen la misma funcin. WindMin Tipo : Word; Esta variable contiene las coordenadas de la esquina superior izquierda de la ventana de texto activa definida por el procedimiento Window. WindMax Esta variable contiene las coordenadas de la esquina inferior derecha de la ventana de texto activa definida por el procedimiento Window. A continuacin se listan algunos de los procedimientos que incluye esta unidad con una breve descripcin de cada uno. ClrEol Sintaxis: ClrEol; Este procedimiento borra todos los caracteres de la linea actual desde la posicin del cursor hasta el final de la linea. Ejemplo: PROGRAM Proc_ClrEol; USES Crt; VAR x,y : Integer; BEGIN FOR x := 1 TO 24 DO FOR y := 1 TO 80 DO Write('#'); GotoXY(15,15); ClrEol; END. ClrScr Sintaxis: ClrScr; Se utiliza para borrar la pantalla completa o la ventana actual y situa el cursor en la esquina superior izquierda. Ejemplo: PROGRAM LimpiarPantalla; USES Crt; VAR x,y : Integer; Prb : String;

29

BEGIN FOR x := 1 TO 24 DO FOR y := 1 TO 80 DO Write('#'); WriteLn('Presione [ENTER] para borrar la pantalla'); ReadLn(Prb); ClrScr; WriteLn('Se borr la pantalla'); END. Delay Sintaxis: Delay(Tmp : Word); Detiene la ejecucin del programa durante un tiempo especificado en Tmp en milisegundos. El intervalo vlido es desde 0 hasta 65535, la precisin del retardo depende de la precisin del reloj interno de la computadora. Ejemplo: PROGRAM Retardo; USES Crt; BEGIN WriteLn('Inicia retardo de aproximadamente 5 segundos'); Delay(5000); WriteLn('Fin del retardo'); END. DelLine Sintaxis: DelLine; Borra la linea donde se encuentra el cursor y las lineas inferiores suben una posicin. Ejemplo PROGRAM BorrarLinea; USES Crt; VAR x : Integer; prb : String; BEGIN ClrScr; For x := 1 to 20 DO WriteLn('Linea nmero: ', x); WriteLn('Presione [ENTER] para borrar la linea 6'); GotoXY(0,6); DelLine; WriteLn('Linea 6 eliminada'); END.

30

GotoXY Sintaxis: GotoXY(x, y : Byte); Posiciona el cursor en las coordenadas especificadas por x y y. El byte x representa la columna partiendo de izquierda a derecha y el byte y representa la fila partiendo de arriba hacia abajo. Ejemplo: PROGRAM Posicin; USES Crt; BEGIN GotoXY(10,10); Write('*'); GotoXY(20,20); Write('*'); END. HighVideo Sintaxis: HighVideo; Activa la pantalla de video de alta intensidad. InsLine Sintaxis: InsLine Inserta una linea en blanco en la posicin actual del cursor. LowVideo Sintaxis: LowVideo Activa la pantalla de video de baja intensidad. NormVideo Sintaxis: NormVideo; Restaura los atributos de primer plano y fondo a los colores originales establecidos cuando arranc el programa.

31

NoSound Sintaxis: NoSound; Desactiva el sonido iniciado con el procedimiento Sound. Sound Sintaxis: Sound (Frecuencia : Word); Genera un sonido en la bocina de la computadora a una frecuencia determinada por el valor de Frecuencia. Para detener el sonido es necesario ejecutar el procedimiento NoSound. TextBackground Sintaxis: TextBackGround (Color : byte); Se utiliza para seleccionar el color del fondo de la pantalla. Los valores que puede utilizar son del 0 al 7, tambin es posible utilizar las constantes predefinidas para los colores. TextColor Sintaxis: TextColor (Color : Byte); El procedimiento TextColor se usa para seleccionar el color del texto en la pantalla. TextMode Sintaxis: TextMode (Modo : Word); Define el modo de video, sto es, el nmero de filas y columnas que se podrn mostrar en pantalla, tambin si se mostrarn en blanco y negro o en color. Los modos vlidos de pantalla de texto son: Constante Valor Modo de video BW40 0 40x25 Blanco y negro en tarjeta de color

32

CO40 BW80 CO80 Mono Window Sintaxis: Window (x1, y1, x2, y2 : Byte);

1 2 3 7

40x25 Color 80x25 Blanco y negro en tarjeta de color 80x25 Color 80x25 Monocromtico

Define las coordenadas de la ventana de texto activa; x1 y y1 son las coordenadas de la esquina superior izquierda, x2 y y2 son las coordenadas de la esquina inferior derecha. KeyPressed Tipo: Boolean La funcin KeyPressed devuelve el valor de True si se puls alguna tecla y false si no se ha presionado ninguna. ReadKey Tipo: Char Esta funcin lee un caracter del teclado, se utiliza mucho para leer teclas de direccin, teclas de control y de funciones. WhereX Tipo: Byte WhereX devuelve el nmero de la columna donde se encuentra el cursor. WhereY Tipo: Byte La funcin WhereY devuelve el nmero de la fila donde se encuentra el cursor al momento de llamar a la funcioacute;n.

33

Tratamiento de cadenas de caracteres Las cadenas de caracteres son secuencias de caracteres con longitudes que varan desde 1 hasta los 255 caracteres. El tipo identificador de las cadenas es String. Cuando declaramos una variable de tipo string ser posible introducir hasta 255 caracteres en ella, pero tambin es factible declarar cadenas ms cortas agregando al momento de la declaracin la longitud de la variable, por ejemplo: VAR Mensaje : String[120]; {Longitud maxima = 120 caracteres} Composicin de una cadena

Comparacin de cadenas La comparacin de cadenas es una operacin muy comn en Turbo Pascal; estas comparaciones se realizan con base en el orden del cdigo ASCII, por ejemplo la cadena 'Prueba' es menor a la cadena 'prueba' ya que el valor del cdigo ASCII de P es 80 y el de p es 112. As tambin podemos diferenciar las cadenas con respecto a su tamao: 'Hola' es menor a 'Bienvenido' Existe un caso especial de una cadena, que es cuando no tiene ningn caracter en ella, en ese momento decimos que es una cadena nula o vaca. Se recomienda ampliamente inicializar todos los valores de las cadenas a cadenas nulas al inicio del programa, ya que podran contener datos extraos e indeseables. Manejo de los elementos de la cadena Es posible leer cada elemento de una cadena por separado, por ejemplo, si en la variable Calle almacenamos la cadena 'Hidalgo' es posible asignar a otra cadena el valor de Calle[x] donde x es el

34

caracter de la cadena que se quiere leer, as tambin es posible visualizar el caracter en pantalla usando la instruccin WriteLn. Ejemplo: PROGRAM Caracter; VAR Calle : String; Letra : String; BEGIN Calle := 'Hidalgo'; WriteLn(Calle[2]); {Visualiza el segundo caracter de Calle} Letra := Calle[1]; {Guarda en Letra el primer caracter de Calle} WriteLn(Caracter) END. Para conocer la longitud de una cadena utilizamos la funcin Length, la longitud es la cantidad de caracteres que contiene la cadena en un momento determinado. Su sintaxis es: Length (cadena); La funcin regresa un valor entero. PROGRAM Funcion_Length; VAR Cadena : String; BEGIN Cadena := 'Prueba de longitud'; WriteLn ('Longitud de la cadena: ', Length (Cadena)); END. El programa imprime en la pantalla un mensaje con la longitud de la cadena almacenada en memoria, en este caso especfico 18. En ocasiones es necesario combinar dos o ms cadenas de caracteres en una sola, para lograr sto utilizamos los siguientes mtodos. Operador + Es una de las formas ms sencillas de unir dos cadenas y se maneja exactamente como una suma, la nica limitante es que en caso de ser mayor la longitud resultante de la suma que la longitud que pueda manejar la variable en que se almacenar se truncarn los caracteres sobrantes. Ejemplo: Cadena1 := 'Buenos '; Cadena2 := 'dias '; Cadena3 := Cadena1 + Cadena2; WriteLn (Cadena3); Se imprimir en la pantalla: 'Buenos dias'. (Notese que este ejemplo es solo una seccin del programa, para ejecutarlo es necesario completar la estructura).

35

Concat La funcin concat produce los mismos resultados que la concatenacin, es posible incluir cualquier nmero de cadenas que se necesiten concatenar. La suma de las cadenas no deber sobrepasar la longitud que la variable, a la cual se asignar dicha suma, puede manejar. Ejemplo: Cadena := Concat (Cad1, cad2, cad3); Pos Laa funcin Pos nos sirve para localizar una determinada cadena dentro de otra, en otras palabras para verificar si una cadena es subcadena de otra segunda. Los parmetros que requiere son: la cadena que se buscar y la cadena donde se buscar la primera: Pos (Cadena1, Cadena2); Cuando encuentra la cadena la funcin devuelve su posicin inicial, en caso de que no la encuentre devuelve el valor de 0. Ejemplo: Cadena := 'Domingo Lunes Martes Miercoles Jueves Viernes Sabado'; WriteLn(Cadena); WriteLn(Pos('Lunes', Cadena)); {Muestra 9} WriteLn(Pos('Jueves', Cadena)); {Muestra 32} WriteLn(Pos('Ayer', Cadena)); {Muestra 0} Copy La funcin copy regresa una subcadena de una variable o constante dada como parmetro. Su sintaxis es: Copy (Cadena, Inicio, Cantidad); Donde Cadena es la fuente de la subcadena, Inicio es la posicin desde la cual se obtendr la subcadena y Cantidad es el nmero de caracteres que se extraern. Los valores de Inicio y Cantidad deben ser de tipo entero. Ejemplo: Cadena := "Nuevos horizontes"; WriteLn (Copy(Cadena, 8, 10)); {Visualiza: horizontes}

36

Insert El procedimiento Insert sirve para insertar una cadena dentro de otra en alguna posicin determinada. Sintaxis: Insert (Cadena1, Cadena2, Posicin) Donde Cadena1 es la que se insertar, Cadena2 es donde se insertar y Posicin es el lugar donde se insertar. El parmetro Posicin debe ser de tipo entero. Delete Este procedimiento elimina un determinado nmero de caracteres de una cadena. Su sintaxis es: Delete (Cadena, Inicio, Nmero) Cadena es la variable en la cual se eliminarn los caracteres, Inicio es la posicin del primer caracter a eliminar y Nmero es la cantidad de caracteres que se borrarn. UpCase La funcin UpCase regresa la letra mayuscula correspondiente al caracter dado como parmetro. Es muy comn trabajando con cadenas que se quiera convertir una que contiene un nmero a su valor numrico, para poder utilizarlo en operaciones matemticas, as como convertir un nmero a su equivalente en una cadena. Esto es ms fcil de entender si consideramos que no es lo mismo el valor 75 y el valor '75', en el primer caso es un nmero mientras que en el segundo es un par de caracteres ASCII. Para lograr estos cambios de tipo en Turbo Pascal utilizamos los procedimientos siguientes: Str El procedimiento Str obtiene una cadena a partir de un valor numrico. Su sintaxis es: Str(Valor, Cadena) Donde valor es el nmero a convertir y Cadena es la variable donde se almacenar la cadena ya convertida. Val Este procedimiento convierte una cadena en un valor de tipo numrico, el problema con esta funcin es que si la cadena no esta formada exclusivamente de nmeros siguiendo las reglas para el tipo de datos que se vallan a obtener se generar un error. Sintaxis: Val (Cadena, Num, Cdigo) Cadena contiene la cadena que ser procesada, Num es la variable de tipo numrico donde se guardar el valor de la cadena y Cdigo es una variable de tipo entero (Integer) que contendr el

37

valor de 0 si no hubo errores y un valor diferente en caso de que no se haya podido convertir la cadena, el valor de Cdigo representa la posicin de la cadena donde ocurrio el error.

Tipos de datos definidos por el usuario

Para acabar con las estructuras veremos cmo se define un tipo de datos. Los tipos de datos se definen a continuacin de la palabra reservada "Type". (al igual que las variables bajo "Var" o las constantes bajo "Const") Y a un tipo que nosotros definamos le podemos asignar cualquier tipo de variable de los que hemos visto. Definir el tipo siguiente, por ejemplo, no tiene gran utilidad: Type Octeto = Byte; Con l podramos definir una variable como esta: Var Edad : Octeto; Y sera equivalente a escribir: Edad : Byte; Pero cuando se trata de estructuras esto s que puede ser muy til, sobretodo para crear un cdigo claro y legible. Podemos definir un tipo que contenga la estructura que queramos y a partir de entonces trabajar con ese tipo de datos. Por ejemplo:

38

Type

Estructura = Record Nombre : String; Edad : Byte; End; Var Variable1 : Estructura; Variable2 : Array [1..10] of Estructura;

Los tipos ENUMERATIVOS Un tipo Enumerativo es un conjunto de valores constantes ordenados representados por identificadores. Estos tipos no estn predefinidos por el compilador. Los inventa el usuario. En la declaracin es donde el usuario define el tipo listando todos los identificadores en orden, separados por comas y encerrados entre parntesis. Sintaxis: ( { identificador }, ... ) Ejemplo: ( Primavera, Verano, Otoo, Invierno ) Los valores de un tipo enumerativo quedan ordenados segn su posicin en la lista de izquierda a derecha. A cada identificador le queda asignado un valor ordinal comenzando en 0 para el primero. Los identificadores de los tipos enumerativos no pueden ser definidos para otros propsitos dentro del mismo bloque de programa. Otros ejemplos de estos tipos:(agua, vino, cerveza, leche) (cilindro, cono, esfera) (recluta, soldado, cabo, sargento) (fluor, cloro, bromo, yodo) Type Vehiculos=(moto,auto,micro,colectivo,tren); Var forma:vehculos; Un valor no puede figurar en dos listas diferentes, es decir en dos tipos enumerados. Los procedimientos de entrada / salida no pueden leer o escribir datos de tipo enumerado. Para obtener el valor de la variable forma se debe utilizar la sentencia CASE: Case forma of Moto : write (moto) Auto : write (auto) Micro : write (micro) Colectivo : write (colectivo) Tren : write (tren) Se pueden declarar subrangos de tipos enumerados Ejemplo:

39

Type

dias=(lunes,martes,mircoles,jueves,viernes,sabado,domingo); laborales=lunes..viernes; Trabajo:laborales

Var

Los tipos subrango Con un tipo Subcampo, o Subrango, se especifica una parte limitada de otro tipo ordinal (llamado tipo base) para ser usado como un tipo distinto. Es el usuario quien lo crea. En la sentencia donde se declara, se indican los lmites que lo definen: Sintaxis: lmite inferior .. lmite superior lmite inferior: expresin constante que establece el lmite inferior del subcampo. lmite superior: expresin constante que establece el lmite superior del subcampo. Ejemplos: '0' .. '9' 'A' .. 'M' 1 .. 31 Enero .. Marzo Program prueba; Type Intervaloenteros=-100..100; Letrasmin='a'.. 'z'; Var Grande:integer; Reducido:intervaloenteros; type dias=(lunes,martes,miercoles,jueves.viernes,sabado,domingo); var hoy:dias Se puede definir directamente en la seccin var aunque no es muy recomendable Var Numero:1..10 Carcter: 'B'.. 'Y'; Laboral:lunes..viernes; Estructura de datos ARRAY La organizacin "array" es, probablemente, la estructura de datos ms conocida debido a que en muchos lenguajes es la nica disponible explcitamente. Un "array" es una estructura homognea que est constituida por componentes del mismo tipo, llamado tipo base. Tambin se denomina estructura de acceso aleatorio, o acceso directo, porque todos sus componentes pueden seleccionarse arbitrariamente y son igualmente accesibles. Para designar

40

a un componente aislado, el nombre de la estructura se ampla con el llamado ndice de seleccin del componente. El ndice debe ser un valor del tipo definido como tipo ndice del array. La definicin de un tipo "array" T especifica un tipo base T o y un tipo ndice I. TYPE T = ARRAY [ I ] OF T o Ejemplos: TYPE vector = ARRAY [1..3] OF REAL TYPE linea = ARRAY [1..80] OF CHAR TYPE nombre = ARRAY [1..32] OF CHAR Los ndices de un "array" deben ser de tipo ordinal. No suele ser posible utilizar el tipo INTEGER porque se excedera el espacio de memoria accesible. Para usar valores enteros como ndices, hay que indicar un subrango de enteros. Un valor de tipo "array" se puede designar por un constructor donde se indica el nombre del tipo y valores constantes de los componentes separados por comas y encerrados entre parntesis. El hecho de que los ndices tengan que ser de un tipo de datos definido tiene una consecuencia importante: los ndices pueden calcularse, es decir, puede ponerse una expresin en lugar de una constante. La expresin debe evaluarse y su resultado determina el componente seleccionado. Esta generalizacin proporciona una herramienta de programacin potente pero, al mismo tiempo, da ocasin a uno de los errores de programacin ms frecuentes: el valor resultante puede estar fuera del intervalo especificado como campo de variacin de los ndices. Se supone que en tales casos, la implementacin en un equipo concreto ha previsto la emisin de mensajes de error. Los valores organizados en forma de "array" se suelen manejar utilizando ndices variables y sentencias repetitivas que permiten construir algoritmos para realizar tratamientos sistemticos. Define una variable que es un conjunto de elementos de un tipo. Es decir, si definimos un array de CHARs, por ejemplo, la variable en cuestin no contendr un solo elemento de tipo CHAR sino varios, la cantidad que nosotros le indiquemos. Pongamos un ejemplo: Var Grupo : Array [1..10] of Integer Este cdigo define la variable Grupo como un array que contiene 10 datos de tipo Integer. Para acceder a uno de esos datos lo hacemos indicando el nmero de orden entre corchetes. As, para acceder al dato n 6 haramos esto: Grupo[6] := 9; O para asignar a el elemento n 6 el mismo valor que el elemento 9 podemos hacer esto: Grupo[6] := Grupo[9]; Podemos imaginarnos un ARRAY como una fila de elementos del tipo que hemos especificado. El array de la variable Grupo sera esto:

41

"Arrays" multidimensionales Los componentes de un "array" pueden estar estructurados. Una variable de tipo "array" cuyos componentes tambin son "arrays" se llama matriz. Un ejemplo de "array" bidimensional: TYPE fila = ARRAY [1..3] OF REAL matriz = ARRAY [1..3] OF FILA Esto es equivalente a: matriz = ARRAY [1..3] OF ARRAY [1..3] OF REAL o bien: matriz = ARRAY [1..3, 1..3] OF REAL Un "array" puede tener un nmero cualquiera de dimensiones y cada dimensin puede tener ndice de tipo diferente. Cada elemento de un "array" multidimensional se describe indicando, entre corchetes, valores para todos los ndices en el orden en que fueron declarados: Ejemplo: m [1,2] , entero [1,'B'] Tabla : Array [1..10,1..10] of Byte; En este caso se dice que tenemos un array bidimensional. Esto s: ahora el array ya no se representara como un fila sino como una tabla de 10 filas y 10 columnas. As: De esta forma, con Tabla[5,2] nos estaramos refiriendo al elemento que he marcado con "YY" y con Tabla[3,6] nos referiramos al elemento marcado con "XX". Tambin pueden hacerse array de ms dimensiones smplemente aadiendo el tamao de la nueva dimensin mediante comas. Para un array de 3 dimensiones lo declararamos as: Tabla3D : Array [1..10,1..10,1..10] of Word;

Registros

42

Un registro es un grupo de componentes llamados campos que pueden ser de tipos diferentes y pueden contener uno o varios elementos de datos. En la definicin se especifican el nombre y el tipo de cada campo. Una estructura define una variable formada por varios campos, y cada campo puede ser de un tipo diferente. Por ejemplo, pongamos que en una variable queremos guardar los datos de un amigo. Podramos definir una estructura como esta: Var Amigo : Record Nombre : String; Edad : Byte; DNI : Longint; Telefono : Longint; End; Con esto declaramos la variable amigo, que tiene 4 campos. El campo Nombre es una cadena de caracteres (String) el campo Edad puede contener valores de 0 a 255 y los campos DNI y Telefono son Longint para poder almacenar nmeros grandes. Para acceder a los campos lo hacemos escribiendo su nombre tras el de la variable separando ambos mediante un punto. Para rellenar la estructura podramos hacer: Amigo.Nombre := 'Perico el de los palotes'; Amigo.Edad := 29; Amigo.DNI := 12345; Amigo.Telefono := 3589325; En las estructuras podemos incluir CUALQUIER tipo de datos. Incluidos los arrays e incluso otras estructuras. As, podemos declarar una variable con: Amigo_Cambia_Cromos : Record Nombre : String; Edad : Byte; Tengui : Array [1..300] of Word; Falti : Array [1..300] of Word; Colecs : Record BolaDeDrac : Boolean; SonGoku : Boolean; DragonBall : Boolean; End; End; De esta manera, en Amigo_Cambia_Cromos.Tengui[20] guardaramos si el amigo tiene o no el cromo 20, y en Amigo_Cambia_Cromos.Colecs.SonGoku pondramos TRUE o FALSE dependiendo de si tiene hecha la colecin de cromos del Goku o no. Y ms til todaba es poder definir una estructura dentro de un array. Es decir, algo como esto: Amigos : Array [1..100] of Record Nombre : String; Edad : Byte; Colecs : Record SonGoku : Array [1..300] of Boolean;

43

BulmaEnBolas : Array [1..300] of Boolean; End; End; Con esto, definimos una "lista" en la que podemos guardar los datos de 100 amigos diferentes. Podemos guardar su Nombre, su Edad y los cromos que tienen de las dos coleciones. Ejemplos: Complejo = RECORD re : REAL ; im : REAL END; fecha = RECORD da : 1..31 ; ms : 1..12; anio : 1..2000 END; Persona = RECORD apellido : ARRAY [1..32] OF CHAR ; nombre : ARRAY [1..32] OF CHAR ; nacimiento : fecha ; sexo : ( varon, hembra ) ; ecivil : ( soltero, casado, viudo, divorciado ) END; Los campos de un tipo registro pueden ser tambin de tipo registro, como en el tercer ejemplo. Los constructores de registro se forman con el nombre del tipo seguido por valores constantes de los tipos correspondientes a cada campo puestos en el mismo orden en que fueron declarados, separados por comas y encerrados entre parntesis. Si algn campo es de tipo registro, su constructor queda en un parntesis anidado. Ejemplo: TYPE fechas = RECORD dia : 1..31 ; mes : 1..12 ; anio : 1..2000 END; salidas = RECORD artculo : ARRAY [1..4] OF CHAR ; cantidad : INTEGER ; fecha : fechas ; END El selector de un campo en una variable de tipo RECORD se forma escribiendo el nombre de la variable y el nombre del campo separados por un punto. Si el tipo incluye campos que tambin son registros, para describirlos hay que incluir en el selector el nombre de cada registro dentro del que est anidado.

44

Archivos Desde un punto de vista tcnico, un archivo es un conjunto de informacin de un mismo tipo,almacenada en un medio fsico, lgicamente estructurada para facilitar su acceso, modificacin y eliminacin. Cuando realizas un dibujo en PAINT, una carta en WINWORD, o una hoja de clculo en EXCEL, y escoges la opcin GUARDAR, estas archivando, es decir se pasa la informacin de la memoria a una unidad de almacenamiento para posteriormente poder recuperarla y trabajar sobre ella; de igual modo Turbo Pascal tiene estructuras de almacenamiento de informacin para que los datos producidos por un determinado programa se puedan observar en posteriores ocasiones, o en un nivel mas avanzado disear una base de datos similar a FOXPRO o ACCESS, o guardar el registro de los mejores puntajes para un determinado videojuego. Archivos de Tipo Texto Los archivos de tipo texto son llamados tambin archivos de acceso secuencial, estn formados por cadenas de caracteres separadas unas de otras por los cdigos retorno de carro/salto de lnea (RC/SL), la combinacin RC/SL (Cdigos ASCII 10 y 13) se conoce como delimitador. Un delimitador marca el final de algn elemento como un campo, un registro o una linea. El final del archivo se indica mediante el caracter ASCII 26, que tambin se expresa como ^Z o EOF. Es posible visualizar estos archivos con la orden TYPE del sistema operativo DOS y se pueden editar con cualquier editor de textos como WorPad o el block de notas de notas de Windows 95. Este tipo de archivos solo permite operaciones de lectura y escritura secuenciales, la nica forma de modificarlos es agregando lneas al final del archivo. Los pasos para leer o escribir en un archivo de este tipo son: -Declarar una variable de tipo texto y asociarla al nombre de un archivo - A esto tambin se le llama declarar el archivo. -Abrir el archivo ya sea para lectura o escritura. -Leer o escribir datos en el archivo. -Cerrar el archivo . Declaracin de un archivo Para declarar un archivo primero se declara una variable tipo text de la siguiente forma: VAR VarArchivo : Text; Una vez declarada la variable se asigna al nombre de algun archivo: ASSIGN (VarArchivo, NombreArchivo); Donde NombreArchivo es una cadena de caracteres que contiene el nombre del archivo, la unidad de disco donde se encuentra y el directorio. Por ejemplo: ASSIGN (VarArchivo, 'C:\DOS\PRUEBA.TXT'); Exsiten tres formas de abrir un archivo: Rewrite Reset Append

45

Si abrimos el archivo slo podremos leerlo. Si lo creamos slo podremos escribirlo y si lo abrimos para continuar escribiendo slo podremos escribir a partir del final del archivo. Para abrirlo usaremos RESET(VariableTEXT), para crearlo usaremos REWRITE(VariableTEXT) y para continuar escribiendo usaremos APPEND(VariableTEXT). Una vez que tenemos abierto el archivo podremos leer/escribir. Para eso usaremos Write/WriteLn y Read/ReadLn. Las usaremos exactamente igual que antes slo que el primer parmetro que pasaremos ser la variable de tipo TEXT que identifica al archivo. WriteLn(VarArchivo, 'Prueba de archivos'); Esta sentencia grabara el texto 'Prueba de archivos' en el archivo asignado a VarArchivo. Leer datos de un archivo Para leer los datos de un archivo de acceso secuencial se utilizan las instrucciones Read y ReadLn. La instruccin Read lee uno o varios datos del archivo abierto y deja el puntero en el mismo rengln en el cual ley los datos, en cambio ReadLn lee los datos y mueve el puntero al siguiente rengln. ReadLn(VariableTEXT, Valor1, Valor2, Valor3); Fin del archivo Normalmente los archivos de este tipo se leen rengln por rengln hasta llegar al final del mismo. Cuando se conoce de antemano el tamao del archivo es posible utilizar un ciclo FOR, pero es ms seguro utilizar la funcin EOF la cual es verdadera despues de que el programa lee la ltima linea de un archivo de acceso secuencial. La sintaxis de la funcin EOF es: EOF (VaribleArchivo); Es comn realizar la verificacin de la funcin con un ciclo WHILE como en el ejemplo siguiente: WHILE NOT EOF(Archivo) DO BEGIN ReadLn(Archivo, Datos); WriteLn(Datos); END; Cerrar archivos Para asegurar que toda la informacin se grabe en el disco correctamente es necesario cerrar el archivo antes de que se termine la ejecucin del programa, de lo contrario se corre el riesgo de que la ltima informacin que se haya accesado no se grabe en su totalidad. La instruccin para cerrar un archivo es Close, y su sintaxis es: Close (VaribleArchivo); Funcin Eoln

46

La funcin Eoln sirve para verificar si el puntero ha llegado al final de la linea. Regresa el valor verdadero si se encuentra al final. Comunmente se utiliza en las lecturas caracter por caracter. Agregar datos a un archivo de texto Para aadir datos a un archivo de texto son necesarios los siguientes pasos: Asignar un archivo a una variable con Assign. Agregar los datos con el procedimiento Append. Escribir los datos. Cerrar el archivo. A continuacin se ilustra un ejemplo de un programa que agrega una linea a un archivo de texto: PROGRAM Archivo1; VAR Archivito : TEXT; BEGIN Assign (Archivito, 'ROBOT.TXT'); Append(Archivito); WriteLn(Archivito, 'Este es un texto de prueba'); Close (Texto); END. Funciones De Lectura/Escritura De Archivos Con Tipo En lugar del tipo TEXT podemos usar el tipo FILE OF para declarar un archivo que no ser ya de texto sino que contendr elementos del tipo . Por ejemplo, si queremos hacer un archivo que est lleno de datos de tipo INTEGER lo declararamos as: Var Archivo : FILE OF Integer; Lo asignaremos igual que los archivos de texto, pero a la hora de abrirlo slo podemos usar RESET y REWRITE. Pero en este caso en ambos modos podemos leer y escribir indistintamente. La diferencia est en que RESET abre un archivo existente mientras que REWRITE crea/sobreescribe el archivo. Para leer/escribir en el archivo usaremos Write y Read, PERO NO WriteLn ni ReadLn. Y, por supuesto, ahora ya no podemos escribir cualquier tipo de datos sino que slo podemos leer/escribir datos del tipo del que es el archivo. As, para llenar de ceros un archivo de Integers haramos esto: Var Archivo : FILE OF Integer; Contador : Integer; Valor : Integer; Begin Assign(Archivo, 'Prueba.Pr'); ReWrite(Archivo); Valor := 0; For Contador := 1 to 10000 do

47

Write(Archivo,Valor); Close(Archivo); End. Normalmente no se desea crear archivos que puedan almacenar un solo tipo de datos ya que se requeririan varios archivos, por ejemplo para alguna base de datos: uno para los nombres, otro para apellidos, otro para la edad, etc. Para evitar este inconveniente es posible usar registros del tipo RECORD, que permiten grabar en un solo registro un grupo de datos que pueden ser de diferentes tipos, uno de tipo INTEGER, uno de tipo STRING, etc. Los registros del tipo record deben ser declarados antes de las variables en una seccin llamada TYPE con el siguiente formato: TYPE Nombre_Reg = RECORD Campo_del_registro_1 : Tipo; Campo_del_registro_2 : Tipo; ... Campo_del_registro_n : Tipo; END; Donde Nombre_Reg es el nombre del registro que se utilizar, Campo_del_Registro_x son las variables que estarn contenidas en el registro y Tipo es el tipo de cada una de las variables del registro. La seccin TYPE se escribe antes de la declaracin de las variables. Como ejemplo, si se quiere crear un archivo el que se guarden el nombre, domicilio, edad y estado civil de un grupo de personas el primer paso a realizar es crear un registro que contenga todos estos campos: TYPE Datos = RECORD Nombre : String[40]; Domicilio : String[60]; Edad : Integer; EdoCivil : String[10]; END; El siguiente paso es declarar un archivo del tipo Datos as como una variable del mismo tipo de los que se utilizarn en el archivo: VAR Archivo : FILE OF Datos; Persona : Datos; Abrir archivos Una vez declarado un archivo ya es posible abrirlo. En caso de querer abrir un archivo nuevo se utiliza la instruccin Rewrite, o si el archivo ya existe en el disco se abre con el procedimiento :Reset.

48

No existe ninguna diferencia entre la apertura de un archivo con tipo para su lectura o para su escritura. Si al utilizar el procedimiento Rewrite el archivo asignado ya exista se eliminar del disco y se crear uno nuevo, por lo mismo se debe tener cuidado al momento de abrir estos archivos. Registro actual y tamao de un rchivo La funcin FileSize regresa el tamao de un archivo, o mejor dicho devuelve el nmero de registros contenidos en ste. Al momento de abrir un archivo nuevo la funcin FileSize regresa el valor de 0, lo que significa que el archivo no tiene datos guardados en l. Posicionamiento en un registro determinado Cada uno de los registros de un archivo esta referenciado por un nmero especfico comenzando desde el registro 0 y aumentando de 1 en 1. La funcin FilePos devuelve el nmero de registro actual, su sintaxis es: FilePos (VariableArchivo) VariableArchivo es la variable a la cual se asign un nombre de archivo en el disco. Para moverse a un registro determinado se utiliza la funcin Seek, con la siguiente sintaxis: Seek (VariableArchivo, NumRegistro); Para moverse al final del archivo para agregar un nuevo registro se utiliza este mismo comando con el parametro NumRegistro como sigue: Seek (VariableArchivo, FileSize(VariableArchivo)); Cuando se avanza en un archivo registro por registro se utiliza la funcin EOF para determinar si ya se lleg al final del archivo. Lectura y escritura de archivos Para la lectura y escritura en un archivo con tipo se utilizan los procedimientos Read y Write. Despus de cada operacin de lectura o escritura el puntero se posiciona en el siguiente registro. Para estar seguros de que se leera el registro que se desea se debe emplear el procedimiento seek antes de cualquier procedimiento de lectura o escritura. Cerrar un archivo Para cerrar los archivos abiertos se procede igual que en uno de tipo texto, utilizando el procedimiento close: Close (VariableArchivo);

49

Potrebbero piacerti anche