Lenguajes de Programacin - UNAM
Guia Practica de Laboratorio N 04
Objetivos:
Solucionar problemas creando algoritmos con estructuras repetitivas (while / do while)
Codificar algoritmos con sentencias repetitivas
I. CONSIDERACIONES PREVIAS
Adems de bifurcaciones, en el lenguaje C++ existen tambin varias sentencias que permiten
repetir una serie de veces la ejecucin de unas lneas de cdigo. Esta repeticin se realiza, bien un
nmero determinado de veces, bien hasta que se cumpla una determinada condicin de tipo lgico o
aritmtico. De modo genrico, a estas sentencias se les denomina bucles. Las tres construcciones
del lenguaje C++ para realizar bucles son el while, el for y el do...while, en esta gua veremos la
sentcia while y do..while.
Sentencia While: Esta sentencia permite ejecutar repetidamente, mientras se cumpla una
determinada condicin, una sentencia o bloque de sentencias Un bucle while tiene una condicin de
control o expresin lgica (<expres_log>), que ha de ir encerrada entre parntesis, que
controla la secuencia de repeticin. La posicin de esta condicin es delante del cuerpo del bucle, y
por este motivo el bucle while es un bucle preprueba, ya que se evala la condicin antes de que se
ejecute el cuerpo del bucle. El cuerpo del bucle se ejecuta mientras se cumpla la condicin de
control. Si la condicin es falsa, entonces el cuerpo no se ejecuta. Hay que hacer notar que si la
condicin es cierta inicialmente, la sentencia while no terminar nunca (bucle infinito) a menos que
en el cuerpo de la misma se modifique de alguna forma la condicin de control del bucle. Una
sentencia while se ejecutar cero (condicin de control inicialmente falsa) o ms veces. La sintaxis
de la sentencia es la siguiente:
while (<expres_log>)
{
<sec_sent>
}
Como en el caso de la sentencia de seleccin simple o doble, la utilizacin de llaves ({ }) antes y
despus del bloque de sentencias nicamente es obligatorio si el nmero de sentencias del bloque es
mayor o igual que dos. Sin embargo, se aconseja siempre su uso en prevencin del posibles errors.
El diagrama de flujo es el siguiente:
F
EXPRES_LOG EXPRES_LOG
SEC_SENT
SEC_SENT
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 1 de 11
Lenguajes de Programacin - UNAM
Por ejemplo, si queremos leer una secuencia de enteros y calcular su suma detenindonos cuando se
lea un nmero negativo, podemos hacer el siguiente programa y diagrama:
INICIO
Guia04E1.cpp
#include <iostream>
#include <cstdlib> Leer: I
using namespace std;
int main()
S=0
{
int sum, i;
cout << "Introduzca un numero:"; While
cin >> i; //lectura adelantada I >= 0
sum = 0;
while (i >= 0) S=S+I
{
sum = sum + i;
cin >> i; //actualizacin Leer: I
}
cout << "El resultado es:";
cout << sum << endl; Imprimir: S
system(pause);
}
FIN
Sentencia Do..While: En esta sentencia, el cuerpo del bucle se ejecuta hasta que sea falsa la
expresin lgica (<expres_log>)(que ha de ir encerrada entre parntesis). Por tanto, al igual
que en el bucle while el cuerpo del bucle se ejecuta mientras la expresin lgica sea cierta. El bucle
do-while tambin se denomina post-prueba, ya que la expresin lgica se comprueba cada vez
despus de la ejecucin del cuerpo del bucle. La sintaxis es la siguiente:
do
{
<sec_sent>
}
while (<expres_log>);
Como en el caso anterior, la utilizacin de llaves ({ }) antes y despus del bloque de sentencias
nicamente es obligatorio si el nmero se sentencias del bloque es mayor o igual que dos. Sin
embargo, se aconseja siempre su uso en prevencin del posibles errores. El diagrma de flujo para la
sentencia do while seria:
SEC_SENT
EXPRES_LOG
V
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 2 de 11
Lenguajes de Programacin - UNAM
El cuerpo de una sentencia do-while siempre se ejecuta al menos una vez. Cuando esto deba ocurrir
en un programa (el cuerpo del bucle tenga que ejecutarse una o ms veces), es conveniente el uso de
la sentencia do-while en lugar de la sentencia while. Por ejemplo, en lugar de escribir:
Guia04E2.cpp
#include <iostream>
#include <cstdlib>
using namespace std;
void main()
{
int numero;
cout << "Introduzca un numero entre 1 y 10";
cin >> numero;
while !((numero>=1) && (numero <= 10))
{
cout << "Introduzca un nmero entre 1 y 10");
cin >> numero;
}
}
podemos escribir:
Guia04E3.cpp
#include <iostream>
#include <cstdlib>
using namespace std;
void main()
{
int numero;
do
{
cout << "Introduzca un numero entre 1 y 10";
cin >> numero;
}
while ((numero < 1) || (numero > 10));
}
La primera ejecucin del bucle da a numero un valor, de manera que no necesitamos inicializarlo
antes del comienzo del bucle
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 3 de 11
Lenguajes de Programacin - UNAM
II. PROCEDIMIENTO
PROBLEMA 01:
Visualizar los nmeros de la serie: 2, 4, 6, 8, ..., N. (Utilice while)
Datos de Entrada: Datos de Salida:
N : Nmero final de la serie I : Variable que contendr y visualizar la serie
Procedimiento:
Utilizar un contadorcon valor inicial 2. ( I = 2 )
Incrementar el contadoren 2. ( I=I+2 )
1. Realice el DFD y la respectiva codificacin del problema 01.
Guia0401.cpp
INICIO
#include <cstdlib>
Leer #include <iostream>
N using namespace std;
main()
I=2 {
int N, I;
cout<<"NUMERO FINAL DE LA SERIE: ";
cin>>N;
I = 2;
w F while (I<=N)
I <= N {
cout<<I;
I = I + 2;
V
}
Escribir system("pause");
I return 0;
}
I=I+2
FIN
a) Ejecute varias veces el programa y notar que los nmeros se visualizan juntos. Ahora
modifique la lnea 12 de la siguiente manera:
cout<<I<< ;
b) Ejecute el programa y observe la diferencia.
c) Enseguida mejoraremos la visualizacin de los resultados, reemplace la lnea 12 por:
cout<<Nmero : <<I<<\n;
d) Aada puntos de ruptura en las lneas 10 y 13, haciendo clic en el margen izquierdo de las
lneas (debe aparecer un crculo rojo y la lnea se pintara de color rojo:
i.Depure el programa con la tecla F8.
ii. Ingrese un valor para N (ejemplo: 11)
iii. Ubquese en la ventana DEV-C++ y Aada las variables de vigilancia I, N; para esto
presione F4 y aada I, vuelva a presionar F4 y aada N.
iv. Luego para hacer seguimiento al flujo del programa presione F7 seguidas veces hasta
acabar la ejecucin.
v. Tambin puede usar la ficha depuracin
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 4 de 11
Lenguajes de Programacin - UNAM
PROBLEMA 02:
Visualizar los nmeros de la serie: 2, 4, 6, 8, .... N. (Utilice do-while)
Datos de Entrada: Datos de Salida:
N : Nmero final de la serie I : Variable que contendr y visualizar la serie
Procedimiento:
Utilizar un contador con valor inicial 2
I=2
Incrementar el contador en 2
I=I+2
2. Realice el DFD y la respectiva codificacin del problema 02.
INICIO Guia0402.cpp
#include <cstdlib>
Leer #include <iostream>
N using namespace std;
main()
I=2 {
int N,I;
cout<<"NUMERO FINAL DE LA SERIE : ";
Escribir cin>>N;
I I = 2;
do
{
I=I+2 cout<<I;
I =I + 2;
}
while (I<=N);
V DW system("pause");
I <= N return 0;
}
F
FIN
a) Modifique el programa para que la salida sea similar al programa anterior.
b) Ejecute el programa varias veces, pruebe con los siguientes valores en los dos programas
realizados
i. N = 5
ii. N = 0
Analiza: El resultado es el mismo para i. y ii. en este programa y el anterior
programa?
Notas:
El cuerpo de una sentencia do - while siempre se ejecuta al menos una vez.
El uso de las llaves { } al inicio y fin del bucle (pasos de repeticin) de un do - while
o while es necesario.
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 5 de 11
Lenguajes de Programacin - UNAM
PROBLEMA 03:
Lee la Leyenda del ajedrez y de una solucin algortmica al problema.
Hace mucho tiempo reinaba en la India un prncipe llamado Iadava. Sus amigos estaban muy
preocupados por l, pues ltimamente estaba siempre triste y
taciturno. Hasta la aldea de LahurSessa, un joven brahmn,
lleg la noticia de la tristeza del monarca. As pues
LahurSessa invent un juego ("el ajedrez") que pudiera
distraerlo y alegrar su corazn.
Sessa explic al rey Iadava, a los visires y cortesanos las
reglas del juego. Era un gran tablero cuadrado dividido en 64
casillas. Sobre l se colocaban dos series de piezas, unas
blancas y otras negras. Las formas de las figuras se repetan
simtricamente y haba reglas curiosas para moverlas.
Iadava qued impresionado por el ingenio de Sessa y le
ofreci una bolsa llena de oro o un arca repleta de joyas o
palacios o tierras... pero Lahur "slo" le pidi granos de trigo:
Un grano por la primera casilla del tablero, 2 por la segunda, 4 por la tercera, 8 por la cuarta, y as
doblando sucesivamente hasta la ltima casilla.
Al oir la peticin de Sessa todos rieron, Iadava aunque extraado, llam a los algebristas de su corte
para que hicieran el clculo del n de granos que deba entregar al brahmn.
1. Usted como alumno de programacin, realice un algoritmo (DFD) para calcular el nmero de
granos de trigo que el prncipe debe entregar al joven genio y la respectiva codificacin de la
solucin en C++.
20+21+22+23+24++263
Datos de Entrada:
N : Nmero de casillas del ajedrez (64)
Salida:
S : Total de granos de trigo
Procedimiento:
Utilizar un contador con valor inicial 0
I=0
Acumular en S el valor 2 elevado a la potencia I
S=S+2I
Incrementar el contador en 1
I=I+1
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 6 de 11
Lenguajes de Programacin - UNAM
Algoritmo en DFD Guia0403.cpp
/*LEYENDA DEL AJEDREZ: El rey le dice al inventor
"pide lo que quieras por tu invento yo te lo dare"
pedido del inventor: por la primera casilla me
pagas 1 grano de trigo, por la segunda casilla el
doble osea 2,
por la tercera casilla el doble del anterior osea
4, por la cuarta casilla el doble de la anterior
osea 8...
yasisusesivamente hasta completar las 64 casillas*/
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
double S;
float i;
i=0; S=0;
while (i<=63)
{
S=S+pow(2,i);//la function pow() eleva 2 a
lapotencia i, y se encuentra
en la libreria <cmath>
i++;
}
cout<<"El rey debera pagarle al joven invertor
un total de \n\n ";
cout<<setprecision(20)<<S<<"\n\ngranos de trigo
aproximadamente. \n\n";
system("pause");
}
a) De la solucin al problema 03 con el siguiente algoritmo (codifique en C++)
0. Iniciar las variables
I=2
D=1
S=1
Mientas I sea menor o igual a 64 ( I<=64 ) hacer los pasos 1, 2, 3 y 4
1. Calcular el valor doble del casillero anterior
D=2*D
2. Acumular la suma en la variable S
S=S+D
3. Incrementar la variable I en 1
I=I+1
4. Volver al paso 1
5. Imprimir el valor de S
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 7 de 11
Lenguajes de Programacin - UNAM
PROBLEMAS PROPUESTOS
1. Imprima su nombre un nmero determinado de veces, es decir N veces.
Ejemplo:
Datos de entrada Salida
N=5 Juan Perez
Juan Perez
Juan Perez
Juan Perez
Juan Perez
2. Para la siguiente serie numrica: 0,4,8,12,16,,etc. Imprima todos los nmeros que sean
menores o iguales que un nmero dado.
Ejemplo:
Datos de entrada Salida
N=18 0
4
8
12
16
3. Dada la serie: 1,3,6,8,11,13,16,,etc. Muestre todos los nmeros que sean menores o iguales
que un nmero dado.
4. Calcular el promedio final de un alumno que tiene N calificaciones en el curso de Lenguajes de
programacin.
Ejemplo:
Datos de entrada
N=5
Calificaciones: 12 11 20 15 14
Salida
Promedio = 14.4
5. Leer N nmeros e imprimir cuantos son positivos, cuantos negativos y cuantos neutros.
Ejemplo:
Datos de entrada Salida
N=6 Positivos = 4
Numeros: 12 2 0 1 -4 5 Negativos = 1
Neutros = 1
6. Realice un programa que permita leer nmeros por teclado (la lectura se detendr cuando se
ingrese un numero negativo) e imprima el mayor, menor y el promedio de los nmeros ledos.
Ejemplo:
Datos de entrada Salida
Numeros: Mayor = 8
5 Menor = 0
3 Promedio = 3.33
8
2
0
2
-1
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 8 de 11
Lenguajes de Programacin - UNAM
7. Suponga que se tiene un conjunto de calificaciones de un grupo de 20 alumnos. Realizar un
algoritmo para calcular la calificacin media y la calificacin ms baja y la calificacin mas alta
de todo el grupo.
Ejemplo:
Datos de entrada (ingresar las veinte calificaciones)
Calificaciones: 11 10 13 05 07 12 16 15 12 15 20 19 09 14 15 16 10 12 19 16
Salida
Calificacion_media = 13.33
Calificacion_alta = 20
Calificacion_baja = 5
8. Calcular: N!, donde N!=1x2x3x4xxN
Ejemplo:
Datos de entrada
N=5
Salida
Factorial=120
9. Calcular: S = 1! + 3!+5! + 7!+ ... + N! N= nmero impar
Ejemplo:
Datos de entrada
N=7
Salida
S=5164
10. Calcular: S = 1/2 + 22/4! + 33/6!+ ... + NN/(2N)!
Ejemplo:
Datos de entrada
N=5
Salida
S=0.71
11. La secuencia de fibonacci, es muy conocida en los crculos matemticos y tiene la
particularidad que cada nmero es igual a la suma de los 2 anteriores trminos. La serie de
Fibonacci comienza con los nmeros 0 y 1 produciendo la siguiente secuencia:
0,1,1,2,3,5,8,13,.etc. Muestre todos los nmeros de Fibonacci que sean menores que un
nmero dado.
Ejemplo:
Datos de entrada
N=5
Salida
0
1
1
2
3
5
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 9 de 11
Lenguajes de Programacin - UNAM
12. En una empresa se requiere calcular el salario semanal de los N obreros que laboran en ella. El
salario se obtiene de la siguiente forma:
Si el obrero trabaja 40 horas o menos se le paga $20 por hora
Si trabaja ms de 40 horas se le paga $20 por cada una de las primeras 40 horas y $25 por
cada hora extra
Ejemplo:
Datos de entrada
N=4
Horas_obrero1 = 30
Horas_obrero2 = 50
Horas_obrero3 = 60
Horas_obrero4 = 20
Salida
Sueldo_obrero1 = 600
Sueldo_obrero2 = 1050
Sueldo_obrero3 = 1300
Sueldo_obrero4 = 400
13. Una persona desea invertir su dinero en un banco, el cual otorga un 2% de inters, Cul ser la
cantidad de dinero que esta persona tendr al cabo de un ao si la ganancia de cada mes es
reinvertida?
Ejemplo:
Datos de entrada
Dinero = 100
Salida
Total_dinero = 124.34
14. Lea un nmero y forme otro nmero con las cifras en orden inverso. As si el nmero es 12345
el nuevo nmero ser 54321
15. Un nmero se considera perfecto cuando la suma de sus divisores es igual al nmero. Por
ejemplo 6 tiene como divisores a 1,2 y 3 y como 1+2+3=6, el numero 6 ser perfecto; 28 tiene
como divisores a 1,2,4,7,14, luego 28 es perfecto pues 1+2+4+7+14=28; lo mismo ocurre con
496 y 8128. Escriba un programa que lea un nmero y diga si es perfecto.
No se olvide resolver los ejercicios (DFD y programa C++ ) y subirlos en un solo archivo
al aula virtual
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 10 de 11
Lenguajes de Programacin - UNAM
Ayuda:
Ejercicio 09.
Para este ejercicio tendremos que anidar bucles. Analiza el algoritmo en DFD y veras que da la
solucin a este ejercicio
Observa que existen dos bucles While, el bucle interior calcula el
factorial de i con ayuda de la variable k y lo guarda en F. El bucle
exterior acumula en S todos los factoriales calculados en F. De manera
similar dars solucin al ejercicio 10.
Ejercicio 11.
Definicion de variables:
m: mximo numero Fibonacci a mostrar
a: ensimo numero Fibonacci
b: ensimo+1 numero Fibonacci
Iniciamos la serie con a=0 y b=1, imprimimos el valor de a y
Mientrasb sea menor que m: imprimimos b, calculamos c=a+b,
asignamos a la variable a el valor de b (a=b), asignamos a la variable
b el valor de c (b=c).
Ejercicio 14.
Definicion de variables:
n: numero cuyos digitos se invertirn
inv: numero invertido
Para obtener un nuevo numeroinv, formado por los digitos de n, pero
en orden invertido, debemos obtener cada uno de los digitos de n e ir
desplazndolos un valor posicional (unidad, decena, centena, etc.).
Cada uno de los digitos, pueden ser obtenidos al buscar el resto de la
divisin entera entre 10 (n MOD 10) y se debe ir incrementando el
valor posicional mediante la multiplicacin del resto por 10, y su
acumulacin en la variable inv. El ciclo se ejecuta mientras el
numero aun tenga digitos que obtener (mientas n sea mayor que 0),
luego del cual imprimimos inv.
Ejercicio 15.
Descargael archivo en formato DFD (perfecto.dfd) del aula virtual
El nico camino de saber si los planes son buenos o malos es
ponindolos en prctica
Ing. Edwing A. Maquera Flores
Ing. Juan Carlos Clares Perca Pagina 11 de 11