Está en la página 1de 8

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
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):

for( (1)inicios; (2)instrucciones, condición; (4) variaciones) {


(3a) // viene, si condición es verdad

….
… 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: Escriba un programa que eleva al cuadrado los primeros 5 enteros:


Programa 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 condición: n < 3 variaciones: n++
printf("\n%d\t%d", n, n*n);
printf("\n");
}
Salida:
Número 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 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

for(inicios; condición; variaciones) {...} do {..}while(condición); while(condición) { ... };


prepararInicios; prepararInicios;
for(prepararInicios; condición; prepararLoop) { do { while(condición) {
ejecutarTarea; ejecutarTarea; ejecutarTarea;
} prepararLoop; prepararLoop;
} while(condición); };
prepararFin; prepararFin; prepararFin;
El desarrollador elegirá la estructura de repetición que mejor se ajusta a su problema particular, vea los dos ejemplos siguientes:

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

Progama 03_04b.c: Usando for. Observe el cambio de las preparaciones:


#include<stdio.h>
void main(void){
int n, salto;
for(n = 3, salto = 3; n>0; n += salto, salto = (n==99)? -3:salto) {
if(n%2==0) printf("\n%d conejitos", n);
else printf("\n%d ovejitas", n);
}
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");
}
Salida: Se muestra lo prometido.
Creo que el programa resultó: bien cuchi, sexi e interesante; ¿qué opina usted?

Pasos para desarrollar un programa


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

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

2) Algoritmo de solución: algoritmo matemático, pseudo-código.


Este no es un problema sencillo de programar y requiere del apoyo de nuestros conocimientos de matemáticas. Hay dos alternativas
para la solución.
Nota: En matemáticas identificamos a los ejes de coordenadas con X y Y; en computación, para números 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
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

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

Otros cuadrantes: Parte inferior:


Variar i: n → -n // eje vertical Variar i: n → -n // eje vertical

PÁGINA: 6
Lenguaje C

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 posición de los ejes que más facilite el algoritmo.

3) Programación: diseño, desarrollo, validación contra la matiz de pruebas.


Programas:
03_05a.c: Ejes en el centro del rombo 03_05b.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");
} }
}

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

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.

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

3) Lea un número entero n y determine si es ó no primo, utilice for. Imprima:


PÁGINA: 7
Lenguaje C
n es primo
n no es primo

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.

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);

PÁGINA: 8

También podría gustarte