02 If Switch
02 If Switch
02 If Switch
Selectiva IF
Decide, de acuerdo a una condicin, ejecutar un bloque o instruccin.
Sintaxis:
if (condicin)
bloqueInstruccionVerdad
[else
bloqueInstruccionFalso]
// atento: esta parte es opcional, est encerrada entre [ ]
Si la condicin es verdadera se ejecuta el bloqueInstruccionVerdad; si es falsa se ejecuta el bloqueInstruccionFalso
Ejemplo: si asignamos n = 0 y preguntamos:
if(n==0) printf("Atento n ES 0");
else
printf("Atento n NO ES 0");
Salida: Atento n ES 0
PGINA: 1
Lenguaje C
Atento a la condicin:
La condicin es una expresin lgica, que puede ser sencilla o compleja, ejemplo:
if(0) ...;
// 0 evala a falso, un nmero distinto de 0 evala a verdadero. Recuerde que no hay variable booleana.
if(expresin compleja con operadores aritmticos, relacionales y lgicos) ...;
Opcionalmente puede tener una asignacin (=), ejemplo:
if(x=0) ...;
// asigna 0 a x, luego evala if(0) ;
if(x= 2+1)
// opera 2 +1 asigna 3 a x, luego evala if(3) ;
Ejemplo:
n = 1;
if(n) printf("Verdad\n");
else printf("Falso\n");
Salida:
Verdad
El operador de igualdad es ==; pero si se equivoca y escribe = obtendr algo inesperado:
n = 6;
if(n=5) printf("Verdad\n");
// asigna 5 a n; finalmente pregunta if(5) ...
Salida:
Verdad
El operador de desigualdad es !=; pero si se equivoca y lo escribe al revs =! obtendr algo inesperado:
n = 6;
if(n=!5) printf("Verdad\n"); // evalua !5 y da 0 (falso), luego asigna 0 a n; finalmente pregunta if(0) ...
Salida: // No escribe nada.
Operadores relacionales: ==, <, <=, >, >=
Ejemplos:
n !=0
n == 0 && m > 1
n == 0 || m > 1
Operadores lgicos: La condicin es una expresin lgica, puede utilizar los operadores:
!
not
(no)
&& and
(y)
||
or
(o)
Ejemplos:
n !=0
n == 0 && m > 1
n == 0 || m > 1
Prioridad de ejecucin:
una condicin compleja puede contener operadores:
aritmticos (+, -, *, /, %); de relacin (==, <, > <=, >=); lgicos (!, && ||); de asignacin (=)
(1)
(2)
(3)
(4)
Los cuales se ejecutan en el orden indicado; ejemplo:
int m = 1, n = 2, k = 3, j = 5;
if(n = m == n-1 && 4 || k-j) printf("Hola\n");
Reemplazando valores se tiene:
if(n = 1 == 2-1 && 4 || 3-5) printf("Hola\n");
Aplicando las reglas de prioridad, la condicin se ejecut as:
n = 1 == 2-1 && 4 || 1 n = 1 == 1 && 4 || 1 n = 1 && 4 || 1 n = 1 || 1 n = 1 asigna 1 a n y evala a verdad
Por lo tanto al ejecutar:
if(n = m == n-1 && 4 || k-j) printf("Hola\n");
Salida:
Hola
PGINA: 2
Lenguaje C
Recuerde que tambin hay prioridad dentro de un mismo tipo de operadores:
Aritmtico: * / % se ejecutan de izquierda a derecha, + - se ejecutan de izquierda a derecha
Relacin : se ejecutan de izquierda a derecha
lgicos : !, && ||
Ejercicio: buscar en internet prioridad de operadores.
Un viejo truco
El siguiente if:
if(cond1 && cond2 && cond3 .) bloqueInstruccionVerdad
Es equivalente a:
if(cond1)
if(cond2)
if(cond3)
if(cond...)
bloqueInstruccionVerdad
Esta segunda forma se usa cuando es complicado calcular cond1, cond2, . por ejemplo cuando se valida varios datos:
if(validar1(dato1))
// si hay error en el dato 1 se reporta
if(validar2(dato2))
// si hay error en el dato 2 se reporta
if(validar3(dato3))
//...
if(valid...
) printf(Todos los datos fueron ingresados correctamente);
Operador ternario:
Supongamos que tenemos el cdigo:
int m = 3, n;
if (m==3) n = 1;
else
n = 2;
La instruccin if/else anterior es muy frecuente, por tal motivo tiene un atajo:
int m = 3, n;
n = (m==3) ? 1 : 2;
// operador ternario, con dos operadores y tres operandos.
printf(n = 0 y m = 0);
printf(n = 0 y m != 0);
printf(n = 0 y m = 4);
printf(n != 0 y m != 4);
Indente las instrucciones con claridad, esto permite visualizar la lgica. Los anidamientos pueden llevar a confusiones. Personalmente
yo prefiero:
Alinear los bloques de modo que se visualice la lgica.
No uso { } si no es necesario. Atento cuando quita o aumenta instrucciones.
A continuacin otras dos formas -que no me gustan- de escribir el mismo cdigo anterior:
Forma 1:
if(n==0) {
if (m == 0 ) printf(n = 0 y m = 0);
else
printf(n = 0 y m != 0);
} else {
if (m == 4 ) printf(n = 0 y m = 4);
else
printf(n != 0 y m != 4);
}
Forma 2:
if(n==0)
{
if (m == 0 )
{
printf(n = 0 y m = 0);
}
else
{
PGINA: 3
Lenguaje C
printf(n = 0 y m != 0);
}
}
else
{
if(m == 4 ) printf(n = 0 y m = 4);
else
printf(n != 0 y m != 4);
}
// ya me cans de usar { }
El programador debe utilizar la forma ms clara, tanto para l, como para las otras personas que lo revisan.
Ejercicio: Escribir el programa numeros.c; el cual lee un nmero entre 0 y 5 y lo escribe en letras:
0: cero
1: uno
..
Este ejercicio lo podemos programar utilizando la sentencia if else en modo anidado; pero sera muy engorroso; Ser ms fcil utilizar
otra estructura de decisin.
Selectiva switch
Decide las instrucciones a ejecutar segn el valor de una variable:
switch(variable) {
case valor1: bloqueInstruccion1
// si variable = valor1, se ejecuta bloque1
// contina al siguiente case
case valor2: bloqueInstruccion2
// si variable = valor2, se ejecuta bloque2
// contina al siguiente case
[default: bloqueInstruccionDefault]
// se ejecuta bloqueInstruccionDefault
}
Ejercicio: Escribir el programa numeros.c; el cual lee un nmero entre 0 y 3 y lo escribe en letras:
0: cero
1: uno
..
Intentemos: Programa 02_02a.c:
// Uso de switch: Escribir nmero en letras
#include<stdio.h>
void main(void){
int n = 2;
switch(n) {
case 1: printf("uno\n");
case 2: printf("dos\n");
case 3: printf("tres\n");
default: printf("fuera de valor\n");
}
}
Salida:
dos
fuera de valor // Esta salida cumple las reglas de la sintaxis; pero no resuelve el problema planteado; hagamos un cambio:
Programa 02_02b.c:
// Uso de switch: Escribir nmero en letras
#include<stdio.h>
void main(void){
int n = 2;
switch(n) {
case 1: printf("uno\n"); break;
case 2: printf("dos\n"); break;
case 3: printf("tres\n"); break;
default: printf("Fuera de valor\n");
}
}
PGINA: 4
Lenguaje C
Salida:
dos
Es el resultado que necesitamos; si hiciramos n = 4; la salida sera:
Salida:
Fuera de valor.
Los break obligan a que se ejecute solo el bloqueInstruccion correspondiente al case; si no se cumple ningn case, se ejecuta el
bloqueInstruccionDefault.
Anidamiento: Ahora podemos hacer varios tipos de anidamiento de instrucciones de decisin, por ejemplo:
If(n >= 0) {
switch(n) {}
} else
if() {}
else .
Sea cuidadoso al usar { }, tanto para agrupar instrucciones, como para aclarar la lgica.
Ejercicio: Escriba un programa que lea un nmero n entero y haga lo siguiente:
si n est entre 0 y 5, escriba su valor en letras.
En caso contrario:
si n < 0, que escriba: n debe ser >= 0
en caso contrario, que escriba: n es muy grande.
Ejemplo: Este ejercicio ya fue presentado en el captulo anterior, ahora lo modificaremos para presentar ms opciones.
Escriba un programa que lea dos enteros m n mayores que 0, luego presente el men:
Calculadora:
1) Sumar: m + n
2) Restar: m n
3) Multiplicar: m * n
4) Dividir: m/n
Elija la operacin: _
Ejecute la opcin seleccionada.
Programa 02_03.c:
// Leer dos enteros m n mayores que 0, presentar un men y ejecutar la operacin seleccionada
#include<stdio.h>
void main(void){
int m, n, op;
printf("Ingrese un entero m = "); scanf("%d",&m);
printf("Ingrese un entero n = "); scanf("%d",&n);
printf("\nOperacin que requiere:\n");
printf("1) Sumar: m + n\n");
printf("2) Restar: m n\n");
printf("3) Multiplicar: m * n\n");
printf("4) Dividir: m/n\n");
printf(" Elija su opcin: ");
scanf("%d",&op);
switch(op){
// Seleccin de opcin
case 1: printf("suma = %d\n", m+n);
break;
case 2: printf("Resta = %d\n", m-n);
break;
case 3: printf("Multiplicacin = %d\n", m*n);
break;
case 4: if(n==0) printf("Denominador 0\n");
else
printf("Divisin = %.2f\n", (float)m/n);
break;
default: printf("Opcin errada\n");
}
}
Salida:
PGINA: 5
Lenguaje C
Atento:
Usar las indentaciones correctas visualiza la lgica
Fjese que se ha violado la recomendacin de escribir una instruccin por lnea, por ejemplo:
case 2: printf("Resta = %d\n", m-n); break;
Esto se hizo para visualizar mejor la lgica.
Matriz de prueba:
Caso
Entradas
Salida Chequeo
opcin
1.50
Denominador 0
Opcin errada
PGINA: 6