Beruflich Dokumente
Kultur Dokumente
INTRODUCCIÓN
AL LENGUAJE
PASCAL
Manuel Collado
Ramón Galán
ÍNDICE
-I-
CAPÍTULO 5: ESTRUCTURAS DE CONTROL SECUNDARIAS Pág.
5.1.- Sentencia FOR.....................................................................35
5.2.- Sentencia CASE....................................................................36
5.3.- Sentencia GOTO....................................................................37
EJERCICIOS...............................................................................39
- II -
CAPÍTULO 11: REGISTROS Pág.
11.1.- Declaración de registros......................................................71
11.2.- Selección de componentes..................................................72
11.3.- Sentencia WITH..................................................................72
11.4.- Operaciones con registros...................................................73
11.5.- Registros variantes.............................................................75
EJERCICIOS...............................................................................77
- III -
INTRODUCCIÓN
1
El objeto del presente texto es introducir al lector de manera progresiva en el
conocimiento y manejo del lenguaje de programación PASCAL. En la redacción
se ha buscado la máxima sencillez posible, de manera que su lectura pueda ser
abordada incluso por quienes no han tenido ningún contacto anterior con los
computadores y su programación.
A lo largo de los sucesivos capítulos se van introduciendo uno tras otro diver-
sos conceptos, de manera gradual, de forma que cada uno de ellos represente
una pequeña aportación respecto a los anteriores. Esto permite ir asimilandolo
con comodidad, y al mismo tiempo se ha cuidado de que desde el principio se
puedan presentar programas completos como ejemplo, con lo que en todo mo-
mento se estará en condiciones de realizar ejercicios de prácticas en máquina.
-1-
PROGRAMA 1.
1) Leer un número
2) Calcular su cuadrado
3) Imprimir el resultado
En este programa se supone que cada una de las instrucciones puede ser reali-
zada directamente por la máquina, por lo que no es necesario explicarlas me-
jor. Además es evidente que el orden de ejecución es fundamental ya que no
puede calcularse el cuadrado del número antes de leerlo, ni imprimir el resulta-
do antes de haberlo calculado.
Sólo en casos muy sencillos, como éste, un programa se compone de una se-
cuencia pura de instrucciones. Normalmente el orden de ejecución deberá ser
determinado por la propia máquina mientras opera, para lo cual el programa
deberá indicar cómo han de tomarse las decisiones, en caso de que las opera-
ciones a realizar dependan de resultados intermedios.
PROGRAMA 2
1) Leer un número.
2) Si es negativo, imprimir “dato negativo” y parar
3) Calcular la raíz cuadrada
4) Imprimir el resultado
El orden de ejecución de las instrucciones no es fijo, sino que depende del va-
lor leído en cada caso. Unas veces se ejecutará la secuencia 1), 3) y 4), que
será lo normal; o bien se ejecutará 1) y 2), si no puede operarse con el dato
leído. En cualquier caso conviene resaltar que la acción a realizar está perfec-
tamente determinada por el programa, de manera que la máquina puede ope-
rar correctamente por sí sola.
Aunque el lenguaje natural puede ser suficiente para escribir con claridad pro-
gramas sencillos, como los expuestos, resultará inadecuado en cuanto las ope-
raciones sean algo más complicadas. Para evitar ambigüedades conviene em-
plear una notación más precisa, de tipo matemático.
PROGRAMA 3
1) Leer N
2) si N<0, imprimir “dato negativo” y parar
3) R := √N
4) Imprimir R
-2-
1.2. Diagrama de flujo.
-3-
Este diagrama refleja mucho mejor la estructura del programa e inmediata-
mente se ve que hay dos terminaciones posibles. No se han usado flechas ya
que el orden es el normal, de arriba a abajo y de izquierda a derecha.
La ventaja del diagrama de flujo respecto a una lista única de instrucciones re-
sulta más evidente al considerar programas más complicados, tales como el
ejemplo siguiente:
-4-
Sobre el diagrama pueden apreciarse las partes del programa que se repiten, y
las condiciones para que esto ocurra. El análisis completo se deja como ejerci-
cio. Como orientación, se indica que el programa calcula A := N 2 a base de su-
mar los números impares sucesivos hasta N + N – 1, como queda de manifies-
to en la figura que se acompaña. En este ejemplo se ha supuesto que las ope-
raciones simples permitidas son la puesta a cero, el incremento y la compara-
ción de variables.
El análisis del ejercicio anterior, sin ser complicado, presenta algunas dificulta-
des. Entre otras, el comprender el funcionamiento de la parte central es com-
plicado, ya que la operación de incrementar la variable A se repite por dos ra-
zones diferentes. La “programación estructurada” tiene a construir programas
que sean fácilmente comprensibles, entre otras cosas. Se basa en la técnica de
diseño mediante “refinamiento progresivo”, en que las operaciones se conside-
ran inicialmente en forma global, para ir descomponiéndolas poco a poco en
otras más sencillas, hasta llegar a aquellas que pueden ser realizadas directa-
mente por la máquina.
A Si
A No
A No
Si
B B C B
-5-
Aunque esta forma de iteración permite construir cualquier tipo de repeticiones
en un programa, suelen considerarse también como básicas otras variantes.
Entre ellas la que usa la condición para marcar el final, y no el principio, de las
repeticiones. Se representa en la forma:
A
REPEAT A UNTIL B
No
B
Si
IF A THEN
....B....
ELSE
....C....
PROGRAMA 6
10) Leer N
20) A := N2
30) Imprimir A
-6-
El primer paso es descomponer la operación 20) de acuerdo con la fórmula
N
N 2= ∑ ( K + K−1)
K=1
Todas las operaciones utilizadas son simples, excepto la 23.20), que descom-
pondremos en la forma:
23.21) A := A + K
23.20) A := A + K + K - 1
23.22) A := A + K - 1
y cada una de estas dos sumas parciales puede plantearse a su vez en forma
de operación iterativa:
23.21.10) I := 0
23.21.20) REPEAT
23.21) A := A + K 23.21.20.10) I := I + 1
23.21.20.20) A := A + 1
UNTIL I = K
23.22.10) J := 1
23.22.20) WHILE J < K DO
23.22) A := A + K - 1 23.22.20.10) J := J + 1
23.22.20.20) A := A + 1
-7-
PROGRAMA 7
BEGIN
Leer N
A := 0
K := 0
REPEAT
K := K + 1
I := 0
REPEAT
I := I + 1
A := A + 1
UNTIL I = K
J := 1
WHILE J < K DO
BEGIN
J := J + 1
A := A + 1
END
UNTIL K = N
Imprimir A
END
-8-
PROGRAMA 8
COMIENZO
Leer N
A := 0
K := 0
K := K + 1
I := 0
I := I + 1
A := A + 1
No
I=K
Si
J := 1
No
J<K
Si
J := J + 1
A := A + 1
No
K=N
Si
Imprimir A
FIN
-9-
- 10 -
INTRODUCCIÓN AL LENGUAJE PASCAL
2
El texto de un programa en lenguaje PASCAL se compone de una serie de
elementos básicos (“palabras”) perfectamente diferenciados, que se agrupan
en frases o “sentencias”. A diferencia de otros lenguajes más conocidos, tales
como el FORTRAN o el BASIC, la descomposición del texto en líneas no tiene
ningún significado. El programa completo podría siempre escribirse como una
única línea suficientemente larga. Este formato libre se da también en
lenguajes como el ALGOL o el PL/I.
Los espacios en blanco entre los elementos del programa sirven para mejorar
su legibilidad, y pueden usarse con bastante libertad. Sin embargo hay una
diferencia con respecto al FORTRAN y BASIC en el sentido de que no son
totalmente superfluos, sino que en determinados casos es absolutamente
necesario utilizarlos para separar palabras que de otra manera aparecerían
confundidas como una sola; además no pueden emplearse entre las letras de
una palabra.
- 11 -
Los valores enteros coinciden con el concepto matemáticos de los mismos,
salvo en lo que respecta a la limitación de rango de valores, debida a la
capacidad de almacenamiento predefinida de un computador determinado.
Dicho rango depende por tanto del equipo utilizado y es simétrico en torno a
cero. Dentro de dicho rango la representación de estos valores es exacta.
Las constantes reales se caracterizan por llevar punto decimal. Han de tener
alguna cifra decimal en la parte entera y en la fraccionaria, obligatoriamente.
Pueden ir seguidas de una potencia decimal que indique su rango, escrita como
exponente entero de 10 precedido de la letra E, inmediatamente a
continuación de la mantisa. En este caso si la mantisa no tiene parte
fraccionaria pueden omitirse, al tiempo que el punto decimal. Son constantes
reales:
- suma: a + b
- resta: a - b
- producto: a * b
- cociente: a DIV b
- resto: a MOD b
- 12 -
Siendo “a” y “b” dos valores enteros. Los tres primeros operadores se
representan con un solo símbolo. Los dos últimos, en cambio, mediante una
palabra de tres letras que debe escribirse exactamente como se indica, siendo
necesario, casi siempre, dejar un blanco delante y detrás.
a = (a DIV b) x b + (a MOD b)
siendo al menos uno de los dos valores a o b de tipo real. Los símbolos de los
tres primeros operadores coinciden con el de los enteros. El cuarto es
diferente, y suministra un resultado de tipo real incluso en el caso de que se
aplique a dos valores enteros.
Tal como se indicó al principio, los resultados de tipo real son solo
aproximaciones de los verdaderos, debido a la precisión limitada de la
representación interna de los números
- 2º operadores aditivos: + -
y dentro del mismo nivel las operaciones se ejecutan de izquierda a derecha.
Si una expresión va precedida del signo más o menos, se entiende que
corresponde precisamente al primer operando. Ejemplos sencillos de
expresiones podrían ser:
- 13 -
Número de unidades contenidas en 50 cajas de 20 docenas (resultado
entero):
50 * 50 * 12
Importe de 400 unidades de producto, de precio unitario 23,5 con
una bonificación del 15% (resultado real).
400 * 23.5 * (1 – 0.15)
WRITELN;
Como los resultados se imprimen uno tras otro en la misma línea una
sentencia de escritura de varios valores es lo mismo que varias sentencias de
escritura seguidas, de un valor cada una. Si se usan varias sentencias seguidas
se escribirán separadas por punto y coma. La sentencia
es equivalente a
equivaldrá a
- 14 -
Cada valor impreso con una sentencia de escritura ocupará un cierto espacio
en la línea de impresión que dependerá de la máquina que se utilice. En todo
caso será siempre suficiente para representar cada valor con toda la precisión
del computador. Todos los valores enteros ocuparán el mismo espacio, así
como todos los valores reales, con lo que se facilita el encolumnar los
resultados. El espacio reservado para un valor entero puede ser, sin embargo,
diferente del de un valor real.
Una sentencia de escritura puede incluir textos que ayuden a identificar los
resultados que se impriman. Se escriben entre apóstrofos (‘), y aparecerán
como una expresión más. En la línea de impresión ocuparán exactamente el
número de caracteres que posean, cosas que ha de tenerse en cuenta para
encolumnar los valores. Para incluir un apóstrofo en un texto literal se le
escribe duplicado. Un ejemplo de escritura con texto sería:
PROGRAM EJEMPLOSENCILLO;
(* este programacalcula e imprime el área de un triángulo de
base 5 y altura 2.7 *)
BEGIN
WRITE( AREA = ‘, (5 * 2.7) / 2);
END.
- 15 -
EJERCICIOS
1. Indicar cuáles, de entre las siguientes, son constantes enteras válidas y por
qué.
a) -123 e) 1 3 4
b) 14.25 f) 13E-01
c) 12 3 g) 1234
d) +240 h) 78.00000000
2. Indicar cuáles de entre las siguientes son constantes reales válidas y por
qué.
a) 12 e) -123
b) 13 E-12 f) 987E+18
c) 0.00 g) .243
d) 9876543 h) (* 12.34 *)
PROGRAM PRIMERO ;
BEGIN
WRITELN (170 DIV 6 DIV 4 MOD 2)
END.
PROGRAM SEGUNDO ;
(* 45/33.-12*)
BEGIN
WRITE( ‘DIA=45’,2(23-11.09));
WRITELN;
WRITE( ‘SOLUC=’, WRITE,45/33.-12*)
END.
- 16 -
7. Indíquese cómo y cuantas líneas imprime el programa siguiente:
PROGRAM TERCERO;
BEGIN
(* PRIMERA LINEA *)
WRITE( ‘LINEA 1’, 13 MOD 11);
(* SEGUNDA LINEA *)
WRITE( ‘LINEA 2’, 11 MOD 2);
(* TERCERA LINEA *)
WRITELN;WRITE(‘LINEA 3’, 1234 MOD 32);WRITELN;
WRITELN(‘LINEA 4’, 33 MOD 11)
END.
- 17 -
- 18 -
3
VARIABLES Y FUNCIONES
3.1. Identificadores.
Aunque un nombre puede ser tan largo como se desee, los compiladores sólo
atienden, en general, a un cierto número de caracteres de los mismos, por lo
que el efecto es como si su longitud fuese limitada a un cierto número de ellos.
La mayoría de las versiones del lenguaje exigen que todos los identificadores
se distingan entre sí por lo 8 primeros caracteres.
- 19 -
AND ARRAY BEGIN CASE CONST DIV
DO DOWNTO ELSE END FILE FOR
FUNCTION GOTO IF IN LABEL MOD
NIL NOT OF OR PACKED PROCEDURE
PROGRAM RECORD REPEAT SET THEN TO
TYPE UNTIL VAR WHILE WITH
Figura 3.1.- Lista de palabras clave (reservadas)
identificador = valor;
- 20 -
CONST UNMEDIO = 0,5;
UNDIA = 1;
UNASEMANA = 7;
UNMES = 31;
UNANNO = 376;
PI = 3.141592;
E = 2.7182818;
Es fácil darse cuenta de que cada constante lleva asociado el tipo de valor que
le corresponde y que viene impuesto por el de la constante numérica explícita
que figura en su declaración. Es importante no perder de vista este hecho para
comprender cómo se harán los cálculos de las expresiones aritméticas en que
intervengan.
variable : tipo;
- 21 -
3.4. Funciones predefinidas.
Cada función lleva asociado el tipo de valor que suministre, así como el del o
los argumentos con los que opere. En PASCAL existen predefinidas funciones
matemáticas de uso frecuente. La figura 3.3 contiene una lista de aquellas en
las que sólo intervienen valores enteros y reales.
- 22 -
3.5. Sentencias de asignación.
variable := expresión
Para que una sentencia de asignación sea válida es preciso, como regla
general, que el tipo de la variable y el de la expresión coincidan. La única
excepción es que un valor entero puede ser asignado a una variable real.
y se deja al lector como ejercicio el comprobar por sí mismo que los tipos de
los términos, variables, expresiones, funciones y argumentos son válidos.
READ(variable)
- 23 -
blando o cambios de línea. Las líneas de datos que sólo contengan blancos
serán ignoradas al leer valores numéricos.
Con una sola sentencia de lectura se pueden leer varios valores, y asignar cada
uno a una variable. Para ello bastará escribir:
READ(variable, variable, … )
que es equivalente a
y como puede verse, el número de valores a leer puede ser cero, en cuyo caso
simplemente provoca un salto a una nueva línea de datos.
- 24 -
EJERCICIOS
PROGRAM CUARTO;
CONST MASA = 1000;
VAR VELOCIDAD, ENERGIA : REAL;
BEGIN
READLN(VELOCIDAD);
ENERGIA := MASA * SQR(VELOCIDAD);
WRITELN( ‘ENERGIA= ‘, ENERGIA);
END.
WRITELN;
WRITE( ‘ ENERGIA = ‘ ,ENERGIA); WRITELN
6. Dado el programa:
- 25 -
PROGRAM QUINTO;
VAR A,B,C,D,E,F : INTEGER;
BEGIN
READ( F, D); READ( B); READLN; READLN( E,C,A);
WRITE(A,B), WRITELN; WRITELN(C,D);
WRITE(E);WRITE(F);WRITELN
END.
PROGRAM SEXTO;
VAR X,Y,A,B,C,D : REAL;
BEGIN
READLN(X);
A:=X; B:=A* A; C:= SIN(X); D := COS(X);
C:= C * A; D := D*D; Y:= C*D;
WRITE( ‘y = ’, Y);
END.
10. Escribir un programa que lea un número real y escriba por separado
parte entera y parte fraccionaria.
- 26 -
ESTRUCTURAS DE CONTROL
4
Los valores enteros y reales son suficientes para realizar operaciones de
cálculo numérico de todo tipo. Sin embargo hasta este momento sólo se ha
visto la manera de escribir programas consistentes en una secuencia fija de
operaciones.
unión OR
intersección AND
complemento NOT
Los dos primeros operadores trabajan con dos valores booleanos. El tercero es
un operador unitario que se escribirá precediendo a un término único.
- 27 -
numérica, y el OR tiene el mismo rango que la suma. El operador NOT, si
precede a una expresión, se entiende que afecta precisamente al primer
término.
Operador Significado
> Mayor que
< Menor que
= Igual a
>= Mayor o igual que
<= Menor o igual que
<> Diferente a
4 > 7 OR 6 < 4
NOT 10 > 20
( 4 > 7 ) OR ( 6 < 4 )
NOT ( 10 > 20 )
ODD(X)
- 28 -
siendo X un valor entero, y cuyo resultado es TRUE si es impar y FALSE en caso
contrario.
También existe otra función predefinida, de uso muy general, y que puede ser
aplicado en particular a los valores booleanos convirtiéndolos en enteros. Se
trata de la función
ORD(X)
La sentencia de asignación
variable := expresión
puede ser utilizada con valores booleanos, exigiéndose que tanto la variable
como la expresión sean del mismo tipo.
IF b THEN s1 ELSE s2
IF b THEN s
Como ejemplo sencillo consideremos que deseamos que una variable N cuente
cíclicamente de 0 a 9 cada vez que se ejecuta una parte del programa.
Escribiremos:
- 29 -
palabras clave BEGIN y END. Si en el ejemplo anterior añadimos otra variable N
que cuente a su vez las decenas, habría de escribirse, por ejemplo:
IF N=9
THEN
BEGIN
N:=0;
N:=N+1;
END
ELSE
N:=N+1;
WHILE b DO s
siendo b la expresión booleana que marca el final de las repeticiones, y s1, s2,
etc. una serie de sentencias cuya ejecución repetida se gobierna. En este caso
las palabras clave REPEAT, UNTIL además de indicar una operación iterativa
actúan en cierta manera como la pareja BEGIN, END que encierra una sentencia
compuesta.
- 30 -
Como ejemplo sencillo, la suma S de los K primeros número de obtendría
mediante el fragmento de programa:
S := 0;
N := 0;
REPEAT
N := N + 1;
S := S + N;
UNTIL N = K;
PROGRAM MDC,
(* programa para obtener el máximo común divisor por el
algoritmo de Euclides *)
VAR
A, B, X : INTEGER;
BEGIN
READLN(A,B);
WRITE(‘EL M.C.D. De ‘,A,’ Y ‘,B);
IF (A<=0) OR (B<=0)
THEN WRITELN(‘ no existe ‘);
ELSE BEGIN (* algoritmo *)
WHILE A<>B DO
IF A<B
THEN BEGIN
X:=A;
A:=B;
B:=X;
END
ELSE REPEAT
A:=A-B;
UNTIL A<=B;
WRITELN(‘ es ‘,A);
END; (* algoritmo *)
END.
- 31 -
EJERCICIOS
PROGRAM SEPTIMO;
VAR A,B,C,D,D,E : BOOLEAN;
BEGIN
A := (8>7) OR (4<9);
B := NOT A AND ((9-1)=8);
C := (NOT A) AND (NOT B);
D := (1<2) OR (7>2) OR A;
E := A OR (C AND D);
END.
a) 3≠2
b) READ(A). ( A variable booleana ).
c) 8>4 AND 8<4
d) A := 1. ( A variable booleana ).
e) NOT(4)
PROGRAM OCTAVO;
VAR A,B,C,Y,X1,X2 : REAL;
BEGIN
(* SOLUC. ECUACION SEGUNDO GRADO *)
READLN(A,B,C);
Y := B*B-4*A*C;
IF Y<0 THEN WRITELN(‘SOLUC. IMPOSIBLE’)
ELSE
BEGIN
Y := SQRT(Y);
X1 := (-B+Y)/(2*A);
X2 := (-B-Y)/(2*A);
WRITELN(X1,X2);
END;
END.
PROGRAM NOVENO;
VAR X : REAL;
Y : INTEGER;
BEGIN
READLN(X);
IF X<0 THEN Y:=0
ELSE
IF (X<0.333)
THEN Y := 1
ELSE
IF (X<0.666)
THEN Y := 2
ELSE Y := 3;
WRITELN(Y);
END.
- 33 -
- 34 -
ESTRUCTURAS DE CONTROL SECUNDARIAS
5
Las sentencias de control expuestas en el capítulo anterior son las
fundamentales, de acuerdo con las ideas de la programación estructurada. Sin
embargo hay muchos casos en que el limitarse estrictamente a ellas conduce a
programas algo artificiosos, que resultarían más claros empleando otras
estructuras de control más adaptadas a cada caso particular.
En este capítulo se introducen nuevas construcciones para la estructura
iterativa, usando una índice, y para la de selección, mediante el empleo de vías
múltiples. Finalmente se aborda el uso de sentencias de salto de tipo general,
no estructurado.
FOR i := vi TO vf DO s
siendo i una variable entera que sirve de índice, vi y vf los valores inicial y
final que ha de tomar dicho índice, respectivamente, y s la sentencia cuyas
repeticiones se controlan. Los valores límite pueden darse en forma de
expresiones enteras cualesquiera. La sentencia s puede ser simple o
compuesta. El incremento del índice de una repetición a otra será siempre la
unidad. Si el valor inicial es superior al final la sentencia s no será ejecutada
ninguna vez. El valor del índice después de la última repetición es
indeterminado.
FOR i := vi DOWNTO vf DO s
S := 0;
FOR N:=1 TO K DO
S := S + N;
- 35 -
5.2. Sentencia CASE.
CASE e OF
valor: acción;
valor: acción;
.............
END
donde e será la expresión que determina el valor del índice, y los valores
particulares correspondientes a cada vía han de darse en forma de constantes.
La expresión usada como índice ha de ser del mismo tipo que las constantes
correspondientes a los valores particulares. Es aconsejable que dichos valores
seas contiguos, ya que la mayoría de los compiladores generan una tabla con
todos los valores comprendidos entre el mínimo y el máximo que se
especifiquen, incluyendo espacio para los que no se utilicen dentro de este
margen, que en caso de ocurrir provocarían la terminación del programa por
error, así como si la expresión toma cualquier otro valor no especificado. Cada
acción será una única sentencia, simple o compuesta.
El tipo de valor usado para índice puede ser cualquier valor simple, excepto
real. No tiene sentido, sin embargo, usar un valor booleano ya que la sentencia
IF es mucho más directa en este caso.
En caso de que para varios valores diferentes del índice haya de realizarse la
misma acción, no es necesario repetirla, sino que se adopta la forma de
escritura abreviada:
CASE e OF
.............
valor, valor, … : acción;
.............
END
siendo fácil comprender este ejemplo, que contiene además el caso particular
de posible valor del índice en que no hay que realizar ninguna acción, en cuyo
caso hay que reseñar dicho valor para que no dé lugar a condición de error,
pero acompañándolo de una sentencia nula como acción.
Los números de referencia usados como etiquetas han de ser enteros sin
signo. Algunos compiladores los limitan a cuatro cifras como máximo. En
cualquier caso han de ser declarados explícitamente antes de utilizarlos, al
comienzo del programa. La declaración de números de etiquetas, si la hay, ha
de preceder a la de constantes y variables, y estará situada, por tanto,
inmediatamente después de la especificación del nombre del programa. La
declaración será de la forma:
Estos números de referencia pueden colocarse, sólo una vez delante de una
sentencia del programa, en la forma:
número: sentencia;
GOTO número;
siendo la expresión GOTO una palabra clave que ha de escribirse sin blancos
entre sus letras.
La sentencia GOTO puede ser utilizada para salir de una estructura de control,
pero nunca para entrar en ella desde fuera, sin pasar por su encabezamiento.
Este tipo de salto puede provocar acciones irregulares, aunque la mayoría de
los compiladores los admiten y algunos incluso no dan mensaje de advertencia.
PROGRAM EXP;
(* este programa calcula ex por desarrollo en serie *)
LABEL 8;
VAR X,Y,Z,S: REAL;
N: INTEGER;
BEGIN
READLN(X);
Y:=1; Z:=1; S:=1;
FOR N:=1 TO 100 DO
BEGIN
Y:=Y*X/N;
S:=S+Y;
IF S=Z THEN GOTO 8;
Z:=S;
END;
8: WRITELN(X,S);
END.
- 38 -
EJERCICIOS
S := 0;
FOR I:=122 TO 123 DO
FOR J:=122 DOWNTO I DO
FOR K:=121 TO J DO
FOR L:=1 TO 10 DO S:=S+L;
PROGRAM ONCE;
LABEL 11,22,33,44,55;
VAR I,J,K : INTEGER;
BEGIN I:=0; J:=0; K:=0;
11 : I:=I+1;
IF I<0 THEN GOTO 22 ELSE GOTO 44;
22 : J:=J+1; IF J<0 THEN GOTO 55;
33 : K:=K+1;
44 : I:=I-2; J:=J-2; K:=J-2; GOTO 11;
55 : END.
- 39 -
6. Escribir un programa para calcular los resultados de una estadística. Los
datos son uno por línea e indican:
1. Soltero
2. Casado
3. Viudo
4. Divorciado
-1. Fin de datos.
Imprimir los porcentajes correspondientes a los distintos estados.
7. Escribir un programa para listar las ternas de valores enteros que forman
triángulo rectángulo. En el listado cada línea será una terna con los valores
ordenados de menor a mayor. Se leerán dos valores que serán el menor y
el mayor de cualquier posible terna.
10. Escribir un programa para determinar la diferencia en días entre dos fechas
cualesquiera.
- 40 -
SUBPROGRAMAS
6
Los subprogramas son elementos fundamentales en todo sistema de
programación. Todos los lenguajes de uso general permiten la definición y
empleo de subprogramas.
6.1. Funciones.
Una función se define como un programa completo que calcula como resultado
un valor simple o escalar. La manera de producir el resultado es asignar ese
valor finalmente al identificador de la función, considerado como variable
especial.
- 41 -
Las funciones definidas por el programador se incluirán en el programa que las
vaya a usar, situando la declaración a continuación de las de variables, y antes
de la parte ejecutable. Si hay varias funciones se definirán seguidas, en
cualquier orden.
Una función puede usar otra como auxiliar. En este caso puede incluir su
definición dentro de ella misma. Otra posibilidad es que una función puede
usar las definidas anteriormente, en cuyo caso el orden de definición sí es
importante.Las funciones definidas en un programa se usarán en expresiones
aritméticas exactamente igual que las predefinidas. Al usar una función es
obligatorio que el número y tipo de argumentos suministrados coincida con el
de la definición.
PROGRAM TRIANG;
(* Programa para obtener todos los triángulos rectángulos
cuyos lados son enteros <= 100 *)
LABEL 3;
CONST LADOMAX=100;
VAR H,A,B,H2 : INTEGER;
FUNCTION SUMCUAD(N,M: INTEGER): INTEGER;
BEGIN
SUMCUAD:= N*N + M*M;
END; (* sumcuad *)
FUNCTION CUADRADO(I: INTEGER): BOOLEAN;
BEGIN
CUADRADO := I=SQR(SQRT(I));
END; (* cuadrado *)
BEGIN (* triang *)
FOR A:=1 TO LADOMAX DO
BEGIN
FOR B:=A TO LADOMAX DO
BEGIN
H2 := SUMCUAD(A,B);
H:= SQRT(H2);
IF H > 100 THEN GOTO 3
ELSE IF CUADRADO(H2)
THEN WRITELN(A,B,H);
END;
3: END; (* for a *)
END.
6.2. Procedimientos.
- 42 -
En PASCAL existen procedimientos predefinidos. Entre ellos se encuentran los
de lectura y escritura READ, READLN, WRITE y WRITELN que ya se han explicado.
En realidad son algo excepcionales en el sentido de que el número y tipo de los
argumentos es variable. En un procedimiento definido por el usuario los
argumentos empleados al usar el procedimiento deben coincidir con los de la
definición.
WRITE(valor)
- 43 -
PROCEDURE INCRE(VAR N: INTEGER);
BEGIN
N:=N+1;
END;
INCRE(K)
K := K+1
E D D, C, B, A
F E E, A
G F F, E, A
G G, E, A
- 44 -
6.5. Recursividad.
- 45 -
EJERCICIOS
2. Decir cuáles de los argumentos se pasan por valor o por nombre, en las
siguientes definiciones de subprogramas.
- 46 -
9. La siguiente función calcula los números de Fibonacci, que se definen por la
relación de recurrencia:
fib1 = 1 y fib0 = 0
Estudiar por qué este algoritmo no resulta eficiente y escribir uno que lo
sea.
- 47 -
- 48 -
MANEJO DE CARACTERES
7
Hasta el momento sólo se han podido usar caracteres en un programa en las
sentencias de escritura, como rótulos aclarativos. Existe además la posibilidad
de almacenar caracteres en variables, y operar con ellos.
READ(A,B,C)
3.6
- 49 -
A = ‘3’ B = ‘.’ C = ‘6’
En cualquier caso el lenguaje PASCAL garantiza que las letras del alfabeto
poseen ordinales consecutivos, en el orden alfabético habitual, al igual que los
dígitos numéricos en el orden de sus valores. Llamando n al ordinal de la A y m
al ordinal del carácter 0 (cero), se cumplirá:
ORD(‘A’) = n
ORD(‘B’) = n+1
....
ORD(‘Z’) = n+25
ORD(‘0’) = m
ORD(’1’) = m+1
....
ORD(‘9’) = m+9
CHR(n) = ‘A’
CHR(n+1) = ‘B’
etc.
Otras funciones que pueden ser utilizadas con caracteres son PRED y SUCC, que
suministran respectivamente el carácter anterior y el siguiente a uno dado. En
realidad estas funciones son muy generales, y pueden usarse con valores de
cualquier tipo, excepto los reales. Las funciones PRED y SUCC están
relacionadas con las ORD y CHR en la forma:
PRED(x) = CHR(ORD(x)-1)
SUCC(x) = CHR(ORD(x)+1)
- 50 -
7.4. Operaciones con caracteres.
La sentencia de asignación puede ser utilizada para dar valores a una variable
de tipo carácter, en la forma habitual.
Los únicos operadores que pueden utilizarse con caracteres son los de
comparación, siendo el resultado el mismo que comparando sus ordinales.
Usando estos operadores se determina si dos caracteres coinciden, por
ejemplo, o si están en orden alfabético. Así, darán resultado TRUE las
expresiones:
‘+’ = ‘-’
‘X’ > ‘Y’
Los valores de tipo carácter pueden ser usados como índice en sentencias FOR
y CASE. La sentencia:
- 51 -
FOR C := ‘A’ TO ‘Z’ DO
WRITELN( C, ORD(C) );
PROGRAM CALCULO;
VAR X,Y,X: REAL; OP: CHAR;
BEGIN
READ(X);
REPEAT READ(OP) UNTIL OP<>’ ‘;
READ(Y);
CASE OP OF
‘+’: Z:=X+Y;
‘-’: Z:=X-Y;
‘*’: Z:=X*Y;
‘/’: Z:=X/Y;
END;
WRITELN(X,OP,Y,’=’,Z);
END.
- 52 -
EJERCICIOS
- 53 -
- 54 -
DEFINICIÓN DE NUEVOS TIPOS
8
Se denominan tipos escalares a los que toman valores simples. En PASCAL
existen los tipos escalares predefinidos ya mencionados INTEGER, REAL,
BOOLEAN y CHAR. Otros tipo sde valores pueden ser definidos por el
programador en la forma que se indica en los apartados siguientes.
8.1. Enumeración.
donde el tipo y los valores son identificadores que los representan. Cada uno
de los identificadores de valores queda al mismo tiempo declarado como
constante. Ejemplos de estas definiciones serían:
HOY := VIERNES;
y similares.
- 55 -
primer elemento de la lista de valores es cero. En los ejemplos anteriores se
cumplirá que:
ORD(ROJO) = 0
PRED(VIERNES) = JUEVES
SUCC (LUNES) = MARTES
HORAS:=0; HOY:=DOMINGO;
FOR N:=1 TO 365 DO
BEGIN
IF HOY=DOMINGO
THEN HOY:=LUNES
ELSE HOY:=SUCC(HOY);
CASE HOY OF
LUNES, MIERCOLES, VIERNES: HORAS:=HORAS+8;
MARTES, JUEVES : HORAS:=HORAS+7;
SABADO : HORAS:=HORAS+4;
DOMINGO : ;
END;
END;
- 56 -
Siendo N una variable entera y B una booleana, se puede leer indirectamente
un valor booleano representado externamente por cero o uno mediante la
secuencia
8.3. Subrango.
vmin..vmax
y los dos puntos entre ellos se escriben seguidos, sin blanco intercalado. No
pueden definirse subrangos del tipo REAL.
- 57 -
TYPE DECIMAL = 0..9;
LETRA = ‘A’..’Z’;
LABORABLE = LUNES..VIERNES;
VAR D: DECIMAL;
INICIAL: LETRA;
LAB: LABORABLE;
harán que la variable D sea considerada como entera, INICIAL como carácter y
LAB como día de la semana. Es válido, por tanto, escribir las sentencias:
D := 28-25;
READ(INICIAL);
LAB := PRED(JUEVES);
En algunos casos resulta engorroso tener que dar nombres particulares a los
subrangos. La especificación puede hacerse directamente al declarar las
variables. Los ejemplos anteriores se podrían haber escrito también en la
forma:
VAR D: 0..9;
INICIAL: ‘A’..’Z’;
LAB: LUNES..VIERNES;
- 58 -
EJERCICIOS
PROGRAM DOCE;
TYPE NUMERO = (AZUL,ROJO,VERDE,MARRON,BLANCO,NEGRO);
VAR N: NUMERO;
I,J: INTEGER;
BEGIN
J:=0;
N:=AZUL;
FOR I:=1 TO 5 DO
BEGIN
J:=J+ORD(N);
N:=SUCC(N);
END;
WRITELN(‘J= ‘,J);
END.
- 59 -
5. Determinar el resultado impreso por el siguiente programa, así como los
sucesivos valores de la variable TONO.
PROGRAM TRECE;
TYPE COLOR=(BLANCO, VERDE,AZUL,ROJO,NEGRO);
VAR TONO: COLOR;
CTONO: INTEGER;
BEGIN
TONO:=AZUL;
CTONO:=0;
REPEAT
CASE TONO OF
BLANCO,NEGRO : BEGIN
CTONO:=CTONO+1;
TONO:=AZUL;
END;
VERDE : BEGIN
CTONO:=CTONO+2;
TONO:=PRED(TONO);
END;
AZUL,ROJO : BEGIN
CTONO:=CTONO+3;
TONO:=SUCC(TONO);
END;
END;
UNTIL CTONO>15;
WRITELN(‘CONTROL DE TONO: ‘,CTONO);
END.
- 60 -
CONJUNTOS
9
Todos los tipos de valores utilizados hasta el momento se denominan
escalares, y son valores simples, en el sentido de que no pueden
descomponerse. En este capítulo y los siguientes se introducirán nuevos tipos
de valores estructurados, compuestos de otros valores más simples.
[]
[ROJO]
[AMARILLO]
[AZUL]
[ROJO, AMARILLO]
[ROJO, AZUL]
[AMARILLO, AZUL]
[ROMO, AMARILLO, AZUL]
Una vez definido el tipo de conjunto, pueden declararse variables de ese tipo,
tales como:
- 62 -
9.3. Manejo de conjuntos.
PROGRAM CRIBA;
(* Programa para imprimir los primeros números primos hasta 40 *)
CONST MAX = 40;
VAR J,N: 1..MAX;
CRIBA: SET OF 1..MAX;
BEGIN
CRIBA:=[1..MAX];
FOR N:=1 TO MAX DIV 2 DO
BEGIN
J:=N+N;
WHILE J<MAX DO
BEGIN
CRIBA:=CRIBA-[J];
J.=J+N;
END;
END;
FOR J:=1 TO MAX DO
IF J IN CRIBA THEN WRITELN(J);
END.
- 63 -
EJERCICIOS
4. Escribir una función, que dado un carácter devuelva uno de los códigos
numéricos siguientes:
1: Si es una letra.
2: S es un dígito.
3: Si es un signo de puntuación (. , : ;).
4: Si es un espacio en blanco.
5: Si no es ninguno de los anteriores.
5. Hallar los siguientes conjuntos partiendo de los datos del ejercicio 9.2.
a) IF 3 IN B THEN H:=C-E ELSE H:=C+E
b) IF 0 IN D THEN H:=A+B ELSE H:=A-B
c) IF (1 IN B) OR (3 IN A) THEN H:=E-C
ELSE H:=E
- 64 -
VECTORES Y MATRICES
10
Estas estructuras de datos son admitidas por casi todos los lenguajes de
programación de alto nivel. Consisten en una serie de datos, todos de la
misma naturaleza, a los que se da un nombre común, distinguiendo cada
elemento por su índice o número de orden que ocupa en la serie. Coinciden
con el concepto matemático de las mismas.
La sentencia de asignación puede ser usada para copiar una variable vectorial
en otra del mismo tipo, en la forma:
vector A := vector B
- 65 -
pero salvo este caso particular el manejo de estructuras vectoriales exigirá
operar con cada elemento por separado. Para hacer referencia a un
componente en particular se escribirá su subíndice a continuación del nombre
del vector, entre corchetes. Por ejemplo, usando las variables:
PUNTOA[X] := 1.2;
PUNTOB[Y] := 4.3;
PUNTOC[Z] := 0.7;
para asignar valores a las coordenadas del punto A. Un giro de 90º alrededor
del eje Z podría conducir a las asignaciones:
PUNTOB[X] := PUNTOA[Y];
PUNTOB[Y] := -PUNTOA[X];
PUNTOB[Z] := PUNTOA[Z];
SEGMENTO[1][X] := 3.7
SEGMENTO[1.X] := 3.7;
TABLERO[3,6] := VACIO;
etc.
- 66 -
horas de trabajo totales. Se supone un horario de 9 a 1 y de 4 a 8 de lunes a
viernes; de 9 a 2 los sábados, y cerrado los domingos.
PROGRAM HORARIO;
TYPE DIASEM = (LU,MA,MI,JU,VI,SA,DM);
HORARIODIA = SET OF 0..23;
VAR DIA: DIASEM; HORA: 0..23; HORA: INTEGER;
HORARIO: ARRAY[DIASEM] OF HORARIODIA;
BEGIN
FOR DIA:=LU TO VI DO
HORARIO[DIA]:=[9..13,16..19];
HORARIO[SA]:=[9..14];
HORARIO[DM]:=[];
FOR DIA:=LU TO DM DO
FOR HORA:=0 TO 23 DO
HORAS:=HORAS+ORD(HORA IN HORARIO[DIA]);
WRITELN(‘total ‘,HORAS, ‘ horas semanales’);
END.
ARRAY[1..n] OF CHAR
y puede ser asignado como valor a vectores declarados como tales. Sería
válido escribir:
- 67 -
Desgraciadamente no es posible emplear la sentencia de lectura para tomar
una serie de caracteres y almacenarlos en un vector directamente. La lectura
de caracteres ha de hacerse siempre uno a uno. En el caso anterior podría
escribirse:
para leer los 8 caracteres consecutivos necesarios. Para ello será necesario que
la línea de datos contenga al menos 8 caracteres, pues de no ser así se
tomarán los que falten de la línea siguiente. En capítulos posteriores se verá la
manera de detectar el fin de la línea de datos.
- 68 -
EJERCICIOS
FOR I:=1 TO N DO
FOR J:=1 TO N DO
A[I,J] := I=J;
Mirar esta fórmula porque creo que está mal, la ultima A ij debe ser otra cosa
8. Escribir un programa para sumar dos números enteros con cien cifras cada
uno.
- 69 -
10. Escribir un programa para realizar la contabilidad mensual de una empresa
que procesa al final de mes el conjunto de datos que teienen el siguiente
formato por línea:
Donde:
TIPO, es un entero que indica:
1. Cobro
2. Pago
3. Fin de datos
TIPO-CONCEPTO, es un número entero que indica el concepto por
el que se realiza el pago o cobro, tipificados de la siguiente forma:
1. Recibos (Cobrados o pagados)
2. Nóminas
3. Letras (Cobradas o pagadas)
4. Bancos.
5. Compras diversas
FECHA, es el día (entero) correspondiente dentro del mes.
“ “ “ “ “
“ “ “ “ “
“ “ “ “ “
- 70 -
REGISTROS
11
Esta forma estructural consiste en una colección o secuencia de elementos
componentes que no han de ser de la misma naturaleza, como en el caso de
los vectores. Los componentes no se distinguen por número de orden, sino por
nombre particular. Los componentes se llaman también “campos”.
registro = RECORD
campo: tipo;
campo: tipo;
........
END
donde registro recibe un nombre global, al tiempo que cada campo se define
por un nombre que lo identifica, con indicación del tipo de valor que le
corresponde. Ejemplos de registros serían:
TYPE
MES = (ENE,FEB,MAR,ABR,MAY,JUN,JUL,AGO,SEP,OCT,NOV,DIC);
FECHA = RECORD
DIA: 1..31;
MESS: MES;
ANNO: INTEGER;
END;
PUNTO = RECORD
X:REAL;
Y:REAL;
Z:REAL;
END;
Si varios campos seguidos son del mismo tipo, éste puede indicarse sólo una
vez, en el último, escribiendo los campos separados por comas. La última
definición del ejemplo podría reescribirse:
PUNTO = RECORD
X,Y,Z: REAL;
END;
- 71 -
En los ejemplos anteriores cada campo es un valor simple, pero esto no es una
limitación, sino que cada campo puede ser una estructura tan compleja como
se desee. Por otra parte, el nombre de un campo puede coincidir con el de la
misma variable registro, o con el de otra variable cualquiera.
HOY.DIA := 6;
HOY.MESS := ENE;
HOY.ANNO := 1981;
por ejemplo. Del mismo modo, para cambiar el mes por el siguiente se podría
programar:
WITH HOY DO
IF MESS = DIC THEN MESS := ENE
ELSE MESS := SUCC(MESS);
Si la sentencia controlada por un WITH es también de ese tipo, tal como en:
- 72 -
se puede abreviar la redacción en le forma:
PROGRAM EXAMEN;
LABEL 5;
CONST MAX = 100;
TYPE NOTA = 1..10;
VAR
N, ALUMNOS: INTEGER;
TABLA: ARRAY[1..MAX] OF
RECORD
MATRICULA: INTEGER;
NOTA1,NOTA2,NOTA3,CALIFICACION: NOTA;
END;
MEDIAS: RECORD
MEDIA1,MEDIA2,MEDIA3,MEDIA: REAL;
END;
TOTAL: RECORD
SUSP,APROB,NOTABLE,SOBRES,MDEHON: INTEGER;
END;
BEGIN
ALUMNOS := 8;
FOR N:=1 TO MAX DO
WITH TABLA[N] DO
BEGIN
READ(MATRICULA);
IF MATRICULA=0 THEN GOTO 5;
ALUMNOS:=ALUMNOS+1;
READ(NOTA1,NOTA2,NOTA3);
END;
- 73 -
WRITELN(‘MATRICULA NOTA1 NOTA2 NOTA3 CALIFICACIÓN’);
5:WITH MEDIAS,TOTAL DO
BEGIN
MEDIA1:=0.0;
MEDIA2:=0.0;
MEDIA3:=0.0;
MEDIA:=0.0;
SUSP:=0;
APROB:=0;
NOTABLE:=0;
SOBRES:=0;
MDEHON:=0;
FOR N:=1 TO ALUMNOS DO
WITH TABLA[N] DO
BEGIN
MEDIA1:=MEDIA1+NOTA1;
MEDIA2:=MEDIA2+NOTA2;
MEDIA3:=MEDIA3+NOTA3;
CALIFICACION:=ROUND((NOTA1+NOTA2+NOTA3)/3);
MEDIA:=MEDIA+CALIFICACION;
WRITELN(MATRICULA,NOTA1,NOTA2,NOTA3,CALIFICACION);
CASE CALIFICACION OF
0,1,2,3,4: SUSP:=SUSP+1;
5,6: APROB:=APROB+1;
7,8: NOTABLE:=NOTABLE+1;
9: SOBRES:=SOBRES+1;
10: MDEHON:=MDEHON+1;
END; (* del CASE *)
END;
MEDIA1:=MEDIA1/ALUMNOS;
MEDIA2:=MEDIA2/ALUMNOS;
MEDIA3:=MEDIA3/ALUMNOS;
MEDIA:=MEDIA/ALUMNOS;
WRITELN(‘NOTA MEDIA ’,MEDIA1,MEDIA2,MEDIA3,MEDIA);
WRITELN;
WRITELN(‘SUSPENSOS ‘,SUSP);
WRITELN(‘APROBADOS ‘,APROB);
WRITELN(‘NOTABLES ‘,NOTABLE);
- 74 -
WRITELN(‘SOBRESALIENTES ‘,SOBRES);
WRITELN(‘M DE HON. ‘,MDEHON);
WRITELN(‘TOTAL ‘,ALUMNOS);
END;
END.
Este ejemplo resulta algo particular en el sentido de que todas las referencias a
componentes de registros tienen lugar dentro de sentencias WITH, usándose
directamente el nombre del campo.
Puede observarse que la sentencia WITH permite usar como variable de tipo
registro una que sea un elemento de un vector, cuya situación puede depender
de una variable. Si es así hay que tener cuidado de no alterar dicha variable
dentro de la propia sentencia WITH, ya que el compilador se limita a calcular la
posición de la componente sólo una vez, al iniciarse la sentencia WITH. Por
tanto, es correcto escribir, como en el ejemplo:
WITH TABLA[N] DO
FOR N:=1 TO ALUMNOS DO
........
- 75 -
donde el indicador será una variable escalar del tipo indicado, que constituye
además implícitamente un campo fijo del registro; valor1-valorN será la
colección de valores posibles de dicho indicador, y las variantes, escritas cada
una entre paréntesis, especificarán la estructura del campo variable en cada
caso. Si para algún valor del indicador no hubiese que registrar ninguna
información se especificará una variante nula en la forma ().
MATRICULA: RECORD
PROVINCIA: ARRAY[1..2] OF CHAR;
CASE ANTIGUA: BOOLEAN OF
TRUE: (NUMERO:ARRAY[1..6] OF CHAR);
FALSE: (RECORD CIFRAS: ARRAY[1..4] OF CHAR;
LETRAS: ARRAY[1..2] OF CHAR)
END;
MATRICULA.ANTIGUA:=FALSE;
MATRICULA.CIFRAS:=’0852’;
MATRICULA.LETRAS:=’AB’;
MATRICULA.ANTIGUA:=TRUE;
MATRICULA.CIFRAS:=’7380’;
CASE tipo OF
valor1: (variante1);
valor2: (variante2);
.............…
valorN: (varianteN),
END
- 76 -
EJERCICIOS
- 77 -
7. Escribir un procedimiento para listar Nombre y dirección postal, del
profesorado de un centro. Los datos se encuentran en una tabla, en la
que cada línea es un registro como el descrito en el ejercicio 11.4. El
listado podrá hacerse de forma selectiva, es decir:
- Sólo de catedráticos.
- Catedráticos y agregados.
- Catedráticos, agregados y adjuntos.
- Todos.
- 78 -
12
FICHEROS SECUENCIALES
FILE OF tipobase
donde tipobase será cualquier tipo válido en PASCAL, bien un dato simple o
una estructura cualquiera. Un ejemplo trivial sería:
fichero^
- 79 -
es decir, la declaración usada como ejemplo especifica implícitamente la
existencia de una variable, de tipo INTEGER, asociada al fichero, a la que se
hará referencia en la forma:
LISTA^
• EOF(fichero) es una función booleana que vale TRUE cuando han sido
usados ya todos los componentes del fichero en cuyo caso la variable
asociada tiene un valor no definido (End Of File).
• RESET(fichero) es un procedimiento que prepara al fichero para ser
leído desde el principio, de manera que la variable asociada corresponde
al primer elemento. Si el fichero está vacío dicha variable permanecerá
indefinida y EOF(fichero) valdrá TRUE.
• REWRITE(fichero) es un procedimiento que prepara al fichero para ser
grabado desde el principio. El contenido del fichero se pierde, quedando
vacío y en condición de EOF.
• GET(fichero) es un procedimiento que mueve la variable asociada al
siguiente componente. Sólo tiene sentido ejecutarlo si la condición EOF
es FALSE. Si no hay más componentes se producirá EOF.
• PUT(fichero) es un procedimiento que añade un nuevo elemento al
fichero. Sólo tiene sentido si se está en condición de EOF, que se seguirá
cumpliendo tras su ejecución. El valor del elemento añadido será el que
se haya asignado explícitamente a la variable asociada, que habrá dejado
así de resultar indefinida.
Es importante hacer notar que antes de utilizar un fichero hay que ejecutar
sobre él un RESET o REWRITE, ya que de otro modo el componente el que se
accedería estaría indeterminado. Estas operaciones iniciales corresponden a lo
que se llama “abrir” el fichero.
Frecuentemente la lectura o escritura del fichero se realiza copiando valores
entre la variable asociada y otra variable del mismo tipo, definida aparte, y que
se usa para elaborar la información. Esta manera de operar se ve facilitada con
la existencia de otros procedimientos predefinidos, que pueden ser descritos en
función de los anteriores, y que son los siguientes:
- 80 -
Un sencillo ejemplo de cómo usar estos procedimientos predefinidos es el
siguiente programa, que obtiene el valor medio de una lista de números
enteros.
PROGRAM PROMEDIO;
VAR N,NUMERO : INTEGER;
SUMA : REAL;
LISTA : FILE OF INTEGER;
BEGIN
N:=0; SUMA:=0.0; RESET(LISTA);
WHILE NOT EOF(LISTA) DO
BEGIN
N:=N+1;
READ(LISTA,NUMERO);
SUMA:=SUMA+NUMERO;
END;
IF SUMA<>0 THEN SUMA:=SUMA/N;
WRITELN(‘VALOR MEDIO = ‘,SUMA);
END.
FILE OF CHAR
EOLN(fichero)
- 81 -
Además puede ordenarse la escritura de vectores de caracteres (aunque no le
lectura) resultando equivalente a una orden de escritura por cada carácter del
vector, consecutivamente. Estas lecturas y escrituras de varios caracteres sólo
son posibles con sentencias READ, y WRITE. La variable asociada sólo accede a
caracteres sueltos.
RESET(INPUT); REWRITE(OUTPUT);
que preparan a ambos ficheros para ser usados desde el principio. Estos
ficheros predefinidos serán los que se usen implícitamente en las sentencias
READ y WRITE que no lleven como primer argumento un nombre de fichero. De
esta manera si X es una variable o expresión de tipo INTEGER, REAL o CHAR,
según los casos, se cumplirá que:
Tal como se ha indicado, los valores numéricos pueden ser escritos sobre
ficheros de caracteres ocupando el espacio predefinido, que será suficiente
para contener la representación de cualquier valor posible, más algún espacio
en blanco que la separa del resultado anterior. Además los valores reales
aparecerán siempre en notación científica, como mantisa normalizada seguida
de una potencia de 10.
- 83 -
EJERCICIOS
3. Escribir un programa que liste un fichero de texto, numerando cada línea del
mismo.
TYPE
VE: RECORD
NUMERO: INTEGER;
TEXTO: ARRAY[1..20] OF CHAR;
END;
VAR
VALOR: FILE OF VR;
- 84 -