Sie sind auf Seite 1von 26

Metodologa de la Programacin - UNAJMA

Estructuras de Control en C++

Contenido

Introduccin
Estructuras de Seleccin
Sentencia if
Sentencia switch
Estructuras de Iteracin
Sentencia while
Sentencia do-while
Sentencia for
Ejemplos
Ejercicios

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 1 de 26
Metodologa de la Programacin - UNAJMA

1. INTRODUCCIN
Los programas definidos hasta este punto se ejecutan de modo secuencial, es decir, una
sentencia despus de otra. La ejecucin comienza con la primera sentencia del programa y
prosigue hasta la ltima sentencia, cada una de las cuales se ejecuta una sola vez. Esta forma
de programacin es adecuada para programas sencillos. Sin embargo, para la resolucin de
problemas de tipo general se necesita la capacidad de controlar cules son las sentencias que
se ejecutan, y en qu momentos. Las estructuras de control o construcciones de control
controlan la secuencia o flujo de ejecucin de las sentencias. Las estructuras de control se
dividen en tres grandes categoras en funcin del flujo de ejecucin: secuencia, seleccin e
iteracin.

Hasta este momento slo se ha usado el flujo secuencial. Cada una de las sentencias que se
utilizan en C++ estn separadas por el carcter punto y coma (;). No obstante, en algunos
casos nos interesar agrupar en un bloque una serie de sentencias, como veremos al explicar
las estructuras de seleccin y de iteracin. El bloque de sentencias se define por el carcter
llave de apertura ({) para marcar el inicio del mismo, y el carcter llave de cierre (})para
marcar el final. Ejemplo:

Sentencia1;
sentencia2;
...
sentencian;

Sin embargo, en caso de que el bloque de sentencias este constituido por una nica
sentencia no es obligatorio el uso de las llaves de apertura y cierre ({ }), aunque si
recomendable.

2. ESTRUCTURAS DE SELECCIN
Las estructuras de seleccin o condicionales controlan si una sentencia o secuencia de
sentencias se ejecutan, en funcin del cumplimiento o no de una condicin o expresin
lgica. C++ tiene dos estructuras de control para la seleccin, if y switch.

a) Sentencia if: La sentencia if elige entre varias alternativas en base al valor de una o ms
expresiones lgicas.
Las formas ms sencillas de esta sentencia, que se corresponden con las vistas en el
pseudolenguaje de Elementos de Programacin SI-ENTONCES-ENOTROCASO, son la
sentencia de seleccin simple y la sentencia de seleccin doble:

Seleccin simple
if (<expres_log>)
{
<sec_sent>
}

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 2 de 26
Metodologa de la Programacin - UNAJMA

Seleccion doble

if (<expres_log>)
{
<sec_sent>
}
else
{
<sec_sent>
}

Donde <expres_log> es una expresin lgica que ha de ir entre parntesis, y


<sec_sent> es un bloque de sentencias.

Los siguientes programas son ejemplos sencillos de sentencias de seleccin simple y


doble:
Seleccin simple

#include <iostream>
#include <iostream>
using namespace std;
int main()
{
int num;
cout <<"Introduzca numero:"; cin >> num;
if ((num%2)==0)
{
cout << "PAR" << endl;
}
system("pause");
}

Salida:

Introduzca un numero: 8
PAR

Seleccin doble

#include <iostream>
#include <iostream>

using namespace std;


int main()
{
int num;

cout <<"Introduzca numero:"; cin >> num;

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 3 de 26
Metodologa de la Programacin - UNAJMA

if ((num%2)==0)
{
cout<< "El numero "<<num;
cout<<"es PAR" << endl;
}
else
{
cout<<"IMPAR"<<endl;
}
system("pause");
}

Salida:

Introduzca un numero: 8
El numero 8 es PAR

En el ejemplo anterior la sentencia de seleccin simple tambin hubiera sido correcta, si


no hubiramos escrito las llaves ({ }) antes y despus de la sentencia (cout << "PAR"
<< endl;), ya que el bloque de sentencias est formado por una nica sentencia.

En caso de que el bloque ste formado por dos o ms sentencias ya es necesario usar las
llaves ({ }) para marcar el inicio y el fin del bloque. Sin embargo, es aconsejable usar
siempre llaves incluso con bloques formados por una nica sentencia para evitar errores
como el siguiente

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int num1, num2;
cout << "Escribe un numero:";
cin >> num1;
cout << "Escribe otro nmero:";
cin >> num2;
if (num1==num2)
cout << "Iguales" << endl;
else
cout << "Distintos" << endl;
cout << "pues no son iguales" << endl;
}

Si ejecutamos el programa anterior introduciendo dos valores iguales, el programa


mostrar la siguiente salida:

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 4 de 26
Metodologa de la Programacin - UNAJMA

Escribe un numero: 3
Escribe otro numero: 3
Iguales
pues no son iguales

Esto es debido a que el programador olvid las llaves en el bloque de sentencias de la


parte else. Por tanto la segunda sentencia en el bloque de sentencias del else (cout <<
"pues no son iguales" << endl;), ya no pertenece al else.

Las sentencias if mostradas hasta el momento implementan decisiones que implican una
o dos alternativas. Sin embargo, tambin es posible utilizarlas para implementar
decisiones que impliquen diferentes alternativas. Una sentencia if es anidada cuando la
sentencia de la rama verdadera o de la rama falsa es a su vez otra sentencia if. Una
sentencia if anidada se puede utilizar para implementar decisiones con varias
alternativas o multi-alternativas. Una estructura tpica if-else anidada sera la siguiente:

if (<expres log>)
{
<sec sent>
}
else if (<expres log>)
{
<sec sent>
}
else if (<expres_log>)
{
<sec sent>
}
else
{
<sec sent>
}

Como ejemplo, considrese un programa que nos permita escribir en pantalla el


mensaje correspondiente a un valor que representa una calificacin numrica. El
programa utilizando sentencias if anidadas sera el siguiente:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
unsigned int nota;
cout << "Introduzca una calificacin numrica:";
cin >> nota;
cout << "La calificacin del alumno es" << endl;

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 5 de 26
Metodologa de la Programacin - UNAJMA

if (nota == 10)
{
cout <<"Matricula de Honor" << endl;
}
else if (nota >= 9)
{
cout << "Sobresaliente" << endl;
}
else if (nota >= 7)
{
cout << "Notable" << endl;
}
else if (nota >= 5)
{
cout << "Aprobado" << endl;
}
else
{
cout << "Suspenso" << endl;
}
}

Salida:

Introduzca una calificacin numrica: 7


La calificacin del alumno es
Notable
Existe tambin un operador condicional, que es un operador con tres operandos
(ternario) que tiene la siguiente forma general:

Expresin_1 ? expresion_2 : expresion_3;

Explicacin: Se evala expresion_1. Si el resultado de dicha evaluacin es true (!=0), se


ejecuta expresion_2; si el resultado es false (=0), se ejecuta expresion_3.
Ejemplo:

#include <iostream>
#include <iostream>

using namespace std;


int main()
{
int num;

cout <<"Introduzca un numero:"; cin >> num;


((num%2)==0)? cout<<"PAR\n" : cout<<"IMPAR\n";
system("pause");
}

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 6 de 26
Metodologa de la Programacin - UNAJMA

Salida:

Introduzca un numero: 7
IMPAR

b) Sentencia switch: La sentencia switch es una sentencia de C++ que se utiliza para
seleccionar una de entre mltiples alternativas. Esta sentencia es especialmente til
cuando la seleccin se basa en el valor de una variable de un tipo simple o de una
expresin de un tipo simple denominada expresin de control o selector.
La sintaxis de la sentencia, que se corresponden con la sentencia CASO estudiada en el
pseudolenguaje de Elementos de Programacin, es la siguiente:

switch (selector)
{
case <etiqueta> : <sec_sent>
break;
case <etiqueta> : <sec_sent>
break;
.
.
.
case <etiqueta> : <sec_sent>
break;
default : <sent> //opcional
}

Donde selector es una expresin ordinal, <sec_sent> es una sentencia o


secuencia de sentencias terminadas en punto y coma (;), y <etiqueta> es una
expresin constante.

La expresin selector debe ser un tipo ordinal (por ejemplo int, char, bool pero no float,
double o string). El tipo de cada etiqueta debe ser el mismo que el de la expresin selector.
Las expresiones estn permitidas como etiquetas, pero nicamente si cada operando de
la expresin es en si mismo una constante (ej. 4+8, c*20 si c ha sido definido
anteriormente como constante). Ejemplo:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int A,B, Resultado;
char operador;
cout << "Introduzca un numero:";
cin >> A;

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 7 de 26
Metodologa de la Programacin - UNAJMA

cout << "Introduzca otro numero:";


cin >> B;
cout<<"Introduzca un operador ( + ,-,*,/):";
cin >> operador;
Resultado = 0;
switch (operador)
{
case '-' : Resultado = A - B;
break;
case '+' : Resultado = A + B;
break;
case '*' : Resultado = A * B;
break;
case '/' : Resultado = A / B; //suponemos B!=0
break;
default : cout<< "Operador Invalido"<< endl;
}
cout << "El resultado es:";
cout << Resultado << endl;
system(pause);
}

Salida:

Introdusca un numero: 7
Introdusca otro numero: 6
Introduzca un operador ( + ,-,*,/): +
El resultado es: 13

Cuando se ejecuta la sentencia switch se evala el selector. Si el valor de la expresin es


igual a una etiqueta, entonces se transfiere el flujo de control a las sentencias asociadas
con la etiqueta correspondiente, y se ejecutan todas las sentencias del bloque de
sentencias hasta que se encuentre una sentencia break (o hasta que se encuentre el final
de la sentencia de control switch). Si el valor del selector no esta listado en ninguna
etiqueta case, no se ejecutar ninguna de las opciones a menos que se especifique la
accin por defecto default.

La omisin de la etiqueta default puede ocasionar un error lgico difcil de prever.


Aunque esta etiqueta es opcional, se recomienda su uso a menos de que se est
absolutamente seguro de que todos los valores del selector estn incluidos en las
etiquetas case.

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 8 de 26
Metodologa de la Programacin - UNAJMA

En el siguiente ejemplo se muestra un programa que determina si un carcter ledo es o


no una vocal. En este caso como la sentencia a ejecutar por todas las etiquetas case es la
misma, esta sentencia se pone una nica vez al final:

#include <iostream>
#include <cstdlib>

using namespace std;


int main()
{
char car;

cout << "Introduzca un carcter:";


cin >> car;
switch (car)
{
case 'a' : case 'A':
case 'e' : case 'E':
case 'i' : case 'I':
case 'o' : case 'O':
case 'u' : case 'U':
cout<<car<< es una vocal"<< endl;
break;
default : cout << car << "no es una vocal" << endl;
}
}

Salida:

Introdusca un carcter: U
U es una vocal

Si olvida break en una sentencia switch, el compilador no emitir un mensaje de error,


ya que se habr escrito una sentencia switch sintcticamente correcta, pero no realizar
las tareas previstas. Cuando el ordenador empieza a ejecutar una sentencia case, no
detiene su ejecucin hasta que se encuentra o bien una sentencia break o bien una
sentencia switch..

c) Sentencia if anidada: Una sentencia if puede incluir otros if dentro de la parte


correspondiente a su sentencia, A estas sentencias se les llama sentencias anidadas (una
dentro de otra), por ejemplo:

if (a >= b)
if (b != 0.0)
c = a/b;

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 9 de 26
Metodologa de la Programacin - UNAJMA

En ocasiones pueden aparecer dificultades de interpretacin con sentencias if...else


anidadas, como en el caso siguiente:

if (a >= b)
if (b != 0.0)
c = a/b;
else
c = 0.0;

En principio se podra plantear la duda de a cul de los dos if corresponde la parte else del
programa. Los espacios en blanco las indentaciones de las lneas parecen
indicar que la sentencia que sigue a else corresponde al segundo de los if, y as es en
realidad, pues la regla es que el else pertenece al if ms cercano. Sin embargo, no se
olvide que el compilador de C++ no considera los espacios en blanco (aunque sea muy
conveniente introducirlos para hacer ms claro y legible el programa), y que si se quisiera
que el else perteneciera al primero de los if no bastara cambiar los espacios en blanco,
sino que habra que utilizar llaves, en la forma:

if (a >= b)
{
if (b != 0.0)
c = a/b;
else
}
c = 0.0;

Recurdese que todas las sentencias if e if...else, equivalen a una nica sentencia por
la posicin que ocupan en el programa.

3. ESTRUCTURAS DE ITERACIN
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
estructuras del lenguaje C++ para realizar bucles son el while, el for y el do...while.

a) Sentencia while: Se corresponde con el esquema MIENTRAS del pseudolenguaje.


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 pre-prueba, 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

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 10 de 26
Metodologa de la Programacin - UNAJMA

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 errores.

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:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int sum, i;
cout << "Introduzca nmeros y termine con un negativo:";
cin >> i; //lectura adelantada
sum = 0;
while (i >= 0)
{
sum = sum + i;
cin >> i; //actualizacin
}
cout << "El resultado es:";
cout << sum << endl;
system(pause);
}

Salida

Introduzca nmeros y termine con un negativo:


2
6
7
-1
El resultado es: 15

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 11 de 26
Metodologa de la Programacin - UNAJMA

Este otro ejemplo visualiza por pantalla n (20) asteriscos:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int n=20;
int contador;
contador=0; //inicializacin
while(contador < n)
{
cout << "* ";
contador++; //incremento
}
system(pause);
}

Salida

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

b) Sentencia do-while: Se corresponde con el esquema REPETIR del pseudolenguaje. 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 del bucle do-while es la siguiente:

do
{
<sec_sent>
}
while (<expres_log>);

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). Esto supone una
diferencia con la sentencia REPETIR del pseudolenguaje en la que el cuerpo del bucle se
ejecutaba hasta que la expresin lgica fuese verdadera.

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 12 de 26
Metodologa de la Programacin - UNAJMA

Como en el caso anterior, 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 de posibles
errores.

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:

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

#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. Richard Carrin Abollaneda Pagina 13 de 26
Metodologa de la Programacin - UNAJMA

c) Sentencia for: Se corresponde con el esquema PARA del pseudolenguaje. Una


estructura tpica for sera la siguiente:

for (<inicializacion> ; <expres_log> ; <incremento>)


{
<sec_sent>
}

donde (<inicializacion>) es la parte en la que se inicializa la variable de control


del bucle, (<expres_log>) es una expresin lgica que hace que el bucle ejecute el
bloque de sentencias mientras que dicha expresin sea cierta, e (<incremento>) es
una expresin que decrementa o incrementa la variable de control del bucle. De esta
manera para cada valor que tome la variable de control de bucle, el cuerpo del bucle se
ejecuta una vez. Cuando la variable de control del bucle toma su primer valor,
(<inicializacion>), sta se va modificando automticamente en cada iteracin
del bucle de acuerdo al valor de incremento (<incremento>) mientras que la
expresin lgica (<expres_log>) sea falsa. En el caso de que cuando la variable de
control del bucle tome su primer valor la expresin lgica sea falsa, el cuerpo del bucle
no se ejecutar ninguna vez.

La utilizacin de llaves ({ }) antes y despus del bloque de sentencias nicamente es


obligatoria si el nmero se sentencias del bloque es mayor o igual que dos. Sin embargo,
se aconseja siempre su uso en prevencin de posibles errores.

Existen dos formas de implementar la sentencia for: (i) formato ascendente, en el que la
variable de control se incrementa, y (ii) formato descendente, en el que la variable de
control se decrementa. A continuacin mostramos dos ejemplos de formato ascendente
y descendente:

Formato ascendente

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
// formato ascendente int n;
int n;
for (n = 1; n <= 10; n++) //incrementa de 1 en 1
{
cout << n << endl;
}
}

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 14 de 26
Metodologa de la Programacin - UNAJMA

Salida
1
2
3
4
5
6
7
8
9
10

Formato descendente

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
// formato descendente int n;
int i;
for (i = 9; i >= 0; i-=3) //decrementa de 3 en 3
{
cout << i << endl;
}
}

Salida

9
6
3
En0el ejemplo de formato ascendente la variable de control es n y su valor inicial es 1, el
valor lmite es 10 y la expresin de incremento es n++. Esto significa que el bucle
ejecuta la sentencia del cuerpo del bucle una vez por cada valor de n en orden
ascendente de 1 a 10, por tanto el bucle se ejecutar 10 veces. En la primera iteracin n
tomar el valor 1, en la segunda el valor 2, y as sucesivamente hasta el valor 10. El
ejemplo de formato descendente inicializa la variable de control i a 9. El bucle se
ejecuta mientras i no sea negativo, y como la variable de control del bucle se
decrementa en 3, el bucle se ejecutar 4 veces con el valor de la variable de control i, 9,
6, 3 y 0.

C++ permite declarar la variable de control de bucle al mismo tiempo que se inicializa,
sin embargo nosotros siempre la declararemos en la zona de declaraciones al principio
del programa. La variable de control se puede incrementar o decrementar en valores de
tipo int, pero tambin es posible en valores de tipo double , y por tanto estaramos

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 15 de 26
Metodologa de la Programacin - UNAJMA

incrementando en una cantidad decimal. La expresin de incremento no necesita ser una


suma o una resta. Tampoco se requiere que la inicializacin de una variable de control
sea igual a una constante. Se puede inicializar y modificar una variable de control de
bucle en cualquier cantidad que se desee. Lgicamente, cuando la variable de control no
sea de tipo int se tendrn menos garantas de precisin. Por ejemplo:

#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;


int main()
{
double x,y;
x=y=2;
for(x = pow(y,3.0); x > 2.0; x = sqrt(x))
{
cout << "x es ahora igual a "<< x << endl;
}
}

Es necesario incluir la librera <cmath> para poder hacer uso de funciones matemticas.
En el ejemplo anterior: sqrt - raz cuadrada y pow - potencia.

Salida

x es ahora igual a 8
x es ahora igual a 2,82843

Considere las siguientes precauciones en el uso de for


No es recomendable modificar el valor de cualquier variable de la condicin del
bucle dentro del cuerpo de un bucle for, ya que se pueden producir resultados
imprevistos. Ejemplo:

#include <iostream>
#include <cstdlib>

using namespace std;


int main()
{
int i, limite =1;
for (i = 0; i <= limite;
{
cout << i << endl;
limite++;
}
}

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 16 de 26
Metodologa de la Programacin - UNAJMA

Este ejemplo produce una secuencia infinita de enteros ya que en cada iteracin, la
expresin (limite++) incrementa limite en 1, antes de que i++ incremente
a i. A consecuencia de esto, la condicin del bucle (i <= limite) siempre es
cierta.

Se ha de tener cuidado a la hora se situar el punto y coma (;) despus del parntesis
final del bucle for. Por ejemplo el bucle:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int i;
for (i = 1; i <= 10); // Atencin al ;
{
cout<< "Elementos de Programacin" << endl;
}
}

no visualiza la frase "Elementos de Programacin" 10 veces, ni produce un mensaje


de error por parte del compilador. En realidad lo que sucede es que se visualiza una
vez la frase "Elementos de Programacin", ya que la sentencia for es una sentencia
vaca al terminar con un punto y coma (;). Por tanto, lo que sucede es que la
sentencia for no hace absolutamente nada y tras 10 iteraciones, y por tanto despus
de que el bucle for haya terminado, se ejecuta la sentencia cout y se escribe la frase
"Elementos de Programacin".

El siguiente bucle for implementa un bucle infinito:

#include <iostream>
#include <cstdlib>

using namespace std;


int main()
{
for (; ;)
{
cout << "Siempre igual" << endl;
}
}

La razn es que se han eliminado la expresin de inicializacin, la condicin del


bucle y la expresin de incremento. Por tanto, el bucle producir la salida
"Siempre igual" un nmero ilimitado de veces.

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 17 de 26
Metodologa de la Programacin - UNAJMA

Qu estructura de iteracin usar?


Como recomendacin:
Si antes de la ejecucin del bucle se puede conocer el nmero de veces que se
ejecutar ste, es mejor utilizar una sentencia for.
En otro caso y si se ejecuta al menos una vez, debemos utilizar un do-while.
En cualquier otro caso utilizaremos un bucle while.

4. EJEMPLOS
Sentencia if
a) Un administrador de una cabina de telfonos desea calcular el costo de llamada de la
siguiente manera: una llamada telefnica cuesta S/. 0,5 por los primeros 3 minutos o
menos. Cada minuto adicional a los tres minutos cuesta S/. 0,1. Calcular el costo de una
llamada

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
float M, C;
cout<<"Calculo del costo de una
llamada telefonica \n";
cout<<"Minutos trascurridos:";cin>>M;
if(M<=3)
{
C=0.5;
}
else
{
C=0.5+(M-3)*0.1;
}
cout<<"El costo de la llamada es: ";
cout<<C<< soles<<endl;
//cout<<"\n";
system("pause");
return 0;
}

Salida

Calculo del costo de una llamada telefnica


Minutos transcurridos: 7
El costo de la llamada es: 0.9 soles

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 18 de 26
Metodologa de la Programacin - UNAJMA

b) Calcule el nmero de pulsaciones que debe tener una persona por cada 10 segundos de
ejercicio aerbico. La frmula que se aplica es:
Para el sexo femenino (F,f) : (220 Edad)/10
Para el sexo masculino (M,m): (210 Edad)/10
Controle para que cuando el valor ingresado sea diferente a M, m, f, F, el programa de
un mensaje de error.

#include <cstdlib>
#include <iostream>
using namespace std;
main()
{
int Edad; float Npulsac;
char Sex;
cout<<PULSACIONES DE UNA PERSONA POR CADA 10 SEGUNDOS;
cout<<" INGRESE LA EDAD DE LA PERSONA : ";
cin>>Edad;
cout<<" INGRESE EL SEXO DE LA PERSONA (M/F) : ";
cin>>Sex;
if (Sex == 'F' || Sex == 'f' || Sex == 'M'|| Sex == 'm')
{
if (Sex == 'F' || Sex == 'f' )
{
Npulsac= (220 - Edad)/10.0;
cout<<"Pulsaciones de la persona de sexo F es: ";
cout<<Npulsac;
}
else
{
Npulsac= (210 - Edad)/10.0;
cout<<"Pulsaciones de la persona de sexo M es: ";
cout<<Npulsac;
}
}
else
{
cout<<" EL SEXO INGRESADO NO ES VALIDO";
}
cout<<"\n";
system("pause");
return 0;
}

Salida

PULSACIONES DE UNA PERSONA POR CADA 10 SEGUNDOS


INGRESE LA EDAD DE LA PERSONA: 35
INGRESE EL SEXO DE LA PERSONA (M/F): f
El numero de pulsaciones de la persona de sexo F es: 18.5

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 19 de 26
Metodologa de la Programacin - UNAJMA

Sentencia switch
a) Desarrolle el problema anterior usando la estructura switch y pruebe con los mismos
valores.

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int Edad, Npulsac;
char Sex;
cout<<" INGRESE LA EDAD DE LA PERSONA : ";
cin>>Edad;
cout<<" INGRESE EL SEXO DE LA PERSONA (M/F) : ";
cin>>Sex;
switch (Sex)
{
case 'F':
Npulsac= (220 - Edad)/10;
cout<<"Pulsaciones de la persona de sexo F es:";
cout<<Npulsac<<"\n";
break;
case 'f':
Npulsac= (220 - Edad)/10;
cout<<"Pulsaciones de la persona de sexo F es:";
cout<<Npulsac<<"\n";
break;
case 'M':
Npulsac= (210 - Edad)/10;
cout<<"Pulsaciones de la persona de sexo M es:";
cout<<Npulsac<<"\n";
break;
case 'm':
Npulsac= (210 - Edad)/10;
cout<<"Pulsaciones de la persona de sexo F es:";
cout<<Npulsac<<"\n";
break;
default: cout<<"El sexo ingresado no es valido \n";
}
system("pause");
return 0;
}

Sentencia While / For


a) Calcule el factorial de un nmero dado.

#include <iostream>
#include <cstdlib>
using namespace std;
int main()

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 20 de 26
Metodologa de la Programacin - UNAJMA

{
int i,n,F;
cout<<"Ingrese un Numero: ";cin>>n;
F=1; i=1;
while(i<=n)
{
F=F*i;
i++;
}
cout<<"El factorial de "<<n<<" es:"<<F<<endl;
system("pause");
}

Salida

Ingrese un Numero: 5
El factorial de 5 es: 120

b) Escriba un programa que diga si un numero ledo es primo. Un numero es primo,


cuando solamente es divisible por la unidad y por si mismo.

#include <iostream>
#include <iostream>

using namespace std;


main()
{
int n,i;
bool l=true;
cout<<"Ingrese un Numero:";cin>>n;
i=n/2; // puede ser tambien i=n-1;
while(i>1)
{
if(n%i==0)
{
l=false;
i=0;
}
i=i-1;
}
if(l)
{cout<<"El numero "<<n<<" es PRIMO"<<endl;}
else
{cout<<"El numero "<<n<<" NO ES PRIMO"<<endl;}
system("pause");
return 0;
}

Salida
Ing. Edwing A. Maquera Flores
Ingrese un Numero: 2011
Ing. Richard Carrin Abollaneda Pagina 21 de 26
El numero 2011 es PRIMO
Metodologa de la Programacin - UNAJMA

c) Calcule la suma de la siguiente serie: S = 1 + 22/3! + 33/5! + 44/7!+ ... + NN/(2N-1)!

#include <iostream>
#include <cstdlib>
#include<cmath>
using namespace std;
int main()
{
float S, F, i;
int k, N;
cout<<"Calculo de la Serie:
S=1+2^2/3!+3^3/5!+...+N^N/(2N-1)! \n";
cout<<"--------------------\n";
cout<<"Numero final de la serie N:";cin>>N;
S=1;
for(i=2;i<=N;i++)
{
F=1;
for(k=1;k<=(2*i-1);k++)
{F=F*k;}
S=S+pow(i,i)/F;
}
cout<<"La sumatoria es: "<<S<<endl;
cout<<"\n";
system("pause");
return 0;
}

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 22 de 26
Metodologa de la Programacin - UNAJMA

Salida

Calculo de la serie: S=1+2^2/3!+3^3/5!+...+N^N/(2N-1)!


Numero final de la serie N: 6
La sumatoria es: 1.95224

d) Veamos un programa ejemplo en el que aparecen algunas de las estructuras vistas


anteriormente. El programa encuentra el primer nmero perfecto mayor que 28.
Recordemos que un nmero es perfecto, si la suma de sus divisores es igual al mismo
numero
// ------------------------------------------------------
//Programa ejemplo para el clculo del primer nmero perfecto
//mayor que //28
// ------------------------------------------------------

//Incluir E/S y libreras standard


#include <iostream>
#include <cstdlib>
using namespace std;
//Zona de declaracin de constantes
//Zona de declaracin de tipos

//Zona de cabeceras de procedimientos y funciones


//Programa principal

int main()
{
// Zona de declaracin de variables del programa principal
int intento, cont, suma;
bool encontrado;
encontrado = false;
intento = 29;
while(!encontrado)
{
suma = 1;
for (cont = 2; cont < intento; cont++)
{
if (intento % cont == 0)
{
suma = suma + cont;
}
}
if (suma == intento)
{
encontrado = true;

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 23 de 26
Metodologa de la Programacin - UNAJMA

}
else
{
intento = intento + 1;
}
}
cout<<" El Numero perfecto mayor que 28 es igual a";
cout<< intento;
cout<< endl;
system("Pause"); //Hacer una pausa
return 0; //Valor de retorno al S.O.
}
//Implementacin de procedimientos y funciones

Salida

El nmero perfecto mayor que 28 es igual a 496

Aunque existe otra forma ms ptima de resolver este problema, el programa anterior
nos da una visin de cmo se pueden utilizar conjuntamente las distintas estructuras de
control vistas en esta seccin. Conviene hacer hincapi principalmente en que los
anidamientos de estructuras tienen que ser correctos, es decir, que una estructura
anidada dentro de otra lo debe estar totalmente. Por esto hay que tener mucho cuidado
con las llaves ({}) a lo largo de un programa.

5. EJERCICIOS

a) Una empresa maneja cdigos numricos con las siguientes caractersticas:

- Cada cdigo consta de cuatro dgitos:


- El primero representa a una provincia.
- El segundo el tipo de operacin.
- Los dos ltimos el nmero de la operacin.

Escriba un programa que lea de teclado un nmero de cuatro dgitos, almacenndolo en


una variable de tipo int, y posteriormente imprima en pantalla la siguiente informacin.

PROVINCIA &
TIPO DE OPERACION &
NUMERO DE OPERACION &&

En caso de que el nmero no tenga exactamente cuatro dgitos, en lugar del mensaje
anterior, habr que imprimir en pantalla el siguiente mensaje de error:

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 24 de 26
Metodologa de la Programacin - UNAJMA

ERROR: CODIGO INVALIDO.

b) El recibo de la electricidad en la ciudad X se elabora de la siguiente forma:


- 10 Soles de gastos fijos.
- 0,5 Soles/Kw para los primeros 100 Kw.
- 0,3 Soles/Kw para los siguientes 150 Kw.
- 0,2 Soles/Kw para el resto.

Elabore un programa que lea de teclado los dos ltimos valores del contador (es decir, el
valor que tena el contador el mes pasado y el valor que tiene este mes), y calcule e
imprima en pantalla el importe total a pagar. Ejemplo:

Lectura anterior (Kw): 1700 2100-1700 = 400Kw consumidos


Lectura Actual (Kw):2100
Importe total a pagar: 135 soles

c) Disee un algoritmo que sume los primeros N nmeros impares. Ejemplo:

Nmeros impares: 5
Suma de los 5 primeros nmeros impares: 25

d) Disear e implementar un programa que cuente el nmero de sus entradas que son
positivas, negativas y cero.

Nmero total de entradas: 6


Entrada 1: 6
Entrada 2: 3
Entrada 3: -4
Entrada 4: -2
Entrada 5: 0
Entrada 6: 3
Nmero de entradas positivas: 3
Nmero de entradas negativas: 2
Nmero de entradas neutras: 1

e) Escriba un programa que lea un nmero N de teclado y a continuacin imprima en


pantalla:

Su factorial. (use la sentencia for)


La suma de los N primeros trminos de la serie armnica (1+1/2+...+1/N)
Los n primeros trminos de la sucesin de Fibonacci.

Utilice una estructura repetitiva distinta para cada caso. Cual es ms apropiada?

f) Dado un nmero entero que representa una determinada cantidad de dinero, escriba un
programa que lea dicho nmero del teclado y lo desglose para saber cuantas monedas de
500, 100, 50, 25, 5 y 1 pesetas se necesitan. Ejemplo:

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 25 de 26
Metodologa de la Programacin - UNAJMA

Ingrese el dinero: 252


Monedas de 100: 2
Monedas de 50:1
Monedas de 1: 2

g) Escriba un programa que lea un nmero N e imprima una pirmide de nmeros con N
filas como en la siguiente figura:

1 1
1 2 1 2 1
1 2 3 1 2 3 2 1
.. ..
.. ..
1 2 ... N 1 2 .. N .. 2 1

1 1 2 3 .. N
2 1 1 2 3
3 2 1 ...
...
1 2
N 2 1 1

h) Calcule e imprima en pantalla los N primeros nmeros primos, siendo N un nmero que
se introduce por teclado. Ejemplo:

Ingrese el valor de N: 5
Los 5 primeros nmeros primos son:
1
2
3
5
7

Ing. Edwing A. Maquera Flores


Ing. Richard Carrin Abollaneda Pagina 26 de 26

Das könnte Ihnen auch gefallen