Escolar Documentos
Profissional Documentos
Cultura Documentos
Diagrama ejemplo:
inicio de repeticin
bloque o instruccin
Estas 4 componentes SIEMPRE estn presentes en un proceso repetitivo, -aunqe muchas veces parecen omitirse. Pueden cambiar de
posicin en el programa; lo cual genera 3 tipos de estructuras de control repetitivo.
1) Repeticin Do While
Ejecuta un bloqueInstruccion y verifica un condicin de repeticin de ejecucin
Diagrama de flujo
Sintaxis:
do bloqueInstruccion while(condicion);
// 03_01a.c : Escribir un programa que lea un nmero n y valide (verifique) que su valor est entre 1 y 4
#include<stdio.h>
void main(void){
int n;
do {
printf("Escriba un nmero entero entre 0 y 4: ");
scanf("%d", &n); // ingrese 6 y 3
} while (n < 0 || n > 4);
printf("Nmero: %d\n", n);
}
Salida:
Escriba un nmero entero entre 0 y 4: 6 // Repite porque no cumple con la restriccin
Escriba un nmero entero entre 0 y 4: 3
Nmero: 3
2) Repeticin While
Verifica un condicin, si es verdad ejecuta una bloqueInstruccion y vuelve a verificar la condicin.
Sintaxis
while (condicin) bloqueInstruccion
PGINA: 1
Lenguaje C
Diagrama de flujo
Repetir el programa anterior: leer un nmero n y validar (verificar) que su valor est entre 1 y 4
// 03_01a.c : do bloqueInstruccion while(condicion) // 03_01b.c : while (condicin) bloqueInstruccion
#include<stdio.h>
void main(void){
int n; int n = -1;
do { while (n < 0 || n > 4) {
printf("Escriba un nmero entero entre 0 y 4: ");
scanf("%d", &n); // ingrese 6 y 3
} while (n < 0 || n > 4); }
printf("Nmero: %d\n", n);
}
Salida:
Escriba un nmero entero entre 0 y 4: 6 // Repite porque no cumple con la restriccin
Escriba un nmero entero entre 0 y 4: 3
Nmero: 3
3) Repeticin For
Ejecuta varias operaciones, su diagrama de flujo es:
(1)
(2)
Sintaxis:
for([inicios]; [instrucciones, condicin]; [variaciones]) bloqueInstruccion
Flujo de ejecucin del for: Observe el flujo de ejecucin en el diagrama (1), (2), (3a 3b) y (4); en la sintaxis se apreciara as:
.
sigue a (4)
}
(3b) // viene, si condicin es falsa
PGINA: 2
Lenguaje C
Ejemplo:
for(i=0; i < 3; i++) printf("%d: %d\n", i, i*i);
Salida:
0: 0
1: 1
2: 4
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
Descripcin:
Parmetro Descripcin Ejemplo
Inicios 0 ms instrucciones de inicio, separadas por comas. i = 0, j = 2
Si no hay instrucciones, no se ejecuta nada.
Instrucciones 0 ms instrucciones, separadas por comas. K++,
Si no hay instrucciones, no se ejecuta nada
Condicin 0 1 condicin i<3
Si no hay condicin, se evala a Verdad
Variaciones 0 ms instrucciones de variacin, separadas por I++, j--
comas
Si no hay instrucciones, no se ejecuta nada.
bloqueInstrccion 1 ms 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 condicin : Se evalua a verdad.
3) Si no hay variaciones: No se hace nada.
4) La instruccin ; : No hace nada.
Salir del loop: Normalmente se acaba la iteracin cuando la condicin es falsa; pero se puede salir antes, utilizando la instruccin
break; // que salta al final del bloque
Ejemplo:
#include<stdio.h>
void main(void){
for( ; ; ) break;
}
PGINA: 3
Lenguaje C
salida: No hace nada , pero no se queda colgado, termina de inmediato.
Anidamiento: Se pueden anidar varias estructuras: de repeticin, de decisin, combinadas, en uno o ms niveles.
Ejemplo: Este ejemplo ya fue presentado en los dos captulos anteriores, ahora lo modificaremos para presentar ms opciones.
Escriba un programa que lea dos enteros m y n , luego presente el men:
Operacin que requiere:
1) Sumar: m + n
2) Restar: m n
3) Multiplicar: m * n
4) Dividir: m/n // Atento a la divisin entre 0
5) Salir:
Elija la operacin: _
Indicaciones:
Valide que la operacin est entre 1 y 5. // Sugerencia: Use do.
Ejecute la operacin seleccionada. // Sugerencia: Use switch.
Presente nuevamente el men hasta que operacin = 5, lo cual termina el programa. // Sugerencia: Use do.
// 03_03.c : Leer dos nmeros, presentar un men de operaciones, ejecutarlas repetidamente y salir finalmente.
#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("\nOperacin 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 opcin: "); scanf("%d",&op);
} while (op<1 || op > 5); // Valida la opcin entre 1 y 5
switch(op){ // Ejecuta la operacin seleccionada
case 1: printf("suma = %d\n", m+n); break;
case 2: printf("Resta = %d\n", m-n); break;
case 3: printf("Multiplicacin = %d\n", m*n); break;
case 4: if(n!=0) printf("Divisin = %.2f\n", (float)m/n);
else printf("Divisor es 0\n"); break;
default: printf("Gracias por su visita\n");
}
} while(op!=5);
}
Salida:
PGINA: 4
Lenguaje C
Matriz de prueba:
Caso Entradas Salida Chequeo
m n opcin
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 opcin
7 5 Sale del programa
Un nuevo algoritmo: Para resolver ciertos problemas difciles, conocemos algoritmos fciles de calcular, por ejemplo para hallar el
mximo comn divisor de dos nmeros m y n = MCD(m, n), conocemos tres algoritmos clsicos:
a) El mtodo de Euclides
b) El que nos ensearon en la escuela: Producto de (factores primos de m y n comunes de menor potencia):
c) Aplicar la frmula 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 clculo del computador; por ejemplo para hallar el MCD(m, n)
podemos aplicar la definicin literalmente, cosa que no hacamos antes porqu era muy pesado calcular. El algoritmo aplica la
definicin en modo literal y es muy fcil ya que aplica la definicin literal:
a. mn = mnimo(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 comn divisor de m y n
Este mismo caso se presenta si queremos saber si un nmero es, o no, primo; aplicamos la definicin literal y la calculamos
con el computador. No siempre es posible aplicar este mtodo: ya sea porqu los algoritmos requieren mucho calculo, an
para una computadora o no tienen solucin.
Resumen de las iteraciones: Hemos estudiado tres tipos de iteracin, cul elegir?, Vamos a compararlos (hacer un
benchmark):
Sintaxis
for([inicios]; [instrucciones, condicin]; do bloqueInstruccion while(condicin); while (condicin) bloqueInstruccion
[variaciones]) bloqueInstruccion
Si fuera necesario abandonar un bloque, puede usar break; y saltar al final de la estructura.
Esquema de programacin
do {...} while(...); y while() {.}
No tienen inicios (se colocan al inicio)
No tienen variaciones (se colocan dentro).
Inicios; Inicios;
for([inicios]; [condicin]; [variaciones]) { do { while(condicin) {
ejecutarTarea; ejecutarTarea; ejecutarTarea;
variaciones; variaciones;
} } while(condicin); };
PGINA: 5
Lenguaje C
// 03_04.c : Leer un nmero entero > 0 y determine si es primo o no. Desarrolle las 3 alternativas usando bucles.
#include<stdio.h>
void main(void){
int n, i=2, primo=1;
printf("Ingrese un entero > 0: ");
scanf("%d", &n);
for(;i<n && i*i <= n && primo ; i++) if(n>2) do if(n%i++==0) primo=0; while(i<n && i*i <= n && primo)
if(n%i==0) primo=0; while(i<n && i*i <= n && primo); if(n%i++==0) primo=0;
if(primo) printf("%d es primo\n", n);
else printf("%d no es primo\n", n);
}
Qu alternativa le gusta, y por qu?
No solo es cuestin de forma y gusto, el problema especfico determina cul de las estructuras es la ms adecuada para su
programacin. Las 3 estructuras requieren los mismos componentes: inicio, variaciones, condicin y bloque de repeticin; la diferencia
est en el orden en que se dan, un criterio puede ser:
Elija for() si tiene claramente definidos el inicio y el fin.
Caso contrario:
Elija do {...} while(...) si el condicin va mejor al final
Caso contrario: Elija while (condicin) { }.
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 sueo, C que te hago soar despierta y, C hacerte dormir: Linda noche para la ms linda.
Sugerencias:
1) Use do{ .. } while( );
2) Fjese que se escriben conejitos para los nmeros pares, y ovejitas para los impares
Nota: El programa ser corto, robusto (correcto, flexible), ingenioso, a esto se le llama sexi en el argot de computacin.
PGINA: 6
Lenguaje C
// Conejitos - ovejitas
// 03_06a.c : Usa do{ } while(condicion); // 03_06b.c : Usa for
#include<stdio.h>
void main(void){
int n = 3, salto = 3; // Inicios int n, salto;
do{ for(n = 3, salto = 3; n>0; n += salto, salto = (n==99)? -3:salto) {
if(n%2==0) printf("\n%d conejitos", n); // ejecucin
else printf("\n%d ovejitas", n);
n += salto; // Variaciones
if(n==99) salto = -3; // variaciones
} while(n>0); // condicin }
printf("\nzzz zzz .C que te quito el sueo, C que te hago soar despierta y, C hacerte dormir: Linda noche para la ms
linda.\n");
}
Salida: Se muestra lo prometido
Esperemos que se duerma la chica y que el chico haya aprendido a usar las instrucciones do y for
1) Solicitud del usuario: Definicin del entregable incluyendo la matriz de pruebas, la cual es parte de las condiciones de aceptacin.
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
matemtico graficar en el primer cuadrante: parte superior:
La linea de borde del rombo cumple la ecuacin: Para cada fila i:
i = -j +n Calcular el nmero de blancos nb e imprimirlos.
Todos los * del primer cuadrante cumplen: Calcular el nmero de * na e imprimirlos.
i + j <= n nb = i
na = 2(n-i) -1
Otros cuadrantes: Aplicar simetras con los dos ejes Parte inferior: Aplicar simetra con el eje horizontal
PGINA: 7
Lenguaje C
// solucin completa: simetra en los dos ejes // solucin completa: simetra con eje horizontal
#include<stdio.h> #include<stdio.h>
#include<math.h> // compile con: -lm #include<math.h> // compile con: -lm
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 = fabs(i); nb = fabs(i);
for(j=-n; j<=n; j++){ for(j=0; j<= nb; j++) printf (" ");
aj = fabs(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.
PGINA: 8
Lenguaje C
Ejemplo: Pida ingresar un entero impar n > 3, ejemplo: n = 7 y dibuje la siguiente figura con "*":
* * * * * * *
* * * *
* * * *
* * *
* * * *
* * * *
* * * * * * *
Anlisis: Hay * en las diagonales y en los extremos: dnde conviene poner el eje de coordenadas? Hay varias alternativas:
// 03_08a.c: Ejes en el centro del rombo // 03_08b.c: Ejes arriba a la izquierda
// Variaciones: n/2 >= i >= - n/2; -n/2 <= j <= n/2 // Variaciones: 1<= i <= n; 1<= j <= n:
#include<stdio.h>
void main(void){
int n, i, j;
printf("Tamao del arreglo: "); scanf("%d", &n); // Ingrese = 7
int ai, aj;
n /=2; for(i=1; i<= n; i++){
for(i=n; i>=-n; i--){
ai =(i>0)? i:-i; // valor absoluto de i for(j=1; j<= n; j++)
for(j=-n; j<=n; j++){
aj =(j>0)? j:-j; if(i==1 || i==n || j==1 || j==n || i==j || i == n-j+1) printf("* ");
if(ai==n || aj==n || ai == aj) printf("* "); else printf(" ");
else printf(" ");
}
printf("\n");
}
}
Ejercicios:
Escriba, compile y ejecute programas que hagan lo siguiente:
1) Lea un nmero entero n, calcule el factorial de n! = 1*2*3..*n utilizando do while y muestre n y n!
2) Lea un nmero entero n y calcule la suma sn de los n primeros nmeros: sn = 1 + 2 + + n, y muestre n y sn, de dos modos:
a) sn = n*(n+1)/2
b) utilizando while () {.}
4) Lea dos nmeros enteros m y n positivos, encuentre el mximo comn divisor MCD e imprima, utilice el mtodo de aplicar la
definicin literal sugerido antes.
5) Lea dos nmeros enteros m y n positivos, encuentre el mximo comn divisor MCD y el mnimo comn mltiplo MCM e
imprmalos.
PGINA: 9