PASCAL (DEAD MACHINE)

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.

Reglas de Pascal para asignar nombres definidos por el programador


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.

TIPOS ESTANDARES DE DATOS EN TURBO-PASCAL


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 ;

SALIDAS EN PASCAL


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 (, exp1, exp2, ....)
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.
SALIDA INTEGER
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 y ver el efecto que producen al desplegar el resultado :



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

ENTRADAS EN PASCAL


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(, var1, var2,.....) ;
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 INTEGER Buscará hasta encontrar un caracter diferente de espacio, fin de linea o tabulador. El primer símbolo encontrado que no sea blanco deberá ser un signo de más o de menos, o un dígito preferentemente se requieren que los valores númericos de entrada terminan con simbolo de blanco. Se considera una condición de error si se encuentra cualquier caracter diferente de digito durante el proceso.
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.

ACCESO DE LA IMPRESORA DSDE PASCAL


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) ) ;
*
*

LECTURA Y ESCRITURA DE DATOS EN PASCAL


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 ) ;

OPERACIONES ARITMETICAS Y FUNCIONES


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 ;
1