Manual de Pascal

  • Upload
    lui-gui

  • View
    52

  • Download
    1

Embed Size (px)

Citation preview

  • Programacin estructurada en Pascal

    ENTREGA NMERO 1

    MANUAL DE PROGRAMACIN BSICA

    LENGUAJE DE PROGRAMACINPASCAL

    Vladimir Rodrguez 1

  • Programacin estructurada en Pascal

    Vladimir Rodrguez 2

  • Programacin estructurada en Pascal

    PRIMERA PARTE

    Conceptos bsicos de programacin

    Vladimir Rodrguez 3

  • Programacin estructurada en Pascal

    Introduccin:

    Existe un gran nmero de personas que escriben a foros y blogs en la WEB en la bsqueda de distintos manuales o tutoriales que enseen a programar desde cero, o sea, que alguien que no sepa nada en absoluto sobre la programacin sea capas de aprender con solo leer. En efecto, eso es posible y es a lo que apunta este tutorial.

    Deben saber que la base para ser un buen programador es la prctica. Debern trabajar mucho y realizar muchos programas, por ms tontos e inservibles que parezcan, cada vez que aprendan un concepto nuevo. Encontrarn varios ejercicios en este tutorial que les ayudarn a solidificar lo que hayan aprendido hasta el momento.

    Quiero reafirmar la importancia de la prctica. Los lenguajes de programacin tienen reglas muy estructuradas sobre sintaxis y semntica as como tambin muchas palabras que uno debe ir aprendiendo y comprendiendo en profundidad. Tambin est el hecho de que uno debe desarrollar una forma de pensar y analizar los problemas demasiado lgica para lograr resolverlos creando programas de computadora.

    Aadir tambin que el gran conocimiento de matemtica facilitar mucho el desarrollo de software, pero sin embargo, si no se entienden demasiado con esta materia podrn aprender a programar, pero nunca olviden que la matemtica y la programacin estn profundamente ligadas.

    Una vez hayan ledo completamente este tutorial sern capaces de crear aplicaciones bsicas en el lenguaje Pascal, aunque estas podrn tener una gran complejidad. El objetivo de este texto no es que ustedes salgan programando software para vender ni nada por el estilo, es que aprendan a programar de la nada, es introducirlos al mundo de la programacin estructurada. Teniendo estos conocimientos en mente, ustedes sern capaces de aprender luego un lenguaje mucho ms moderno y complejo con mayor facilidad que si lo intentaran ahora, sin saber nada.

    Espero que les sea de mucha utilidad. Ante cualquier duda o aporte que tengan pueden escribirme a mi casilla de correo: [email protected] y les responder en breve. Desde ya muchas gracias por leer este tutorial.

    Vladimir Rodrguez 4

  • Programacin estructurada en Pascal

    Nociones sobre Lenguaje de Programacin:

    Supongo que cualquiera que se aventure a leer este manual es porque sabe lo que es usar una computadora y por ende, lo que es un programa de computadora, tambin conocido como aplicacin. Sin embargo estoy seguro de que a la mayora de las personas que saben lo que es un programa, si se les pidiera que le explicaran a alguien que jams ha visto una computadora, sin tener una enfrente, lo que es un programa no sabran como hacerlo. En realidad es muy sencillo de definir: Un programa es un conjunto de instrucciones bien detalladas que la computadora seguir al pie de la letra, nada ms. Un programador es quien escribe ese conjunto de instrucciones que sern interpretadas y seguidas por un procesador.

    Dicho as suena muy fcil. Uno escribe instrucciones que sern seguidas al pie de la letra por la computadora. Sin embargo este es el gran problema que hace que uno como programador tenga que romperse la cabeza pensando en como hacer que una computadora realice tal o cual accin y como tomar en cuenta todas las variantes que puede haber acerca de una misma situacin.

    Ahora bien, si uno como programador ha de escribir instrucciones, cmo lo hace?Es aqu donde entran en juego los lenguajes de programacin. Existen de dos tipos: Lenguajes de bajo nivel

    y Lenguajes de alto nivel. Los primeros se escriben en el vejo y querido cdigo binario el cual est constituido nicamente por 0 y 1 y es lo nico que un procesador (CPU) puede entender e interpretar. Tambin se conocen como lenguaje de mquina. Creo que todo el mundo est de acuerdo en que programar as es una tortura, es inhumano y sumamente tedioso y aburrido. Y pensar que en principio todo se haca as y muchas cosas an se hacen as.

    Gracias a la necesidad de poder crear aplicaciones de computadora de una forma ms fcil y entendible es que nacen los Lenguajes de Alto Nivel, que se parecen ms a los hablados por los seres humanos y por tanto son mucho ms comprensibles para nosotros. Sin embargo, como dije antes, una CPU solo entiende el lenguaje de mquina y por ende no uno de alto nivel. Aqu entra en juego un programa muy especial: el compilador. Un compilador es una aplicacin que se encarga de traducir ese cdigo de alto nivel parecido a un lenguaje humano a lenguaje de mquina para que pueda ser interpretado por una Unidad Central de Proceso (CPU). Y entonces como se programa un compilador? Como ven, a veces hay que seguir luchando con el cdigo binario.

    Lenguajes de alto nivel muy nombrados son: C, C++, C-sharp, Pascal, PHP, Java, HTML, Borland, Ruby, entre muchsimos otros ms.

    Dado que lo escrito en el lenguaje de alto nivel (cdigo fuente del programa) ser luego traducido por un compilador a 0 y 1, debe hacerse respetando una sintaxis y una semntica bien establecidas, sin excepciones. Nosotros especficamente en este manual aprenderemos las nociones bsicas de la programacin estructurada, cmo se estudia un problema dado y se comienza a crear el programa que lo resuelve, entre muchas otras cosas. Todo lo haremos con el lenguaje Pascal, que hoy en da solo es usado con fines acadmicos de aprendizaje, y debo decir que realmente funciona para ese fin.

    Vladimir Rodrguez 5

  • Programacin estructurada en Pascal

    Instalando el ambiente de desarrollo Free-Pascal:

    Para trabajar con Pascal utilizaremos el compilador Free-Pascal 2.2.2. Este programa debe ser descargado desde este enlace o desde la pgina oficial de Free Pascal: http://sourceforge.net/projects/freepascal/files/Win32/2.2.2/fpc-2.2.2.i386-win32.exe/download.

    Una vez descargado el instalador ejecutar el mismo y seguir los siguientes pasos:Nota: En las imgenes se observa la versin 2.0.2 y no la 2.2.2, sin embargo los pasos de instalacin son los

    mismos.

    Presionar en Next.

    Seleccionar un directorio de instalacin. Es recomendable aceptar el directorio que aparece por defecto (C:\FPC\2.x.x).

    Apretar el botn Next.

    En la siguiente ventana, se seleccionan los componentes del compilador que van a ser instalados. Se recomienda seleccionar Full Instalation. En caso de que dispongan de poco espacio en su disco duro, pueden seleccionar Minimal Instalation

    Apretar el botn Next

    Vladimir Rodrguez 6

  • Programacin estructurada en Pascal

    Next otra vez.

    Asociar todos los tipos de archivos que ofrece, sobre todo los que terminan con la extensin .pas y luego apretar el botn Next.

    Presionar en Install y esperar a que termine de instalar todos los archivos. Esto a veces puede tardar bastante a pesar de que el copilador pesa muy poco.

    Apretar el botn Next y luego en Finish.

    Si llegaron hasta aqu sin errores, el compilador qued instalado.

    Vladimir Rodrguez 7

  • Programacin estructurada en Pascal

    Verificando instalacin

    Ahora debemos verificar si el compilador qued correctamente instalado.

    Lo que haremos es ejecutar el compilador desde la lnea de comandos de la siguiente manera:

    El primer paso es reiniciar la computadora para que todas las modificaciones realizadas por el programa instalador tengan efecto. (Es posible que alcance con salir de la sesin y volver a entrar)

    Acceder al tem del men inicio; Inicio Ejecutar

    Escribir cmd sin comillas y apretar la tecla ENTER.

    En la consola escribir fpc y apretar la tecla ENTER, como en la figura:

    Si todo est bien debera salir un mensaje similar al siguiente:

    Para terminar presione enter varias veces hasta que termine de desplegar.

    Vladimir Rodrguez 8

  • Programacin estructurada en Pascal

    Si en lugar del mensaje anterior, aparece un mensaje que indica que el comando fpc no es vlido, significa que algo anduvo mal en la instalacin. Pueden probar a reiniciar la computadora y volver a realizar este paso de verificacin. Si siguen teniendo problemas, les recomiendo desinstalar el compilador y volver a comenzar de nuevo la instalacin.

    Si probaron reinstalar y sigue sin funcionar este paso de verificacin, ser necesario realizar alguna configuracin adicional, como les explico a continuacin:

    En primer termino, verifiquen la existencia de la carpeta C:\FPC\2.2.2\BIN\I386_WIN32. Pueden hacerlo utilizando el explorador de Windows, accediendo por Mi PC, luego Disco X: (donde X es la unidad de disco duro) y as sucesivamente. Tambin pueden verificarlo por el siguiente comando en la consola DOS:

    dir C:\FPC\2.2.2\BIN\I386_WIN32

    Si esa carpeta no existe, estamos en problemas. La instalacin no copi los archivos necesarios, quizs no tengan los permisos requeridos para la instalacin. Intenten volver a instalar.

    Si la carpeta existe, verifiquen que en la misma hay un archivo de nombre fpc.exe. Si este archivo existe, solamente hay que decirle al sistema donde puede encontrarlo (se supone que la instalacin lo hace automticamente, pero por alguna razn no funcion). Procedan de la siguiente manera:

    1. Accedan Mi Pc Panel de Control Sistema 2. Seleccionen la pestaa Avanzado 3. Accionen el botn Variables de entorno 4. En la lista superior pulsen nueva e ingresen estos valores: o nombre: path o valor: %path%;C:\FPC\2.2.2\BIN\I386_WIN32 5. Dar aceptar en todas las ventanas.

    Insisto que el paso anterior no debera ser necesario, ya que el instalador se encarga de realizarlo, sin embargo algunos usuarios han reportado ese problema.

    Por ms informacin ver: Installing under DOS or Windows en el sitio de Free Pascal.

    Corrigiendo un Bug y configurando para comenzar:

    Al intentar compilar por primera vez (ya veremos como se hace esto) el compilador indica un error illegal parameter -Opentium3.

    Este es un error que sorprende bastante ya que viene por defecto, pero bueno, es as. Por suerte es bien sencillo de solucionar.

    Al abrir por primera vez el ambiente de desarrollo IDE vallan al men

    OptionsCompiler

    En el cuadro de texto Aditional Compiler Args, cambiar -Opentium3 por -Oppentium3

    Vladimir Rodrguez 9

  • Programacin estructurada en Pascal

    Pulsar el botn OK

    Acceder al men: OptionsSave

    Luego cerrar y volver a abrir el IDE. Con esto queda solucionado. En caso de presentar problemas con esto envenme un e-mail a [email protected] y les responder en breve

    para ayudarles a solucionarlo.

    Configuracin de Range Checking e Integer Overflow:

    Hace falta aadir una ltima configuracin antes de comenzar a programar, y esta consta de hacer que el compilador siempre haga un chequeo de que nuestros valores no se van fuera del rango que deben tener. Esto lo entendern en ms profundidad cuando comencemos a trabajar con arreglos, pero es conveniente tenerlo configurado desde ahora para evitarse muchos problemas.

    Deben ir al men Options Compiler y all presionar sobre la pestaa Generate Code. En el cuadro Code generation marcarn las opciones Range checking e Integer overflow checking tras lo cual darn OK.

    Ahora s, ya estamos listos para comenzar a programar. Adelante!!!

    Vladimir Rodrguez 10

  • Programacin estructurada en Pascal

    NUESTRO PRIMER PROGRAMA: HOLA MUNDO!!!

    Al abrir el ambiente de desarrollo IDE vemos una pantalla azul, realmente espantosa, pero es a la que nos debemos acostumbrar si queremos aprender a programar de verdad. Existen compiladores ms bonitos, pero no son de licencia free y por tanto no los usaremos aqu.

    Por defecto, la primera vez que se abre el IDE lo hace con una hoja en blanco cuyo ttulo ser noname01.pas. El botn verde en la esquina superior izquierda de la pantalla es para cerrar el archivo actualmente abierto, luego veremos como trabajar con varios a la vez. La flechita verde en la esquina superior derecha es para maximizar y minimizar la ventana que contiene dicho archivo. En el borde derecho y tambin abajo tenemos barras de desplazamiento para movernos a travs del cdigo que escribiremos. Abajo, a la izquierda de la barra de desplazamiento vemos las coordenadas de nuestra posicin: fila:columna, o sea, dnde est nuestro cursor.

    Para cada ejemplo de programa escrito aqu analizaremos casi lnea por lnea lo que significa cada cosa para que se entienda. En principio uno se dedica a copiar programas hechos sin entender nada y poco a poco va aprendiendo hasta que se hace capaz de crear los propios. Ahora crearemos un programa muy simple que lo nico que har es imprimir en la pantalla el clsico texto Hola mundo!!!:

    1 PROGRAM HolaMundo;2 3 BEGIN4 write(Hola mundo!!!);5 END.

    Siempre la primera lnea de un programa debe comenzar con la palabra reservada PROGRAM (detallaremos lo que significa que una palabra sea reservada ms adelante) seguida por un nombre para el programa (identificador), en este caso HolaMundo. Luego de eso debe ir un punto y coma (;) para finalizar la primera lnea.

    Los puntos y comas funcionan como separadores y son los que indican que ha finalizado una sentencia (instruccin). Siempre luego de una instruccin va un punto y coma para finalizarla.

    En la segunda lnea no hemos escrito nada, esto es simplemente por una cuestin de legibilidad del cdigo.En la tercera lnea indicamos que comienza el cdigo del programa mediante la palabra reservada BEGIN.

    Esto no es una sentencia, por lo cual no debe finalizar con punto y coma, solo indica que a partir de all estarn las instrucciones a seguir.

    En la cuarta lnea indicamos al programa mediante el procedimiento write (que en ingls significa escribir) que imprima en la pantalla el texto Hola mundo!!! Siempre luego de un procedimiento write debe colocarse entre parntesis lo que queremos escribir en la pantalla, en este caso un texto especfico. Siempre que queramos que un texto aparezca en pantalla tal cual nosotros lo escribimos aqu debemos indicarlo colocando dicho texto entre comillas simples como se ve en el ejemplo. Como write implica una instruccin, luego de finalizada colocamos un punto y coma. Notar que dicha instruccin la hemos colocado ms hacia la derecha que el resto del cdigo. Esto no afecta en nada al programa, al igual que en la segunda lnea que qued vaca, sino que lo hace ms legible. A esta accin se la llama Indentacin y es muy importante. Luego detallaremos este aspecto al trabajar con programas complejos y que llevan un cdigo ms largo.

    La quinta y ltima lnea indica la finalizacin del programa mediante la palabra reservada END seguida inmediatamente por un punto (.). Esa es la nica palabra que terminar con un punto indicando el fin de la aplicacin.

    Ahora debemos compilar nuestro programa. Para ello pueden ir al men Compile Compile o presionar Alt+F9. Se les pedir un nombre para el archivo, el cual no podr contener espacios ni caracteres especiales y debe terminar con la extensin .pas. Luego de eso comenzar inmediatamente el proceso de compilacin. Si ustedes no han tenido errores de sintaxis, o sea, si han respetado el lugar adecuado para cada palabra reservada y no olvidaron ningn punto y coma o colocaron alguno donde no iba, aparecer un cartel con el mensaje Compile successful: Press any key.

    Esto habr creado un ejecutable (archivo de extensin exe, dicha extencin proviene de la palabra executable que en ingls significa ejecutable) en el mismo directorio en el que han guardado el archivo

    Vladimir Rodrguez 11

  • Programacin estructurada en Pascal

    .pas. Un archivo pas contiene el cdigo fuente que ustedes han escrito. Por defecto el IDE guarda un archivo en el directorio X:\fpc\2.2.2\bin\i386-win32, pero ustedes pueden especificar cualquier otro. Es conveniente que si hacen esto ninguna carpeta de su direccin posea ms de ocho caracteres como nombre ni tampoco caracteres especiales o de espacio.

    Ahora pueden abrir su archivo ejecutable haciendo doble clic sobre l. Tambin pueden ejecutar su programa mediante el men Run Run o presionando Ctrl+F9. En este ejemplo especfico, como en muchos otros que veremos, al correr su programa no llegarn ni a leer el texto que aparece ya que se cerrar inmediatamente. Esto no es ningn error, los programas que escribiremos finalizarn luego de terminar sus instrucciones. Claro que aprenderemos a crear aplicaciones donde uno puede seleccionar cuando salir.

    Si lo ejecutaron desde el IDE simplemente vallan al men Debug User screen o presionen Alt+F5. De este modo vern lo que apareci en la pantalla al ejecutar el programa. Luego presionen cualquier tecla para volver al IDE. La otra opcin es ejecutar su programa desde la lnea de comandos: Ir a Inicio Ejecutar y escriban cmd para abrir la lnea de comandos. En ella deben escribir la direccin en la que est el ejecutable que han creado y escribir el nombre exacto del mismo, que ser idntico al que ustedes usaron al guardar el archivo .pas de cdigo fuente. En mi ejemplo yo guard mi cdigo fuente con el nombre HolaMundo.pas con lo cual habr creado un ejecutable HolaMundo.exe.

    Para todo aquel que no lo sepa, al abrir la lnea de comandos aparece un directorio del sistema por defecto. Para cambiar de directorio en DOS se usa el comando cd (change directory) seguido de la direccin del nuevo directorio:

    Al presionar enter luego de escribir esa instruccin quedaremos posicionados en el directorio donde alojamos nuestro programa. Obviamente si nosotros creamos otro directorio para trabajar con nuestras aplicaciones pascal especificaremos la ruta de dicho directorio. Una vez estamos en el directorio correcto escribimos el nombre de nuestro programa y damos enter. Enseguida se ejecutar y podremos ver sus resultados:

    Del mismo modo podemos compilar nuestros programas desde la lnea de comandos. Nos posicionamos en el directorio donde radica nuestro cdigo fuente y escribimos la instruccin fpc HolaMundo.pas para este caso, de lo contrario la instruccin es fpc NombreDelArchivo.pas donde NombreDelArchivo ser el nombre con el cual guardamos nuestro cdigo fuente.

    Vladimir Rodrguez 12

  • Programacin estructurada en Pascal

    Write y Writeln:

    Ahora veremos un programa que imprimir dos frases de texto, una en una lnea y la otra debajo:

    1 PROGRAM SalidaEstandar;2 3 BEGIN4 writeLn(Hice mi primer programa en Pascal.);5 write(Logr el clsico Hola mundo.)6 END.

    Al igual que antes en la primera lnea escribimos PROGRAM seguido de un identificador para el programa, finalizando la lnea con un punto y coma.

    En la lnea 3 indicamos el inicio de las instrucciones. En la cuarta lnea utilizamos el procedimiento writeLn para imprimir un texto en pantalla. Este procedimiento funciona exactamente igual que write. La diferencia entre la una y la otra es que write imprime algo en pantalla y deja el cursor justo al final de esa lnea. De modo contrario, writeln imprime un texto y lo deja al inicio de la lnea siguiente. As, con el ejemplo anterior obtenemos como salida:

    Hice mi primer programa en Pascal.Logr el clsico Hola mundo.

    Noten que la ltima sentencia no finaliza con punto y coma. Esto es porque al final del programa cuando dictas la ltima instruccin no hace falta separarla de ninguna otra y es posible omitir el punto y coma, sin embargo no est mal si lo colocan.

    Como ya habrn notado, al ir escribiendo cdigo el IDE ir coloreando las palabras. Aquellas que son reservadas sern de color blanco (writeln y readln son reservadas pero no se colorean, lo mismo suceder con otras tantas), el texto que ser impreso tal cual, o sea, el que est entre comillas simples, se ve en celeste, lo dems se ve amarillo, y as suceder con otras cosas.

    Los procedimientos write y writeln imprimen informacin en pantalla, en lo que llamamos salida estndar, o sea, la salida de la lnea de comandos. Llamamos salida ya que es informacin entregada por el programa. Del mismo modo la llamaremos entrada estndar cuando sea usada para ingresar informacin al programa.

    Pascal no es un lenguaje que diferencie entre maysculas o minsculas en su cdigo fuente, por lo cual escribir writeln, WRITELN, WrItElN o como sea, es exactamente igual. Lo mismo sucede con los identificadores, si ustedes llaman a su programa SALIDAESTANDAR, salidaestandar, SaliDaesTandar o como sea, da exactamente lo mismo. Esto se aplica para las dems palabras reservadas. Noten que si en un texto que se imprimir en pantalla ustedes cambian las maysculas y las minsculas s se vern las diferencias.

    Vladimir Rodrguez 13

  • Programacin estructurada en Pascal

    Introduccin a las variables:

    Muy bien, hasta ahora vimos dos ejemplos de programas que ejecutan una o dos instrucciones para mostrar informacin en pantalla. Sin embargo, normalmente hace falta ingresar informacin a un programa para que con ella, este realice una o varias tareas. A continuacin veremos el ejemplo de un programa que pedir a un usuario que ingrese su nombre y luego le saludar nombrndolo:

    1 PROGRAM EjemploVariable;2 3 Var4 nombre: String;56 BEGIN7 write(Ingresa tu nombre: );8 readln(nombre);9 writeln(Hola ,nombre);10 END.

    Hemos comenzado como siempre escribiendo PROGRAM seguido de un identificador para nuestro programa y un punto y coma.

    En la tercera lnea vemos la palabra reservada VAR, la cual indica que a continuacin se declararn todas las variables que usar nuestro programa en sus tareas. Una variable guarda informacin de algn tipo especfico y luego usa esta para realizar diferentes acciones, incluso modificar su valor. Nosotros podremos modificar el contenido de una variable siempre que queramos (detallaremos esto ms adelante) y en cualquier momento dentro de nuestro programa.

    Para declarar una variable, luego de la palabra VAR, le damos un nombre (identificador) a la variable y definimos de qu tipo ser. La sintaxis para hacerlo es la siguiente:

    NombreDeLaVariable: tipo;en nuestro ejemplo, en la lnea 4 hemos declarado una variable llamada nombre del tipo string, o sea, una variable que contendr cadenas de caracteres. String es una palabra reservada de pascal y corresponde a un tipo primitivo del mismo. Todo lo que sea del tipo String almacenar cadenas de caracteres. Nosotros no usaremos mucho este tipo en general ya que no resulta muy til a los efectos de este manual, pero an as sirve conocerlo.

    En la lnea 6 indicamos el inicio del programa. Como ven, la declaracin de variables se hace antes de iniciar el programa. Esto es porque el compilador primero asigna la memoria RAM que necesitar para almacenar cada variable y luego comienza con la ejecucin del programa. Las variables declaradas se guardan en celdas de memoria aunque no se usen, por lo cual no conviene declarar variables inservibles.

    En la lnea 7 usamos write para imprimir un mensaje al usuario y dejar el cursor a continuacin del mensaje, ya que all se escribir el nombre. En la octava lnea utilizamos el procedimiento readln para leer informacin de la entrada estndar e indicamos entre parntesis que dicha informacin debe ser almacenada en la variable nombre (la informacin se leer al presionar enter). Siempre luego del procedimiento read o readln se especifica entre parntesis la o las variables que guardarn la informacin leda, de lo contrario, el programa no guardar ningn registro de la informacin administrada por el usuario y continuar su curso.

    En la novena lnea utilizamos el procedimiento writeln al cual le pasamos dos campos de informacin esta vez, primero el texto que debe imprimir y luego, separado por una coma, el nombre de la variable cuya informacin queremos que aparezca en pantalla. Cuando uno necesita imprimir varias cosas con un solo procedimiento write o writeln debe separar los campos con una coma. En este caso, un campo contiene el texto y el otro la variable nombre. Cuando se especifica el nombre de una variable dentro de un campo de estos procedimientos, lo que aparecer en pantalla es el contenido de la variable. En este caso la variable nombre guardar la palabra que nosotros escribamos y luego ser lo que aparezca en pantalla al imprimir su contenido.

    Ejemplo de ejecucin:

    Ingresa tu nombre: VladimirHola Vladimir

    Al igual que con write y writeln, la diferencia entre read y readln es que la primera lee informacin de la entrada estndar y deja el cursor al final de la lnea en que la informacin fue ingresada. La segunda deja el cursor justo al inicio de la lnea siguiente. Pueden probar a escribir el programa anterior intercambiando estas funciones para ver el resultado y comprenderlo mejor.

    Notas: No declarar una variable luego de la palabra VAR es un error de sintaxis.No usar los dos puntos (:) para luego indicar el tipo de la variable es un error de sintaxis. Dos variables no pueden llamarse de la misma manera ni tampoco pueden llamarse igual que el programa,

    dicho de otra manera, no pueden repetirse dos identificadores, eso es un error de sintaxis.

    Vladimir Rodrguez 14

  • Programacin estructurada en Pascal

    Ejemplo de asignacin: Con el siguiente programa veremos como usar variables numricas y cmo asignarle un valor especfico a una variable as como tambin a realizar operaciones entre ellas calculando el rea de un tringulo:

    1 PROGRAM AraTriangulo;2 3 Var4 base, altura: integer;5 area: real;6 7 BEGIN8 Write(Ingresa la base: );9 Readln(base);10 Write(Ingresa la altura: );11 Readln(altura);12 13 area:= base*altura/2;14 15 Writeln(El rea del tringulo es: ,area:1:2);16 END.

    Este programa utiliza tres variables: base, altura y area, para calcular el rea de un tringulo. La base y la altura del mismo son ingresadas por el usuario, y el valor de area se asigna dentro del programa.

    Esta vez tenemos dos variables del tipo integer, o sea que almacenarn nmeros enteros y una del tipo real, o sea que almacenar nmeros reales. Como ven es posible declarar ms de una variable del mismo tipo en una sola sentencia, simplemente separndolas por comas (,) y asignando el tipo al final, como hemos hecho en la lnea 4. Puede, si se desea, declararse cada variable por separado.

    En la lnea 8 imprimimos una instruccin para el usuario y en la lnea 9 indicamos al programa que lea de la entrada lo que el usuario ingrese y lo guarde dentro de la variable base. En la lnea 10 imprimimos otra instruccin al usuario y en la 11 leemos un valor y lo guardamos en la variable altura.

    En la lnea 13 de nuestro programa le asignamos a la variable area mediante el uso del smbolo de asignacin (:=) el valor del resultado de multiplicar el valor de base por el valor de altura y dividirlo entre 2. O sea, estamos multiplicando ambas variables ya que contienen nmeros. El smbolo para multiplicar es el asterisco (*) y para la divisin la barra (/).

    En la lnea 15 usamos writeln a la cual le pasamos dos campos de informacin, uno con el texto a imprimir y otro con la variable cuyo valor debe mostrarse con modificadores de decimales (ya explicar esto). Este programa podra haberse hecho sin la variable area y la lnea 15 quedara as

    Writeln (El rea del tringulo es: ,base*altura/2:1:2);Como ven, es posible colocar expresiones en los campos de write y writeln.

    Los nmero enteros no contienen cifras despus de la coma y los reales s pueden contenerlas. La variable area es del tipo real por lo cual al imprimir su contenido este se mostrar con valores decimales y exponente en base 10. Por ejemplo si su valor es 50, se imprimir as 5.00000000000000E+001. Esto equivale a 5x101. Los modificadores :1:2 indican en su primer valor el nmero mnimo de caracteres que toleraremos en el resultado (1) y el segundo valor indica cuantas cifras luego de la coma queremos que aparezcan (2). Con esto, el valor anterior se ver como 50.00.

    Leer ms de una variable a la vez:

    El programa anterior podra haber sido escrito de la siguiente manera:

    1 PROGRAM AraTriangulo;2 3 Var4 base, altura: integer;5 area: real;6 7 BEGIN8 Write(Ingresa base y la altura separadas por un espacio: );9 Readln(base,altura);10 11 area:= base*altura/2;12 13 Writeln(El rea del tringulo es: ,area:1:2);14 END.

    Vladimir Rodrguez 15

  • Programacin estructurada en Pascal

    Como pueden observar bsicamente es lo mismo, con la nica diferencia crucial de que esta vez, en la lnea 9, indicamos al programa mediante el procedimiento readln que lea dos variables a la vez. Esto siempre es posible. Solo deben colocarse entre los parntesis los nombres de las variables a leer separados por comas. Pueden ser variables de distinto tipo. En este caso especfico ambas son integer. Cuando se ingresen los datos para la entrada estndar deben separarse por un espacio. Si el usuario ingresa solo un dato ste se asignar a la primera variable que aparezca dentro de los parntesis y el programa quedar esperando el siguiente valor.

    Del mismo modo pueden imprimirse varias variables a la vez ingresando los nombres de cada variable separados por comas dentro de los parntesis de un procedimiento write o writeln.

    Ejercicio: Realicen un programa que calcule el rea y el permetro de un rectngulo. Recuerden que el rea de un rectngulo se calcula como base*altura y su permetro como base*2+altura*2. El programa recibir de la entrada estndar la base y la altura y mostrar como salida un mensaje con el rea y otro, debajo, con el permetro. Estos mensajes deben estar separados al menos por una lnea en blanco de los mensajes de instrucciones para el usuario.

    Ejemplo de ejecucin:

    Ingrese la base: 10Ingrese la altura: 6

    El rea de rectngulo es: 60El permetro del rectngulo es: 32

    Deben ser capaces de realizar este ejercicio antes de continuar. Si desean saber la solucin escrbanme a [email protected] .

    Vladimir Rodrguez 16

  • Programacin estructurada en Pascal

    Introduccin a la compatibilidad de tipos:

    En el ejemplo anterior tenemos dos variables del tipo integer (enteros) y una del tipo real (reales). Una variable integer no puede contener reales pero una real s puede contener enteros. Si en el ejemplo anterior el usuario ingresa para base un nmero real no entero (por ejemplo 1.5) el programa intentar guardar este valor en una variable entera y no podr por lo cual se producir un error en tiempo de ejecucin que har que el programa finalice abruptamente. Si base fuera del tipo real y se le pasara un valor integer (por ejemplo 4) no habra problema ya que el programa transformar el entero a real, o sea el 4 ser 4.0. Esto no afecta la informacin ya que 4 y 4.0 son exactamente el mismo valor, pero no hay forma de pasar un real a entero sin modificar este de alguna manera, ya sea truncndolo (dejar un 1.5 en 1) o redondendolo de alguna forma.

    Si la variable area en nuestro programa fuera tambin del tipo entero, tendramos un error en tiempo de compilacin al intentar asignarle el valor de multiplicar base por altura y dividir esto entre dos, ya que la operacin (/) devuelve como valor un real. El compilador detectara esto y cancelara su tarea indicando que hay un error en la compatibilidad de tipos ya que se quiere asignar un real a un entero.

    Del mismo modo, si a variables reales o enteras se les asigna una cadena de caracteres como entrada, tendremos un error en tiempo de ejecucin ya que valores numricos no son compatibles con cadenas de caracteres.

    Lo ms conveniente para el programa anterior sera declarar todas las variables como reales. Esto soluciona el problema de la compatibilidad de tipos numricos, aunque an tenemos el problema de si el usuario ingresa un carcter que no sea un nmero en las entradas de este programa. A la tarea de detectar todas las posibles situaciones que puede enfrentar nuestro programa al ser usado y sus consecuencias se le llama Captura de errores y es una de las tareas ms difciles ya que es fcil que se nos pase por alto algn caso, y ms an cuando nuestro programa es muy complejo. A medida que avancemos veremos cmo enfrentar estas situaciones.

    Vladimir Rodrguez 17

  • Programacin estructurada en Pascal

    Errores en tiempo de Ejecucin y errores en tiempo de Compilacin:

    Luego de escribir el cdigo siempre intentamos compilarlo para generar nuestro ejecutable y ver los resultados de nuestro trabajo. Mientras el programa se compila decimos que estamos en tiempo de compilacin. Los errores que pueden sufrirse aqu son generalmente de sintaxis y de compatibilidad de tipos. Cuando hay un error en tiempo de compilacin el compilador se detiene y nos indica el lugar donde encontr el error proporcionndonos adems alguna informacin acerca de por qu se produjo. Estos son los errores ms fciles de arreglar ya que son detectables fcilmente.

    Ahora bien, que un programa compile perfectamente no nos dice que no tenga errores. Cuando ejecutamos un programa decimos que estamos en tiempo de ejecucin. Los errores en tiempo de ejecucin provocan que el programa se cuelgue, termine inesperadamente perdindose toda la informacin que tenamos o que muestre resultados inesperados. Estos errores son los menos deseados y los ms difciles de detectar ya que se deben a errores en nuestras instrucciones al programa.

    Veamos un ejemplo sencillo, un programa que divide dos nmeros:1 PROGRAM dividir;2 3 Var4 a, b: real;5 6 BEGIN7 Write(Ingrese un nmero: );8 Readln(a);9 Write(Ingresa otro nmero: );10 Readln(b);11 12 Wtieln(El resultado de la divisin es: ,a/b:1:2);13 END.

    Supongamos que sabemos que nuestros usuarios solo ingresarn nmeros a nuestro programa. Cul sera el problema entonces? Ese programa compila perfectamente y solo ingresarn nmeros, no habra error posible. Pero qu pasa si cuando se ingresa el valor para b el usuario ingresa el valor 0? Supongamos que la ejecucin fue as:

    Ingrese un nmero: 5Ingrese otro nmero: 0

    Qu debera mostrar nuestro programa? Al llegar a la lnea 12 he intentar la divisin de a/b, o sea 5/0, no podr ya que la divisin entre 0 no est definida matemticamente y el programa producir un error y se terminar su ejecucin. Lo correcto sera que si el usuario ingresa un 0 para la variable b el programa nos muestre un mensaje de error y nos vuelva a pedir un nuevo valor. Cuando veamos estructuras de control veremos como tomar distintos caminos segn las condiciones que se dan.

    Vladimir Rodrguez 18

  • Programacin estructurada en Pascal

    Palabras reservadas:

    Las palabras reservadas por Pascal son aquellas que indican alguna funcin especfica del lenguaje, como por ejemplo, write indica que algo se desplegar en pantalla y readln que el usuario ingresar alguna informacin. Que una palabra sea reservada indica que esta no puede utilizarse como identificador, o sea, uno no puede crear un programa llamado Writeln o Var, o una variable llamada Readln. Utilizar palabras reservadas indebidamente es un error de sintaxis.

    He aqu una lista de casi todas las palabras reservadas en pascal:

    ANDARRAYBEGINCASECONSTDIVDODOWNTOELSEENDFILEFORFUNCTIONGOTOIFINLABELMODNIL

    NOTOFORPACKEDPROCEDUREPROGRAM

    RECORDREPEATSETTHENTOTYPEUNTILVARWHILEWITHABSARCTANBOOLEAN

    CHARCHRCOSDISPOSEEOFEOLNEXPFALSEGETINPUTINTEGERLN

    MAXINTNEWNILODDORDOUTPUTPACKPAGEPREDPUTREADREADLNRESETREWRITEROUNDSINSQRSQRTSUCCTEXTTRUETRUNCUNPACKWRITEWRITELN

    Vladimir Rodrguez 19

  • Programacin estructurada en Pascal

    Identificadores:

    Como ya hemos visto, utilizamos identificadores para nombrar a nuestro programa y a nuestras variables. En efecto, un identificador es un nombre que nosotros asignamos a nuestros objetos en el programa para identificarlos luego mediante ese nombre. Usaremos identificadores para nombrar variables, constantes, tipos, parmetros, funciones, procedimientos y punteros entre otras cosas.

    Un identificador puede ser cualquier cadena de caracteres alfanumricos o de subrayado que comience al menos con una letra. No puede contener espacios ni caracteres especiales as como tampoco puede ser igual a una palabra reservada.

    De este modo, identificadores vlidos pueden ser: Abuela, ABuela2, Ejemplo_de_identificador, E2B214, etc.

    Identificadores invlidos podran ser: 1Abuela, Abuela 2, Ejemplo de Identificador, Abk$, Variable(), pascal, var, program, etc.

    Tipos de datos:

    Ordinales: Son aquellos que, dado un elemento, podemos saber cual es el siguiente y/o el anterior adems de que poseen una cantidad finita de elementos. Por ejemplo dado un nmero entero sabemos que el siguiente es ese nmero ms uno y el anterior es el nmero menos uno. Dado el 5 su predecesor es el 4 y su sucesor es el 6.

    Integer Nmeros enteros, sin ninguna cifra decimal.Char Caracteres.Boolean Valores lgicos, pueden valer True o False.Enumerados Definido por el programador.Subrango Definido por el programador.

    Para estos tipos llamados Ordinales tenemos tres funciones predefinidas por Pascal que suelen ser tiles:

    Pred(valor_de_tipo_ordinal) Devuelve el predecesor para cualquier valor de tipo ordinal excepto si ste es el primero de todos. En este caso tenemos un error en tiempo de ejecucin.

    Succ(valor_de_tipo_ordinal) Devuelve el sucesor para cualquier valor de tipo ordinal excepto si ste es el ltimo de todos. En este caso tenemos un error en tiempo de ejecucin.

    Ord(valor_de_tipo_ordinal) Devuelve el ordinal para cualquier valor de tipo ordinal. Ya hablaremos de esto ms tarde, al igual que de las dos funciones anteriores.

    Reales: Solo tenemos el tipo real para esta categora. Las funciones anteriores no funcionan con valores de tipo real ya que es imposible saber, dado un real, cual es su sucesor o su predecesor.

    Estructurados: Forman estructuras de datos, en general, bastante complejas.

    String Cadena de caracteres.Array Tablas de datos (String es un array de caracteres).Record Registros de datos.File Secuencias de datos (No trabajaremos con este tipo).Set Conjuntos de datos.

    Punteros: Hablaremos de ellos al final de este tutorial.

    Notas: El mayor entero posible es identificado por la palabra reservada MAXINT, la cual es una constante (hablaremos de estas ms adelante).

    Operadores en pascal:

    Veamos los operadores aritmticos de Pascal, los cuales son usados para crear expresiones matemticas y realizar clculos:

    Vladimir Rodrguez 20

  • Programacin estructurada en Pascal

    Operador Expresin Significado Descripcin

    *

    A*B A por B Realiza el producto de A por B. A y B pueden ser

    reales o enteros. Basta con que uno sea real para que el resultado sea un real.

    /A/B A dividido B Realiza la divisin entre A

    y B. Devuelve como resultado un real.

    DIV

    A div B A dividido B (divisin entera)

    Realiza la divisin entera entre A y B. Devuelve

    como resultado el cociente, por tanto A y B

    han de ser enteros.

    MOD

    A mod B Resto de A dividido B (divisin entera)

    Realiza la divisin entera entre A y B y devuelve

    como resultado el resto. A y B deben ser enteros.

    +

    A+B A ms B Realiza la suma de A ms B. Basta con que uno de

    los sumandos sea real para que devuelva un real.

    -

    A-B A menos B Realiza la resta de A menos B. Basta con que uno de los restando sea

    real para que devuelva un real.

    Precedencia de operadores: Dada una expresin matemtica donde se combinen varios de estos operadores, al igual que en el lgebra comn, se realizarn primero los productos (*), las divisiones (div), (mod) y (/) y luego las sumas (+) y restas (-). Para quebrar esta precedencia de quin va primero que quin, se utilizan los parntesis.

    Ejemplo: A+B*C En este caso aparece primero la suma y luego un producto. Sin embargo el producto tiene precedencia ante la suma y se evaluar primero B*C para luego sumar ese resultado con A. Si se quisiera realizar primero la suma habra que utilizar parntesis y escribir aquella expresin como (A+B)*C. Ahora s se realizar primero la suma y luego el producto ya que los parntesis tienen la precedencia absoluta excepto si existen funciones que deben evaluarse dentro.

    Funciones matemticas de pascal:

    Pascal nos provee de varias funciones matemticas predefinidas para realizar algunos clculos comunes. En los siguientes ejemplos la letra x simbolizar un nmero o expresin del tipo adecuado para la funcin en cuestin:

    ABS(x) Calcula el valor absoluto de X. X debe ser integer o real. El resultado es del mismo tipo que X.

    SQR(x) Calcula el cuadrado de X. X debe ser integer o real. El resultado es del mismo tipo que X.

    SQRT(x) Calcula la raz cuadrada de X siendo X un real o entero mayor o igual que 0. El resultado es un del tipo real.

    SIN(x) Calcula el seno de X expresado en radianes. X debe ser integer o real. El resultado es del tipo real.

    ARCTAN(x) Calcula el arco tangente de X. X debe ser integer o real. El resultado es del tipo real.EXP(x) Calcula la exponencial de X (ex donde e= 2.7182818). X debe ser integer o real. El

    resultado es del tipo real.LN(x) Calcula el logaritmo neperiano (base e) de X siendo X mayor que cero. X debe ser

    integer o real. El resultado es del tipo real.

    TRUNC(x) Suprime la parte decimal de X dejando solo el valor anterior a la coma. X debe ser real. El resultado es del tipo integer.

    ROUND(x) Redondea el valor de X al entero ms prximo. X debe ser real. El resultado es del tipo integer.

    ORD(x) Obtiene el nmero de orden de X dentro de un conjunto de valores definidos por su tipo. X debe ser de un tipo ordinal. El resultado es de tipo integer.

    Vladimir Rodrguez 21

  • Programacin estructurada en Pascal

    CHR(x) Devuelve el caracter cuyo nmero ordinal es X. El tipo de X debe ser integer. El resultado es de tipo char.

    Un ejemplo del uso de DIV y MOD. Introduccin a los comentarios:

    Se nos plantea el siguiente problema. Dado un nmero entero de cuatro cifras que ser ledo desde la entrada estndar se nos pide que hagamos la suma de sus cifras. Por ejemplo, si el usuario ingresa el nmero 5648 el programa debe realizar la suma de 5+6+4+8 y mostrar el resultado. Se asume que el usuario ingresar efectivamente un nmero de cuatro cifras.

    1 {El siguiente programa desglosar un nmero de cuatro cifras2 en sus cuatro nmeros distintos, uno por cada cifra y realizar3 la suma entre ellas}4 PROGRAM SumaCifras;56 Var7 numero: integer; //El valor que ser ledo.8 c1, c2, c3, c4: integer;//Una variable para cada cifra.9 10 BEGIN11 write('Ingresa un nmero de cuatro cifras: ');12 readln(numero); //Leemos el nmero de 4 cifras.1314 (*Asignamos a cada variable el valor de la cifra que le corresponde*)15 c1:= numero mod 10;16 c2:= (numero mod 100) div 10;17 c3:= (numero mod 1000) div 100;18 c4:= numero div 1000;1920 //Mostramos el resultado al usuario.21 write('El resultado de sumar ',c4,'+',c3,'+',c2,'+',c1,' es: ' ,c1+c2+c3+c4);22 END.

    Este es nuestro primer programa en el que vemos el uso de comentarios. Los comentarios son anotaciones hechas por el propio programador para ir explicando lo que se va realizando en su cdigo. Esto es debido a que normalmente el software se desarrolla en equipo y resulta imprescindible que otros lean el cdigo que uno escribe y sean capaces de entenderlo. Los comentarios son omitidos por el compilador por lo cual no afectan en absoluto al funcionamiento del programa, solo son una documentacin explicativa. Existen dos tipos de comentarios, los comentarios multilnea y los comentarios de fin de lnea. Los primeros pueden abrirse con { y cerrarse con } tal como se ve en las primeras tres lneas de nuestro programa, o abrirse con (* y cerrarse con *) tal como se ve en la lnea 14 de nuestro programa. Un comentario multilnea puede ocupar una o ms lneas de cdigo, tantas como sea necesario. Los comentarios de fin de lnea se abren con // y no requieren ningn smbolo de cierre ya que, como su nombre lo indica, finalizan al terminar la lnea en que aparecen. Podemos verlos en las lneas 7, 8, 12 y 20 de nuestro ejemplo. En el IDE se vern de color gris.

    Ahora miremos un poco la lgica de nuestro programa, como usando mod y div solamente, puede desglosarse un nmero en sus respectivas cifras.

    En la lnea 12 leemos de la entrada estndar un valor y lo guardamos dentro de numero. Luego, en la lnea 15, mediante el smbolo de asignacin := le damos a c1 el valor de la primera cifra de nuestro nmero. Fjense que si uno tiene un nmero de ms de una cifra y lo divide entre 10, el resto de esa divisin ser la primera cifra si leemos de derecha a izquierda. Teniendo por ejemplo el 1456, si dividimos ese nmero entre 10 (divisin entera, sin llevarlo a decimales) obtenemos como resto el 6 y como resultado el 145.

    En la lnea 13 obtenemos el resto de dividir nuestro nmero entre 100, eso da como resultado el entero formado por las dos primeras cifras (de derecha a izquierda) y luego (notar que esta operacin est entre parntesis para que se realice primero) mediante div obtenemos el cociente de dividir ese nmero entre 10. Por ejemplo, si tenemos 1456 y lo dividimos entre 100, el resultado es 14 y el resto 56. Teniendo el resto, al dividirlo entre 10 tenemos como resultado el 5 y como resto el 6. De este modo en las lneas 17 y 18 obtenemos las ltimas dos cifras de nuestro nmero.

    Ahora las variables c1, c2, c3 y c4 contienen cada una los valores de una cifra de nuestro valor inicial.En la lnea nmero 21 mostramos mediante el procedimiento write los resultados de nuestro programa.

    Vladimir Rodrguez 22

  • Programacin estructurada en Pascal

    Introduccin a las constantes:

    Al igual que podemos definirnos variables, que son objetos cuyos valores van cambiando a lo largo del programa, tambin podemos definirnos constantes, que sern objetos cuyo valor no cambiar nunca a lo largo del programa. Veremos un ejemplo en el cual intentar hacerles entender la necesidad de las constantes.

    El siguiente programa pedir como entrada en reales el precio sin IVA de cinco productos que estn a la venta en un almacn. Luego mostrar el precio de dichos productos con el IVA agregado.

    1 PROGRAM preciosIVA;2 3 Const4 iva= 23;56 Var7 harina, leche, azucar, sal, arroz: real;//Precios de los productos.8 porcentaje: real; //Para calcular cuanto se debe sumar al precio.9 10 BEGIN1112 //Mostramos mensajes al usuario y leemos los datos desde la entrada.13 write('Precio HARINA : ');14 readln(harina);15 write('Precio LECHE : ');16 readln(leche);17 write('Precio AZUCAR : ');18 readln(azucar);19 write('Precio SAL : ');20 readln(sal);21 write('Presto ARRZ : ');22 readln(arroz);2324 //Dejamos una lnea en blanco.25 writeln;2627 //Calculamos el porcentaje de IVA para harina.28 porcentaje:= harina*iva/100;29 //Mostramos el nuevo precio al usuario.30 writeln('HARINA + IVA : ',harina+porcentaje:2:2);3132 //Calculamos el porcentaje de IVA para leche.33 porcentaje:= leche*iva/100;34 //Mostramos el nuevo precio al usuario.35 writeln('LECHE + IVA : ',leche+porcentaje:2:2);3637 //Calculamos el porcentaje de IVA para azucar.38 porcentaje:= azucar*iva/100;39 //Mostramos el nuevo precio al usuario.40 writeln('AZUCAR + IVA : ',azucar+porcentaje:2:2);4142 //Calculamos el porcentaje de IVA para sal.43 porcentaje:= sal*iva/100;44 //Mostramos el nuevo precio al usuario.45 writeln('SAL + IVA : ',sal+porcentaje:2:2);4647 //Calculamos el porcentaje de IVA para arroz.48 porcentaje:= arroz*iva/100;49 //Mostramos el nuevo precio al usuario.50 writeln('ARROZ + IVA : ',arroz+porcentaje:2:2);51 END.

    Bien, en la lnea 3 vemos la palabra reservada const, que indica que desde all se declararn constantes. La sintaxis para declaracin de constantes es

    NombreDeLaConstante= valor; donde valor representa un valor de algn tipo primitivo de pascal (integer, real, char, string entre algn otro). El nombre de la constante es un identificador. En este caso, en la lnea 4 del programa hemos declarado la constante iva y le hemos dado el valor 23, que representa el 23% que vale el IVA en mi pas. Notar que las constantes se declaran antes que las variables.

    Vladimir Rodrguez 23

  • Programacin estructurada en Pascal

    Luego, en las lneas 7 y 8 declaramos las variables del programa, una para el precio de cada producto y una para calcular el porcentaje de IVA que le corresponde al precio de cada producto para luego sumrselo al mismo.

    En las lneas 13 a 22 inclusive, mostramos mensajes al usuario y leemos los valores de las entradas para cada producto.

    Luego, en la lnea 25 indicamos mediante el procedimiento writeln que queremos dejar una lnea en blanco. Esto se hace llamando al procedimiento sin pasarle campos entre parntesis.

    En la lnea 28 calculamos el porcentaje de IVA para la harina asignando este valor a la variable porcentaje. Esta operacin es simple. Si uno tiene un valor y quiere saber un porcentaje de ese valor simplemente multiplica dicho valor por el porcentaje que quiere obtener y divide el resultado entre 100. Por ejemplo, si tenemos el nmero 278 y queremos saber el 15% de ese nmero simplemente realizamos la operacin 278x15/100 lo cual nos dara 41,7. Ese valor corresponde al 15% de 278. De este modo calculamos el porcentaje de IVA para cada producto multiplicando su precio por el valor de la constante iva y dividiendo entre 100.

    En la lnea 30 mostramos un mensaje al usuario y el precio de la harina ms el porcentaje de IVA del mismo, en este caso ms un 23%.

    Repetimos esto hasta el final de la aplicacin.Notar que siempre usamos la variable porcentaje para calcular el 23% de cada precio. El smbolo de

    asignacin (:=) borra el contenido anterior de la variable y asigna el nuevo, o sea, la sobrescribe.Ahora veamos el mismo programa pero sin el uso de la constante iva:

    1 PROGRAM preciosIVA;23 Var4 harina, leche, azucar, sal, arroz: real;//Precios de los productos.5 porcentaje: real; //Para calcular cuanto se debe sumar al precio.6 7 BEGIN89 //Mostramos mensajes al usuario y leemos los datos desde la entrada.10 write('Precio HARINA : ');11 readln(harina);12 write('Precio LECHE : ');13 readln(leche);14 write('Precio AZUCAR : ');15 readln(azucar);16 write('Precio SAL : ');17 readln(sal);18 write('Precio ARRZ : ');19 readln(arroz);2021 //Dejamos una lnea en blanco.22 writeln;2324 //Calculamos el porcentaje de IVA para harina.25 porcentaje:= harina*23/100;26 //Mostramos el nuevo precio al usuario.27 writeln('HARINA + IVA : ',harina+porcentaje:2:2);2829 //Calculamos el porcentaje de IVA para leche.30 porcentaje:= leche*23/100;31 //Mostramos el nuevo precio al usuario.32 writeln('LECHE + IVA : ',leche+porcentaje:2:2);3334 //Calculamos el porcentaje de IVA para azucar.35 porcentaje:= azucar*23/100;36 //Mostramos el nuevo precio al usuario.37 writeln('AZUCAR + IVA : ',azucar+porcentaje:2:2);3839 //Calculamos el porcentaje de IVA para sal.40 porcentaje:= sal*23/100;41 //Mostramos el nuevo precio al usuario.42 writeln('SAL + IVA : ',sal+porcentaje:2:2);4344 //Calculamos el porcentaje de IVA para arroz.45 porcentaje:= arroz*23/100;46 //Mostramos el nuevo precio al usuario.47 writeln('ARROZ + IVA : ',arroz+porcentaje:2:2);48 END.

    Vladimir Rodrguez 24

  • Programacin estructurada en Pascal

    Esta versin funciona exactamente igual a la anterior, con la diferencia de que en el cdigo, donde antes tenamos el identificador iva ahora hay un 23.

    Ahora imaginen la siguiente situacin: el valor de IVA cambia en un momento dado y se les pide que reestructuren su programa para el nuevo valor de IVA. Si ustedes hicieron su programa tal como esta ltima versin debern buscar en su cdigo cada una de las veces en que usaron el 23 para calcular el porcentaje de IVA y cambiarlo por el nuevo valor, mientras que en la versin con constante solo es ir a donde est declarada iva y modificar ah su valor con lo cual no sera necesario tocar ms nada del cdigo. Esta accin puede realizarla hasta alguien que no haya sido el propio programador, mientras que en el cdigo sin constante, si uno no fue quien program deber primero sentarse a leer y entender el cdigo hasta que pueda efectivamente hacer una bsqueda de los lugares donde se realiz el clculo del IVA para poder modificarlos.

    En este ejemplo no resulta difcil modificar todos los 23 que hay, pero imaginen una base de datos de un supermercado en el cual hay miles de productos y precios diferentes. Sera mejor buscar y cambiar todos y cada uno de los valores en que usamos el 23, o sera mejor declarar una constante y solo cambiar un 23? Normalmente los cdigos son muy extensos y complicados, por lo cual una tarea de revisin total y bsqueda exhaustiva sera muy tediosa y difcil, adems de que es muy probable que se nos pase por alto alguna expresin a modificar. El uso de constantes es muy recomendable cuando se va a usar un mismo valor muchas veces.

    Nota: No puede usarse una constante a la izquierda de una asignacin. Por ejemplo sera errneo escribir iva:= 10; ya que iva no puede ser modificada. Esto es un error de sintaxis.

    Vladimir Rodrguez 25

  • Programacin estructurada en Pascal

    Booleanos:

    El tipo boolean resulta muy extrao al principio. Solo contiene dos valores posibles: True y False. O sea, una variable del tipo boolean solo puede ser verdadera o falsa. Aunque en principio uno no puede imaginarse para qu puede servir una variable de este tipo, realmente resultarn muy tiles ms adelante, cuando tengamos que comenzar a darle condiciones a nuestro programa para que tome distintos caminos de ejecucin.

    No es posible hacer write ni read de una variable boolean.

    Algunas notas:

    El punto y coma acta como separador. Nosotros acostumbramos a escribir una instruccin por lnea por una cuestin de legibilidad del cdigo, sin embargo al compilador eso no le importa al igual que tampoco la sangra (indentacin) que dejemos. De este modo resultar lo mismo escribir

    Writeln(Hola mundo);Readln(variable);

    que escribir

    writeln(Hola mundo); readln(variable);

    Ejercicios: Antes de continuar debern ser capaces de realizar la gran mayora de los ejercicios que aparecern en los links a continuacin. Estos los dirigirn a una pgina de Facultad de Ingeniera y los ejercicios estn pensados para reforzar todo lo que yo ya les he explicado hasta aqu. La mayora se resuelve de forma dinmica con la pgina WEB con lo cual ustedes podrn verificar sus resultados al instante. Reitero, traten de resolver la mayor parte de esos ejercicios antes de continuar o de lo contrario no podrn desempearse bien en los temas que trataremos en lo que sigue del tutorial.

    Prctico 1: http://www.fing.edu.uy/inco/cursos/prog1/pm/field.php/Practicos/Practico1Prctico 2: http://www.fing.edu.uy/inco/cursos/prog1/pm/field.php/Practicos/Practico2

    En caso de tener problemas con estos enlaces o con las pginas a las que estos los llevan envenme un e-mail a [email protected] y les ayudar a la brevedad.

    Vladimir Rodrguez 26

  • Programacin estructurada en Pascal

    SEGUNDA PARTE

    Seleccin y Repeticin

    Vladimir Rodrguez 27

  • Programacin estructurada en Pascal

    Introduccin:

    En esta seccin del tutorial aprenderemos a usar secuencias de seleccin para indicarle al programa qu camino ha de tomar en funcin de ciertas condiciones dadas as como tambin aprenderemos secuencias de repeticin para indicarle al programa que debe volver a ejecutar cierto fragmento de cdigo una cantidad de veces dada, o no. Es aqu donde la programacin comienza a complicarse un poco y comenzamos a tener verdaderos dolores de cabeza cuando nuestros programas no hacen lo que nosotros queremos.

    Es muy comn que, en las secuencias de repeticin, nunca se den las condiciones necesarias para finalizar la repeticin y nuestro programa entre en un bucle infinito (loop) y quede colgado realizando la misma tarea hasta que nosotros lo cerremos o se bloquee el sistema. Tambin es muy comn que olvidemos alguna condicin necesaria para que el programa tome un camino especfico y por lo tanto funcione errneamente, o que ni se nos haya cruzado por la cabeza que el usuario podra haber ingresado tal o cual instruccin y esto genere muchos errores en la ejecucin de nuestro programa.

    Por estos motivos es que cuando uno crea un programa debe probarlo con la peor intencin posible para detectar la mayora de los errores que puedan aparecer. Dedicar una seccin entera para hablar de la prueba de programas.

    El ambiente de desarrollo IDE de Free Pascal tiene incluido un depurador (debugger). Esta es una herramienta que nos permitir ver la ejecucin de nuestro programa paso a paso y visualizar en una pequea ventana los valores que nuestras variables van tomando para as, poder detectar errores que de otro modo sera casi imposible. Aprenderemos a usar esta herramienta en la pgina 42 de este tutorial. Conviene leerla cuando lleguen a ella, pero si necesitan encontrar algn error en los programas que van desarrollando lanla cuando quieran.

    Vladimir Rodrguez 28

  • Programacin estructurada en Pascal

    Seleccin. Instruccin IFTHEN e IFTHENELSE:

    Como ya hemos visto que se vuelve necesario tomar distintos caminos segn lo requieran las circunstancias. Por ejemplo, en nuestro programa que divida dos cifras (pgina 18) haca falta mostrar un mensaje de error al usuario en caso de que este ingresara como segundo valor un 0 ya que esto causara un error en tiempo de ejecucin, y en caso contrario simplemente mostrar el resultado de la divisin.

    Aqu entra en juego la instruccin de seleccin ifthen que en ingls significa (sientonces). Su sintaxis es la siguiente:

    If condicin then Instruccin;

    Supongo que debo decir que IF, THEN y ELSE son palabras reservadas.Veamos un ejemplo sencillo en el cual un programa pedir que se ingrese una edad a un usuario y si esta es

    mayor a 50 aos le dir que es un viejo.

    1 PROGRAM viejo;2 3 Var4 edad: integer; //Variable para guardar la edad.56 BEGIN7 //Mostramos mensaje y leemos la edad.8 write('Ingrese su edad: ');9 readln(edad);1011 //Mostramos lo mismo que ya ingres.12 writeln('Usted tiene ',edad,' aos.');1314 //Si tiene ms de 50 aos le decimos viejo.15 If edad>50 then16 writeln('Usted es un viejo');1718 END.

    Lo nico nuevo en este programa est en la lnea 15, en la instruccin if. Como vemos, en la lnea nmero 9 el usuario ingresa un nmero entero que corresponder a su edad. En la lnea 15 decimos si edad es mayor a 50 entonces. La condicin edad>50 es un booleano que valdr true si edad resulta ser mayor a 50 o false en caso contrario. La lnea 16 se ejecutar solo si se cumple la condicin, si no ser salteada completamente. Es posible colocar expresiones matemticas dentro de las condiciones.

    Ahora veamos un ejemplo con el mismo programa pero que existan dos caminos posibles a tomar. Si el usuario tiene ms de 50 aos le diremos viejo y si no le diremos que es joven:

    1 PROGRAM viejo;2 3 Var4 edad: integer; //Variable para guardar la edad.56 BEGIN7 //Mostramos mensaje y leemos la edad.8 write('Ingrese su edad: ');9 readln(edad);1011 //Mostramos lo mismo que ya ingres.12 writeln('Usted tiene ',edad,' aos.');1314 //Si tiene ms de 50 aos le decimos viejo.15 If edad>50 then16 writeln('Usted es un viejo')17 else18 Writeln(Usted es joven);19

    20 END.

    Vladimir Rodrguez 29

  • Programacin estructurada en Pascal

    Este programa es esencialmente igual al anterior con la excepcin del else en la instruccin if. Esto significa que si se cumple la condicin se realizar la primera instruccin (la que est antes del else) y en caso contrario se ejecutar lo que est luego del else.

    Vean que luego de que escribimos ifthen la siguiente lnea est corrida unas columnas hacia la derecha, o sea tiene ms sangra que todo lo dems. Esto es lo que, como ya dije, llamamos indentacin. Es para dejar el cdigo ms legible, de este modo se entiende bien que la instruccin de la lnea 16 corresponde al IF y la de la lnea 18 corresponde al else.

    Notar que la instruccin de la lnea 16 no termina en punto y coma. Esto se debe a que si as fuera estaramos quebrando el If, o sea, estaramos diciendo que hasta ah llega esa instruccin y luego vendr otra por separado, pero sin embargo lo que viene es un else que es parte del if y por tanto corresponde a la misma sentencia. En todas las instrucciones del tipo ifthenelse nunca colocar un punto y coma antes del else.

    Anidacin de la instruccin Ifthen:

    Es posible colocar un if dentro de otro if. A esto se lo conoce como anidacin y se usa a muy menudo. Sin embargo hay que tener mucho cuidado de hacerlo bien o podra darse que nosotros creemos que el programa tomar cierto camino cuando en realidad no lo har. Veremos un ejemplo de eso luego del de a continuacin:

    Veamos un ejemplo en el que se nos pedir la edad dos veces. Si ingresamos una edad mayor a 50 y otra menor nos dir que somos viejos jvenes.

    1 PROGRAM anidacion;2 3 Var4 edad1, edad2: integer;5 6 BEGIN7 Write(Ingresa tu edad: );8 Readln(edad1);9 Write(Ingresa tu edad nuevamente: );10 Readln(edad2);11 12 If edad1>50 then13 If edad250 then13 If edad1=edad2 then14 Writeln(Eres un viejo)

    Vladimir Rodrguez 30

  • Programacin estructurada en Pascal

    15 else16 Writeln(Eres joven);17 18 END.

    En este ejemplo uno podra interpretar que si tenemos ms de 50 aos y adems ingresamos las dos veces la misma edad aparecer el mensaje Eres un viejo, y si edad1 era menor a 50 nos aparecer el mensaje Eres joven. Sin embargo no es as, esa instruccin se fijar si nuestra edad es mayor a 50 y solo si eso es cierto luego ver si ambas edades eran iguales, si es as aparecer el mensaje Eres un viejo y si no aparecer el mensaje Eres joven. La correcta indentacin de esa instruccin es la siguiente:

    If edad1>50 then If edad1=edad2 then Wirteln(Eres un viejo) else Writeln(Eres un joven);

    Como ven, solo se ejecutar esto si edad1>50 resulta ser true.La forma correcta de escribir esta instruccin para obtener el resultado que interpretbamos anteriormente

    sera:

    If edad1>50 thenbegin If edad1=edad2 then Wirteln(Eres un viejo);

    endelse Writeln(Eres un joven);

    Como ven, hemos encerrado entre begin y end la segunda instruccin if. Esto hace que todo lo que est dentro del rea abarcada por esas dos palabras sea como una sola instruccin para el programa, a pesar de que all dentro podemos poner todas las que queramos. De no hacer esto, el else formara parte del segundo if y no del primero. Debemos recordar que un else cierra siempre al if que se encuentre ms prximo a l. Para quebrar esto debemos usar begin y end.

    Los delimitantes begin y end se usan para indicar que al tomar cierto flujo de ejecucin dada una condicin el programa debe efectuar muchas instrucciones. No servira de mucho que por cada if que usemos solo podamos dictar una instruccin. La sintaxis genrica sera la siguiente:

    If condicion thenbegin Instruccion1; Instruccion2; .

    . .

    InstruccionN;endelsebegin Instruccion1; Instruccion2;

    . . .

    InstruccionN;end;

    Vean que tambin es posible usar los delimitantes begin y end para la instruccin else del if. Estos begin y end forman lo que llamamos bloques de instrucciones y difieren del begin y end principales ya que estos forman un nico bloque que es el programa completo. Luego de un end va enseguida un punto y coma que indica el final del bloque y no un punto como en el caso del end principal. Notar que el end anterior al else no finaliza con punto y coma. Esto se debe a lo que ya expliqu antes. Recordar que nunca, antes de una instruccin else que forma parte de un if debe ir colocado un punto y coma.

    Vladimir Rodrguez 31

  • Programacin estructurada en Pascal

    Condiciones compuestas:

    Hasta ahora hemos visto como dada una condicin especfica el programa tomar un camino u otro para realizar sus tareas. Sin embargo normalmente deben cumplirse varias condiciones para que un programa tome un camino u otro. Aqu entramos a componer condiciones, o sea, a decir cosas como: Si pasa tal cosa y tal otra has esta tarea o si pasa tal otra cosa has esta.

    Aprenderemos a usar los operadores booleanos para componer condiciones.Veamos un ejemplo parecido al anterior:

    1 PROGRAM anidacion2;2 3 Var4 edad1, edad2: integer;5 6 BEGIN7 Write(Ingresa tu edad: );8 Readln(edad1);9 Write(Ingresa nuevamente tu edad: );10 Readln(edad2);11 12 If (edad1>50) and (edad1=edad2) then13 Writeln(Eres un viejo)14 else15 Writeln(O eres joven o mentiroso);16 17 END.

    Aqu vemos que en la instruccin IF hay dos condiciones entre parntesis unidas por la palabra reservada AND. Esto significa que se ejecutar la instruccin del IF si ambas condiciones son verdaderas, o sea, si se cumple a la vez que edad1>50 y que edad1=edad2. Basta con que una de ellas sea falsa para que no se ejecute la instruccin del IF y se pase a la del ELSE. En ese caso no sabremos si sucedi porque el usuario era joven o si era un mentiroso que ingres dos edades diferentes.

    Estas composiciones son evaluadas por Free Pascal con el mtodo conocido como circuito corto. Esto es que, si la primera condicin del AND es falsa, ya no se evaluar la segunda porque aunque esta fuera verdadera la condicin total resulta falsa. As nacen las tablas de verdad. AND en ingls significa Y.

    Si nosotros quisiramos haber dicho que se ejecute el IF si la primera condicin la otra eran verdaderas deberamos haber usado el operador OR. Este es verdadero si al menos una de las condiciones es verdadera. Tambin se evala por circuito corto, o sea, si la primera condicin es verdadera ya no se evaluar la segunda porque aunque resulte falsa la condicin total OR ser verdadera.

    Tablas de verdad:

    ANDExpresin1 Expresin2 Expresin1 AND Expresin2TRUE TRUE TRUETRUE FALSE FALSEFALSE TRUE FALSEFALSE FALSE FALSE

    ORExpresin1 Expresin2 Expresin1 OR Expresin2TRUE TRUE TRUETRUE FALSE TRUEFALSE TRUE TRUEFALSE FALSE FALSE

    Existe tambin el operador booleano NOT que niega una condicin, o sea, da el valor opuesto a esta. En principio uno se pregunta para que servira algo como eso. Ms adelante cuando comencemos a trabajar con la variables boolean veremos el uso de este operador. Veamos su tabla:

    NOTExpresin NOT ExpresinTURE FALSEFALSE TRUE

    Vladimir Rodrguez 32

  • Programacin estructurada en Pascal

    Operadores relacionales: Son los que comparan dos expresiones:

    Operador Expresin comparativa Significado= A = B A es igual a B> A > B A es mayor que B< A < B A es menor que B

    >= A >= B A es mayor o igual a B

  • Programacin estructurada en Pascal

    1 PROGRAM polinomio;23 Var4 a, b, c: real; //Los coeficientes del polinomio.5 discriminante: real; //El discriminante.6 raiz1, raiz2: real; //Las races del polinomio.7 8 BEGIN9 //Pedimos al usuario el ingreso de datos y leemos los mismos.10 write('Ingrese los coeficientes separados por espacio: ');11 readln(a,b,c);1213 //Verificamos que el coeficiente a sea no nulo.14 If a=0 then15 writeln('Usted no ha ingresado un polinomio de segundo grado.')16 else17 begin18 //Calculamos el discriminante.19 discriminante:= sqr(b)-4*a*c;2021 //Tomaremos los tres caminos segn el valor discriminante.22 If discriminante=0 then23 begin24 //El polinomio tiene una nica raz.25 raiz1:= -b/(2*a);26 writeln('El polinomio tiene una raz doble: ',raiz1:2:2);27 end28 else29 If discriminante>0 then30 begin31 //El polinomio tiene dos races.32 raiz1:=(-b+sqrt(discriminante))/(2*a);33 raiz2:=(-b-sqrt(discriminante))/(2*a);34 35 writeln('El polinomio tiene dos races reales: ',raiz1:2:2,' y ',raiz2:2:2);36 end37 else38 writeln('No existen races reales.');39 end; //Fin de la instruccin ELSE del IF principal.40 END.

    Muy bien, como primera cosa les dir que a pesar de la explicacin que yo pueda dar aqu ser conveniente que ustedes mismos estudien este programa para comprenderlo bien. No es para nada complicado pero puede resultar confuso gracias a las anidaciones que se han hecho de las funciones IFTHENELSE.

    En las lneas 4, 5 y 6 declaramos todas las variables necesarias para que nuestro programa funcione correctamente.

    En la lnea nmero 11 leemos los tres coeficientes a la vez. Luego tenemos un IFTHENELSE principal que, si el coeficiente a es igual a cero mostrar un mensaje de error al usuario y solo en caso contrario pasar a realizar todas las dems tareas en su instruccin else. En ese caso calculamos primero el discriminante ya que de l dependern los caminos a tomar. Observar que al hacerlo (en la lnea 19) usamos la funcin sqr que calcula el cuadrado de un nmero. En vez de eso podramos haber puesto b*b que es lo mismo.

    Si el discriminante es igual a 0 mostraremos al usuario la raz doble, sino, si el discriminante es mayor que 0 calculamos y mostramos ambas races, y en caso contrario le diremos al usuario que no existen races reales.

    Es importante que entiendan el uso de los begin y end en este programa. Recuerden que estos delimitan bloques de programa los cuales son vistos como una nica instruccin. Si escribiera el cdigo anterior a partir del primer IF de modo que en cada sentencia tuviramos una nica instruccin quedara as:

    If condicion1 then Instruccion1ElseBegin //Aqu debera estar el clculo del discriminante. If condicion2 then Instruccion2 Else

    Vladimir Rodrguez 34

  • Programacin estructurada en Pascal

    If condicion3 then Instruccion3 Else Instruccion4;End;

    Esto, si tomramos todo lo que est entre el BEGIN y el END que vemos all como una nica instruccin quedara simplemente como

    If condicion1 then Instruccion1Else Instruccion2;

    donde la Instruccion2 sera todo el enorme bloque entre el BEGIN y END.

    Vladimir Rodrguez 35

  • Programacin estructurada en Pascal

    Instruccin de seleccin CASEELSE:

    La instruccin CASE que veremos a continuacin podra considerarse como la forma correcta de escribir una enorme cantidad de IF anidados. Veamos primero un ejemplo anidando IF en el cual el programa despliega al usuario varias opciones y dependiendo de lo que ste seleccione ser lo que har:

    1 PROGRAM menu;23 Var4 opcion: char;5 numero: integer;6 7 BEGIN8 writeln('1--> Muestra un mensaje en pantalla');9 writeln('2--> Ingresar un nmero');10 writeln('3--> Ingresar un caracter');1112 write('Ingrese una opcion y presione ENTER: ');13 readln(opcion);14 15 writeln;1617 If opcion='1' then18 writeln('MENSAJE DESPLEGADO')19 else20 if opcion='2' then21 begin22 write('Ingrese un nmero entero: ');23 readln(numero);24 writeln('Ha ingresado ',numero,'.');25 end26 else27 if opcion='3' then29 begin30 write('Ingrese un caracter: ');31 readln(opcion);32 writeln('Ha ingresado ',opcion);33 end34 else35 writeln('ERROR. No existe la opcin ',opcion);36 END.

    En este ejemplo trabajaremos por primera vez con una variable del tipo char, o sea que contendr caracteres, no una cadena como el tipo string sino uno solo. Esto es por un simple motivo. Al ser del tipo char cualquier smbolo que ingresemos ser ledo sin problemas. Nosotros mostramos las opciones del men con nmeros, entonces uno podra decir que para leer la opcin que el usuario ingrese podramos haber declarado una variable integer o real, sin embargo de hacerlo as, si el usuario en vez de ingresar un nmero ingresa una letra el programa dar un error en tiempo de ejecucin al intentar almacenar una letra en una variable numrica y se cerrar. Sin embargo, al ser del tipo char, si el usuario ingresa una letra esta se leer sin problemas y podremos desplegar al usuario un mensaje de error que indique que ha seleccionado una opcin incorrecta, y de ser posible pedirle que lo intente de nuevo.

    Notar como en las condiciones de los IF comparamos el carcter ledo en la variable opcion con un carcter escribiendo este entre comillas simples. Es importante saber que si el usuario ingresa un 1 en su entrada, nosotros leeremos el carcter 1 y NO el nmero 1. El carcter 1 es como una letra o un smbolo, no es un nmero que se puede sumar o restar, es un smbolo. Del mismo modo que uno no puede sumar letras, a+b por ejemplo, no se pueden sumar caracteres numricos. No es lo mismo 1 que 1. El primero es un nmero y el otro un carcter. 1+2 equivale a la cadena 12, y 1+2 es igual a 3. Esta diferencia resulta esencial, es importante que lo comprendan.

    No he puesto comentarios en este programa apropsito para que ustedes lo lean y entiendan por s solos. Bsicamente decimos, si el usuario ingresa el 1 muestra un mensaje, sino, si el usuario ingresa el 2 pide que ingrese un numero y mustraselo, sino, si el usuario ingresa el 3 pdele que ingrese un carcter y mustraselo, sino dile que lo que ha ingresado no es una opcin correcta.

    Vladimir Rodrguez 36

  • Programacin estructurada en Pascal

    Ahora veamos el mismo programa usando la instruccin CASE:

    1 PROGRAM menu;2 3 Var4 opcion: char;5 numero: integer;6 7 BEGIN8 writeln('1--> Muestra un mensaje en pantalla');9 writeln('2--> Ingresar un nmero');10 writeln('3--> Ingresar un caracter');11 12 write('Ingrese una opcion y presione ENTER: ');13 readln(opcion);14 15 writeln;1617 Case opcion of18 '1': writeln('MENSAJE DESPLEGADO');19 '2': begin20 write('Ingrese un nmero entero: ');21 readln(numero);22 writeln('Ha ingresado ',numero,'.');23 end;24 '3': begin25 write('Ingrese un caracter: ');26 readln(opcion);27 writeln('Ha ingresado ',opcion);28 end;29 else30 writeln('ERROR. No existe la opcin ',opcion);31 end; //De la instruccin CASE.32 END.

    Hasta la lnea 16 nuestros ejemplos son exactamente iguales. Ahora, en la lnea 17 en vez de tener un IF tenemos la declaracin de la instruccin CASE. Su sintaxis es la siguiente:

    Case variable of Etiqueta1: instruccion1; Etiqueta2: instruccion2; ... EtiquetaN: instruccinN;Else Intruccion_por_defecto;End;

    Esta instruccin se fijar en el valor de la variable colocada entre la palabra CASE y la palabra OF, en nuestro ejemplo se trata de la variable opcion. Luego tomar el camino en el cual el valor de la variable sea igual al de la etiqueta. El ELSE al final indica lo que se debe hacer si la variable no corresponde con ninguna de las etiquetas anteriores. Este ELSE puede ir o no. Si no est no se ejecutar nada y se continuar con lo que haya debajo en el cdigo, pero no habr error. En este caso hemos usado el ELSE par decir al usuario que no ingres nada de lo esperado. Notar que antes de este ELSE s debe ir un punto y coma que cierre la instruccin anterior, no como en el caso de los ELSE que se usan en una instruccin IF.

    Siempre al final de la instruccin CASE debe ir un END que finalice en punto y coma para indicar el final de esta instruccin. No colocarlo es un error de sintaxis.

    Notar que las instrucciones para cada etiqueta pueden ser bloques de instrucciones delimitados por sus respectivos BEGIN y END.

    Es importante saber que las etiquetas representan los valores que debe tomar la variable del encabezado del CASE para que el programa tome tal o cual camino. Es posible indicar ms de un valor a la vez en una misma etiqueta, simplemente separando cada valor por una coma:

    Case variable of Valor1, valor2: instruccion1; Valor3, valor4, valor5: instruccion2; . . . ValorI, valorN: instruccionJ;

    Vladimir Rodrguez 37

  • Programacin estructurada en Pascal

    IMPORTANTE: La variable del encabezado del CASE debe ser de un tipo ORDINAL, o sea integer, char, enumerado, boolean o subrango.

    Ejercicio: Este es un simple ejercicio para que usen CASE. Quiero que en un solo programa junten los siguientes ejemplos que vimos hasta ahora: el programa HolaMundo de la pgina 11, el del rea de un Tringulo de la pgina 15, el que divida dos cifras de la pgina 18 habindolo modificado para que muestre un error si se ingresa la segunda cifra igual a 0, y el programa que desglosaba un nmero de cuatro cifras de la pgina 22 modificado para que muestre un error si el usuario ingresa un nmero invlido, o sea, uno que sea menor a 1000 o mayor a 9999. Su programa debe mostrar un men como el siguiente:

    1) Hola Mundo2) Calcular el rea de un Tringulo3) Dividir dos nmeros reales4) Sumar los dgitos de un nmero de cuatro cifras

    Seleccin:

    Cuando el usuario elija una opcin su programa habr de realizar las tareas pertinentes y en caso contrario notificar el error. No continen hasta no lograr hacer esto.

    Vladimir Rodrguez 38

  • Programacin estructurada en Pascal

    Secuencia de repeticin FOR:

    Adems seleccionar distintos caminos dadas ciertas condiciones, muchas veces hace falta repetir ciertas tareas segn otras condiciones. Por ejemplo, en nuestro programa de polinomios de segundo grado sera conveniente que si el usuario ingresa el coeficiente a nulo, adems de mostrar el mensaje de error, el programa vuelva a pedir que se ingresen los coeficientes, o si en nuestro programa de la instruccin CASE, el usuario ingresara una opcin que no est en el men adems de notificrselo sera correcto volver a pedir que ingrese una.

    Existen tres estructuras de repeticin; la que vamos a ver a continuacin llamada FOR, y otras dos que veremos luego llamadas WHILEDO y REPEATUNTIL.

    FOR (que en ingls significa PARA o POR) repite una tarea una cantidad especfica de veces, ni mas ni menos. Su sintaxis es la siguiente:

    For variable:= valor_inicial to valor_final do Instruccin;

    Por ejemplo, si quisiramos imprimir la letra A unas 10 veces la declaracin del FOR sera algo as:

    For i:=1 to 10 do Write(A);

    En este caso veramos una salida como esta: AAAAAAAAAALa variable en el encabezado del FOR debe ser declara junto con todas las variables del programa. Esta

    variable es conocida como variable de control del FOR y debe ser de un tipo ordinal. De ms est decir que el valor final debe ser del mismo tipo que el inicial (por ejemplo puede ser for i:= a to z do). Su valor es inicializado con el valor_inicial del encabezado del FOR.

    La variable de control comienza valiendo 1, el programa imprime una A, luego la variable aumenta su valor a 2 y se imprime la segunda A. As hasta que la variable alcanza el valor final. Esto es muy importante ya que es lo ms comn usar la variable de control del FOR dentro de las instrucciones que este realiza. Debo aadir que si el FOR ha de realizar ms de una instruccin en su ejecucin debemos encerrar estas entre un BEGIN y un END.

    Resulta obvio que FOR, TO y DO son palabras reservadas de Pascal.

    Veamos un ejemplo en el cual usamos la variable de control del FOR. Imprimiremos en pantalla los 10 primeros nmero pares a partir del 0 sin incluir a este: 1 PROGRAM pares;

    23 Var4 i: integer;56 BEGIN7 write('Los 10 primeros pares son: ');89 For i:=1 to 20 do10 If i mod 2= 0 then11 write(i,' ');12 END.En la lnea 7 mostramos al usuario un mensaje. En la novena lnea comienza la declaracin del FOR donde

    inicializamos i en 1 y continuaremos hasta que valga 20. El IF en la lnea 10 se encarga de ver si el valor actual de i es par, o sea si el resto de dividirlo entre 2 es igual a 0. En ese caso imprimimos su valor y un espacio, sino no hacemos nada y esperamos la siguiente iteracin.

    Al proceso de repetir varias veces un mismo segmento de cdigo se lo llama iteracin. Nuestro FOR iterar 20 veces.

    Es importante jams modificar la variable de control mientras se est ejecutando el FOR, o sea, no hacer por ejemplo i:= 10 dentro del FOR ya que eso produce errores muy inesperados y dependen mucho del compilador usado para crear el programa. Puede usarse el valor de la variable de control para todo lo que se necesite, incluso incluirlo en expresiones y condiciones, pero nunca modificarlo.

    Ahora veamos el mismo programa, pero solo que esta vez le pediremos al usuario que ingrese cuantos nmeros pares quiere visualizar:

    1 PROGRAM PrimerosPares;2 3 Var4 i, pares: integer; 6 BEGIN7 8 write('Cuantos pares quieres visualizar? ');

    Vladimir Rodrguez 39

  • Programacin estructurada en Pascal

    9 readln(pares);10 11 writeln;12 write('Los primeros ',pares,' pares son: ');1314 pares:= pares*2;15 16 For i:=1 to pares do17 If i mod 2= 0 then18 write(i,' ');19 END.

    En la lnea 8 mostramos el mensaje al usuario para, en la siguiente lnea, pedirle que ingrese cuntos pares desea ver.

    En la lnea 11 usamos el procedimiento writeln sin parmetros para que imprima una lnea en blanco. En la lnea 12 mostramos un mensaje al usuario.

    En la lnea 14 hay algo nuevo. A la variable pares le asignamos su valor anterior multiplicado por 2 ya que si el usuario desea ver, por ejemplo, los diez primeros pares nosotros deberamos iterar del 1 al 20. Esto de asignar a una variable un valor que depende de su valor anterior es muy comn en la programacin. A dichas variables se las conoce como acumuladores. Esto lo veremos en ms detalle cuando trabajemos con WHILE y REPEAT.

    En la lnea 16 cambiamos el valor final del encabezado del FOR por la variable pares. Esto es lo ms comn en el uso de esta instruccin. No hace falta indicar un valor nosotros mismos, sino que podemos colocar nombres de variables, constantes o incluso expresiones matemticas siempre y cuando el tipo de la variable de control y el del valor final sean el mismo y estos sean ordinales.

    Anidacin del FOR:

    Veamos un ejemplo donde el usuario ingresar un nmero que indicar el largo del lado de un cuadrado y dibujaremos este con el carcter *:

    1 PROGRAM Cuadrado;2 3 Const4 caracter= '*';5 6 Var7 i, j, lado: integer;8 9 BEGIN10 write('Ingresa el largo del lado: ');11 readln(lado);12 13 writeln;14 15 For i:=1 to lado do16 begin17 For j:=1 to lado do18 write(caracter);1920 writeln;21 end;22 END.

    Lo interesante en este programa es analizar lo que sucede desde la lnea 15 en adelante. Tenemos dos FOR, uno dentro de otro. Lo primero a resaltar es el uso de dos variables de control diferentes, una para cada FOR. Si usramos la misma variable para ambos uno modificara la del otro y se ocasionara un caos. Si quieren prueben este programa as como est y luego con la misma variable de control. Es probable que el compilador los regae por eso y se produzca un error en tiempo de compilacin.

    Veamos, cuando i vale 1 entramos al FOR principal. All tenemos otro FOR el cual se ejecutar hasta el final antes de volver al primer FOR. Cuando j vale 1 imprimimos un * (est definido en la constante caracter). Luego j vale 2 y se imprime un segundo * en la misma lnea ya que estamos usando un procedimiento write. As continuamos hasta que se imprimen tantos * en una lnea como lo indique la variable largo. Ahora pasamos a la lnea 20 del programa donde est writeln para escribir una lnea en blanco, o sea, para bajar un rengln. Ahora i vale 2. Volvemos a entrar en el FOR principal y el FOR de dentro vuelve a comenzar con j en 1. Imprime los *, se baja un rengln y as hasta que i sea igual al valor de la variable lado.

    Vladimir Rodrguez 40

  • Programacin estructurada en Pascal

    Notar que la instruccin writeln de la lnea 20 est dentro del FOR principal pero no forma parte del FOR interno.

    Otra forma del FOR es la siguiente:

    For variable:=valor_inicial downto valor_final do Instruccin;

    Esto funciona exactamente igual a la forma anterior del FOR con la diferencia de que valor_inicial es mayor que valor_final. O sea que la variable de control ir decreciendo en vez de aumentar. Por ejemplo:

    For i:=20 downto 1 do Instruccion;

    En este caso i comenzar valiendo 20, luego 19, luego 18, y as hasta llegar al 1.

    NOTAS: Nunca asuman el valor que tendr la variable de control una vez finalizado el FOR. En este ejemplo de FOR que va de 20 a 1 uno podra decir que i vale 1 al final, pero esto puede no ser as y depende del compilador. Si van a volver a usar esta variable debern inicializarla ustedes mismos con el valor apropiado.

    A continuacin les planteo una serie de ejercicios de aplicacin del FOR y algunos temas ya vistos. Por favor, no continen si no son capaces de resolver estos ejercicios. Si realmente se trancan con alguno envenme un e-mail a [email protected] explicndome cual ejercicio les est dando problemas y les ayudar o les enviar la solucin.

    Ejercicio 1: Determinen cules de los siguientes fragmentos de cdigo producen la misma salida: a) FOR i:=1 TO 3 DO FOR j:= i+1 TO 3 DO write(i,j)

    b) FOR i:=1 TO 3 DO write (i, i+1)

    c) FOR i:=1 TO 4 DO IF (i=1) OR (i=4) THEN write(i) ELSE write(i,i)

    Ejercicio 2: Escriban un programa que lea desde el teclado un valor entero n. A continuacin, el programa deber leer n enteros y luego desplegar el mayor y el menor de ellos.

    Ejemplo de entrada:

    n=8 Ingrese 8 enteros: 5 12 36 4 21 95 12 18

    Ejemplo de salida:

    El mayor entero ingresado es: 95 El menor entero ingresado es: 4

    Vladimir Rodrguez 41

  • Programacin estructurada en Pascal

    Ejercicio 3: Escriban un programa que lea de la entrada estndar 5 valores positivos, todos menores que 60 y produzca una grfica de barras horizontales similar a la que se muestra en el ejemplo para estos datos:

    Ejemplo de entrada:

    Ingrese 5 valores: 5 12 17 35 8

    Ejemplo de salida:

    ***** ************ ***************** *********************************** ********

    Ejercicio 4: Escriban un programa que lea de la entrada estndar un carcter c y un entero n. El programa debe desplegar un tringulo de n lneas formado por el carcter c segn se muestra en el siguiente ejemplo:

    Ejemplo de entrada:

    n=8 c=$

    Ejemplo de salida:

    $$$$$$$$ $$$$$$$ $$$$$$ $$$$$ $$$$ $$$ $$ $

    Vladimir Rodrguez 42

  • Programacin estructurada en Pascal

    DEBUGER

    Antes de continuar quiero que aprendan a usar el DEBUGER (depurador) de Free Pascal para que puedan testear sus programas cuando tengan problemas con ellos.

    Primero que nada necesitarn ver la ventana watches que es la que les mostrar los valores que tomen sus variables. Para acceder a ella vallan al men Debug Watches. Debern disminuir el tamao de la ventana de su cdigo para poder ver ambas a la vez. Para ello seleccinenla para que quede activa y presionen Ctrl+F5, el borde quedar verde. Pueden moverla con las flechas de direccin y cambiar su tamao manteniendo presionada Shift cuando presionen una flecha. Cuando hayan ajustado el tamao a uno que les sirva deben agregar a la ventana WATCHES las variables que necesitan ver. Para ello vallan al men Debug Add watch o presionen Ctrl+F7. En el cuadro de dilogo ingresen el nombre de la variable a observar y esta aparecer en la ventana WATCHES. Agreguen tantas variables como quieran.

    Ahora deben ejecutar su programa paso a paso. Para ello, una vez compilado, vallan al men RUN y elijan STEP OVER. Ahora su programa comenzar pero estar detenido. Presionen F7 o F8 para avanzar una lnea. El programa solo avanzar al presionar una de estas teclas. La diferencia entre una y otra es que F8 no entrar en los procedimientos y funciones (lo veremos luego) y F7 si lo har.

    Cada vez que avancen vern como se modifican sus variables. Tambin pueden ir viendo la pantalla de salida mientras usan el debuger, para ello vayan al men Debug Output y

    les aparecer la salida. Debern ajustar el tamao de cada ventana para que puedan ver todas a la vez.