Guía 03. Estructuras repetitivas

Transcription

Guía 03. Estructuras repetitivas
OBJETIVO: Codificar algoritmos utilizando Estructuras Repetitivas.
Estas estructuras son aquellas que se encargan de controlar el número de veces que una sentencia o conjunto de
sentencias se ejecutan. Se denominamos
B U C L E
a cualquier construcción de programa que repite una
sentencia o un conjunto de sentencias un número indeterminado de veces. Esta sentencia o conjunto de
sentencias que se repite se denomina bloque o cuerpo del bucle y cada repetición se llama iteración del bucle.
ESTRUCTURA WHILE. Acá, un bucle while tiene una condición que controla la secuencia de repetición. La
condición está al comienzo del bloque. De este modo, se evalúa primero la condición antes de ejecutar el cuerpo. Si
la condición se cumple, se ejecuta el bloque y vuelve a evaluar la condición. De lo contrario, se termina la iteración.
Su sintaxis es la siguiente:
while(condicion_bucle)
{
sentencia 1;
sentencia 2;
.
sentencia n;
}
Recordemos: el “bloque” se refiere al conjunto de
sentencias agrupadas entre llaves, las cuales se
ejecutarán mientras la condición sea verdadera.
Recuerde que antes de trabajar con el while debemos:

Establecer el valor inicial de la variable a manipular en la condición del bucle.

Comprobar la condición que involucra esta variable.

Actualizar el valor de esta variable antes de que se termine el ciclo del bucle.
ESTRUCTURA WHILE. EJEMPLOS.
01. Programa que lee la población de una ciudad A y su tasa de crecimiento (TA), y también lee la población de una
ciudad B y su tasa de crecimiento (TB). Al momento de suministrar los datos, tenga en cuenta que la población inicial
de A es menor que la de B, pero la tasa de crecimiento de A es mayor que la de B. Si el crecimiento poblacional se
mantiene constante en las dos ciudades, elabore un algoritmo que calcule e imprima en cuántos años la población de
la ciudad A es mayor que la de B.
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
float A, B;
float TA, TB;
int Y=0;
cout<<"Poblacion de A : "; cin>>A;
cout<<"Tasa de crecimiento de A : "; cin>>TA;
cout<<"Poblacion de B : "; cin>>B;
cout<<"Tasa de crecimiento de B : "; cin>>TB;
while(A<=B)
{
A = A * (1+(TA/100)); //poblacion se multiplica por la tasa de crecimiento A
B = B * (1+(TB/100)); //poblacion se multiplica por la tasa de crecimiento B
Y = Y + 1;
//por cada aumento de poblacion
//y mientras se mantenga la condicion
//se aumenta en 1 el contador del año
}
cout<<"\n\nLa poblacion de A sobrepasa a la de B en "<<Y<<" anios"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
1
Versión 2:
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
float A, B, TA, TB;
int Y=0;
cout<<"Poblacion de A : "; cin>>A;
cout<<"Tasa de crecimiento de A : "; cin>>TA;
cout<<"Poblacion de B : "; cin>>B;
cout<<"Tasa de crecimiento de B : "; cin>>TB;
if ( (A < B) && (TA > TB) )
{
while(A<=B)
{
A = A * (1+(TA/100));
B = B * (1+(TB/100));
Y = Y + 1;
}
cout<<"\n\nLa poblacion de A sobrepasa a la de B en "<<Y<<" anios"<<endl;
}
else
cout<<"\n\nValores no validos"<<endl;
system("PAUSE"); return EXIT_SUCCESS;
}
02. Programa que calcula en cuantos meses se duplica un capital a un interés compuesto. El programa muestra cómo
cambia el capital mes a mes. El capital y el interés se leen por teclado y deben validarse.
Pseudocódigo
Inicio
Leer C , I
M = 0
//recordemos inicializar el contador
Si ((C>0) Y (I>0)) entonces
DC = 2*C
Mientras (C < DC) hacer
C = C * (1+(I/100))
M = M + 1
Imprimir “Mes” , M, “Capital”, C
Fin_Mientras
Imprimir “Meses” , M
Si_no
Imprimir “Valores inválidos”
Fin_Si
Fin
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
float C, I, DC;
int M=0;
cout<<"Digite el valor del capital : "; cin>>C;
cout<<"Digite el valor del interes : "; cin>>I;
if((C>0)&&(I>0))
{
DC=(2*C);
while(C<DC)
{
C=C*(1+(I/100)); //se multiplica el capital por el interes y se suma al valor anterior
M=M+1;
//se aumenta la cuenta del mes por cada aumento de capital
cout<<"\nMes "<<M<<" -- Capital = "<<C; //esto es para mostrar el aumento del capital mes a mes
}
cout<<"\n\nEl capital se duplica en "<<M<<" meses"<<endl;
}
else
{ cout<<"\nDebe ingresar valores positivos"; }
system("PAUSE");
}
return EXIT_SUCCESS;
2
03. Programa que lee un número de cualquier cantidad de cifras y lo invierte. El mecanismo de inversión se basa en el
principio de ir dividiendo sucesivamente al número entre 10 y obtener el residuo, para así separar cada cifra. Este
proceso se repite hasta que el número a dividir sea cero.
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
unsigned long long N, M, NI;
unsigned long long D, R;
cout<<"Digite el Numero : "; cin>>N;
M = N;
NI=0;
while(N!=0)
{
D = N/10;
R = N-(D*10);
NI = (NI*10) + R;
N = D;
}
cout<<"El numero original es : "<<M<<endl;
cout<<"El numero invertido es : "<<NI<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Versión 2:
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
unsigned long long N, M, NI;
unsigned long long D, R;
cout<<"Digite el Numero : "; cin>>N;
M = N;
NI=0;
while(N<0)
{
cout<<"El Numero debe ser positivo "<<endl;
cout<<"Digite el Numero : "; cin>>N;
M = N;
}
while(N!=0)
{
D = N/10;
R = N-(D*10);
NI = (NI*10) + R;
N = D;
}
cout<<"El numero original es : "<<M<<endl;
cout<<"El numero invertido es : "<<NI<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
3
Versión 3:
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
unsigned long long N, M, NI;
unsigned long long D, R;
char resp='s';
while(resp!='N')
{
cout<<"Digite el Numero : "; cin>>N;
M = N;
NI=0;
if(N>0)
{
while(N!=0)
{
D = N/10;
R = N-(D*10);
NI = (NI*10) + R;
N = D;
}
cout<<"El numero original es : "<<M<<endl;
cout<<"El numero invertido es : "<<NI<<endl;
}
else
cout<<"NO VALIDO. El Numero debe ser positivo "<<endl;
cout<<"\nDesea ingresar otro numero? (S/N): ";
cin>>resp; getchar(); resp=toupper(resp);
}
system("PAUSE");
return EXIT_SUCCESS;
}
4
USO DE REGISTRO CENTINELA O VALOR CENTINELA.
04. Programa que lee el código de un estudiante y las notas de una materia. El proceso continúa mientras el valor del
sucesivo código leído sea diferente de cero. Al final muestra cuántos de los estudiantes obtuvieron una nota final
menor de 3.
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
int con = 0;
long c;
float n1,n2,n3,nf;
cout<<"Digite el numero del codigo: "; cin>>c;
while (c!=0)
{
cout<<"Digite la primera nota : "; cin>>n1;
cout<<"Digite la segunda nota : "; cin>>n2;
cout<<"Digite la tercera nota : "; cin>>n3;
if ((n1>=0 && n1<=5) && (n2>=0 && n2<=5) && (n3>=0 && n3<=5))
{
nf=(n1*0.35)+(n2*0.35)+(n3*0.3);
if (nf<3){con = con + 1;}
cout<<"El codigo es : "<<c;
cout<<"\nLa nota final es : "<<nf<<endl;
}
else {cout<<"Ha suministrado notas por fuera del rango"<<endl;}
cout<<"Digite el numero del codigo: "; cin>>c;
}
cout<<"Los estudiantes que perdieron son un total de: "<<con<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
5
05. Tenemos la información de las personas mayores de edad que viven en un barrio determinado. Por cada una de
ellas hay un registro con cuatro datos: el número de cédula, el nombre, el género (H=hombre, M=mujer) y la edad.
No sabemos cuántos son, pero en el último registro el campo del número de cédula es igual a cero. Elabore un
algoritmo que averigüe e imprima:
a) ¿Cuántos hombres y cuántas mujeres hay en el barrio?
b) El nombre y la edad de todas las mujeres mayores de 70 años, y cuántas son.
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
long int CC;
char nombre[100];
char GEN;
int E;
int CM = 0, CH = 0, CM70 = 0 ;
cout<<"Digite la cedula: "; cin>>CC;
while (CC!=0)
{
cout<<"Escriba el Nombre : ";
cout<<"Escriba el Genero : ";
fflush(stdin); gets(nombre);
cin>>GEN; getchar(); GEN=toupper(GEN);
cout<<"GEN : "<<GEN<<endl;
cout<<"Digite la Edad
: ";
cin>>E;
if ( GEN == 'H')
{
CH = CH + 1;
}
else
{
CM = CM + 1;
if (E > 70)
{
CM70 = CM70 + 1;
cout<<"Nombre : "; puts(nombre);
cout<<"Edad
: "<<E<<endl;
}
}
cout<<"Digite la cedula: "; cin>>CC;
}
cout<<"Cantidad de Mujeres
: "<<CM<<endl;
cout<<"Cantidad de Hombres
: "<<CH<<endl;
cout<<"Cantidad de Mujeres Mayores de 70
: "<<CM70<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
6
06. Tenemos la información de un grupo de estudiantes de la Universidad del Cauca, no sabemos cuántos. Por cada
uno de ellos hay un registro que contiene el Código, la Edad y el Promedio Acumulado (ya vienen validados). El último
registro trae grabados ceros en el Código. Elabore un algoritmo que imprima el código, la edad y el promedio
acumulado de los estudiantes de Ingeniería en Automática mayores de 21 años con promedio acumulado menor a 3.2,
también debe imprimir al final cuántos son. Recuerde que el código de la carrera de Ingeniería en Automática es 47.
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
long long int COD;
int vp1, vp2, C, E;
float PRO;
int CON=0;
cout<<"\nDigite el numero del codigo (digite cero cuando quiera salir) : "; cin>>COD;
while(COD!=0) //Condicion del registro centinela
{
cout<<"\nDigite la edad
: "; cin>>E;
cout<<"\nDigite el promedio : "; cin>>PRO;
vp1 = COD/100000000;
cout<<"\n vp1 vale = " <<vp1;
vp2 = vp1/100;
cout<<"\n vp2 vale = " <<vp2;
C = vp1 - (vp2*100);
cout<<"\n C vale = " <<C;
if((int)C==47)
{
if(E>21)
{
if(PRO<3.2)
{
cout<<"\nCodigo: "<<COD <<" | Edad: "<<E<<" | Promedio : "<<PRO;
CON = CON + 1;
}
}
}
//la nueva lectura (siguente estudiante)
cout<<"\nDigite el numero del codigo (digite cero cuando quiera salir) : "; cin>>COD;
}
cout<<"\nCantidad de estudiantes que cumplen las condiciones : "<<CON<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
7
ESTRUCTURA DO - WHILE (REPETIR-HASTA). Esta sentencia se utiliza para especificar un bucle condicional que
se ejecuta al menos una vez. Esta situación se suele dar en algunas circunstancias en las que se ha de tener la
seguridad de que una determinada acción se ejecutará una o varias veces, pero al menos una vez.
Su sintaxis es la siguiente:
do
{
sentencia 1;
sentencia 2;
.
.
sentencia n;
} while(expresion);
ESTRUCTURA DO - WHILE. EJEMPLO. Reescribiremos el ejercicio 01 con esta estructura.
Pseudocódigo
Inicio
Y = 0
//recordemos inicializar el contador
Leer A, TA, B, TB
Si ( (A < B) Y (TA > TB) ) entonces
Hacer
A
B
Y
Mientras
= A*(1+(TA/100))
= B*(1+(TB/100))
= Y+1
(A<=B)
Imprimir Y
else
Imprimir “Valores No Válidos”
Fin Si
Fin
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
float A, B;
float TA, TB;
int Y=0;
cout<<"Poblacion
cout<<"\nTasa de
cout<<"Poblacion
cout<<"\nTasa de
if ( (A
{
do
{
A
B
Y
de A : "; cin>>A;
crecimiento de A : "; cin>>TA;
de B : "; cin>>B;
crecimiento de B : "; cin>>TB;
< B) && (TA > TB) )
= A * (1+(TA/100));
= B * (1+(TB/100));
= Y + 1;
}while(A<=B);
cout<<"\n\nLa poblacion de A sobrepasa a la de B en "<<Y<<" anios"<<endl;
}
else
cout<<"\n\nValores no validos"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
8
FOR. Es la estructura más adecuada para implementar bucles controlados por un contador, que no son
más que bucles en los que un conjunto de sentencias se ejecutan una vez por cada valor de rango
especificado, de acuerdo al algoritmo.
La sentencia for es un método para ejecutar un bloque de
sentencias un número fijo de veces. Este se diferencia del bucle while en que las operaciones de control
se sitúan en un solo sitio: la cabecera de la sentencia. Su sintaxis es la siguiente:
for ( inicialización_variables;
{
sentencia1;
.
.
sentencia n;
}


condición_iteración;
incremento_decremento )


En la parte de inicialización, se le asignan los valores iniciales a las variables de control del bucle.
En la parte de la condición, se encuentra una o varias condiciones que hacen que el bucle realice las
iteraciones mientras que sean verdaderas.
En la parte del incremento, se incrementan o decrementan las variables de control del bucle.
Las sentencias, son las acciones que se deben ejecutar por cada iteración del bucle.
ESTRUCTURA FOR. EJEMPLOS.
01. Programa que lee un número entero y positivo (validar que sea positivo), que calcule su factorial y
que lo imprima junto con el número leído.
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
cout.precision(100);
int N, i;
double FAC;
FAC = 1;
cout<<"Digite un numero : "; cin>>N;
while(N<=0)
{
cout<<"\nEl valor digitado no es valido";
cout<<"\nDigite un numero : "; cin>>N;
}
for(i=1; i<=N; i++)
{
FAC = FAC * i;
}
cout<<"El Factorial de "<<N<<" es : "<<FAC<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
9
Versión 2:
Reescribimos el ejemplo 01 pero con el for en conteo descendente
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
cout.precision(100);
int N, i;
double FAC;
cout<<"Digite un numero : "; cin>>N;
while(N<=0)
{
cout<<"\nEl valor digitado no es valido";
cout<<"\nDigite un numero : "; cin>>N;
}
FAC = N;
for(i=N-1; i>=1; i--)
{
FAC = FAC * i;
}
cout<<"El Factorial de "<<N<<" es : "<<FAC<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
02. Programa que lee un número N, entero y positivo, y que averigüe e imprima si es o no número Primo
Lenguaje C++
#include <iostream>
using namespace std;
main()
{
long int N;
long int flag, d, i;
cout<<"Digite un numero entero (Mayor a 0): ";
while(N<=0)
{
cout<<"\nEl valor digitado no es valido";
cout<<"Digite un numero entero (Mayor a 0): ";
}
cin>>N;
cin>>N;
flag = 0;
for (i=2; i<=N-1; i++)
{
d=(N/i)*i;
if (d==N)
{
flag = 1;
i = N;
}
}
if (flag == 0)
cout<<N<<" SI ES un numero primo"<<endl;
else
cout<<N<<" NO ES un numero primo"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
10
03. Programa que imprime las tablas de multiplicar desde un valor A hasta la tabla de multiplicar de un valor B, y que
en cada tabla se imprima los productos desde C hasta D. Por ejemplo, si A=3, B=5 y C=2, D=9 tendremos:
3
3
3
3
3
3
3
3
*
*
*
*
*
*
*
*
2
3
4
5
6
7
8
9
=
=
=
=
=
=
=
=
6
9
12
15
18
21
24
27
4
4
4
4
4
4
4
4
*
*
*
*
*
*
*
*
2
3
4
5
6
7
8
9
=
=
=
=
=
=
=
=
8
12
16
20
24
28
32
36
5
5
5
5
5
5
5
5
*
*
*
*
*
*
*
*
2
3
4
5
6
7
8
9
=
=
=
=
=
=
=
=
10
15
20
25
30
35
40
45
---------------------------------------------------------------------------------------------------------------------------------Lenguaje C++
#include <iostream>
using namespace std;
main()
{
int A, B, C, D, i, k, p;
cout<<"Tabla inicial: ";
cin>>A;
cout<<"\nTabla final : "; cin>>B;
while(A>=B)
{
cout<<"\nTabla inicial debe ser menor que Tabla final";
cout<<"Tabla inicial: ";
cin>>A;
cout<<"\nTabla final : "; cin>>B;
}
cout<<"\nValor inicial de recorrido: ";
cout<<"\nValor final de recorrido : ";
cin>>C;
cin>>D;
while(C>=D)
{
cout<<"\nValor inicial debe ser menor que Valor final";
cout<<"\nValor inicial de recorrido: ";
cin>>C;
cout<<"\nValor final de recorrido : ";
cin>>D;
}
for (i=A; i<=B; i++)
{
cout<<"\n";
for (k=C; k<=D; k++)
{
p = i * k;
cout<<"\n"<<i<<" * "<<k<<" = "<<p;
}
}
cout<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
------------------------------ FIN DEL DOCUMENTO
11