tema 03. selecci.ncambio de la secuencia de ejecución de instrucciones zinstrucciones de...
TRANSCRIPT
1
Fundamentos de InformáticaETSII
Departamento de Sistemas Informáticos y ComputaciónUniversidad Politécnica de Valencia
Tema 3: Estructuras de Selección.
Índice
1. Introducción.2. Selección simple y doble: if, if...else.3. Instrucciones if anidadas.4. Detección de errores en la apertura de un
fichero5. Selección múltiple: switch.
2
Objetivos
1. Entender los conceptos de la ejecución condicional
2. Conocer funcionamiento y utilización de sentencias if, if...else empleadas de forma sencilla
3. Combinar estructuras de selección4. switch – break
1. Introducciónsecuencia_de_instrucciones = instrucción { “;” instrucción }
Instrucción: acción u operación del programa que conduce a la resolución del problema.Programa: secuencia de instrucciones separadas por “;”.Bloque de instrucciones: conjunto de instrucciones encerrado entre llaves.
3
Ejemplo
void main(){int i=25, numero;printf(“Dame un número”); scanf(“%d”, &numero); i = i + numero;printf(“Resultado=%d\n”,i);}
Orden de ejecución: secuencial.
1
2
3
4
5
Cambio de la secuencia de ejecución de instrucciones
Instrucciones de selección: se ejecutan unas instrucciones u otras según el valor de una condición.
Condicionales: if, if-else, switch.Incondicionales: goto No usarlo.
Instrucciones de repetición (bucles): repite un conjunto de instrucciones un número determinado de veces.
Condicionales: la secuencia de instrucciones se ejecuta hasta o mientras se cumple una determinada condición.Incondicional: la secuencia de instrucciones se repite un número determinado de veces.
4
Instrucción 1
Instrucción 2
Instrucción 3
Ejecución secuencial
Instrucción 1
Instrucción 2 Instrucción 3
Instrucción 1
Instrucción 2
Instrucción 3
Selección Bucle
Ejecución secuencial: las instrucciones se ejecutan en el orden en que aparecen en el programa y una sola vez.
Selección condicional
Determina qué conjunto de instrucciones se ejecutan de acuerdo con algún criterio definido por el programador.
Tipos:Selección simple (if)Selección doble (if-else)Selección múltiple (switch)
5
2. Selección simple y doble: if, if...else
Selección simple: ifSelección doble: if-else
Selección simple: ifif (condición) instrucción
Si la condición es ciertase ejecutará la instrucción.
Instrucción: puede ser una sentencia simple, un bloque de instrucciones (entre llaves) o sentencias compuestas.
if (condición)
instrucción
if (condición)
{
instrucción 1
instrucción 2
instrucción 3
}
Simple
Bloque
6
Diagrama de flujo de la instrucción if
if (condición)
instrucción;
Resto de Instrucciones;Instrucción
Condición
Resto de instrucciones
Cierto
Falso
Ejemplo
if (x>0)
printf(“Mayor que 0\n”);
printf(“Adiós\n”);
printf(“Mayor que 0\n”);
X>0
printf(“Adios\n”);
CiertoFalso
7
Ejemplo
if (n>0) printf (“Mayor que cero\n”);
if (edad>65) {sueldo = SueldoActual*0.75+Complementos;printf(“Lo que cobras es %f\n”, sueldo);}
Cuando más de una instrucción está dentro del if se deben utilizar
llaves
Identación: lo que está dentro del if se pone con varios espacios
delante. Sirve únicamente para ver rápidamente que hay dentro del if.
Ejemplo
int n=0;if (n>0) n++;n = n+25;printf(“n=%d\n”, n);
int n=0;if (n>0) {n++;n = n+25;}printf(“n=%d\n”, n);
n=25 n=0
int n=0;if (n>0); {n++;n = n+25;}printf(“n=%d\n”, n);
n=26
8
EjemploLeer la edad de dos personas y decir cuál es la de mayor edad. #include <stdio.h>void main(){int n1, n2;printf(“Introduce las edades: “);scanf(“%d%d”, &n1, &n2);if (n1>n2) printf(“La edad de la mayor es %d años.\n”,n1);if (n1<n2) printf(“La edad de la mayor es %d años.\n”,n2);if (n1==n2) printf(“Tienen la misma edad: %d años.\n”,n1);}
El cuerpo del if contiene una única instrucción, por lo que no hace falta poner
llaves.
EjemploLeer un número del fichero “valores.txt” que se encuentra en c:\temp y decir si es positivo. #include <stdio.h>void main(){int x;FILE *f;f=fopen(“c:\\temp\\valores.txt”, “r”);fscanf(f, “%d”, &x); if (x>0) printf(“El número %d es positivo”,x);fclose(f);}
9
Selección doble: if-elseif (condición) instrucción_1
else instrucción_2
Instrucción_1, instrucción_2: pueden ser una instrucción simple, un bloque de instrucciones (entre llaves), o instrucciones compuestas.Si la condición es cierta se ejecutaráinstrucción_1, si es falsa se ejecutaráinstrucción_2. Sólo se ejecutará una sentencia, no ambas.
Diagrama de flujo de la instrucción if..else
if (condición)
instrucción_cierto;
else
instrucción_falso;
Resto de Instrucciones;
10
Ejemplo
if (x>=0)
printf(“Positivo”);
else
printf(“Negativo”);
printf(“Adiós\n”);
printf(“Positivo\n”);
X>=0
printf(“Adiós\n”);
Cierto Falso
printf(“Negativo\n”);
Ejemplo#include <stdio.h>void main(){int x;printf(“Dame un número: ”);scanf(“%d”, &x); if (x>=0)
printf(“El número %d es positivo”, x); /* Bloque cierto*/
elseprintf(“El número %d es negativo”, x);
/* Bloque falso*/}
Cuando el bloque sólo contiene una única instrucción, pueden omitirse las llaves
11
Ejemplo#include <stdio.h>void main(){int x;printf(“Dame un número”); scanf(“%d”,&x); if (x>=0)
printf(“El número %d es positivo”,x); /* Bloque verdadero*/
if (x<0)printf(“El número %d es negativo”,x);
/* Bloque verdadero*/}
Condiciones complementarias
3. Instrucciones if anidadas
if (n >0)printf(“El número %d es mayor que 0\n”, n);
elseif (n == 0)
printf(“Es 0\n”);else
printf(“El número %d es menor que 0\n”,n);
Un if con su else, es una única instrucción, por eso no se ponen
llaves
12
int edad;printf(“Dime tu edad: ”);scanf(“%d”,&edad);if (edad>=18)
if (edad<=65){printf(“Trabajador.\n”);printf(“Solicitar los datos del contrato.\n”);}
elseprintf(“Jubilado.\n”);
Ejemplo
El cuerpo del segundo ifcontiene más de una
instrucción, por lo que hacen falta llaves.
El cuerpo del primer if contiene una única instrucción, por lo
que no hacen falta llaves. Un ifcon su else correspondiente es
una instrucción.
Ejercicio
Pedir al usuario un número A.
Si el número A es positivo:Pedir un número B.Si es positivo:
Calcular la suma, resta, producto, división y resto de ambos.Mostrar los resultados por pantalla.
13
void main(){int A, B;printf(“Introduce un valor: “);scanf(“%d”, &A);if (A>0)
{printf(“Introduce otro valor: “);scanf(“%d”, &B);if (B>0)
{printf(“%d + %d = %d\n”, A, B, A+B);printf(“%d - %d = %d\n”, A, B, A-B);printf(“%d * %d = %d\n”, A, B, A*B);printf(“%d / %d = %d\n”, A, B, A/B);printf(“%d % %d = %d\n”, A, B, A%B);}
}}
El cuerpo del if contiene más de una instrucción, por lo que hacen falta
llaves.
Diagrama de flujo
if (condición_1)
sentencia_cierto_1
else
if (condición_2)
sentencia_cierto_2
else
sentencia_falso_2
Sentencia_Cierto_1
Condición_1
Cierto Falso
Condición_2
Sentencia_Cierto_2 Sentencia_Falso_2
Resto de Instrucciones
Cierto Falso
14
Si no hay llaves, un else siempre va con el último if escrito.
if (edad>=0)if (edad>=18)
printf(“Mayor de edad\n”);else
printf(“Menor de edad\n”);
Si se quiere variar esta situación, poner llaves.
if (edad>=0){if (edad>=18)
printf(“Mayor de edad\n”);}
elseprintf(“Edad incorrecta\n\n”);
15
Ejercicio¿Cuál es la salida por pantalla de estos programas?
int a=1;if (a==0)
printf(“Es cero\n”);else
printf(“No es cero\n”);printf(“a=%d\n”,a);
int a=1;if (a=0)
printf(“Es cero\n”);else
printf(“No es cero\n”);printf(“a=%d\n”,a);
No es ceroa=1
No es ceroa=0
Ejercicio
Resolver una ecuación de primer grado ax+b=0
Análisis de las soluciones:
Si a!=0 solución x=-b/aSi a==0
b!=0 solución imposible.b==0 solución indeterminada
16
#include <stdio.h>void main(){float a, b;printf(“Dame las incógnitas de la ecuación ax+b=0: ”); scanf(“%f%f”, &a, &b); if (a!=0)
printf(“El resultado es: %f”,-b/a);else
if (b!=0)printf(“La solución es imposible”);
elseprintf(“La solución es indeterminada”);
}
#include <stdio.h>void main(){float a, b;printf(“Dame las incógnitas de la ecuación ax+b=0: ”);scanf(“%f%f”, &a, &b); if (a!=0) printf(“El resultado es: %f”,-b/a);elseif (b!=0)printf(“La solución es imposible”);elseprintf(“La solución es indeterminada”); }
Versión que no utiliza identación
17
#include <stdio.h>void main(){float a,b;printf(“Déme las incógnitas a y b de la ecuación ax+b=0: ”);scanf(“%f%f”,&a,&b);if (a!=0)
printf(“El resultado es: %f”,-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 2 del
programa anterior.
Para evitar la anidación, se desglosan las condiciones explícitamente. Resultado más complejo de escribir y más lento de ejecutar
1
2 3
4 5
Ejercicio
Calcular el mayor de tres números enterosintroducidos por teclado.
18
#include <stdio.h>void main(){int a, b, c;printf(“Dime tres números: “);scanf(“%d%d%d”, &a, &b, &c);
if (a==b && b==c) printf(“Iguales\n”);if (a==b && b<c) printf(“El mayor es %d\n”, c);if (a==b && b>c) printf(“El mayor es %d\n”, b);
if (a>b && a>=c) printf(“El mayor es %d\n”, a);if (a>b && a<c) printf(“El mayor es %d\n”, c);
if (a<b && b>=c) printf(“El mayor es %d\n”, b);if (a<b && b<c) printf(“El mayor es %d\n”, c);}
Versión sin anidación: 18
comparaciones
#include <stdio.h>void main(){int a, b, c;printf(“Dime tres números: “);scanf(“%d%d%d”, &a, &b, &c);if (a==b)
if (b==c) printf(“Iguales\n”);else
if (b<c) printf(“El mayor es %d\n”,c);else printf(“El mayor es %d\n”,b);
elseif (a>b)
if (a>=c) printf(“El mayor es %d\n”,a);else printf(“El mayor es %d\n”,c);
elseif (b>=c) printf(“El mayor es %d\n”,b);else printf(“El mayor es %d\n”,c);
}
Versión con anidación: 7
comparaciones
19
#include <stdio.h>void main(){int a, b, c, mayor;printf(“Dime tres números: “);scanf(“%d%d%d”, &a, &b, &c);
if (a>=b) mayor = a;else mayor = b;
If (c>mayor) mayor = c;
printf(“El mayor es %d\n”,mayor);}
Otra versión con anidación: 2
comparaciones
Ejercicio
Se desea diseñar un programa en C que lea desde teclado una calificación alfabética:
A, B, C, D, E
y la convierta en la numérica:
10, 8, 6, 5, 0
20
void main(){char nota;printf(“Déme una calificación: ”); scanf(“%c”,¬a); if ((nota<‘A’) || (nota>’E’))
printf(“Calificación desconocida”);else
{if (nota==‘A’) printf(“La nota es 10”);if (nota==‘B’) printf(“La nota es 8”);if (nota==‘C’) printf(“La nota es 6”);if (nota==‘D’) printf(“La nota es 5”);if (nota==‘E’) printf(“La nota es 0”);}
}
void main(){char nota;printf(“Déme una calificación: ”); scanf(“%c”,¬a); if (nota==‘A’) printf(“La nota es 10”);else
if (nota==‘B’) printf(“La nota es 8”);else
if (nota==‘C’) printf(“La nota es 6”);else
if (nota==‘D’) printf(“La nota es 5”);else
if (nota==‘E’) printf(“La nota es 0”);else
printf(“Calificación desconocida”);}
Otra versión
21
EjercicioLa fecha del domingo de Pascua corresponde al primer domingo después de la primera luna llena que sigue al equinoccio de primavera.Dado un año, los cálculos que permiten conocer esta fecha son:
A = año %19B = año % 4C = año % 7D = (19 * A + 24) % 30E = (2 * B + 4 * C + 6 * D + 5) % 7N = (22 + D + E)
Donde N indica el número del día del mes de marzo (o abril si N es superior a 31) correspondiente al domingo de Pascua. Escribir unprograma que lea un año y muestre el día y el mes en el que se celebró o se celebrará el domingo de Pascua ese año.
Por ejemplo: si introducimos el año 2002, los cálculos son los siguientes:
A = 2002 % 19 = 7B = 2002 % 4 = 2C = 2002 % 7 = 0D = (19 * 7 + 24) % 30 = 157 % 30 = 7E = (2 * 2 + 4 * 0 + 6 * 7 + 5) % 7 = 51 % 7 = 2N = (22 + 7 + 2) = 31
Es decir, el año 2002 el domingo de Pascua fue el 31 de marzo.
22
#include <stdio.h>void main(){int anyo, a, b, c, d, e, n;printf ("Introduce un año:");scanf ("%d", &anyo);
a = anyo % 19;b = anyo % 4;c = anyo % 7;d = (19 * a + 24) % 30;e = (2 * b + 4 * c + 6 * d + 5) % 7;n = 22 + d + e;
if (n<=31)printf ("El Domingo de Pascua del año %d es el
%d de marzo\n", anyo, n);else
printf ("El Domingo de Pascua del año %d es el %d de abril\n", anyo, n-31);
}
23
Ejercicio
Calcular el máximo de 4 números introducidos por teclado.
Nota: pensar un método diferente al problema del máximo de 3 números enteros.
Entrada: 4 valoresSalida: el valor máximo de los cuatro
AlgoritmoPedir los valores al usuario (valor1, valor 2, valor3, valor4)
Tomar el primer valor como el máximo actual (máximo=valor1)Si el segundo valor es mayor que el máximo actual
El nuevo máximo es el segundo valor (máximo=valor2)Si el tercer valor es mayor que el máximo actual
El nuevo máximo es el tercer valor (máximo=valor3)Si el cuarto valor es mayor que el máximo actual
El nuevo máximo es el cuarto valor (máximo=valor4)
Mostrar por pantalla el valor máximo
Entrada
P
R
O
C
E
S
O
Salida
24
#include <stdio.h>void main (){ float a, b, c, d, maximo;
/* Lectura de datos */printf ("Introduzca los 4 números: \n");scanf ("%f%f%f%f", &a, &b, &c, &d);
/* Calculo */maximo = a;if (b > maximo) maximo = b;if (c > maximo) maximo = c;if (d > maximo) maximo = d;
/* Escritura de resultados */printf ("El número máximo es: %f\n", maximo);}
4. Detección de errores en la apertura de un fichero
¿Cómo saber si el fichero se ha abierto correctamente?
Si el fichero no se puede abrir, fopen retorna NULL.
FILE *fichero;
if ((fichero = fopen (“c:\\temp\\prueba.txt”, “r”))==NULL)printf(“Fichero no existe\n”);
fichero = fopen (“c:\\temp\\prueba.txt”, “r”);If (fichero==NULL)
printf(“Fichero no existe\n”);
25
EjercicioAbrir el fichero “pepito.txt” para lectura.
Detectar si se ha abierto correctamente el fichero. Si no se abre correctamente dar un mensaje de error.
Leer un valor entero. Indicar por pantalla si es par o impar.
Cerrar el fichero.
void main(){int x; FILE *f;if ((f=fopen(“pepito.txt”, “r”))==NULL)
printf(“No se puede abrir el fichero\n”);else
{fscanf(f, “%d”, &x); if (x%2==0) printf(“El número %d es par\n”,x);else printf(“El número %d es impar\n”,x); fclose(f);}
}
26
void main(){int x; FILE *f;if ((f=fopen(“pepito.txt”, “r”))==NULL)
{printf(“No se puede abrir el fichero\n”);exit (0);}
fscanf(f, “%d”, &x); if (x%2==0) printf(“El número %d es par\n”,x);else printf(“El número %d es impar\n”,x);fclose(f);}
Otra versión.
La instrucción exit termina el programa, por lo que ya no se ejecuta el resto del
programa si el fichero no se abre.
Ejercicio
Leer la edad de 2 personas de un fichero “edad.txt”.
Mostrarlas ordenadas de menor a mayor en el fichero “salida.txt”.
27
void main () {FILE *e, *s; int edad1, edad2;
if ((e=fopen(“edad.txt”, “r”))==NULL)printf(“No se puede abrir el fichero edad.txt.\n”);
else {if ((s=fopen(“salida.txt”, “w”))==NULL)
printf(“No se puede abrir el fichero salida.txt.\n”);else {
fscanf (e, “%d%d”, &edad1, &edad2);if (edad1>=edad2)
fprintf (s, “%d - %d\n”, edad2, edad1);else
fprintf (s, “%d - %d\n”, edad1, edad1);fclose(s);}
fclose(e);}
}
void main () {FILE *e, *s; int edad1, edad2;
if ((e=fopen(“edad.txt”, “r”))==NULL){printf(“No se puede abrir el fichero edad.txt.\n”);exit(0);}
if ((s=fopen(“salida.txt”, “w”))==NULL){printf(“No se puede abrir el fichero salida.txt.\n”);fclose(e);exit(0);}
fscanf (e, “%d%d”, &edad1, &edad2);if (edad1>=edad2)
fprintf (s, “%d - %d\n”, edad2, edad1);else
fprintf (s, “%d - %d\n”, edad1, edad1);fclose(e);fclose(s);}
Otra versión.
Cuando se termina el programa por no poder
abrir el fichero de salida, debe cerrarse el
fichero que estáabierto.
28
5. Selección múltiple: switchPermite seleccionar entre múltiples caminos sin necesidad de anidar y evaluando una única expresión
switch (expresión){case valor1:
instrucciones_1;break;
case valor2:instrucciones_2;break;
......default:
instrucciones_n; break;
}
Ejemploint opc;printf(“1. Ingreso.\n”);printf(“2. Reintegro.\n”);printf(“3. Consulta de saldo.\n”);scanf(“%d”,&opc);switch (opc)
{case 1: printf(“Ha elegido ingreso.\n”); break;case 2: printf(“Ha elegido reintegro.\n”); break;case 3: printf(“Ha elegido consulta.\n”); break;default: printf(“Opción incorrecta.\n”);}
Aunque haya más de una instrucción
dentro de cada case, no hay que poner
llaves.
29
Ejemploif (opc==1)
printf(“Ha elegido ingreso.\n”);else
if (opc==2)printf(“Ha elegido reintegro.\n”);
elseif (opc==3)
printf(“Ha elegido consulta.\n”);else
printf(“Opción incorrecta.\n”);
If equivalente
PropiedadesSólo se puede seleccionar en base a la evaluación de una única expresión.La evaluación de la expresión de switch siempre debe generar un único valor (entero o char).Los valores de cada case debe ser constantes. No se puede utilizar nombres de variables.La ejecución de un case no para hasta que encuentra un break (o finaliza), sobrepasando incluso otros case.
30
Ejemplo#include <stdio.h>void main(){char nota;printf(“Déme una calificación: ”);scanf(“%c”, ¬a);switch (nota)
{case ‘A’: printf(“La nota es 10”); break;case ‘B’: printf(“La nota es 8”); break;case ‘C’: printf(“La nota es 6”); break;case ‘D’: printf(“La nota es 5”); break;case ‘E’: printf(“La nota es 0”); break;default : printf(“Nota desconocida”);}
}
La expresión es de tipo carácter
Ejemplochar c;printf(“Opción: “);scanf(“%c”,&c);switch (c)
{case ‘1’: printf(“Elegida opción 1.\n”);
break;case ‘2’: printf(“Elegida opción 2.\n”);
break;case ‘3’: printf(“Elegida opción 3.\n”);
break;default: printf(“Opción incorrecta.\n”);}
La expresión es de tipo carácter
31
Ejemploint c;printf(“Opción: “);scanf(“%d”,&c);switch (c)
{case 1: printf(“Elegida opción 1.\n”);
break;case 2: printf(“Elegida opción 2.\n”);
break;case 3: printf(“Elegida opción 3.\n”);
break;default: printf(“Opción incorrecta.\n”);}
La expresión es de tipo entero
Ejemplo, NO se puede:#include <stdio.h>void main(){float nota;printf(“Déme una calificación: ”);scanf(“%f”,¬a);switch (nota)
{case (nota<5.0): printf(“La nota es 4”); break;case 5.0: printf(“La nota es 5”); break;case 6.0: printf(“La nota es 6”); break;case 7.0: printf(“La nota es 7”); break;case 8.0: printf(“La nota es 8”); break;case 9.0: printf(“La nota es 9”); break;default : printf(“Nota desconocida”);}
}
La expresión debe ser int o char
El valor de case debe ser constante, no puede
ser una expresión, no puede contener
variables
32
Ejemploint c;printf(“Opción: “);scanf(“%d”,&c);switch (c)
{case 1:
printf(“Elegida opción 1.\n”);case 2:
printf(“Elegida opción 2.\n”);case 3:
printf(“Elegida opción 3.\n”);default:
printf(“Opción incorrecta.\n”);}
¿Qué muestra por pantalla este programa si se elige cada una de
las opciones?
Opción 1:Elegida opción 1.Elegida opción 2.Elegida opción 3.Opción incorrecta.Opción 2:Elegida opción 2.Elegida opción 3.Opción incorrecta.Opción 3:Elegida opción 3.Opción incorrecta.Otra opción:Opción incorrecta.
EjercicioMostrar al usuario un menú por pantalla de una máquina de café con las opciones:
1. Café sólo2. Cortado3. Chocolate4. Leche
Mostrar al usuario el importe de lo que va a tomar cuando elija la opción (café sólo y leche: 35 centimos, cortado 40 centimos, chocolate 30 centimos).
33
void main(){int opc;printf(“1. Café sólo\n”); printf(“2. Cortado\n”); printf(“3. Chocolate\n”); printf(“4. Leche\n”); scanf(“%d”,&opc);
switch(opc){case 1: printf(“El precio de café solo es 35 céntimos\n”); break;case 2: printf(“El precio del cortado es 40 céntimos\n”); break;case 3: printf(“El precio del chocolate es 30 céntimos\n”); break;case 4: printf(“El precio de la leche es 35 céntimos\n”); break;default: printf(“Opción incorrecta\n”);}
}
EjercicioConvertir un valor numérico en una nota: suspendido, aprobado, notable, sobresaliente, matricula, etc...
Valores: [0-5[ corresponde a Suspendido[5-7[ corresponde a Aprobado[7-9[ corresponde a Notable[9-10[ corresponde a Sobresaliente10 corresponde a Matricula.
Hacerlo con if (anidados y no anidados) y con switch.
34
void main(){int nota;printf(“Déme una calificación”); scanf(“%d”,¬a);if ((nota<0) || (nota>10))
printf(“Calificación desconocida”);if ((nota>0) && (nota<5))
printf(“Nota %d = Suspenso”,nota);if ((nota>=5) && (nota<7))
printf(“Nota %d = Aprobado”,nota);if ((nota>=7) && (nota<9))
printf(“Nota %d = Notable”,nota);if ((nota>=9) && (nota<10))
printf(“Nota %d = Sobresaliente”,nota);if (nota==10)
printf(“Nota %d = Matricula”,nota);}
Versión con ifsecuenciales
void main(){int nota;printf(“Déme una calificación”); scanf(“%d”,¬a);
if ((nota<0)||(nota>10))printf(“Calificación desconocida”);
else if (nota<5) printf(“Nota %d = Suspenso”,nota);else
if (nota<7) printf(“Nota %d = Aprobado”,nota);else
if (nota<9) printf(“Nota %d = Notable”,nota);else
if (nota<10)printf(“Nota %d = Sobresaliente”,nota);
elseprintf(“Nota %d = Matricula”,nota);
}
Versión con if anidados
35
void main(){int nota;printf(“Déme una calificación”); scanf(“%d”,¬a);switch (nota)
{case 0:case 1:case 2:case 3:case 4: printf(“Nota %d = Suspendido”,nota); break;case 5:case 6: printf(“Nota %d = Aprobado”,nota); break; case 7:case 8: printf(“Nota %d = Notable”,nota); break;case 9: printf(“Nota %d = Sobresaliente”,nota); break;case 10: printf(“Nota %d = Matricula”,nota); break;default : printf(“Nota desconocida”);}
}
Versión con switch
Inconvenientes de switchNo se puede emplear cuando la elección está basada en una comparación de variables o expresiones de tipo float.No se puede usar cuando la variable estácomprendida en un cierto rango y no es un valor concreto.Se deben usar constantes como etiquetas, no variables. En general, switch es más eficiente que if.
36
Ejemploif (n < 100 && n > 2) ...
switch (n){case 3:case 4:...case 99: ...}
La versión con if es más corta y más eficiente.
Con switch hay que escribir todos los posibles valores.
EjercicioEscribir un programa que construya una calculadora básica.
Debe mostrarse un menú con las siguientes opciones: suma, resta, multiplicación, división, raíz cuadrada y potencia.
Se debe de elegir una operación. Para la opción elegida se piden y validan los datos de la opción correspondiente y se realiza la operación correspondiente.
37
Utilizar:
Función sqrt(a): obtiene la raíz cuadrada de a.
Función pow(a, b): obtiene a elevado a b.
AlgoritmoMostrar el menú.Pedir al usuario la opción del menú.Realizar la operación según la opción:
Si la operación es sumar:Pedir dos valores al usuarioSumarlos
Si la operación es restar:Pedir dos valores al usuarioRestarlos
Si la operación es multiplicar:Pedir dos valores al usuarioMultiplicarlos
Si la operación es dividir:Pedir dos valores al usuarioSi divisor ≠ 0
DividirlosSi la operación es raíz cuadrada:
Pedir un valor al usuarioSi valor >0
Calcular raízSi la operación es potencia:
Pedir dos valores al usuarioCalcular ab
38
Menú
#include <stdio.h>#include <math.h>void main(){int opcion;float a, b;
printf("Menú\n");printf("1. Sumar.\n");printf("2. Restar.\n");printf("3. Multiplicar.\n");printf("4. Dividir.\n");printf("5. Raíz cuadrada.\n");printf("6. Potencia.\n");printf("Opción elegida: ");scanf("%d",&opcion);
switch(opcion){case 1: /* Sumar */
printf("Introduce los valores a sumar (a+b): ");scanf("%f%f", &a, &b);printf("%f + %f = %f\n", a, b, a+b);break;
case 2: /* Restar */printf("Introduce los valores a restar (a-b): ");scanf("%f%f", &a, &b);printf("%f - %f = %f\n", a, b, a-b);break;
case 3: /* Multiplicar */printf("Introduce los valores a multiplicar (a*b): ");scanf("%f%f", &a, &b);printf("%f * %f = %f\n", a, b, a*b);break;
39
case 4: /* Dividir */printf("Introduce los valores a dividir (a/b): ");scanf("%f%f", &a, &b);if (b==0) printf("Divisor 0\n");else printf("%f / %f = %f\n", a, b, a/b);break;
case 5: /* Raíz cuadrada */printf("Introduce el valor para calcular la raíz: ");scanf("%f", &a);if (a<0) printf("No se puede calcular la raíz cuadrada.\n");else printf("Raíz de %f = %f\n", a, sqrt(a));break;
case 6: /* Potencia */printf("Introduce los valores para calcular la potencia (a^b): ");scanf("%f%f", &a, &b);printf("%f^%f = %f\n", a, b, pow(a,b));break;
default: printf("Opción incorrecta.\n");}
}