Download - Sintaxis de Pascal
-
5/27/2018 Sintaxis de Pascal
1/39
Sintaxis y Semntica del Lenguaje
Sintaxis y Semntica del LenguajeEl lenguaje Pascal
Este apunte resume las componentes bsicas del lenguaje Pascal. Paraobtener mayor informacin se recomienda consultar la siguiente bibliografa:
-. Programacin en TURBO Pascal Versiones 5.5, 6.0, 7.0. L. JoyanesAguilar, Segunda edicin. Ed. McGraw Hill-. Intermediate problem solving. Segunda edicin. Helman - Veroff
Introduccin
Pascal es un lenguaje que permite programar en forma estructurada y
modularizada. Esto significa que es posible dividir al programa en mdulos(implementados utilizando procedimientos y funciones) y organizado de manera talque se pueda leer con facilidad. Esto ltimo tiene que ver con una buenaindentacin, comentarios, nombres mnemotcnicos, etc. Aunque estas ltimascaractersticas NO son imprescindibles en un programa Pascal, en la ctedra seexigir su cumplimiento.
Tipos
El lenguaje Pascal es tipado, lo que significa que casi1
todas sus variablesdeben tener un tipo asignado explcitamente.El tipo de una variable determina el rango de valores que la misma puede
contener y el conjunto de operaciones que se pueden aplicar sobre ella. En Pascalexisten tipos predefinidos (provistos por el lenguaje) y los definidos por elusuario.
Tipos predefinidos
Los tipos predefinidos son: Tipo entero Tipo real Tipo carcter Tipo lgico
1Existen algunas excepciones que no se van a tratar aqu.
-
5/27/2018 Sintaxis de Pascal
2/39
Sintaxis y Semntica del Lenguaje
Tipo enteroUna variable de tipo entero (integer) ocupa, por lo general, 2 bytes2 de
memoria y el rango de valores va desde -32768 a 32767. En realidad, existenotros 4 tipos de datos enteros, con diferentes rangos de valores:
tipo Rango #bytesbyte 0..255 1shortint -128 ..127 1integer -32768..32767 2word 0..65535 2longint -2147483648.. 214748364 4
Tipo realEl tipo real (real) est definido como punto flotante, es decir,
fraccin*exponente. Turbo Pascal diferencia 3 tipos de flotantes:
Tipo #bytessimple 4 bytesdoble 8 bytesextendido 10 bytes
Tipo CarcterHay dos tipos de caracteres:
Char: un nico carcter String: un conjunto de caracteres
Este tipo de datos identifica letras, nmeros, signos de puntuacin y todosaquellos smbolos que aparecen en la tabla ASCII.Ejemplo:
'a': el carcter a'la cadena': una cadena de caracteres1: el entero 1'1': el carcter 1
El tipo string define cadenas de 255 caracteres (si pensamos que uncarcter en la mayora de las mquinas se almacena en un byte, entonces un stringocupar 255 bytes). Tambin es posible definir strings ms pequeos que 255.
Ejemplo:string; define una cadena de 255 caracteresstring[20]: define una cadena de slo 20 caracteres
2Esto depende tambin de la mquina / plataforma sobre la cual se est trabajando.
-
5/27/2018 Sintaxis de Pascal
3/39
Sintaxis y Semntica del Lenguaje
Tipo lgicoEn Pascal el tipo lgico (boolean) admite nicamente dos valores: true y
false. Cualquier expresin lgica retorna valores de este tipo: verdadero o falso.
OperacionesLo que se vio hasta ahora es la estructura que tiene los tipos predefinidos
y el rango permitido de valores para cada uno, ahora se ver cules son lasoperaciones permitidas sobre cada tipo:
OPERACIONES DE RELACIN: En todos los casos es posible realizar lasoperaciones de comparacin por menor, mayor, igualdad y desigualdad. (=, =, = o )
OPERACIONES ARITMTICAS: Con los datos numricos (integer y real) esposible realizar las operaciones aritmticas: +, -, /, *.
OPERACIONES LGICAS: Con los datos lgicos adems estn los operadoresAND, OR, NOT.
OPERACIONES DE CONCATENACIN: Slo para los caracteres, y estrepresentada por el signo +.
SubrangosA veces se necesitan variables que slo tomarn cierto rango de valores y
no todo el permitido por el tipo. En estos casos, es posible acotar estos valoresespecificando slo el valor ms pequeo y el ms grande que dichas variablespueden tomar:
constanteMenor.. constanteMayor
Ejemplo:A..Z;1..100;
Tipos definidos por el usuarioMuchas veces es necesario manejar informacin cuyo tipo no est provisto
por el lenguaje. En este caso, pascal permite que el programador defina nuevostipos y los utilice luego. Un nuevo tipo se define utilizando la clusula type.
Type nombreTipo = tipoExistente;
Ejemplo:Type Edad = Integer;Type OtraEdad = 0..110;Type Cadena = string[30];
-
5/27/2018 Sintaxis de Pascal
4/39
Sintaxis y Semntica del Lenguaje
Los nombres de los tipos son indentificadores y, por lo tanto siguen lasreglas para nombrar identificadores que se detallan a continuacin.
Identificadores
Los identificadores en Pascal comienzan siempre con una letra (a..z,A..Z) ocon el smbolo _. y el resto pueden ser cualquier letra, _ y/o dgitos. Con unidentificador no solo hacemos referencia a un nombre de variable, sino quetambin a nombre de tipos, procedimientos, funciones, etc.
Las letras maysculas y minsculas se consideran sin distincin y puedentener cualquier longitud.
Declaracin de variables
Todos los identificadores que se utilicen en un programa Pascal se DEBENdeclarar ANTES de su uso.
Las variables se declaran utilizando la sentencia var.
varx:integer define una variable denominada x de tipo integer.
y: boolean define una variable denominada y de tipo boolean.z: 0..110 define una variable denominada z de tipo integer que slo
puede tomar los valores de 0 a 110.
E: Edad define una variable denominada e del tipo Edad (definidoanteriormente)
E1:otraEdad define una variable denominada e1 del tipo otraEdad(definido anteriormente)
Asignacin en Pascal
La asignacin es el mecanismo por el cual se liga una variable a un valordeterminado. En Pascal la asignacin se representa por la operacin ":=".
Ejemplo:a := 10;cad := 'esta es una cadena';
-
5/27/2018 Sintaxis de Pascal
5/39
Sintaxis y Semntica del Lenguaje
Estructuras de Control en Pascal
En Pascal existen sentencias simples y compuestas. Las sentenciascompuestas se encierran entre las palabras claves begin-end.
En esta seccin se detallarn cmo se definen en Pascal las estructuras decontrol.
Sentencias CondicionalesPermiten realizar selecciones en el flujo de control del programa. Hay dos
tipos de selecciones: Selecciones simples (if) Selecciones mltiples (case)
Sentencias if
Su forma general es:
ifexpresinthen sentencia1else sentencia2
donde:expresin es una expresin lgica que retorna true o false
sentencia1 y sentencia2 son sentencias Pascal simples o compuestas.DESCRIPCIN:
sentencia1 se ejecuta slo si expresin es verdadera, en casocontrario se ejecutar sentencia2
NOTA: el else es opcional y NO hay cierre de la sentencia;
Ejemplo:1) if num>10 then a:=a+1
else a:=a-1;
2) if num>10 then x:=x+1;
Sentencia Case
Su forma general es:case expresin
Valor:sentenciasValor1, valor2:sentenciasValor3..valor4:sentencias;
-
5/27/2018 Sintaxis de Pascal
6/39
Sintaxis y Semntica del Lenguaje
Valor 5..valor6, valor7:sentenciaselsesentencias
end;
DESCRIPCIN
: Permite elegir entre varias alternativas sin tener que anidar muchassentencias if. Consiste de una expresin que puede ser de cualquiertipo ordinal (con orden) y una lista de sentencias cada unaprecedidas por uno o ms valores del mismo tipo que la expresin. Deacuerdo al valor de la expresin se ejecutar aquella sentencia quecoincida con dicho valor. Si ninguna de las sentencias coincide, no seejecuta ninguna y se sigue en la instruccin siguiente al fin del case.Existe una clusula opcional, el else, con la cual, se generalizan todoslos valores no discriminados en el case:
NOTA: el else es opcional y en este caso se cierra con el end final.
Ejemplo:1) case sexo of
f, F: mujeres:= mujeres +1m, M: varones := varones +1
end;
2) case edad of0..2: bebes := bebes +13..11: ninios:= ninios +112..17: adolescentes := adolescentes + 1else: adultos:=adultos+1
end;
Sentencias de Repeticin
Estas sentencias permiten iterar o repetir una o ms sentencias. Existen
tres diferentes sentencias: while repeat until for
Sentencia while
Su forma general es:
while expresin dosentencia { puede ser simple o compuesta }
-
5/27/2018 Sintaxis de Pascal
7/39
Sintaxis y Semntica del Lenguaje
DESCRIPCIN:sentencia se ejecuta siempre que expresin sea verdadera. Cuandoes falsa, la iteracin termina y continua en la instruccin siguiente
Ejemplo:............while num>0
do num:= num-1;............
Sentencia repeat until
Su forma general es:
repeatsentencia1sentencia2.....
until expresin
DESCRIPCIN:Antes de evaluar la expresin se ejecutan las sentencias encerradasen la instruccin y a continuacin se evala la expresin paradeterminar su valor de verdad. Si el verdadera, se vuelven aejecutar las sentencias, y si es falsa, la iteracin termina y continuaen la instruccin siguiente
Ejemplo:............repeat
num:= num-1;until num
-
5/27/2018 Sintaxis de Pascal
8/39
Sintaxis y Semntica del Lenguaje
Su forma general es:
for ndice:= exp1 to exp2do sentencia { puede ser simple o compuesta}
donde:la variable ndice es de algn tipo escalar (entero, char, boolean o
enumerativo) y exp1 y exp2 deben ser del mismo tipo que ndice. La variable ndicese incrementa de a 1 (uno) despus de cada ejecucin del for. Se puededecrementar con downto en vez de to.
DESCRIPCIN:Bsicamente se ejecuta un conjunto de sentencias un nmero finitode veces, mientras que una variable (el ndice o variable de control)
pasa a travs de un rango de valores
Ejemplo:............for i:=1 to 10 do x:=x+1;............
Estructura de un programa Pascal
Un programa Pascal est formado por los tipos, variables, procedimientos yfunciones que se necesitan para dicho programa. Todo objeto referenciado en elprograma debe estar declarado con anterioridad. El orden en el cual se declaranlos identificadores, no necesariamente debe ser el siguiente pero la ctedra lorecomienda.
program nombre;{ para trabajar con unidades compiladas en forma separada}uses{ definicin de constantes}
const{ declaracin de tipos definidos por el usuario}type{ declaracin de variables}var{ definicin de procedimientos y funciones}
begin{ Cuerpo del programa}end.
-
5/27/2018 Sintaxis de Pascal
9/39
Sintaxis y Semntica del Lenguaje
Procedimientos y funciones
Una de las formas de encarar un problema es descomponerlo en problemas omdulos ms pequeos y ms sencillos de implementar. En Pascal, estos mdulos se
implementan mediante procedimientos y funciones. Tanto un procedimiento comouna funcin son subprogramas que realizan alguna tarea especifica.Las diferencias entre ellos son:
Las funciones devuelven un nico valor a la unidad que la llamo (elprograma principal o un procedimiento o funcin) En cambio losprocedimientos pueden retornar 0, 1 o ms valores.
Una funcin se referencia utilizando su nombre en una expresin,mientras que un procedimiento se referencia por una llamada oinvocacin.
ProcedimientosLa forma general de declararlos es
procedure nombreProc (lista de parmetros formales){ declaraciones locales }
begin{ cuerpo del procedimiento }
end;
Se lo invoca en el programa principal o en otros subprogramas por sunombre:
NombreProc;
nombreProc(parmetros reales);
Cuando se lo invoca, se localiza el procedimiento y se ejecutan lasinstrucciones del cuerpo, luego el control vuelve a la instruccin siguiente de dondese lo invoco.
Ejemplo:program demo;...procedure A;
beginend;
....begin......A;.....end.
Definicin del procedimiento A
Invocacin del procedimiento A
-
5/27/2018 Sintaxis de Pascal
10/39
Sintaxis y Semntica del Lenguaje
Que ventajas tiene la utilizacin de procedimientos?
Ahorro de lneas de cdigo: no repetir cdigo en el mismo programa Reusabilidad: utilizar el mismo cdigo en distintos programas. Utilizarlos
como un caja negra que acepta determinadas entradas y producedeterminadas salidas. Modularidad: se divide un problema en tareas o mdulos ms pequeos que
pueden ser testados en forma separada.
ParmetrosMarcan la comunicacin entre los procedimiento. Debe existir una
correspondencia entre los parmetros reales y formales.(en numero, orden y tipo)
Ejemplo:
Program demoParametros;procedure UNO(a: integer, b:real)beginend;
varx: integer;
y: real;begin
UNO(x); { incorrecta }UNO(y); { incorrecta }UNO(y,x); { incorrecta }
UNO(x,y) { correcta }end.
Pascal posee dos tipos de pasaje de parmetros: por valor o por referencia
Por valor: En la llamada al procedimiento el valor del parmetro real se copia en elparmetro formal y si el parmetro forma se modifica el parmetro real no.Por referencia: lo que se pasa es la direccin del parmetro real, por lo tantocualquier modificacin del parmetro formal quedara reflejado en el parmetroreal.
Ejemplo:Program demoReferencia;
procedure DOS(var a:integer)begin
a:= a+1;end;var x:integer;begin
x:=4;
DOS(x);end;
-
5/27/2018 Sintaxis de Pascal
11/39
Sintaxis y Semntica del Lenguaje
En la teora se explicarn detalladamente las diferencias.Otro ejemplo de pasaje de parmetros:
program OtroEjemplo;var a, b : integer;procedure Cambio(x,y : integer)var
z:integer;begin
z:=x;x:=y;
y:=z;end;
begin writeln(Ingrese dos nmeros);readln(a,b);Cambiar(a,b);writeln(El primer numero que ingreso fue,a);writeln(El segundo numero fue,b);
end.
Si este programa intenta intercambiar los valores ledos por teclado, lohace realmente? Corregirlo.
Cundo se debe utilizar parmetros por valor y cundo por referencia?
Si la informacin que se pasa al procedimiento no tiene que ser devueltafuera del procedimiento, el parmetro formal que representa la informacinpuede ser un parmetro valor (parmetro de entrada)
Si se tiene que devolver informacin al programa llamador, el parmetroformal que representa esa informacin debe ser un parmetro porreferencia (parmetro salida)
Si la informacin que se pasa al procedimiento puede ser modificada y sedevuelve un nuevo valor, el parmetro formal que representa esainformacin debe ser un parmetro por referencia (parmetro entrada \salida)
FuncionesExisten funciones predefinidas por el lenguaje que se pueden utilizar en
expresiones: Ord(), Abs(), Sin(), etc.El usuario puede definir sus propias funciones de igual forma que los
procedimientos.
-
5/27/2018 Sintaxis de Pascal
12/39
Sintaxis y Semntica del Lenguaje
function nombre(parmetros):tipo{ declaraciones locales}begin
cuerpo de la funcinnombre:= valor de la funcinend;
El nombre de la funcin se refiere a la posicin de memoria que contiene elvalor devuelto por la misma.
El tipo de datos del resultado debe coincidir con el tipo declarado en lacabecera de la funcin.
La asignacin ultima siempre debe existir.No debe realizar ninguna otra tarea que calcular el valor del tipo del
nombre. (para no tener efectos laterales)Ej:function triple (num : real) : realbegin
triple := 3*num;end;
Variables locales y globales
Las variables que intervienen en un programa con procedimientos pueden
ser de dos tipos: locales y globales.
Una variable local es aquella que est declarada dentro de un subprograma yse dice que es local al subprograma. Una variable local slo est disponible duranteel funcionamiento del mismo.
Las variables declaradas en el programa principal se denominan variablesglobales. A diferencia de las variables locales cuyos valores se pueden utilizar slodentro del subprograma en que estn declaradas, las variables globales pueden serutilizadas en el programa principal y en todos los subprogramas declarados en l.
program variablesLocYGlob;var x,y:integer;procedure A(x:integer)var
z:integer;begin
end;begin
..........
end.
-
5/27/2018 Sintaxis de Pascal
13/39
Sintaxis y Semntica del Lenguaje
En el caso de que coincidan en un mismo programa, dos variable con unmismo nombre, una global y otra local, la variable local enmascara a la global.
Efectos laterales
Pascal permite a los subprogramas (procedimiento y funciones) modificar elvalor de las variables globales que no son parmetros reales o actuales.
Ejemplo:......var m:integer;procedure MalaPrctica;begin
writeln(Introduzca un numero);readln(m);
end;
......
Este ejemplo no da ningn error de compilacin ni en ejecucin. En otraspalabras, esto est permitido en Pascal. El valor de m se modifica dentro delprocedimiento y, por consiguiente si a partir de ah se utiliza en el programallamador, tomar ese ltimo valor.
Un efecto lateral es la accin de modificar el valor de una variable globalen un subprograma.
No se recomienda que un programa produzca efectos laterales. Por qu?
Ejemplo: (Pensar qu sucede en el siguiente ejemplo)programEfectosLaterales;var
j:integer;
procedure Lateral;begin
for j:= 1 to 100do writeln(J ahora vale, j);
end;
beginj:= 8;writeln(j); { se visualiza 8 }Lateral;writeln(j); { se visualiza 100 }
end.
La interaccin o comunicacin entre un procedimiento / funcin y elprograma (o subprograma) debe realizarse completamente a travs de los
parmetros y no de variables globales.
-
5/27/2018 Sintaxis de Pascal
14/39
Sintaxis y Semntica del Lenguaje
mbito o alcance de un identificador
Los programas Pascal tienen estructura tipo rbol. El programa principal es
la raz y de ste penden muchas ramas (procedimiento y funciones).Ejemplo:
program Principal;procedure A;
procedure C;beginend;procedure D;beginend;
beginend;procedure B;beginend;
beginend.
Un programa puede contener diferentes bloques (procedimiento yfunciones) y un procedimiento puede, a su vez contiene otros procedimientos
anidados.La organizacin de los procedimientos se representa tambin como bloques
de programa. Un bloque es la parte de declaracin y el cuerpo de programa oprocedimiento.
De esta manera, el programa anterior puede verse como:
Los bloques en los que un identificador puede ser utilizado se conocen comombito o alcance. El alcance es la seccin de programa en la que un identificador esvlido, y donde puede ser referenciado.
Reglas de alcance de Pascal:
Principal
A B
C D
-
5/27/2018 Sintaxis de Pascal
15/39
Sintaxis y Semntica del Lenguaje
1.- Un identificador declarado en un bloque P, puede ser utilizado en P y entodos los procedimientos y funciones anidados en l.
2.- Si un identificador j declarado en el procedimiento P se redeclara enalgn procedimiento interno Q (encerrado en P), entonces el procedimiento Q y
todos los encerrados en l no pertenecen al alcance de j.Ejemplo:
program EjemploAnidado;const
k=2.71828;var
x,y:real;
procedure A (var x:real)
varm,n:integer;
procedure B(w:real);var
p,q :integer;begin...end;
begin....end;procedure C(var letra:char);
constIVA= 21;
varx:char;
begin...end;
begin
...end.
La constante k declarada en el programa principal tiene alcance en todo elprograma. La variable x es una variable global pero est redefinida en losprocedimientos A y C, por lo tanto tiene alcance slo en el programa principal y enel procedimiento B.
Ejercicio: Marcar el alcance de todas las variables del ejercicio anterior.
-
5/27/2018 Sintaxis de Pascal
16/39
Sintaxis y Semntica del Lenguaje
Las reglas de alcance no se definen nicamente para el uso de variables. Enellas se habla de "identificadores" y esto abarca tambin a los nombres de losprocedimientos y funciones.
Ejemplo:program Aprocedure B
procedure Cbeginend;
beginend;
procedure D;procedure E
beginend;procedure Bbeginend;
beginend;
beginend.
Ejercicio: Marcar los alcances de todos los identificadores.
Arreglos
Un arreglo es un conjunto de elementos de un mismo tipo. Tiene un tamaofijo que NO puede excederse. Se puede acceder a sus elementos en cualquierorden (acceso directo y aleatorio)
La forma de definirlo es:
type arreglo = array[1..7] of real;
varmaxTem : arreglo;
varotroArreglo : array[1..10] of integer;
-
5/27/2018 Sintaxis de Pascal
17/39
Sintaxis y Semntica del Lenguaje
Se puede acceder directamente a un elemento del arreglo mediante unaexpresin llamada ndice encerrado entre corchetes.
Ejemplo:
maxTemp[5] : hace referencia al 5 elemento dentro del arreglo maxTemp.Si k es una variable entera cuyo valor es 5, entonces maxTemp[k] seala el
5 elemento y maxTemp[k+1] el 6.
Ejercicio:Inicializar el arreglo anterior con un valor determinado
Tipos de los ndicesComo vemos, los ndices en un arreglo de tipo arreglo deben ser integer (de
1 a 7). En general, los ndices deben ser de tipo de datos ordinales (con orden)
como los enumerativos, por ejemplo. (los char, integer, etc.)
typedias = ( DOM, LUN, MAR, MIE, JUE, VIE, SAB);arre1 = array [dias] of real;arre2 = array[a..z] of integer;
vartemp. : arre1;codigo : arre2;
temp, es otro arreglo de 7 elementos reales que NO tienen ndice reales(temps[MAR] es el 3 elemento de temp).
Arreglos multidimensionalesSi se quiere generar las temperaturas mnimas de cada da de la semana
durante 52 semanas (1 ao) se puede utilizar una matriz:
type
matriz = array[1..7,1.52] of real;
vartempMin : matriz; { 7 filas por 52 columnas }
tempMin[5,12] indica el elemento de la fila 5 y columna 12
Esto se generaliza a ms dimensiones. Aunque en la prctica slo se utilizahasta 3 (Tensores).
Arreglos de arreglos
-
5/27/2018 Sintaxis de Pascal
18/39
Sintaxis y Semntica del Lenguaje
En vez de declara un arreglo e dos dimensiones para las 52 semanas, sepuede declarar un arreglo de una sola dimensin de 52 arreglos de 7 elementos.
type
semanas = array[1..7] of real;tempAnuales = array[1..52] of semanas;
vartemps : tempsAnuales;
Aqu, temps[12] es una arreglo de 7 temperaturas correspondiente a las 12semana. Si pensamos en la informacin dividida en semanas individuales, estaestructura es ms adecuada que la otra. Para referenciar el 5 da de la semana 12:
temps[12][5]
Ejercicio:Inicializar el arreglo anterior con un valor determinado
Podemos tener array de strings, integer, char, etc.
Registros
Mientras que un arreglo es una coleccin de elementos del mismo tiempo, unregistro es un grupo de tems relacionados que no necesariamente son del mismo
tipo. Cada tem del registro se denomina campo.
En forma general un registro en Pascal se define:record
campo_1: tipo;campo_2: tipo;......campo_n: tipo;
end;
typeAlumno = record
Nombre : string[30];Legajo : integer;Prom : real;end;
varalu : Alumno;
-
5/27/2018 Sintaxis de Pascal
19/39
Sintaxis y Semntica del Lenguaje
Para referenciar un campo dentro del registro se debe calificar utilizandoel punto ( .) seguido por el identificador de campo.
Ejemplo:
alu.legajo := 12345;Se puede copiar un registro entero a otro.
vara1, a2 : Alumno;.........a1 := a2;
La sentencia WithPermite referir cada campo con solamente el identificador utilizando la
sentencia with.ej:with a1 do
beginnombre := Carlos Fernandez;legajo := 12345;prom := 4.50;
end;
Fuera del with se debe calificar el identificador de campo.
writeln(a1.nombre, tiene promedio , a1.prom);
NOTA:Si las sentencias dentro del with son muchas, se puede perder legibilidadporque se ven a los identificadores de campo como variables libres y, por lo tanto.se debe restringir el uso a pocas lneas.
Registro dentro de registrosA veces es bueno tener un registro dentro de otro, para independizar
datos. Por ejemplo si se quiere agregar al reg. del alumno un campo direccin(calle, numCasa y ciudad)type
direccin = recordcalle : string[20];numCasa: integer;ciudad: string[20];
end;Alumno = record
nombre : string[20];
legajo : integer;dir : direccin;
-
5/27/2018 Sintaxis de Pascal
20/39
Sintaxis y Semntica del Lenguaje
prom : real;end;
var
alu : Alumno;Cmo se referencia el campo calle dentro de alumno?
alu.dir.calle
Arreglo de registrosSi se quiere tener la informacin de los estudiantes correspondientes a una
clase determinada, se podra definir el siguiente tipo de datos:
type clase = array (1..90) of Alumno;
varclase1: Clase;
clase1[9].nombre : es el nombre del 9no. registro.clase1[9].nombre[1] : es la primera letra del campo nombre del 9 registro.clase1[9].dir.ciudad : es el campo ciudad del 9no. registro.
Archivos
A diferencia de los otros tipos de datos, los datos guardados en un archivoson permanentes, es decir, siguen existiendo despus que el programa termina suejecucin. De esta manera, pueden ser compartidos por varios programas.
Un archivo es una coleccin de informacin (datos relacionados entre s)localizada o almacenada como una unidad en alguna parte de la computadora(memoria externa) A diferencia de los arreglos y registros, el tamao de estacoleccin no es fija y est limitado por la cantidad de memoria secundaria (disco o
cinta) disponible. Es decir, los archivos son dinmicos, en cambio los registros oarreglos son estructuras estticas3.
Los archivos permiten la comunicacin entre programas: un programa Apuede escribir su salida en un archivo y un programa B puede usarlo como entrada.
3 Cuando se declara un arreglo se deben especificar el tamao (los lmites) que ocupar estaestructura. Lo mismo sucede con los registros, en donde se detallan cada uno de los campos que locompone en forma esttica. En cambio cuando se declara un archivo no se especifica ningn tamao. Amedida que se van agregando datos, el tamao se va incrementando dinmicamente (en memoria
externa)
-
5/27/2018 Sintaxis de Pascal
21/39
Sintaxis y Semntica del Lenguaje
Modo de accesoExisten dos modalidades para acceder a un archivo:
en forma secuencial: comenzando por el primero, se tratan loselementos en forma secuencial
en forma aleatoria (acceso directo): se puede acceder a unelemento directamente a travs de su posicin.
Pascal estndar slo permite acceso secuencial a los archivos, pero el TurboPascal tambin permite acceso directo.
Archivos en Pascal
Existen tres tipos de archivos en Turbo Pascal: Texto (text): con acceso secuencial. Tipados (con datos de un tipo especfico): con acceso aleatorio No tipados (con datos sin un tipo especficos: estos NO se tratarn en lamateria.
Mecanismos para manipular archivosExisten varios procedimientos y funciones predefinidos en Pascal para
trabajar con archivos. En este apunte slo se resumirn brevemente y serecomienda consultar la bibliografa para ms informacin:
Por lo general, la secuencia de operaciones que se realizan con los archivoses la siguiente:
1. Asignacin2. Apertura3. Tratamiento4. Cierre
La secuencia anterior es vlida tanto para archivos de datos como paraarchivos de texto, pero las operaciones en cada caso, si bien se denominan de lamisma manera su funcionamiento y operacin no lo es. Por lo tanto se har unadistincin entre los distintos tipos de archivos: de texto y de datos.
Archivos de TextoDeclaracin
En forma general un archivo se declara:
type texto:text;var archi: texto;
archi1: text;
ASIGNACIN DE ARCHIVOSPermite ligar un variable del programa de tipo archivo con un archivo
externo (en el disco).
-
5/27/2018 Sintaxis de Pascal
22/39
Sintaxis y Semntica del Lenguaje
assign (nombreVariableArchivo, nombreExternoArchivo)
nombreVariableArchivo: es el nombre del archivo dentro del programa (el utilizado
en su declaracin)nombreExternoArchivo: es el nombre con el que se conoce el archivo por elsistema operativo (ejemplo: c:\sintaxis\trabajos\tp1.txt).
Ejemplo:......
var archivotexto: text archivo de textobegin
assign(archivotexto, 'c:\sintaxis\trabajos\tp1.txt');....
end;........
APERTURA DEL ARCHIVODespus de ser asignado, el archivo debe ser abierto. Esto es posible
utilizando uno de los tres procedimientos predefinidos: reset, rewrite y append.Reset: abre un archivo existente para lectura.Rewrite: crea y abre un nuevo archivo. Si el archivo ya existe, borra su
contenido.Append: abre el archivo para escritura, pero slo para aadir al final.
En cualquier caso es posible testear si se produjo algn error en lasoperaciones anteriores mediante la funcin IOResult4.
LECTURA DE UN ARCHIVOSe refiere a la recuperacin de datos del archivo. Las operaciones para
leer datos son read y readln5.
Forma general:
Read (archi, nomVar1, nomVar2, ....):
Lee informacin del archivo archi y la almacena en las variables nomVar1,nomVar2, etc. Estas variables pueden ser del tipo char, integer, real o string.
Ejemplo:............
var archivo: text;linea: string[30];
4Consultar la bibliografa para ms detalle.
5ReadLn salta al principio de la siguiente lnea del archivo.
-
5/27/2018 Sintaxis de Pascal
23/39
Sintaxis y Semntica del Lenguaje
x: integer;begin
assign(archivo, 'prueba1');reset(archivo);
.....
readLn(archivo, linea, x);.....end;
............
ESCRITURA DE UN ARCHIVOSe refiere a la insercin de datos en el archivo. Las operaciones para leer
datos son write y writeln6.
Forma general:
write (archi, nomVar1, nomVar2, ....):
Escribe el contenido de nomVar1, nomVar2, etc. en el archivo archi. Estasvariables pueden ser del tipo char, integer, real o string.
Ejemplo:......
var archivo: text;linea: string[30];
x: integer;.....
writeln(archivo, linea, x);.....
end;.......
Aclaracin:
El uso de write y writeln en archivos de texto es exactamente el mismo que
el usado para mandar informacin a la pantalla. En realidad, en este caso se utilizaun archivo de texto predefinido denominado output (archivo estndar de salida)que se lo liga a la pantalla por defecto. Lo mismo sucede con la operacin read.Existe otro archivo predefinido, denominado input (archivo estndar de entrada)asociado al teclado.
CIERRE DE UN ARCHIVOLa operacin para cerrar el archivo es close.
Close (nombreArchivo)
6WriteLn salta al principio de la siguiente lnea del archivo.
-
5/27/2018 Sintaxis de Pascal
24/39
Sintaxis y Semntica del Lenguaje
Funcin EOF()Es posible preguntar por fin de archivo (smbolo especial EOF) para
testear cuando se termin o finaliza el archivo. Esto es lo que sigue a la ltima
componente del archivo. Esta funcin retorna el valor true si se encuentra sealcanz el fin de archivo y false en caso contrario.Cuando se abre un archivo, un puntero indica la posicin del registro actual
dentro del mismo. En este caso sealar la posicin cero (0). A medida que serealizan operaciones de lectura (o escritura) este puntero avanza a las siguientesposiciones hasta alcanzar la marca de fin de archivo.
0 1 2 3 4 5 EOF
Manejo simple de archivos de texto - Un ejemplo
Supongamos que existe en el disco un archivo denominada entrada.txt yquiero copiar su contenido a otro archivo denominado salida.txt.
program copioArchivo;var
archiE, archiS: Text;linea: string[80];
beginassign(archiE, 'c: \sintaxis\entrada.txt');assign(archiS, 'c: \sintaxis\salida.txt');reset(archiE);rewrite(archiS);while not eof(archiE)
do beginreadLn(archiE,linea);writeLn(archiS,linea);
end;
close(archiE);close(archiS);
end.
Archivos de Datos
DeclaracinEn forma general un archivo de datos se declara:
file of tipoDeDatos
-
5/27/2018 Sintaxis de Pascal
25/39
Sintaxis y Semntica del Lenguaje
donde tipoDeDatos puede ser cualquier tipo predefinido o definido por el usuario.
Puedo tener archivos de enteros, de caracteres, de registros, etc.
var arch_Enteros : file of integer;arch_Notas : file of char
Tambin es posible declarar un tipo archivo:type
Item = recordnombre,domicilio : string[20];TE : string[15];
end;AgendaTelefonica = file of Item;
LECTURA DE UN ARCHIVOLa operacin para leer datos del archivo es read.
Forma general:
Read (archi, nomVar1, nomVar2, ....):
Lee informacin del archivo archi y la almacena en las variables nomVar1,nomVar2, etc. Estas variables deben ser del mismo tipo que el archivo.Ejemplo:.........
var archivo : file of integer;x, y : integer;
beginassign(archivo, 'prueba2');reset(archivo);
.....
read(archivo, x, y);.....
end;..........ESCRITURA DE UN ARCHIVO
La operacin para escribir datos es write.
Forma general:
write(archi, expresion1, expresion2, ....):
-
5/27/2018 Sintaxis de Pascal
26/39
Sintaxis y Semntica del Lenguaje
Se almacena la informacin dada por expresion1, expresion2, etc, en elarchivo archi. Las expresiones anteriores deben ser del mismo tipo que el archivo.
Ejemplo:var archivo : file of integer;
x, y : integer;begin
assign(archivo, 'prueba2');rewrite(archivo);
.....write(archivo, x, y, 10);
.....end;
CIERRE DE UN ARCHIVO
La operacin para cerrar el archivo es close.
Close (nombreArchivo)
Manejo simple de archivos de datos- Un ejemplo
Este programa lee datos de alumnos de un archivo e imprime la cantidad dealumnos por comisin. Se supone que hay 100 comisiones y los alumnos tienenasignado un nmero de comisin entre 1 y 100.
program promedio_de_alumnos;const
MAX_ALUMNOS = 100;type
Alumno = recordnyap : string[30];nroLegajo : integer;comision : 1..MAX_ALUMNOS;
end;
Archi_Alumnos = file of Alumnos;
varal : Alumnos;archi : Archi_Alumnos;comisiones : array [1..MAX_ALUMNOS] of integer;
beginAssign(archi, 'c: \sintaxis\datos.dat');Reset(archi);for i:=1 to MAX_ALUMNOS
do comisiones[I]:=0;while not eof(archi)
do begin
-
5/27/2018 Sintaxis de Pascal
27/39
Sintaxis y Semntica del Lenguaje
read(archi,al);comisiones[al.comision]:= comisiones[al.comision] +1;
end;close(archi);for i:= 1 to MAX_ALUMNOS
do if comisiones[I]0then writeln(La comisin,i,tiene , comisiones[i], alumnos)end.
Operaciones para el acceso aleatorio
En Turbo Pascal existe un conjunto de operaciones predefinidas para poderacceder en forma directa a alguna componente del archivo de datos.
PROCEDIMIENTO SEEK: permite posicionar el puntero del archivo en una posicindeterminada.
Seek (archivo, nmeroRegistro)Suponiendo que el primer registro del archivo es el cero (0) , entonces
nmeroRegistro es un valor entre 0 y la cantidad de elementos del archivo.
Ejemplo:
Seek (agenda, 5) mueve el puntero al sexto registro (se comienza desdeel 0!!)
FUNCIN FILEPOS:Devuelve la posicin actual del archivo (nmero de registro) enforma de un longint. Si est al principio del mismo, devuelve cero (0)
Filepos(archivo);
FUNCIN FILESIZE:Devuelve la cantidad de registros del archivo Si el archivoest vaco devuelve cero (0).
Filesize(archivo);
Resumen:
A continuacin se detallan la lista de operaciones para manipular archivos enPascal.
Operacin Descripcin ObservacinAssign Permite ligar la variable
dentro del programa conel archivo fsico en el
Aplicado tanto a archivosde texto como de datos.
-
5/27/2018 Sintaxis de Pascal
28/39
Sintaxis y Semntica del Lenguaje
discoReset Permite abrir un archivo
para lectura/escrituraAplicado tanto a archivosde texto7como de datos
Rewrite Permite abrir un archivo
para escritura
Aplicado tanto a archivos
de texto como de datos.Append Permite abrir un archivopara escritura (paraaadir al final)
Slo archivos de texto.
Read Permite leer datos de unarchivo
Aplicado tanto a archivosde texto como de datos.
Readln Idem read, solo que saltaa la lnea siguiente
Slo archivos de texto.
Write Permite grabar datos a unarchivo
Aplicado tanto a archivosde texto como de datos.
WriteLn Idem read, solo que saltaa la lnea siguiente
Slo archivos de texto.
Eof Permite testear el fin dearchivo
Aplicado tanto a archivosde texto como de datos.
Eol Permite testear por fin delnea
Slo archivos de texto.
Seek Permite posicionarse en unnmero de registrodeterminado
Slo archivos de datos
Filepos Permite conocer el nmerode registro actual Slo archivos de datos
Filesize Permite conocer lacantidad de registros delarchivo
Slo archivos de datos
Close Cierra un archivopreviamente abierto.
Aplicado tanto a archivosde texto como de datos.
Manejo de archivos de datos con acceso directo- Un ejemplo
El siguiente ejemplo se encuentra disponible en el libro de Joyanez Aguilar(pg. 521) en forma completa. En esta seccin slo se har nfasis en lamanipulacin del archivo en forma directa.
Enunciado:Se dispone de un archivo (ya creado) de estudiantes de un instituto. La
informacin que se cuenta en el archivo es la siguiente:
7Si es de tipo text solo lectura.
-
5/27/2018 Sintaxis de Pascal
29/39
Sintaxis y Semntica del Lenguaje
Nombre del alumno, domicilio y edad.
Se quiere realizar un programa que realice altas, bajas, modificaciones y
consultas a este archivo.
Implementacin en Pascal
program accesoAleatorio;uses Crt;type
Cadena = string [40];Domicilio= record
calle : string [20];
numero: integer;ciudad: string[20];end;
Alumno = recordnombre : cadena;edad : 0..99;dom : Domicilio;
end;ArchivoAlumnos = file of Alumno;
var
archi : ArchivoAlumnos;opcion : char;
procedure LeerRegistro(var alu: Alumno);begin
with alu dobegin
writeln('Nombre: '); readLn(nombre);writeln('Edad: '); readLn(edad);writeln(Domicilio - Calle: '); readLn(dom.calle);writeln(Domicilio - Nmero: '); readLn(dom.numero);writeln(Domicilio - Ciudad: '); readLn(dom.ciudad);
end;end;function Posicion( nom: cadena; var archi: ArchivoAlumnos) : integer;var reg: Alumno;
esta: boolean;begin
esta:= false;seek(archi, 0);while not wof(archi) and not esta
do begin
Read(archi, alu)esta:= alu.nombre = nom;
-
5/27/2018 Sintaxis de Pascal
30/39
Sintaxis y Semntica del Lenguaje
end;if esta
then Posicion:= filePos(archi) -1else Posicion:= -1;
end;
procedure MostrarDatosAlumno(alu: Alumno);{Muestra en la pantalla los datos del alumno alu}begin
........end;
procedure Modificar(var archi: ArchivoAlumnos);var alu: Alumno;
nom: Cadena;begin
Reset(archi);WriteLn('Introduzca el nombre del alumno a modificar';ReadLn(nom);i := Posicion (nom, archi);if i= -1
then writeLn('El alumno buscado NO se est en el archivo')else begin
seek(archi, i);read(archi, alu);MostrarDatosAlumno(alu);
writeLn ('Introduzca los nuevos datos:');LeerRegistro(alu);i := filePos(archi) -1;write(archi, alu);writeLn ('Los datos se han modificado.');
end;end;
procedure Consultar(var archi: ArchivoAlumnos);{Permite consultar los datos de un alumno }begin
......end;
procedure Eliminar(var archi: ArchivoAlumnos);{Permite eliminar los datos de un alumno }begin
......end;procedure Agregar(var archi: ArchivoAlumnos);{Permite agregar un nuevo alumno al archivo}begin
......end;
-
5/27/2018 Sintaxis de Pascal
31/39
Sintaxis y Semntica del Lenguaje
begin { Comienzo del programa principal}Assign(archi, 'c:\sintaxis\alumnos.dat');Repeat
ClrScr;
WriteLn('Men Principal:');WriteLn('1.- Agregar Alumno');WriteLn('2.- EliminarAlumno');WriteLn('3.- Modificar Alumno');WriteLn('4.- Consultar Alumno');WriteLn('5.- Listado total de alumnos ');WriteLn('6.- Salir del sistema');WriteLn('Elija una opcin:');repeat
opcion := readKey;until opcion >='1' and opcion
-
5/27/2018 Sintaxis de Pascal
32/39
Sintaxis y Semntica del Lenguaje
Las variables de tipo puntero apuntan a variables denominadas dinmicas.Estas variables se crean en forma explcita por medio del procedimiento new dePascal.
new(p)
asigna memoria a la variable apuntada por p.Ejemplo: (el seguimiento de este program se realizar en a teora)program demopunteros;type
ptr=^integer;var
p,q:ptr;begin
new(p);p^:= 1;
new (q);q^:=2;writeln(p^, q^);p^:= q^+1;writeln(p^, q^);p:=q;writeln(p^, q^);p^:= 7;writeln(p^, q^);new(p);q:=p;
end.Listas encadenadas
Una lista encadenada tiene la siguiente forma:
Una lista es una sucesin de nodos. Cada nodo tiene un valor y un puntero alsiguiente nodo. El ltimo nodo tiene un valor especial denominado nil que indica alfin de la lista
Definicin de listas en Pascal:
Type lista = ^nodo;Nodo = record
Dato: ...Psig:lista
Punter
o nulo
Principio
de la lista
Nodo
-
5/27/2018 Sintaxis de Pascal
33/39
Sintaxis y Semntica del Lenguaje
End;
Siempre se accede a la lista por su comienzo: el puntero inicial a la misma:
Var pi: lista.Cmo se recorre una lista? El procedimiento bsico es el siguiente:
Situarse la principio de la listaMientas no se llegue al final de la lista
Do beginImprimir el dato del nodo actualPasar al siguiente nodo
End;
Implementacin en Pascal:
Procedure imprimirLista(pi:lista)Var aux:listabegin{Situarse la principio de la lista}aux:= pi;
{Mientas no se llegue al final de la lista}
while aux nildo begin{Imprimir el dato del nodo actual}writeln(aux^dato);{Pasar al siguiente nodo}aux:=axu^psig;end;
end;
Operaciones para el manejo de la lista
Insertar al principio:Procedure insertarPpio (var l:lista, elem:integer)Var nuevo: lista;Begin
New(nuevo);Nuevo^dato:=elem;Nuevo^psig:=l;L:=nuevo;
End.
Insertar al final:
-
5/27/2018 Sintaxis de Pascal
34/39
Sintaxis y Semntica del Lenguaje
Procedure insertarFinal (var l:lista, elem:integer)Var nuevo, actual, anterior: lista;Begin
New(nuevo);Nuevo^dato:=elem;
Nuevo^psig:=nil;actual:=l;anterior:=nil;while actualnil
do beginanterior:=actual;actual:=actual^psig;end;
if anteriornilthen anterior^psig:=nuevo;else l:= nuevo;
End.
Insertar ordenado:Procedure insertarOrdenado (var l:lista, elem:integer)Var nuevo, actual, anterior: lista;Begin
new(nuevo);nuevo^dato:=elem;
actual:=l;
anterior:=nil;while actualnil and actual^dato
-
5/27/2018 Sintaxis de Pascal
35/39
Sintaxis y Semntica del Lenguaje
Guardar la lista en un archivo:Procedure SalvarADisco(pi: lista; nom : cadena)){ Guarda la lista en un archivo cuyo nombre es nom}Var
archi: file of integer;
aux : lista;begin
assign(archi, nom);rewrite(archi);aux := pi;while aux nil
do beginwrite (archi, aux^.dato);aux := aux ^.psig;
end;close (archi);
end;
Armar la lista con datos de un archivo:Procedure ArmoLista (var pi: lista; nom : cadena)){ Arma una lista ordenada con los enteros almacenados en el archivo cuyo nombre es nom}var
archi: file of integer;x: integer;
beginassign(archi, nom);
reset(archi);pi := nil;while not eof(archi)
do beginread (archi, x);InsertarOrdenado(pi, x);
end;close (archi);
end;
-
5/27/2018 Sintaxis de Pascal
36/39
Sintaxis y Semntica del Lenguaje
Ejercicio completo
EnunciadoSe tiene informacin sobre la asignacin de cursos a profesores de un
Instituto (nombre y apellido y cursos que dicta con su horario, a lo sumo tres).Todos los cursos se dictan los das lunes, mircoles y viernes; cada curso tiene elmismo horario todos los das. Por ejemplo, Arquitectura I, de 10 a 12 hs.
Se desea realizar un programa que permita modificar, para algunosprofesores, uno de los cursos que dicta (el primero, el segundo o el tercero),siempre que el nuevo horario no se superponga con el de otro de los que dicta eseprofesor). Se desea grabar en un archivo la informacin actualizada ordenadaalfabticamente.
Idea: Pensar en una solucin general y de esta manera dividir el problema enmdulos.
I)Cargar la informacin en memoria, en una listaActualizar la informacinVolver a grabar la informacin actualizada en disco
II)/*Cargar la informacin en memoria, en una lista*/
abrir archivo de datoswhile haya datosdo begin
leer datosguardarlo ordenado en la lista
end
/*Actualizar la info*/Ingresar pedido de modificacin (nombre del profe, nro de curso, ttulo y
horario)
While haya pedidosdo begin
Analizar cambio en los cursosIngresar otro pedido
end
/*Volver a grabar la info actualizada en disco*/( grabar la lista en el archivo)......
-
5/27/2018 Sintaxis de Pascal
37/39
Sintaxis y Semntica del Lenguaje
III)/*Analizar cambio en los cursos*/buscar el profesor en la listaif esta
then beginif no hay superposicin horariathen begin
modificar cursoguardarloend
else avisar que hay superposicin horaria con el nuevo cursoend
else avisar que el profe no esta
IMPLEMENTACION EN PASCAL
program infoProfesores;
typecadena = string [30];curso = record
titulo: string[30];horaI, horaF: real;
end;
trescursos = array[1..3] of curso;
profesor = recordnombre: cadena;cursos: trescursos;
end;archiProfes = file of profesor;listaProfes = ^ nodoProfe;nodoProfe = record
dato: profesor;
psig: listaProfes;end;
varlista: listaProfes;
procedure CargarInfo (var lista: listaProfes);var
profe: profesor;archi: archiProfes;
begin
Assign(archi, profes.dat);Reset(archi);
-
5/27/2018 Sintaxis de Pascal
38/39
Sintaxis y Semntica del Lenguaje
lista = nil;while not eof(archi)
do beginread(archi, profe)InsertarOrdenado(lista, profe) /*el que ya hicieron*/
end;Close( archi);end;
procedure ActualizarInfo (var lista: listaProfes);var
profe: Cadena;nro: integer;cur: curso;
beginwriteln( Ingrese el nombre del profesor a modificar (ZZ para finalizar));read(profe);while profe ZZ
do beginwriteln( Ingrese el nro del curso, ttulo, hora inicial y hora final);read ( nro, cur.ttulo, cur.horaI, cur.horaF);AnalizarCambio(lista, profe, nro, cur);writeln( Ingrese el nombre del profesor a modificar (ZZ para finalizar));read(profe)end;
end;
procedure AnalizarCambio (var lista: listaProfes; profe: Cadena; n:integer;nuevoCurso:curso);var
regProfe: profesor
beginif Buscar(lista, profe) /* busca por el nombre*/
then begin
regProfe =Recuperar(lista, profe); /* recupera por el nombre*/if not SuperposicinHoraria (nuevoCurso, regProfe.cursos, n)then begin
regProfe.cursos[n] = nuevoCursoInsertarOrdenado(lista, regProfe)end;else writeln( No se puede hacer el cambio por superposicinhoraria);
endelse writeln( El profesor no est registrado);
end;
function SuperposicinHoraria (nuevo: curso, cursos : trescursos; n: integer): boolean;
-
5/27/2018 Sintaxis de Pascal
39/39
Sintaxis y Semntica del Lenguaje
begin{Se deber testear que el horario del curso n no se superponga con los otros dos. }
..............end;
begin /* del programa ppal */CargarInfo(lista);ActualizarInfo(lista);GrabarInfo(lista)
end.