Está en la página 1de 47

Estructuras de repeticin

Computacin

Motivacin
Suponga que se desea sumar una lista de 20 nmeros y obtener el
promedio.
Sin estructuras de repeticin habra que escribir 20 sentencias de
entrada o declarar 20 variables diferentes.
Algo como:
int n,suma =0;
cout << tecle n: ;
cin >> n;

int n1,n2, ,n20, suma = 0;


cout << tecle los 20 valores ;
cin >> n1>>n2>>>n20;
Repetir 20 veces suma = n1 + n2 + + n20;

suma = suma + n;

Para estos casos existen las repeticiones.

Ciclo while
La sentencia while permite repetir un
bloque de instrucciones.
La sintaxis del ciclo while es:
while(condicin)
sentencia o bloque;
Si la condicin se cumple se ejecutan las
sentencias del bloque y se regresa el flujo
de control a evaluar nuevamente la
condicin. El proceso se repite hasta que
la condicin sea falsa.
El ciclo puede ejecutarse 0 veces si la
condicin no se cumple al entraren l.

verdadero
condicin
falso

sentencias

Ejemplo
Clculo de el promedio de 20 nmeros.
#include <iostream.h>
int main(){
float suma = 0.0, num, promedio;
int contador = 0;
while(contador < 20){
cout << "Teclee un nmero:";
cin >> num;
suma = suma + num;
contador = contador + 1;
}
promedio = suma/20;
cout << "\nEl promedio es: " << promedio << endl;
system(PAUSE);
}

Ejemplo mejorado
#include <iostream.h>
int main(){
float suma = 0.0, num, promedio;
int contador = 0;
cout << "****************************************"<<endl;
cout << "* Calcula el promedio de 20 valores
*"<<endl;
cout << "****************************************"<<endl;
while(contador < 20){
cout << "Teclee el nmero "<<contador+1<<" de 20: ";
cin >> num;
suma = suma + num;
contador = contador + 1;
}
promedio = suma/20;
cout << "****************************************"<<endl;
cout << "El promedio es: " << promedio << endl;
cout << "****************************************"<<endl;
system("PAUSE");
}

Tarea
Escriba un programa que lea un nmero entero n y luego lea n
nmeros reales y calcule la suma de los nmeros reales. Considere el
caso en que el nmero n es positivo.

Ciclos controlados por centinela


Si no se conoce de antemano el nmero de datos, se utiliza un valor de
entrada especial como una bandera o centinela para terminar la
entrada de datos.
En el caso del promedio el centinela puede ser -1.
Algoritmo
1. Solicitar un nuevo valor para promediar
2. Mientras valor diferente de -1 hacer
3.

Acumular suma e incrementar contador

4.

Solicitar nuevo valor para promediar

5. Fin ciclo
6 si contador > 0
7.

Calcular promedio e imprimir

ciclo controlado por centinela


Clculo de el promedio de N (desconocido) nmeros. Se utiliza un valor
especial para detener la entrada de datos.
int main(){
float suma = 0.0, num, promedio;
int contador = 0;
cout << "Teclee un nmero (-1 = fin):";
cin >> num;
while(num != -1){
suma = suma + num;
contador = contador + 1;
cout << "Teclee un nmero (-1 = fin):";
cin >> num;
}
if(contador>0){
promedio = suma/contador;
cout << "\nEl promedio es: " << promedio << endl;
}
else
cout << "\nNo se teclearosn valores" << endl;
getch();
}

Ejemplo
Se desea un programa para leer las calificaciones de un grupo de
alumnos y calcular el promedio general, as como el nmero de alumnos
aprobados y reprobados.
No conocemos el nmero de alumno, por tanto es adecuado el esquema
del centinela.
Primer esbozo de algoritmo
Leer siguiente calificacin
Mientras calificacin diferente de -1
acumular suma
si calificacin>= 6
incrementar aprobados
sino
incrementar reprobados
Incrementar total de alumnos
Leer siguiente calificacin
Fin ciclo

Calcular promedio
Imprimir resultados

Variables:
contador contador de calificaciones
aprobados contador de aprobados
reprobados contador de reprobados
cal calificacin
suma suma de calidficaciones
prom promedio de calificaciones
Iniciacin
int total = 0, aprobados = 0, reprobados = 0;
float cal, suma = 0, prom;

Lectura de calificacin
cout << teclee calificacion (-1 para terminar):;
cin >> cal;
Ciclo de lectura
while(cal != -1){
suma += cal;
if(cal >= 6)
aprobados++;
else
reprobados++;
total++;
cout << teclee calificacion (-1 para terminar):;
cin >> cal;
}

Clculo del promedio:


prom = suma/total;
Impresin de resultados:
cout << Total de alumnos: <<total<<endl;
cout << Promedio: << prom << endl;
cout << # de aprobados: << aprobados << endl;
cout << # de reprobados: << reprobados << endl;

ejemplo
Se desea un programa que funcione como una calculadora.
El programa aceptar expresiones de la forma:
numero op numero
Donde op puede ser: +, -, *, / y ^ (potencia)
Ejem.: 5.7+4.2, 6.7/2.5,
El programa terminar cuando se teclee la secuencia 0x0, donde x es
cualquier carcter.

El programa puede hacerse con un esquema de ciclo con centinela.

1. Iniciar programa

Algoritmo

2. Leer siguiente expresin


3. Mientras expresin diferente de 0*0 hacer
4.

Calcular e imprimir resultado

5.

Leer siguiente expresin

6. Fin ciclo
El paso 4 sera
4. en caso de que op sea
4.1. + sumar los dos nmeros
4.2. - restar los dos nmeros
4.3. + multiplicar los dos nmeros
4.4. / dividir los dos nmeros
4.5. ^ potencia de los dos nmeros

Programa
#include <iostream.h>
#include <math.h>
main(){
float x,y,r;//datos de entrada y resultado
char op;//operador
cout <<">";//indicador
cin >> x>> op >> y;//lectura de datos
while (!(x==0&&y==0)){
switch(op){
case '+':r = x+y;break;
case '-':r = x-y;break;
case '*':r = x*y;break;
case '/':r = x/y;break;
case '^':r = pow(x,y);break;
default:r=0;
}
cout << r << endl;
cout <<">";
cin >> x>> op >> y;
}
}

Tarea casera
Escriba programa con un ciclo controlado por centinela para leer una
serie de nmeros hasta que el usuario teclee el nmero 9999. Dentro
del ciclo cuente los mltiplos de 2, de 3 y de 5. Imprima cuantos
mltiplos se teclearon en cada caso.
Ejemplo:
Teclee un nmero: 6
Teclee un nmero: 9
Teclee un nmero: 15
Teclee un nmero: 20
Teclee un nmero: 8
Teclee un nmero: 9999
Mltiplos de 2: 3

Mltiplos de 3: 3
Mltiplos de 5: 2

Ciclos anidados
Muchos algoritmos se definen mediante ciclos dentro de otros ciclos.

Es posible incluir dentro de un ciclo cualquier estructura de control


incluyendo otro ciclo.

Ejemplo
Programa para imprimir un rectngulo de asteriscos (*) leyendo el
tamao del lado y la altura con un mximo de 20.
Ejemplo:
Si se teclea 10 8, imprimir
**********
**********
**********
**********
**********
**********
**********
**********

Este problema puede resolverse fcilmente haciendo un ciclo


dentro de otro. El algoritmo es
1. Leer el valor de n y m
2. Si n > 1 y n < 20 y m>1 y m<20
3.

r=0

Mientras r < m hacer

5.

c=0

6.

Mientras c<n hacer

7.

Imprimir *

8.

Incrmentar c

9.

Fin ciclo

10.

Cambiar de lnea

11. Incrementar r
12 Fin ciclo

#include <iostream.h>
#include <iomanip.h>
main(){
int n,m,c,r;
cout << "ancho del rectangulo (maximo 20):";
cin >> n;
cout << "alto del rectangulo (maximo 20):";
cin >> m;
if(n>1 && n<20&&m>1&&m<20){
r=0;
while(r<m){
c = 0;
while(c<n){
cout << '*';
c++;
}
cout << endl;
r++;
}
}
cout<<endl;
system("PAUSE");
}

Tarea casera
Escriba un programa para dibujar un patrn de tablero de ajedrez de
tamao 2 a 20 como se muestra:
* * * *
* * * *
* * * *
* * * *
Utilice ciclos anidados y sentencias de salida que impriman un
asterisco y espacio en blanco.
Ayuda: note que las lneas impares comienzan con asterisco y las
pares con espacio.

Operadores de asignacin
En C existen operadores para abreviar las operaciones de asignacin.
Por ejemplo: c = c + 3 puede escribirse como c += 3.
En general
variable = variable operador expresin
es equivalente a
variable operador= expresin
Ojo
a *= c + d
equivale a
a = a*(c + d)

no

a = a*c + d

Ejemplos
a = a + 3;

a += 3

c = 2*c;

c *= 2;

x = x z;

x = z;

s = s*b s*c;

s *= b c;

d = d/(f + 5);

d /= f + 5;

r = r % 5;

r %= 5;

Operadores de Incremento y
decremento
Operador Llamado

Ejempl
o

Descripcin

++

preincremento

++a

Incrementa a en 1, luego
utiliza el nuevo valor en la
expresin en que reside a.

++

posincremento

a++

Toma el valor actual de a para


la expresin en que reside a,
luego incrementa a.

--

predecremento

--a

Decrementa a en 1, luego
utiliza el nuevo valor en la
expresin en que reside a.

--

posdecremento a--

Toma el valor actual de a para


la expresin en que reside a,
luego decrementa a.

Nmeros primos
Un nmero primo es aquel que solo es divisible entre si mismo y entre
1. Por ejemplo: 1, 2, 5, 47.
Para saber si un nmero es primo debemos obtener el residuo de la
divisin del nmero entre todos los nmeros desde 2 hasta su raz
cuadrada. Si el residuo es diferente de cero, el nmero es primo.
Algoritmo
1. Leer el numero

8. div++

2. div = 2;

9. finlazo

3. esPrimo = 1

10. si esPrimo

4. limite = raiz de numero

11

imprime primo

5. mientras div<limite o esPrimo 12 sino


6. si numero%div == 0
7.

esPrimo = 0

13

imprime NO primo

Determinacin de nmero primo


int main(){
int div = 2, num, esPrimo = 1, limite;
cout << "Teclee un nmero > 2: ";
cin >> num;
limite = (int)sqrt(num);
while(div <= limite && esPrimo){
if(num % div == 0) //es divisible entre n
esPrimo = 0;
div++;
}
if(esPrimo)
cout << "\nEl nmero " << num << " es primo\n";
else
cout << "\nEl nmero " << num << " NO es primo\n";
getch();
return 0;
}

Tarea
Cul es la salida de los siguientes ciclos?
i = 0;
while(i < 10)
cout << 2*i << setw(10)<< 3*i*i;
i += 3;
}
i = 5;
while(i > -20)
cout << 2*i << setw(10)<< 2*i+1;
i -= 3;
}

Tarea casera
Escriba un programa para encontrar todos los divisores de un nmero.

Ejemplo:
Teclee un nmero: 246
Los divisores de 246 son: 2, 3, 6, 41, 82, 123

Ciclo for
La sentencia for permite definir fcilmente ciclos controlados por
contador.
El formato general de la estructura for es:
for(expresion1; expresion2; expresion3)
instruccin;
Esta es equivalente a la siguiente sentencia while:
expresion1;
while(expresion2){
instruccin;
expresion3;
}
expresion1 = sentencia de iniciacin
expresion2 = condicin de terminacin
expresion3 = sentencia de incremento

ejemplos de lazos for


a) modifica la variable de control de 1 a 100 en incrementos de 1.
for(i = 1; i <= 100; i++)
b) modifica la variable de control de 100 a 1 en decrementos de 1.
for(i = 100; i >= 1; i--)
c) modifica la variable de control de 7 a 77 en incrementos de 7.
for(i = 7; i <= 77; i += 7)
d) modifica la variable de control de 20 a 2 en decrementos de -2.
for(i = 20; i >= 2; i -= 2)
e) modifica la variable de control de 2 a 20 en incrementos de 3.
for(i = 2; i <= 20; i += 3)
f) modifica la variable de control de 99 a 0 en decrementos de -11.
for(i = 99; i >= 0; i -= 11)

Clculo de inters
El inters que otorgan los bancos por invertir un capital puede
calcularse con la siguiente frmula
I = C (1 + r)n
Donde C es el capital, r es la tasa de inters y n es el nmero de
periodos
Ejemplo:
Si C = 20,000, r = 7% y n = 3,
I = 20000(1 + 0.07)3 = 24,500.86

Clculo de inters compuesto


#include <iostream>
#include <iomanip>
#include <cmath> // permite al programa utilizar la funcin pow
int main() {
double monto;

// monto del depsito

double principal = 1000.0; // monto principal (al inicio)


double tasa = .05;

punto fijo

// tasa de inters

cout << "Anio" << setw( 21 ) << "Monto del depsito" << endl;
cout << fixed << setprecision( 2 );
for ( int anio = 1; anio <= 10; anio++ ) {

precisin

monto = principal * pow( 1.0 + tasa, anio );


cout << setw( 4 ) << anio << setw( 21 ) << monto << endl;
}
return 0;
}

ancho del
campo

Salida del programa


Anio
1
2
3
4
5
6
7
8
9
10

Monto del depsito


1050.00
1102.50
1157.63
1215.51
1276.28
1340.10
1407.10
1477.46
1551.33
1628.89

Grafica de funcin seno


Podemos hacer una grfica muy rudimentaria de una funcin en la
pantalla de consola.
El mtodo consiste en dibujar espacios hasta el valor de la funcin y
luego dibujar un carcter.
Algoritmo
1. Para i = 0 hasta N
2. Para j = 0 hasta 40+valor funcin hacer
3.

Escribir

4. Escribir * y un fin de lnea


5. fin

Programa senoFor.cpp
#include <iostream.h>
#include <math.h>
main(){
int i,j;
float x;
for(i=0;i<50;i++){
for(j=0;j<40+20*exp(-i/20)*sin(i*3.1416/10);j++)
cout <<' ';
cout << '*'<<endl;
}
cout << endl;
system("pause");
}

Tarea
Escriba un programa que despliegue las primeras 20 potencias de 2 y de
3 usando un ciclo for. Establezca el formato de nmeros en punto fijo con
0 decimales y ajuste el ancho de los campos.
n

2^n

3^n

27

16

81

1048576

3486784401

20

Tarea casera
Escriba un programa que despliegue la siguiente tabla de multiplicar.
Asegrese que las columnas estn bien alineadas.

10

10

12

14

16

18

20

12

15

18

21

24

27

30

10 20

30

40

50

60

70

80

90 100

...

Ciclo do - while
El ciclo do-while es similar al ciclo while excepto que la prueba se
realiza al final del ciclo, esto fuerza a que se ejecute por lo menos una
vez.
Sintaxis
do{
sentencias;
}while(condicin);

sentencias

condicin
falso

verdadero

Lectura con validacin


El ciclo do-while puede usarse para validar la entrada de datos.
Algoritmo de validacin:
1. Hacer
2. Leer datos
3. Mientras datos invlidos

Ejemplo de validacin
#include <iostream.h>
main(){
int a,b;
do{
cout << "Teclee un nmero positivo para A: ";
cin >> a;
}while(a<=0);
do{
cout << "Teclee un nmero positivo para B: ";
cin >> b;
}while(b<=0);
cout <<"a * b = " << a*b << endl;
system("pause");
}

Validacin de una fecha

Para validar una fecha debemos asegurar que los das caigan en el
rango de 1 a 31 y los meses de 1 a 12.
Una mejora consiste en verificar los das de acuerdo al mes.
Para febrero en ao bisiesto el mximo de das es 29.
Para verificar ao bisiesto usamos
anyoBisiesto = (a%4==0)&&(a%100!=0);
Para los meses de 30 y 31 das:
mes30dias = (m==4 || m==6 || m==9 || m==11);
mes31dias = (m==1 || m==3 || m==5 || m==7 ||
m==8 || m==10 || m==12);
Expresin para checar fecha:
fechaValida = (d<=31 && mes31dias)|| (d<=30 &&
mes30dias)||(d<=28 && m==2)||(d<=29&& anyoBisiesto);

Programa
#include <iostream.h>
main(){
int d,m,a;//da, mes, ao
int anyoBisiesto,mes30dias,mes31dias,fechaValida;
do{
cout << "Teclee una fecha (dd mm aa): ";
cin >> d >> m >> a;
anyoBisiesto = (a%4==0)&&(a%100!=0);
mes30dias = (m==4 || m==6 || m==9 || m==11);
mes31dias = (m==1 || m==3 || m==5 || m==7
|| m==8 || m==10 || m==12);
fechaValida = (d<=31 && mes31dias)|| (d<=30 &&
mes30dias)||(d<=28 && m==2)||(d<=29 &&
anyoBisiesto);
}while(!fechaValida);

cout << d << " de ";


switch(m){
case 1:cout << "enero";break;
case 2:cout << "febrero";break;
case 3:cout << "marzo";break;
case 4:cout << "abril";break;
case 5:cout << "mayo";break;
case 6:cout << "junio";break;
case 7:cout << "julio";break;
case 8:cout << "agosto";break;
case 9:cout << "septiembre";break;
case 10:cout << "octubre";break;
case 11:cout << "noviembre";break;
case 12:cout << "diciembre";break;
}
cout << " de " << a << endl;
system("pause");
}

tarea
Escriba un programa que lea tres nmeros enteros positivos, el
tercero de los cuales deber ser mayor que los otros dos y menor o
igual a la suma de los dos primeros.

ciclo do-while controlado por


centinela
Clculo de el promedio de N nmeros. Se utiliza un valor especial para detener
la entrada de datos.
int main(){
float suma = 0.0, num, promedio;
int contador = 0;
do{
cout << "Teclee un nmero (-1 = fin):";
cin >> num;
if(num != -1){
suma = suma + num;
contador = contador + 1;
}
}while(num != -1);
if(contador>0){
promedio = suma/contador;
cout << "\nEl promedio es: " << promedio << endl;
}
else
cout << "\nNo se teclearosn valores" << endl;
getch();
}

int main(){
int n, num = 2, esPrimo, limite;
while(num<=100){
esPrimo = 1;
n = 2;
limite = (int)sqrt(num);
while(n <= limite && esPrimo){
if(num % n == 0) //es divisible entre n
esPrimo = 0;
n++;
}
if(esPrimo)
cout << num << " ";
num++;
}
getch();
return 0;
}

lazo interno

lazo externo

Determinar los primos de 1 a 100

Tarea casera
Un nmero es perfecto si es igual a la suma de sus divisores,
por ejemplo 6 es perfecto porque 6 = 1 + 2 + 3. Escriba un
programa para encontrar todos los nmeros perfectos entre 1
y 10000.

También podría gustarte