Proposiciones
Proposiciones
Proposiciones
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