Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
2 Estructuras de Control
Antonio L. Carrillo
ndice de contenidos
3. Anidamiento de Bucles
Introduccin: Estructuras de control ! Estructura secuencial: aquella en la que las instrucciones o sentencias son ejecutadas una a una en orden. ! Se puede alterar esa secuencialidad usando dos estructuras o sentencias de control distintas. Estas estructuras permiten variar el flujo de control del programa dependiendo de ciertas condiciones. Son: ! Estructura de seleccin (o condicional): Permite que se tomen rutas alternativas de accin dependiendo del resultado de una operacin. ! Estructura repetitiva (iterativa o bucle): Permite repetir un conjunto de sentencias.
3
Seleccin
Sentencias
Sentencias
Iteracin
Estructura secuencial
Estructuras no secuenciales
4
1.1. Sentencias:
if, if-else
1. Seleccin
! Sirven para decidir si se ejecutan unas acciones u otras, dependiendo del valor de una condicin. Seleccin binaria if ( condicin ) Seleccin simple { Bloque_sentenciasA if ( condicin ) } { Bloque_sentenciasA else { } Bloque_sentenciasB } ! condicin deber ser una expresin cuyo valor ser interpretar: como verdadero ( si su valor es distinto de 0) o como falso (si el valor expresin es 0). ! La condicin (la expresin) SIEMPRE debe ir entre parntesis. ! Funcionamiento: Se determina si la condicin es cierta o falsa. Si es cierta ! se ejecuta un bloque o cjto. instrucciones (sentenciasA) y si es falsa se ejecuta el otro bloque (el de sentenciasB), si lo hay ! Si un bloque slo tiene una sentencia, las llaves se pueden quitar.
1. Seleccin
! Dada la siguiente declaracin de variables: int a = 5, b = 10; decir el valor numrico y el valor lgico (Verdad o Falso) de las siguientes expresiones: Expresin a !a !! a ab ab+5 !(a b + 5) a<b !(!a || !b) !(a && b) Valor numrico 5 0 1 5 0 1 1 1 0 Valor lgico true false true true false true true true false
6
1. Seleccin
#include <iostream> using namespace std; int main() { float r, v; cout << Intro Resistencia: ; cin >> r; cout << intro Voltaje: ; cin >> v; Seleccin binaria if( r == 0 ) cout << \n Existe un cortocircuito\n; else cout << \n Corriente = << v/r << amps; return 0; }
1. Seleccin
1. Seleccin
#include <iostream> using namespace std; int main() { int num; cout << Valor del nmero: ; cin >> num; Seleccin binaria if (num >= 0) Seleccin binaria if(num == 0) cout << Nmero igual a cero \n; else cout << Nmero mayor que cero \n; else cout << Nmero menor que cero \n; return 0; }
Nota: Salvo que las llaves indiquen lo contrario, cada else se asocia siempre al if ms cercano de los que le preceden
1. Seleccin
if ( condicin1 ) { Bloque1 } else if ( condicin2 ) { Bloque2 } else if ( condicin3 ) { Bloque3 } ... else { BloqueN }
Funcionamiento:
! El Bloque1 de sentencias se ejecuta si la condicin1 es cierta. Si es falsa el programa evala la siguiente condicin. ! Si la condicin2 es cierta el programa ejecuta el Bloque2, en caso contrario evala la siguiente condicin y as sucesivamente. ! Si todas las condiciones son falsas el programa ejecuta el bloque de sentencias del else final (BloqueN). ! Este ltimo else puede no existir (entonces no se hara nada)
10
1. Seleccin
} Ejercicio propuesto: Mejora el programa anterior para que muestre mensajes de error si la nota leda no es vlida (si es mayor que 10 o menor que cero).
if (nota < 5.0) cout << Suspenso; else if(nota < 7.0) cout << Aprobado; else if(nota < 9.0) cout << Notable; else if(nota < 9.9) cout << Sobresaliente; else cout << Matrcula Honor; return 0;
Seleccin mltiple
11
1. Seleccin
return 0;
12
1. Seleccin
1. Seleccin
?:
! Es una herramienta til para evaluar expresiones condicionales. ! Su forma general es la siguiente:
1.3. Sentencia
switch
Seleccin mltiple
1. Seleccin
switch ( expresin )
! La sentencia switch se usa { cuando existe una decisin case valor1: Bloque1_de_sentencias mltiple. break; case valor2: Bloque2 ! Normalmente se usa para break; reemplazar a la sentencia case valor3: Bloque3 if-else mltiple (cuando break; el programa puede tomar default: Bloque4 mltiples rutas de ejecucin). }
!!!!! La expresin solo podr ser de tipo entero o de tipo carcter. !!!!!!! La expresin SIEMPRE debe ir entre parntesis. Funcionamiento:
! Se evala la expresin y se va comparando su valor con cada uno de los que aparecen despus de cada case, segn el orden en que estn escritos. ! Si alguno coincide, se ejecutan todas las instrucciones que vayan despus de los dos puntos hasta encontrar un break. ! No es obligatorio que haya un break por cada case, si no existe se seguirn ejecutando las instrucciones de los siguientes case hasta encontrar el break o hasta el final del switch. Puede haber tantos case como se desee. ! Si no coincide ningn valor se ejecutan las instrucciones de la opcin default. 15 ! La opcin default no es obligatoria.
1. Seleccin
switch ( opcion ) { case 1: cout << break; case 2: cout << break; case 3: cout << break; case 4: cout << } }
1. Seleccin
17
1. Seleccin
1. Seleccin
sentencia/s Actualizacin
sentencia/s
La condicin es cierta?
La condicin es cierta? sSentencia/s La condicin es cierta?
SI
SI
NO
NO
SI
while
do-while
for
NO
20
2.1. Bucle:
while
2. E. Iterativas
! Funcionamiento: Se evala la condicin de control del bucle ! Si la condicin es cierta, se ejecuta el bloque de sentencias y se vuelve a evaluar la condicin. ! Si la condicin es falsa se termina el bucle y se ejecuta lo que haya a continuacin. Es decir, el bucle (y por tanto, el bloque de sentencias) se repite mientras la condicin sea cierta.
SI
! Importante: La condicin de terminacin se comprueba cada vez ANTES de ejecutarse el cuerpo del bucle (el Bloque de Sentencias). ! Si la condicin es inicialmente cierta, el bucle no terminar (bucle infinito) a menos que en el cuerpo del mismo se modifique de alguna forma la condicin de control del bucle.
21
2. E. Iterativas
int num;
teclado
int suma=0; // vble. para ir guardando la suma de los num ledos int cant=0; // contar la cantidad de nmeros (no neg.) ledos cout << Dame el primer nmero: ; cin >> num; while ( num >= 0 ) { suma = suma + num; cant++; cout << Dame otro nmero: ; cin >> num; } if ( cant > 0 ) cout << La media es: << float(suma) / cant ; else cout << No hay media (porque no hay nmeros) ; 22 }
2.2. Bucle:
do-while
2. E. Iterativas
Bloque de Sentencias
SI Funcionamiento: ! Se ejecuta el Bloque de sentencias (una o varias instrucciones), y luego se evala la condicin. ! Si sta es cierta se vuelve al principio del bucle, pero si es falsa se termina.
La condicin es cierta? NO
! La condicin se comprueba, cada vez, DESPUS de la ejecucin del cuerpo del bucle (de las sentencias). Por tanto, el Bloque de Sentencias siempre se ejecuta como mnimo una vez.
23
2. E. Iterativas
/* trozo de cdigo que obligue al usuario a introducir un valor entero que est dentro del rango [-5..5], ambos incluidos */ ...
int num;
do {
cout << Intro un entero en el rango [-5..5]: ; cin >> num;
24
2.3. Bucle:
for
2. E. Iterativas
for (inicializacin; condicin; actualizacin) { Bloque de Sentencias } Funcionamiento: ! Se ejecutan todas las instrucciones Inicializacin de la inicializacin. ! Se evala la condicin (expresin). Si es cierta se ejecuta el Bloque de sentencias y luego las instrucciones Actualizacin de actualizacin (en ese orden) y se vuelve a evaluar la condicin Si la condicin es falsa, termina el bucle. Bloque de Sentencias NOTAS: La
! En la parte de inicializacin y de actualizaci puede haber ms de una instruccin, separadas por el operador coma (,). ! En la parte de condicin slo puede haber una. ! Si no hay condicin, el test de condicin es verdadero. ! Ninguna de las tres partes es obligatoria. SI condicin es cierta? NO
25
2. E. Iterativas
Por similitud con la mayora del resto de lenguajes de programacin, recomendamos limitar el uso de esta estructura for, y usarla como bucle determinista, es decir, slo cuando se conozca (y se pueda deducir, mirando slo la cabecera del for) el n exacto de repeticiones a realizar. El formato quedara: <= for(vble=valorInicial; vble < { >= Bloque de Sentencias >
}
//dentro del bloque, no actualizar la vble (variable) de control del bucle
EJEMPLO:
for(i=1; i<=10; i++) cout << *;
// aqu, la act. de la vble i consiste en incrementar en 1 su valor
La variable i empieza tomando el valor 1, y como 1 <= 10 ! imprime un * y se incrementa i en 1 (i++). Cada vez que i tome un nuevo valor <=10 ! se escribir otro *. Es decir, el ltimo valor que i tomar dentro del bucle ser 10 ! la instruccin de salida por pantalla se repite 10 veces El bucle parar cuando i sea igual a 11 (que ya no es <=10).
26
2. E. Iterativas
2. E. Iterativas
for( cod=ppio; cod<=fin; cod++ ) cout << cod << " " << char(cod) << endl;
return 0; }
28
2. E. Iterativas
2.4. Sentencia:
break
(NO USAR)
! La sentencia break se usa para salir de un bucle. ! Se puede usar con cualquiera de los tres bucles que hemos visto. ! Cuando se utiliza un bucle infinito ( while(1), do..while(true), for(;;) ), slo se puede salir de ellos usando la sentencia break. ! Ejemplo:
/* Escribe el cubo de una lista de nmeros hasta que lee un 0 */
... int i;
for(;;) { cout << Dame un nmero para calcular el cubo; cin >> i; if(i==0) break; /* para el bucle infinito */ cout << El cubo de %d es %d\n, i, i*i*i);
} cout << Has tecleado un cero;
Este trozo de cdigo puede ser escrito sin usar un bucle infinito, ni break. !!!! De hecho, PROHIBIREMOS usar bucles de este tipo. !!!!! 29
2. E. Iterativas
3. Anidamiento
3. Anidamiento de bucles
31
3. Anidamiento
3. Anidamiento de bucles
32
3. Anidamiento
3. Anidamiento de bucles
33