Está en la página 1de 30

Informtica

Tema5- Estructuras de Control en C: Estructuras selectivas o condicionales

Estructuras de control
Van a controlar la ejecucin de las instrucciones: Tipos:
Selectivas (Eligen las instrucciones ejecutar). Repetitivas (Repiten un cjto de instrucciones).

Estructuras selectivas
Seleccin simple. (if) Seleccin complementaria (if-else) Anidamiento Seleccin mltiple (switch)

Selectivas: Elegir qu hacer!!


Cmo se ejecuta un programa? Podemos alterar el orden de ejecucin? Podemos decidir qu ejecutar y qu no? Ejemplo:
Decir si un nmero es positivo o negativo

Solucin:
emplear instrucciones que nos permitan hacer una cosa u otra

Conceptos previos
Bloque de instrucciones: Conjunto de instrucciones que se encuentra encerradas entre dos llaves {....} p.e.
{ printf(Deme un numero); /* mensaje de cortesia*/ scanf(%d,&numero); /* se introduce el numero*/ }

Comentarios

Seleccin simple: if
La instruccin if permite elegir si se ejecuta o no un bloque de instrucciones. Sintaxis:
if (exp_condicional) bloque_instrucciones

Ejemplo: Decir si un nmero introducido por teclado es positivo.

Ejemplo 1
main(){ int x; printf(Deme un numero); /* mensaje indicando lo que se pide */ scanf(%d,&x); /* se introduce el nmero */ if (x>=0) /* expresin condicional del if */ { printf(El numero %d es positivo,x); /* bloque */ } } Indentacin

Esquema del if
Falso(0) x>0

if

Cierto(1) Bloque

Resto de instrucciones

Ampliemos el problema:
Decir si un nmero introducido por teclado es positivo o negativo.

Este problema plantea dos alternativas que adems son complementarias y excluyentes:
O el nmero es positivo o es negativo

En estos casos se emplea el if...else

Seleccin complementaria:if..else
Un if..else permite ejecutar un bloque si se cumple la condicin y otro si no se cumple. Sintaxis:
if (exp_condicional) bloque1 else bloque2

main(){ int x; printf(Deme un numero); /* mensaje indicando lo que se pide*/ scanf(%d,&x); /* se introduce el nmero */ if (x>=0) /* expresin condicional del if */ { printf(El numero %d es positivo,x); /* bloque1*/ } else { printf(El numero %d es negativo,x); /* bloque2*/ } }

Otra posibilidad
main(){ int x; printf(Deme un numero); /* mensaje indicando lo que se pide */ scanf(%d,&x); /* se introduce el nmero */ if (x>=0) /* expresin condicional del if */ { printf(El numero %d es positivo,x); /* bloque1*/ } if (x<0) { printf(El numero %d es negativo,x); /* bloque2*/ } }

Esquema if...else
Falso(0) x>0 if...else Cierto(1) Bloque1 Bloque2

Resto de instrucciones

Instrucciones de seleccin anidadas


Supongamos el siguiente problema:
Resolver una ecuacin de primer grado ax+b=0

Anlisis de las soluciones:


Si a distinto de 0 entonces x=-b/a Si a=0 b distinto de 0 entonces solucin imposible. b=0 entonces solucin indeterminada

main(){ double a,b; printf(Deme un numero a y b); scanf(%lf%lf,&a,&b);

/* mensaje indicando lo que se pide */ /* se introduce el nmero */

if (a!=0) { printf(El resultado es: %lf,-b/a); } else { if (b!=0) { printf(La solucin es imposible); } else { printf(La solucin es indeterminada); }
}

main(){ double a,b; printf(Deme un numero a y b); scanf(%lf%lf,&a,&b);

/* mensaje indicando lo que se pide */ /* se introduce el nmero */

if (a!=0) printf(El resultado es: %lf,-b/a); else if (b!=0) printf(La solucin es imposible); else printf(La solucin es indeterminada); }

main(){ double a,b; printf(Deme un numero a y b); scanf(%lf%lf,&a,&b);

/* mensaje indicando lo que se pide */ /* se introduce el nmero */

if (a!=0) /*sin identacin*/ printf(El resultado es: %lf,-b/a); else if (b!=0) printf(La solucin es imposible); else printf(La solucin es indeterminada); }

Esquema anidado
Falso(0) a!=0 if...else anidado Bloque1 b!=0 Cierto(1) Bloque2 Bloque3 Cierto(1) Falso(0)

Resto de instrucciones

Otra solucin, condiciones compuestas


main(){ double a,b; printf(Deme un numero a y b); scanf(%lf%lf,&a,&b);
/* mensaje indicando lo que se pide */ /* se introduce el nmero */

if (a!=0) printf(El resultado es: %lf,-b/a); Realiza 5 comparaciones if ((a==0) && (b!=0)) Frente las dos del printf(La solucin es imposible); programa anterior. if ((a==0) && (b==0)) printf(La solucin es indeterminada); }

Problema:
Se desea disear un programa en C que lea desde teclado una calificacin alfabtica A,B,C,D,E y las convierta en las numricas 9,7,5,3,1 respectivamente.

Posible solucin
main(){ char nota; printf(Deme una calificacin); scanf(%c,&nota);
/* mensaje indicando lo que se pide */ /* se introduce el nmero */

if ((nota<A) || (nota>E)) printf(Calificacin desconocida); else { if (nota==A) printf(La nota es 9); if (nota==B) printf(La nota es 7); if (nota==C) printf(La nota es 5); if (nota==D) printf(La nota es 3); if (nota==E) printf(La nota es 1); } }

La seleccin mltiple con switch


Permite seleccionar entre infinitos caminos sin necesidad de anidar y evaluando una nica expresin. Estos bloques no precisan de llaves pues van precedidos Sintaxis:
switch (expresion){
case valor1 : bloque1 break; case valor2 : bloque2 break; ......

por : y acaban con un break;

main(){ char nota; printf(Deme una calificacin); scanf(%c,&nota);

/* mensaje indicando lo que se pide */ /* se introduce el nmero */

switch (nota) { case A: printf(La nota es 9); break; case B: printf(La nota es 7); break; case C: printf(La nota es 5); break; case D: printf(La nota es 3); break; case E: printf(La nota es 1); break; default : printf(Nota desconocida); } }

Propiedades del break


Problema: Supongamos que deseamos saber la calificacin de un alumno (Aprobado, Suspendido, Notable, Sobresaliente, Matricula, etc...)
Valores: [0-5[ corresponde a Suspendido
[5-7[ corresponde a Aprobado [7-9[ corresponde a Notable [9-10[ corresponde a Sobresaliente 10 corresponde a matricula.

main(){ int nota; printf(Deme una calificacin); scanf(%d,&nota); /* se introduce el nmero */ switch (nota) { case 1: case 2: case 3: case 4: printf(La nota %d = Suspendido,nota); break; case 5: case 6: printf(La nota %d = Aprobado,nota); break; case 7: case 8: printf(La nota %d = Notable,nota); break; case 9: printf(La nota %d = Sobresaliente,nota); break; case 10: printf(La nota %d = Matricula,nota); break; default : printf(Nota desconocida); } }

Inconvenientes del switch


Slo se selecciona en base a la evaluacin de una nica expresin. Los valores de cada case (caso) del switch pueden ser resultado de una expresin, en ese caso debe estar formada por ctes, por lo tanto no se puede utilizar nombres de variables. El resultado de las expresiones de cada case deben ser nmeros enteros.

main(){ /* Con reales */ double nota; printf(Deme una calificacin); scanf(%lf,&nota); /* se introduce el nmero */ if ((nota<0)||(nota>10)) printf(Calificacin desconocida); else { if ((nota>0) && (nota<5)) printf(La nota %lf es Suspenso,nota); if ((nota>=5) && (nota<7)) printf(La nota %lf es Aprobado,nota); if ((nota>=7) && (nota<9)) printf(La nota %lf es Notable,nota); if ((nota>=9) && (nota<10)) printf(La nota %lf es Sobresaliente,nota); if (nota==10) printf(La nota %lf es Matricula,nota); } }

Men con un switch


Hacer un programa que construya una calculadora bsica.
Debe pedirse que se introduzcan dos nmeros. Se debe de elegir una operacin a travs de un men de opciones: suma, resta, multiplicacin, divisin. Realizar la operacin correspondiente. Nota: (No se puede dividir un nmero por cero)

/* ejemplo de menu de opciones */ ..... printf(Menu de opciones\n\t1-suma\n\t2-resta\n\t3multiplicacin\n\t4-division\n); printf(deme una opcin de 1-4); scanf(%d,&opc); switch(opc){ case 1: ..... case 2: ..... case 3: ..... case 4: ..... default: printf(opcin incorrecta); } ....

main() { int opc; double a,b; printf(Deme el primer numero); scanf(%lf,&a); printf(Deme el segundo numero); scanf(%lf,&b); printf(Menu de opciones\n\t1-Sumar\n\t2-Restar\n\t3-Multiplicar\n\t4dividir\nDeme una opcion de 1-4: ); switch(opc){ case 1: printf(el resultado es %f,a+b);break; case 2: printf(el resultado es %f,a-b);break; case 3: printf(el resultado es %f,a*b);break; case 4: if (b!=0) printf(el resultado es%f,a/b); else printf(el resultado es indefinido); break; default: printf(opcin incorrecta); } }