Ejercicios complementarios clase anterior 1) Escribir un programa que ordene 2 números 1. 2. Introducción a la programación 3. Sergi Jordà Curso de postgrado “Programación Orientada al Multimedia” Institut Universitari de l’Audiovisual Universitat Pompeu Fabra Declarar 2 variables MAYOR y MENOR Pedir 2 números por teclado y guardarlos en estas variables Si hace falta, intercambiar los valores de las variables unidades 1-50 51-100 Precio unidad 0,1 € 0,7 € 101… 0,5 € A estos precios se le sumará un IVA del 17% 2) Escribir un programa que calcule el importe de unas fotocopias a partir de la tabla anterior. El usuario introducirá el número de fotocopias realizadas y se mostrará el precio final desglosado Estructuras iterativas • En muchísimos casos, los programas deben repetir una misma tarea un gran número de veces Tema 3 : Estructuras Iterativas § § § § § Recorrer todos los caracteres de un fichero de texto …todos los pixeles de una imagen …todos los registros (fichas) de un fichero …todas las muestras de un sonido Repetir siempre el mismo mecanismo hasta que el usuario diga “basta” § ….. WHILE y FOR Hay 2 tipos principales de estructuras iterativas a) FOR variable=valor_inicial TO valor_final DO …………. END FOR b) WHILE condicion DO …………. END WHILE • • • • La primera (FOR) se utiliza cuando conocemos de antemano el número de veces que queremos repetir algo La segunda (WHILE) se ejecuta mientras la condición sea cierta. Cuando la condición NO sea cierta, después de ser evaluada, el programa pasará a la línea que sigue al fin del WHILE La segunda es más flexible (incluye de hecho a la primera…) En la siguiente transparencia se muestra como construir un FOR, a partir de un WHILE FOR construido con WHILE FOR variable=valor_inicial TO valor_final DO …………. END FOR WHILE condicion DO …………. END WHILE • Construir con WHILE, un bucle que se ejecute de 1 a 10 var i tipo entero iß1 while i<=10 do ….. iß i+1 end while 1 Ejercicio • Escribir un programa que permita al usuario introducir 6 notas (resultados de los exámenes de un alumno) y que indique al final, la nota promedio y si el alumno ha aprobado o no. Pistas: • Para aprovechar al máximo la estructura iterativa, se podrá suponer que los valores de cada examen sólo se necesitan para calcular el promedio (no necesitamos guardarlos de forma individual) • Esta afirmación proviene de que no hemos visto matrices o vectores, y no sabemos por lo tanto guardar varios valores dentro de un bucle • Por lo tanto, lo que se debe hacer cada vez dentro del bucle es: § Pedir una nueva nota y sumarla al total • Se considerará aprobado si el promedio es superior o igual a 5 Más pistas (sólo en caso de apuro) El programa consta de las siguientes partes: 1. 2. 3. 4. 5. Solución var num_exams tipo entero var promedio tipo real var nota tipo real Ejercicios : Ampliación del ejercicio anterior 1. Ampliar el programa anterior, de forma que antes de introducir ninguna nota, el usuario indique el número total de exámenes del alumno 2. Modificar el programa de forma que el usuario pueda ir introduciendo notas hasta que introduzca una nota con valor -1 (que no se contabilizará) 3. Ampliar el programa de forma a validar las notas introducidas (que deberán estar comprendidas entre 0 y 10 para el caso [1] y de -1 a 10 para el caso [2]) 4. En el caso [1] validar también el número total de exámenes (entre 0 y 20) promedio ß 0 for num_exams =1 to 6 do print “introduce una nota :” nota ß input_num promedio ß promedio + nota end for promedio ß promedio / 6 If promedio <5 then print “el alumno ha suspendido con un ”,promedio else print “el alumno ha aprovado con un ”,promedio endif (1) Número total de notas var var var var num_exams tipo entero n tipo entero promedio tipo real nota tipo real promedio ß 0 print “introduce número total de notas :” num_exams ß INPUT_NUM for n =1 to num_exams do print “introduce una nota :” nota ß input_num promedio ß promedio + nota end for promedio ß promedio / num_exams If promedio <5 then print “el alumno ha suspendido con un ”,promedio else print “el alumno ha aprovado con un ”,promedio endif Declarar las variables necesarias Inicializarlas En el bucle: pedir nota y sumarla al total Calcular el promedio a partir del total Mostrar mensajes (1b) Número total de notas (utilizando while) var var var var num_exams tipo entero n tipo entero promedio tipo real nota tipo real promedio ß 0 nß 1 -- al usar while hemos de dar un valor inicial a n print “introduce número total de notas :” num_exams ß INPUT_NUM while n<= num_exams do print “introduce una nota :” nota ß INPUT_NUM promedio ß promedio + nota n ß n+1 -- ahora hemos de incrementar n explicitamente end while promedio ß promedio / num_exams If promedio<5 then print “el alumno ha suspendido con un ”,promedio else print “el alumno ha aprovado con un ”,promedio endif 2 (2) Salida con “-1” (3) Validación de entradas var num_exams tipo entero var promedio tipo real var nota tipo real En los ejemplos anteriores, tan sólo deberemos sustituir cada una de las líneas: nota ß INPUT_NUM promedio ß 0 num_exams ß 0 print “introduce una nota (-1 para salir):” nota ß INPUT_NUM while nota <> -1 do num_exams ß num_exams + 1 -- no importa el orden de esta linea y la siguiente promedio ß promedio + nota print “introduce una nota (-1 para salir):” nota ß INPUT_NUM end while if num_exams > 0 then -- si no hacemos esta comprobación el programa se podría colgar (los -- ordenadores se cuelgan cuando intentan dividir por 0) promedio ß promedio / num_exams if promedio <5 then print “el alumno ha suspendido con un ”,promedio else print “el alumno ha aprovado con un ”,promedio endif else print “no has introducido ninguna nota” endif por las siguientes 3 líneas: nota ß INPUT_NUM while nota <0 or nota >10 nota ß INPUT_NUM end while NB: En el caso de que usemos -1 para salir, deberemos poner while nota<-1 en lugar de while nota<0 • Lo que hacen estas 3 líneas es pedir una nota, y si esta es incorrecta, sigue pidiéndola hasta que sea correcta. • Si la nota fuesecorrecta desde el principio, ya no entraría en el while • Es fundamental poner un OR (nota <0 or nota >10) y no un AND • Si pusiésemos un AND, jamás entraría en el bucle, ya que ningún número puede ser menor que 0 y a la vez mayor que 10 (este es un error de despiste que cometen frecuentemente hasta los programadores más expertos ) Más ejercicios • Suponiendo que PRINT escribe el mensaje que se le indica entre comillas, y a continuación realiza un salto de línea, escribir un programa que pida al usuario un número de líneas, y a continuación, muestre por pantalla un dibujo como los que se muestran a continuación: Más ejercicios ********** * * * * * * * * ********** (si el usuario hubiese pedido 6 líneas) ********** * * ********** • El sumatorio de un número entero N se • • calcula a partir de la fórmula 1+2+3+…+N Por ejemplo, el sumatorio de 4 es 10 (1+2+3+4) Escribir un programa que pida un número al usuario y muestre su sumatorio por pantalla (si el usuario hubiese pedido 3 líneas) Más ejercicios • • • • Suponiendo que existe una funcion RANDOM(n) que devuelve un número entero aleatorio entre 0 y n, escribir una programa que: Calcule un número aleatorio entre 0 y 20, y pida al usuario que lo adivine Para ello, el usuario deberá ir introduciendo números , y el programa le deberá indicar cada vez, si el número a adivinar es mayor o menor que el que ha introducido el usuario. Las siguientes líneas muestran un posible desarrollo del programa (en verde los mensajes que muestra el ordenador, en amarillo lo que teclea el usuario): Hola. He pensado un número entre 0 y 20. A ver si adivinas cual es… Introduce un número : 10 Mi número es mayor Introduce un número : 15 Mi número es mayor Introduce un número : 18 Mi número es menor Introduce un número : 16 Acertaste en 4 intentos! 3