Anda di halaman 1dari 32

F l d de

Facultad
d Ciencias
Ci i de
d la
l Computacin
C
i

Estructuras de control

Abraham Snchez Lpez


Grupo
p MOVIS

Introduccin

Una de las caractersticas de las computadoras que aumenta


considerablemente su potencia, es su capacidad para ejecutar
j
una tarea
muchas (repetidas) veces con gran velocidad, precisin y fiabilidad.
Las tareas repetitivas son algo que los humanos encontramos difciles y
tediosas de realizar.
Estudiaremos las estructuras de control iterativas o repetitivas que
realizan la repeticin o iteracin de acciones.
C++ admite tres tipos de estructuras de control: los ciclos while,
while for y dowhile.
Estas estructuras de control o sentencias repetitivas controlan el nmero
de veces que una sentencia o lista de sentencias se ejecutan.
ejecutan
Un tipo de dato enumerado es una coleccin de miembros con nombre
que tiene valores enteros equivalentes.
L ciclos
Los
i l se puede
d controlar
t l con variables
i bl de
d tipo
ti enumerado.
d

Otoo 2014

(c) ASL

La sentencia while, I
Un ciclo es cualquier construccin de programa que repite una sentencia
o secuencia de sentencias un nmero de veces.
La sentencia (o grupo de sentencias) que se repite en un bloque se
denomina cuerpo del ciclo y cada repeticin del cuerpo del ciclo se llama
iteracin de ciclo.
Las dos preguntas principales en la construccin del ciclo son:

Cul es el cuerpo del ciclo?


Cuntas veces se iterar el cuerpo del ciclo?

Un ciclo while tiene una condicin del ciclo (una expresin lgica) que
controla la secuencia de repeticin.
La posicin de esta condicin del ciclo es delante del cuerpo del ciclo y
significa que un ciclo while es un ciclo pretest, de modo que, cuando se
ejecuta, se evala la condicin antes de que se ejecute el cuerpo del
ciclo La siguiente figura representa el diagrama del ciclo while.
ciclo.
while
El diagrama indica que la ejecucin de la sentencia o sentencias
expresadas se repite mientras la condicin del ciclo permanece
verdadera y termina cuando se hace falsa.
falsa
Otoo 2014

(c) ASL

La sentencia while, II
Sintaxis:
1)) while ((condicin_ciclo)
_
)
sentencia;
cuerpo
2) while (condicin_ciclo)
{
sentencia 1;

cuerpo
sentencia n;
}

Otoo 2014

(c) ASL

La sentencia while, III

Tambin indica que la condicin del ciclo se evala antes de que se


ejecute
j
el cuerpo del ciclo yy, por consiguiente,
g
si esta condicin es
inicialmente falsa, el cuerpo del ciclo no se ejecutar.
Es decir, el cuerpo del un ciclo while se ejecutar cero o ms veces.
#include <iostream>
using namespace std;
int main()
{
int contador=0;
while (contador < 5)
{
contador++;
cout << "contador: " << contador << endl;
}
cout << "Proceso terminado, contador = " <<
contador;
cout << "\n";
system("PAUSE");
return EXIT_SUCCESS;
}

Otoo 2014

(c) ASL

Operadores
p
de incremento y decremento
C++ ofrece los operadores de incremento (++) y decremento (--) que
admiten una sintaxis abreviada para aadir ((incrementar)) o restar
(decrementar) 1 al valor de una variable.
Recordemos la sintaxis de estos operadores:

++nombreVariable
o b e a ab e
nombreVariable++
--nombreVariable
nombreVariable-nombreVariable

// p
preincremento
e ce e o
// postincremento
// predecremento
// postdecremento

Si i es una variable entera cuyo valor es 3, las variables k e i toman


sucesivos valores que se indican a continuacin:
k = i++;
k = ++i;
k = i--;
k = --i;;
Otoo 2014

// asigna el valor 3 a k y 4 a i
// asigna el valor 5 a k y 5 a i
// asigna el valor 5 a k y 4 a i
// asigna
g el valor 3 a k y 3 a i
(c) ASL

Terminaciones anormales de un ciclo

Un error tpico en el diseo de una sentencia while se produce cuando el


ciclo slo tiene una sentencia en lugar
g de varias sentencias como se
planeo.
Ejemplo:
contador=1;
contador
1;
while (contador < 25)
cout << contador << endl;
contador ++;

El cdigo anterior visualizar infinitas veces el valor 1.


Es decir, entra en un ciclo infinito del que nunca sale porque no se
actualiza
t li (modifica)
( difi ) la
l variable
i bl de
d control
t l contador.
t d
La razn es que el punto y coma al final de la lnea cout, hace que el
ciclo termine en ese punto y coma, aunque aparentemente el identado
pueda
d dar
d
l sensacin
la
i de
d que ell cuerpo del
d l while
hil contiene
ti
d
dos
sentencias, cout y contador++.
El error se hubiera detectado rpidamente si el ciclo se hubiera escrito
correctamente, la solucin es muy simple utilizar llaves !!!
Otoo 2014

(c) ASL

Diseo eficiente de ciclos

Una cosa es analizar la operacin de un ciclo y otra disear


eficientemente sus propios ciclos. Los principios a considerar son:
1) analizar los requisitos de un nuevo ciclo con el objetivo de determinar su
inicializacin, prueba (condicin) y actualizacin de la variable de control del ciclo.
2)) desarrollar p
patrones estructurales de los ciclos q
que se utilizan frecuentemente.

El cuerpo de un ciclo while no se ejecuta nunca si la prueba o condicin


de repeticin del ciclo no se cumple; es falsa cuando se alcanza while la
primera vez.
p
Ejemplo:
contador = 10;
while (contador > 100)
{

El ciclo anterior nunca se ejecutar ya que la condicin del ciclo


(contador > 100) es falsa la primera vez que se ejecuta, y en
consecuencia su cuerpo.

Otoo 2014

(c) ASL

Ciclos controlados p
por centinelas, I

Normalmente, no se conoce con exactitud cuantos elementos de datos


se procesaran antes de comenzar su ejecucin.
j
Esto se produce, ya sea porque no hay muchos datos a contar o porque
el nmero de datos a procesar depende de cmo prosigue el proceso de
clculo.
Un medio para manejar esta situacin, es indicarle al usuario que
introduzca un nico dato definido y especificado denominado valor
centinela como ltimo dato.
La condicin del ciclo comprueba cada dato y termina cuando se lee el
valor centinela.
El valor centinela se debe seleccionar con mucho cuidado y debe ser un
valor que no pueda producirse como dato.
En realidad, el centinela es un valor que sirve para terminar el proceso
del ciclo.
ciclo
Veamos un ejemplo, en el siguiente cdigo hay un ciclo con centinela, se
introducen notas mientras sta sea distinta de centinela.

Otoo 2014

(c) ASL

Ciclos controlados p
por centinelas, II
#include <iostream>
using
g namespace
p
std;;
int main()
{
int nota,, cuenta,, suma;;
/* entrada de datos numricos, centinela -1 */
const int centinela = -1;
cout << "Introduce una primera nota: ";
cin >> nota;;
while (nota != centinela)
{
cuenta ++;
suma+=nota;
cout << "Introduce la siguiente nota: ";
cin >> nota;
}
cout << "Fin del proceso\n";
p
system("PAUSE");
return EXIT_SUCCESS;
}

Otoo 2014

(c) ASL

10

Ciclos controlados p
por indicadores

En lenguajes, que tiene el tipo boolean, se utilizan variables booleanas


con frecuencia como indicadores o banderas de estado para controlar la
ejecucin de un ciclo.
El valor del indicador se inicializa (normalmente a falso, false) antes de
la entrada del ciclo y se redefine ((normalmente a verdadero,, true))
cuando un suceso especfico ocurre dentro del ciclo.
En C++ no existe el tipo boolean, por lo que se utiliza como bandera una
variable entera q
que p
puede tomar dos valores,, 1 o 0.
Un ciclo controlado por bandera-indicador se ejecuta hasta que se
produce el suceso anticipado y se cambia el valor del indicador.
digito_leido
digito
leido = 0;
while (!digito_leido)
{
cout << Introduce
Introduce un carcter: ;;
cin >> car;
digito_leido = (0 <= car) && (car <= 9));
}
Otoo 2014

(c) ASL

11

La sentencia break en los ciclos

La sentencia break se utiliza, a veces, para realizar una terminacin


anormal del ciclo.
Dicho de otra forma, una terminacin antes de lo previsto.
La sentencia break se utiliza para la salida de un ciclo while o do-while,
aunque tambin se puede utilizar dentro de una sentencia switch,
switch que es
su uso ms frecuente.
El esquema de un ciclo while con sentencia break es:
while (condicin 1)
{
if (condicin 2)
break;
//* sentencias *//
}

Otoo 2014

(c) ASL

12

Ciclos while (true)


(
)

La condicin que se comprueba en un ciclo while puede ser cualquier


expresin vlida C++. Mientras que la condicin permanezca verdadera
(distinto de 0), el ciclo while continuar ejecutndose.
Se puede crear un ciclo que nunca termine utilizando el valor 1
((verdadero)) p
para la condicin q
que se comprueba.
p
El siguiente programa, ilustra un ejemplo.
#include <iostream>
g namespace
p
std;
using
int main()
{
int flag = 1, contador = 0;
while(flag)
hil (fl )
{
contador++;
if (contador > 10)
break;
}
cout << "contador: " << contador << endl;
system("PAUSE");
_
return EXIT_SUCCESS;
}

Otoo 2014

(c) ASL

13

Repeticin:
p
el ciclo for, I

El ciclo for de C++ es ms potente que los ciclos for de otros lenguajes
de programacin,
g
yya que ofrece ms control sobre la inicializacin y el
incremento de las variables de control del ciclo.
Adems del ciclo while, C++ proporciona otros dos tipos de ciclos: for y
do.
El ciclo for es el ms adecuado para implementar ciclos controlados por
contador, que son ciclos en los que un conjunto de sentencias se
ejecutan
j
una vez p
por cada valor de un rango
g especificado,
p
, de acuerdo
con el siguiente algoritmo:
por cada valor de una variable_contador de un rango especfico: ejecutar
sentencias

La sentencia for (ciclo for) es un mtodo para ejecutar un bloque de


sentencias un nmero fijo de veces.
El ciclo for se diferencia del ciclo while en que las operaciones de control
del ciclo se sitan en un solo sitio: la cabecera de la sentencia.
Veamos a continuacin la sintaxis.

Otoo 2014

(c) ASL

14

Repeticin:
p
el ciclo for, II
1) Inicializa la variable de
control del ciclo

2) Expresin lgica que determina si las


sentencias se han de ejecutar (mientras
sea verdadera)
3) Incrementa o decrementa la variable
de control del ciclo

f (Inicializacin;
for
(I i i li
i CondicinIteracin;
C di i It
i Incremento)
I
t )
sentencias
4)) Sentencias a ejecutar
j
en cada iteracin del ciclo

El ciclo for contiene las cuatro partes siguientes:

Parte de inicializacin,
inicializacin que inicializa las variables de control del ciclo.
ciclo Se
pueden utilizar variables de control del ciclo simples o mltiples.
Parte de condicin, que contiene una expresin lgica que hace que el ciclo
realice las iteraciones de las sentencias, mientras q
que la expresin
p
sea
verdadera.
Parte de incremento, que incrementa o decrementa la variable o variables de
control del ciclo.
Sentencias, acciones o sentencias que se ejecutarn por cada iteracin.

Otoo 2014

(c) ASL

15

Repeticin:
p
el ciclo for, III

La sentencia for es equivalente al siguiente cdigo while:


inicializacin;
while (condicionIteracion)
{
sentencias del ciclo for;
incremento;
}

Ejemplos

Otoo 2014

#include <iostream>
#include <math.h>
#define M 15
#define f(x) exp(2*x)-x
using namespace std;
// Programa que imprime 15 valores de la funcin f(x) = e2x-xx
int main()
{
int i;
double x;
f (i=1;
for
(i 1 i<=M;
i< M i++)
{
cout << "Valor de x: ";
cin >> x;
cout << x << " " << f(x) << endl;
}
cout << "\n";
system("PAUSE");
return EXIT_SUCCESS;
}

(c) ASL

16

Repeticin:
p
el ciclo for, IV

Existen dos formas de implementar la sentencia for que se utilizan


normalmente para implementar ciclos de conteo: formato ascendente, en
el que la variable de control se incrementa, y formato descendente, en el
que la variable de control se decrementa.
A continuacin se muestra su sintaxis:
for (var_control = valor_inicial; var_control <= valor_limite; exp_incremento)
sentencia;
formato descendente
formato ascendente
f (var_control
for
(
t l = valor_inicial;
l i i i l var_control
t l >= valor_limite;
l li it exp_incremento)
i
t )
sentencia;

Ejemplos:
int n;
for (n=1; n<=10; n++)
cout << n << n*n << endl;

Otoo 2014

int n;
for (n=10; n>5; n--)
cout << n << n*n << endl;

(c) ASL

17

Usos y precauciones
p
del ciclo for, I
El lenguaje C++ permite que:

El valor de la variable de control se p


puede modificar en valores diferentes de 1.
Se pueda utilizar ms de una variable de control.

La(s) variable(s) de control se puede(n) incrementar o decrementar en


valores de tipo int, pero tambin es posible en valores de tipo float o
double y en consecuencia se incrementara o decrementara en una
cantidad decimal.
int n;
for (n=1; n<=10; n=n+2)
cout << n ahora es igual a << n << endl;
int n, v=9;
for (n=v; n>=100; n=n-5)
cout << n ahora es igual a << n << endl;

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.
constante
Otoo 2014

(c) ASL

18

Usos y precauciones
p
del ciclo for,, II

Se puede inicializar y cambiar una variable de control del ciclo en


cualquier cantidad que se desee.
Naturalmente cuando la variable de control no sea de tipo int, se tendrn
menos garantas de precisin.
Un ciclo for se debe construir con gran precaucin,
precaucin asegurndose de que
la expresin de inicializacin, la condicin del ciclo y la expresin de
incremento harn que la condicin del mismo se convierta en false en
algn
g momento.
En particular, si el cuerpo de un ciclo de conteo modifica los valores de
cualquier variable implicada en la condicin del ciclo, entonces el nmero
de repeticiones se puede modificar
modificar..
Esta regla anterior es importante, ya que su aplicacin se considera una
mala prctica de programacin.
Es decir,
decir no es recomendable modificar el valor de cualquier variable de
la condicin del ciclo dentro del cuerpo de un ciclo for de conteo, ya que
se pueden producir resultados imprevistos.

Otoo 2014

(c) ASL

19

Ciclos infinitos y vacios, I

El uso principal de un ciclo for es implementar ciclos de conteo cuando el


nmero de repeticiones se conoce por anticipado.
Pero existen muchos problemas en los que el nmero de repeticiones no
se puede determinar por anticipado.
C++ no admite una sentencia que realice esta tarea,
tarea pero existe una
variante de la sintaxis for que permite implementar ciclos infinitos que son
aquellos ciclos que, en principio, no tienen fin.
#include <iostream>
using namespace std;
int main()
{
for (;;)
cout << "Mi experimento loco...\n";
system("PAUSE");
return EXIT_SUCCESS;;
}

La sentencia se ejecuta indefinidamente a menos que se utilice una


sentencia return o break.
break
Otoo 2014

(c) ASL

20

Ciclos infinitos y vacios, II


La razn de que el ciclo se ejecute indefinidamente es que se ha
eliminado la expresin de inicializacin, la condicin del ciclo y la
expresin del incremento.
Al no existir una condicin de ciclo que especifique cual es la condicin
para terminar la repeticin
p
p
de sentencias,, supone
p
que la condicin es
q
verdadera (1) y ests se ejecutarn indefinidamente.
En el ejemplo anterior, el ciclo se ejecutar un nmero ilimitado de veces,
a menos q
que el usuario interrumpa
p la ejecucin
j
((Ctrl + C).
)
Para evitar esta situacin, se requiere que el diseo del ciclo for sea de la
siguiente manera:

1
1.

2.

El cuerpo del ciclo ha de contener todas las sentencias que se desean ejecutar
repetidamente.
Una sentencia terminar la ejecucin del ciclo cuando se cumpla una
determinada condicin.

A continuacin se muestra un ejemplo.


Igualmente, hay que tener cuidado de no escribir un punto y coma
despus del parntesis inicial del ciclo for.
for
Otoo 2014

(c) ASL

21

Ciclos infinitos y vacios, III


#include <iostream>
#define CLAVE -999
using
sing namespace std;
std
int main()
{
int num;
for (;;)
{
cout << "Introduce un numero (-999 para terminar):";
cin >> num;
if (num
(num==CLAVE)
CLAVE) break;
}
cout << "Por fin termine!!!\n";
system("PAUSE");
return EXIT_SUCCESS;
}

Ejemplo:
for (i=1; i<=10; i++); Problema!!
cout << La ciudad de Puebla << endl;
No se ejecuta correctamente, ni se visualiza la frase La ciudad de
Puebla 10 veces como era de esperar, ni el compilador produce error.
Otoo 2014

(c) ASL

22

Ciclos infinitos y vacios, IV

En realidad lo que sucede es que se visualiza una vez la frase La ciudad


de Puebla, yya que la sentencia for es una sentencia vaca al terminar
con un punto y coma (;).
Sucede que la sentencia for no hace absolutamente nada durante 10
iteraciones y, p
por lo tanto,, despus
p
de q
que el ciclo for haya
y terminado,, se
ejecuta la siguiente sentencia cout y se escribe La ciudad de Puebla.

Otoo 2014

(c) ASL

23

Sentencias nulas en ciclos for

Cualquiera o todas las expresiones de un ciclo for pueden ser nulas.


Para ejecutar esta accin, se utiliza el punto y coma (;) para marcar la
expresin vaca.
Si se desea crear un ciclo for que acte exactamente como un ciclo
while se deben incluir las primeras y terceras expresiones vacas.
while,
vacas
El siguiente programa contiene un ejemplo.

#include <iostream>
using namespace std;
int main()
{
int contador=0;
for (;contador<5;)
{
contador++;
cout << "Ciclo!!\n";
Ciclo!!\n ;
}
cout << "\n Contador: " << contador << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Otoo 2014

La sentencia for no inicializa ningn


g valor,,
pero incluye una prueba de contador < 5.
No
existe
ninguna
sentencia
de
incremento, de modo que el ciclo se
comporta exactamente como la siguiente
sentencia:
while (contador < 5)
{
contador++
cout << Ciclo!!\n;
}
(c) ASL

24

Sentencias break y continue, I

La sentencia break termina la ejecucin de un ciclo, de una sentencia


switch, en g
general de cualquier sentencia.
El siguiente programa utiliza la sentencia break para salir de un ciclo
infinito.
#include <iostream>

using namespace std;


int main()
{
int max,
max contador=0;
cout << "Cuantos Holas?:";
cin >> max;
for (;;)
{
if (contador < max)
{
cout << "Hola!\n";
contador++;
}
else
break;
}
system("PAUSE");
return EXIT_SUCCESS;
EXIT SUCCESS;
}

Otoo 2014

(c) ASL

25

Sentencias break y continue, II

La sentencia continue hace que la ejecucin de un ciclo vuelva a la


cabecera del ciclo.
El siguiente programa utiliza continue en un ciclo para que, si se cumple
la condicin de la sentencia if, vuelva a la cabecera e incremente i en 1.
#include <iostream>
using namespace std;
int main()
{
int clave, i;
cout << "Introduce -9 para concluir\n";
clave=1;
for (i=0; i<8; i++)
{
if (clave==-9) continue;
cin >> clave;
cout << "clave: " << clave << endl;;
}
cout << "Valores finales i = " << i << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Otoo 2014

(c) ASL

26

Repeticin:
p
el ciclo do-while, I
La sentencia do-while se utiliza para especificar un ciclo condicional que
se ejecuta
j
al menos una vez.
Esta situacin se suele dar en algunas circunstancias en las que se ha
de tener la seguridad de que una determinada accin se ejecutar una o
varias veces,, p
pero al menos una vez.
Sintaxis

Accin ((sentencia e ejecutar


j
al menos una vez)

Expresin
p
lgica
g
q
que determina
si la accin se repite

1)) do sentencia while ((expresin))


2)

do
sentencia
while (expresin)

Otoo 2014

(c) ASL

27

Repeticin:
p
el ciclo do-while, II

La construccin do comienza ejecutando sentencia. Se evala a


continuacin expresin. Si expresin es verdadera, entonces se repite la
ejecucin de sentencia.
Este proceso contina hasta que expresin es falsa. La semntica del
ciclo do se represento
p
grficamente en la figura
g
g
anterior.
#include <iostream>
using namespace std;
int main()
{
char opcion;
do
{
cout << "Hola\n";
cout << "Deseas otro tipo de saludo?\n";
cout << "s para si y n para no\n";
cout << "yy a continuacion teclea INTRO\n";
INTRO\n ;
cin >> opcion;
} while (opcion=='s || opcion=='S');
cout << "Adios...!!\n";
system("PAUSE");
return
t
EXIT SUCCESS
EXIT_SUCCESS;
}

Otoo 2014

(c) ASL

28

Diferencias entre while y do-while

Una sentencia do-while es similar a una sentencia while, excepto que el


cuerpo del ciclo se ejecuta
j
siempre, al menos una vez.
A continuacin se muestra un comparativo.

while (expresin_lgica)
{
sentencia 1;
sentencia 2;

sentencia n;
}

do
{
sentencia 1;
sentencia 2;

sentencia n;
} while (expresin_lgica)
sentencia compuesta
sentencia simple

while (expresin_lgica)
sentencia

Otoo 2014

do
sentencia
while (expresin_lgica)

(c) ASL

29

Comparacin
p
de los ciclos
C++ proporciona tres sentencias para el control de ciclos: while, for y dowhile.
El ciclo while se repite mientras su condicin de repeticin del ciclo es
verdadera.
El ciclo for se utiliza normalmente cuando el conteo est implicado,
implicado o
bien el nmero de iteraciones requeridas se pueda determinar al principio
de la ejecucin del ciclo, o simplemente cuando exista una necesidad de
seguir
g el nmero de veces q
que un suceso p
particular tiene lugar.
g
El ciclo do-while se ejecuta de un modo similar a while excepto que las
sentencias del cuerpo del ciclo se ejecutan siempre al menos una vez.
El diseo de ciclos necesita tres puntos a considerar:

1.
2.
3.

El cuerpo del ciclo.


Las sentencias de inicializacin.
Las condiciones para la terminacin del ciclo.
ciclo

Otoo 2014

(c) ASL

30

Ciclos p
para diseo de sumas y productos
p

Muchas tareas frecuentes implican la lectura de una lista de nmeros y


calculan su suma.
Si se conoce cuntos nmeros habr, tal tarea se puede ejecutar
fcilmente por el siguiente pseudocdigo.
El valor de la variable total es el nmero de valores que se suman.
suman La
suma se acumula en la variable suma.

suma = 0;
Repetir lo siguiente total veces:
leer (siguiente)
suma = suma + siguiente;
fin_ciclo

int cuenta, suma=0;


for (cuenta=1; cuenta<=total; cuenta++)
{
cin >> siguiente;
suma = suma + siguiente;
}

Otoo 2014

int cuenta, producto;


for (cuenta=producto=1; cuenta<=total; cuenta++)
{
cin >> siguiente;
producto=producto*siguiente;
}

(c) ASL

31

Ejemplos
j p sugeridos
g

Escribir un programa con un ciclo while que visualice todas las potencias de un
entero n, menores que un valor especificado max_limite.
E ibi un programa que visualice
Escribir
i
li ell siguiente
i i t dibujo
dib j
*
* *
* * *
* *
*

*
*
*
*
*
*
*

*
*
*
*
*
*
*
*
*

*
*
*
*
*
*
*

*
* *
* * *
* *
*

En una empresa de computadoras, los salarios de los empleados van aumentar


segn su contrato actual:
Contrato
Aumento %
0 a 9000 pesos
20
9001 a 15000 pesos
10
15001 a 20000 pesos
5
ms de 20000 pesos
0
programa
g
que solicite el salario actual del empleado
q
p
y calcule y
Escribir un p
visualice el nuevo salario.
Otoo 2014

(c) ASL

32

Anda mungkin juga menyukai