Esqueleto o formato
básico para un programa :
PROGRAM Skeleton (INPUT,OUTPUT);
CONST
Las constantes con nombres del programa se especifican aquí.
TYPE
Los tipos de datos definidos por el programador se especifican
aquí.
VAR
Los variables del programa se especifican aquí.
BEGIN
Las instrucciones del programa van aquí.
END.
1) El primer caractér debe ser una letra. La letra puede
aparecer en mayúsculas o minúsculas.
2) Los caractéres restantes en el nombre pueden ser letras o
numeros. Además Turbo Pascal permite a los programadores
utilizar el simbolo de guion abajo ( _ ) , se utiliza para
separar palabras individuales e un nombre : Number_of_Employee s.
3) Este lenguaje permite un número arbitrario de caractéres. En
la longuitud se ignoran los simbolos después de 63. En
consecuencia si dos nombres son idénticos en las primeras 63
posiciones serán tratados como nombres idénticos.
PALABRAS VALIDAS
Weekly_Pay, Test1_Score, SampleSize, ABC123.
PALABRAS INVALIDAS
1st_Weeks_Pays ( Comienza con un digito).
Hours Worked ( Contiene un blanco intermedio).
Item# ( Caractér inválido #).
Las palabras especiales de Pascal como BEGIN y END siempre irán
en mayúsculas.
ENCABEZADO DEL PROGRAMA.
Se utiliza para darle nombre al programa. En el programa
esqueleto (anterior), la linea que contiene el nombre del
programa también tiene (INPUT,OUTPUT); Los nombres especiales
INPUT y OUTPUT son reconocidos por Pascal como dispositivos de
Entrada y Salida estandares. Para un programa interactivo el
dispositivo estandar de Entrada es generalmente Teclado, mientras
que el dispositivo de salida es tipicamente el monitor o la
impresora.
Pongase atención especial al signo de punto y coma que termina
la linea. Este simbolo se utiliza en Pascal como seprador.
COMENTARIO
Se utiliza como mecanismo para obtener información descriptiva
sobre el programa. En Pascal los comentarios se encuentran entre
un grupo de llaves como en :
{ Este es un comentario } o alternamente (* Este también es un
comentario *).
EL BLOQUE CONST
La declaración de constantes no es más que una lista de
nomenclaturas y valores asignados a estos nombres.
El formato utilizado para las entradas en este bloque es como
sigue :
CONST
PI= 3.1416;
Tax_Rate = 0.04;
Report_Heading = 'Bi-Weekly Payroll Summary';
La misma declaración
podría haber sido expresada como sigue :
CONST PI = 3.1416 ; Tax_Rate=0.04 ; Report_Heading='Bi-Weekly
Payroll Summary' ;
EL BLOQUE TYPE
Un tipo de dato es un conjunto de valores que pueden tomarse de
un campo de datos.
TYPE
Month_Number = 1..12 ;
Si una variable tiene el tipo Month_Number, no será permitido un valor fuera del conjunto que comprende {1,2,3,4,5,6,7,8,9,10,11,12}
EL BLOQUE VAR
En este bloque el programador le dá nombres a todas las
variables que se utilizarán en el programa. El formato es
similar a otros vistos con anterioridad.
VAR
Curr_Month,Curr_Day,Curr_Year:INTEGER;
Class_Rank,Class_Size:INTEGER;
Middle_Initial:CHAR;
CHAR : Son
los caractéres como letras, digitos signos de puntuación.
INTEGER : Están restringidos principalmente
a un rango finito por la computadora.
Microcomputadora : -32768 a 32767
Mainframe : -2147483648 a 2147483647
EL CUERPO DEL
PROGRAMA
Las instrucciones reales del programa se delimitan por las
palabras BEGIN y END con un punto después del END. En Pascal
cualquier conjunto de instrucciones de un programa delimitadas
por BEGIN y END se considera un sola unidad y a menudo se llama b
loque.
Existen cuatro tipos de instrucciones que pueden ser utilizadas
en el cuerpo del programa :
1) Operaciones de Entrada : Estas se utilizan para transferir
valores de alguna fuente externa a la computadora.
2) Operaciones de Salida : Se utiliza para transmitir valores de
la computadora a algúndispositivo externo.
3) Operaciones Aritmeticas : Contiene las básicas como son suma,
resta, multiplicación y ivisión y las "funciones
aritmeticas" como logaritmos, exponenciales, funciones
trigonometricas entre otras.
4) Estructura de Control : Es la instrucción o colección de
instrucciones utilizadas para modificar el flujo secuencial de
las instrucciones.
INTEGER :
Las operaciones aritmeticas que involucren números enteros,
tomando en cuenta los positivos y negativos.
REAL : Campos númericos que pueden tener
valores fraccionaros. Existe un número limitado de posiciones
digitales disponibles para el número, pero el número decimal
que separa la parte entera de la fracción puede colocarse en
cualquier parte. Este tipo de representación se llama Forma de
Punto Flotante.
BOOLEAN : A un campo de este tipo solo se le
permite tomar uno de los dos valores TRUE o FALSE : Estos campos
se utlizan más comunmente como BANDERAS para inidicar que una
condición ha o no ha ocurrido. Un ejemplo el EOF o fin de
archivo, se utiliza para probar si ya se han procesado todos los
datos de un archivo de entrada. Si quedará cualquier dato en el
archivo, EOF sería FALSE, de lo contrario sería TRUE. Es una
referencia matemática del siglo XIX George Boole inventó un
sistema conocido como algebra boleana, la cuál proporciona las
bases para la circuitería lógica utilizada en las computadoras
digitales.
CHAR : Sirve para guardar un sólo
caractér, como letra, digito o símbolo de puntuación. Estos no
pueden ser usados en operaciones matemáticas, ya que no tiene
sentido sumar dos símbolos de caractér. Exsten dos códigos
para manejo de caractéres :
ASCII : American Standard Code for Information Interchange
EBCDIC : Extended Binary Code Decimal Interchange Code
Pascal proporciona la
función de conversión para un valor ASCII a su equivalente
númerico, ORD efectuá la conversión.
Si Ch contiene la letra A entonces para una computadora que use
ASCII, ORD(Ch) es 65.
Por el contrario es posible guardar un código númerico en una
variable de tipo CHAR utilizando la función CHR. Para ilustra;
CHR(43) es el símbolo + en una computadora que utiliza ASCII.
STRING : Turbo Pascal permite cadenas de
longuitud variable, lo más largoposible es de 255 caractéres,
simplemente se pede permitir que un string asuma la longuitud
máxima, o se pede declarar un máximo menor, como se muestra.
VAR
Long_Name : STRING ;
Shorter_Name : STRING[20] ;
Generalmente es mejor asociar un tipo explicito a una longuitud particular de string, como se muestra en la forma a continuación .
TYPE
Long_String = STRING ;
Shorter_String = STRING[20] ;
VAR
Long_Name : Long_String ;
Sorter_Name : Shorter_String ;
Los comandos WRITE y WRITELN se utilizan para llevar a cabo todas
las operaciones de salida en modo texto. Cumplen la misma
función, sin embargo el comando WRITELN inserta una secuencia de
control de "fin de linea" en la cadena salida, haciendo
que avance hacia la linea siguiente.
WRITE
Lo que esta entre <> es opcional, también si se incluye un nombre
de archivo la salida será dirigida a un archivo. De otra manera
será enviada a OUTPUT que normalmente en Turbo Pascal es el
monitor. Se permite que las instrucciones de salida en modo texto
incluyendo variables, constantes y expresiones para la forma expN
especificados en el formato general.
Pascal imprimirá el valor en un campo exactamente del tamano
necesario para que contenga un número. Si se desea se puede
especificar una anchura mínima del campo colocando (N:n) en
donde n es un entero positivo inmediatamente despu&ea cute;s
de la expresión.
Se muestran los siguientes ejemplos para utilizar las
instrucciones WRITE
Valor de N Instrucción de Salida Resultado
235 WRITE(N) 235___
-235 WRITE(N) -235__
235 WRITE(N:6) ___235
-235 WRITE(N:6) __-235
* 235 WRITE(N:2) 235___
* -235 WRITE(N:2) -235__
(*) Si la anchura
mínima del campo nos es suficiente, esta será
automaticamenteincrementada a un tamano adecuado y justificada a
la izquierda. El signo ( _ ) en la columna de Resultado significa
un espacio en blanco que se toma en cuenta.
SALIDA REAL
Si no se especifíca anchura, el valor mostrado en FORMATO
EXPONENCIAL. En esta forma habrá un signo menos, antepuesto, si
procede, seguido de un solo dígito un punto decimal, cierto
número de digitos adicionales, la letra E un signo y un
exponente. En Turbo Pascal la forma normal tiene 18 posiciones :
b^#.##########E*## (para valores negativos)
bb#.##########E*## (para valores positivos)
Aqui también se utiliza el signo ( _ ) como espacio en blanco.
En Pascal se maneja el formato Valor : M:N , imprimirá el valor
dado con cuando menos M caractéres de los cuáles N dígitos
serán decimales.
Valor de N Instrucción de Salida Resultado 312.645 WRITE(X) __3.1264500000E+02 -312.645 WRITE(X) _-3.1264500000E+02 312.645 WRITE(X:8:4) 312.6450 312.645 WRITE(X:9:3) __312.645 312.645 WRITE(X:9:1) ____312.6
SALIDA STRING
Si no se especifica la anchura del campo, el valor simplemente se
anade a la cadena de salida. Si se especifica la anchura del
campo para un valor STRING es la justificación a la derecha
dentro de la anchura designada del campo .
Si no es lo suficientemente grande para mantener el valor STRING,
automaticamente se alarga para acomodar la cadena. Se ilustra el
efecto de la instruccion tomado en cuenta los valores de las
siguientes variables:
Name = 'John Smith' y Net_Pay = 394.67 Instruccion de Salida Resultado WRITELN(Name,Net_Pay:6:2) ; John Smith394.67 WRITELN(Name,Net_Pay:11:2) ; John Smith_____ 394.67 WRITELN(Name,Null:5,Net_Pay:6:2) ; John Smith_____ 394.67 WRITELN(Name:16,Null:5,Net_Pay:6:2) ; ______ John Smith _____394.67
Utiliza las instrucciones READ y READLN para efectuar operaciones
de entrada. Las dos instrucciones se comportan escencialmente de
la misma manera, con una diferencia pequena pero significativa.
Al efectuar entradas, Pascal mantiene un apuntador a la cad ena
de entrada, que indica en donde se quedó al completar la ultima
instrucción de entrada. Cuando se utiliza el READLN, este
apuntador automaticamente avanza después del final de la linea
actual. En otras palabras, avanza y apunta al caractér que sigue
inmediatamente a la secuencia de caractér de control de fin de
linea. La instrucción READ, por otra parte, deja el apuntador de
entrada en la posición del caractér qe sigue inmediatamente al
ultimo caractér leído.
La forma general para la instrucción READ es :
READ
en donde lo encerrado en <..> es opcional.
Si se incluye un nombre de archivo, los valores de entrada se
obtienen de dicho archivo. De lo contrario, los valores se
obtienen de INPUT. En seguida se especifican los detalles de como
se tratan cada uno de los cinco tipos estandares.
Entrada REAL
Los valores REALES se procesan de manera similar a los INTEGER. A
diferencia de los enteros, el valor REAL puede tener una parte
fraccionaria, la cuál se inicia con el punto decimal. Además
puede incluir un factor de escala el cuál se interpreta con
"potencias de 10". Un factor de escala comienza con la
letra E, seguida por un valor INTEGER. Por ejemplo
3.52E2 significa 3,5 veces 10 a la segunda potencia, o sea 350,
mientras que 245E-5 significa245 veces 10 a la potencia -5, o
bien 0.00245
Entrada BOOLEAN
Pascal no permite la captura de un valor de tipo BOOLEAN. Entrada
CHAR
Cuando un READ o un READLN incluye una variable de tipo CHAR, se
obtiene el siguiente caracter de la cadena de entrada.
Entrada STRING
El estatuto READ continuará tomando caracteres de entrada hasta
que alcance la longuitud máxima de la variable STRING, o sea se
encuentre un fin de linea.
Para observar las diferentes reglas y regulaciones sobre la
entrada en Pascal, veremos algunos ejemplos . Suponiendo qe se
tienen las siguientes declaraciones.
VAR
I1, I2 : INTEGER ;
R1 : REAL ;
Ch1, Ch2 : CHAR;
St1, St2 : STRING[5] ;
Supongase que la cadena
de entrada, la cuál esta asociada con el archivo de entrada
Infile, que contiene estas cuatro lineas ; 12 345 X
Stuff
-1.7E4
More Stuff
Ahora considerese las Instrucciones READ (Infile, I1) ; Asignará
el valor 12 a la variable I1 y dejará el apuntador de entrada
colocado en el blanco que sigue al 12.
READ (Infile, I2, Ch1) ;
Asignará el valor 345 a la variable I2, y el espacio ' ', a la
variable Ch1. El apuntador de entrada será colocado en la X de
la primer cadena de entrada.
READLN (Infile, Ch2) ;
Asignará el caracter X a la variable Ch2 y avanzará el
apuntador de entrada hasta después del fin de linea, de tal
manera que queda colocado en la letra S de la segunda linea de la
cadena.
READLN (Infile, St1) ;
Asignará la cadena Stuff a la variable St1, y avanzará el
apuntador de entrada hasta después del fin de linea, de tal
manera que queda colocado en el signo menos del inicio de la
tercer linea de la cadena de entrada.
READLN (Infile, R1) ;
Asignará el valor de -17000 a la variable R1, y avanzará el
apuntador de entrada hasta después del fin de linea, de tal
manera que queda colocado en la letra M al inicio de la cuarta
linea de la cadena de entrada.
READLN ( Infile,St2) ;
Asigna la cadena More a la variable St2 y avanza hasta despues de
los caracteres restantes de la línea, colocando el apuntador de
entrada al principio de la quinta linea, la cuál, es el fin de
entrada.
Normalmente envia la salida a un archivo especial, OUTPUT. Para
direccionar esta salida a cualquier otra parte, es necesario
incluir un nombre de archivo en el estatuto WRITE o WRITELN.
Algunas versiones de Pascal proporcionan un nombre predefinido
para la impresora. Por ejemplo de la 1.0 a 3.0 de Turbo Pascal,
este nombre era LST.
A partirdel Turbo Pascal 4.0, se hizo necesario definir
explicitamente una variable de archivo para la impresora, igualar
esa variable con la impresora y luego inicializar el archivo de
salida. Después de que el programa haya terminado de utilizar el
archivo, deberá terminar su acceso a éste. Este proceso de
terminación asegura, entre otras cosas, que toda la información
dirigida a la impresorase haya realmente transmitido.
A la variable de archivo se le asigna un nombre, como a las otras
variables y un tipo de datos TEXT. Una declaración típica
sería :
VAR
Printer : TEXT ;
Una vez que la variable ha sido definida, es posible accesar el archivo utilizando las siguientes instrucciones :
ASSIGN ( Printer, 'LPT1' ) ; REWRITE( Printer ) ; * * * WRITE( Printer, data ) ; * * CLOSE ( Printer) ;
La instrucción ASSIGN,
que realmente no es parte de pascal estándar, se utiliza para
asociar un archivo externo o dispositivo con una variable de
archivo interna. Los sistemas de microcomputadoras que corren
bajo los sistemas operativos MS-D OS o PC-DOS normalmente tienen
la impresora conectada al puerto paralelo de la impresora, al que
se le da el nombre de LPT1 puede estar conectada a uno de los
puertos alternos LPT2 y LPT3.
El estatuto REWRITE si es parte de Pascal estándar, y le dice a
la computadora que inicialice la variable de archivo
especificada.
El estatuto CLOSE también es una adición al Pascal estándar y,
como se mencionó anteriormente, asegura que el proceso de salida
se termine correctamente.
El no CERRAR una variable de archivo puede hacer que se pierdan
datos.
Manejo de la Impresora.
Para manejar el problema de control de Hojas cuando se tiene que
imprimir, se cuenta con las siguientes soluciones. La primera y
la más simple, sería imprimir el restante al principio del
programa, indicandole al usuario que oprima la tecla 'return'
cuando la impresora ya este bien ajustada. Poniendo un READLN sin
argumentos después del WRITE, se p uede hacer que el programa se
detenga hasta que el usuario oprima la tecla. Se podría usar el
siguiente código :
WRITELN ( ' ***** Coloque la impresora al inicio de la nueva
página ***** ' ) ;
WRITE ( ' ***** Oprima RETURN cuando este listo para continuar
***** ' ) ;READLN;
Una solución conveniente a este problema nos la da el sistema de
codificación ASCII. El codigo especial FF o brinco de hoja (
form-feed ) con un valor de 12, hará que la impresora avance al
inicio de la siguiente página. Para u tilizarlo, se define una
constante con nombre y se utiliza en un WRITE o WRITELN como se
muestra a continuación :
CONST
Form_Fedd = 12 ;
*
WRITELN ( Printer, CHR(Form_Feed) ) ;
*
*
El comando de Turbo Pascal para este propósito es ASSIGN,
comando que ya hemos utilizado para accesar la impresora. La
forma general del comando es :
ASSIGN ( filevar, externalname) ; en donde filevar es el nombre
de la variable que estará asociada con el archivo o dispositivo
en el programa Pascal, y externalname puede ser una literal
constante, una constante con nombre o una variable string. C omo
ejemplo de una asignación tipica de archivo, considere el
siguiente estatuto :
ASSIGN ( Payroll_File, ' A:PAYROLL.DAT ' ) ;
Una vez que se ha asignado un archivo en Pascal, se deberá
especificar que se desea hacer con éste. Para permitir al
programa leer información de un archivo, el Pascal estándar
requiere que se ejecute el comando RESET, el cuál coloca el
archivo en su punto de inicio y prepara al programa para la
entrada. Similarmente si se desea escribir datos en el archivo,
debera ejecutarse el comando REWRITE.
Los formatos para estos dos comandos son :
RESET ( filename ) ;
y REWRITE ( filename ) ;
Cuando un prograa ha terminado de procesar un archivo,
especialmente uno que se está escribiendo, Turbo Pascal requiere
que se ejecute el comando especial CLOSE, el cuál le dice a la
computadora que el archivo no se necesita más. Existe una
facilidad más en Pascal para trabajar con archivos, la cuál
examinaremos antes de sumergirnos en los detalles del desarrollo
de un programa. Esta es la función EOF, o fin de archivo, la
cuál se utiliza para obtener información respecto al archivo de
entrada. La forma de la función EOF es :
EOF ( filename ) ;
EOF es una función BOLEANA cuyo valor sera TRUE cuando el
archivo especificado ya no tenga información y sera FALSE cuando
todavía haya datos en el archivo.
La función EOF generalmente se utiliza junto con estructuras de
control, y por ahora, tendrá su aplicación con la instruccion
WHILE, como se muestra en la siguiente rutina :
ASSIGN ( Archivo_Int, Archivo_Ext ) ;
RESET ( Archivo_int ) ;
WHILE NOT EOF ( Archivo_Int ) DO
BEGIN
READ ( Archivo_Int, Variables de Trabajo ) ;
Procesa la Informacion del Archivo
END;
CLOSE ( Archivo_Int ) ;
Pascal proporciona seis operaciones implicitas para crear las
expresiones aritméticas. Estas expresiones pueden, a su vez, ser
asignadas a una variable, utilizadas en una comparación, o ser
desplegadas por el programa. Los operadores aritm&e
acute;ticos de Pascal se resumen en la siguente Tabla :
Operador Significado Ejemplo + Suma 3 + 5 ---------> resultado 8 - Resta 5 - 3 ---------> resultado 2 * Multiplicación 3 * 7 ---------> resultado 21 / División 6 / 4 ---------> resultado 1.5 DIV Cociente entero 6 DIV 4 -----> resultado 1 MOD Residuo entero 6 MOD 4 ---> resultado 2
Funciones Implicitas
Pascal utiliza el concepto de función para proporcionar
facilidades computacionales mas allá del juego de operadores
aritméticos. Pascal incluye un juego de funciones implicitas
para llevar a cabo cierta variedad de tareas diferentes. Para
accesar estas funciones, el programador necesita solamente
utilizar sus nombres en el programa. Además, es posible que el
programador defina funciones específicas a las necesidades del
problema. Estas funciones se declaran al principio del programa,
inmediatamente después del bloque VAR.
La tabla resume las funciones aritmeticas estándares :
Nombre Tipo de Argumento Tipo de Resultado Significado ABS INTEGER INTEGER Valor Absoluto ABS REAL REAL Valor Absoluto SQR INTEGER INTEGER Cuadrado SQR REAL REAL Cuadrado SQRT *REAL REAL Raiz Cuadrada SIN **REAL REAL Seno Log. COS **REAL REAL Coseno Log. EXP *REAL REAL e a la potencia LN *REAL REAL Logaritmo Nat. ARCTAN *REAL REAL Tangente Inversas
* Se pueden utilizar
valores INTEGER; serán convertidos a REAL
** Los argumentos son ángulos en radianes. Nuevamente, los
INTEGER serán convertidos a REAL.
*** Resultados en radianes.
Pascal proporciona tres predicados, o funciones BOLEANAS, cuatro
de transferencia, o funciones de tipo de conversión y dos
funciones ordinales.
Nombre Tipo Argumento Tipo Resultado Significado ODD INTEGER BOOLEAN TRUE si el argumento es impar EOF File BOOLEAN TRUE si es fin de archivo EOLN File BOOLEAN TRUE si es fin de línea TRUNC REAL INTEGER Convierte a entero truncado ROUND REAL INTEGER Convierte a entero redondeado ORD CHAR INTEGER Convierte de caracter a código CHR INTEGER CHAR Convierte de código de caracter a caracter PRED Ordinal Ordinal Resta 1 del argumento SUCC Ordinal Ordinal Anade 1 al argumento
Como se mencionó, los
ordinales incluyen cualquier tipo de dato que pueda ser mapeado
al conjunto { 0,1,2,....,N } para alguna N. Las funciones PRED y
SUCC se utilizan principalmente con los tipos no ENTEROS como el
CHAR. Por ejemplo en una computa dora que utilice el sistema de
codificación ASCII, SUCC( 'A' ) es 'B' y PRED( 'Z' ) es 'Y'.
Expresión de Fórmulas Complejas
En Pascal, puede formar casi cualquier expresión deseada a
partir del conjunto básco de operaciones y funciones
aritmeticas. En general, si se desea expresar una fórmula en
Pascal, se puede efectuar utilizando la siguiente guía :
1. Reemplace todos los productos implícitos con el operador de
multiplicación explícito. Por ejemplo, reemplace la forma
algebráica 3A con la forma en Pascal 3 * A. Además, cualquier
operador algebráico de multipl icación explícito (x) puede
también reemplazarse con el símbolo *.
2. Coloque entre paréntesis cualquier numerador, denominador y
exponente de multitérminos. Además, mantenga cualquier
paréntesis que ya se encuentre presente en la expresión.
3. Reemplace los componentes fraccionales con la forma A / B.
4. Reemplace los radicales con la función SQRT.
5. Reemplace mientras sea posible, los exponentes con su
equivalente funcional, como el SQR, o con una función que
involucre el LN o el EXP.
Por ejemplo, A elevado a la potencia B puede expresarse como EXP
( B * LN (A) ), esta es validá para valores positivos de A.
Fórmula Algebraica Equivalente en Pascal
3x + 2y ( 3 * x + 2 * y ) / 7
-----------
7
El Concepto de
Precedencia Las reglas de precedencia controlan el orden en el
cuál se evalan las expresiones aritméticas. El resultado neto
de estas reglas, es que una expresión algebráica se evaluá
como si la computador a buscará en la expresión, de izquierda a
derecha, hasta cinco veces distintas. La tabla siguiente indica
que se considera en cada búsqueda.
No. de Búsqueda Componentes Evaluados 1 Subexpresiones entre paréntesis 2 Llamadas a funciones 3 Operadores aditivos unarios (un solo operando) + y - 4 Operadores multiplicativos * , /, MOD, y DIV 5 Operadores aditivos binarios (dos-operandos) + y -
Utilizacion de
Expresiones Aritméticas
La forma adecuada para la operación de asignación en Pascal es
:
variable := expresión ;
El simbolo := significa "Asignese el valor que esta después
del signo a la variable que esta antes del signo ".
Cuentas y Sumas
Un ejemplo de asignación muy común usado en Pascal es el
siguiente :
Count := Count + 1
Se ejemplifica el uso de la asignación anterior en una sección
de programa en Pascal.
Count := 0
WHILE NOT EOF(Archivo) DO
BEGIN
READLN (Archivo, Stuff, Such) ;
WRITELN (Stuff, Null:5, Such) ;
Count := Count + 1
END;
WRITELN;
WRITELN ( 'Se procesaron ',Count,'registros' ) ;
Como se puede ver, este
pequeno segmento de programa incluye un ciclo que lee
repetidamente datos en un archivo de entrada hasta que no haya
más valores en el mismo.
Debido a la colocación de la instrucción Count := Count + 1 y
la inicialización de Count a cero al principio del programa, la
variable Count es igual al número de líneas leídas del archivo
al terminar el ciclo WHILE.
Instrucciones de uso
general en Pascal
El estatuto IF La estructura de control mas
simple es el estatuto IF, el cuál se utiliza en la mayoría de
los lenguajes de programación para seleccionar entre dos o más
cursos de acción posibles. El estatuto IF tiene dos formas
b&aacut e;sicas en Pascal, la primera de las cuáles es .
IF exp THEN
accion
En la expresión
anterior exp representa una expresión BOOLEAN, y acción puede
ser tanto una sola instrucción como un bloque de instrucciones
delimitado por BEGIN y END. Un ejemplo seria :
IF Clave = 3 THEN
Precio := 1.05 * Costo
Cuando se utliza un
bloque delimitado por BEGIN y END sería :
IF Clave = 3 THEN
BEGIN
X1 := ( -B + SQRT( Disc ) ) / ( 2 * A ) ;
X2 := ( -B + SQRT( Disc ) ) / ( 2 * A ) ;
END;
LA FORMA IF .. THEN
.. ELSE
Al utilizar el estatuto IF, se esta trabajando con situaciones en
las cuáles una secuencia particular de instrucciones será o no
ejecutada por la computadora. A menudo lo que realmente ocurre es
que se deberá contender con situaciones en las cuáles se tenga
que seleccionar entre dos posibles cursos de acciones. El formato
es el siguiente :
IF exp THEN
acción 1
ELSE
acción 2
En est aversión del IF, exp es nuevamente una expresión BOOLEAN. Acción1 representa un juego de instrucciones que deberán ejecutarse cuando exp sea TRUE, mientras que acción2 es un conjunto de instrucciones que deber&aac ute;n ejecutarse cuando exp sea FALSE.
Instrucciones
Anidadas IF .. THEN .. ELSE
Como ejemplo para aplicar esta opción manejamos la rutina para
la solución de una ecuación cuadratica.
Disc := SQR (B) - 4 * A * C
IF ( Disc > 0 ) THEN
BEGIN
X1 := ( -B + SQRT ( Disc ) / ( 2 * A );
X2 := ( -B + SQRT ( Disc ) / ( 2 * A );
WRITE ( 'La ecuación tiene dos soluciones. Estas son ' ) ;
WRITELN ( X1:9:4, 'y' , X2:9:4 )
END;
IF ( Disc = 0 ) THEN
BEGIN
X1 ;= -B / ( 2 * A ) ;
WRITE ( 'La ecuación tiene una solución. Esta es ' ) ;
WRITELN ( X1:9:4 );
END;
IF ( Disc <0 ) THEN WRITELN ( 'La ecuación no tiene soluciones reales ' ) ;
Este ejemplo es la manera normal de traducirlo a pascal enseguida lo volveremos a escribir pero utilizando la opción de ciclos anidados.
Disc := SQR (B) - 4 * A * C
IF ( Disc > 0 ) THEN
BEGIN
X1 := ( -B + SQRT ( Disc ) / ( 2 * A );
X2 := ( -B + SQRT ( Disc ) / ( 2 * A );
WRITE ( 'La ecuación tiene dos soluciones. Estas son ' ) ;
WRITELN ( X1:9:4, 'y' , X2:9:4 )
END
ELSE IF ( Disc = 0 ) THEN
BEGIN
X1 ;= -B / ( 2 * A ) ;
WRITE ( 'La ecuación tiene una solución. Esta es ' ) ;
WRITELN ( X1:9:4 );
END
ELSE
WRITELN ( 'La ecuación no tiene soluciones reales ' ) ;
Esta forma se conoce como IF anidado. En su lugar el IF anidado es una herramienta de control; sin embargo, sise usa sin cuidado, puede crear problemas significativos.
El estatuto CASE
Pascal incle una instruccion útil para este tipo de situaciones,
llamada estatuto CASE. El formato de este estatuto es el
siguiente :
CASE selector OF
valuelist1 : action1 ;
valuelist2 : action2 ;
.
valuelistN : actionN ;
END ;
Selector es una expresión ordinal, mientras que valuelists son listas de valores que puede tomar selector. Cada valor puede aparecer en un solo valuelist, y cada valor que sea razonablemente tomando por el selector debera estar representado en una de las valuelists. En seguida se muestra un ejemplo utilizando IF's anidados y despues la variante con el estatuto CASE. Se usa una variable Month que contiene un valor entre 1 y 12, correspondiendo a cada uno de los meses del ano, seria posible determinar el número de días en un mes particular :
IF ( Month = 2 ) THEN
Num_Days := 28
ELSE IF ( ( Month = 4 ) OR ( Month = 6 ) OR ( Month = 9 ) OR ( Month = 11 ) ) THEN
Num_Days := 30
ELSE
Num_Days := 31;
Aunque el código se simplificó haciendo que los valores más comunes fueran manejados por la segunda clásula ELSE, éste es todavía un constructo complejo y podría fácilmente contener errores. Enseguida se muestra la opción con el estatuto CASE para ver su diferencia .
CASE Month OF
1, 3, 5, 7, 8, 10, 12 : Num_Days := 31;
2 : Num_Days := 28;
4, 6, 9, 11 : Num_Days := 30;
END;
ESTRUCTURAS DE CONTROL Y REPETICION El ciclo WHILE La instrucción WHILE hace que un estatuto en Pascal se repita mientras cierta condición sea TRUE. A la instrucción WHILE a menudo se le conoce como una instrucción de ciclo de preprueba, ya que la condició n que controla la repetición deberá ser inicialmente TRUE, o de lo contrario el estatuto en el ciclo WHILE será ignorado completamente.
WHILE NOT EOF (In_File) DO
BEGIN
{ Instrucciones a ejecutar }
END;
Cualquier instrucción BOOLEANA puede ser integrada a la instrucción como una sola o un conjunto de ellas.
WHILE (Sentinel_Field <> Sentinel_Value) DO
BEGIN
{ Instrucciones a ejecutar }
END;
El ciclo REPEAT Al igual que WHILE, REPEAT hace que se repita una instrucción o una serie de instrucciones. Aunque es posible arreglarselas con una sola de estas estructuras de control, existen dos diferencias entre la instrucción WHILE y REPEAT. Primero , REPEAT es una estructura de control de prueba que siempre ejecuta las instrucciones de ciclo cuando menos una vez. Segundo, al tuilizar REPEAT, la condición BOOLEANA qe controla la repetición se expresa en la forma "haz esto hasta que esta condición sea VERDADERA "en lugar de "haz esto mientras que esta condición sea VERDADERA" como en el caso del WHILE. La forma general de la instrucción REPEAT es :
REPEAT
acción
UNTIL Expresión
Con esta instrucción , la acción no necesita estar encerada por un BEGIN..END, ya que la cláusula UNTIL le dice a la computadora en dónde términa el rango de instrucciones controlado por la estructura. El ciclo FOR Debido a la frecuencia de este tipo de aplicación, Pascal, como muchos otros lenguajes de programación, tiene una estructura de control especial para implementar ciclos contados. La forma general de esta instrucción FOR es como sigue :
FOR ordvar := startvalue TO endvalue DO
acción ;
y
FOR ordvar := startvalue DOWNTO endvalue DO
acción ;
Ordvar es una variable con un tipo ordinal, mientras startvalue y endvalue son expresiones del mismo tipo ordinal, Muy comúnmente, los ciclos FOR utilizan enteros. La instrucción FOR es una estructura del ciclo de preprueba, similar a la ins trucción WHILE. Ordvar se inicializa automáticamente a startvalue; si su valor es mayor que endvalue al utilizar TO, o menor que endvalue al utilizar DOWNTO, entonces las instrucciones en acción son descartadas. De lo contrario, la computadora ejecutará las in strucciones en Acción, incrementando o decrementando el valor de ordvar, dependiendo de si se especifico TO o DOWNTO, y nuevamente prueba si endvalue a ha sido pasado. Las instrucciones en acción continúan de esta manera, siendo ordva r modificado al final de cada repetición, hasta que endvalue finalmente se pasa tanto en la dirección hacia adelante como hacia atrás.
Datos Estructurados
(Arreglos Simples )
Una Estructura de Datos es una colección de valores de datos con
operaciones para manipular dichos valores.
Un Arreglo es una variable simple capaz de mantener
simultaneamente varios valores diferentes del mismo tipo. A fin
de mantener un control de todos los valores asociados con un
arreglo, la computadora asigna cierto número de celdas distintas
a un a rreglo. Estas celdas individuales se asignan luego a un
indicador único de posición llamado subíndice.
En Pascal los arreglos pueden definirse con subíndices de
cualquier tipo ordinal, incluyendo INTEGER, CHAR y BOOLEAN.
Dentro de los números enteros deben ser consecutivos, también
para los tipo caracter.
Para el tipo númerico pueden ser del 1 al 10, dentro del tipo
caractér es de 'A' a la 'Z'. Por ejemplo, si un arreglo llamado
Exams, con suníndices del 1 al 10 contiene las calificaciones
que un alumno obtuvo en diez exámenes , entonces el conjunto
completo de calificaciones pueden ser referenciando como Exams,
pero las calificaciones individuales se refieren como Exams[1] ,
Exams[2] , Exams[3] , y así sucesivamente.
Supóngase que fuera necesario calcular el promedio que un alumno
obtuvo en los diez exámenes cuyas calificaciones están
almacenadas en el arreglo. Esto puede llevarse a cabo de la
siguiente manera :
Avg := ( Exams[1] + Exams[2] + Exams[3] + Exams[4] + Exams[5] +
Exams[6] + Exams[6] + Exams[7] + Exams[8] + Exams[9] + Exams[10]
) /5
Otra manera más fácil
de calcular el promedio para evitar el uso escribir las diez
posiciones del arreglo seria utilizando un ciclo anidado como el
FOR.
Sum := 0 ;
FOR I := 1 To 10 DO
Sum := Sum + Exams [ I ] ;
Avg := Sum / 10
Definición de un Arreglo en Pascal.
La forma general del tipo de especificación para un arreglo es :
TYPE
nombre = ARRAY [ subíndice menor ..... subíndice mayor ] OF tipo de elemento ;
Lo siguiente ilustra una
variedad de declaraciónes TYPE de arreglos :
TYPE
Exam_Array = ARRAY [ 1 . . 10 ] OF INTEGER ;
Tax_Array = ARRAY [ 1985 . . 1995 ] OF REAL ;
Fahrenheit_Array = ARRAY [ -40 . . . 100 ] OF INTEGER ;
Encoding_Table = ARRAY [ 'A' . . . 'Z' ] OF CHAR ;
Búsqueda directa en Tablas Se utiliza un conjunto de valores predeterminados, dentro de un arreglo unidimensional. Como ejemplo se utiliza el siguiente problema en el cuál se utiliza un arreglo simple de 12 posiciones cada una representando a los meses del año. En el cuál se captura un valor entre 1 y 12 para desplegar el nombre que esta contenid o en el arreglo.
PROGRAM Month_Names ( INPUT, OUTPUT ) ; TYPE Month_String = STRING [ 9 ] ; Month_Table = ARRAY [ 1. . 12 ] OF Month_String ; PROCEDURE Load_Table ( VAR Months : Month_Table ) ; BEGIN Months [ 1 ] : = ' Enero' ; Months [ 2 ] : = ' Febrero' ; Months [ 3 ] : = 'Marzo' ; Months [ 4 ] : = 'Abril ' ; Months [ 5 ] : = 'Mayo' ; Months [ 6 ] : = 'Junio' ; Months [ 7 ] : = 'Julio' ; Months [ 8 ] : = 'Agosto' ; Months [ 9 ] : = 'Septiembre' ; Months [ 10 ] : = 'Octubre' ; Months [ 11 ] : = 'Noviembre' ; Months [ 12 ] : = 'Diciembre' ; END ; BEGIN Load_Table ( Months ) ; WRITE ( ' Digite un valor entre 1 y 12 ' ) ; READLN ( Month_Num ) ; IF ( ( Month_Num > 0 ) AND ( Month_Num <12 ) ) THEN WRITELN ( ' El Mes Número ' , Month_Num, ' Es ', Months [ Month_Num ] ) ELSE WRITELN ( ' Debe seguir las instrucciones con más cuidado !!!!! ' ) END.Este ejemplo particular ilustra una técnica conocida como búsqueda directa.
Búsqueda Secuencial
en un Arreglo Para este ejemplo utilizamos dos
arreglos :
El número de licencia : License_Num [ 1. . . Max_Licenses ]
Los Propietarios de los vehiculos : Owners [ 1 . . . Max_Licenses
]
PROCEDURE Find_Owner ( VAR License_Nums : License_Array ;
VAR Owners : Owner_Array ;
Num_Licenses : INTEGER ;
Key_License : License_String ;
VAR Lic_Owner : Name_String ;
VAR Success : BOOLEAN ) ;
VAR
I : = INTEGER ;
BEGIN
I : = 1 ;
Success : = FALSE ;
Lic_Owner : = ' ' ;
WHILE ( ( I <= Num_Licenses ) AND ( NOT Success ) ) DO IF ( License_Nums [ I ]="Key_License" ) THEN BEGIN Lic_Owner :="Owners" [ I ] ; Success :="TRUE" ; END ELSE I :="I" + 1 END;
Algoritmo de clasificación por selección para ordenar el arreglo X en ascendente. Se asume que X tiene el tipo genérico An_Array; se asume que los elementos de X tienen el tipo genérico An_Item.
PROCEDURE Selection_Sort ( VAR X : An_Array ; N : INTEGER ) ;
VAR
I, J, Min_Loc : INTEGER ;
Temp, Min : An_Item ;
BEGIN
{ Seleccionar el valor más pequeño N-1 veces }
FOR I : = 1 TO N - 1 DO
BEGIN
{ Encontrar el valor más pequeño en X [ I. . N ] }
Min : = X [ I ] ;
Min_Loc : = I ;
FOR J : = I + 1 TO N DO
IF ( X [ J ]
Datos Estructurados ( Registos, Conjuntos y Otros Tipos )
El Subrango.
Probablemente el tipo más simple definido por el programador en Pascal estándar sea el subrango. Se utiliza para restringir los valores que puede tomar una variable en particular a un subconjunto de tipos ordinales.Por ejemplo , en algunas a
plicaciones, solo permiten enteros positivos, mientras que en otros, solo se aceptan mayúsculas.
Los tipos de subrango se declaran como sigue :
TYPE
Positive_Integer = 1 . . MAXINT ;
Upper_Case_Letter = 'A' . . ' Z ' ;
Como en los arreglos, es posible declarar subrangos directamente en el bloque VAR :
VAR
In_Letter : ' A ' . . ' Z ' ;
El tipo Escalar Utilizando este tipo , el programador puede definir explícitamente valores que pueden ser tomados por un campo de tipo particular. La forma de declaración escalar es :
TYPE
scalar_type = ( value1, value2, . . . . , valueN ) ;
El tipo escalar BOOLEAN está predefinido como :
TYPE
BOOLEAN = ( FALSE, TRUE ) ;
Las siguientes son declaraciones escalares típicas :
TYPE
Day = ( Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday ) ;
Weekday = ( Monday. . Friday ) ;
Search_Status = ( Item_Found, Item_Missing, Still_Looking ) ;
El registro El registro es una estructura de datos extremadamente útil, similar en concepto al arreglo. Como el arreglo, un registro es una variable que en cualquier momento puede contener un cierto número de valores distintos. Sin embargo, a diferencia del arreglo, un registro puede contener campos individuales de diferentes tipos. Por ejemplo, un r egistro puede contener un STRING, dos REALes, un BOOLEAN y tres INTEGERS. El formato de declaracón de un registro es como sigue :
TYPE
Rec_Type_Name = RECORD
Field11, .... , Field1N : Type1 ;
Field21, .... , Field2N : Type2 :
FieldM1, ... , FieldMN : TypeM ;
END ;
Como ejemplo de registro, supóngase que se requiere almacenar el número del seguro social, el nombre y la tasa de pago por hora para un empleado como un registro simple.
TYPE
SSN_String = STRING [ 9 ] ;
Name_String = STRING [ 20 ] ;
Employee_Rec = RECORD
Social_Security_Num : SSN_String ;
Name: Name_String ;
Hourly_Rate: REAL
END ;