0% encontró este documento útil (0 votos)
26 vistas7 páginas

Introducción a Turbo-Pascal y Ejemplo

Este documento presenta la primera sesión práctica de programación en Turbo Pascal. Introduce el entorno de programación de Turbo Pascal y explica cómo crear y compilar un programa simple de adivinanza de números que contiene errores a propósito para demostrar técnicas de depuración. Luego guía al usuario en la corrección del programa mediante la compilación y resolución iterativa de errores hasta que el programa se compila sin errores. Finalmente, introduce conceptos básicos de depuración para detectar errores lógicos restantes.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
26 vistas7 páginas

Introducción a Turbo-Pascal y Ejemplo

Este documento presenta la primera sesión práctica de programación en Turbo Pascal. Introduce el entorno de programación de Turbo Pascal y explica cómo crear y compilar un programa simple de adivinanza de números que contiene errores a propósito para demostrar técnicas de depuración. Luego guía al usuario en la corrección del programa mediante la compilación y resolución iterativa de errores hasta que el programa se compila sin errores. Finalmente, introduce conceptos básicos de depuración para detectar errores lógicos restantes.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Programacin I - Primera Sesin de Prcticas Introduccin a Turbo-Pascal

1. El Entorno de Programacin
El entorno de programacin de Turbo-Pascal consiste en un editor de programas desde el cual es posible escribir, compilar, ejecutar y depurar programas escritos en Pascal. Para ejecutar Turbo-Pascal se debe hacer doble-click sobre su icono situado en el escritorio de windows. La apariencia del entorno es la siguiente:

Para alternar entre el modo de pantalla completa y el modo de ventana pulse [Ctrl-Intro]. Se puede apreciar que el entorno consta de las siguientes partes: Men general: Mediante el men es posible acceder a todos las comandos de Turbo-Pascal: Abrir y guardar programas, compilarlos, ejecutarlos, buscar texto, etc. Para acceder al men se puede usar tanto el ratn como el teclado: Pulsando [F10] se accede a (y se sale de) la barra de men, desde la cual podemos desplazarnos y desplegar submens utilizando las teclas del cursor.

Barra de estado: Muestra combinaciones de teclas que permiten acceder de manera rpida a los comandos ms usuales. Ventanas: Sirven para editar programas. Podemos tener abiertas hasta 9 ventanas distintas. Cada una de ellas recibe un nmero (se puede apreciar en la esquina superior derecha) y pulsando [Alt] junto con el nmero de la ventana podemos hacer que pase a primer plano. Tambin se puede cambiar su posicin y tamao usando los comandos del men Window. Dilogos: Sirven para introducir informacin (el nombre de un fichero, el texto de bsqueda, etc.). Para pasar de un elemento del dilogo a otro pulse el tabulador. Para marcar o desplegar listas use la tecla de espacio, y [Esc] o Intro para salir. Turbo-Pascal dispone de una ayuda tanto sobre el entorno como sobre la versin del lenguaje Pascal que se soporta. La ayuda se puede acceder de las siguientes formas: Pulsando [F1] se muestra ayuda referente a la parte del entorno donde nos encontremos: La ventana de edicin, los comandos de men, etc. Tambin sirve para obtener informacin ampliada sobre los errores de sintaxis de nuestros programas. Pulsando [Shift-F1] accedemos al ndice general de la ayuda. Si estamos en la ventana de edicin y el cursor se encuentra situado sobre una palabra reservada de Pascal, pulsando [Ctrl-F1] obtenemos ayuda sobre el lenguaje Pascal. Por ltimo, pulsando sobre Contents en el men Help obtenemos la ventana principal de ayuda. Nota: La nica referencia vlida sobre el lenguaje Pascal para la asignatura Programacin I es la informacin proporcionada en las clases tericas. No debe utilizarse ningn comando, estructura de datos o control o subprogramas de libreras que no sean aquellos contemplados explcitamente en la asignatura, independientemente de que aparezcan en la ayuda de Turbo-Pascal o no. En caso de duda consulte con su profesor.

2. Creacin y Compilacin de Programas


En este apartado vamos a seguir el proceso de escritura y correccin de un programa en Pascal. El programa simular el juego de adivinar un nmero desconocido siguiendo la estrategia de acotar su valor mediante una serie de preguntas cuya respuesta es si o no. El programa consta de un bucle principal que repite la accin de adivinar un nmero hasta que el usuario indique que desea terminar el programa. Para adivinar un nmero se usan tres variables: menor y mayor nos indican el rango de valores en el que sabemos, en un momento dado, que se encuentra el nmero a adivinar. Conoceremos el nmero cuando ambas contengan el mismo valor. Para ir acotando, calcularemos el valor medio de los dos y preguntaremos al usuario si el nmero es mayor que el valor medio: Si la respuesta es que s, podemos descartar el intervalo desde menor hasta medio, y asignamos a menor el valor de medio. En caso contrario, se descarta el intervalo desde medio+1 hasta mayor, y asignamos a mayor el valor de medio. A continuacin se muestra un programa que implementa el algoritmo anterior. Intencionadamente se han incluido errores tanto de sintaxis como de diseo, para mostrar algunos de los errores ms comunes y posibles tcnicas para detectarlos y corregirlos. No es, por lo tanto, un programa que pueda servir de ejemplo de programacin, sino ms bien lo contrario.

Transcriba textualmente el siguiente programa:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 {$R+} {$B+} program AdivinaUnNumero(input, output); const MaxNum = 10; var Ch : char; Menor,Mayor,Medio : integer; EsMayorQueMedio : boolean; begin repeat write(Output,'Piense en un numero del 1 a ',MaxNum,' y pulse Intro.'); readln(Input); Menor := 1; Mayor := MaxNum; while Menor <> Mayor do begin Medio := (Menor+Mayor)/2; write(output,'Es mayor que ',Medio,'? [S/N]'); readln(input,Ch); EsMayorQueMedio := (Ch = 'S') or (Ch = 's'); if EsMayorQueMedio then Menor := Medio; else Mayor := Medio; writeln(output,'Ya esta! Pensaste en el ',Menor); write(output,'Otra vez? [S/N]'); readln(input,Ch) until (Ch = 'n') and (Ch = 'N') end

Nota: Los nmeros de la parte izquierda no forman parte del programa (no deben escribirse en el editor), su funcin es numerar las lneas del programa para poder hacer referencia a ellas posteriormente. Las lneas 1 y 2 no son comentarios sino directivas de compilacin, y es obligatorio que aparezcan siempre como primeras lneas de cualquier programa que escribamos. Existen tres formas de compilar un programa. Pulsando [Alt-F9] compilamos nicamente el programa que aparece en la ventana actual. Pulsando [F9] compilamos tanto el programa como las unidades que ste utiliza, y pulsando [Ctrl-F9] se compila el programa slo si ha habido cambios desde la ltima vez y tras la compilacin se ejecuta. En esta primera sesin no vamos a generar ficheros ejecutables, por lo que elegimos compilar a memoria: Pulsamos [Alt-C] para desplegar el men Compile y si la opcin Destination tiene el valor Disk pulsamos [D] para cambiarla; Si ya tuviera el valor Memory salimos del men pulsando [Esc] o [F10]. Pulsamos [Alt-F9] para compilar el programa y obtenemos el error type mismatch, situndose el cursor en la lnea 19, donde se ha detectado. Si pulsamos [F1] obtenemos informacin ampliada sobre las posibles causas del error. En este caso lo que sucede es que intentamos asignar un valor de tipo real (la media de menor y mayor) a una variable de tipo entero. Debemos obtener un valor entero, y para ello sustituimos el operador de divisin real (/) por el de cociente (div). Si compilamos otra vez, obtenemos error in statement en la lnea 25. Esto sucede por el punto y coma situado tras la asignacin menor := medio. En Pascal, a diferencia de otros lenguajes (por ejemplo, C), el punto y coma no se usa para finalizar sentencias, sino para separar una sentencia de otra. Por eso, aqu Pascal entiende que se termina la sentencia condicional, y no entiende la aparicin 3

de else, que no puede comenzar ninguna sentencia vlida. Eliminamos el punto y coma y volvemos a compilar. Ahora obtenemos el error ; expecteden la lnea 31. Aparentemente, el error es no haber finalizado con punto y coma la sentencia anterior, lo que parece estar en contradiccin con el prrafo anterior, pues no hay que separar esa sentencia de ninguna otra. Sin embargo, si ponemos un punto y coma al final de la lnea 30 y volvemos a compilar, obtenemos error in statement en la lnea 31, lo que demuestra que la existencia o no del punto y coma al final de la lnea 30 no es la causa del error sintctico. El error de la lnea 31 se produce porque no es correcto en ese punto que intentemos cerrar la estructura repeat. Por qu? Si nos fijamos en el programa, veremos que nos falta el end de cierre de la sentencia compuesta que iniciamos en la lnea 18. Si ahora escribimos end; en la lnea 27, y eliminamos el innecesario punto y coma que aadimos en la lnea 30, resolvemos ese problema. Lo anterior en un claro ejemplo de que no siempre la lnea donde se detecta un error es la misma que en la que est el error. Por ultimo, al compilar nos aparece ahora el error unexpected end of file, situndose el cursor en la lnea siguiente al end final del programa. Lo que sucede en este caso es que nos hemos olvidado de poner el punto final del programa. Si aadimos un punto al final de la lnea 32 y volvemos a compilar no obtendremos ningn error. El programa quedara as:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 {$R+} {$B+} program AdivinaUnNumero(input, output); const MaxNum = 10; var Ch : char; Menor,Mayor,Medio : integer; EsMayorQueMedio : boolean; begin repeat write(Output,'Piense en un numero del 1 a ',MaxNum,' y pulse Intro.'); readln(Input); Menor := 1; Mayor := MaxNum; while Menor <> Mayor do begin Medio := (Menor+Mayor) div 2; write(output,'Es mayor que ',Medio,'? [S/N]'); readln(input,Ch); EsMayorQueMedio := (Ch = 'S') or (Ch = 's'); if EsMayorQueMedio then Menor := Medio else Mayor := Medio; end; writeln(output,'Ya esta! Pensaste en el ',Menor); write(output,'Otra vez? [S/N]'); readln(input,Ch) until (Ch = 'n') and (Ch = 'N') end.

3. Depuracin de programas
El hecho de que en la compilacin de un programa no se detecte ningn error tan slo significa que es sintcticamente correcto, pero de ningn modo que no existan errores ni, por supuesto, que realice correctamente la tarea para la que ha sido diseado. Veremos que todava existen errores en el programa anterior y examinaremos algunas de las herramientas de que dispone Turbo-Pascal para detectarlos. Si disponemos de un disquete pulsamos la tecla [F2] para salvar el programa, y escribimos a:\ a:\[Link] (no olvidar introducir antes el disquete en la disquetera). Pulsamos retorno, volviendo al editor del programa. Es conveniente siempre salvar el trabajo realizado antes de ejecutar un programa, ya que pueden existir errores tan graves que impidan regresar de manera normal al entorno. Ejecutamos el programa, pulsando [Ctrl-F9] y respondemos a las preguntas suponiendo que hemos pensado en el valor 1. Aparentemente, el programa funciona correctamente:
Piense en un numero del 1 a 10 y pulse Intro. Es mayor que 5? [S/N] n Es mayor que 3? [S/N] n Es mayor que 2? [S/N] n Es mayor que 1? [S/N] n Ya esta! Pensaste en el 1 Otra vez? [S/N] _ ...

Pero si escribimos s y volvemos a repetir el proceso pensando ahora en el 2, obtenemos lo siguiente:


Otra vez? [S/N] s Piense en un numero del 1 a 10 y pulse Intro. Es mayor que 5? [S/N] n Es mayor que 3? [S/N] n Es mayor que 2? [S/N] n Es mayor que 1? [S/N] s Es mayor que 1? [S/N] s Es mayor que 1? [S/N] s ...

Podemos detener el programa pulsando [Ctrl-C]. Observamos que en este caso el programa no detecta que el nmero pensado es el 2. Para resolver este tipo de problemas es necesario examinar el programa y comprobar si hemos cometido algn error al traducir el algoritmo a Pascal o incluso si el algoritmo que diseamos es errneo. Una tcnica que suele ser til en estos casos es obtener una traza del programa. Turbo-Pascal permite que ejecutemos paso a paso las sentencias de nuestro programa, viendo en cada momento los valores de las variables que seleccionemos. Vamos a usar esa tcnica para resolver el problema con que nos hemos encontrado: Pulsamos [Alt-W] para desplegar el men Window, y pulsamos el comando Watch. Vemos que nos aparece una ventana titulada Watches, que es donde se van a mostrar los valores de las variables. Es conveniente que cambiemos el tamao de la ventana donde se muestra el programa para que no oculte a la ventana Watches: Con el ratn: Pulsamos en la ventana del programa, la cual pasa a primer plano ocultando la ventana "Watches". Movemos el ratn a la esquina inferior derecha de la ventana, pulsando y moviendo el ratn (sin dejar de pulsarlo) vemos que la ventana cambia de tamao. Cuando haya alcanzado el tamao deseado dejamos de pulsar el ratn. 5

Con el teclado: Pulsamos [Alt-1] para que la ventana del programa pase a primer plano. Pulsamos [Ctrl-F5] para indicar que queremos mover o cambiar las dimensiones de la ventana actual (el borde de la ventana adquiere un color verde) y a partir de ese momento las teclas del cursor [] [] [] [] sirven para desplazar la ventana, y manteniendo pulsada la tecla shift ([]) estas mismas teclas sirven para cambiar su tamao. Cuando hayamos terminado pulsamos [Esc]. Para incluir una variable en la ventana "Watches" pulsamos [Ctrl-F7], escribimos su nombre y pulsamos Intro. En este caso aadimos las variables Menor, Mayor, Medio y EsMayorQueMedio. Para iniciar la ejecucin paso a paso, pulsamos [F7]. Vemos que cada pulsacin provoca la ejecucin de una sentencia, que aparece remarcada. Cuando se ejecuta una sentencia readln aparece la pantalla de salida, permitindonos introducir el valor adecuado. Si en un momento dado queremos pasar de la pantalla de salida a Turbo-Pascal, o viceversa, pulsamos [Alt-F5]. Ejecutamos de esta forma el programa, observando como cambian los valores de las variables. En la tabla siguiente vemos los valores obtenidos al llegar a la lnea 27 tras sucesivas iteraciones: Menor 1 1 1 1 1 Mayor 5 3 2 2 2 Medio 5 3 2 1 1 EsMayorQueMedio False False False True True

Podemos observar que el problema reside en que no se limita adecuadamente el rango en que se puede encontrarse el valor buscado, puesto que si sabemos que el valor es mayor estrictamente (no mayor o igual) que medio, entonces el lmite inferior no ser medio, sino medio+1. La solucin pasa por cambiar la asignacin de la lnea 24, menor := medio por menor := medio+1. Pulsamos [CtrlF2] para detener la ejecucin y realizamos el cambio. Ahora el programa adivina el nmero correctamente, pero surge un ltimo problema: Independientemente de lo que escribamos tras la pregunta Otra vez? [S/N], el programa vuelve a repetir el proceso de adivinar un nmero. Parece evidente que el problema reside en la condicin de salida del bucle principal (lnea 31). En estos casos donde sabemos el lugar del posible error, lo ms cmodo es poner un punto de interrupcin en esa lnea del programa y evaluar los valores de las variables y las expresiones en ese punto. Veamos la manera de hacerlo en Turbo-Pascal: Nos situamos en la lnea 31 y pulsamos [Ctrl-F8]. Vemos que la lnea se resalta en color rojo. Eso significa que hemos establecido un punto de interrupcin en esa parte del programa: Cuando la ejecucin llegue a esa lnea, se detendr el programa, permitindonos examinar el valor de las variables en ese punto. Ejecutamos el programa pulsando [Ctrl-F9]. Respondemos na la pregunta Otra vez? [S/N]. Vemos que en ese punto se detiene (temporalmente) el programa y volvemos al editor. Ahora nos interesa ver el valor de la variable ch y el resultado de la expresin (ch='n') and (ch='N'). Pulsamos [Ctrl-F4] y obtenemos el dilogo Evaluate and Modify, el cual nos permite evaluar expresiones. Escribimos ch y pulsamos Intro: Vemos que el valor de la expresin es n, el carcter que hemos introducido. Escribimos ahora (ch=n) and (ch=N) y pulsamos retorno: Vemos que el resultado es false, cuando el valor adecuado debera ser true, puesto que la expresin anterior establece la condicin de salida del bucle. Por lo tanto la expresin anterior es errnea. Podemos ver fcilmente que un carcter no puede ser simultneamente igual a n y a N, que es lo que significa la expresin anterior. La expresin 6

correcta es (ch=n) or (ch=N) Para comprobarlo lo escribimos en el dilogo, obteniendo el valor adecuado, true. Pulsamos [Esc] para salir del dilogo, y [Ctrl-F2] para detener definitivamente la ejecucin. Para eliminar el punto de interrupcin nos situamos sobre la lnea donde se encuentra y volvemos a pulsar [Ctrl-F8]. Si ahora realizamos el cambio y volvemos a ejecutar el programa, veremos que se ejecuta correctamente.

4. Un caso especial: Uso de read y readln


Para terminar, vamos a examinar un problema relativo al uso de las sentencias read y readln cuando se leen caracteres. Este problema surge con relativa frecuencia y puede resultar difcil de encontrar si no se conocen bien las caractersticas que diferencian a ambas sentencias de lectura. Pulse [Alt-S] para desplegar el men Search y pulse el comando Replace... Escriba readln en la primera casilla y read en la segunda. Asegrese de que se encuentran marcadas las opciones Whole words only y Prompt on replace, sitese sobre el botn Change all y pulse Intro. Turbo-Pascal se sita sobre cada aparicin de readln y nos pregunta si deseamos cambiarlo por read. Responderemos No en la primera aparicin y Yes en las siguientes. Ejecutamos el programa. En la primera pregunta respondemos si. La salida del programa es la siguiente:
Piense en un numero del 1 a 10 y pulse Intro. Es mayor que 5? [S/N] si Es mayor que 8? [S/N]Es mayor que 7?[S/N]Es mayor que 6? [S/N]Ya esta! Pensaste en el 6 Otra vez? [S/N]

El programa no espera a que introduzcamos las respuestas a las tres siguientes preguntas. Lo que sucede es que cuando escribimos si y pulsamos Intro, enviamos tres caracteres al programa: [s], [i], y dos caracteres que corresponden a la tecla de retorno. Cada uno de esos cuatro caracteres se interpreta como entrada a cada una de las cuatro preguntas (esto se aprecia mejor volviendo a ejecutar el programa paso a paso y trazando la variable ch). Cuando utilizamos readln esto no sucede porque la lectura se efecta utilizando todos los caracteres hasta el final de la lnea, es decir incluyendo los dos caracteres correspondientes a la tecla retorno. En el caso anterior, tambin se leeran cuatro caracteres, pero solo se devolvera al programa el primero, descartando los tres restantes. Como norma general, si debemos leer caracteres de teclado es preferible usar readln, salvo que el problema que debamos resolver requiera que el programa obtenga todos los caracteres introducidos, incluyendo los que indican el salto de lnea.

También podría gustarte