0% encontró este documento útil (0 votos)
6 vistas29 páginas

Repetiti Vas 2

El documento presenta una introducción a las estructuras de repetición en programación, específicamente en C++, incluyendo las estructuras while, do...while y for. Se explican sus sintaxis, ejemplos de uso, y se introducen conceptos como contadores y acumuladores. Además, se incluyen problemas resueltos que ilustran cómo implementar estas estructuras para resolver diferentes tipos de problemas.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
6 vistas29 páginas

Repetiti Vas 2

El documento presenta una introducción a las estructuras de repetición en programación, específicamente en C++, incluyendo las estructuras while, do...while y for. Se explican sus sintaxis, ejemplos de uso, y se introducen conceptos como contadores y acumuladores. Además, se incluyen problemas resueltos que ilustran cómo implementar estas estructuras para resolver diferentes tipos de problemas.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 29

IN T R O D U C CIÓ N A L A A L G O R I T M IA 1

Estructuras de Repetición

LOGRO DE LA UNIDAD DE APRENDIZAJE

Al finalizar la unidad, los alumnos, utilizando estructuras de repetición simple y anidada


y los demás conceptos aprendidos en el curso, diseñarán algoritmos que resuelvan
problemas que involucren instrucciones repetitivas.

CONTENIDO

9.1. Introducción
9.2. Estructura de repetición while.
9.3. Números aleatorios
9.4. Estructura de repitición do...while.
9.5. Estructura de repetición for.
9.6. Problemas resueltos.

ACTIVIDAD

Los alumnos desarrollan algoritmos que involucren el uso de estructuras de repetición.


2

9.1. ESTRUCTURAS DE REPETICION

Se denominan estructuras de repetición a aquellas estructuras que permiten repetir


instrucciones. A las estructuras repetitivas se conocen también como estructuras
iterativas, bucles ó lazos, a las instrucciones a repetir se conocen como el cuerpo
del bucle y al hecho de repetir la secuencia de instrucciones se denomina iteración.
En el caso del lenguaje C++ tenemos tres tipos de bucles: el bucle while, el bucle
do...while y el bucle for.

9.2. ESTRUCTURA DE REPETICIÓN while

La estructura while repite una acción o un conjunto de acciones mientras sea


verdadera una determinada condición, para lo cual primero verifica la condición y
luego ejecuta la acción. La acción puede ser una acción simple o una acción
compuesta (bloque de acciones encerradas entre llaves). En las figuras 9.1, se
muestra el diagrama de flujo de la estructura while.

Figura 9.1 Diagrama de flujo de la estructura while

La sintaxis de la estructura de repetición while es la siguiente:

Para una sóla acción a repetir:

while( condicion )
accion;

Para más de una acción a repetir:

while( condicion ){
accion1;
accion2;
.
.
.
accion3;
}
IN T R O D U C CIÓ N A L A A L G O R I T M IA 3

9.3. ESTRUCTURA DE REPETICIÓN do...while

La estructura do...while repite una acción o un conjunto de acciones mientras sea


verdadera una determinada condición, para lo cual primero ejecuta la acción y luego
verifica la condición. La acción puede ser una acción simple o una acción
compuesta (bloque de acciones encerradas entre llaves). En la figura 9.2 se muestra
el diagrama de flujo de la estructura do-while.

Figura 9.2 Diagrama de flujo de la estructura do...while

La sintaxis de la estructura de repetición do…while es la siguiente:

Para una sóla acción a repetir:

do
accion;
while( condicion );

Para más de una acción a repetir

do{
accion1;
accion2;
.
.
.
accion3;
}while( condicion );

9.4. ESTRUCTURA DE REPETICIÓN for

La estructura de repetición for contempla todos los elementos de la repetición


controlada por contador (repetición en la que se conoce el número de veces que se
repetirá el cuerpo del bucle) al incluir un contador como parte de la propia estructura.
En la figura 9.3 se muestra el diagrama de flujo correspondiente:
4

inicializacion

F
condicion

accion

incremento

Figura 9.3 Diagrama de flujo de la estructura for

La sintaxis de la estructura de repetición for es la siguiente:

Para una sóla acción a repetir:

for(inicio;condicion;incremento)
accion;

Para más de una acción a repetir:

for(inicio;condicion;incremento){
accion1;
accion2;
.
.
.
accionn;
}

9.5. OPERADORES DE INCREMENTO Y DECREMENTO

Son operadores que permiten incrementar o decrementar en una unidad el valor de


una variable numérica.

Operador Uso Equivalencia


++ a++; a = a + 1;
-- a--; a = a - 1;
IN T R O D U C CIÓ N A L A A L G O R I T M IA 5

Ejemplo 9.1

// Incrementa en uno el valor de x (Forma 1)


x = x + 1;

// Incrementa en uno el valor de x (Forma 2)


x++;

// Decrementa en 1 el valor de la variable z (Forma 1)


z = z - 1;

// Decrementa en 1 el valor de la variable z (Forma 2)


z--;

9.6. OPERADORES DE ASIGNACION COMPLEJA

Son operadores que permiten asignar a una variable el valor de la variable mas,
menos, por o entre el valor de otra variable.

Operador Ejemplo Equivalencia


+= a += b; a = a + b;
-= a -= b; a = a – b;
*= a *= b; a = a * b;
/= a /= b; a = a / b;

Ejemplo 9.2

// Incrementa en 2 el valor de la variable z (Forma 1)


z = z + 2;

// Incrementa en 2 el valor de la variable z (Forma 2)


z += 2;

// Decrementa en 5 el valor de la variable m (Forma 1)


m = m – 5;

// Decrementa en 5 el valor de la variable m (Forma 2)


m -= 5;

9.7. CONTADORES

 Un contador es una variable que se utiliza para contar el número de ocurrencias


de un suceso dentro de un bucle.

 Un contador es una variable cuyo valor se incrementa o decrementa en una


cantidad constante en cada iteración del bucle.

Por ejemplo, se necesita un contador para determinar:

- La cantidad de personas mayores de edad.


- La cantidad de iteraciones de un bucle.
- La cantidad de notas desaprobatorias.
- Etc.

Una instrucción de conteo tiene una de las siguientes formas:


6

contador++;

contador--;

9.8. ACUMULADORES

 Un acumulador es una variable que se utiliza para acumular o totalizar cantidades


de una misma especie.

 Un acumulador es una variable que se incrementa o decrementa en una cantidad


variable.

Por ejemplo, se necesita un acumulador para determinar:

- El sueldo total de los empleados de una empresa.


- La suma de las notas de un alumno.
- Etc.

Una instrucción de acumulación tiene una de las siguientes formas:

acumulador += cantidad;

acumulador -= cantidad;

Ejemplo 9.3

a. while que imprime los números: 0, 1, 2, 3, ..., 48, 49, 50

int n = 0;
while( n <= 50 ){
cout << n << endl;
n++;
}

b. while que imprime los números: 100, 99, 98, ..., 13, 12, 11, 10

int n = 100;
while( n >= 10 ){
cout << n << endl;
n--;
}

c. while que imprime los números: 10, 12, 14, 16, ..., 98, 99, 100

int n = 10;
while( n <= 100 ){
cout << n << endl;
n += 2;
}

d. while que imprime los números: 100, 97, 94, 91, ..., 18, 15, 12, 9

int n = 100;
while( n >= 9 ){
IN T R O D U C CIÓ N A L A A L G O R I T M IA 7

cout << n << endl;


n -= 3;
}

Ejemplo 9.4

e. do - while que imprime los números: 0, 1, 2, 3, ..., 48, 49, 50

int n = 0;
do{
cout << n << endl;
n++;
}while( n <= 50 );

f. do - while que imprime los números: 100, 99, 98, ..., 13, 12, 11, 10

int n = 100;
do{
cout << n << endl;
n--;
}while( n >= 10 )

g. do - while que imprime los números: 10, 12, 14, 16, ..., 98, 99, 100

int n = 10;
do{
cout << n << endl;
n += 2;
}while( n <= 100 );

h. do - while que imprime los números: 100, 97, 94, 91, ..., 18, 15, 12, 9

int n = 100;
do{
cout << n << endl;
n -= 3;
}while( n >= 9 )

Ejemplo 9.5

i. for que imprime los números: 0, 1, 2, 3, ..., 48, 49, 50

for( int n = 0; n <= 50; n++ )


cout << n << endl;

j. for que imprime los números: 100, 99, 98, ..., 13, 12, 11, 10

for( int n = 100; n >= 10; n-- )


cout << n << endl;

k. for que imprime los números: 10, 12, 14, 16, ..., 98, 99, 100

for( int n = 10; n <= 100; n += 2 )


cout << n << endl;

l. for que imprime los números: 100, 97, 94, 91, ..., 18, 15, 12, 9

for( int n = 100; n >= 9; n -= 3 )


8

cout << n << endl;

m. for que imprime la siguiente tabla:

10 30
11 29
12 28
13 27
14 26
15 25
16 24
17 23
18 22
19 21
20 20

for( int m = 10, n = 30; m <= 20; m++, n-- )


cout << m << "\t" << n << endl;

Nota

El contador del for puede ser declarado dentro del mismo for, en cuyo caso se
considera como variable local al for, no siendo accesible fuera de él. De esta manera,
en una misma función dos o más for, no anidados, pueden declarar contadores con el
mismo nombre. Cada contador existe dentro del for en el que fue declarado.

9.9. NUMEROS ALEATORIOS

Para generar un número pseudoaleatorio entero en el intervalo de min a max, se usa


la siguiente expresión:

n = min + random(max-min+1);

La secuencia de números generados por random se repiten cada vez que se vuelve a
ejecutar el programa, por eso se denominan números pseudoaleatorios. Para que esto
no suceda y los números sean verdaderamente aleatorios, debe llamarse previamente
a la función randomize en la forma:

randomize();

9.10. PROBLEMAS RESUELTOS

Problema 9.1

Diseñe un programa que imprima la siguiente serie: 1, 2, 3, ..., n

Solución 1 : usando while


#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración e inicialización de variables locales


IN T R O D U C CIÓ N A L A A L G O R I T M IA 9

int n, termino = 1;

// Lee la cantidad de términos


cout << "Ingrese n : ";
cin >> n;

// Imprime la serie
while( termino <= n ){
cout << termino << endl;
termino++;
}

system("pause");
return 0;
}

Solución 2 : usando do...while


#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración e inicialización de variables locales


int n, termino = 1;

// Lee la cantidad de términos


cout << "Ingrese n : ";
cin >> n;

// Imprime la serie
do{
cout << termino << endl;
termino++;
}while( termino <= n );

system("pause");
return 0;
}

Solución 3: usando for


#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración e inicialización de variables locales


int n;

// Lee la cantidad de términos


cout << "Ingrese n : ";
cin >> n;

// Imprime la serie
for(int termino = 1; termino <= n; termino++)
cout << termino << endl;

system("pause");
return 0;
}
10

Problema 9. 2

Diseñe un programa que imprima una tabla de valores de x e y, para valores de x en el


intervalo de 0 a 10 cada 0.25, siendo:

x3  3x  1
y
x2  2

Solución 1: solución con while


#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

int main() {

// Declaración e inicialización de variables


double x = 0, y;

// Imprime la cabecera
cout << setw(15) << "x" << setw(15) << "y" << endl;

// Configura el formato de salida


cout << setprecision(2);
cout << setiosflags(ios::showpoint|ios::fixed|ios::left);

// Imprime la tabla
while( x <= 10 ){
y = (x*x*x + 3*x + 1)/(x*x + 2);
cout << setw(15) << x << setw(15) << y << endl;
x += 0.25;
}

system("pause");
return 0;
}

Solución 2: solución do...while


#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

int main() {

// Declaración e inicialización de variables


double x = 0, y;

// Imprime la cabecera
cout << setw(15) << "x" << setw(15) << "y" << endl;

// Configura el formato de salida


cout << setprecision(2);
cout << setiosflags(ios::showpoint|ios::fixed|ios::left);

// Imprime la tabla
do{
y = (x*x*x + 3*x + 1)/(x*x + 2);
IN T R O D U C CIÓ N A L A A L G O R I T M IA 11

cout << setw(15) << x << setw(15) << y << endl;


x += 0.25;
}while( x <= 10 );

system("pause");
return 0;
}

Solución 3: solución con for


#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

int main() {

// Declaración e inicialización de variables


double y;

// Imprime la cabecera
cout << setw(15) << "x" << setw(15) << "y" << endl;

// Configura el formato de salida


cout << setprecision(2);
cout << setiosflags(ios::showpoint|ios::fixed|ios::left);

// Imprime la tabla
for(double x = 0; x <= 10; x++){
y = (x*x*x + 3*x + 1)/(x*x + 2);
cout << setw(15) << x << setw(15) << y << endl;
x += 0.25;
}

system("pause");
return 0;
}

Problema 9.3

Diseñe un programa que imprima la siguiente serie y halle su suma:

1/2 + 3/5 + 5/8 + 7/11 + ... (100 términos)

Solución 1: solución con while


#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración de variables locales


int numerador = 1, denominador = 2, contador = 0;
double suma = 0;

// Genera e imprime la serie


while( contador < 100 ){

// Imprime y suma el término actual


cout << numerador << "/" << denominador << endl;
suma += numerador*1.0/denominador;

// Genera el numerador y el denominador de un nuevo término


12

numerador += 2;
denominador += 3;

// Incrementa el contador de términos


contador++;
}

// Imprime la suma
cout << "Suma : " << suma << endl;

system("pause");
return 0;
}

Solución 2: solución con do...while


#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración de variables locales


int numerador = 1, denominador = 2, contador = 0;
double suma = 0;

// Genera e imprime la serie


do{

// Imprime y suma el término actual


cout << numerador << "/" << denominador << endl;
suma += numerador*1.0/denominador;

// Genera el numerador y el denominador de un nuevo término


numerador += 2;
denominador += 3;

// Incrementa el contador de términos


contador++;

}while( contador < 100 );

// Imprime la suma
cout << "Suma : " << suma << endl;

system("pause");
return 0;
}

Solución 3 : solución con for


#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración de variables locales


int numerador = 1, denominador = 2;
double suma = 0;

// Genera e imprime la serie


for(int contador = 0; contador < 100; contador++){

// Imprime y suma el término actual


IN T R O D U C CIÓ N A L A A L G O R I T M IA 13

cout << numerador << "/" << denominador << endl;


suma += numerador*1.0/denominador;

// Genera el numerador y el denominador de un nuevo término


numerador += 2;
denominador += 3;

// Incrementa el contador de términos


contador++;
}

// Imprime la suma
cout << "Suma : " << suma << endl;

system("pause");
return 0;
}

Problema 9.4

Diseñe un programa que genere 6000 números aleatorios en el intervalo de 1000 a


9999 y determine cuántos números estan en cada uno de los siguientes
intervalos:1000 a 1999, 2000 a 2999, 3000 a 3999, ..., 8000 a 8999, 9000 a 9999.

Solución

#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

int main() {

// Declaraciones locales
int numero, c1=0, c2=0, c3=0, c4=0, c5=0, c6=0, c7=0, c8=0, c9=0;

randomize();

// Genera los 600 números aleatorios


for( int i = 0; i < 6000; i++ ){

// Genera un número de 1000 a 9999


numero = 1000 + random(9999-1000+1);

// Cuenta el número según el intervalo


if( numero < 2000 )
c1++;
else if( numero < 3000 )
c2++;
else if( numero < 4000 )
c3++;
else if( numero < 5000 )
c4++;
else if( numero < 6000 )
c5++;
else if( numero < 7000 )
c6++;
else if( numero < 8000 )
c7++;
else if( numero < 9000 )
c8++;
else
c9++;
}
14

// Imprime los contadores


cout << setprecision(2);
cout << setiosflags(ios::showpoint|ios::fixed|ios::left);
cout << "RESULTADOS OBTENIDOS" << "\n\n";
cout << setw(20) << "Intervalo" << setw(20) << "Cantidad\n\n";
cout << setw(20) << "1000 a 1999" << setw(20) << c1 << endl;
cout << setw(20) << "2000 a 2999" << setw(20) << c2 << endl;
cout << setw(20) << "3000 a 3999" << setw(20) << c3 << endl;
cout << setw(20) << "4000 a 4999" << setw(20) << c4 << endl;
cout << setw(20) << "5000 a 5999" << setw(20) << c5 << endl;
cout << setw(20) << "6000 a 6999" << setw(20) << c6 << endl;
cout << setw(20) << "7000 a 7999" << setw(20) << c7 << endl;
cout << setw(20) << "8000 a 8999" << setw(20) << c8 << endl;
cout << setw(20) << "9000 a 9999" << setw(20) << c8 << endl;

system("pause");
return 0;
}
Problema 9.5

Diseñe un programa que simule varios lanzamientos simultáneos de dos dados hasta
obtener 6 en ambos dados e informe cuántos lanzamientos simultáneos fueron
necesarios efectuar.

Solucíón
#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

int lanzarDado();

int main() {

// Declaración de variables locales


int dado1, dado2, conta=0;

// Inicializa el generador de números aleatorios


randomize();

// Simula el lanzamiento de los dados


cout << setiosflags(ios::left);
cout << setw(10) << "Dado 1";
cout << setw(10) << "Dado 2";
cout << endl;
do{
dado1 = lanzarDado();
dado2 = lanzarDado();
cout << setw(10) << dado1;
cout << setw(10) << dado2;
cout << endl;
conta++;
}while(dado1 != 6 || dado2 != 6);

// Imprime la cantidad de lanzamientos efectuados


cout << "Fueron necesarios " << conta << " lanzamientos" << endl;

system("pause");
return 0;
}

int lanzarDado(){
return random(6) + 1;
}
IN T R O D U C CIÓ N A L A A L G O R I T M IA 15

Problema 9.6
Diseñe un programa que genere números aleatorios en el intervalo de -1000 a 1000
hasta obtener un número par menor que 500 pero mayor que -500. ¿Cuántos números
fueron necesarios generar y cuáles fueron el mayor y el menor número generados?.

Solución

#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración de variables locales


int numero, mayor = -1000, menor = 1000, conta = 0;

// Inicializa el generador de números alatorios


randomize();

// Generación de números
do{

// Genera un número aleatorio en el intervalo de -1000 y 1000


numero = -1000 + random(2001);

// Muestra y cuenta el número generado


cout << numero << endl;
conta++;

// Actualiza el mayor y el menor


if( numero > mayor )
mayor = numero;
if( numero < menor )
menor = numero;

}while( numero%2 != 0 || numero <= -500 || numero >= 500 );

// Imprime resultados
cout << "Cantidad de numeros generados : " << conta << endl;
cout << "Mayor numero generado : " << mayor << endl;
cout << "Menor numero generado : " << menor << endl;

system("pause");
return 0;
}

Problema 9.7

Un método para obtener el cociente y el resto de dos números enteros es por restas
sucesivas. El método consiste en restar sucesivamente el divisor del dividendo hasta
obtener un resultado menor que el divisor, que será el resto de la división; el número
de restas efectuadas será el cociente. Diseñe un algoritmo que determine el cociente y
el resto de dos números enteros.

Solución
#include <iostream>
#include <cstdlib>

using namespace std;


16

int main() {

// Declaración de variables locales


int dividendo, divisor, cociente, resto;

// Ingreso del Divisor y del Dividendo


cout << "DIVISION DE DOS NUMEROS ENTEROS" << endl;
cout << "Ingrese el dividendo : ";
cin >> dividendo;
cout << "Ingrese el divisor : ";
cin >> divisor;

// Inicializa el resto y el cociente


resto = dividendo;
cociente = 0;

// Determina el resto y el cociente


while( resto >= divisor ){
resto -= divisor;
cociente++;
}

// Imprime el resto y el cociente


cout << "El cociente es : " << cociente << endl;
cout << "El resto es : " << resto << endl;

system("pause");
return 0;
}

Problema 9.8

Diseñe un programa que lea un número entero positivo n mayor que 10 e imprima
todos los puntos del plano cartesiano que cumplan con la condición: x + y < n.

Solución
#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

int main() {

// Declaración de variables locales


int n;

// Lee el número n
do{
cout << "Ingrese un numero entero mayor que 10: ";
cin >> n;
if(n <= 10)
cout << "El numero ingresado es incorrecto" << endl;
}while(n <= 10);
// Imprime los puntos del plano solicitados
cout << setiosflags(ios::left);

for( int x = 1; x < n; x++ )


for( int y = 1; x + y < n; y++ )
cout << setw(5) << x << setw(5) << y << setw(5) << x+y<< endl;

system("pause");
return 0;
}
IN T R O D U C CIÓ N A L A A L G O R I T M IA 17

Problema 9.9

Imprime un rectángulo de altura n y ancho m relleno de asteriscos. Así, para n igual a


5 y m igual a 10, el programa deberá imprimir un rectángulo de 5 asteriscos de alto por
10 asteriscos de ancho como el que se muestra a continuación:

**********
**********
**********
**********
**********

Solución
#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración de variables locales


int n, m;

// Lee el ancho y la altura del rectángulo


cout << "Ingrese la altura del rectangulo : ";
cin >> n;
cout << "Ingrese el ancho del rectangulo : ";
cin >> m;

// Imprime el rectángulo
for( int i = 0; i < n; i++ ){
for( int j = 0; j < m; j++ )
cout << "*";
cout << endl;
}

system("pause");
return 0;
}

Problema 9.10

Diseñe un programa que muestre por pantalla todos los números de 4 cifras que
cumplen con la condición de que la suma de las cifras pares es igual a la suma de las
cifras impares. Muestre también la cantidad de números encontrados.

Solución
#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración de variables
int sumaCifPares, sumaCifImpares, cifra, copiaNumero, cantidad=0;

// Muestra los números solicitados


for( int numero=1000; numero<=9999; numero++ ){
copiaNumero=numero;
sumaCifImpares=0;
18

sumaCifPares=0;
do{
cifra = copiaNumero%10;
if(cifra%2==0)
sumaCifPares+=cifra;
else
sumaCifImpares+=cifra;
copiaNumero /= 10;
}while(copiaNumero!=0);

if( sumaCifPares == sumaCifImpares ){


cout << numero << endl;
cantidad++;
}
}
cout << "Cantidad de numeros : " << cantidad << endl;

system("pause");
return 0;
}

Problema 9.11

Diseñe un algoritmo que determine la cantidad de divisores pares de un número


natural.

Solución
#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración e inicialización de variables locales


int contadiv = 0, numero;

// Ingresa el número
cout << "CANTIDAD DE DIVISORES PARES DE UN NÚMERO ENTERO" << endl;
cout << "Ingrese el numero............: " ;
cin >> numero;

// Determina la cantidad de divisores pares


for( int divisor = 2; divisor <= numero; divisor += 2 )
if( numero%divisor == 0 )
contadiv++;

// Imprime la cantidad de divisores pares


cout << "Cantidad de divisores pares..: " << contadiv << endl;

system("pause");
return 0;
}

Problema 9.12

Diseñe un algoritmo que genere 50 números aleatorios en el intervalo de 100 a 999 y


determine la cantidad de números capicúas generados. Un número es capicúa si lee
igual de derecha a izquierda que de derecha a izquierda. Así, por ejemplo, 343 es
capícua; pero, 367 no lo es.
IN T R O D U C CIÓ N A L A A L G O R I T M IA 19

Solución

#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

// Declaración e inicialización de variables locales


int conta = 0, numero, unidades, millares;

cout << "NÚMEROS ALEATORIOS" << endl;

randomize();

// Genera 200 números de 100 a 999 y cuenta cuantos son capicúas


for( int i = 0; i < 50; i++ ){

// Genera un número aleatorio en el intervalo de 100 a 999


numero = 100 + random(900);

// Muestra el número generado


cout << número;

// Obtiene las cifras de las unidades y de los millares


unidades = numero%10;
millares = numero/1000;

// Determina si el número es capicúa


if( unidades == millares ){
cout << " capicua";
conta++;
}
cout << endl;
}

// Imprime la cantidad de números capicúas


cout << "Cantidad de numeros capicuas : " << conta << endl;

system("pause");
return 0;
}

Problema 9.13

Se desea un programa para registrar las visitas efectuadas a un museo a lo largo de


un día. El programa debe solicitar a cada visitante su edad y su sexo e imprimir a
continuación el mensaje "Gracias por registrar su visita. Pulse una tecla para
continuar". Al finalizar el día, un empleado del museo ingresará una edad igual a -1
para terminar el registro de visitas. Luego de esto el programa debe imprimir un
reporte mostrando:

 Número total de visitantes.


 Número total de varones
 Número total de mujeres.
 Número total de mujeres mayores de edad.
 Número total de varones mayores de edad.
 Edad promedio.

Valide la edad (para estar en el rango de 1 a 80 años) y el sexo (para ser m ó f).
20

Solución:

#include <iostream>
#include <conio>

using namespace std;

int main(){

char sexo;
int edad, varones=0, mujeres=0, visitas=0, varmay=0, mujmay=0, suma=0;
double promedio=0;

do{
clrscr();
cout << "REGISTRO DE VISITANTES AL MUSEO\n\n";
do{
cout << "Visitante No. " << (visitas+1);
cout << "\n \n";
cout << "Ingrese su edad : ";
cin >> edad;
}while( (edad != -1) && (edad < 1 || edad > 80) );

if( edad != -1 ){
do{
cout << "Ingrese su sexo (f o m) : ";
cin >> sexo;
}while( sexo != 'm' && sexo != 'f' );

visitas++;
suma += edad;
if( sexo == 'f' ){
mujeres++;
if( edad >= 18 )
mujmay++;
}
else{
varones++;
if( edad >= 18 )
varmay++;
}
cout << "\nGracias por registrar su visita";
cout << "\nPulse una tecla para continuar...";
getch();
}
}while( edad != -1 );

if( visitas != 0 )
promedio = suma*1.0/visitas;

cout << "\nREPORTE DE VISITAS AL MUSEO";


cout << "\nNumero total de visitantes................: " << visitas;
cout << "\nNumero total de varones...................: " << varones;
cout << "\nNumero total de mujeres...................: " << mujeres;
cout << "\nNumero total de mujeres mayores de edad...: " << mujmay;
cout << "\nNumero total de varones mayores de edad...: " << varmay;
cout << "\nEdad promedio.............................: " << promedio;
cout << "\n\nPulse una tecla para finalizar...";
getch();
return 0;
}
IN T R O D U C CIÓ N A L A A L G O R I T M IA 21

Problema 9.14
Diseñe un programa que permita ingresar los promedios pomnderados de 10 alumnos
y determine cuantos alumnos son de cada una las categorías A, B y C. Las categorñia
dependen del promedio ponderado de acuerdo a la siguiente tabla:

Promedio ponderado Categoría


[17, 20] A
[13, 17> B
[0, 13> C

Solución:
#include <iostream>
#include <cstdlib>

using namespace std;

int main(){

// Declaración de variables
double promPond;
int numCatA = 0, numCatB = 0, numCatC = 0;

for( int conta = 0; conta < 10; conta++ ){

// Ingreso validado del promedio ponderado


do{
cout << "Promedio ponderado " << (conta+1) << " : ";
cin >> promPond;
if( promPond < 0 || promPond > 20 )
cout << "Error. La nota debe estar entre 0 y 20\n";
}while( promPond < 0 || promPond > 20 );

// Cuenta según la categoría


if(promPond >= 17)
numCatA++;
else if(promPond >= 13)
numCatB++;
else
numCatC++;
}

// Reporte
cout << "Numero de alumnos de la categoria A : " << numCatA << endl;
cout << "Numero de alumnos de la categoria B : " << numCatB << endl;
cout << "Numero de alumnos de la categoria C : " << numCatC << endl;

system("pause");
return 0;
}

Problema 9.15

Diseñe un programa que permita ingresar las notas de una práctica calificada de una
sección, de una en una. Para finalizar la entrada de notas, se ingresará una nota igual
a -1. Mostrar luego un reporte indicando lo siguiente:
22

 Cantidad de notas ingresadas.


 La nota promedio de la sección.
 La mayor nota de la sección.
 La menor nota de la sección.
 La cantidad de notas aprobatorias.
 La cantidad de notas desaprobatorias.

Solución:
#include <iostream>
#include <cstdlib>

using namespace std;

int main(){

// Declaración de variables
double nota, promedio;
int cannot=0, sumnot=0, mayor=21, menor=-1, canapro=0, candesa=0;

cout << "INGRESO DE NOTAS DE LA SECCION" << endl;


do{
// Ingreso validado de la nota
do{
cout << "Nota de practica " << (cannot+1) << " : ";
cin >> nota;
if((nota != -1) && (nota < 0 || nota > 20))
cout << "Error. La nota debe estar entre 0 y 20\n";
}while((nota!= -1 ) && (nota < 0 || nota > 20));

// Procesa la nota
if(nota != -1){
cannot++;
sumnot += nota;

if(nota > mayor)


mayor = nota;
if(nota < menor)
menor = nota;
if(nota >= 13)
canapro++;
else
candesa++;
}
}while(nota != -1);

if(cannot > 0){


promedio = sumnot/cannot;

// Muestra el reporte estadístico


cout << "\nREPORTE ESTADISTICO" << endl;
cout << "Cantidad de notas ingresadas : " << cannot << endl;
cout << "Nota promedio de la seccion : " << promedio << endl;
cout << "Mayor nota de la seccion : " << mayor << endl;
cout << "Menor nota de la seccion : " << menor << endl;
cout << "Cantidad de notas aprobatorias : " << canapro << endl;
cout << "Cantidad de notas desaprobatorias : " << candesa << endl;
}
system("pause");
return 0;
}
IN T R O D U C CIÓ N A L A A L G O R I T M IA 23

Problemas propuestos
Actividad
1. Diseñe un programa que imprima la siguiente serie en una columna a razón de un
término por fila.

1, 2, 3, 4, 5, 6, 7, 8, ..., 200

2. Diseñe un programa que imprima y sume 50 términos de la siguiente serie:

3, 10, 17, 24, 28, …

3. Diseñe un programa que imprima y sume 100 términos de la siguiente serie. Los
términos serán mostrados en una columna a razón de un término por fila.

2/3, 5/5, 8/7, 11/9, ...

4. Diseñe un programa que imprima y sume n términos de la siguiente serie. Los


términos serán mostrados en una columna a razón de un término por fila

1/2, 4/4, 7/6, 10/8, ...

5. Diseñe un programa que simule varios lanzamientos de un dado hasta obtener un


seis. Muestre los puntajes del dado conforme se vayan generando y muestre al
final cuántos lanzamientos fueron necesarios efectuar

6. Diseñe un programa que genere números aleatorios enteros del intervalo de -50 a
50 hasta obtener un número igual a –25 o igual a +25. Muestre los números
conforme se vayan generando y, el mayor y el menor números que fueron
generados.

7. Diseñe un programa que ingrese números enteros del intervalo de -50 a 50 hasta
ingresar un número igual a -25 ó igual a +25. Muestre luego el mayor y el menor
números que fueron ingresados.

8. Diseñe un programa que genere números aleatorios enteros del intervalo de100 a
900 hasta obtener un número par que cumpla con ser menor que 300 ó mayor
que 700. Muestre los números generados, la suma de todos los números
generados, el mayor número generado y el menor número generado.

9. Diseñe un programa que ingrese números enteros del intervalo de 100 a 900
hasta ingresar un número par que cumpla con ser menor que 300 ó mayor que
700. Muestre luego la suma de todos los números ingresados, el mayor número
ingresado y el menor número ingresado.

10. Diseñe un programa que genere aleatoriamente las notas de una práctica
calificada para 45 alumnos de una sección y determine la nota promedio de la
sección y, las notas máxima y mínima generadas.
24

11. Diseñe un programa que genere tres notas aleatorias para cada uno de los 40
alumnos de una sección e imprima un reporte como el siguiente:

Alumno Notas Cant. Aprob Cant. Desap


1 12 17 20 2 1
2 8 15 11 1 2
. . . . . .
. . . . . .
. . . . . .
40 10 11 12 0 3

12. Diseñe un programa que genere aleatoriamente las notas de una práctica
calificada de 30 alumnos de una sección e imprima por cada nota tantos
asteriscos como indique la nota.

Nota Histograma

10 **********
8 ********
5 *****
15 ***************
4 ****
1 *
20 ********************
.
.
.
7 *******
3 ***

13. Diseñe un programa que determine la cantidad de divisores de un número natural.

14. Diseñe un programa que determine la cantidad de divisores de cada uno de los
números del 2 al 100.

15. Diseñe un programa que genere números aleatorios del intervalo de 1 a 1000
hasta obtener un número con cuatro divisores. El programa mostrará un listado
como el siguiente:

Número Cantidad de Divisores

121 3
881 2
60 12
978 8
964 6
22 4

Autoevaluación
1. Diseñe un programa que halle la suma de todos los números enteros naturales
múltiplos de 3 pero no de 5 que sean menores o iguales que n.

2. Diseñe un programa que halle la suma de n términos de la siguiente serie:


IN T R O D U C CIÓ N A L A A L G O R I T M IA 25

3, -8, 15, -24, ...

3. Diseñe un programa para calcular la suma de n términos de la siguiente serie:

1, – 1/2, 1/3, – 1/4, 1/5, ....

4. Diseñe un programa que halle la suma de n términos de la siguiente serie:

1, 6/5, 11/9, 16/13, ...

5. Diseñe un programa que imprima n términos de la siguiente serie. Note que a


partir del tercer término, cada término es igual a la suma de los dos términos
anteriores.

1, 2, 3, 5, 8, 13, 21, …

6. Diseñe un programa que calcule el valor de  de acuerdo a la siguiente expresión:


4 4 4 4 4
  4      ...(n términos)
3 5 7 9 11

7. Diseñe un programa que genere la tabla de multiplicar de un número entero n,


desde n x 1 hasta n x 12. Por ejemplo, para n igual a 3 el programa imprimirá:

3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
3 x 10 = 30
3 x 11 = 33
3 x 12 = 36

8. Diseñe un programa que imprima los primeros m múltiplos de un número entero


positivo n.

9. Diseñe un programa para determinar el factorial de un número. El factorial de un


número n se define como: 1x2x3x4x5x...x(n-1)xn. El factorial de 0 y de 1 es 1.

10. Diseñe un programa que tenga determine la potencia mn siendo m un número real
y n un número entero. Considere que n puede ser positivo, negativo o cero. No
use ningúna función del lenguaje C++.

11. El movimiento de un proyectil viene dado por la siguiente ecuación:

h = 50 + 200t + 5t²

Siendo h la altura que alcanza el proyectil en metros para un tiempo t en


segundos. Diseñe un programa que imprima una tabla de valores de t vs h para
valores del tiempo en el intervalo de 0 a 20 segundos cada 2 segundos.
26

12. Dado un número entero mayor que 1, diseñe un programa que determine el
mayor divisor del número que sea diferente del número. Así, por ejemplo, dado el
número 45, su mayor divisor distinto de 45 es 15.

13. Un número perfecto es un entero positivo, que es igual a la suma de todos sus
divisores (excepto el mismo). El primer número perfecto es 6, ya que sus divisores
son 1, 2, 3 y suman 6. Diseñe un programa que lea un entero positivo y determine
si es o no es perfecto.

14. Diseñe un programa que determine si un número es primo. Un número es primo si


tiene únicamente dos divisores: 1 y el mismo número. Por ejemplo, 3 es primo
porque sus únicos divisores son 1 y 3; en cambio, 8 no es primo porque a parte
del 1 y el 8 tiene otros divisores.

15. Diseñe un programa que genere números aleatorios del intervalo de 10 a 99 hasta
obtener un número cuya suma de sus cifras sea igual a a 4 ó 6. Muestre los
números conforme se vayan generando y muestre al final:

 La cantidad de números generados.


 El mayor número generado.
 El menor número generado.

16. Diseñe un programa que ingrese números enteros del intervalo de 10 a 99 hasta
ingresar un número cuya suma de sus cifras sea igual a a 4 ó 6. Luego, muestre
un reporte indicando:

 La cantidad de números ingresados.


 El mayor número ingresado.
 El menor número ingresado.

17. Diseñe un programa que genere números aleatorios del intervalo de -1000 a 1000
hasta obtener un número del intervalo de -500 a 500 o hasta obtener 100
números, lo que ocurra primero. Muestre los números conforme se vayan
generando y muestre al final:

 La cantidad de números generados.


 El mayor número positivo generado.
 El menor número positivo generado.
 El mayor número negativo generado.
 El menor número negativo generado.

18. Diseñe un programa que ingrese números enteros del intervalo de -1000 a 1000
hasta ingresar un número del intervalo de -500 a 500 o hasta ingresar 100
números, lo que ocurra primero. Luego, muestre un reporte indicando:

 La cantidad de números ingresados.


 El mayor número positivo ingresado.
 El menor número positivo ingresado.
 El mayor número negativo ingresado.
 El menor número negativo ingresado.
19. Diseñe un programa que genere aleatoriamente los sueldos de 120 empleados de
una empresa con valores en el intervalo de S/. 800 a S/. 1700 y determine:
IN T R O D U C CIÓ N A L A A L G O R I T M IA 27

 El sueldo promedio.
 El sueldo máximo.
 El sueldo mínimo.
 El número de empleados ganan un sueldo inferior a S/. 1000.

20. Diseñe un programa que genere una serie de números aleatorios en el intervalo
de 1 a 10 hasta obtener dos números seguidos iguales e imprima cuantos
números fueron necesarios generar.

21. Diseñe un programa que simule el lanzamiento simultáneo de tres dados hasta
obtener 6 en los tres dados y determine cuantos lanzamientos simultáneos fueron
necesarios efectuar.

22. Diseñe un programa que determine el revés de un número natural cuya cifra de
las unidades es distinto de 0. Así, si se ingresa el número 1734, el programa
imprimirá 4371.

23. Diseñe un programa que determine si todas las cifras de un número natural son o
no consecutivas de izquierda a derecha o de derecha a izquierda. Así, por
ejemplo: 1234 tiene todas sus cifras consecutivas de izquierda a derecha, 765432
tiene todas sus cifras consecutivas de derecha a izquierda; pero 82432 no tiene
todas sus cifras consecutivas

24. Diseñe un programa que lea un número entero positivo n y determine cuantos
números aleatorios deben generarse, en el intervalo de 1 a n, para obtener una
suma mayor que 500.

25. Simule un juego en el cual dos jugadores tirarán los dados. El jugador A empieza
con S/.15 y el jugador B con S/.23. Cuando hacen sus tiros, el jugador con la
puntuación más alta gana S/.1. Continúan jugando hasta que uno de los dos
pierda todo su dinero o hasta completar 100 juegos, lo que ocurra primero.
Muestre un mensaje adecuado al final.

26. Diseñe un programa que determine la suma de las cifras de un número natural.

27. Diseñe un programa que muestre todos los números primos comprendidos en el
intervalo de 1 a 100.

28. Diseñe un programa que muestre los 50 primeros números primos.

29. Diseñe un programa que muestre los 5 primeros números perfectos. El primer
número perfecto es el 6. Como información, el 39 avo número perfecto tiene
4053496 cifras.

30. Diseñe un programa que imprima todos los puntos del primer cuadrante del plano
cartesiano que cumplan con la inecuación: x + y < 100.

31. Diseñe un programa que genere 5 cantidades retiradas para cada uno de los 25
productos de un almacén. Los productos están codificados de 101 a 125. La
cantidad a retirar debe estar en el rango de 10 a 50 unidades. El programa deberá
mostrar un reporte como el siguiente.

Producto Retiros Total retirado

101 10 20 30 10 40 120
28

102 20 25 30 10 20 105
. . . . . . .
. . . . . . .
. . . . . . .
125 10 15 20 20 10 75

32. Diseñe un programa que imprima n filas de la siguiente tabla:

3 5 7 9 11
4 6 8 10 12
5 7 9 11 13
6 8 10 12 14
. . . . .
. . . . .
IN T R O D U C CIÓ N A L A A L G O R I T M IA 29

Para recordar
 La estructura while verifica primero su condición de control antes ejecutar el
cuerpo del bucle por lo que no se ejecutará nunca si a la primera vez la condición
resulta falsa.

 La estructura do...while ejecuta primero el cuerpo del bucle, después de lo cual


prueba su condición de control por lo que el cuerpo del bucle se ejecutará por lo
menos una vez.

 La estructura for funciona como una estructura while controlada por contador, por
lo que el cuerpo del bucle no se ejecutará nunca si la condición del for resulta
falsa a la primera vez.

 Si la condición de control de una estructura repetitiva do..while, while o for nunca


se vuelve falsa, se generará un bucle infinito.

También podría gustarte