Algoritmos y Lenguaje de Programación, Sección 1 Proposiciones Proposiciones Mario Medina C. mariomedina@udec.cl • Expresiones )Aritméticas (b + c) )De control (if – else) )De asignación (X = Y) )Llamadas a funciones (printf(3…)) • Terminadas por un punto y coma (;) Bloques de proposiciones Proposición if • Delimitados por llaves ( { y } ) • Se trata como una proposición compuesta • Puede contener • Ejecución condicional )Declaraciones )Otras proposiciones ` En ese orden! • Bloque define el alcance de las declaraciones que contiene Diagrama de flujo if-else Condición? • Condición se evalúa a verdadero o falso • Caso else no es necesario )Puede ser omitido Verdadero o Falso • C no posee un tipo de dato para representar VóF No Si Proposición 1 if (condicion) proposicion1; else proposicion2; Proposición 2 )Usa enteros )Falso: 0 )Verdadero: distinto de 0 • Condición a evaluar puede ser cualquier expresión que se evalúe a un valor numérico )if(10) equivale a if(verdadero) ©Mario Medina C. 1 Algoritmos y Lenguaje de Programación, Sección 1 Comparación con 0 == vs = • Operador == realiza comparaciones de igualdad )No confundir con operador de asignación = ` (a == b) ≠ (a = b) • Operador != realiza comparaciones de desigualdad )if (condicion) equivalente a if (condicion != 0) if (a == b) hacer_algo(); • Compara variables a y b • Copia valor de b en • Si a es igual a b, variable a hacer_algo() • Verifica valor de b • Si es b != 0, hacer_algo() Operador condicional else “colgante” • Reemplaza comandos if-else por ? • expr1 ? expr2 : expr3; equivale a if (n > 0) if (a > b) z = a; else z = n; • Indentación confunde relación if-else if (expr1) expr2; else expr3; )Qué hace z = (a > b) ? a : b; ` z es el valor mayor entre a y b Ejemplo else “colgante” if (a = b) hacer_algo(); )else pertenece al segundo if if (n > 0) { if (a > b) z = a; } else z = n; • Forma correcta else if •Operaciones if encadenadas n > o? Si No a > b? No Si z=n ©Mario Medina C. z=a if (n > 0) z = a; else if (n == 0) z = b; else z = c; if (n > 0) z = a; else if (n == 0) z = b; else z = c; 2 Algoritmos y Lenguaje de Programación, Sección 1 Diag. de flujo if-else if switch • Decisión múltiple Condición 1? )Prueba si una expresión coincide con uno de una serie de valores enteros constantes No Si Condición 2? No Proposición 1 Si Proposición 2 Proposición 3 Diagrama de flujo switch Expresión == Const1? Si Proposición 1 break Proposición 2 break No Expresión == Const2? Si No default switch(expresion) { case const1: proposiciones; case const2: proposiciones; default: proposiciones; } Ejemplo de switch switch(verdad){ case 0: printf (“falso\n”); default: printf(“verdadero\n”); } )Error! Si verdad == 0, imprime falso y verdadero ` Comportamiento “fall through” switch y break switch(verdad){ case 0: printf(“falso\n”); break; default: printf(“verdadero\n”); } • Imprime falso ó verdadero )break causa salida inmediata del switch ©Mario Medina C. switch switch(dato){ case 1: case 3: case 5: printf (“impar\n”); break; case 2: case 4: case 6: printf(“par\n”); } 3 Algoritmos y Lenguaje de Programación, Sección 1 Ciclo while Diagrama de flujo while • Repetición condicional while (condicion) proposicion1 1. Primero se evalúa la condición 2. Si la condición se cumple, se ejecuta la proposición No Condición? Si continue Proposición 1 break • Repetir hasta que condición no se cumpla Ejemplo de ciclo while int i = 10, j = 0; while (i > 0) { i = i – 1; j = j + 1; } • Valor final de j es 10 )Si la condición no se cumple inicialmente, proposición no se ejecuta do-while(condición) Ejecución del ciclo while() i j 10 9 0 1 8 7 6 5 2 3 4 5 4 3 2 1 0 6 7 8 9 10 • Valor final de i: 0 • Valor final de j: 10 Diagrama de flujo do-while • Repetición condicional do proposicion1 while (condicion); 1. Primero se ejecuta la proposición 2. Luego, se evalúa la condición. Si es verdadera, repetir • Repetir hasta que condición no se cumpla ©Mario Medina C. continue Proposición 1 Condición? break No Si 4 Algoritmos y Lenguaje de Programación, Sección 1 Ejemplo de ciclo do-while int i = 10, j = 0; do { j = j + 1; i = i - 1; } while (i > 0); • Valor final de j es 10 • Qué pasa si inicialmente (i>0) no se cumple? while vs. do-while Ejecución del ciclo do-while() i j 10 9 0 1 8 7 6 5 2 3 4 5 4 3 2 1 0 6 7 8 9 10 • Valor final de i: 0 • Valor final de j: 10 • Igual a ciclo while()! while y break • Ciclo while es mucho más común )Si la condición no se cumple inicialmente, proposición no se ejecuta • Ciclo do-while necesario en algunos casos )Si la condición no se cumple inicialmente, proposición se ejecuta una vez )Ciclo se termina con ; Ejecución usando break() i j 10 9 8 7 0 1 2 3 6 5 4 3 4 5 6 ©Mario Medina C. • Valor final de i: 3 • Valor final de j: 6 • Ejecución del ciclo termina cuando i==3 • break termina ciclo antes de su fin int i = 10, j = 0; while (i > 0) { i = i – 1; if (i == 3) break; /* Sale del lazo */ j = j + 1; } while y continue • continue fuerza siguiente iteración del ciclo int i = 10, j = 0; while (i > 0) { i = i – 1; if (i == 3) continue; /* prox. iteracion */ j = j + 1; } 5 Algoritmos y Lenguaje de Programación, Sección 1 continue • continue permite terminar prematuramente la iteración actual del ciclo )Condición se evalúa nuevamente )Si es verdadera, ciclo se ejecuta nuevamente • continue puede usarse con ciclos while, do-while y for )Puede usarse en ciclos anidados ` Sólo afecta al ciclo más cercano Ejecución usando continue() i j 10 9 0 1 8 7 6 5 2 3 4 5 4 3 2 1 0 6 • Valor final de i: 0 • Valor final de j: 9 • Interrupción del ciclo cuando i==3 hace que j no se incremente 7 8 9 Ciclo for Ciclo for for (expr1; expr2; expr3) proposicion; • Equivale a expr1; while (expr2){ proposicion; expr3; } • Generalmente: Ciclo for Ciclo for • Expresiones expr1, expr2, expr3 pueden ser omitidas • Expresión anterior equivalente a )for (;;): Ciclo infinito • Cada una de ellas puede ser una proposición compuesta for (i i < i = sum ©Mario Medina C. = 0, j = 10, k = 20; (j*k*k); i + 1, j = j – 2, k = k - 3) = sum + 4; )expr1: Inicialización )expr2: Condición )expr3: Modificación ` Cada una de ellas puede ser una proposición compuesta for (i = 0; i < 10; i = i + 1) proposicion_a_ejecutar; i = 0; j = 10; k = 20; while (i sum = i = i j = j k = k } < j*k*k) { sum + 4; + 1; – 2; - 3; 6 Algoritmos y Lenguaje de Programación, Sección 1 break y continue en Ciclo for Diagrama de flujo for • Comando break fuerza una salida anticipada del ciclo • Comando continue en proposición fuerza ejecución de expr3 y repetición del ciclo Inicialización lazo No Condición? Si continue break Proposición Modificación lazo Comando goto Curiosidades del C • Comando goto rotulo fuerza la ejecución del código asociado al rótulo • Duff’s Device )Rotulo termina con : if (condicion) goto rotulo1; proposicion1; rotulo1: proposicion2; • Uso de goto poco recomendado! )Tom Duff, Lucasfilm, 1983 • Reemplaza el lazo do { *to = *from++; while (--count> 0); por el codigo de la derecha • Ciclo do-while() y switch() intercalados • Código válido! n = (count + 7) / 8; switch { case case case case case case case case (count % 8) 0: do { *to = *from++; 7: *to = *from++; 6: *to = *from++; 5: *to = *from++; 4: *to = *from++; 3: *to = *from++; 2: *to = *from++; 1: *to = *from++; } while (--n > 0); } ©Mario Medina C. 7