Informática Tema5- Estructuras de Control en C: Estructuras selectivas o condicionales.

Post on 23-Jan-2016

260 views 0 download

Transcript of Informática Tema5- Estructuras de Control en C: Estructuras selectivas o condicionales.

Informática

Tema5- Estructuras de Control en C:

Estructuras selectivas o condicionales

Estructuras de control

• Van a controlar la ejecución de las instrucciones:

• Tipos:– Selectivas (Eligen las instrucciones ejecutar).– Repetitivas (Repiten un cjto de instrucciones).

Estructuras selectivas

• Selección simple. (if)

• Selección complementaria (if-else)

• Anidamiento

• Selección múltiple (switch)

Selectivas: Elegir qué hacer!!

• ¿Cómo se ejecuta un programa?• ¿Podemos alterar el orden de ejecución?• ¿Podemos decidir qué ejecutar y qué no?Ejemplo:

Decir si un número es positivo o negativo

Solución: 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

Selección simple: if

• La instrucción if permite elegir si se ejecuta o no un bloque de instrucciones.

• Sintaxis:if (exp_condicional) bloque_instrucciones

• Ejemplo: Decir si un número 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 número */

if (x>=0) /* expresión condicional del if */

{printf(“El numero %d es positivo”,x); /* bloque */

}}

Indentación

Esquema del if

x>0

Bloque

Resto de instrucciones

Cierto(1)

Falso(0)

if

• Ampliemos el problema:– Decir si un número introducido por teclado es

positivo o negativo.

• Este problema plantea dos alternativas que además son complementarias y excluyentes:– O el número es positivo o es negativo

• En estos casos se emplea el if...else

Selección complementaria:if..else

• Un if..else permite ejecutar un bloque si se cumple la condición 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 número */if (x>=0) /* expresión condicional del if */{

printf(“El numero %d es positivo”,x); /* bloque1*/}else{

printf(“El numero %d es negativo”,x); /* bloque2*/}

}

Otra posibilidadmain(){

int x;printf(“Deme un numero”); /* mensaje indicando lo que se pide */scanf(“%d”,&x); /* se introduce el número */if (x>=0) /* expresión 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

x>0

Bloque1

Resto de instrucciones

Cierto(1)

Falso(0)

if...else

Bloque2

Instrucciones de selección anidadas

• Supongamos el siguiente problema:– Resolver una ecuación de primer grado

ax+b=0

• Análisis de las soluciones:– Si a distinto de 0 entonces x=-b/a– Si a=0 b distinto de 0 entonces solución imposible.

b=0 entonces “solución indeterminada”

main(){double a,b;printf(“Deme un numero a y b”); /* mensaje indicando lo que se pide */

scanf(“%lf%lf”,&a,&b); /* se introduce el número */

if (a!=0) {printf(“El resultado es: %lf”,-b/a);

}else {

if (b!=0) { printf(“La solución es imposible”);

}else {

printf(“La solución es indeterminada”); }

}

}

main(){double a,b;printf(“Deme un numero a y b”); /* mensaje indicando lo que se pide */

scanf(“%lf%lf”,&a,&b); /* se introduce el número */

if (a!=0) printf(“El resultado es: %lf”,-b/a);

else if (b!=0)

printf(“La solución es imposible”); else

printf(“La solución es indeterminada”);

}

main(){double a,b;printf(“Deme un numero a y b”); /* mensaje indicando lo que se pide */

scanf(“%lf%lf”,&a,&b); /* se introduce el número */

if (a!=0) /*sin identación*/

printf(“El resultado es: %lf”,-b/a);elseif (b!=0) printf(“La solución es imposible”); else printf(“La solución es indeterminada”); }

Esquema anidado

a!=0

Bloque1

Resto de instrucciones

Cierto(1)

Falso(0)

if...else

anidadob!=0

Bloque2

Cierto(1)

Falso(0)

Bloque3

Otra solución, condiciones compuestas

main(){double a,b;printf(“Deme un numero a y b”); /* mensaje indicando lo que se pide */

scanf(“%lf%lf”,&a,&b); /* se introduce el número */

if (a!=0) printf(“El resultado es: %lf”,-b/a);

if ((a==0) && (b!=0))printf(“La solución es imposible”);

if ((a==0) && (b==0))printf(“La solución es indeterminada”);

}

Realiza 5 comparacionesFrente las dos del programa anterior.

• Problema:– Se desea diseñar un programa en C que lea

desde teclado una calificación alfabética A,B,C,D,E y las convierta en las numéricas 9,7,5,3,1 respectivamente.

Posible soluciónmain(){

char nota;printf(“Deme una calificación”); /* mensaje indicando lo que se pide */

scanf(“%c”,&nota); /* se introduce el número */

if ((nota<‘A’) || (nota>’E’)) printf(“Calificación 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 selección múltiple con switch

• Permite seleccionar entre infinitos caminos sin necesidad de anidar y evaluando una única expresión.

• Sintaxis:switch (expresion){

case valor1 : bloque1 break;case valor2 : bloque2 break;......

}

Estos bloques no precisan de llaves pues van precedidos

por “:” y acaban con un break;

main(){char nota;printf(“Deme una calificación”); /* mensaje indicando lo que se pide */

scanf(“%c”,&nota); /* se introduce el número */

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 calificación 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 calificación”); scanf(“%d”,&nota); /* se introduce el número */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• Sólo se selecciona en base a la evaluación de

una única expresión.

• Los valores de cada case (caso) del switch pueden ser resultado de una expresión, 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 números enteros.

main(){double nota;printf(“Deme una calificación”); scanf(“%lf”,&nota); /* se introduce el número */if ((nota<0)||(nota>10))

printf(“Calificación 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);}

}

}

/* Con reales */

Menú con un switch

• Hacer un programa que construya una calculadora básica.– Debe pedirse que se introduzcan dos números.– Se debe de elegir una operación a través de un

menú de opciones: suma, resta, multiplicación, división.

– Realizar la operación correspondiente.– Nota: (No se puede dividir un número por cero)

/* ejemplo de menu de opciones */.....printf(“Menu de opciones\n\t1-suma\n\t2-resta\n\t3-multiplicación\

n\t4-division\n”);printf(“deme una opción de 1-4”);scanf(“%d”,&opc);switch(opc){

case 1: .....case 2: .....case 3: .....case 4: .....default: printf(“opción 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\t4-dividir\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(“opción incorrecta”);

}}