Estructuras de Repetición: Repita Mientras. Andrés Arcia Departamento de Computación Escuela de Ingeniería de Sistemas Facultad de Ingeniería Universidad de Los Andes 15/05/05 Programación Digital I 1 Programación Estructurada La programación estructurada es un paradigma que consiste en la organización de un código en bloques conformados por estructuras del tipo: Secuencial (asignación, lectura, escritura) Decisión o selección (simple, doble, múltiple) Repetición (Repita mientras, Hacer-Mientras, Repita para) 15/05/05 Programación Digital I 2 Estructuras de Repetición Estructura de repetición o lazo Permite que un conjunto de sentencias (bloque) de un programa puedan ser ejecutadas repetidamente según el resultado de una expresión lógica. Tipos de estructuras de repetición Repetición condicional o controlada por un centinela: REPITA-MIENTRAS y HACERMIENTRAS. Repetición controlada por un contador: REPITA -PARA. Conceptos Básicos 15/05/05 Contador Acumulador Programación Digital I 3 Contador Variable cuyo valor se incrementa o decrementa en una cantidad constante cada vez que se produce un determinado suceso o acción. Se debe realizar primeramente una operación de inicialización y posteriormente los correspondientes incrementos o decrementos. 15/05/05 Programación Digital I 4 Operaciones sobre un Contador Inicialización: contador = valor inicial Incremento/decremento: contador = contador + valor_constante contador = contador – valor_constante Ejemplo // inicialización int i=0, j=1000; i++; // incremento i+=15; // incremento j--; //decremento j-=10; //decremento ¿Cuántas iteraciones hacen falta para que j llegue a 0 (cero)? 15/05/05 Programación Digital I 5 Acumulador Variable cuyo valor se incrementa o decrementa en una cantidad variable cada vez que se produce un determinado suceso o acción. Se debe realizar primeramente una operación de inicialización y posteriormente los correspondientes incrementos o decrementos. 15/05/05 Programación Digital I 6 Operaciones sobre un Acumulador Inicialización: acumulador = valor inicial Acumulación: acumulador = acumulador + valor acumulador = acumulador * valor acumulador = acumulador - valor acumulador = acumulador / valor 15/05/05 Programación Digital I 7 Ejemplo float iterador = 0, nota = 15.5; unsigned multiplicador = 1; // valor distinto de cero signed divisor = 2021; - Acumular (Incrementos) iterador = iterador + nota; multiplicador = multiplicador * nota; multiplicador *= nota; - Acumular (Decrementos) iterador = iterador – nota; multiplicador /= nota; 15/05/05 Programación Digital I 8 Centinela Es el valor asignado a una variable que hace que se ejecute un bloque de instrucciones. Por lo general existen dos puntos críticos dentro del algoritmo, cuando se pregunta por el valor centinela y cuando se cambia de valor. Ejemplo char bandera = 1; inicio: … // cuerpo del programa; … // punto de cambio; bandera = 0; if (bandera) goto inicio; 15/05/05 Programación Digital I 9 Repita Mientras Diagrama de flujo Pseudocódigo en español Repita mientras (condición) S1 … Sn Fin_RM Código en C while (condición) { S1 … Sn } 15/05/05 Programación Digital I 10 Repita Mientras Las sentencias (una o más) del cuerpo del lazo se ejecutan mientras la condición (expresión lógica) es cierta. Cuando la condición es falsa, termina la ejecución del lazo. Se pregunta al principio por la condición, por tanto el lazo se ejecuta cero (si la primera vez la condición es falsa) o mas veces. Si la condición nunca se hace falsa, el programa entra en un “lazo infinito”, es decir, las sentencias del cuerpo del lazo se ejecutarán indefinidamente. 15/05/05 Programación Digital I 11 Repita Mientras Hay que estar pendientes de INICIALIZAR las variables que intervienen en la condición antes de ejecutar el lazo por primera vez, ya que lo primero que hace la estructura es evaluar la condición. Hay que estar pendientes de MODIFICAR dentro del cuerpo del lazo los valores de las variables que intervienen en la condición, para garantizar que en algún momento ésta se haga falsa y el lazo pueda terminar su ejecución y así tratar que el lazo no sea infinito. 15/05/05 Programación Digital I 12 Ejemplo Pseudocódigo en Español Código en C i=0; #define MAX 1000 REPITA MIENTRAS (i<MAX) i=i+1; Escribir (i) Fin_RM. int i=0; while (i < MAX) { i++; printf(“%i”,i); } NOTA: recuerde usar las llaves {} cuando haya más de una instrucción. 15/05/05 Programación Digital I 13 Ejemplo Pseudocódigo en Español Código en C pot = 1 #define MAXPOT 500 REPITA MIENTRAS (pot < 500) pot = pot * 2; int pot=1; while (pot < MAXPOT) Fin_RM pot *=2; Escribir(“potencia =“,pot) printf(“potencia: %i“,pot); NOTA: recuerde que puede omitir las llaves {} cuando hay solo una instrucción. 15/05/05 Programación Digital I 14 Ejemplo Pseudocódigo en Español Código en C bandera = cierto; contador = 1; REPITA MIENTRAS (bandera = cierto) Escribir(contador) contador = contador + 1 Si (contador = 10) bandera = falso; Fin_si Fin_RM #define true 1 char bandera=true; int contador=1; 15/05/05 while (bandera) { printf(“%i”,contador); contador++; if (contador == 10) bandera = !bandera; } Programación Digital I 15 Ejemplo Pseudocódigo en Español Código en C seguir = verdadero respuesta = ‘s’ REPITA MIENTRAS (seguir=verdadero) Escribir (“¿Seguir repitiendo?”) Leer (respuesta) Si respuesta = ‘n’ seguir = falso Fin_Si Fin_RM char seguir = TRUE; char respuesta = ‘s’; while (seguir) { printf(“¿Seguir repitiendo?”); scanf(“%c”,&respuesta); if (respuesta == ‘n’) seguir = false; } seguir = verdadero REPITA MIENTRAS (seguir = verdadero) contador = contador + 1 Fin_RM char seguir = 1; int contador = 0; while(seguir) contador+=1; 15/05/05 Programación Digital I 16 Ejemplo Corrida en Frío #include <stdio.h> void main() { int i = 0,suma = 0; while(i<5) { suma += i; i++; printf(“%i”,suma); } } 15/05/05 Programación Digital I Iteración i suma (0) 0 0 (1) 1 0 (2) 2 1 (3) 3 3 (4) 4 6 (5) 5 10 17 Ejemplo #include <stdio.h> Corrida en Frío void main () { int i = 1; while ( i < 3 ) { printf(”i es menor que 3\n”); i++; } printf(”Se termino el lazo\n”); Iteración i (0) 1 (1) 2 (2) 3 } 15/05/05 Programación Digital I 18 Salidas abruptas del while Algunas veces es conveniente salir de forma abrupta de una estructura de repetición. Para esto se utiliza la sentencia break. Según break, el lazo de repetición más interno se cancelará. 15/05/05 Programación Digital I 19 Ejemplo de break Observe que: ➢ Hay un par de while anidados ➢ El break esta dado por una condición y se encuentra en el while más interno. ➢ La condición que imperará en el lazo interno será la del if. Int i, j; i=0; j=0; while (i>-1) { j++; while (j<20) { printf(“Valor de j %i”,j); if (j>=15) break; // pueden haber mas instr. } } 15/05/05 Programación Digital I 20 Regreso abrupto a la condición Dentro de un lazo de repetición, se pueden hacer regresos abrutos a la condición que gobierna al lazo. El constructo en C para tal proposito es el “continue”. 15/05/05 Programación Digital I 21 Ejemplo del continue Supongamos que queremos procesar solamente los números enteros positivos de un conjunto introducido por teclado: i=0; while (i<10) { prinf(“Introduzca un número: “); scanf(“%i”,&n); if (n < 0) continue; else { i++; printf(“Procesable”); } }15/05/05 Programación Digital I 22 Ejemplo Calcular la suma de n números introducidos por teclado. Análisis E-P-S Entradas: total de números (n ∈ Z), números (a1, a2, a3, …, an ∈ Z) Proceso: Calcular suma = a1 + a2 + a3 + … + an Salidas: suma ∈ Z 15/05/05 Programación Digital I 23 Ejemplo Algortimo 0. 1. 2. 3. 4. 5. Inicio Escribir (“Introduzca el número de elementos a sumar”) Leer (n) suma = 0 contador = 0 Repita mientras (contador < n) contador = contador + 1 Escribir (“Introduzca un numero”) Leer (num) suma = suma + num fin_RM 6. Escribir (suma) 7. Fin 15/05/05 Programación Digital I 24 Estructura de Repetición “Repita mientras”: Ejemplo 3 Codificación #include <stdio.h> void main () { int n, num, suma = 0, contador = 0; printf(“Introduzca el número de sumar”); scanf(“%i”,n); while (contador < n) { contador++; printf(“Introduzca un numero”); elementos a scanf(“%i”,&num); suma += num; } 15/05/05 } printf(“Suma = %i\n“, suma); Programación Digital I 25 Ejemplo. EPS. Leer una serie de números reales y calcular su media. La marca de fin de lectura será el –999 Análisis E-P-S Entradas: num1, num2, num3, …, numn -999 Proceso: - Acumular la suma e incrementar contador de números mientras número leído sea diferente de -999 suma = num1 + num2 + num3 + … + numn contador = contador + 1 - Calcular media = suma / contador Salidas: media 15/05/05 Programación Digital I 26 Ejemplo. Algoritmo. 0. 1. 2. 3. 4. 5. Inicio contador = 0 suma = 0 Escribir (“Introduzca el primer número”) Leer (num) Repita mientras (num != -999) contador = contador + 1 suma = suma + num Escribir (“Introduzca un número”) Leer (num) Fin_RM 6. Si (contador != 0) entonces media = suma/contador Escribir (“La media es =”, media) sino Escribir (“El usuario no introdujo numeros”) Fin_Si 7. Fin 15/05/05 Programación Digital I 27 Ejemplo. Código. #include <stdio.h> if (contador != 0) { media = suma/contador; printf(“La media es = %i”, media); } else printf(“El usuario no introdujo numeros”); void main() { float contador = 0.0, suma = 0.0, media; printf(“Introduzca el primer numero”; scanf(“%i”,&num); while (num != -999.0) { contador = contador + 1.0; suma = suma + num; printf(“Introduzca un número”; scanf(“%i”,&num); } 15/05/05 } Programación Digital I 28 Ejercicios Propuestos Para cada uno de los siguientes problemas realizar el análisis EP-S, algoritmo y codificación. Hallar el resultado de la siguiente sucesión: S = 1 + 1/2 + 1/3 + 1/4 … + 1/n hasta que 1/N converja hacia e/100 (o sea igual o menor que un número e cualquiera dividido entre 100). Calcular la sumatoria de los 100 primeros números naturales. Calcular independientemente la suma de los números pares e impares comprendidos entre 1 y n. 15/05/05 Programación Digital I 29 Ejercicios Propuestos Escribir todos los enteros positivos menores que 100 omitiendo aquellos divisibles por 7. Encuentre el número de puntos con coordenadas enteras que están dentro de la elipse 2x2 + 3y2 = 100 En Caracas se hizo una encuesta de los medios de transporte urbano mas comunes. A cada persona se le preguntó si el autobús, el metro o el carro era el medio mas usado para ir al trabajo. Se permitió mas de una respuesta. El resultado de la encuesta fue el siguiente: 15/05/05 Programación Digital I 30 Ejercicios Propuestos n1 personas escogieron el autobús n2 personas escogieron el metro n3 personas escogieron el carro n4 personas escogieron el autobús y el metro n5 personas escogieron el autobús y el carro n6 personas escogieron el metro y el carro n7 personas escogieron los tres medios de transporte ¿ Cuántas personas respondieron la encuesta ? ¿ Cuántas personas escogieron sólo un medio de transporte ? ¿ Cuántas personas escogieron dos medios de transporte ? ¿ Cuántas personas escogieron los tres medios de transporte ? 15/05/05 Programación Digital I 31 Ejercicios Propuestos Leer valores que representan años e indique si son o no años bisiestos. El programa seguirá leyendo años hasta un máximo de 10 o hasta que haya leido 3 años bisiestos. Recuerde, una vez más, la regla: "Un año es bisiesto si es divisible por 400, o bien si es divisible por 4 pero no por 100" Por ejemplo, el año 2000 es bisiesto (es divisible por 400), el año 1992 es bisiesto (es divisible por 4 y no por 100), y el año 2100 no es bisiesto (es divisible por 4 y también por 100). 15/05/05 Programación Digital I 32 Ejercicios Propuestos Imprimir la tabla de multiplicar de un número dado. El funcionamiento del programa se muestra en el siguiente ejemplo de ejecución. Introduzca un número: 5 La tabla de multiplicar del 5 es: 5x1=5 5 x 2 =10 ... 5 x 10 =50 15/05/05 Programación Digital I 33