Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Iteracion en C
Iteracion en C
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
Lenguaje C
Ejemplo: Escriba el mismo programa anterior con while()
Programa 03_01b.c:
// Uso de while: Leer un número n y validar que esté entre 1 y 4:
#include<stdio.h>
void main(void){
int n = -1; // se prepara para la condición
while (n < 0 || n > 4) {
printf("Escriba un número entero entre 0 y 4: ");
scanf("%d", &n); // ingreso 5 y 2
}
printf("Número: %d\n", 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
2) Repetición For
Ejecuta varias operaciones, su diagrama de flujo es:
Sintaxis:
for([inicios]; [instrucciones, condición]; [variaciones]) bloqueInstruccion
Observe el diagrama de flujo y reconozca la secuencia de ejecución: (1), (2), (3a ó 3b) y (4):
….
… sigue a (4)
}
(3b) // viene, si condición es falsa
Ejemplo:
for(i=0; i < 3; i++) printf(“i: %d\n”, i);
Salida:
0
1
2
Ejemplo:
int i, j, k = 0;
for(i=0, j =2; k++, i < 3; i++, j--) printf("i: %d, j: %d, k: %d\n", i, j, k);
Salida:
i: 0, j: 2, k: 1
i: 1, j: 1, k: 2
i: 2, j: 0, k: 3
PÁGINA: 2
Lenguaje C
Descripción:
Parámetro Descripción Ejemplo
Inicios 0 ó más instrucciones de inicio, separadas por comas. i = 0, j = 2
Si no hay instrucciones, no se ejecuta nada.
Instrucciones 0 ó más instrucciones, separadas por comas.
Si no hay instrucciones, no se ejecuta nada
Condición 0 ó 1 condición K++, i < 3
Si no hay condición, se evalúa a Verdad
Variaciones 0 ó más instrucciones de variación, separadas por I++, j--
comas
Si no hay instrucciones, no se ejecuta nada.
bloqueInstrccion 1 ó más instrucciones printf("i: %d, j: %d, k: %d\n", i, j, k)
Si no hay instrucciones, no se ejecuta nada.
Ejemplo:
#include<stdio.h>
void main(void){
for( ; ; ) ;
}
Salida: No hace nada y no acaba nunca (se queda colgado); para matarlo: ctrl+c.
Este ejemplo que solo hace perder el tiempo, sirve para recordarnos que:
1) Si no hay inicios : No se hace nada.
2) Si no hay condición : Se evalua a verdad.
3) Si no hay variaciones: No se hace nada.
4) La instrucción ; : No hace nada.
Salir del loop: Normalmente se acaba la iteración cuando la condición es falsa; pero se puede salir antes, utilizando la instrucción
break; // que salta al final del bloque
Ejemplo:
#include<stdio.h>
void main(void){
for( ; ; ) break;
}
salida: No hace nada , pero no se queda colgado, termina de inmediato.
Anidamiento: Se pueden anidar varias estructuras: de repetición, de decisión, combinadas, en uno o más niveles.
Ejemplo: Este ejemplo ya fue presentado en los dos capítulos anteriores, ahora lo modificaremos para presentar más opciones.
Escriba un programa que lea dos enteros m > 0 y 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
5) Salir:
Elija su opción: _
PÁGINA: 3
Lenguaje C
Indicaciones:
Valide que los datos estén entre 1 y 5 // Sugerencia: Use do.
Ejecute la operación seleccionada. // Sugerencia: Use switch.
Repita la operación completa hasta que se elija 5. // Sugerencia: Use do.
Programa 03:03.c:
// Leer dos números, presentar un menú de operaciones, ejecutarlas y salir. Todo en modo controlado
#include<stdio.h>
void main(void){
int m, n, op;
printf("Ingrese un entero m = "); scanf("%d",&m);
printf("Ingrese un entero n = "); scanf("%d",&n);
do { // presentar el menú si n !=5
printf("\nOperación que requiere:\n");
printf("1) Sumar: m + n\n");
printf("2) Restar: m – n\n");
printf("3) Multiplicar: m * n\n");
printf("4) Dividir: m/n\n");
printf("5) Salir:\n");
do {
printf("Elija su opción: "); scanf("%d",&op);
} while (op<0 || op > 5); // Valida la opción entre 1 y 5
switch(op){ // Ejecuta la operación seleccionada
case 1: printf("suma = %d\n", m+n); break;
case 2: printf("Resta = %d\n", m-n); break;
case 3: printf("Multiplicación = %d\n", m*n); break;
case 4: if(n!=0) printf("División = %.2f\n", (float)m/n);
else printf("Divisor es 0\n"); break;
default: printf("Gracias por su visita\n");
}
} while(op!=5);
}
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.50 √
5 3 0 4 Divisor 0 √
6 7 Solicita opción √
7 5 sale √
PÁGINA: 4
Lenguaje C
Un nuevo algoritmo: Para resolver ciertos problemas difíciles, conocemos algoritmos fáciles de calcular, por ejemplo para hallar el
máximo común divisor de dos números m y n = MCD(m, n), 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, n) * MCM(m, n); si conocemos el MCM(m, n)
d) Podemos disponer de un nuevo algoritmo que utiliza el poder de cálculo del computador; por ejemplo para hallar el MCD(m, n)
podemos aplicar la definición literalmente, cosa que no hacíamos antes porqué era muy pesado calcular. 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,n);
b. MCD = 1;
c. for(i = 2; i <= mn; i++) MCD = (m%i==0 && n%i==0)? i:MCD;
// (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, o no, primo; aplicamos la definición literal y la calculamos
con el computador. No siempre es posible aplicar este método: ya sea porqué los algoritmos requieren mucho calculo, aún
para una computadora o no tienen solución.
Resumen de iteraciones: Hemos estudiado tres tipos; cada uno de ellas itera (inicio, proceso repetitivo y fin), pero con distinta
secuencia:
prepararInicios; condición de fin; prepararLoop, ejecutarTarea; prepararFin
Ejemplo: Una estudiante de C tiene insomnio, un colega decide ayudarla y le escribe un programa bien cuchi (así se dice en mi tierra)
escrito en C: zz.c, el cual muestra en el monitor:
3 ovejitas
6 conejitos
9 ovejitas
…
96 conejitos
99 ovejitas
96 conejitos
….
3 ovejitas
zzz zzz ….C que te quito el sueño, C que te hago soñar despierta y, C hacerte dormir: Linda noche para la más linda.
Sugerencias:
1) Use do{ .. } while( … );
2) Fíjese que se escriben conejitos para los números pares, y ovejitas para los impares
3) Para cambiar el salto de 3 a -3, escriba: salto = (n==99)? -3 :salto; // donde n, es la variable que se imprime
Nota: El programa será corto, robusto (correcto, flexible), ingenioso, a esto se le llama sexi en el argot de computación.
Progama 03_04a.c:
// Conejitos - ovejitas
#include<stdio.h>
void main(void){
int n = 3, salto = 3; // preparar Inicios
do{
if(n%2==0) printf("\n%d conejitos", n); // Ejecutar tarea
else printf("\n%d ovejitas", n); // Ejecutar tarea
n += salto; // prepararLoop
salto = (n==99)? -3:salto; // prepararLoop
} while(n>0);
printf("\nzzz zzz ….C que te quito el sueño, C que te hago soñar despierta y, C hacerte dormir: \
Linda noche para la más linda.\n"); // prepararFin
}
PÁGINA: 5
Lenguaje C
Salida: Se muestra lo prometido
1) Solicitud del usuario: Definición del entregable incluyendo la matriz de pruebas, la cual es parte de las condiciones de aceptación.
Entregable: programa en C: Dado un entero n >=0, grafique un rombo relleno, con diagonales 2n+1.
Matriz de Prueba:
Caso Entrada: n Salida Chequeo
1 0 *
2 1 *
* * *
*
3 2 *
* * *
* * * * *
* * *
*
Alternativa
Algoritmo Poner el eje de coordenadas en el centro del rombo, Poner el eje de coordenadas a la izquierda, 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.
Todos los * del primer cuadrante cumplen: Calcular el número de * na e imprimirlos.
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
PÁGINA: 6
Lenguaje C
// solución completa: simetría en los dos ejes // solución completa: simetría con eje horizontal
#include<stdio.h> #include<stdio.h>
void main(void){ void main(void){
int n, i, j, ai, aj; int n, i, j, nb, na;
printf("Ingrese un entero >= 0: "); printf("Ingrese un entero >= 0: ");
scanf("%d", &n); scanf("%d", &n);
for(i=n; i>=-n; i--){ for(i=n; i>=-n; i--){
ai = abs(i); nb = abs(i);
for(j=-n; j<=n; j++){ for(j=0; j<= nb; j++) printf (" ");
aj = abs(j); na = 2*(n-nb);
if(ai+aj<=n) printf (" *"); for(j=0; j<= na; j++) printf (" *");
else printf (" "); printf("\n");
} }
printf("\n"); }
}
}
4) Prueba y entrega al usuario: Chequear la matriz de pruebas, repetir el chequeo de la matriz de prueba con el usuario y entregar.
Ejercicios:
Escriba, compile y ejecute programas que hagan lo siguiente:
1) Lea un número entero n, calcule el factorial de n! = 1*2*3..*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, y muestre n y sn, de dos modos:
a) sn = n*(n+1)/2
b) utilizando while () {….}
4) Lea dos números enteros m y n positivos, encuentre el máximo común divisor MCD e imprima, utilice el método de aplicar la
definición literal sugerido antes.
5) Lea dos números enteros m y n positivos, encuentre el máximo común divisor MCD y el mínimo común múltiplo MCM e
imprímalos.
PÁGINA: 8