Academia de Computación Centro de Estudios Tecnológicos Industrial y de Servicios No. 49 Apuntes de Principios de Programación Ing. Edgar Paredes Basilio Apuntes de Principios de Programación INDICE EL SOFTWARE Y LA RESOLUCIÓN DE PROBLEMAS................................................................... 2 PASOS NECESARIOS PARA LA RESOLUCIÓN DE UN PROBLEMA ............................................. 2 El Análisis del Problema. ................................................................................................................. 2 Diseño del Procedimiento de Solución. ........................................................................................... 4 Escritura de la solución en un lenguaje: programa.......................................................................... 7 Pruebas y documentación ............................................................................................................. 10 LA PROGRAMACIÓN Y LOS LENGUAJES INFORMÁTICOS ........................................................ 11 ¿Por qué la Diversidad de Lenguajes Informáticos? ..................................................................... 11 TIPOS DE LENGUAJES INFORMÁTICOS....................................................................................... 12 Lenguajes de Programación Imperativa ........................................................................................ 12 Lenguajes de Programación Funcional ......................................................................................... 13 Lenguajes de Programación Lógica .............................................................................................. 14 Lenguajes de Programación Orientada a Objetos......................................................................... 15 ¿CÓMO CONSTRUIR PROGRAMAS? ............................................................................................ 17 ELEMENTOS DE PROGRAMAS ...................................................................................................... 20 Datos: definiciones y tipos ............................................................................................................. 20 Constantes y variables................................................................................................................... 21 Operadores .................................................................................................................................... 23 Instrucciones.................................................................................................................................. 25 Instrucciones de Entrada y de Salida............................................................................................. 26 Instrucciones Condicionales .......................................................................................................... 26 Instrucciones Repetitivas ............................................................................................................... 27 ESTRUCTURAS BASICAS DE CONTROL ...................................................................................... 27 Reglas generales del pseudocódigo.............................................................................................. 27 Estructura secuencial..................................................................................................................... 28 Estructura condicional.................................................................................................................... 28 Estructura Condicional Simple....................................................................................................... 29 Estructura Condicional Doble ........................................................................................................ 29 Estructura condicional múltiple ...................................................................................................... 30 Estructura repetitiva ....................................................................................................................... 31 Estructura tipo mientras ................................................................................................................. 31 Estructura tipo hasta ...................................................................................................................... 32 Estructura tipo para........................................................................................................................ 33 LA PROGRAMACIÓN ESTRUCTURADA EN LA REPRESENTACION ARBORESCENTE............ 35 Estructura Secuencial .................................................................................................................... 35 Estructura Condicional................................................................................................................... 36 Estructura Condicional Simple....................................................................................................... 36 Estructura Condicional Doble ........................................................................................................ 37 Estructura Condicional Múltiple ..................................................................................................... 38 Estructura Repetitiva...................................................................................................................... 39 Estructura Tipo Hasta .................................................................................................................... 41 Estructura Tipo Para ...................................................................................................................... 42 LA REPRESENTACIÓN ESTRUCTURADA UTILIZANDO DIAGRAMAS N-S DE CHAPIN ............ 46 Estructura Secuencial .................................................................................................................... 46 Estructura Condicional................................................................................................................... 47 Estructura Condicional Simple....................................................................................................... 47 Estructura Condicional Doble ........................................................................................................ 48 Estructura Condicional Múltiple ..................................................................................................... 49 Estructura Repetitiva...................................................................................................................... 49 Estructura Tipo Mientras................................................................................................................ 50 Estructura Tipo Hasta .................................................................................................................... 50 Estructura Tipo Para ...................................................................................................................... 51 Elaboró Ing. Edgar Paredes Basilio 1 Apuntes de Principios de Programación EL SOFTWARE Y LA RESOLUCIÓN DE PROBLEMAS Una computadora se compone de dos elementos fundamentales: el hardware (su parte dura), que constituye su estructura física, y el software (la parte blanda), que son todos los programas que se ejecutan en la computadora. El hardware por sí solo no es capaz de hacer que la computadora funcione. Sin el software, una computadora es un montón de chatarra. El software hace que ésta pueda almacenar y procesar información. El secreto de la computadora reside en su capacidad para ejecutar las instrucciones que tiene guardadas. Ahora bien, para obtener la serie de instrucciones necesarias para resolver un problema se necesita hacer un estudio de éste. PASOS NECESARIOS PARA LA RESOLUCIÓN DE UN PROBLEMA La computadora es una máquina capaz de ejecutar un conjunto de instrucciones muy simples, como operaciones aritméticas, comparaciones, movimiento de información de un lugar a otro, etc. Además, dichas instrucciones sólo las ejecuta en el momento en que se le ordene y en la forma en que se le indique. Se podría afirmar que es «un esclavo» al servicio del hombre, que obedece ciegamente. Eso sí, su velocidad de operación es muy superior a la humana, nunca acusa cansancio y tiene muchas menos probabilidades de cometer un error. Las utilidades de una computadora son, pues, la rapidez y la exactitud en la resolución de problemas bajo una programación adecuada. Para efectuar correctamente la labor de programación es necesaria algo más que la escritura de un programa en un lenguaje determinado. Desde que se enuncia o plantea un problema, por sencillo que éste sea, hasta que se consigue obtener los resultados deseados, es necesario pasar por todas y cada una de las siguientes fases: 1) Análisis del problema. 2) Diseño del procedimiento de solución. 3) Escritura de la solución en un lenguaje de programación: programa. El Análisis del Problema. El análisis consiste en estudiar el problema planteado para obtener una idea clara y concisa sobre lo que se desea obtener como resultado, los datos de entrada de los que se parte y la forma en que estos datos iniciales van a llegar a la computadora. Igualmente debe estudiarse el tratamiento que se ha de realizar con dichos datos, así como la información que se desea obtener como resultado y de qué manera debe presentarse. Es decir, después de analizar el problema, se han de conocer claramente tres cosas: Elaboró Ing. Edgar Paredes Basilio 2 Apuntes de Principios de Programación 1) Información de Salida deseada. Para ello se debe responder a ¿Qué se quiere obtener? 2) Tratamiento que ha de realizarse con estos datos. En este caso, se necesita responder a la pregunta ¿Cómo se tiene que obtener el resultado? 3) Datos de Entrada de que se dispone. Para poder definir estos datos se debe responder a la pregunta ¿Qué datos se necesitan? Esta forma de estudiar y diseñar una solución a un problema dado corresponde a la programación imperativa. A lo largo de los siguientes capítulos éste enfoque será el que se desarrolle. EJEMPLO Supóngase una empresa en donde inicialmente había unos pocos empleados y en la que la preparación de las nóminas se realizaba a mano, puesto que no suponía mucho tiempo. Con el paso de los años, la empresa va creciendo y se necesita ampliar la plantilla, hasta que llega un momento en que el volumen de datos a manejar para hacer las nóminas hace imposible su realización sin mecanizar el proceso. Llegado este momento se debe responder a las tres preguntas anteriores. En este caso se utilizará un modelo muy básico de nómina. 1. ¿Qué se quiere obtener? El sueldo a percibir por cada empleado. 2. ¿Cómo se puede obtener el resultado? El tratamiento que se les debe dar a los datos de los empleados para confeccionar el sueldo a percibir es: Sueldo = Sueldo Base + Complem. + (H. Extras * Precio H. Extra) En los datos de entrada deben estar disponibles todos y cada uno de los valores necesarios para realizar el tratamiento. 3. ¿Qué datos se necesitan? Se debe conocer el Sueldo Base de cada empleado, así como sus Complementos y Número de horas extras del mes. Después de haber respondido a estas preguntas, se tendrá una idea clara de cuál es el problema y del camino que se debe seguir para resolverlo. Elaboró Ing. Edgar Paredes Basilio 3 Apuntes de Principios de Programación Diseño del Procedimiento de Solución. Una vez analizado el problema se precisa diseñar un procedimiento de solución. En la programación imperativa el procedimiento de solución es un algoritmo. Éste se puede definir como un conjunto finito ordenado de pasos que especifican la secuencia de operaciones que se han de realizar para resolver un determinado problema. Es imprescindible que el algoritmo elegido para resolver un problema sea absolutamente claro, sin ningún tipo de ambigüedad y, además, contemple todas y cada una de las posibles situaciones que puedan presentarse durante la resolución del mismo. En general, muchas actividades de la vida cotidiana se pueden describir mediante algoritmos. Para familiarizarse con ellos, se desarrollan a continuación algunos ejemplos que ponen de manifiesto la necesidad de las características mencionadas anteriormente. Ejemplo 1: Si a un experimentado conductor se le preguntase cómo pone en movimiento su coche, no es difícil pensar que su contestación sería: «Pues muy fácil, se pone el motor en marcha, se mete la primera y se acelera poco a poco». Efectivamente es fácil. Pero ¿qué ocurriría si un individuo que no hubiera conducido nunca siguiese estas instrucciones? Elaboró Ing. Edgar Paredes Basilio 4 Apuntes de Principios de Programación Por ejemplo, si el coche tuviese metida una marcha, al arrancar el motor es posible que se estrellara contra el de delante o el de atrás. También se han olvidado detalles porque, por ejemplo, para meter la primera se ha de pisar el embrague y eso es algo que no está detallado en el algoritmo inicial. No se han tenido en cuenta ni todas las posibilidades ni todos los detalles que se pueden presentar para poner el coche en movimiento. Por lo tanto, su algoritmo: 1. Poner el motor en marcha. 2. Meter la primera. No es adecuado. El algoritmo siguiente: 1. Inicio del algoritmo. 2. Si no tiene el freno de mano ponerlo. 3. Pisar el embrague con el pie izquierdo y el freno con el pie derecho. 4. Poner punto muerto. 5. Dar a la llave de contacto. 6. Meter la primera. 7. Quitar el freno de mano. 8. Levantar el pie del embrague a la vez que se pisa el acelerador con el pie derecho. 9. Final del algoritmo. es mucho mejor porque: primero, desglosa el problema en instrucciones simples y concretas, comprensibles para cualquier persona; y segundo, indica claramente el orden en que deben ejecutarse todas las posibilidades. Este ejemplo es un caso típico de un algoritmo con estructura secuencial porque describe la solución en forma de una secuencia única de pasos. Ejemplo 2: ¿Qué se hace cuando se efectúa una llamada telefónica?: 1. Inicio del algoritmo. 2. Descolgar el auricular. 3. Esperar la señal de línea. 4. Marcar el número. 5. Si no comunica el teléfono entonces preguntar por la persona buscada; si comunica llamar en otro momento. 6. Colgar el auricular. 7. Final del algoritmo. En este algoritmo aparece una novedad respecto al ejemplo primero: en el quinto paso Elaboró Ing. Edgar Paredes Basilio 5 Apuntes de Principios de Programación hay una instrucción alternativa que dependiendo de una condición (que esté la persona buscada) ejecuta una acción u otra. Por tanto, ha aparecido una estructura condicional que describe las posibles alternativas del procedimiento. Ejemplo 3: ¿Qué ocurriría si una persona estuviera esperando una carta urgentemente? Revisaría varias veces al día su buzón hasta que estuviera la carta. El algoritmo es: 1. Inicio del algoritmo. 2. Coger las llaves del buzón. 3. Ir al buzón del portal. 4. Abrir el buzón. 5. Si está la carta dentro del buzón, cogerla. 6. Repetir los pasos 2, 3, 4 y 5 hasta que esté la carta. 7. Final del algoritmo. Un grupo de acciones se repite varias veces hasta que se cumpla la condición. En este caso se repite la búsqueda de la carta en el buzón hasta que ésta haya llegado. Se podría afirmar entonces que se está ante una estructura repetitiva. Después de haber visto las posibles estructuras de las instrucciones de un algoritmo se puede construir el algoritmo para el problema de la gestión de nóminas: 1. Inicio del algoritmo. 2. Seleccionar un empleado. 3. Sumar su Sueldo Base y sus Complementos. 4. Si ha hecho horas extras entonces sumar las horas extras al valor obtenido en el paso 4, de lo contrario no sumar. 5. Imprimir la nómina del empleado. 6. Repetir los pasos 2, 3, 4 y 5 hasta que no haya más empleados. 7. Final del algoritmo. Observe que este algoritmo utiliza las estructuras secuencial, condicional (paso 4) y repetitiva (paso 6). Elaboró Ing. Edgar Paredes Basilio 6 Apuntes de Principios de Programación Se puede afirmar que cualquier algoritmo puede ser expresado empleando solamente estas tres estructuras. Según se deduce de estos ejemplos, se pueden concretar más formalmente las características y partes fundamentales que debe tener todo buen algoritmo: - Un punto de inicio. - Un punto de finalización. - Estar bien definido, es decir, si se sigue varias veces el algoritmo con los mismos datos de entrada, se debe obtener el mismo resultado. - Tener en cuenta todas las posibles situaciones que puedan plantearse. - Ser efectivo, esto es, resolver el problema para el que fue diseñado. - Ser de fácil lectura e interpretación. - Ser finito, y muy finito terminando en algún punto tanto en su escritura como en su ejecución. - Estar escrito en menos instrucciones de las que se ejecutan (gracias a las instrucciones repetitivas). - Estar diseñado de forma que sea independiente del lenguaje de programación en que vaya a ser expresado. Escritura de la solución en un lenguaje: programa La computadora ha de ser capaz de entender el algoritmo que se ha escrito. Para ello se tiene que escribir éste en un lenguaje que la computadora sea capaz de entender. Existe un gran salto entre el lenguaje que se ha utilizado para escribir el algoritmo y el lenguaje que la computadora entiende. Para minimizar esta diferencia y ayudar a la escritura de programas se han creado los lenguajes de alto nivel. Un lenguaje de alto nivel se encuentra entre el hombre y la computadora, siendo Elaboró Ing. Edgar Paredes Basilio 7 Apuntes de Principios de Programación entendible por ambos. Permite escribir un algoritmo en un lenguaje que es entendible por los humanos y también por la computadora. Existen muchos lenguajes de programación, pero no todos son de alto nivel. Entre los más conocidos de alto nivel están: Cobol, Fortran, C, Pascal, Modula 2, etc. Un algoritmo escrito en un lenguaje de programación es lo que se conoce con el nombre de programa. Esta es la definición según la programación algorítmica. Ahora bien, existen otros tipos de programación que se verán más adelante en los que el algoritmo no es la base de un programa. Para aumentar la eficacia de la programación se necesita que los programas tengan una estructura fácil de interpretar, de modo que los haga más comprensibles, manejables, modificables y fiables. A este proceso de escritura del algoritmo con un lenguaje de programación se le denomina codificación. Consiste en escribir un algoritmo (descrito con palabras) en un lenguaje informático que la computadora es capaz de «comprender» (lenguaje de alto nivel). Más adelante se verá cómo la computadora es capaz de «entender» estos lenguajes de alto nivel, puesto que necesitan de un proceso de traducción que los convierta al lenguaje máquina, que es el único lenguaje que realmente la computadora entiende. ¿Qué pasos sigue la computadora para ejecutar un programa? Una vez que el programa ha sido introducido en la computadora y el programador ha comprobado su corrección es el momento para que la computadora lo traduzca a su lenguaje y lo ejecute. Pero ¿qué ocurre?, ¿qué pasos ha de seguir la computadora para ejecutarlo? Se parte de un programa que está escrito con un lenguaje de alto nivel y se quiere que la computadora sea capaz de ejecutarlo. Por tanto, el objetivo es conseguir que un programa entendible para los hombres lo sea para la computadora. Esto se consigue traduciéndolo al único lenguaje que la computadora entiende: el lenguaje máquina. Este lenguaje está formado por un conjunto de unos y ceros. Se verán a continuación los pasos que sigue la computadora hasta conseguir ejecutar el programa. La manera de realizar esta traducción es a través de otros programas llamados intérpretes o compiladores que se encargan de leer el código y de traducirlo al lenguaje ensamblador. En el caso de los intérpretes, la traducción se realiza cada vez que se tiene que ejecutar una orden, y en el caso de los compiladores primero se traducen todas las órdenes y luego se comienza la ejecución del programa. El lenguaje ensamblador es un estadio intermedio entre los lenguajes de alto nivel y el lenguaje máquina. Simplifica la programación al no tener que escribir los programas directamente en lenguaje máquina, sino que se pueden emplear sencillas Elaboró Ing. Edgar Paredes Basilio 8 Apuntes de Principios de Programación instrucciones, formadas por códigos de instrucción y nombres simbólicos para designar a los datos, que son más comprensibles por los programadores. Una vez que se tiene el programa traducido a lenguaje ensamblador se necesitan tres herramientas para convertirlo a lenguaje máquina y ejecutar éste: el Programa Ensamblador, el Montador y el Cargador. El Programa Ensamblador se encarga de realizar el proceso de traducción, necesario para convertir un programa fuente en ensamblador en un programa objeto en lenguaje máquina, es decir, ceros y unos. Es conveniente dividir los programas a desarrollar en pequeños módulos que se codifiquen y se pongan a punto de forma independiente. La ventaja de esta solución consiste en que no hay que repetir el proceso de ensamblaje de módulos no modificados y su inconveniente es que la salida producida no es un código que pueda ejecutar la máquina, puesto que hay que coordinar los distintos módulos entre sí. El Programa Montador se encarga de coordinar los distintos módulos, creando uno único que ya es ejecutable por la computadora, puesto que tiene todo lo necesario para ser cargado en memoria principal. El Programa Cargador tiene como misión llevar a memoria principal el resultado del montador, para proceder a su ejecución. Una vez que el programa y los datos residen en la memoria principal, la secuencia básica de ejecución del programa se compone de los siguientes pasos, que se repiten sucesivamente: - La computadora lee de memoria principal una instrucción o sentencia del programa. - La unidad de control interpreta la instrucción leída. - Bajo los mandatos de la unidad de control se ejecuta la instrucción. Así, la computadora irá recorriendo el programa cargado en memoria y ejecutando las instrucciones escritas (en código máquina). Una vez que el programa ha sido introducido en la computadora y el programador ha comprobado su corrección, es el momento para que la computadora lo traduzca a su lenguaje y lo ejecute. Pero, ¿qué ocurre?, ¿qué pasos ha de seguir la computadora para ejecutarlo? Se parte de un programa que está escrito con un lenguaje de alto nivel y se quiere que la computadora sea capaz de ejecutarlo. Por tanto, el objetivo es conseguir que un programa entendible para los hombres lo sea para la computadora. Elaboró Ing. Edgar Paredes Basilio 9 Apuntes de Principios de Programación Pruebas y documentación El hecho de haber diseñado un buen algoritmo y posteriormente haberlo codificado en un lenguaje de programación no significa que el programa resuelva correctamente el problema. La experiencia de cualquier programador, por muy experto que sea, lo demuestra. Por eso, antes de dar por finalizada cualquier labor de programación, es indispensable preparar un conjunto de datos de entrada lo más amplio posible, que aplicado al programa permita la verificación de los resultados. Este proceso se conoce como de pruebas. Cuanto más exhaustivas sean las pruebas de un programa, mayor seguridad se tendrá de que éste funciona correctamente y, por lo tanto, mayores probabilidades habrá de evitar la ardua tarea de revisar un programa antiguo. Una vez finalizado y probado un programa, debe procederse al proceso de documentación. Su objetivo es que cualquier programador sea capaz de entenderlo, e incluso modificarlo en caso de necesidad, aunque no haya sido el autor del mismo. Una correcta documentación debe contener: - Descripción del problema. - Descripción de los datos de entrada. - Descripción de los resultados de salida. - Descripción del algoritmo. - Listado del programa fuente en su lenguaje de programación. - El juego de ensayo que haya permitido probar el programa. Esta documentación se conoce con el nombre de Cuaderno de Carga del programa. Elaboró Ing. Edgar Paredes Basilio 10 Apuntes de Principios de Programación LA PROGRAMACIÓN Y LOS LENGUAJES INFORMÁTICOS Una vez que se ha visto cómo abordar un problema y cómo escribir un algoritmo que lo modele se verán a continuación las herramientas de que se dispone, los lenguajes de programación para programar un algoritmo, cómo construir un programa, y cómo programarlo utilizando pseudocódigo. ¿Por qué la Diversidad de Lenguajes Informáticos? La primera pregunta que uno se plantea cuando descubre que existe un gran número de lenguajes de programación es ¿por qué tantos?, ¿por qué no diseñar un lenguaje estándar aceptado por todos? Se podría establecer un símil con la Industria Automovilística, ¿por qué hay tantos modelos y tipos de coches?, ¿por qué no tener un único modelo de cada tipo de coche? Existen distintos tipos de vehículos porque cada uno de ellos está más capacitado para satisfacer las necesidades de los usuarios en cada caso, por ejemplo, para transportar grandes cargas no se empleará un utilitario pequeño, sino que se utilizará un camión de gran resistencia. Por otro lado, a pocas personas se les ocurriría ir a trabajar a la oficina en el centro de la ciudad con un camión, sino que utilizarán un coche más pequeño. Se empleará un vehículo para cada tipo de problema, aquel que se adapte más a las características del transporte. También es cierto que los vehículos han ido mejorando sus prestaciones, apareciendo modelos y tipos distintos que satisfagan más a los usuarios, que les ofrezcan mayor seguridad, menor consumo, mayor confortabilidad, etc. De ahí que sea imposible que exista un único vehículo, puesto que para algunos usuarios este vehículo podría ser demasiado básico y para otro demasiado sofisticado. La diversidad de modelos, por tanto, también se debe a la diversidad humana. Por último, no hay que olvidar en ninguno de los dos campos (Informático y Automovilístico) el aspecto comercial que subyace: los productos se desarrollan para ser vendidos y cuantos más haya, más posibilidades de venta existen. Realmente, éste es uno de los factores principales por los que existe una gran diversidad de lenguajes de programación. El símil anterior lleva a deducir, en primer lugar, que existen distintos tipos de lenguajes de programación porque cada uno de ellos está especificado para resolver un grupo de problemas con características similares. En segundo lugar, los lenguajes de programación han ido evolucionando hacia una mayor facilidad, flexibilidad y potencia. Por esto, han ido apareciendo distintos tipos de lenguajes que ofrecen una funcionalidad mayor y generalmente una filosofía de programación novedosa. Por último, las compañías que diseñan software están muy interesadas en tener muchos lenguajes de programación en el mercado porque esto les reportará más beneficios económicos. Esta es la tercera razón de por qué existen tantos lenguajes de programación. Elaboró Ing. Edgar Paredes Basilio 11 Apuntes de Principios de Programación TIPOS DE LENGUAJES INFORMÁTICOS Por ahora, existen cuatro tipos fundamentales de lenguajes de programación: 1. Lenguajes de Programación Imperativa 2. Lenguajes de Programación Funcional 3. Lenguajes de Programación Lógica 4. Lenguajes de Programación Orientados a Objetos Lenguajes de Programación Imperativa Supóngase que se quiere escribir un programa que calcule el resultado de elevar un número A a otro B (AB). Si se supone que B es un número entero, entonces el cálculo se puede hacer multiplicando el número A por sí mismo tantas veces como indique el número B. El algoritmo sería: 1. Inicio del algoritmo. 2. Introducir A y B ( A - Base, B - Potencia). 3. Multiplicar A por A y dejar el resultado en A. 4. Restar 1 a B. 5. Repetir los pasos 3 y 4 hasta que B sea igual a CERO. 6. Mostrar el resultado. 7. Fin del algoritmo. Los lenguajes de Programación Imperativa son los más difundidos y son adecuados para resolver aquellos problemas que tienen soluciones expresables en un algoritmo. Para este tipo de lenguajes un programa se puede expresar como sigue: Programa = Algoritmo + Estructuras de Datos Es decir, está compuesto de un algoritmo que represente o describa cómo hay que resolver el problema y de las estructuras de datos necesarias para almacenar la información. En el ejemplo de la gestión de nóminas, el algoritmo describe cómo se tiene que calcular el valor del sueldo de cada empleado y las estructuras de datos almacenan los valores necesarios para calcular el sueldo (sueldo base, número de horas extras, etc.). Las características de estos tipos de lenguajes son las siguientes: — Procedimentales: en el sentido de que describen cómo se ha de resolver el problema y no qué problema es. Elaboró Ing. Edgar Paredes Basilio 12 Apuntes de Principios de Programación — Deterministas: en el sentido de que se tienen siempre los mismos resultados del programa para las mismas entradas. Es decir, si se calcula el sueldo para un empleado varias veces, los resultados de salida siempre serán los mismos, puesto que los datos de entrada siempre son los mismos. — Necesitan de la existencia de un proceso que traduzca el código al lenguaje que entiende la computadora (lenguaje máquina). — Algorítmicos: como ya se ha visto, expresan cómo resolver el problema mediante un algoritmo. Dentro de este grupo están los lenguajes Pascal, Modula-2, ADA, C, Basic, Cobol y Fortran. Lenguajes de Programación Funcional Cuando se quiere resolver un problema con un lenguaje funcional, no se tiene que construir un algoritmo que exprese cómo se tiene que resolver el problema, sino que se tienen que describir los elementos (funciones) que van a servir para resolverlo. Para resolver el problema anterior de la potenciación, se deberían construir únicamente dos funciones: La función Potencia y la función Producto. En pseudocódigo, la definición de estas dos funciones sería: Potencia de A y B es el Producto de A por la Potencia de A y B-1 Potencia de A y 1 es A Producto de A y A es A*A y la descripción de las funciones es: Potencia(A,B) = Producto[A,Potencia(A,B 1)] Potencia(A,1)=A Producto(A,A)=A*A Es decir, se define la función Potencia(A,B) diciendo que es el Producto de A por la Potencia de A y B-1. Esta forma de definir un problema es recursiva, porque se expresa Potencia(A,B) en función de Potencia(A,B-1). Pero ¿cómo se calcula el valor, por ejemplo, de 43? Para calcular el valor de 43, se necesita interpretar la frase (llamada a una función) Potencia(4,3), para ello se deben desarrollar y resolver todas las llamadas recursivas a la función Potencia y a Producto. Potencia(4,3)=Producto[4,Potencia(4,2)] = 4 * 16 = 64 Producto[4,Potencia(4,1)] = 4 * 4 = 16 Es como deshacer un ovillo en el que para resolver Potencia(4,3) se necesita primero Elaboró Ing. Edgar Paredes Basilio 13 Apuntes de Principios de Programación resolver Potencia(4,2) y así hasta que se llegue a Potencia(4,1) que ya no está definida recursivamente. Como ya se ha llegado a un valor concreto denominado base de la recursión [Potencia(4,1)=4] se puede ir hacia atrás e ir resolviendo las llamadas a funciones que quedaron pendientes. Al llegar a la primera llamada [Potencia(4,3)] se obtendrá el valor de la potencia. Un programa, en este caso, puede expresarse del siguiente modo: Programa = Funciones + Estructuras de Datos Las características de estos lenguajes son: — Su base es la recursividad, puesto que las funciones se definen de forma recursiva. — Las funciones son los elementos principales de los programas. — Son lenguajes interpretativos: necesitan de un proceso de interpretación (traducción) para que sea comprensible a la computadora. — Son lenguajes deterministas: en el sentido de que se tienen siempre los mismos resultados del programa para las mismas entradas. Al ser lenguajes con una componente matemática alta su mejor campo de aplicación es el científico, y por su facilidad de búsqueda es el más usado en Inteligencia Artificial. Por tanto, su aceptación y utilización es principalmente en entornos de investigación y docencia. Los lenguajes más representativos dentro de este grupo son Lisp, Camel y Hope. Lenguajes de Programación Lógica En este caso se definen los programas en función de un conjunto de reglas y asertos (afirmaciones). Para obtener resultados de un programa, se hacen preguntas a la computadora, y ésta, en función de las reglas y afirmaciones que tiene almacenadas, responde. La «inteligencia» de la computadora reside en la manera que tiene de interpretar y encadenar las conclusiones de las reglas. Esto se hace con lo que se denomina el motor de inferencia. Imagínese que se tiene un programa con las siguientes reglas y afirmaciones: Regla 1. Regla 2. Supervisor(x,y) : - jefe(x), empleado(y) ´x´ es Supervisor de ´y´, si ´x´ es jefe e ´y´ es empleado Supervisor(x,y) : - jefe(x), secretaria(y) ´x´ es Supervisor de ´y´, si ´x´ es jefe e ´y´ es secretaria Aserto 1. Empleado(Juan) Aserto 2. Empleado(Luis) Juan es un empleado Luis es un empleado Elaboró Ing. Edgar Paredes Basilio 14 Apuntes de Principios de Programación Aserto 3. Secretaria(Rosa) Aserto 4. Jefe(Pedro) Aserto 5. Jefe(Julio) Rosa es secretaria Pedro es Jefe Julio es Jefe Se pueden hacer preguntas como: 1. ¿Está Rosa supervisada por Julio? La respuesta sería que SI porque existe una regla que dice que si alguien es Jefe, supervisa a las secretarias (regla 2), y como Julio es Jefe (aserto 5) y Rosa es secretaria (aserto 3), el motor de inferencia del lenguaje deduciría que la respuesta es afirmativa. 2. ¿Quién supervisa a quién? La computadora, de acuerdo a las reglas y afirmaciones existentes, deduciría que como Pedro y Julio son Jefes supervisan a Juan, Luis y Rosa que son empleados y secretarias. Por tanto, un programa se compone de: Programa = Reglas + Asertos + Estructuras de Datos + Control El Control lo proporciona el motor de inferencia, que es el que realmente «razona» y obtiene resultados a partir de las reglas y asertos existentes. Las características de estos lenguajes son: — Se describe qué problema ha de resolverse, no cómo resolverlo. — Son lenguajes conversacionales, es decir, es como si la computadora fuera una persona a la que se le pregunta de acuerdo a un lenguaje de interrogación definido y responde con las conclusiones que obtiene. — Son lenguajes recursivos, la definición de las reglas generalmente se realiza, al igual que en los lenguajes funcionales, de forma recursiva. Este tipo de lenguaje informático es muy utilizado en áreas como la Inteligencia Artificial, puesto que tratan de simular la forma de razonamiento humano. El más representativo de todos es Prolog, aunque también hay otros como Alice. Lenguajes de Programación Orientada a Objetos La Programación Orientada a Objetos constituye otra forma de pensar cómo resolver algunos de los problemas planteados en el mundo de la Informática. En la programación orientada a objetos se examina el universo del problema en términos de «entidades» y de relaciones entre esas «entidades». Estas «entidades» se eligen porque tienen algún límite fisico o conceptual que los separa del resto del problema. Por ejemplo, si se está tratando de describir un problema de simulación de un aparcamiento en la computadora, se tendrán las siguientes entidades independientes entre sí, los coches, las plazas de aparcamiento y los puestos de «peaje». Elaboró Ing. Edgar Paredes Basilio 15 Apuntes de Principios de Programación Las entidades son representadas como objetos en el programa. El objetivo es tener una correspondencia entre entidades en el problema físico y objetos en el programa. Dentro de cada objeto está almacenada toda la información representativa del objeto (variables) y todas las operaciones que se pueden realizar con ese objeto (métodos o funciones). A esta particularidad se la denomina encapsulación de datos y funciones dentro de un objeto. Por ejemplo, el objeto puesto de peaje del ejemplo anterior tendrá como datos: su Estado (abierto/cerrado/averiado) y el estado del aparcamiento (libre/completo). Como funciones tendrá todas aquellas que se puedan realizar en la realidad, como: Abrir el peaje, Cerrar el peaje, Recoger ticket, Dar ticket e Informar del estado del aparcamiento. Si se quisiera crear un aparcamiento, se debería declarar cuántos objetos se tienen y de qué tipo son. Suponiendo que se tienen tres peajes, veinte coches y treinta plazas, se debería declarar la existencia de todos estos objetos. Cada objeto del tipo Puesto de Peaje tiene una variable del tipo Estado y en cada uno de ellos puede tener un valor distinto, puesto que aunque sean objetos de igual tipo, el estado en el que se encuentran sus valores no tiene porqué ser igual. Cuando se quiera ejecutar una función de un objeto, sólo se tendrá que hacer una llamada a esa función del objeto mediante el envío de un mensaje al objeto correspondiente, con el nombre de la función que se desee ejecutar. Si, por ejemplo, entrara un coche por la puerta de peaje, se debería hacer una llamada a la función Dar ticket, a continuación hacer otra llamada a Abrir peaje, y por último a Cerrar peaje. Como ha entrado un coche, se deberá crear otro objeto que almacenase el número de matrícula del coche, el tipo, etc., todos aquellos datos que encapsulara el objeto Coche. Una característica importante dentro de estos lenguajes es la herencia, concepto análogo al de la Biología. Se pueden declarar objetos que sean «hijo» de otro objeto, de manera que hereden todas las propiedades de su «padre». Así, se define una jerarquía de herencias que ayudan a describir los problemas. Por ejemplo, se puede definir un objeto Mamífero, que represente las características comunes de los mamíferos y, posteriormente, se puede definir un objeto Oso, «hijo» del objeto Mamífero, del que hereda todas sus características y añade otras propias de oso. De esta forma, se evita la repetición de las características comunes de los mamíferos en todas las especies que lo sean. Un fuerte atractivo de los lenguajes orientados a objetos es que ofrecen una mayor reutilización. Se facilita la modificación y reutilización de un programa después de haber sido construido y utilizado. Por tanto, un programa de este tipo puede expresarse como sigue: Programa = Objetos + Mensajes Las características de estos lenguajes son: — Están orientados a reutilizar el software que desarrollan, con el fin de resultar más sencilla la modificación de los programas y sobre todo que sean útiles para ser utilizados Elaboró Ing. Edgar Paredes Basilio 16 Apuntes de Principios de Programación completa o parcialmente «a posteriori».. — Son compilativos, es decir, precisan de un proceso de compilación para poder ser ejecutados. — Son objetuales no procedimentales, es decir, se basan en los objetos y no en los procedimientos (algoritmos). A diferencia de los lenguajes imperativos en los que se trataba de encontrar un método (procedimiento o algoritmo) para resolver el problema, aquí se trata de encontrar los objetos necesarios para modelizar el problema. El concepto de objeto es muy similar al de Marco en Inteligencia Artificial, del cual procede. Uno de los primeros lenguajes orientados a objetos fue Smalltalk. En la actualidad está más difundido el lenguaje C++, adaptación del lenguaje C a los conceptos de orientación a objetos. ¿CÓMO CONSTRUIR PROGRAMAS? En la primera parte se vio una forma de cómo abordar un problema a través de la computadora, en concreto el enfoque imperativo, y cómo construir un algoritmo que lo resolviera. Siguiendo esta línea (enfoque imperativo) sólo queda construir el programa que represente a ese algoritmo. Supóngase ahora que el problema a resolver es el de calcular el área de una circunferencia. Lo primero que se tiene que hacer es analizar el problema. Para ello, como ya se vio, se debe responder a las tres preguntas siguientes: ¿Qué se quiere obtener? ¿Cómo se obtiene el resultado? ¿Qué datos se necesitan? El área de la circunferencia Multiplicando P por el cuadrado del radio El radio de la circunferencia. Debido a la forma de pensar del ser humano, se debe responder a estas tres preguntas en el orden en que han sido escritas anteriormente. Sin embargo, el orden en la computadora es distinto porque necesita primero los datos para luego procesarlos y, por último, mostrar los resultados. El orden sería el siguiente: 1. Entrada de datos. 2. Proceso de datos. 3. Salida de resultados. Por tanto, el algoritmo visto desde esta perspectiva es: 1. Pedir el valor del radio. 2. Multiplicar el valor del radio, elevado al cuadrado, por la constante p (área= p*radio^2). 3. Escribir el valor del área. Estas acciones, representadas en un formato más cercano a un lenguaje de programación que al lenguaje humano, serían: Elaboró Ing. Edgar Paredes Basilio 17 Apuntes de Principios de Programación 1º Pedir_valor( radio ); 2º Area = PI * radio2; 3º Escribir_valor( Area ); La primera línea le indica a la computadora que tiene que pedir y recibir el valor del radio. Este valor será almacenado en una variable llamada radio. Una variable es como un pequeño cajón que coincide con una dirección de memoria donde se guardan valores. De manera que radio es el nombre del cajón donde está guardado el valor del radio. Por lo tanto, cuando se utilice la palabra radio se estará refiriendo al valor que contiene el cajón con ese nombre. La segunda línea indica la operación que hay que realizar con los datos: elevar al cuadrado el valor de radio y multiplicarlo por el valor de la constante PI. Una constante es otro tipo de cajón para guardar valores, pero que no varían nunca, por ejemplo, el valor de PI. Por último, la tercera línea indica a la computadora que muestre de alguna forma, ya sea por la pantalla o por la impresora, el valor del área calculada. Una visión más completa del programa, aunque no escrito con las reglas de ningún lenguaje de programación, sería la siguiente: Inicio Variable radio, Area Constante PI=3.14159 Pedir_valor( radio ) Area = PI x radio2 Escribir_valor( Area ) Final Obsérvese las partes que componen el programa: — Declaración de variables y constantes: en esta sección se le indican a la computadora las variables y constantes que van a existir en el programa. En el ejemplo se han declarado dos variables (radio y Area) y una sola constante (PI). — Petición de datos: instrucciones que indican a la computadora que pida y reciba los valores de los datos, que quedarán en cajones (variables) con sus nombres correspondientes. En el ejemplo sólo se pide un dato, el radio. — Proceso: instrucciones que indican a la computadora qué operaciones debe realizar con los datos y qué nombre debe asociar al resultado. En el ejemplo, el resultado del proceso queda asociado a la variable Area. Por tanto, en el cajón con el nombre Area se queda el resultado de la operación PI * radio2. La instrucción que realiza el proceso de datos es Area = PI * radio2. El signo = tiene aquí el sentido de guardar en la variable de la izquierda del signo «=» el resultado de la derecha. A esto se le llama asignación. — Escritura del resultado: instrucciones para mostrar el resultado. Por ejemplo, Escribir_valor( Area). Aunque no es objetivo en este momento profundizar en la forma de escribir el problema Elaboró Ing. Edgar Paredes Basilio 18 Apuntes de Principios de Programación del ejemplo en un lenguaje de programación, a continuación se muestra cómo quedaría en un tipo de PASCAL y en C. Lenguaje PASCAL: PROGRAM Const PI=3.14159; Var radio, Area: INTEGER; BEGIN read ( radio ); Area := PI * ( radio ** 2); write ( Area ); END. Lenguaje C: main () { const float PI=3.14159; int radio, Area; scanf (“%d”, &radio ); Area = PI * ( radio * radio); printf (“%d\n”, Area ); } Obsérvese que los dos programas tienen muchos puntos en común. Tienen un punto de inicio (en PASCAL es PROGRAM y en C es main) y de fin (en PASCAL es END y en C es el corchete }). También se dividen en las mismas tres partes (entrada, proceso y salida de datos) e incluso el proceso se realiza con una instrucción casi igual (en PASCAL es Area := PI * (radio ** 2) y en C es Area = PI * (radio * radio)). Tienen algunas diferencias como, por ejemplo, la forma en que se eleva al cuadrado el radio es distinta, también lo es la forma de las instrucciones de entrada y de salida de datos. Pero la mayor diferencia reside en la dificultad de legibilidad, el programa en PASCAL es más fácil de leer y entender que el de C. Elaboró Ing. Edgar Paredes Basilio 19 Apuntes de Principios de Programación ELEMENTOS DE PROGRAMAS Las computadoras disponen de un repertorio de instrucciones, más o menos amplio, capaces de realizar operaciones aritméticas, lógicas, de control, de entrada, de salida, etc. Es preciso dar especificaciones que determinen las instrucciones que se deben de ejecutar, así como la secuencia en que se aplicarán. Esto es lo que constituye un programa, es decir, la información comunicada a la computadora en forma de un conjunto de instrucciones con las que se le dice, exactamente, lo que debe hacer y cómo debe hacerlo. Recordando siempre que esta definición corresponde a la programación imperativa. A continuación, se van a describir los elementos básicos que sirven para escribir programas. Datos: definiciones y tipos Si se quiere construir un programa de automatización de nóminas, se necesita almacenar de alguna manera los nombres de los empleados, sus respectivos DNI´s, si hicieron horas extras, etc. Todos estos datos han de ser guardados en la computadora empleando alguna de las formas siguientes. Caracteres Un carácter es el elemento más pequeño utilizado en el tratamiento de la información. Los caracteres pueden ser: — Alfabéticos: (A, B, ... ,Z, a ,b , ... ,z). — Numéricos: (0, 1, ... , 9). — Especiales: (+, -, *, /, ., ;, <, >, ...). En el ejemplo, el nombre de un empleado estará formado por una secuencia de caracteres alfabéticos, su DNI por caracteres alfanuméricos (mezcla de caractereres alfabéticos y numéricos), etc. Dato Un dato es un carácter o conjunto de caracteres que representa el valor que toma una variable con la que opera la computadora. Existen cuatro tipos de datos simples: — Alfabéticos: están compuestos por caracteres alfabéticos y el carácter blanco. Cuando se quiera escribir el nombre de un empleado. la ciudad donde reside, etc., se emplearán caracteres alfabéticos, puesto que estos datos están formados únicamente por letras. Ejemplo: «Luis Gutiérrez Beltrán» «México» Elaboró Ing. Edgar Paredes Basilio 20 Apuntes de Principios de Programación — Numéricos: están compuestos sólo de caracteres numéricos, el punto decimal y el signo. Se emplearán datos numéricos para almacenar el sueldo base de un empleado, el número de horas extras trabajadas, etc. Es decir, aquellos datos que sólo contengan números. Ejemplo: 3.650.000 25 — Alfanuméricos: están compuestos por una mezcla de los dos anteriores (alfabéticos y numéricos). Se emplearán cuando el dato a representar no pueda ser definido sólo con números o con letras. Así, por ejemplo, si se quiere almacenar la dirección completa de un empleado se necesitará un dato alfabético que corresponde al nombre de la calle y también un dato numérico del número y piso donde vive la persona. Ejemplo: «Fuenterrabía, número 4-7.° Izquierda» «Raimundo Fernández Villaverde, 115» — Lógicos y booleanos: en algunos lenguajes de programación se admite también la utilización de los llamados datos lógicos, cuya característica principal es que únicamente pueden tomar dos valores: Cierto (True) o Falso (False). Este tipo de datos se emplea, por ejemplo, cuando se quiere almacenar si un empleado ha realizado horas extras, puesto que si es así se podrá almacenar como True, que sería como decir o almacenar Sí, y en caso contrario False que equivale a No. Constantes y variables La Constante es un dato cuyo valor permanece inalterado durante la ejecución de un programa. Se emplea para definir aquellos datos que siempre van a mantenerse invariables. Por ejemplo, se podría definir como valor constante el valor de PI o el número de meses que tiene un año. Ejemplo: La constante numérica Pi: 3.14 Número de meses de un año: «12» La Variable es un dato cuyo valor puede ser modificado durante la ejecución del programa. Una variable es una dirección de memoria y puede verse como una pequeña caja donde se pueden guardar valores. Estos pueden ser de cualquiera de los tipos vistos anteriormente (numéricos, alfabéticos, alfanuméricos, etc.). De esta manera, si se tiene una variable de nombre Sueldo podrá almacenar cualquier valor para el sueldo. Por tanto, Sueldo es el nombre de la caja donde está guardado el valor del sueldo y cuando se utilice la palabra sueldo se estará refiriendo al valor que contiene la caja. Cuando se hace mención a una variable, se está refiriendo a una pequeña zona de la Elaboró Ing. Edgar Paredes Basilio 21 Apuntes de Principios de Programación memoria principal (conjunto de posiciones contiguas) donde se va a alojar un valor. Si este valor se modifica en algún momento del programa, el nuevo valor sustituirá al que existía anteriormente. Al conjunto de posiciones contiguas de memoria se le da un nombre para poder identificarlo (nombre de la variable) y se define su tipo (clase de caracteres que puede contener). A una variable definida de un determinado tipo, no se le pueden asignar generalmente valores de otro tipo. Por ejemplo, la variable Sueldo que contiene números no podría contener el nombre del empleado porque son letras. El nombre que se le da a una variable lo elige el programador y estará formado por letras de la A a la Z, números del 0 al 9 y el carácter «-» y no se podrán intercalar espacios en él. Dado que en cada programa se utiliza un gran número de variables, es muy importante que el nombre que se asigne a cada una de ellas recuerde la naturaleza de la información que va a contener, es decir, sea lo más nemotécnico posible. Por ejemplo, si una variable va a guardar el total de horas extras trabajadas, se le podría llamar HorasExtras, o TotalExtras. Hay que diferenciar claramente entre lo que es el nombre de la variable y su contenido: el nombre de una variable es un identificativo que se le da a un conjunto de posiciones contiguas de memoria (es el nombre que se le da a la caja), mientras que el contenido de una variable es el valor que está almacenado en dichas posiciones (es el contenido de la caja). La memoria principal de la computadora se puede comparar, en cierto modo, con los cajetines de correos que existen en las casas de vecinos. El conjunto de casilleros sería la memoria principal y cada variable se podría asociar a un casillero. Cuando el cartero reparte la correspondencia, localiza a cada vecino por el nombre que aparece en cada cajetín (nombre de la variable) e introduce una carta en él (contenido de la variable). EJEMPLO: Supóngase que se tienen tres variables distintas, con los siguientes valores: TotalSueldo = 0 SueldoBase = 2.000.000 HorasExtras = 300.000 Si se quiere calcular el sueldo de un empleado, se deben sumar los valores de las variables SueldoBase y HorasExtras y asignar el resultado a la variable TotalSueldo. TotalSueldo = SueldoBase + HorasExtras. El estado final de las variables es el siguiente: TotalSueldo = 2.300.000 SueldoBase = 2.000.000 HorasExtras = 300.000 Como se ve, el valor de TotalSueldo ha variado, puesto que ahora tiene el valor de la Elaboró Ing. Edgar Paredes Basilio 22 Apuntes de Principios de Programación suma de las otras dos variables. La única variable que modifica su valor es TotalSueldo, quedando el valor del resto de las variables inalterado. Operadores Para poder realizar operaciones matemáticas, lógicas, etc., con las variables, se necesita usar los operadores. Principalmente, se utilizan de tres tipos: Aritméticos, Relacionales y Lógicos. — Aritméticos: son utilizados para representar operaciones de tipo matemático. + * / ** Suma Resta Multiplicación División Potenciación Cuando se quiera obtener el número de horas extras trabajadas se tendrá que multiplicar las HorasExtras por el PrecioHora, esto se representa como HorasExtras * PrecioHora. La notación no es común a todos los lenguajes de programación, sino que cada uno de ellos escribe algunos operadores de distinta manera. — Relacionales: sirven para representar condiciones de comparación entre valores, ya sean numéricos o alfabéticos. = < <= > >= <> Igual a Menor que Menor o igual que Mayor que Mayor o igual que Distinto de En el problema pueden ser útiles cuando se quiere expresar, por ejemplo, que a partir de un determinado SueldoBase, la retención es de un tanto por ciento determinado. Por ejemplo, cuando el SueldoBase > 2.000.000. En algunos lenguajes el operador «=» se usa no como operador relacional sino como operador que asigna un valor a una variable. Por ejemplo, el lenguaje C. De esta forma, la expresión SueldoBase = 2.000.000 no compara el contenido de la variable SueldoBase con 2.000.000 sino que asigna ese valor a la variable SueldoBase. El operador «Igual a» en C es «= =». Si se quisiera realizar esta comparación se debería escribir la expresión SueldoBase = = 2.000.000. — Lógicos: se emplean para expresar la lógica de condiciones, que existen en un problema de cualquier tipo. Elaboró Ing. Edgar Paredes Basilio 23 Apuntes de Principios de Programación NOT AND OR - NO Y O EJEMPLO: Se podría tener una regla que dijera: si el Sueldo Base no es mayor que 2.000.000 y además el número de horas que el empleado trabajó no es superior a 100, entonces la retención fiscal será del 23 %. Para que esta regla se pueda modelizar se ha de recurrir a los operadores lógicos: Si ( ( Sueldo Base < 2.000.000) AND ( NOT ( Horas Extras > 100)) Una expresión es una combinación de constantes, variables, operadores y paréntesis. En una expresión, los operadores se evalúan según el siguiente orden de prioridad: 1. Paréntesis. Si hay paréntesis anidados se procede primero con los más internos. 2. Potenciación. 3. Producto y división. 4. Suma y resta. 5. Operadores Relacionales. 6. Operadores Lógicos. Aquellos operadores que tienen el mismo orden de prioridad se evalúan de izquierda a derecha. Ahora bien, la prioridad de los operadores lógicos puede variar de unos lenguajes de programación a otros. Evaluación de una expresión en la que se tiene todo tipo de operadores. EJEMPLO: Evaluación de una expresión en la que se tiene todo tipo de operadores. (3*3)> 9> 9> 9> 9> CIERTO CIERTO CIERTO 8 8 8 8 8 AND AND AND AND AND AND AND AND (6-1) (6-1) 5 5 10 10 *2 *2 *2 *2 FALSO FALSO FALSO <8 <8 <8 <8 <8 <8 OR OR OR OR OR OR OR OR OR 2**3 2**3 2**3 8 8 8 8 = = = = = = = 8 8 8 8 8 8 8 CIERTO CIERTO CIERTO El resultado final de la evaluación de esta expresión es que es cierta. Elaboró Ing. Edgar Paredes Basilio 24 Apuntes de Principios de Programación Instrucciones Como ya se enunció anteriormente, un algoritmo es un conjunto de acciones que han de ejecutarse para la resolución de un problema. A cada una de estas acciones se le denomina Instrucción o Sentencia. Un programa es el mismo conjunto de instrucciones escritas en un lenguaje de programación. Las instrucciones se dividen en los cuatro grupos siguientes: 1. De Asignación. 2. De Entrada y Salida. 3. Condicionales. 4. Repetitivas. Instrucciones de Asignación Se utilizan para asignar un valor a una variable. Si la variable tenía previamente otro valor, éste será sustituido por el nuevo. Se puede representar una asignación mediante el signo «=», asignando a la variable situada a la izquierda del signo lo que hay a la derecha del mismo. Por ejemplo: B = 10 asigna a la variable B el valor 10. La asignación de un valor se puede realizar mediante: a) Una constante: por ejemplo, asignar el valor 2500000 a la variable Sueldo-Base. Sueldo-Base = 2500000 A partir de ese momento, la variable Sueldo-Base tendrá un valor de 2500000. b) El contenido de otra variable: por ejemplo, asignar el valor que contenga la variable Total-Sumas a la variable Sueldo, suponiendo la variable Total-Sumas con un valor inicial de 3575000 y la variable Sueldo con un valor inicial nulo. Sueldo = Total-Sumas Después de la asignación, el valor de Sueldo será igual que el de Total-Sumas, 3575000. c) El resultado de evaluar una expresión: por ejemplo, asignar a Total-Sueldo el resultado de la expresión: Base + Horas-Extras * Precio-Hora. Total-Sueldo = Base + Horas-Extras * Precio-Hora. De esta forma, en la variable Total-Sueldo quedará guardado el valor del resultado de la evaluación de esa expresión. Aunque matemáticamente la expresión, A + 3 = B - 5 sea totalmente correcta, en informática nunca puede aparecer una expresión a la izquierda del signo « = ». En este lugar sólo debe ir una variable que sea la receptora del resultado de evaluar la expresión situada a la derecha del signo. Elaboró Ing. Edgar Paredes Basilio 25 Apuntes de Principios de Programación Por el contrario, con la expresión: Sueldo = Sueldo + 150000 desde el punto de vista matemático, se está cometiendo un error ya que ningún número es igual a el mismo más 150000. Sin embargo, en informática, con tal expresión lo que se quiere indicar es: — Realizar la operación situada a la derecha del signo «=», sumando 150000 al contenido que ya tenía Sueldo. — Dejar el resultado de nuevo en la variable Sueldo, situada a la izquierda del signo «=». Instrucciones de Entrada y de Salida Una instrucción de entrada implica la introducción de datos en la memoria principal de la computadora desde dispositivos externos a la misma, por ejemplo, el teclado, un disquete, disco duro, etc. En la memoria principal sólo pueden guardarse valores mediante su almacenamiento a través de variables. Por eso, cualquier operación de entrada lleva consigo la asignación del valor introducido a una variable a la que poder referirse cuando se necesite. Así, por ejemplo, si se tuviese el programa de gestión de nóminas, se tendrían que introducir los datos necesarios para el proceso (Sueldo-Base, Dirección, ...), pues bien, estos valores deberán ser leídos del teclado y almacenados en las variables (memoria principal) designadas para tal efecto. Las instrucciones de salida permiten la presentación de datos desde la memoria central de la computadora hacia dispositivos externos de salida; por ejemplo, impresora, pantalla, disquete, disco duro, etc. Cuando se quieran imprimir las nóminas se deberán leer los valores de las variables que contengan los datos y enviarlos a los dispositivos de salida, ya sea impresora o pantalla, mediante instrucciones de salida. Instrucciones Condicionales El modo en que una computadora ejecuta las instrucciones contenidas en un programa es, normalmente, secuencial, es decir, una detrás de otra en el orden en que están escritas. Con el fin de poder dotar a los programas de capacidad de decisión sobre los tratamientos que debe aplicar a cada caso, los lenguajes de programación permiten la definición de instrucciones de control distintas a la secuencial. Este es el caso de las Instrucciones condicionales. Una instrucción condicional es aquella que, bajo la comprobación de veracidad o falsedad de una condición, ejecuta uno de dos grupos de acciones posibles. Elaboró Ing. Edgar Paredes Basilio 26 Apuntes de Principios de Programación En los siguientes apartados se verán los distintos tipos de instrucciones condicionales existentes. Instrucciones Repetitivas Hay ocasiones en que un grupo de instrucciones simples debe repetirse un número determinado de veces, dependiendo del cumplimiento, o no, de una condición. En estos casos, se utiliza una instrucción, llamada repetitiva, que controla la ejecución de este grupo de instrucciones mientras una condición sea cierta. En el algoritmo que se diseñó inicialmente sobre el problema de las nóminas se tenía una estructura repetitiva para controlar que se repetirían todas las operaciones de cálculo (conjunto de instrucciones a repetir) hasta que no quedara ningún empleado (condición de finalización). ESTRUCTURAS BASICAS DE CONTROL El pseudocódigo es una herramienta muy útil utilizada en el diseño de algoritmos para resolver problemas que, si emplea los principios de la programación estructurada, permite expresar el flujo de ejecución de las instrucciones de una forma clara, sin ambigüedad y usando un lenguaje natural. El pseudocódigo es una forma de describir la solución a un problema de manera que su traducción posterior a un lenguaje de programación de alto nivel sea sencilla. Trata de definir la solución del problema en un lenguaje intermedio entre el humano y el de programación. Reglas generales del pseudocódigo No hay una forma estándar de diseñar un pseudocódigo, depende en gran medida del criterio del programador. A pesar de ello, es aconsejable respetar lo más rigurosamente posible las siguientes normas de carácter general: — Todo pseudocódigo comienza con la palabra «Inicio» y termina con la palabra «Fin». — Cada instrucción se debe escribir en una línea. — Para su descripción, se utilizan una serie de palabras reservadas: Inicio, fin, si, entonces, si no, fin-si, mientras, etc. — Debe escribirse «identado» (tabulado) para mostrar claramente las dependencias de control dentro de los módulos. — Cada estructura utilizada tendrá un solo punto de comienzo y un solo punto de fin de estructura. Algunos autores suelen utilizar un corchete para unir el principio y fin de cada estructura. Elaboró Ing. Edgar Paredes Basilio 27 Apuntes de Principios de Programación — Se escribirá en minúscula, excepto aquellos nombres que elige el programador, como son los nombres de variables, de ficheros, de módulos, etc., que se escribirán con mayúsculas. A continuación se verá en pseudocódigo las tres estructuras básicas de control en las que se apoya la programación estructurada. No obstante, una descripción detallada de esta modalidad de programación se verá más adelante. Estructura secuencial Se compone de un grupo de acciones que se realizan todas y en el orden en que están escritas, sin posibilidad de omitir ninguna de ellas. pseudocódigo ... Acción_l Acción-2 ... Acción-n ... EJEMPLO: Calcular la suma y el producto de dos números. La solución es sencilla, lo primero que se tiene que hacer es introducir los números A y B, después sumarlos, luego multiplicarlos y, por último, presentar los resultados al usuario en pantalla. Estas acciones se deben ejecutar en ese orden y secuencialmente, la estructura secuencial expresa perfectamente la solución al problema. El pseudocódigo siguiendo las reglas descritas anteriormente sería: Inicio Introducir A y B SUMA = A + B PRODUCTO = A * B Mostrar SUMA, PRODUCTO Fin Después de haber escrito el pseudocódigo se tiene una idea clara de los pasos que deben seguirse para construir el programa, pero aún tendría que ser codificado en un lenguaje. Cuanto más detallado sea el pseudocódigo, más sencillo será este proceso. Estructura condicional Es la que realiza un conjunto de instrucciones de entre varios posibles, dependiendo del cumplimiento, o no, de una determinada condición. Existen tres tipos de estructuras condicionales: Elaboró Ing. Edgar Paredes Basilio 28 Apuntes de Principios de Programación — Estructura condicional simple. — Estructura condicional doble. — Estructura condicional múltiple. Estructura Condicional Simple Aquí se evalúa la condición y, sólo si es cierta, se ejecuta el conjunto de acciones correspondiente. El no cumplimiento de la condición implica que no se realizará ninguna de las acciones indicadas. El pseudocódigo de esta estructura es el siguiente: ... Si Condición Entonces Acción_l Acción-2 ... Acción-n Fin_si ... EJEMPLO: El problema a resolver es el de introducir un número, que se denominará NUM, por teclado y, si es mayor de 20, mostrarlo por pantalla. Inicio Introducir NUM Si NUM > 20 Entonces Mostrar NUM Fin_si Fin En esta ocasión se tiene que si, y sólo si, el valor NUM es mayor de 15, se debe mostrar el valor NUM; si no se cumple la condición no se mostrará el valor de NUM. Obsérvese que las instrucciones están tabuladas unos espacios hacia la derecha respecto a las palabras «Si» y «Fin-si». Esto tiene por función realzar cuáles son las instrucciones que pertenecen a la estructura. Esta norma de «identación» será para todas las estructuras condicionales y repetitivas. Estructura Condicional Doble En este tipo de estructura se ejecutará un bloque de instrucciones u otro, dependiendo de la certeza o falsedad de una condición. El pseudocódigo de esta estructura es como sigue: Elaboró Ing. Edgar Paredes Basilio 29 Apuntes de Principios de Programación ... Si Condición Entonces Acción_l Acción-2 ... Acción-n Si no Acción_A Acción-B ... Acción-Z Fin_si ... EJEMPLO: Decidir cuál de dos valores es el mayor IInicio Introducir A y B Si A > B Entonces Mostrar «El mayor es» A Si no Mostrar «El mayor es» B Fin_si Fin El problema es sencillo puesto que, dependiendo de la condición A > B, se ejecutará una instrucción u otra. La instrucción Mostrar escribiría en la pantalla el texto entrecomillado y a continuación mostraría el valor de A o B según sea el caso. Estructura condicional múltiple En este caso, dependiendo del valor que tome la variable numérica que controla la condición que vaya a evaluarse, se ejecutará una de las n acciones correspondientes. El pseudocódigo de esta estructura es el siguiente: ... Según Número =1 Acción_l =2 Acción-2 ... =n Acción-n Fin_según ... Elaboró Ing. Edgar Paredes Basilio 30 Apuntes de Principios de Programación EJEMPLO: Introducir por teclado un valor numérico, denominado NUM_CARTA, asociado a una carta (01-12), y mostrar el nombre de la carta asociado a ese número. Inicio Introducir NUM_MES Según NUM_MES Hacer =1 Mostrar «As» =2 Mostrar «Dos» ... =12 Mostrar «Rey» Fin_según Fin En primer lugar, se lee el número de la carta y, a continuación, gracias a la estructura condicional múltiple, se entra en la instrucción que muestra el nombre de la carta. Dependiendo del valor de la variable num_carta se mostrará el nombre de la carta. Estructura repetitiva Permite la repetición de un bloque de instrucciones dependiendo de la veracidad o falsedad de una condición. La condición se conoce como Condición de Salida y a estas estructuras se las denomina también Bucles. Las estructuras repetitivas pueden ser: — Estructura tipo Mientras. — Estructura tipo Hasta. — Estructura tipo Para. Estructura tipo mientras El bloque de acciones se repetirá mientras que la condición sea cierta. La condición se evalúa al comienzo de la estructura. Esto implica que el bloque de instrucciones puede no ejecutarse ninguna vez si la condición de salida es inicialmente falsa. El pseudocódigo de esta estructura es de la siguiente forma: ... Mientras Condición Acción_l Acción-2 ... Acción-n Fin_mientras ... EJEMPLO: Una empresa tiene grabados los datos personales de sus empleados. Se desea imprimir el nombre de los empleados mayores de 55 años. Elaboró Ing. Edgar Paredes Basilio 31 Apuntes de Principios de Programación Inicio Leer Empleado Mientras Hay_Empleados Si Empleado_Edad > 55 Entonces Mostrar Empleado Fin_si Leer Empleado Fin_mientras Fin En primer lugar, se leen los datos de un empleado, a continuación se evalúa la condición de salida (Hay_Empleados) y se comprueba, con una estructura condicional simple, si la edad del empleado es mayor de 55 años; si lo es, se muestra el nombre del empleado. Después se vuelve a leer otro empleado y se retorna a la evaluación de la condición de salida del bucle, cuya finalización vendrá cuando no existan más empleados. NOTA: Obsérvese que si en la primera lectura no hay empleados, el bucle Mientras no se realizará nunca, ya que se comprueba la condición al principio de la estructura Mientras y, sólo si es cierta, se entra en ella. Estructura tipo hasta El bloque de acciones se repetirá hasta que la condición sea cierta. Dicha condición se evalúa al final de la estructura. Esto implica que el bloque de instrucciones se ejecutará al menos una vez, aunque la condición de salida ya sea cierta al entrar en dicha estructura. La diferencia fundamental entre ambas estructuras repetitivas es que, en el primer tipo, las acciones del bucle puede que no se realicen nunca si la condición de salida del mismo es inicialmente cierta. Por el contrario, las acciones del bucle, en el segundo tipo, se realizarán, al menos una vez, ya que la condición se evalúa después de haber sido realizadas dichas acciones. El pseudocódigo para esta estructura es: ... Repetición Acción_l Acción_2 ... Acción_n Hasta Fin_repetición ... EJEMPLO: Visualizar la tabla de multiplicar del número 3 Elaboró Ing. Edgar Paredes Basilio 32 Apuntes de Principios de Programación Inicio CONT = 0 Repetir CONT = CONT + 1 PROD = CONT * 3 Mostrar PROD Hasta CONT = 10 Fin Para resolver este problema se necesitan dos variables: CONT que es un contador que almacenará cuantos números se han visualizado, de ahí que sea la variable que controle el bucle (condición de salida), y PROD que almacena el valor del número a mostrar y que corresponde a los números de la tabla. Estructura tipo para Si el número de iteraciones (repeticiones) es fijo o se conoce de antemano, se puede utilizar una estructura tipo Para o Desde en lugar de utilizar una estructura tipo Mientras. La estructura Para ejecuta las acciones del bucle un número específico de veces y controla automáticamente el número de repeticiones. Para dicho control, hay que definir dentro de la estructura el nombre de una variable numérica, su valor inicial, su valor final y un incremento fijo. Es la propia estructura la que se encarga de inicializar la variable con el valor indicado, incrementarla en cada iteración y, cuando sobrepasa el valor final especificado, termina la repetición del bucle. La evaluación de la condición de salida se hace al comienzo de cada iteración. El pseudocódigo es como sigue: ... Para VAR desde V1 hasta V2 incremento V3 Acción_l Acción-2 ... Acción-n Fin_para ... La diferencia fundamental entre los dos tipos de estructuras radica en que en la estructura Mientras hay que realizar, mediante instrucciones, la inicialización de la variable que controle el bucle, así como su incremento; y en la estructura Para esto se hace automáticamente. EJEMPLO: Construir un programa en pseudocódigo que calcule y muestre la suma de los números comprendidos entre 1 y 100, ambos inclusive. Elaboró Ing. Edgar Paredes Basilio 33 Apuntes de Principios de Programación Inicio SUMA = 0 Para NUM desde 1 hasta 100 SUMA = SUMA + NUM Fin_para Mostrar SUMA Fin Se necesita utilizar dos variables: SUMA en donde se va a calcular la suma de los 100 primeros números, y NUM que es la variable que controla el bucle. Empieza en 1 y llega hasta 100. Cuando NUM sobrepase el valor 100, indicará que ya se han sumado todos los números, con lo que el bucle de tipo Para terminará y en SUMA se tendrá el valor buscado. Elaboró Ing. Edgar Paredes Basilio 34 Apuntes de Principios de Programación LA PROGRAMACIÓN ARBORESCENTE ESTRUCTURADA EN LA REPRESENTACION Existen muchas formas de representar las tres estructuras de control ( secuencial, condicional y repetitiva) de la Programación Estructurada. Una de ellas es el pseudocódigo que ya se ha descrito anteriormente. Otra de ellas, que se va a comentar ahora, es utilizando gráficamente representaciones en forma de árbol para cada una de las modalidades, o variantes, de cada estructura de control. Este tipo de representación se debe a Y. Tabourier y A. Rotchfield que lo desarrollaron en el año 1975. Estructura Secuencial Se representa gráficamente utilizando varios tratamientos f1, f2,...,fn en secuencia como se indica en la figura. Y se representa en forma arborescente con la palabra BLOCK, de la que cuelgan los tratamientos f1, f2,...,fn como se muestra en la figura. El ejemplo comentado durante la explicación del pseudocódigo, que calculaba la suma y el producto de dos números, quedaría como se indica en la figura. Elaboró Ing. Edgar Paredes Basilio 35 Apuntes de Principios de Programación Estructura Condicional Admite tres variantes la «Estructura Condicional Simple», la «Estructura Condicional Doble» y la «Estructura Condicional Múltiple». Estructura Condicional Simple Se representa gráficamente utilizando un predicado p (que es la condición); un tratamiento f (que se ejecuta si la condición p es cierta) y un reagrupamiento, tal y como se presenta en la figura. Y se representa en forma arborescente con la palabra IFTHEN, de la que cuelgan el predicado p y el tratamiento f que se ve en la figura. Elaboró Ing. Edgar Paredes Basilio 36 Apuntes de Principios de Programación El ejemplo en pseudocódigo que leía un número NUM y si era mayor que 20 lo mostraba por pantalla se representa en la figura. Estructura Condicional Doble Se representa gráficamente utilizando un predicado p (que es la condición); dos tratamientos: f (si la condición es cierta) y g (si la condición es falsa), y un reagrupamiento como lo muestra la figura. Elaboró Ing. Edgar Paredes Basilio 37 Apuntes de Principios de Programación Y se representa en forma arborescente, con la palabra IFTHENELSE de la que cuelgan p, f y g, como se ve en la figura. El ejemplo, comentado en pseudocódigo, que calcula el mayor de dos valores, quedaría como se representa en la figura. Estructura Condicional Múltiple Esta estructura es una generalización de la Doble. Se representa con un predicado p (condición); varios tratamientos f1, f2,...,fn (donde se ejecutaría aquel que cumple la condición), y un reagrupamiento. La figura presenta esta estructura. Elaboró Ing. Edgar Paredes Basilio 38 Apuntes de Principios de Programación Y se representa en forma arborescente con la palabra CASEOF, de la que cuelgan el predicado p y los tratamientos f1, f2,...,fn, como lo muestra la figura. El ejemplo de introducir por teclado un valor numérico, denominado NUM_CARTA, asociado a una carta (01 12), y mostrar el nombre de la carta asociado a ese número viene representado en la figura. Estructura Repetitiva Admite tres variantes «Mientras», «Hasta», y «Para». Estructura Tipo Mientras Se representa con un predicado p (condición), que mientras sea cierto ejecuta un tratamiento f. La figura, muestra esta estructura. Elaboró Ing. Edgar Paredes Basilio 39 Apuntes de Principios de Programación Y su representación arborescente es con la palabra DOWHILE, de la que cuelgan el predicado p, y el tratamiento f, como se muestra en la figura. El ejemplo de mostrar el nombre de los empleados de una empresa mayores de 55 años se representaría como se indica en la figura. Elaboró Ing. Edgar Paredes Basilio 40 Apuntes de Principios de Programación Estructura Tipo Hasta Esta estructura se representa con un tratamiento f, que se ejecuta ininterrumpidamente hasta que un predicado p (condición) sea cierto, tal y como se ve en la figura. Se representa en forma de árbol con la palabra DOUNTIL de la que cuelga el tratamiento f, y el predicado p. La siguiente figura muestra dicha estructura. El diagrama arborescente del programa que muestra por pantalla la tabla de multiplicar del número 3 se describe en la figura. Elaboró Ing. Edgar Paredes Basilio 41 Apuntes de Principios de Programación Estructura Tipo Para Se representa mediante un tratamiento f, que se repite, y una variable de control Vc que varía desde un valor inicial Vi hasta un valor final Vf, incrementado en cada bucle con un valor k, como se presenta en la figura. Y su representación arbóreamente se realiza con la palabra DOFOR de la que cuelgan la variable de control (Vc), con su valor inicial (Vi), incremento (k), y su valor final (Vf); y el tratamiento f. La figura presenta esta estructura. El programa que obtiene y muestra la suma de los números comprendidos entre 1 y 100 se describe en la siguiente figura. Como conclusión de este tipo de representación, se va a describir el programa que Elaboró Ing. Edgar Paredes Basilio 42 Apuntes de Principios de Programación calcula y muestra los números menor y mayor de todos los leídos, y los números que son primos. Interesa señalar que esta representación obliga a un proceso de descomposición del problema en subproblemas, que se etiquetan con un nombre, hasta que se llega al final del árbol con todo el problema resuelto. Las figuras muestran esto. Elaboró Ing. Edgar Paredes Basilio 43 Apuntes de Principios de Programación Elaboró Ing. Edgar Paredes Basilio 44 Apuntes de Principios de Programación Las figuras no necesitan ya mucha explicación, simplemente señalar que los árboles se leen de arriba a abajo y de izquierda a derecha. Así, el árbol del módulo 1 de la figura 3.32 se leería: «Primero, leer un número (NUM); a continuación, realizar el proceso repetitivo DOWHILE hasta que no haya números que leer, y, finalmente, llamar al módulo 2 con NUM= -1 para que muestre el valor menor y el mayor de todos los leídos. El proceso DOWHILE señala que hay que realizar dos acciones: una es preguntar si NUM_0 y en caso afirmativo efectuar las acciones de llamar a los módulos 2 y 3 respectivamente, y en caso negativo mostrar NUM y el literal «no es un entero positivo»: la otra es volver a leer otro número NUM. Es evidente, que la representación arborescente ocupa más papel que el pseudocódigo, pero tiene la ventaja de que, al ser gráfica, se sigue mejor, y que para modificar el diagrama simplemente basta con colgar la información nueva de una de las ramas sin estropear todo lo demás, cosa que es imposible con el pseudocódigo. Elaboró Ing. Edgar Paredes Basilio 45 Apuntes de Principios de Programación LA REPRESENTACIÓN ESTRUCTURADA UTILIZANDO DIAGRAMAS N-S DE CHAPIN Este método estructurado fue desarrollado en 1973 por Nassi y Schneiderman y perfeccionado en 1974 por Ned Chapín. Realmente, al igual que el arborescente, lo que se plantea es una nueva forma de representar las estructuras de control (secuencial, condicional y repetitiva) utilizando para ello lo que ellos denominan «organigramas N-S o diagramas de Chapín», que se van a ver a continuación. Estructura Secuencial Se representa, tal y como se muestra en la figura, mediante un rectángulo que incorpora dentro de él sentencias de asignación, de entrada/salida, la llamada a otro módulo (función o procedimiento),… En este último caso, se coloca una elipse dentro del rectángulo con el nombre del módulo llamado. El ejemplo que calcula la suma y el producto de dos números se representaría como se indica en la figura. Elaboró Ing. Edgar Paredes Basilio 46 Apuntes de Principios de Programación Estructura Condicional Las tres variantes: «Estructura Condicional Simple», «Estructura Condicional Doble» y «Estructura Condicional Múltiple» se representarían en este método como sigue: Estructura Condicional Simple Se utiliza, como se ve en la figura, un rectángulo dividido en tres triángulos: uno para la condición (p), otro para cierto (C) y un tercero para falso (F); y en dos rectángulos: uno para el tratamiento de cierto (f) y otro sombreado (que no hace nada) para cuando la condición es falsa. La figura señala que se lea un número NUM y si es mayor que 20 que se muestre en pantalla. Elaboró Ing. Edgar Paredes Basilio 47 Apuntes de Principios de Programación Estructura Condicional Doble Es muy semejante a la anterior. Se representa, como se muestra en la figura con un rectángulo dividido en tres triángulos: condición (p), cierto (C) y falso (F); y en dos rectángulos: uno para el tratamiento de cierto (f) y otro para el tratamiento de falso (g). La figura describe el programa que lee dos números y muestra el mayor. El diagrama de la figura indica al ejecutarse los rectángulos 1, 2, 3, 4, 5, 6 y 7 que: 1: A y B son > 0 2: A y C son > 0, pero B no. 3: A es >0, pero B y C no. 4: A no es > 0. 5: A no es > 0, pero D y E si. 6: A no es > 0, pero D si. 7: A y D no son > 0. Elaboró Ing. Edgar Paredes Basilio 48 Apuntes de Principios de Programación Estructura Condicional Múltiple Se utiliza, tal y como se muestra en la figura, un rectángulo dividido en varios triángulos [uno para la condición (p), y los otros 1, 2,… para las diferentes alternativas] y en varios rectángulos (cada uno es un tratamiento para cada una de las alternativas). El problema de mostrar una carta se representaría como se indica en la figura. Estructura Repetitiva Las tres variantes «Mientras», «Hasta» y «Para» tienen una representación muy similar. Consisten en un rectángulo dentro del cual hay otro rectángulo en el que se incorporan las instrucciones del tratamiento repetitivo (f) y fuera del rectángulo inferior está el predicado (p). Elaboró Ing. Edgar Paredes Basilio 49 Apuntes de Principios de Programación Estructura Tipo Mientras En la figura se describe el programa que muestra el nombre de los empleados de una empresa mayores de 55 años. Estructura Tipo Hasta Elaboró Ing. Edgar Paredes Basilio 50 Apuntes de Principios de Programación El programa que describe la tabla de multiplicar por 3 se presenta en la figura. Estructura Tipo Para La figura describe el programa que obtiene y muestra la suma de los números comprendidos entre 1 y 100. Se va a finalizar este modelo de representación estructurada describiendo, en las figuras siguientes el programa que calcula y muestra los números primos y el menor y mayor de todos los números leídos. Se ve que los módulos se representan por un único rectángulo y cuelgan de una elipse que incorpora el nombre de cada módulo. Elaboró Ing. Edgar Paredes Basilio 51 Apuntes de Principios de Programación Elaboró Ing. Edgar Paredes Basilio 52 Apuntes de Principios de Programación La construcción de un programa utilizando este tipo de diagramas ayuda a ver claramente la estructura y enlace entre los módulos. Además, como no es fácil introducir más de 20 símbolos en una página (y no existen conectores de página), se consigue con ello diseñar módulos cortos (que es uno de los objetivos de la programación estructurada) por lo que si el programa es grande, con este tipo de representación se facilita separar una parte del programa para que sea un subprograma; es decir, un módulo. Presenta la ventaja, con respecto a la representación arborescente, de que es más compacta y permite ver de un vistazo todo el programa, pero tiene el inconveniente de que es muy difícil modificar su contenido, en el sentido, de insertar un conjunto de diagramas nuevos que modifiquen el anterior. Elaboró Ing. Edgar Paredes Basilio 53