ESTRUCTURAS SELECTIVAS En el capítulo 3 se vio que cada instrucción se ejecutaba en el orden en que se había escrito, pero esto no siempre ocurre así, ya que muchas veces es necesario usar estructuras de decisión del tipo si...entonces...sino. Para realizar acciones alternativas o tomar decisiones se usan condiciones que son verdaderas o falsas y se llaman expresiones lógicas o booleanas. Las expresiones lógicas se forma utilizando los operadores relacionales siguientes: >, <, =, >=, <=, <>. Las expresiones lógicas se pueden combinar dando expresiones más complejas, usando los operadores lógicos que presentan el siguiente orden de evaluación: not, and y or, y sus significados se pueden ver en las tablas de verdad. Las estructuras selectivas se utilizan para tomar decisiones lógicas; de ahí que se suelan denominar estructuras de decisión o de alternativas. Son dos: la sentencia if y la sentencia case. Estructura If Esta sentencia, es considerada de alternativa doble (si se cumple condición entonces ... , sino .... / If ...... then ...... else..... ). Pseudocódigo en castellano Código de programa si <condición> if <condición> cierta entonces < acción S1> then < acción S1> sino < acción S2 > else < acción S2> Su estructugrama tiene la siguiente forma: <condición> si no < acción S1> < acción S2> Es decir si la expresión que se evalúa es verdadera se ejecutará la sentencia siguiente al then, de otro modo (falso) se ejecutará la sentencia siguiente al else. Cuando se desea que se ejecute una acción determinada sólo si la condición es verdadera y no se desea ejecutar ninguna si es falsa se puede omitir el else quedando: Pseudocódigo en castellano si <condición> entonces < acción S1> Código de programa if <condición> then < acción S1> Se observa que el punto y coma anterior al end final del if es opcional y se puede suprimir. En los ejemplos 4.1 y 4.2 se pueden ver las aplicaciones de esta estructura. Ejemplo 1: Se leen dos valores enteros A, B. Si A es mayor que B se debe realizar la suma de ambos, en caso contrario, se debe hacer el producto. Pseudocódigo del programa nombre selección1(program); Declaraciones (uses) Crt, Dos; Variables(var); A (valor que ingresa) : entero; B (valor que ingresa) : entero; Diagrama N-S nombre selección1 Declaraciones Crt, Dos Variables A, B, R :enteros Comienzo (programa) R (resultado de la oper.): entero Limpieza inicio (begin); Ingreso Limpieza de la pantalla A>B Ingreso de datos Si A>B entonces Entonces R ← A + B R←A+B R←A* B Sino R ← A * B salida resultados: Resultado fin(end.) fin (programa) Aquí se pueden observar varios de los pasos ya vistos. Por lo tanto sólo se desarrollará el pseudocódigo y el diagrama estructurado de la alternativa. Pseudocódigo de la alternativa procedimiento alternativa inicio (begin); si A > B entonces R ← A + B sino R ← A * B fin(end;) Diagrama N-S A>B R←A+B R←A* B El código del procedimiento es: if A > B then R := A + B else R := A * B; Ejemplo 2 Se leen dos valores enteros A, B. Si A es mayor que B se deberá realizar la suma de ambos e imprimir un cartel diciendo R es la suma de A y B. En el caso contrario, se pide hacer el producto y se debe imprimir otro cartel que diga R es el producto de A y B. Por ser muy similar al anterior sólo se realizará la parte del programa de la decisión. Como dentro de la alternativa se colocó la impresión de resultados el algoritmo estructurado quedará de la siguiente manera. Algoritmo alternativa Diagrama N-S Pseudocódigo de la alternativa si A > B entonces R ← A + B Imprimir cartel suma y resultados sino R ← A * B Imprimir cartel producto y resultados A>B R←A+B Imp. Resultado carteles R←A*B y Imp. Resultado y carteles El código de la estructura es: if A > B then begin {* comienzo del then *} R := A + B; writeln ( 'R es la suma de A y B = ', R); end {* fin del then *} else begin {* comienzo del else *} R := A * B; {* producto *} writeln ( 'R es el producto de A y B = ', R); end; {* fin del else *} Nota: Cuando alguna de las opciones tiene más de una instrucción, dicha opción deberá llevar un begin con su correspondiente end. Debe notarse que el end del then no tiene puntuación y en cambio el del else si lleva punto y coma (;) esto se debe a que la instrucción previa al este else nunca lleva punto y coma (;). SALIDAS MÚLTIPLES Si se tiene más de dos posibles salidas, aquí aparecen dos soluciones similares al problema. IF anidado En esta solución se utiliza un if dentro de otro y siempre se anida por la salida Else (sino). Ejemplo 3 Se pide un programa donde se ingrese un número entre 1 y 5, incluidos ambos y que se imprima en pantalla su expresión de caracteres es decir si ingresa 2 → imprime Dos. En este caso se tienen cinco salidas probables (uno, dos, tres, cuatro o cinco), lo que indica que habrá 4 if anidados. Si a = 1 Entonces impre = Uno Sino Si a = 2 Entonces impre = Dos Sino Si a = 3 Entonces impre = Tres Sino Si a = 4 Entonces impre = Cuatro Sino impre = Cinco fin_si {* fin_si no tiene equivalente en Pascal *} fin_si fin_si fin_si <condición 1> <condición 2> < acción S1> <condición 3> < acción S2> <condición 4> < acción S3> < acción S4> < acción S5> El código de la estructura es: if A = 1 then writeln ( 'U n o ') else if A = 2 then writeln ( 'D o s ') {* pregunta por uno *} {* salida por uno *} {* pregunta por dos *} {* salida por dos *} else if A = 3 then {* pregunta por tres *} writeln ( 'T r e s ') {* salida por tres *} else if A = 4 then {* pregunta por cuatro *} writeln ( 'C u a t r o ') {* salida por cuatro *} else writeln ( 'C i n c o '); {* salida por cinco *} Case Esta solución se utiliza en reemplazo del if anidado. Es más práctica y eficiente y su pseudocódigo genérico es: según...sea E hacer E1: sentencia 1 E2: sentencia 2 E3: sentencia 3 ......................... ......................... En: sentencia n [sino sentencia x ] fin...según Variable Opción 1 Opción 2 Opción 3 Opción .. Opción n else <acción S1> <acción S2> <acción S3> <acción S..> <acción Sn> <acción Sm> Para el problema anterior (del Ejemplo 4.3) el pseudocódigo será: según...sea A hacer 1: Imprimir “U n o” 2: Imprimir “D o s” 3: Imprimir “T r e s” 4: Imprimir “C u a t r o” sino Imprimir “C i n c o” fin...según El diagrama N - S es: A 1 2 3 4 Else Imprimir “UNO” Imprimir “DOS” Imprimir “TRES” Imprimir “CUATRO” Imprimir “CINCO” El código de la estructura es: case A of {* comienza seleccion *} 1 : writeln ( 'U n o '); {* salida por uno *} 2 : writeln ( 'D o s '); {* salida por dos *} 3 : writeln ( 'T r e s '); {* salida por tres *} 4 : writeln ( 'C u a t r o '); {* salida por cuatro *} else writeln ( 'C i n c o '); {* salida por cinco *} end; {* fin del case *} PRÁCTICA DE SELECTIVAS 1. Ingrese los valores numéricos enteros A, B, C, D, E y diga si su promedio es mayor o igual a 7. 2. Dado un conjunto de 3 números A, B, C. Hacer un programa que determine cuál de los tres es el mayor valor y cuál es el menor 3. Una universidad privada cobra como arancel 150 dólares por materia que se cursa, pero si la cifra supera los 800 dólares, se cobra esa cifra (así un estudiante que cursa 3 materias paga 450 dólares y uno que cursa 10 paga 800 dólares). Hacer un programa que solicite el nombre del alumno y la cantidad de materias a cursar y saque por pantalla los dos datos ingresados y el valor a pagar (como en el ejemplo). Alumno Número de materias Monto XXXXXXXXXXXX YY U$ RRR 4. Escriba un programa que le pida al usuario que ingrese una letra (minúscula), y le indique si es una vocal (a, e, i, o, u), ó si es una consonante. 5. Ingrese los valores numéricos reales a, b, c, que son coeficientes de una ecuación cuadrática y obtenga los valores X1 y X2 reales. Si la solución de la raíz diera como resultado un valor negativo, imprima un cartel que diga “La solución son dos números complejos conjugados”. 6. Ingrese los valores numéricos reales a, b, c, que son coeficientes de una ecuación cuadrática y obtenga los valores X1 y X2 reales. Si la solución de la raíz diera como resultado un valor negativo, imprima el resultado como “m + ni; m -ni”. 7. Escriba un programa que le pida a un usuario un número entre 20 y 99 en forma numérica y luego lo saque por pantalla en palabras. 8. Haga un programa que permita ingresar un número de 1 a 7 y salga el correspondiente día de la semana (Ej: 1 → Lunes; 2 → Martes; ...). Si ingresa un valor que no esté comprendido entre 1 y 7 deberá imprimir un cartel que diga “ERROR ... valor fuera de rango” 9. Escriba un programa que lea un número entero (variable tipo integer), y escriba cuántos dígitos tiene. Ejemplo 1285 tiene 4 dígitos. 10. Escriba un programa que ingresados tres valores enteros y positivos (A, B y C), determine si son lados de un triángulo rectángulo. En caso de serlo, indicar si A, B o C es la hipotenusa. 11. Haga un programa que permita ingresar dos números reales y el símbolo de la operación, obteniéndose el correspondiente resultado. Si el símbolo no es correcto, deberá imprimir un mensaje que indique “Error en símbolo” 12. El dueño de la pizzería de la práctica anterior ha decidido optimizar su servicio, para lo cual ha reducido a 3 los tamaños de las mismas: personal (12 cm de diámetro), chica (22 cm), grande (33 cm). Por este motivo ha solicitado una modificación al programa de manera tal que al usuario le aparezcan la tres posibilidades, y el usuario solo pueda elegir entre una de esas posibilidades. PRÁCTICA DE ESTRUCTURAS CÍCLICAS 1. Leer una lista de 10 valores enteros, calcular e informar: − La suma de los valores positivos. − El producto de los valores negativos. (ignorar los valores nulos). 2. Ingresar 5 juegos de cuatro valores cada uno: calcular y emitir el promedio de cada juego. 3. Ingresar N juegos de cuatro valores cada uno; calcular y emitir el promedio de cada juego. El proceso finaliza al encontrarse un juego cuyo primer valor es 0. 4. Ingresar dos números enteros positivos y calcular el producto de los mismos por sumas sucesivas. 5. Leer una lista de números positivos que finaliza en cero y emitir el valor mínimo de la lista. 6. Leer una lista de números enteros que finaliza en cero y emitir el valor máximo de lista. 7. Idem a 5, emitiendo además la ubicación del máximo dentro de la lista. (suponer un único máximo). 8. Leer 4 juegos de N valores enteros cada uno, donde N se informa al comienzo de cada juego, y emitir el valor máximo de cada grupo. (suponer un único máximo). 9. Dada una lista de valores numéricos positivos, finalizada en cero, indicar si está ordenada en forma ascendente. 10. Una empresa informa para cada uno de sus 20 vendedores: Código de vendedor 3 dígitos Importe de ventas del mes Real Se desea emitir el importe máximo de ventas del mes y cuántos vendedores alcanzaron dicho importe 11. En una central telefónica se procesan los llamados realizados en la siguiente forma por cada llamada que ingresa: Código de la llamada Tipo de día Duración de la llamada Los importes son: Días hábiles Días feriados 3 dígitos (cero al finalizar el proceso) "1" hábil y "2" feriado Entero > cero Primeros 3 minutos 10 15 Minuto adicional 2 3 Se deberá emitir: − El importe a abonar por cada llamada. − La cantidad de llamadas que superen los tres minutos − El porcentaje de llamados que superen los tres minutos. (Sobre el total de llamadas informadas). 12. Se leen 30 valores reales (comprendidos entre 5 y 40), que representan la temperatura máxima de cada uno de los día de un mes, se pide hallar: − La temperatura máxima del mes y el día que se produjo. (se supone única). − Cuántos días la temperatura superó los 25 grados centígrados. − El promedio de las temperaturas del mes: 13. Se ingresan los resultados de la evaluación de un grupo de un curso de programación, por cada alumno se informa: Número de matrícula 4 dígitos (1-9999) Asistencia 1 para presente, 0 para ausente Calificación 2 dígitos (0-10) A partir de esta información se debe calcular e informar: − Cantidad y porcentaje de alumnos presentes. − Porcentaje de alumnos aprobados (sobre el total de alumnos presentes). 14. En la pizzería de las prácticas anteriores se ha determinado que los costos de los complementos no son en todo los caso iguales: sus valores son los siguientes en $/cm2: Doble muzzarella Morrones Jamón Longaniza Roquefort Palmitos Aceitunas negras 0.003 0.004 0.006 0.005 0.008 0.010 0.002 Por lo tanto, se pide un modificación que le permita al usuario elegir si desea o no complementos y cuáles desea. Para pensar.... 15. Realice un programa que permita resolver un sistema de dos ecuaciones con dos incógnitas del tipo Ax + By + C = 0. 16. Realice un programa que permita calcular la intersección de dos rectas de la forma y= mx + b. Bibliografía 1. De Giusti A. Algoritmos, Datos y Programas. Pearson. 2002 2. Joyanes Aguilar L.: Turbo Pascal 5.5 6.0 y 7.0. Editorial Mc. Graw-Hill. 2001. 3. Leetsma S. Y Nyhoff L. Programación en Pascal. Prentice Hall 1999 4. Lopez Leobaldo. Programación estructurada en Turbo Pascal 7. Alfaomega. 5. Dale N. y Lilly S.: Pascal y Estructura de datos. Editorial Mc. Graw-Hill. 6. O´Brien y Nameroff. Turbo Pascal 7 Manual de Referencia. Mac Graw Hill 7. Weiss. Estructuras de Datos y Algoritmos. Addison Wesley 8. Grogono P.: Programación en Pascal. Editorial Prentice Hall. 9. Alcalde E. y otros (1988): Informática Básica. Editorial Mc Graw Hill. (Cap 2) 10. Wirth N.: Algorithms + Data Structures = Programs. Editorial Prentice Hall. 11. Wirth N.: Introducción a la Programación Sistemática. Editorial El Ateneo. 12. Braunstein y Gioia: Introducción a la Programación y Estructuras de Datos. Editorial Eudeba. 13. Carroll: Turbo Pascal. Editorial Mc. Graw-Hill. 14. Schildt: Programación y técnicas en Pascal avanzado. Editorial Mc. Graw Hill. 15. Dijkstra-Hoare: Structured Programming. Academic Press. 16. Cataldi Z. y Lage F., 2000 - Algoritmos I. Recopilación de los Algoritmos Fundamentales. ISBN 987-461764-7.