Вы находитесь на странице: 1из 10

Lenguaje C

Estructuras de Control Repetitivo


Antes de iniciar estas estructuras vamos a estudiar dos tipos de operadores sencillos y muy utilizados para reducir el tamao de las
instrucciones.

1) Operadores de asignacin:
n += 2; // equivalente a: n = n + 2; Analogamente puede utilizar los operadores -=. *=, /=. %=
2) Preoperadores y Postperadores:
++n; // Preoperador equivalentes a: n = n + 1;
n++; // postperador equivalentes a: n = n + 1;
Analogamente n--; --n; son equivalentes a n = n -1;
Pero hay una diferencia enpre pre y post operador: El pre ejecuta antes de una operacin y el post despus; ejemplo:
int n = 2, m = 2;
printf(%d %d\n, ++n, m++); // n y m aumentan en 1
printf(%d %d\n, n, m );
Salida: 3 2 // n (pre operador) aumenta antes del printf(), y m (post operador) aumenta despus
33 // al final n y m valen 3.

Estructuras de control repetitivo


Una estructura de control repetitiva, es una instruccin compleja que permite repetir la ejecucin de un bloque de instrucciones; tien 4
componentes:
1) Inicio de variables: var1, var2, ...
2) Bloque o instruccin que se repite usando var1, var2, y otras
3) Variacin de var1, var2, ...
4) Condicin de repeticin del bloqueInstruccin

Diagrama ejemplo:

Inicio de variables: var1, var2, ...


Variaciones de var1, var2, ..

condicin de repeticin:
expresin lgica que Bloque o instruccin utilizando var1, var2, ..
utiliza var1, var2, ...
Variaciones de var1, var2, ..
fin de var1, var2, ...

Al describir una estructura de control, se suele enfatizar (hacer visibles) las componentes 2 y 4 y sobre entender la 1 y la 3; pero el
programador debe sincronizar las 4. Las componentes pueden cambiar de posicin, lo cual genera 3 tipos de estructuras.

1) Repeticin Do While
Ejecuta un bloqueInstruccion y verifica un condicin de repeticin de ejecucin

Diagrama de flujo

Sintaxis:
do bloqueInstruccion while(condicion);

PGINA: 1
Lenguaje C

// 03_01.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; // inicio de n
do {
printf("Escriba un nmero entero entre 0 y 4: ");
scanf("%d", &n); // ingrese 6 y 3 variacin de n
} while (n < 0 || n > 4); // condicin de repeticin
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

Diagrama de flujo

// 03_02.c : Calcular la suma de los n primeros nmeros


#include<stdio.h>
void main(void){
int n, i=1, suma = 0; // inicio de i y suma
printf("Ingrese un entero > 0: ");
scanf("%d", &n);
while(i<=n) suma += i++; // equivalente a: while(i<=n) { suma = suma + i; i = i+1;)
// condicin variacin
printf("La suma de los %d primeros nmeros es: %d\n", n, suma);
}

Salida:
Ingrese un entero > 0: 5
La suma de los 5 primeros nmeros es: 15

3) Repeticin For
Esta instruccin es ms elaborada e integra explcitamente todos los componentes de una repeticin: inicio, condicin de repeticin,
variaciones para repetir y bloque de ejecucin.

Sintaxis:
for([inicios]; [instrucciones, condicin]; [variaciones]) bloqueInstruccion

Note:
1) Los corchetes [ ] significan opcional
2) Los plurales, ejemplo: inicios; sinfica que pueden haber varios inicios separados por coma: ejemplo: i = 1, suma = 0

PGINA: 2
Lenguaje C
Diagrama de flujo

La ejecucin del for tiene una secuencia (1), (2), de ejecucin:


(1)

(2)

(4) (3a) (3b)

El mismo diagrama expresado sobre la sintaxis::

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


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

.
sigue a (4)
}
(3b) // viene, si condicin es falsa
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.

PGINA: 3
Lenguaje C

// 03_03.c : Elevar al cuadrado los primeros 3 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;
}
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.

PGINA: 4
Lenguaje C

// 03_04.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:

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)
PGINA: 5
Lenguaje C
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 antes de la estructura)
No tienen variaciones (se colocan dentro de la estructura).
Inicios; Inicios;
for([inicios]; [condicin]; [variaciones]) { do { while(condicin) {
ejecutarTarea; ejecutarTarea; ejecutarTarea;
variaciones; variaciones;
} } while(condicin); };

// 03_05a.c : Leer un nmero entero > 0 y determine si es primo o no. Desarrollar 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);
if(n==1) primo = 0; if(n==1) primo = 0; if(n==1) primo = 0;
else for(; i*i <= n && primo ; i++) else if(n>2) do if(n%i++==0) primo=0; else while(i*i <= n && primo)
if(n%i==0) primo=0; while(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);
}
Para este caso especfico, Qu alternativa le parece ms rpida, y por qu?

// 03_05b.c : Dados dos enteros > 0 hallar el MCD. Desarrollar las 3 alternativas usando bucles.
#include<stdio.h>
void main(void){
int m = 16, n = 38, r;
if(m<n) {r = n; n = m; m = r;}
for(;r = m%n; m = n, n = r); do{ while(r = m%n){
if(r = m%n) { m = n;
m = n; n = r;
n = r; }
}
} while(r);
printf("MCD = %d\n", n);
}
Para este caso especfico, Qu alternativa le parece ms rpida, y por qu?

PGINA: 6
Lenguaje C
No solo es cuestin de forma y gusto, el problema especfico determina cul de las estructuras es la ms adecuada para su programa-
cin. 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_06.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.

// Conejitos - ovejitas
// 03_07a.c : Usa do{ } while(condicion); // 03_07b.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.


Seguro que la chica dormir plcidamente y el chico aprender a usar las instrucciones do y for
PGINA: 7
Lenguaje C

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

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_08a.c: Ejes en el centro del rombo // 03_08b.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;

PGINA: 8
Lenguaje C
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.

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_09a.c: Ejes en el centro del rombo // 03_09b.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--){
PGINA: 9
Lenguaje C
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.

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

Вам также может понравиться