Lenguaje C

Estructuras de Control Repetitivo
Una estructura de control repetitivo es una instrucción compleja compuesta por:
Un condición de repetición
Un bloque o instrucción que se repite de acuerdo a la condición.
Hay 3 tipos de estructuras de control repetitivo

1) Repetición Do While
Ejecuta un bloqueInstruccion y verifica un condición de repetición de ejecución

Diagrama de flujo

Sintaxis:
do bloqueInstruccion while(condición);

Ejemplo: Escribir un programa que lea un número n y valide (verifique) que su valor esté entre 1 y 4:
Programa 03_01a.c:
// Uso de do: Leer un número n y validar que esté entre 1 y 4:
#include<stdio.h>
void main(void){
int n;
do {
printf("Escriba un número entero entre 0 y 4: ");
scanf("%d", &n); // ingreso 6 y 3
} while (n < 0 || n > 4);
printf("Número: %d\n", n);
}
Salida:
Escriba un número entero entre 0 y 4: 6 // Repite porque no cumple con la restricción
Escriba un número entero entre 0 y 4: 3
Número: 3

2) Repetición While
Verifica un condición, si es verdad ejecuta una bloqueInstruccion y vuelve a verificar la condición.
Sintaxis
while (condición) bloqueInstruccion

Diagrama de flujo

PÁGINA: 1

… sigue a (4) } (3b) // viene. i < 3. n). j: 2. i < 3. si condición es verdad …. i. j: %d. Lenguaje C Ejemplo: Escriba el mismo programa anterior con while() Programa 03_01b. k: 3 PÁGINA: 2 . j: 0. en la sintaxis se apreciaría así: for( (1)inicios. (2)instrucciones. k = 0. // ingreso 5 y 2 } printf("Número: %d\n". Salida: i: 0. j =2. scanf("%d". k: %d\n". Salida: 0: 0 1: 1 2: 4 Ejemplo: int i. (2). [instrucciones.c: // Uso de while: Leer un número n y validar que esté entre 1 y 4: #include<stdio. for(i=0. condición. k: 2 i: 2. j: 1. j. i. i++. (3a ó 3b) y (4). j--) printf("i: %d. k).h> void main(void){ int n = -1. &n). (4) variaciones) { (3a) // viene. j. i++) printf("%d: %d\n". } Salida: Escriba un número entero entre 0 y 4: 5 // Repite porque no cumple con la restricción Escriba un número entero entre 0 y 4: 2 Número: 3 3) Repetición For Ejecuta varias operaciones. k: 1 i: 1. // se prepara para la condición while (n < 0 || n > 4) { printf("Escriba un número entero entre 0 y 4: "). su diagrama de flujo es: (1) (2) (4) (3a) (3b) Sintaxis: for([inicios]. k++. condición]. si condición es falsa Ejemplo: for(i=0. i*i). [variaciones]) bloqueInstruccion Flujo de ejecución del for: Observe el flujo de ejecución en el diagrama (1).

de decisión. Lenguaje C Descripción: Parámetro Descripción Ejemplo Inicios 0 ó más instrucciones de inicio. no se ejecuta nada. Anidamiento: Se pueden anidar varias estructuras: de repetición. n < 3. sirve para recordarnos que: 1) Si no hay inicios : No se hace nada. k: %d\n". } Salida: Número Cuadrado 0 0 1 1 2 4 Ejemplo: #include<stdio. se evalúa a Verdad Variaciones 0 ó más instrucciones de variación. j-- comas Si no hay instrucciones. termina de inmediato. Ejemplo: Este ejemplo ya fue presentado en los dos capítulos anteriores. j = 2 Si no hay instrucciones.h> void main(void){ int n. separadas por comas. printf("\n"). para matarlo: ctrl+c.h> void main(void){ for( . n. pero no se queda colgado. for(n = 0. luego presente el menú: Operación que requiere: 1) Sumar: m + n 2) Restar: m – n 3) Multiplicar: m * n 4) Dividir: m/n // Atento a la división entre 0 5) Salir: Elija la operación: _ PÁGINA: 3 . 2) Si no hay condición : Se evalua a verdad. } salida: No hace nada . 4) La instrucción . separadas por I++.c: // Elevar al cuadrado los primeros 5 enteros #include<stdio. Salir del loop: Normalmente se acaba la iteración cuando la condición es falsa. utilizando la instrucción break. i < 3 Si no hay condición. . Este ejemplo que solo hace perder el tiempo. Ejemplo: Escriba un programa que eleva al cuadrado los primeros 5 enteros: Programa 03_02. : No hace nada. Si no hay instrucciones. k) Si no hay instrucciones. no se ejecuta nada Condición 0 ó 1 condición K++. ) break. Escriba un programa que lea dos enteros m y n . combinadas. } Salida: No hace nada y no acaba nunca (se queda colgado). bloqueInstrccion 1 ó más instrucciones printf("i: %d. . n*n). no se ejecuta nada. i. ahora lo modificaremos para presentar más opciones. // que salta al final del bloque Ejemplo: #include<stdio. j. no se ejecuta nada. n++) // inicios: n = 0 condición: n < 3 variaciones: n++ printf("\n%d\t%d". ) . en uno o más niveles.h> void main(void){ for( . Instrucciones 0 ó más instrucciones. j: %d. printf("Numero Cuadrado"). separadas por comas. pero se puede salir antes. i = 0. 3) Si no hay variaciones: No se hace nada.

do { printf("Elija su opción: "). Todo en modo controlado #include<stdio. break. break. printf("1) Sumar: m + n\n"). } Salida: Matriz de prueba: Caso Entradas Salida Chequeo m n opción 1 3 2 1 5 √ 2 3 2 2 1 √ 3 3 2 3 6 √ 4 3 2 4 1.&m). case 2: printf("Resta = %d\n". do { // presentar el menú si n !=5 printf("\nOperación que requiere:\n"). // Sugerencia: Use do. printf("2) Restar: m – n\n"). printf("Ingrese un entero m = "). // Sugerencia: Use switch. case 4: if(n!=0) printf("División = %. printf("4) Dividir: m/n\n"). presentar un menú de operaciones.&n).h> void main(void){ int m. lo cual termina el programa. } while (op<0 || op > 5). scanf("%d". } } while(op!=5). printf("3) Multiplicar: m * n\n"). Ejecute la operación seleccionada. Lenguaje C Indicaciones: Valide que la operación esté entre 1 y 5. m*n).c: // Leer dos números. op. // Sugerencia: Use do. else printf("Divisor es 0\n"). break. m+n). default: printf("Gracias por su visita\n"). Programa 03:03. ejecutarlas y salir. // Valida la opción entre 1 y 5 switch(op){ // Ejecuta la operación seleccionada case 1: printf("suma = %d\n". printf("Ingrese un entero n = "). Presente nuevamente el menú hasta que operación = 5.2f\n". n. printf("5) Salir:\n").50 √ 5 3 0 4 Divisor 0 √ 6 7 Solicita opción √ 7 5 sale √ PÁGINA: 4 . m-n). (float)m/n). case 3: printf("Multiplicación = %d\n". scanf("%d".&op). break. scanf("%d".

variaciones. i<=n. } if(nd == 2) printf("%d Es primo\n". i <= mn. n) * MCM(m. nd = (n==1)? 2 : 1. ni variaciones. y saltará al final de la estructura. Si nd = 2 → n es primo i = 2. Ejemplo: Escriba un programa que lea un número entero > 0 y determine si es primo o no. primo. i.h> void main(void){ int n. [variaciones]) bloqueInstruccion Si fuera necesario abandonar un bloque. conocemos algoritmos fáciles de calcular.. n). do { while (i<=n) { if(n%i == 0) nd++. Se podría dejar de dividir al encontrar el primer i (2 <= i < n) que divida a n.} while(. Desarrolle las 3 alternativas usando bucles. n) podemos aplicar la definición literalmente. }.. do { while(condición) { for([inicios].. ejecutarTarea. aplicamos la definición literal y la calculamos con el computador. y el algoritmo sería más rápido: PÁGINA: 5 . y while(…) {….} while(.. Un número es primo si es divisible solo por 1 y por si mismo: Número de divisores nd = 2. se colocados fuera: Inicios. la diferencia está en el orden que se dan. Resumen de las iteraciones: Hemos estudiado tres tipos de iteración. MCD = 1. ejecutarTarea. todas manejan los mismos componentes: inicio.} no tiene inicios. else printf("%d No es primo\n". &n).. i = 2. n). variaciones. // nd = número de divisores printf("Ingrese un entero > 0: "). No siempre es posible aplicar este método: ya sea porqué los algoritmos requieren mucho calculo. n). } Este algoritmo divide n entre todos los i (2 <= i <= n). [variaciones]) { ejecutarTarea. // (m%i==0 && n%i==0) quiere decir que i es común divisor de m y n Este mismo caso se presenta si queremos saber si un número es. ¿cuál elegir?. variaciones.. if(n%i == 0) nd++. #include<stdio.) si no es necesario el inicio Caso contrario: Elija while (condición) bloque. n). o no. Inicios. while (condición) bloqueInstruccion for([inicios]. i++) MCD = (m%i==0 && n%i==0)? i:MCD. Apreciamos que do {.).. n) d) Podemos disponer de un nuevo algoritmo que utiliza el poder de cálculo del computador.. i++. nd. } } while(condición). condición y bloque de repetición. condición]. for(i=2. puede usar break. un criterio puede ser: Elija for() si tiene claramente definidos el inicio y el fin. Lenguaje C Un nuevo algoritmo: Para resolver ciertos problemas difíciles. i++. si conocemos el MCM(m. for(i = 2.n). [condición]. por ejemplo para hallar el máximo común divisor de dos números m y n = MCD(m. Caso contrario: Elija do {. por ejemplo para hallar el MCD(m. ¿Cuál de las estructuras de repetición elegir? Se puede utilizar cualquiera de las 3. b. c. aún para una computadora o no tienen solución. Vamos a compararlos (hacer un benchmark): Sintaxis: do bloqueInstruccion while(condición). // Caso especial para n = 1. [instrucciones. conocemos tres algoritmos clásicos: a) El método de Euclides b) El que nos enseñaron en la escuela: Producto de (factores primos de m y n comunes de menor potencia): c) Aplicar la fórmula m*n = MCD(m. El algoritmo aplica la definición en modo literal y es muy fácil ya que aplica la definición literal: a. mn = mínimo(m. i++) if(n%i==0) nd++. cosa que no hacíamos antes porqué era muy pesado calcular. } while (i<=n). scanf("%d".

un colega decide ayudarla y le escribe un programa bien cuchi (así se dice en mi tierra) escrito en C: zz.c. scanf("%d". 2) Fíjese que se escriben conejitos para los números pares. robusto (correcto.c: Usando for. Observe el cambio de las preparaciones: #include<stdio. salto = 3. ingenioso. // Ejecutar tarea n += salto. y ovejitas para los impares Nota: El programa será corto. C que te hago soñar despierta y. C que te hago soñar despierta y. Sugerencias: 1) Use do{ . Esperemos que se duerma la chica y que el chico haya aprendido a usar las instrucciones do y for PÁGINA: 6 . C hacerte dormir: Linda noche para la más linda. // prepararLoop } while(n>0). } while(i<n). C hacerte dormir: \ Linda noche para la más linda. el cual muestra en el monitor: 3 ovejitas 6 conejitos 9 ovejitas … 96 conejitos 99 ovejitas 96 conejitos ….C que te quito el sueño. n).c: // Conejitos . } Salida: Se muestra lo prometido. n). salto = 3. for(n = 3. // prepararFin } Salida: Se muestra lo prometido Progama 03_04b..C que te quito el sueño. C hacerte dormir: Linda noche para la más linda. // prepararLoop if(n==99) salto = -3. printf("\nzzz zzz …. else printf("\n%d ovejitas". flexible). salto. do { while(i<n) { if(n%i==0) break. i = 2. Progama 03_04a. n>0. salto = (n==99)? -3:salto) { if(n%2==0) printf("\n%d conejitos". // preparar Inicios do{ if(n%2==0) printf("\n%d conejitos". Lenguaje C #include<stdio.h> void main(void){ int n. i<n. a esto se le llama sexi en el argot de computación. } if(i<n) printf("%d No es primo\n". i = 2. i++.\n").ovejitas #include<stdio. for(i=2. } while( … ). i. if(n%i == 0) break.h> void main(void){ int n = 3. } Ejemplo: Una estudiante de C tiene insomnio. printf("Ingrese un entero > 0: "). // Ejecutar tarea else printf("\n%d ovejitas". else printf("%d Es primo\n".h> void main(void){ int n. n).\n"). n += salto. 3 ovejitas zzz zzz …. i++. n). i++) if(n%i == 0) break.C que te quito el sueño. n). C que te hago soñar despierta y. } printf("\nzzz zzz …. n). &n).

Alternativa Algoritmo Poner el eje de coordenadas en el centro del rombo. PÁGINA: 7 . Lenguaje C Pasos para desarrollar un programa Un programa se puede desarrollar en 4 pasos.c: Ejes en el centro del rombo 03_05b. Hay dos alternativas para la solución. i. para números enteros solemos identificar las filas con i (eje Y) y las columnas con j (eje X).c: Ejes a la izquierda del rombo // primer cuadrante. imprimir Se elije la posición de los ejes que más facilite el algoritmo. la cual es parte de las condiciones de aceptación. j. 3) Programación: diseño. sino imprimir blanco na = 2(n-i). i. printf("Ingrese un entero >= 0: "). imprimir Si ai + aj <= n imprimir *. Poner el eje de coordenadas a la izquierda. Todos los * del primer cuadrante cumplen: Calcular el número de * na e imprimirlos. Matriz de Prueba: Caso Entrada: n Salida Chequeo 1 0 * 2 1 * * * * * 3 2 * * * * * * * * * * * * * 2) Algoritmo de solución: algoritmo matemático. na. i + j <= n nb = i na = 2(n-i) -1 Otros cuadrantes: Aplicar simetrías con los dos ejes Parte inferior: Aplicar simetría con el eje horizontal Pseudocódigo Primer Cuadrante: Parte superior: Variar i: n → 0 // eje vertical Variar i: n → 0 // eje vertical Variar j: 0 → n // eje horizontal nb = n-i. imprimir Otros cuadrantes: Parte inferior: Variar i: n → -n // eje vertical Variar i: n → -n // eje vertical Variar j: -n → n // eje horizontal ai = abs(i) // valor absoluto ai = abs(i). para probar #include<stdio. veámoslo con un ejemplo concreto: Graficar en el monitor. pseudo-código. aj = abs(j) // valores absolutos nb = ai. Entregable: programa en C: Dado un entero n >=0. 1) Solicitud del usuario: Definición del entregable incluyendo la matriz de pruebas. sino imprimir blanco na = 2(n-ai) -1. graficar la matemático graficar en el primer cuadrante: parte superior: La linea de borde del rombo cumple la ecuación: Para cada fila i: i = -j +n Calcular el número de blancos nb e imprimirlos. con diagonales 2n+1. imprimir Si i + j <= n imprimir *. Este no es un problema sencillo de programar y requiere del apoyo de nuestros conocimientos de matemáticas. Programas: 03_05a. nb. int n.h> #include<stdio. j. para probar // parte superior. desarrollo.h> void main(void){ void main(void){ int n. en computación. printf("Ingrese un entero >= 0: "). grafique un rombo relleno. Nota: En matemáticas identificamos a los ejes de coordenadas con X y Y. validación contra la matiz de pruebas.

int n. i>=-n. Imprima: n es primo n no es primo 4) Lea dos números enteros m y n positivos. i < 10. Lenguaje C scanf("%d". j++) printf (" "). printf("\n"). &n). nb = abs(i). printf("Ingrese un entero >= 0: "). j<= nb. for(j=0. scanf("%d". for(j=-n. encuentre el máximo común divisor MCD e imprima. utilice for. encuentre el máximo común divisor MCD y el mínimo común múltiplo MCM e imprímalos.h> #include<stdio. calcule el factorial de n! = 1*2*3. for(j=0. } } printf("\n"). repetir el chequeo de la matriz de prueba con el usuario y entregar. j<= nb. na. &n).*n utilizando do … while y muestre n y n! 2) Lea un número entero n y calcule la suma sn de los n primeros números: sn = 1 + 2 + … + n. j++) printf (" *"). compile y ejecute programas que hagan lo siguiente: 1) Lea un número entero n. j=20. i--){ for(i=n. i>=0. printf("\n"). nb. i>=0. 6) Que hace el siguiente programa: … int i. j. } printf("\n").} 3) Lea un número entero n y determine si es ó no primo. if(ai+aj<=n) printf (" *"). scanf("%d". j = %d". aj. for(i=n. j++){ for(j=0. j++) nb = i. utilice el método de aplicar la definición literal sugerido antes. y muestre n y sn. 5) Lea dos números enteros m y n positivos. else printf (" "). j. PÁGINA: 8 . } } } Salida: Se grafica el rombo 4) Prueba y entrega al usuario: Chequear la matriz de pruebas. i. i>=-n. printf("Ingrese un entero >= 0: "). if(i+j<=n) printf (" *"). i--){ for(j=0.h> void main(void){ void main(void){ int n. i. j<=n. j<= na. aj = abs(j). i++. &n). else printf (" "). j++) printf (" *"). i--){ for(i=n. &n). Ejercicios: Escriba. for(j=0. i. i--){ ai = abs(i).. j. for(i=0. scanf("%d". for(i=n. j<=n. ai. j--) printf("\ni= %d. } } } // solución completa: simetría en los dos ejes // solución completa: simetría con eje horizontal #include<stdio. j++) printf (" "). de dos modos: a) sn = n*(n+1)/2 b) utilizando while () {…. na = 2*(n-nb). j). na = 2*(n-i). j<= na.