13.01.2015 Views

Proposiciones

Proposiciones

Proposiciones

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Algoritmos y Lenguaje de Programación,<br />

Sección 1<br />

<strong>Proposiciones</strong><br />

<strong>Proposiciones</strong><br />

Mario Medina C.<br />

mariomedina@udec.cl<br />

• Expresiones<br />

Aritméticas (b + c)<br />

De control (if – else)<br />

De asignación (X = Y)<br />

Llamadas a funciones (printf(3…))<br />

• Terminadas por un punto y coma (;)<br />

Bloques de proposiciones<br />

Proposición if<br />

• Delimitados por llaves ( { y } )<br />

• Se trata como una proposición compuesta<br />

• Puede contener<br />

Declaraciones<br />

Otras proposiciones<br />

En ese orden!<br />

• Bloque define el alcance de las declaraciones<br />

que contiene<br />

• Ejecución condicional<br />

if (condicion)<br />

proposicion1;<br />

else<br />

proposicion2;<br />

• Condición se evalúa a verdadero o falso<br />

• Caso else no es necesario<br />

Puede ser omitido<br />

Diagrama de flujo if-else<br />

Verdadero o Falso<br />

No<br />

Condición<br />

Si<br />

Proposición 1 Proposición 2<br />

• C no posee un tipo de dato para representar<br />

V ó F<br />

Usa enteros<br />

Falso: 0<br />

Verdadero: distinto de 0<br />

• Condición a evaluar puede ser cualquier<br />

expresión que se evalúe a un valor numérico<br />

if(10) equivale a if(verdadero)<br />

©Mario Medina C. 1


Algoritmos y Lenguaje de Programación,<br />

Sección 1<br />

Comparación con 0<br />

== vs =<br />

• Operador == realiza comparaciones de<br />

igualdad<br />

No confundir con operador de asignación =<br />

(a == b) ≠ (a = b)<br />

• Operador != realiza comparaciones de<br />

desigualdad<br />

if (condicion) equivalente a if<br />

(condicion != 0)<br />

if (a == b)<br />

hacer_algo();<br />

• Compara variables a y b<br />

• Si a es igual a b,<br />

hacer_algo()<br />

if (a = b)<br />

hacer_algo();<br />

• Copia valor de b en<br />

variable a<br />

• Verifica valor de b<br />

• Si es b != 0,<br />

hacer_algo()<br />

Operador condicional<br />

else “colgante”<br />

• Reemplaza comandos if-else por <br />

• expr1 expr2 : expr3; equivale a<br />

if (expr1)<br />

expr2;<br />

else<br />

expr3;<br />

Qué hace z = (a > b) a : b;<br />

z es el valor mayor entre a y b<br />

if (n > 0)<br />

if (a > b)<br />

z = a;<br />

else<br />

z = n;<br />

• Indentación confunde<br />

relación if-else<br />

else pertenece al<br />

segundo if<br />

if (n > 0)<br />

{<br />

if (a > b)<br />

z = a;<br />

}<br />

else<br />

z = n;<br />

• Forma correcta<br />

Ejemplo else “colgante”<br />

else if<br />

•Operaciones if encadenadas<br />

n > o<br />

No<br />

Si<br />

a > b<br />

Si<br />

z = n<br />

No<br />

z = a<br />

if (n > 0)<br />

z = a;<br />

else if (n == 0)<br />

z = b;<br />

else<br />

z = c;<br />

if (n > 0)<br />

z = a;<br />

else<br />

if (n == 0)<br />

z = b;<br />

else<br />

z = c;<br />

©Mario Medina C. 2


Algoritmos y Lenguaje de Programación,<br />

Sección 1<br />

Diag. de flujo if-else if<br />

switch<br />

Condición 1<br />

Si<br />

Proposición 1<br />

No<br />

Condición 2<br />

Si<br />

Proposición 2<br />

No<br />

Proposición 3<br />

• Decisión múltiple<br />

Prueba si una expresión coincide con uno de una<br />

serie de valores enteros constantes<br />

switch(expresion) {<br />

case const1: proposiciones;<br />

case const2: proposiciones;<br />

default: proposiciones;<br />

}<br />

Diagrama de flujo switch<br />

Ejemplo de switch<br />

Expresión<br />

== Const1<br />

No<br />

Expresión<br />

== Const2<br />

No<br />

default<br />

Si<br />

Si<br />

Proposición 1<br />

Proposición 2<br />

break<br />

break<br />

switch(verdad){<br />

case 0:<br />

printf (“falso\n”);<br />

default:<br />

printf(“verdadero\n”);<br />

}<br />

Error! Si verdad == 0, imprime falso y<br />

verdadero<br />

Comportamiento “fall through”<br />

switch y break<br />

switch<br />

switch(verdad){<br />

case 0:<br />

printf(“falso\n”);<br />

break;<br />

default:<br />

printf(“verdadero\n”);<br />

}<br />

• Imprime falso ó verdadero<br />

break causa salida inmediata del switch<br />

switch(dato){<br />

case 1:<br />

case 3:<br />

case 5:<br />

printf (“impar\n”);<br />

break;<br />

case 2:<br />

case 4:<br />

case 6:<br />

printf(“par\n”);<br />

}<br />

©Mario Medina C. 3


Algoritmos y Lenguaje de Programación,<br />

Sección 1<br />

Ciclo while<br />

Diagrama de flujo while<br />

• Repetición condicional<br />

while (condicion)<br />

proposicion1<br />

1. Primero se evalúa la condición<br />

2. Si la condición se cumple, se ejecuta la<br />

proposición<br />

• Repetir hasta que condición no se cumpla<br />

continue<br />

Condición<br />

Si<br />

Proposición 1<br />

No<br />

break<br />

Ejemplo de ciclo while<br />

Ejecución del ciclo while()<br />

i<br />

j<br />

int i = 10, j = 0;<br />

while (i > 0) {<br />

i = i – 1;<br />

j = j + 1;<br />

}<br />

• Valor final de j es 10<br />

Si la condición no se cumple inicialmente,<br />

proposición no se ejecuta<br />

10<br />

9<br />

8<br />

7<br />

6<br />

5<br />

4<br />

3<br />

2<br />

1<br />

0<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

10<br />

• Valor final de i: 0<br />

• Valor final de j: 10<br />

do-while(condición)<br />

Diagrama de flujo do-while<br />

• Repetición condicional<br />

do<br />

proposicion1<br />

while (condicion);<br />

1. Primero se ejecuta la proposición<br />

2. Luego, se evalúa la condición. Si es verdadera,<br />

repetir<br />

• Repetir hasta que condición no se cumpla<br />

continue<br />

Proposición 1<br />

Condición<br />

Si<br />

break<br />

No<br />

©Mario Medina C. 4


Algoritmos y Lenguaje de Programación,<br />

Sección 1<br />

Ejemplo de ciclo do-while<br />

Ejecución del ciclo do-while()<br />

i<br />

j<br />

int i = 10, j = 0;<br />

do {<br />

j = j + 1;<br />

i = i - 1;<br />

}<br />

while (i > 0);<br />

• Valor final de j es 10<br />

• Qué pasa si inicialmente (i>0) no se<br />

cumple<br />

10<br />

9<br />

8<br />

7<br />

6<br />

5<br />

4<br />

3<br />

2<br />

1<br />

0<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

10<br />

• Valor final de i: 0<br />

• Valor final de j: 10<br />

• Igual a ciclo<br />

while()!<br />

while vs. do-while<br />

while y break<br />

• Ciclo while es mucho más común<br />

Si la condición no se cumple inicialmente,<br />

proposición no se ejecuta<br />

• Ciclo do-while necesario en algunos casos<br />

Si la condición no se cumple inicialmente,<br />

proposición se ejecuta una vez<br />

Ciclo se termina con ;<br />

• break termina ciclo antes de su fin<br />

int i = 10, j = 0;<br />

while (i > 0) {<br />

i = i – 1;<br />

if (i == 3)<br />

break; /* Sale del lazo */<br />

j = j + 1;<br />

}<br />

Ejecución usando break()<br />

while y continue<br />

i<br />

10<br />

9<br />

8<br />

7<br />

6<br />

5<br />

4<br />

3<br />

j<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

• Valor final de i: 3<br />

• Valor final de j: 6<br />

• Ejecución del ciclo<br />

termina cuando i==3<br />

• continue fuerza siguiente iteración del ciclo<br />

int i = 10, j = 0;<br />

while (i > 0) {<br />

i = i – 1;<br />

if (i == 3)<br />

continue; /* prox. iteracion */<br />

j = j + 1;<br />

}<br />

©Mario Medina C. 5


Algoritmos y Lenguaje de Programación,<br />

Sección 1<br />

continue<br />

Ejecución usando continue()<br />

i<br />

j<br />

• continue permite terminar<br />

prematuramente la iteración actual del ciclo<br />

Condición se evalúa nuevamente<br />

Si es verdadera, ciclo se ejecuta nuevamente<br />

• continue puede usarse con ciclos while,<br />

do-while y for<br />

Puedeusarseen ciclosanidados<br />

Sólo afecta al ciclo más cercano<br />

10<br />

9<br />

8<br />

7<br />

6<br />

5<br />

4<br />

3<br />

2<br />

1<br />

0<br />

0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

• Valor final de i: 0<br />

• Valor final de j: 9<br />

• Interrupción del ciclo<br />

cuando i==3 hace que<br />

j no se incremente<br />

Ciclo for<br />

Ciclo for<br />

for (expr1; expr2; expr3)<br />

proposicion;<br />

• Equivale a<br />

expr1;<br />

while (expr2){<br />

proposicion;<br />

expr3;<br />

}<br />

• Generalmente:<br />

expr1: Inicialización<br />

expr2: Condición<br />

expr3: Modificación<br />

Cada una de ellas puede ser una proposición<br />

compuesta<br />

for (i = 0; i < 10; i = i + 1)<br />

proposicion_a_ejecutar;<br />

Ciclo for<br />

Ciclo for<br />

• Expresiones expr1, expr2, expr3 pueden<br />

ser omitidas<br />

for (;;): Ciclo infinito<br />

• Cada una de ellas puede ser una proposición<br />

compuesta<br />

for (i = 0, j = 10, k = 20;<br />

i < (j*k*k);<br />

i = i + 1, j = j – 2, k = k - 3)<br />

sum = sum + 4;<br />

• Expresión anterior equivalente a<br />

i = 0;<br />

j = 10;<br />

k = 20;<br />

while (i < j*k*k) {<br />

sum = sum + 4;<br />

i = i + 1;<br />

j = j – 2;<br />

k = k - 3;<br />

}<br />

©Mario Medina C. 6


Algoritmos y Lenguaje de Programación,<br />

Sección 1<br />

break y continue en Ciclo for<br />

Diagrama de flujo for<br />

• Comando break fuerza una salida anticipada<br />

del ciclo<br />

• Comando continue en proposición fuerza<br />

ejecución de expr3 y repetición del ciclo<br />

continue<br />

Inicialización lazo<br />

No<br />

Condición<br />

Si<br />

break<br />

Proposición<br />

Modificación lazo<br />

Comando goto<br />

• Comando goto rotulo fuerza la ejecución<br />

del código asociado al rótulo<br />

Rotulo termina con :<br />

if (condicion) goto rotulo1;<br />

proposicion1;<br />

rotulo1: proposicion2;<br />

• Uso de goto poco recomendado!<br />

Curiosidades del C<br />

• Duff’s Device<br />

Tom Duff, Lucasfilm,<br />

1983<br />

• Reemplaza el lazo<br />

do {<br />

*to = *from++;<br />

while (--count> 0);<br />

por el codigo de la derecha<br />

• Ciclo do-while() y<br />

switch() intercalados<br />

• Código válido!<br />

n = (count + 7) / 8;<br />

switch (count % 8)<br />

{<br />

case 0: do { *to = *from++;<br />

case 7: *to = *from++;<br />

case 6: *to = *from++;<br />

case 5: *to = *from++;<br />

case 4: *to = *from++;<br />

case 3: *to = *from++;<br />

case 2: *to = *from++;<br />

case 1: *to = *from++;<br />

} while (--n > 0);<br />

}<br />

©Mario Medina C. 7

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!