Está en la página 1de 33

TEMA 3.

2 Estructuras de Control

Antonio L. Carrillo

ndice de contenidos

1.! Estructuras de Seleccin (Condicionales)


1.1. Sentencias if, if-else, if-else mltiple 1.2. Operador condicional ?: 1.3. Sentencia switch

2. Estructuras Repetitivas o Iterativas (Bucles)


2.1. Bucle while 2.2. Bucle do-while 2.3. Bucle for

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

Introduccin: Estructuras de control


Principio Principio Sentencia Sentencia Sentencias Sentencia ? Fin F Fin V V ? F

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.1. Ejemplo: Expresiones

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

Nota: Cualquier expresin es vlida como condicin en un if o if-else.

1. Seleccin

1. Ejemplo: Sentencia if-else


/* Calcular el flujo de corriente en un circuito elctrico de resistencia r al que se le aplica un voltaje de v. Se calcula con la ecuacin i=v/r. Para evitar la posibilidad de dividir por cero habr que evaluar la expresin slo si r no es cero. */

#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.1. Ejemplo: Sentencias if, if-else


/* Determina el nmero ms grande entre tres */ #include <iostream> using namespace std; int main() { int n1, n2, n3, mayor; cout << Primer valor: ; cin >> n1; cout << Segundo valor: ; cin >> n2; cout << Tercer valor: ; cin >> n3; if(n1 > n2) /* Calcular el mayor de n1 y n2 */ mayor = n1; Seleccin binaria else mayor = n2; if(n3 > mayor) /* Ver si n3 es el mayor */ mayor = n3; Seleccin simple cout << El mayor es: << mayor; return 0; }
8

1. Seleccin

1.1. Ejemplo: Sentencias if anidadas


/* Determina si un nmero es menor, mayor o igual a cero */

#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.1. Sentencia: if-else mltiple


Seleccin mltiple

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

1.1 Ejemplo: if-else mltiple


/*Programa que muestra la calificacin segn la nota numrica*/ #include <iostream> using namespace std; int main() { float nota; cout << Introduce la nota numrica: ; cin >> nota;

} 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

1.1 Ejemplo: if-else anidados


/* Programa que clasifica una onda electromagntica (EM) dada su longitud de onda */ #include <iostream> using namespace std; int main() { float lambda; cout << Dame la longitud de onda: ; cin >> lambda; cout << La onda electromagntica es ; if else else else else else else } if if if if if (lambda (lambda (lambda (lambda (lambda (lambda < < < < < < 1e-11) cout 1e-9) cout 400e-9)cout 700e-9)cout 1e-3) cout 1e-1) cout
<< << << << << << cout << Rayos Gamma ; Rayos X ; Ultravioleta ; Luz ; Infrarrojos ; Microondas ; Ondas de radio ;

return 0;
12

1. Seleccin

1.1. Ejemplo: if-else anidados


/* Determina la resistencia equivalente de 2 resistencias conectadas en serie o en paralelo */ #include <iostream> using namespace std; int main() { float r1, r2, requ; char ch; cout << Introduce los valores de las 2 resistencias: ; cin >> r1 >> r2; cout << Las resistencias estn en (s)erie o en (p)aralelo?: ; cin >> ch; Seleccin mltiple if ( ch == s || ch == S ) { requ = r1 + r2; cout << Resistencia equivalente en serie es: << requ; } else if ( ch == p || ch == P ) { requ = r1 * r2 / (r1 + r2); cout << Resistencia equivalente en paralelo es: << requ; } else cout << Entrada no vlida, debes teclear una S o una P;
} 13

1. Seleccin

1.2. Operador condicional

?:

! Es una herramienta til para evaluar expresiones condicionales. ! Su forma general es la siguiente:

expresin1 ? expresin2 : expresin3;!


! Interpretacin: ! Si expresin1 es cierta, entonces se evala la expresin2, en otro caso se evala la expresin3. ! Por tanto, el resultado de la expresin completa es el valor y tipo de la expresin evaluada: de la expresin2 o de la expresin3 (los cuales deben ser del mismo tipo). ! Ejemplo: a = b<0 ? b : b; ! La expresin condicional es la que est en negrita. Si el valor de b es menor que 0, la expresin completa tomar el valor de -b, en otro caso tomar el valor de b. ! En definitiva, a la variable a se le asigna el valor absoluto de b dependiendo de la condicin b<0. La sentencia anterior completa es equivalente a: if (b<0) a=-b; else a=b; 14

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

1.3. Ejemplo: Sentencia switch


... int main() {
int opcion; cout << 1>Espaa\n 2> Francia\n << 3>Italia\n 4> Inglaterra\n; cout << Selecciona una opcin: ; cin >> opcion;

switch ( opcion ) { case 1: cout << break; case 2: cout << break; case 3: cout << break; case 4: cout << } }

Hola\n; Allo\n; Pronto\n; Hello\n;


16

1. Seleccin

1.3. Ejemplos: Sentencia switch


Los 2 siguientes trozos de cdigo son equivalentes: if ( a == 1 ) cout <<Es un uno; else if ( a ==2 ) cout << Es un dos; else cout << No es uno ni dos; switch ( a ) { case 1: cout <<Es un uno; break; case 2: cout << Es un dos; break; default: cout << No es uno ni dos; } Los 2 siguientes trozos de cdigo son equivalentes: if(a==0 || a==1 || a==2 || a==3 || a==4) cout << a est en el rango 0-4; switch ( a ) { case 0: case 1: case 2: case 3: case 4: cout << a est en el rango 0-4; }

La variable a es de tipo entero

17

1. Seleccin

1.3. Ejemplo: Sentencia switch


Los 2 siguientes trozos de cdigo son equivalentes:
if ( operador == + ) resultado = a+b; else if (operador == -) resultado = a-b; else if (operador == *) resultado = a*b; else if (operador == /) resultado = a/b; else cout << Operador invlido; switch(operador) { case +: resultado = a+b; case -: resultado = a-b; case *: resultado = a*b; case /: resultado = a/b; default: cout << Operador }
La variable operador! es de tipo carcter

break; break; break; break; invlido;


18

1. Seleccin

1.3. Ejemplo: Sentencia switch


char letra; cout << Introduce una letra: ; cin >> letra; switch ( letra ) /* Aqu la expresin es una variable */ { /* de tipo carcter*/ case a: case e: case i: case o: case u: cout << Vocal minscula \n; break; case A: case E: case I: case O: case U: cout << Vocal mayscula \n; break; default: if ( (letra >a) && (letra <=z) ) cout << Consonante minscula \n; else if ( (letra >A) && (letra <=Z) ) cout << Consonante mayscula \n; else cout << No es una letra \n;
19

// no se han considerado como letras ni las ees ni las letras acentuadas

2. Estructuras Iterativas o Repetitivas: Bucles


! Un proceso repetitivo o iterativo (bucle) permite que un conjunto de sentencias se ejecute varias veces. ! Hay tres tipos de bucles en C: while, do-while y for. ! Todos requieren una condicin que determina si el bucle continua o no. ! Si la condicin es cierta el bucle continua, si es falsa se detiene. ! Flujo general de estos bucles:
Inicializacin

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

while ( condicion ) { Bloque_de_sentencias }

Bloque de Sentencias La condicin es cierta? NO

! 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

2.1. Ejemplo: Bucle while


/* Obtener la media de una lista de nmeros positivos. La lista terminar cuando se introd. uno negativo */
... int main() {

int num;
teclado

// vble. para guardar cada nmero leido por

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

do { Bloque_de_sentencias } while ( condicion );

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

2.2. Ejemplo: Bucle do-while

/* 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;

} while( num < -5 || num > 5 );


...

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.3. Bucle for (usar como bucle determinista)

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 >

valorFinal; actualizacin de vble)

}
//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.3. Ejemplos: Bucle for


for(i=0;i<9;i++) i empieza tomando el valor 0, cada vez que el bucle da una vuelta se incrementa en 1 (i++). El bucle parar cuando i== 9, es decir, el ltimo valor que i tomar dentro del bucle ser 8 (se repite 9 veces) for(i=10;i>=1;i--) i empieza tomando el valor 10, cada vez que el bucle da una vuelta se decrementa en 1 (i--). El bucle parar cuando i sea igual a 0, es decir, el ltimo valor que i tomar dentro del bucle ser 1. (se repite 10 veces) for(i=100;i<500;i+=50) i empieza tomando el valor 100; cada vez que el bucle da una vuelta se le suma 50 (i+=50 es equivalente a i=i+50). Dentro del bucle i tomar los valores 100, 150, 200, 250,..., 400, 450. (se repite 8 veces) De esas formas es como usaremos los bucles for, para dar valores a una variable, dentro de un rango concreto, desde un valor inicial, hasta uno final. Aunque lo siguiente tambin se puede hacer, lo evitaremos para asemejar el for del C al del resto de lenguajes: for( ; ; ) representa un bucle infinito!! for(i=2; i<128 && a>0; i*=2) empieza con i igual a 2; cada vez que el bucle da una vuelta i se multiplica por 2. Esto continua mientras i sea menor o igual que 128 y a>0, pero no sabemos a priori cuantos veces ser cierta esta condicin (ni el n de repeticiones) for(k=-20.2; h>32; z--,j++) empieza con k igual a -20.2; el bucle se repetir mientras h sea mayor que 32. Al final de cada bucle z se decrementa en 1 y j se incrementa en 1. Pero aunque sabemos la condicin para terminar (h<=32), no sabemos a la de cuantas repeticiones se cumplir. La coma permite varias expresiones en el primer y tercer campo del for.
27

2. E. Iterativas

2.3. Ejemplo: Bucle for


/* Imprime los caracteres ASCII entre un valor inicial y un valor final */
... int main() { int cod, ppio, fin; cout << Dame el codigo ASCII inicial: ; cin >> ppio; cout << Dame el codigo ASCII final: ); cin >> fin;

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

2.5. Sentencia: continue (NO USAR)


! La sentencia continue se usa SLO dentro de un bucle. ! Termina la iteracin que se est ejecutando y se vuelve a evaluar la condicin del while, del do-while o bien del for. ! Ejemplo: Muestra los valores desde 0 hasta 9 excepto el 5. for( i=0; i<10; i++) { if (i==5) continue; cout << El valor de i es: << i; }
Este programa puede ser escrito sin usar continue. !!!! De hecho, PROHIBIREMOS usar bucles de este tipo. !!!!
30

3. Anidamiento

3. Anidamiento de bucles

31

3. Anidamiento

3. Anidamiento de bucles

/* Escribe un cuadrado de asterscos */

32

3. Anidamiento

3. Anidamiento de bucles

/* Escribe un tringulo de asterscos */

33