2012 Sentencia de control switch M.Sc. Ana María Salgado Universidad Nacional Autónoma de Nicaragua - León Abril 2012 Sentencia switch Unidad IV: Estructuras de control Sentencia switch Selecciona entre varias alternativas dependiendo del valor de una variable. La estructura switch comienza con la palabra reservada switch seguida de una expresión entre paréntesis. Luego de esto vienen las etiquetas de selección a través de la palabra reservada case, ésta palabra debe tener como argumento obligatoriamente constantes enteras, por ejemplo, int, char, enum, pero no float, o string. En varios de los casos puede hacerse referencia a una misma acción, para ello se disponen en secuencia y la última cláusula case es la que hará referencia a la secuencia de instrucciones asociada. switch(c) { case 'a': printf("Op A\n"); break; case 'b': printf("Op B\n"); break; case 'c': case 'd': printf("Op C o D\n"); break; default: printf("Op ?\n"); } Por lo común la última instrucción antes de la siguiente etiqueta es la instrucción break, ésta palabra reservada provoca el abandono de la estructura switch. Si no existe una proposición break la ejecución continúa con las instrucciones de la siguiente etiqueta. La ausencia de instrucciones break es una causa de error frecuente en un switch. Por último puede haber una instrucción etiquetada como default y representa el caso en el que el valor de la expresión no coincida con ningún valor de las etiquetas utilizadas. No es necesario incluir la sentencia default. 2 M.Sc. Ana María Salgado G. Sentencia switch La forma general de esta sentencia es: switch (expresión) { case exp1: sentencia 1; sentencia 2; break; case exp2: sentencia1; sentencia2; break; case expN: sentencia N; break; default: sentencia D; } Ejemplo 1: Construya un pseudocódigo y el correspondiente programa en C, que al recibir como datos dos variables de tipo entero, obtenga el resultado de la siguiente función: T/5 Si OP = 1 T ** T Si OP = 2 6 * T/2 Si OP = 3,4 1 Para cualquier otro caso. f(T) = 3 M.Sc. Ana María Salgado G. Sentencia switch Pseudocódigo en PSEINT Proceso funcion Escribir "Ingrese la opcion del calculo y el valor entero:"; Leer OP,T; Segun (OP) Hacer 1: RES <- T/5; 2: RES <- T ^ T; 3,4: RES <- 6 * T/2; de Otro Modo: RES <- 1; FinSegun Escribir "Resultado:",RES; FinProceso 4 M.Sc. Ana María Salgado G. Sentencia switch Código en C: //funcion.c #include <stdio.h> #include <math.h> void main(void) { int OP, T; float RES; printf("Ingrese la opcion del calculo y el valor entero:"); scanf("%d %d",&OP,&T); switch(OP) { case 1: RES = T/5; break; case 2: RES = pow(T,T); break; case 3: case 4: RES = 6 * T/2; break; default: RES = 1; break; } printf("\nResultado: %.2f\n",RES); } Ejemplo 2: Realice un programa que simule una calculadora, de tal forma que: Si el usuario introduce +, sume dos números. Si el usuario introduce -, reste dos números. Si el usuario introduce *, multiplique dos números. Si el usuario introduce /, divida dos números. Asegúrese que el segundo operando no sea cero, ya que la división por cero no está permitida. Nota: No se realizó el pseudocódigo correspondiente, ya que PSEINT no permite que la variable asociada a SEGÚN, sea de tipo carácter. 5 M.Sc. Ana María Salgado G. Sentencia switch Código en C: //calculadora.c #include <stdio.h> #include <stdlib.h> double num1, num2, resp; char operacion; void main(void) { printf("Esta es una calculadora...\n\n"); printf("Ingrese dos numeros: "); scanf("%lf %lf",&num1,&num2); printf("Operacion?"); fflush(stdin); operacion = getchar(); switch(operacion) { case '+': resp = num1 + num2; break; case '-': resp = num1 - num2; break; case '*': resp = num1 * num2; break; case '/': if(num2 != 0) resp = num1 / num2; else { printf("Division por cero no valida\n"); exit(0); } break; 6 M.Sc. Ana María Salgado G. Sentencia switch default: puts("Operacion invalida"); } printf("%g %c %g = %g \n\n",num1,operacion,num2,resp); } Ejemplo 3: Construya un pseudocódigo y su correspondiente programa en C, que al recibir como datos el nivel académico de un profesor de una universidad así como su salario, incremente éste último siguiendo las especificaciones de la tabla e imprima tanto el nivel del profesor como su nuevo salario. Use enumerados. Nivel Profesor adjunto Profesor auxiliar Profesor asistente Profesor titular Incremento 3.5% 4.1% 4.8% 5.3% Pseudocódigo en PSEINT: Proceso profesor adjunto <- 1; auxiliar <- 2; asistente <- 3; titular <-4; Escribir "Categorias de profesor universitario:"; Escribir "---------------------------------------"; Escribir "1. Profesor adjunto"; Escribir "2. Profesor auxiliar"; Escribir "3. Profesor asistente"; Escribir "4. Profesor titular"; Escribir "Ingrese el nivel academico del profesor: "; Leer nivel; Escribir "Ingrese el salario: "; Leer sal; 7 M.Sc. Ana María Salgado G. Sentencia switch Segun (nivel) Hacer adjunto: sal <- sal * 1.0035; auxiliar: sal <- sal * 1.0041; asistente: sal <- sal * 1.0048; titular: sal <- sal * 1.0053; de Otro Modo: Escribir "Categoria incorrecta"; FinSegun Escribir "Nivel: ",nivel; Escribir "Nuevo salario: ",sal; FinProceso 8 M.Sc. Ana María Salgado G. Sentencia switch Código en lenguaje C: //profesor.c #include <stdio.h> #include <stdlib.h> void main(void) { enum profesor { adjunto = 1, auxiliar, asistente, titular }; enum profesor nivel; float sal; printf("Categorias de profesor universitario:\n"); printf("---------------------------------------\n"); printf("1. Profesor adjunto\n"); printf("2. Profesor auxiliar\n"); printf("3. Profesor asistente\n"); printf("4. Profesor titular\n"); printf("Ingrese el nivel academico del profesor: "); scanf("%d",&nivel); printf("Ingrese el salario: "); scanf("%f",&sal); switch(nivel) { case adjunto: sal = sal * 1.0035; break; case auxiliar: sal = sal * 1.0041; break; case asistente: sal = sal * 1.0048; break; 9 M.Sc. Ana María Salgado G. Sentencia switch case titular: sal = sal * 1.0053; break; default: printf("Categoria incorrecta\n"); exit(0); } printf("\n\nNivel: %d \tNuevo salario: %.2f\n",nivel,sal); } Ejemplo #4: Realice un algoritmo que permita la conversión entre euros y pesetas. Pseudocódigo en PSEINT: Proceso conversionMoneda euro <-166.386; Escribir "1-Pesetas a Euros"; Escribir "2-Euros a pesetas"; Escribir "Ingrese la opcion:"; Leer opcion; Escribir "Introduzca la cantidad: " Leer n; Segun opcion Hacer 1: x <- n/euro; Escribir n," Pesetas son ",x, " Euros"; 2: x <- n*euro; Escribir n," Euros son ",x," Pesetas"; De Otro Modo: Escribir "Opcion Incorrecta"; FinSegun FinProceso 10 M.Sc. Ana María Salgado G. Sentencia switch Diagrama de flujo: Código en C: /* Conversión entre euros y pesetas */ #include <stdio.h> #define euro 166.386 void main(void) { float n,x; int opcion; printf("Introduzca la cantidad: "); scanf("%f",&n); printf(" 1-Ptas a Euros\n 2-Euros a ptas\n"); printf("Ingrese la opcion:"); scanf("%d",&opcion); switch(opcion) { case 1: x=n/euro; printf("\n%g Pesetas son %.2f Euros\n",n,x); break; case 2: x=n*euro; printf("\n%.2f Euros son %g Pesetas\n",n,x); break; default: printf("\nOpcion Incorrecta"); } } 11 M.Sc. Ana María Salgado G. Sentencia switch Ejemplo #5: Realice un programa que convierta de grados centígrados a Fahrenheit y viceversa. Utilice enumerados. //conversionfahrent.c #include <stdio.h> #include <stdlib.h> enum conversion { centfahr = 1, fahrcent }; enum conversion opcion; float f, c; void main(void) { printf("1 - Convertir de centigrados a fahrenheit\n"); printf("2 - Convertir de fahrenheit a centigrados\n"); printf("\nIngrese la opcion deseada: "); scanf("%d", &opcion); switch (opcion) { case centfahr: printf("\nGrados centigrados?:"); scanf("%f",&c); f = 9.0/5.0 * c + 32; printf("%.2f centigrados equivalen a %.2f grados fahrenheit\n\n",c,f); break; case fahrcent: printf("\nGrados fahrenheit?: "); scanf("%f", &f); c = 5.0/9.0 * (f - 32); printf("%.2f fahrenheit equivalen a %.2f grados centigrados\n\n",f,c); break; default: printf("\nOpcion incorrecta\n"); exit(0); /* error; salir de main */ } } 12 M.Sc. Ana María Salgado G. Sentencia switch Ejemplo #6: En el siguiente programa una persona ingresa el mes y el día de su cumpleaños. La salida es la estación en que ocurre el nacimiento de la persona: otoño, invierno, primavera o verano. Se usan los 4 puntos notables en Septiembre 21, Diciembre 21, Marzo 21 y Junio 21 como las fronteras o límite de las estaciones. //estanaci.c #include <stdio.h> /*IMPRIME LA ESTACION DE NACIMIENTO A PARTIR DEL MES Y DEL DIA*/ int mes,dia; char estacion[20]; void main(void) { printf("Escriba con numeros el mes y el dia de su cumplea¤os:\n"); scanf("%d %d",&mes,&dia); switch(mes) { case 1: case 2: strcpy(estacion,"invierno"); break; case 4: case 5: strcpy(estacion,"primavera"); break; case 7: case 8: strcpy(estacion,"verano"); break; case 10: case 11: strcpy(estacion,"oto¤o"); break; case 3: if(dia < 21) strcpy(estacion,"invierno"); else strcpy(estacion,"primavera"); break; case 6: if(dia < 21) strcpy(estacion,"primavera"); else 13 M.Sc. Ana María Salgado G. Sentencia switch strcpy(estacion,"verano"); break; case 9: if(dia < 21) strcpy(estacion,"verano"); else strcpy(estacion,"oto¤o"); break; case 12: if(dia < 21) strcpy(estacion,"oto¤o"); else strcpy(estacion,"invierno"); break; default: printf("Mes invalido"); exit(-1); } printf("Usted nacio en %s\n",estacion); } Ejercicios propuestos sobre switch 1. Realice un programa tal que, al ingresar un carácter, determine si éste es una vocal en mayúscula o minúscula, o es una consonante. 2. Realizar un programa que permita ingresar un número correspondiente a los días de una semana y muestre el nombre del día. Que se permita trabajar hasta que el usuario indique lo contrario. Use switch. 3. Construya un pseudocódigo y el correspondiente programa en C, que permita calcular el valor de f(x) según la siguiente expresión: Y3 Si (Y mod 4) = 0 (Y2 – 14) / Y3 Si (Y mod 4) = 1 Y3 + 5 Si (Y mod 4) = 2 f(x) = Si (Y mod 4) = 3 14 M.Sc. Ana María Salgado G. Sentencia switch 4. Una empresa de telecomunicaciones canadiense ofrece servicio de callback a un precio atractivo. El costo de las llamadas telefónicas depende tanto del lugar de origen de la llamada como de la zona geográfica en la que se encuentre el país destino. En la siguiente tabla se presenta el costo por 60 segundos para las llamadas originadas en México. Clave 1 2 5 6 7 9 10 15 20 Zona Estados Unidos Canadá América del Sur América Central México Europa Asia Africa Oceanía Precio 0.13 0.11 0.22 0.19 0.17 0.17 0.20 0.39 0.28 Realice un programa que le permita calcular e imprimir el costo total de una llamada telefónica, considerando tanto la zona como la duración de la llamada. Escriba la primera versión usando la clave como selector del switch. Diseñe una segunda versión, utilizando un enumerado para la zona, siendo ésta el selector del switch. 5. En un spa de Ixtapan de la Sal, realizaron un análisis de los clientes registrados en los últimos 5 años, con el objeto de conocer de los gastos de internación de cada cliente. Construya un programa en C que calcule el costo de internación de un cliente, según los datos de la siguiente tabla. Se sabe que los clientes mayores de 60 años tienen un descuento del 25% y los clientes menores de 25 años, de 15%. Tipo de tratamiento 1 2 3 4 Costo/Cliente/Día 2800 1950 2500 1150 6. Hacer un programa que imprima el nombre de un artículo, clave, precio original y su precio con descuento. El descuento lo hace en base a la clave, si la clave es 1 el descuento es del 10% y si la clave es 2 el descuento es del 20% (solo existen dos claves). 7. Escriba un programa que calcule el importe a pagar por un vehículo al circular por una autopista. El vehículo puede ser una bicicleta, una moto, un coche, o un camión. Para definir el conjunto vehículos utilizaremos un tipo enumerado. El importe se calculará según los siguientes datos: Un importe fijo de 100 córdobas para las bicicletas. 15 M.Sc. Ana María Salgado G. Sentencia switch Las motos y los carros pagarán 30 córdobas por Km. Los camiones pagarán 30 córdobas por Km más 25 córdobas por Tm La presentación en pantalla de la solución, será de la forma siguiente: 1. bicicleta 2. moto 3. carro 4. camión 5. salir Seleccione la opción deseada: 4 Kilómetros y toneladas? 100 50 Importe = 4250 8. Escriba un programa tal, que dados como datos el modelo de un vehículo y su precio, determine el valor final que debe pagar el comprador. El concesionario está haciendo descuentos teniendo en cuenta el modelo, con base en la siguiente tabla: Modelo Cutlass Cavalier Chevy Century Descuento 8% 5% 6% 9% Haga uso de una enumeración. Defínala como un nuevo tipo. Además, utilice break y una opción por defecto que imprima “El modelo no es válido”. Bibliografía Ceballos Francisco Javier. Curso de Programación C/C++ . Segunda Edición. Editorial RAMA, Madrid, 2002. Joyanes Aguilar Luis, Zahonero Martínez Ignacio. Programación en C. Metodología, estructura de datos y objetos. Mc Graw Hill. Byron S. Gottfried . Programación en C. Mc Graw Hill. H.M. Dietel – P. J. Dietel . Como Programar en C/C++ . Segunda Edición. Prentice Hall. Hernández María Lourdes. Diseño estructurado de algoritmos. Diagramas de flujos y pseudocódigos. Universidad de Teuxtepe, México. 16 M.Sc. Ana María Salgado G.