Estructuras condicionales Programación http://progra.usm.cl Objetivos de la clase Presentar las sentencias if, if-elif e if-elif-else. Enseñar el uso de estructuras condicionales. Resolver ejercicios con estructuras condicionales. Diapositivas Los tipos de sentencias condicionales son presentados usando problemas sencillos relacionados con el cálculo del promedio de notas de un alumno. Al mostrar cada programa, explique con detención cómo es usada la sentencia condicional respectiva. Problema 1 Escriba un programa que pida al usuario ingresar sus tres notas, y lo felicite si su promedio es mayor a 80. Nota 1: 45 Nota 2: 78 Nota 3: 68 Su promedio es 64 Nota 1: 79 Nota 2: 91 Nota 3: 74 Felicitaciones! Su promedio es 81 A esta altura, los estudiantes deberı́an ser capaces de escribir por su cuenta la parte del programa que lee la entrada y que calcula el promedio. Es una buena oportunidad para ponerlos a prueba. Hay que tener cuidado en cómo calcular el promeedio para evitar errores al dividir y al redondear. La solución en la diapo siguiente aproxima el promedio al entero más cercano. Sentencia if n1 = int(raw_input('Nota 1: ')) n2 = int(raw_input('Nota 2: ')) n3 = int(raw_input('Nota 3: ')) suma = n1 + n2 + n3 promedio = int(round(suma / 3.0)) if promedio > 80: print 'Felicitaciones!' print 'Su promedio es', promedio Aquı́ se introduce la sentencia if. Mencionar que if en inglés significa ((si)). 1 El if tiene una condición, que es una expresión lógica. Al llegar al if, la expresión es evaluada, y su resultado decide si las sentencias son ejecutadas o no. Éste es el primer ejemplo en que es necesario indentar. Explique que el primer print sı́ está dentro del if mientras que el segundo no lo está. Un error común es olvidar poner los dos puntos después de la condición. No es legal que la lı́nea que sigue al if no esté indentada. El estándar es usar cuatro espacios para indentar. Problema 2 Escriba un programa que pida al usuario ingresar sus tres notas, e indique si reprobó o aprobó. Nota 1: 70 Nota 2: 25 Nota 3: 39 Usted reprobo con 45 Nota 1: 59 Nota 2: 44 Nota 3: 61 Usted aprobo con 55 Nuevamente los estudiantes deberı́an ser capaces de desarrollar la primera parte por sı́ solos. También podrı́a ocurrı́rseles resolver el problema usando dos ifs, con condiciones promedio < 55 y promedio >= 55. Sentencia if-else n1 = int(raw_input('Nota 1: ')) n2 = int(raw_input('Nota 2: ')) n3 = int(raw_input('Nota 3: ')) suma = n1 + n2 + n3 promedio = int(round(suma / 3.0)) if promedio < 55: print 'Usted reprobo con', promedio else: print 'Usted aprobo con', promedio Aquı́ se introduce la sentencia if-else. Mencionar que else en inglés significa ((o si no)). Todo else siempre está asociado a un if. Ambos deben partir siempre en la misma columna. Problema 3 Escriba un programa que pida al usuario ingresar sus tres notas, e indique si su promedio es pésimo (< 30), mediocre (30 a 54), aceptable (55 a 79) o excelente (≥ 80). Casos de prueba: Nota 1: 32 Nota 2: 89 Nota 3: 91 Su promedio 71 es aceptable Nota 1: 77 Nota 2: 100 Nota 3: 91 Su promedio 89 es excelente! Este problema también puede ser resuelto usando varios ifs. 2 Sentencia if-elif-else n1 = int(raw_input('Nota 1: ')) n2 = int(raw_input('Nota 2: ')) n3 = int(raw_input('Nota 3: ')) suma = n1 + n2 + n3 promedio = int(round(suma / 3.0)) print 'Su promedio', promedio, 'es', if promedio < 30: print 'pesimo' elif promedio < 55: print 'mediocre' elif promedio < 80: print 'aceptable' else: print 'excelente!' Aquı́ se introduce la sentencia if-elif-else. No es legal en Python usar else if ...:, y por eso la sentencia elif es necesaria. Como es una contracción de else if, en español vendrı́a a ser algo como ((o si no, si)). El uso de varios elifs encadenados hace que el programa sea mucho más claro. Si se usara varios ifs desacoplados, no serı́a evidente a primera vista que el programa seguirá sólo una de las alternativas. Ejercicio Un año es bisiesto si es divisible por 4, excepto si es divisible por 100 y no por 400. Escriba un programa que indique si un año es bisiesto. Ingrese un anno: 1988 1988 es bisiesto Ingrese un anno: 2011 2011 no es bisiesto Ingrese un anno: 1700 1700 no es bisiesto Ingrese un anno: 2400 2400 es bisiesto Este ejercicio está pensado para que lo resuelvan los estudiantes. Tras leer el enunciado, analizar cuál es la condición de la regla del año bisiesto que hace que cada caso de prueba entregue el resultado mostrado. Solución 1 anno = int(raw_input('Ingrese un anno: ')) if anno % print elif anno print elif anno print else: print 400 == 0: anno, 'es bisiesto' % 100 == 0: anno, 'no es bisiesto' % 4 == 0: anno, 'es bisiesto' anno, 'no es bisiesto' Primera manera de resolver el problema. Se cubre el caso más especı́fico primero, y luego se va refinando hacia el caso más general. Explicar cuál es el flujo de ejecución para los casos de prueba presentados. Solución 2 anno = int(raw_input('Ingrese un anno: ')) if anno % 4 == 0: if anno % 100 == 0 and anno % 400 != 0: print anno, 'no es bisiesto' else: print anno, 'es bisiesto' else: print anno, 'no es bisiesto' Segunda manera de resolver el problema. Sirve para introducir sentencias de control anidadas. 3 En este caso, se cubre el caso más general primero, y luego es refinado con otro if. Nuevamente, explicar cuál es el flujo de ejecución para los casos de prueba presentados. Solución 3 anno = int(raw_input('Ingrese un anno: ')) if ((anno % 4 == 0 and anno % 100 != 0) or anno % 400 == 0): print anno, 'es bisiesto' else: print anno, 'no es bisiesto' Tercera manera de resolver el problema. En este caso, una sola expresión lógica indica el camino a seguir. El año es bisiesto si es divisible por 400, o si es divisible por 4 y no por 100. La expresión puede abarcar dos lı́neas de código ya que hay un paréntesis abierto sin cerrar. Ésta es la manera de continuar lı́neas en Python. Además, se usa paréntesis para forzar la precedencia entre los operadores and y or. Para el resto de la clase, puede encontrar ejercicios para resolver en http://progra.usm.cl/apunte/ ejercicios/1/index.html#estructuras-condicionales. 4