Você está na página 1de 9

Lenguaje C

Estructuras de Control Repetitivo


Una estructura de control repetitivo es una instruccin compleja compuesta por:
Un condicin de repeticin
Un bloque o instruccin que se repite de acuerdo a la condicin.

Diagrama ejemplo:

inicio de repeticin

bloque o instruccin

preparacin para repetir


condicin de repeticin

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)

(4) (3a) (3b)

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:

for( (1)inicios; (2)instrucciones, condicin; (4) variaciones) {


(3a) // viene, si condicin es verdad

.
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.

// 03_02.c : Elevar al cuadrado los primeros 5 enteros


#include<stdio.h>
void main(void){
int n;
printf("Numero Cuadrado");
for(n = 0; n < 3; n++) // inicios: n = 0, condicin: n < 3, variaciones: n++
printf("\n%d\t%d", n, n*n);
printf("\n");
}
Salida:
Nmero Cuadrado
0 0
1 1
2 4

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) { }.

03_05.c : Leer y sumar nmeros. Desarrolle las 3 alternativas usando bucles.


Lea n > 0, lea y sume n datos Lea y sume datos positivos, termine si un dato es negativo.
#include<stdio.h>
void main(void){
int i, n, dato, suma = 0; int dato = 0, suma = 0; int dato, suma = 0;
printf("Ingrese el nmero de datos: "); printf("Ingrese dato: ");
scanf("%d", &n); scanf("%d", &dato);
for (i=1; i <= n; i++) { do { while (dato > 0){
printf("Ingrese dato: "); suma += dato; suma += dato;
scanf("%d", &dato); printf("Ingrese dato: "); printf("Ingrese dato: ");
suma += dato; scanf("%d", &dato); scanf("%d", &dato);
} } while (dato > 0); }
printf("la suma es: %d\n", suma);
}

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

Pasos para desarrollar un programa


Un programa se puede desarrollar en 4 pasos, vemoslo con un ejemplo concreto: Graficar en el monitor.

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 *
* * *
* * * * *
* * *
*

2) Algoritmo de solucin: algoritmo matemtico, pseudo-cdigo.


Este no es un problema sencillo de programar y requiere del apoyo de nuestros conocimientos de matemticas. Hay dos alternativas
para la solucin.
Nota: En matemticas identificamos a los ejes de coordenadas con X y Y; en computacin, para nmeros enteros solemos identificar
las filas con i (eje Y) y las columnas con j (eje X).

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

Pseudocdigo 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
Si i + j <= n imprimir *, sino imprimir blanco na = 2(n-i); imprimir

PGINA: 7
Lenguaje C

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); aj = abs(j) // valores absolutos nb = ai; imprimir
Si ai + aj <= n imprimir *, sino imprimir blanco na = 2(n-ai) -1; imprimir

Se elije la posicin de los ejes que ms facilite el algoritmo.

3) Programacin: diseo, desarrollo, validacin contra la matiz de pruebas.


// 03_07a.c: Ejes en el centro del rombo // 03_07b.c: Ejes a la izquierda del rombo

// primer cuadrante, para probar // parte superior, para probar


#include<stdio.h> #include<stdio.h>
void main(void){ void main(void){
int n, i, j; 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>=0; i--){ for(i=n; i>=0; i--){
for(j=0; j<=n; j++) nb = i;
if(i+j<=n) printf (" *"); for(j=0; j<= nb; j++) printf (" ");
else printf (" "); na = 2*(n-i);
printf("\n"); for(j=0; j<= na; j++) printf (" *");
} printf("\n");
} }
}

// 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"); }
}
}

Salida: Se grafica el rombo

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 () {.}

3) Lea un nmero entero n y determine si es no primo, Hgalo de 3 formas distintas. Imprima:


n es primo
n no es primo

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.

6) Que hace el siguiente programa:



int i, j;
for(i=0, j=20; i < 10; i++, j--) printf("\ni= %d; j = %d", i, j);

PGINA: 9

Você também pode gostar