Pascal

Introducción

El Laboratorio de Elementos de Computación tiene por objetivo que el estudiante aprenda a programar la computadora, con miras a emplear este conocimiento en aplicaciones de ingeniería. El lenguaje enseñado para estos propósitos es el Pascal.

Tres conceptos fundamentales

Antes de ver en mayor detalle el lenguaje de programación Pascal, es bueno que el estudiante tenga claro lo que son las constantes, las variables y los identificadores. Para eso debe tener una noción (por vaga que sea) de programa. Un programa no es más que una serie de líneas de texto, cada una de las cuales contiene alguna definición sobre la información a ser usada en el programa o bien alguna instrucción que se desea que la computadora ejecute. A continuación las definiciones de los conceptos enumerados:

 

Pascal

Es un lenguaje de alto nivel desarrollado en Alemania a finales de la década de los 70s por Niklaus Wirth. La idea fue crear un lenguaje que permitiese la enseñanza y el aprendizaje de la programación. A tal fin, la sintaxis del Pascal es muy similar a la del idioma inglés y los programas son fáciles de leer e interpretar. Además, Pascal no toma en consideración el hecho que las letras estén en mayúsculas o minúsculas. En el Laboratorio de Informática se emplea el compilador de Pascal de Borland, que ofrece muchas facilidades para el aprendizaje, como el realzado de sintaxis y la ubicación de los errores en la línea de código en que ocurren. Para uso en la casa, existen varios compiladores gratis en Internet; el autor recomienda BloodShed DevPascal, disponible en http://www.bloodshed.nu. Algunos detalles sobre su uso aparecen en http://www.intec.edu.do/~ceis/pascal/

Tipos de datos

Pascal es un lenguaje donde se debe especificar a la computadora qué datos va a contener una variable. Se recordará que una variable es un vaso o contenedor. Pues bien: un humano puede, a simple vista, distinguir entre una palabra como 'Hola' o un número como 47. Pero la computadora no puede hacer esto, así que se le debe decir qué tipo de datos se pondrá en cada variable. Una vez hecho esto, no puede almacenarse un valor de cualquier tipo en esa variable, sino de algunos tipos (Pascal permite ciertas conversiones de tipo). Para decirle a Pascal el tipo de una variable, se usa una de las siguientes palabras clave en el lugar indicado en el esqueleto del programa (ver más abajo):

Existen otros tipos de datos, pero no son necesarios para completar el programa del Laboratorio.

 

Esqueleto de un programa en Pascal

Todos los programas de Pascal comparten ciertas características comunes, algunas de las cuales son opcionales. Esto se llama esqueleto del programa y se muestra a continuación.

Program <identificador>;
Uses WinCrt;
Const {constantes}
<identificador> = <valor>;
Var {variables}
<identificador> : <tipo>;
Begin {instrucciones}
. . .
End.

En este esqueleto, como en todas estas guías, lo que se ponga entre signos de mayor y menor (<>) indicarán elementos que deben reemplazarse en un programa real.

La línea Program es opcional y sirve para ponerle un nombre al programa; de esta manera, se tiene una idea de lo que hace el mismo.

La línea que dice 'Uses WinCrt' es una forma de que Pascal active la capacidad de leer desde el teclado y de escribir hacia la pantalla; en Windows, se hace esto sobre una pequeña ventana blanca, y en DOS sobre la pantalla completa (se debe escribir 'Uses Crt' en compiladores de DOS).

Las secciones llamadas Const y Var son para declarar las constantes y las variables, respectivamente. Son opcionales e intercambiables. Se pone un identificador que será el nombre con el que tanto Pascal como el programador conocerán la constante o variable. Nótese que a una constante no se le especifica el tipo, sólo el valor. De igual manera, a una variable no se le puede dar un valor en este momento; Pascal le asigna un valor por defecto, y más adelante se verá cómo dar valor a una variable.

La sección entre las palabras Begin y End es la parte principal del programa y es aquí donde van las instrucciones del programa. Estas palabras fungen como paréntesis, de manera que se requieren estas dos pero además pueden ponerse más dentro de éstas, siempre poniendo primero el Begin y luego el End y de manera que, por ahora, en un programa correctamente escrito, haya tantos Begins como Ends. El último End debe terminar con un punto, para que Pascal sepa que el programa ha terminado.

Nótese que al final de varias líneas del esqueleto aparece un punto y coma. En general, todas las líneas de código Pascal terminan en punto y coma, a menos que terminen en una palabra reservada (no obstante, las líneas que terminan en un End que no sea el último del programa deben llevar punto y coma). Las excepciones se irán viendo sobre la marcha.

Una última observación: las palabras entre llaves ({}) son comentarios, y Pascal las ignora por completo. Son una forma valiosa de incluir información para los humanos dentro del código para la computadora.

 

Sentencias WRITE y WRITELN

Ahora se está en capacidad de estudiar un pequeño programa de Pascal y ver cómo trabaja. Se verá un programa para calcular el área de un círculo dado el radio, siempre que éste sea entero.

Program AreaCirculo;
Uses WinCrt;
Const
pi = 3.1415927; {Declaración de constante}
Var
area: Real; {Area del círculo}
radio: Integer; {Radio a teclear}
Begin
Write('Radio: ');
ReadLn(radio);
area := pi * radio * radio;
WriteLn('Area: ', area);
End.

Se exhorta al lector a que compare este programa con el esqueleto y note las similitudes y las diferencias. Asimismo, es conveniente probar este programa en algún compilador de Pascal antes de seguir leyendo.

La variable 'area' almacenará el área del círculo una vez calculada. Debe ser real, porque el área de un círculo siempre tendrá cifras decimales (recuérdese que pi es un número irracional). El radio se declara Integer porque se dijo que sólo se usarán radios enteros.

La finalidad de la sentencia Write (línea 9 del programa) es enviar información a la pantalla. Tiene la siguiente forma general:

Write(<variable o cadena>, ...);

Es decir, se puede poner entre los paréntesis el nombre (identificador) de una variable, o una cadena, que es una sucesión de símbolos que Pascal no interpreta como comandos, sino que manda a la pantalla directamente y por tanto no tiene reglas, sólo que debe empezar y terminar con comillas simples (' '). Los puntos suspensivos indican que pueden ponerse varios argumentos, separados con coma.

La sentencia WriteLn (línea 12) es la misma, excepto que si se vuelve a ejecutar un Write o un WriteLn después de ella, la información se escribe en la línea debajo de la cual se escribió la información del primer WriteLn.

Una última nota: la escritura de una variable real se produce por defecto en notación científica. Para obviar esto, pueden agregarse al final del nombre de la variable dentro del Write/WriteLn dos números separados por dos puntos. El primero dice cuántos espacios en blanco insertar delante del número, y el segundo cuántas cifras decimales imprimir:

WriteLn('Area: ', area:0:2);

 

Sentencia READLN

La sentencia ReadLn (línea 10) es para darle un valor a una variable. Hay dos formas de hacer esto; esta es una de ellas. El valor se toma de lo que el usuario teclee, esto es, se hace una pausa en el programa, el usuario teclea un valor y presiona ENTER y ese valor se guarda en la variable si el tipo es correcto (números o letras). La forma general del ReadLn es

ReadLn(<variable-1>, <variable-2>, ...<variable-n>);

Es decir, se pueden leer varias variables con una misma sentencia. Sin embargo, esto no se recomienda, sino que es mejor poner por cada variable un Write que describa el valor que se pide y luego un ReadLn. NO SE PUEDEN 'LEER' CADENAS, NI CONSTANTES, NI NADA QUE NO ESTE DECLARADO COMO VARIABLE.

Operador de asignación

Obsérvese la combinación de símbolos := en la línea 11 del programa AreaCirculo. Es un operador de asignación y sirve, al igual que el ReadLn, para darle valor a una variable. A diferencia del ReadLn, sin embargo, el valor que se da a la variable no se lee del teclado, sino que se toma de una constante, de otra variable, o de una expresión aritmética (situadas a la derecha del operador de asignación) y se copia hacia la variable cuyo nombre está a la izquierda. SOLO EL NOMBRE DE UNA VARIABLE, Y DE SOLO UNA, PUEDE APARECER A LA IZQUIERDA DE UN OPERADOR DE ASIGNACION

 

Operadores aritméticos

Como se ha dicho, la finalidad del curso es aprender a programar para resolver problemas matemáticos. Para ello, es necesario conocer la forma en que Pascal reconoce las expresiones aritméticas. Están definidos los siguientes operadores y funciones:

OPERADOR

DESCRIPCION

+

Suma o concatenación

-

Resta

*

Multiplicación

/

División (reales)

Div

División (enteros)

Mod

Módulo o residuo (enteros)

Sqr

Elevar al cuadrado

Sqrt

Raíz cuadrada

Ln

Logaritmo natural

Exp

Exponencial (e elevado a un número)

Sin

Seno

Cos

Coseno

ArcTan

Arcotangente

Los operadores y funciones están listados por orden de jerarquía. Hasta el Mod e incluyéndolo, son operadores, y a partir de él son funciones.

La barra de división, '/', produce un resultado real independientemente del tipo de sus operandos; es decir, 3/4 produce 0.75, que es real, pero 2/4 produce 2.0, también de manera real, así que el resultado de una división con la barra se debe asignar a una variable real.

Para obtener sólo la parte entera de una división, se usa el operador Div. Por ejemplo, 7 Div 3 da como resultado 2 (porque 7 cabe en 3 dos veces); este resultado se puede asignar a una variable entera. Claro que hay una pérdida de precisión en esta operación; puede obtenerse por separado el residuo de la división usando Mod, como en 7 Mod 3, que da por resultado 1. El uso más importante de Mod es para saber si un número dado es múltiplo de otro; en efecto, si A Mod B = 0, entonces A es múltiplo de B. Más adelante se verá cómo realizar decisiones en el programa.

Un detalle interesante es el poco soporte de Pascal a las funciones de potencia y radicación. La función Sqr eleva el argumento al cuadrado, y su tipo de retorno depende del tipo del argumento: si eleva un entero, el resultado es entero, y si eleva un real, el resultado es real. La función Sqrt, por otro lado, extrae la raíz cuadrada del argumento y siempre devuelve un número real.

Al igual que en las matemáticas, se puede alterar la jerarquía de los operadores y funciones mediante el uso de paréntesis. Sin embargo, a diferencia de la notación algebraica estándar, no se pueden usar llaves y corchetes.

 

Conversión de expresiones

Para calcular el valor de una función en Pascal puede ser necesario realizar ciertas conversiones. Como se trata de texto en una computadora, la expresión debe adaptarse a un formato lineal. Un ejemplo de esto se tiene al calcular el cociente (a + b) / (a - b); en una hoja de papel esto suele escribirse en dos líneas y obviando los paréntesis. De igual manera, la expresión 3x + 5 se convierte en 3 * x + 5 (nótese la inclusión del signo de multiplicar). Por lo demás, la conversión es un proceso directo que presenta pocas dificultades.

Sentencia IF

Hasta ahora, se ha visto que el flujo de un programa (la manera en que se ejecutan las instrucciones) es estrictamente lineal y de arriba hacia abajo. Sin embargo, en varias ocasiones es necesario alterar esto, sobre todo para validar reglas como el dominio de funciones matemáticas. Es el caso particular de las raíces cuadradas, por ejemplo, cuyo argumento debe ser no negativo; si se pasa un argumento negativo a Sqrt, el programa termina abruptamente con un error. Entonces, sería bueno tener un medio de evitar condicionalmente la ejecución de cierta(s) parte(s) del código.

La sentencia If de Pascal sirve exactamente para esto. Su forma general es:

donde <cond> es una condición que puede ser falsa o verdadera, y <bloque de sentencias> es una sola sentencia, o bien varias sentencias encerradas entre un Begin y un End.

La forma general de una condición es

<expr1><op-rel><expr2>

donde <expr> son expresiones y <op-rel> es uno de los siguientes operadores relacionales:

OPERADOR

DESCRIPCION

=

Igualdad

<>

Desigualdad

>

Mayor que

>=

Mayor o igual que

<

Menor que

<=

Menor o igual que

 

Entonces, el bloque de sentencias dependiente del If se ejecutará si y sólo si la condición evaluada es verdadera.

Volviendo a la segunda forma general del If, hay una parte opcional llamada Else. Como su nombre lo indica, ésta encierra una o más sentencias a ser ejecutadas sólo si la condición del If es falsa. Un detalle sumamente importante, que quizás sea la causa de más errores usando el If, es que SI SE VA A USAR EL ELSE, NO SE PONE PUNTO Y COMA AL FINAL DEL BLOQUE DEL IF. Esto requiere práctica y varios ejemplos para entenderlo:

{Ejemplo de If simple}
If a < 0 Then
WriteLn('No puede usarse Sqrt');

{Ejemplo de If con Else}
If a < 0 Then
WriteLn('No puede usarse Sqrt') {No punto y coma}
Else
a := Sqrt(a);

{Ejemplo de If compuesto}
If a < 0 Then Begin
WriteLn('No puede usarse Sqrt');
ReadLn(a);
End;

{Ejemplo de If compuesto con Else compuesto}
If a < 0 Then Begin
WriteLn('No puede usarse Sqrt');
ReadLn(a);
End {No punto y coma}
Else Begin
a := Sqrt(a);
WriteLn('Raiz: ', a);
End; {Este punto y coma cierra toda la sentencia}

Obviamente, no son estas todas las combinaciones posibles. Se recomienda probar un poco con un compilador. De paso, el error que dan los compiladores de Borland y BloodShed en este caso (y en muchos otros) es el mismo, a saber: "Error in statement".

Es bueno recalcar que el bloque del If se ejecuta sólo si la condición es verdadera, y que el bloque del Else se ejecuta sólo si la condición es falsa. Todo código debajo del If, si no pertenece a su bloque, se ejecuta incondicionalmente.

 

1