Introducción a la Programación 3. Control de Flujo: if y else Roberto Marabini — Introduccin a la programacin — ETS – p.1/29 control de flujo Hasta ahora los programas que hemos visto eran lineales. Comenzaban por la primera instrucción y acababan por la última, ejecutándose todas una sola vez. Lógico ¿no?. Pero resulta que muchas veces no es esto lo que queremos que ocurra. Lo que nos suele interesar es que dependiendo de los valores de los datos se ejecuten unas instrucciones y no otras. O también puede que queramos repetir unas instrucciones un número determinado de veces. Para esto están las sentencia de control de flujo. Roberto Marabini — Introduccin a la programacin — ETS – p.2/29 if #include <stdio.h> int main() { int b; printf("Teclea un numero:"); scanf("%d", &b); if(b<0) {printf("b es negativo\n");} return 0; } Roberto Marabini — Introduccin a la programacin — ETS – p.3/29 if #include <stdio.h> int main() { int b; printf("Teclea un numero:"); scanf("%d", &b); #include <stdio.h> int main() { int b; printf("Teclea un numero:"); scanf("%d", &b); if(b<0) {printf("b es negativo\n");} return 0; } TRUE if(b<0) printf("b es negativo\n"); FALSE return 0; } Roberto Marabini — Introduccin a la programacin — ETS – p.3/29 if La expresion (b<0) se denomina expresión Booleana. C evalua esta expresion para decidir si se debe o no imprimir el mensaje. Si el valor de la expresión booleana es TRUE C ejecuta el siguiende bloque de código, en caso contrario se lo salta. Roberto Marabini — Introduccin a la programacin — ETS – p.4/29 if La expresion (b<0) se denomina expresión Booleana. C evalua esta expresion para decidir si se debe o no imprimir el mensaje. Si el valor de la expresión booleana es TRUE C ejecuta el siguiende bloque de código, en caso contrario se lo salta. #include <stdio.h> int main() { int b; b=5; if(b) {printf("b es negativo\n");} return 0; } ¿(b) es TRUE o FALSE? Roberto Marabini — Introduccin a la programacin — ETS – p.4/29 if y else int main() { int b; printf("Teclea un numero:"); scanf("%d", &b); if(b<0) {printf("b es negativo\n");} else if(b==0) {printf("b es cero\n");} else {printf("b es positivo\n");} return 0; } Roberto Marabini — Introduccin a la programacin — ETS – p.5/29 if y else #include <stdio.h> int main() { int b; printf("Teclea un numero:"); scanf("%d", &b); TRUE if(b<0) int main() { int b; printf("Teclea un numero:"); scanf("%d", &b); if(b<0) {printf("b es negativo\n");} else if(b==0) {printf("b es cero\n");} else {printf("b es positivo\n");} return 0; } printf("b es negativo\n"); FALSE TRUE else if(b==0) printf("b es cero\n"); FALSE else printf("b es positivo\n"); return 0; } Roberto Marabini — Introduccin a la programacin — ETS – p.5/29 if y else Los condicionales pueden complicarse... #include <stdio.h> int main() { int x,y,j,k,z,q; ...some code here... if ((x==y) && (j>k)) {z=1;} else {q=10;} return 0; } Si el valor de la variable x es igual al valor de la variable y y si el valor de la variable j es mayor que el valor de la variable k entonces asigna el valor 1 a la variable z y sino asigna el valor 10 a la variable q. Nota 1: C usa == para representar la operación igual a y = para asignar un valor a una variable. Nota 2:&& representa la operación Booleana AND. Roberto Marabini — Introduccin a la programacin — ETS – p.6/29 Operadores Booleanos igual a == menor que < mayor que > menor o igual <= mayor o igual differente de y o no >= != && || ! Roberto Marabini — Introduccin a la programacin — ETS – p.7/29 Errores a evitar Usar = en lugar de ==. ¿Cual es la diferencia entre estos dos programas? #include <stdio.h> int main() { int a,b; b=5; printf("Introduzca un Nmero:"); scanf("%d", &a); if (a==b) { printf("a es igual a b\n"); } return 0; } #include <stdio.h> int main() { int a,b; b=5; printf("Introduzca un Nmero:"); scanf("%d", &a); if (a=b) { printf("a es igual a b\n"); } return 0; } Roberto Marabini — Introduccin a la programacin — ETS – p.8/29 switch Hay casos en los que se deben evaluar múltiples condiciones y únicamente se debe evaluar una de ellas. Se puede programar con un grupo de sentencias if then else anidadas, aunque ello puede ser farragoso y de complicada lectura. Para evitarlo nos puede ayudar la sentencia switch. Su utilización es: char c; switch(c){ case ’a’: printf("Op A\n"); break; case ’b’: printf("Op B\n"); break; case ’c’: case ’d’: printf("Op C o D\n"); break; default: printf("Op ?\n"); } Roberto Marabini — Introduccin a la programacin — ETS – p.9/29 Ejercicio Escribir un programa calc que se comporte como un calculador básico: 1. debe ser capaz de procesar las cuatro funciones básicas: +, -, y *. 2. El input debe ser de la forma operando operacion operando. (Ejemplo: 5 + 3 ) 3. La salida debe ser del tipo operando operacion operando = resultado (Ejemplo: 5 + 3 = 8) char c; switch(c){ case ’a’: printf("Op A\n"); break; case ’b’: printf("Op B\n"); break; case ’c’: case ’d’: printf("Op C o D\n"); break; default: printf("Op ?\n"); } Roberto Marabini — Introduccin a la programacin — ETS – p.10/29 while while es otra sentencia de control que usa operaciones booleanas. while (a < b) { printf("%d\n", a); a = a + 1; } Esto hace que las dos líneas entre llaves se ejecuten hasta que a sea mayor que b Roberto Marabini — Introduccin a la programacin — ETS – p.11/29 do-while C tambien define la sentencia do-while do { printf("%d\n", a); a = a + 1; } while (a < b); Esto hace que las dos líneas entre llaves se ejecuten hasta que a sea mayor que b pero la comprobación se hace despues de ejecutar el código entre llaves, así que este se ejecuta almenos una vez Roberto Marabini — Introduccin a la programacin — ETS – p.12/29 For x=1; /* inicializacin */ while (x<10) { blah blah blah /*sentencias */ x++; /* x++ es identico a x=x+1 */ /* actualiacin */ } Esta construccion es equivalente a: for(x=1; x<10; x++) { blah blah blah } Las ventajas de esta construcción alternativa son que en la cabecera del bucle se tiene toda la información sobre como se inicializan y actualizan las variables del bucle Roberto Marabini — Introduccin a la programacin — ETS – p.13/29 For x=1; /* inicializacin */ while (x<10) { blah blah blah /*sentencias */ x++; /* x++ es idntico a x=x+1 */ /* actualizacin */ } for(x=1; x<10; x++) { blah blah blah } En este ejemplo el bucle while contiene una parte dedicada a la inicialización (x=1), otra es un test (x<10), y finalmente hay una actualización de la variable que controla el bucle x++; . En el bucle for se ponen estos tres pasos en una sola línea pero.. ¿Qué ocurre cuando hay más de una variable? Roberto Marabini — Introduccin a la programacin — ETS – p.14/29 For a=1; b=6; while (a < b) { a++; printf("%d\n",a); } Puede expresarse en una línea: for (a=1,b=6; a < b; a++,printf("%d\n",a)); Ciertamente la expresión resultante es un poco confusa y seria preferible un código como: for (a=1,b=6; a < b; a++) printf("%d\n",a); El punto es que el operador , permite colocar varias expresiones en las secciones de inicialización y actualización del bucle for aunque no en la sección de de test. Roberto Marabini — Introduccin a la programacin — ETS – p.15/29 Resumen if /else. switch While and do/while for scanf("%d", &a); if (a==b) { printf("a es igual a b\n"); } else { printf("a NO es igual a b\n"); } Roberto Marabini — Introduccin a la programacin — ETS – p.16/29 Resumen if /else. switch While and do/while for char c; switch(c){ case ’a’: printf("Op A\n"); break; case ’b’: printf("Op B\n"); break; case ’c’: case ’d’: printf("Op C o D\n"); break; default: printf("Op ?\n"); } Roberto Marabini — Introduccin a la programacin — ETS – p.17/29 Resumen if /else. switch While and do/while for while (a < b) { printf("%d\n", a); a = a + 1; } do { printf("%d\n", a); a = a + 1; } while (a < b); Roberto Marabini — Introduccin a la programacin — ETS – p.18/29 Resumen if /else. switch While and do/while for for(x=1; x<10; x++) { blah blah blah } Roberto Marabini — Introduccin a la programacin — ETS – p.19/29 Break y Continue La sentencia break nos saca de un bucle switch, for, while y do while La sentencia continue se usa en bucles y produce un salto a la siguiente iteracion. Se usa con for, while y do while Roberto Marabini — Introduccin a la programacin — ETS – p.20/29 Break y Continue for(i=0;i<=10;i++){ . if(i>7){ . printf( "i mayor que 7\n"); . break; . } . else { . printf("i = %d\n", i); . continue; . printf("Nunca llego aqui\n"); . } } Output i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i es mayor que 7 Ya hemos visto el uso de la sentencia break para salirse de las sentencias switch. break se usa en bucles para salirse del bucle sin completarlo. continue sirve para saltarse parte de una iteración (Depurar) Roberto Marabini — Introduccin a la programacin — ETS – p.21/29 Diagramas de Flujo S1 falso C S2 S2 verdadero S1 S3 Roberto Marabini — Introduccin a la programacin — ETS – p.22/29 Diagramas de Flujo falso S1 C verdadero verdadero S1 C falso Roberto Marabini — Introduccin a la programacin — ETS – p.23/29 Diagramas de Flujo S1 C1 C2 CN S1 S2 SN Roberto Marabini — Introduccin a la programacin — ETS – p.24/29 Diagramas de Flujo C falso verdadero continue break Roberto Marabini — Introduccin a la programacin — ETS – p.25/29 Errores a evitar Utilizar = cuando se desea usar == Olvidarse de incrementar un contador en un bucle. (El bucle nunca se termina). Escribir accidentalmente un “;” despues de un for. Por ejemplo: for (x=1; x<10; x++); printf("%d\n",x); Solo imprime un valor, por que la línea “;” es la sentencia que se repite. Roberto Marabini — Introduccin a la programacin — ETS – p.26/29 Ejercicio Escribe un programa, usando while, que imprima una tabla de conversion de euros a pesetas (la tabla irá de 1 euro a 10 en incrementos de 1) La conversion euro a pesetas es: 166.386 x=1; /* inicializacin */ while (x<10) { blah blah blah /*sentencias */ x++; /* x++ es idntico a x=x+1 */ /* actualizacin */ } Depurar Roberto Marabini — Introduccin a la programacin — ETS – p.27/29 Ejercicio Escribe un programa, usando for, que imprima una tabla de conversion de euros a pesetas (la tabla irá de 1 euro a 10 en incrementos de 1) La conversion euro a pesetas es: 166.386 for(x=1; x<10; x++) { blah blah blah } Roberto Marabini — Introduccin a la programacin — ETS – p.28/29 Ejercicio Escribe un programa, usando for, que imprima una tabla de conversion de euros a pesetas (la tabla irá de 1 euro a 10 en incrementos de 1) La conversion euro a pesetas es: 166.386 Añadir una linea a la tabla, en el lugar apropiado, de forma que también se imprima la cantidad de euros que son 1000 pts. for(x=1; x<10; x++) { blah blah blah } Roberto Marabini — Introduccin a la programacin — ETS – p.29/29