Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre una evolucion del condicional if atraves de este metodo, el cual nos permitira tambien tomar decisiones pero de una mejor forma y en algunos casos mas practica.

Anuncios

Este metodo se compone de varias partes que pasaremos a detallar:

switch (variable)
{
	case valor1:
		... instrucciones ...
		break;
	case valor2:
		... instrucciones ...
		break;
	........
	case valorN:
		... instrucciones ...
		break;
	default:
		... instrucciones ...
		break;
}	
Anuncios

Siempre sera el metodo, switch, seguido por la variable que vamos a verificar, solamente la variable, despues tendremos un bloque de llaves donde ocurrira la magia, en este metodo nos encargaremos de evaluar todos los valores que puede poseer la variable que informemos, para chequear este valor usaremos la palabra case junto al valor que queremos verificar, si coincide el valor con el del case procede a ejecutar las instrucciones y una vez que termina se encuentra con un break que lo hace salir de la estructura de control, de los case podemos tener todos los que sean necesarios, siempre con la misma estructura pero siempre el ultimo valor va a ser default, este se encargara de ejecutar las instrucciones cuando ninguna de las condiciones anteriores se cumplan, equivaldria al else de if, puede sonar complicado pero no lo es tanto, vamos a verlo a traves de un ejemplo.

Para ello por medio del notepad y el compilador vamos a generar una pequeña aplicacion, crearemos un archivo llamado switch.cs y le agregaremos el siguiente codigo:

switch.cs

using System;

public class Program
{
    public static void Main()
    {
        for(;;)
        {    
            int valor;
            Console.WriteLine("Elige un valor:");
            Console.WriteLine("(1) para mostrar un mensaje");
            Console.WriteLine("(2) para mostrar otro mensaje");
            Console.WriteLine("(3) para salir del programa");
            Console.Write("Elige un valor:");
            valor = int.Parse(Console.ReadLine());
            switch(valor)
            {
                case 1:
                    Console.WriteLine("Caso 1");
                    break;
                case 2:
                    Console.WriteLine("Caso 2");
                    break;
                case 3:
                    break;
                default:
                    Console.WriteLine("Debes elegir una opcion!");
                    break;
            }
            if (valor == 3)
                break;
        }
        Console.Write("Adios, Amiguito!");
    }    
}
Anuncios

En este caso tendremos un menu simple de tres valores, para este caso usaremos un bucle for infinito, luego crearemos una variable de tipo int llamada valor, las 5 siguientes lineas seran el menu que veremos en pantalla, para luego usar un Console.Readline para leer el valor que ingresemos y lo almacenara en valor.

Nota: Como ReadLine siempre lo que lee lo hace en string para poder pasarlo al mismo formato de valor usamos el int.Parse.
Anuncios

Para nuestro siguiente paso analicemos el bloque del switch:

            switch(valor)
            {
                case 1:
                    Console.WriteLine("Caso 1");
                    break;
                case 2:
                    Console.WriteLine("Caso 2");
                    break;
                case 3:
                    break;
                default:
                    Console.WriteLine("Debes elegir una opcion!");
                    break;
            }
Anuncios

En este bloque primero recibira a valor y lo enviara a switch, dentro del bloque tenemos tres case y default, el primer case mira si valor es igual a 1, en caso de ser cierto muestra el mensaje en pantalla, luego por medio del break salta el resto de los cases, en el caso del case 2 verifica si valor es igual a 2, en caso de ser cierto muestra el mensaje e ignora el resto del codigo, el case 3 no hace nada pero tiene un break para omitir a default, este tambien se activa igual que los anteriores, y al default lo tenemos en caso de que no hayamos ingresado ningun valor entre 1 y 3, pero porque tenemos un case 3 vacio? Esto es debido a que si no lo tuvieramos cada vez que ingreasaramos el 3 llamaria al default, en cualquier caso cuando sale del switch, ya sea por case o default, se encuentra con esto:

            if (valor == 3)
                break;
Anuncios

En este caso tenemos un condicional fuera del switch, donde verifica si valor es igual a 3, en caso de ser cierto sale del bucle for, para finalmente mostrarnos un mensaje de salida, veamos el codigo en accion:

Anuncios

En el video podemos ver como funciona perfectamente nuestro menu, inclusive cuando ingresamos un valor fuera del rango establecido, otra opcion interesante que soportan los cases son operaciones, por ejemplo podemos modificar el switch de la siguiente manera:

            switch(valor)
            {
                case 1 + 1 - 1:
                    Console.WriteLine("Caso 1");
                    break;
                case ((10 + 20) / 15):
                    Console.WriteLine("Caso 2");
                    break;
                case 3:
                    break;
                default:
                    Console.WriteLine("Debes elegir una opcion!");
                    break;
            }
Anuncios

En el primer case si hacemos la cuenta nos devolvera 1, porque le sumamos y le restamos 1, en el segundo case equivale a 2 porque hacemos la division de 30 contra 15 y nos devolvera 2, esto nos permite una gran flexibilidad para hacer coincidir el valor de la variable con los case, lo que no podemos usar son variables y tampoco operadores relacionales o logicos, como los visto cuando hablamos de if en este post, pero despues podemos usar cualquier tipo de valor, ya sea int, string, char, float, double, etc, para ver este concepto y otro mas vamos a modificar el codigo anterior de la siguiente manera:

using System;

public class Program
{
    public static void Main()
    {
        string opcion, menu;
        int valor = 0;
        for(;;)
        {
            menu = "";    
            Console.WriteLine("Bienvenidos al McTinchicus:");
            Console.WriteLine("Elija al Tamaño de su gaseosa:");
            Console.WriteLine("(1) Pequeña");
            Console.WriteLine("(2) Mediana");
            Console.WriteLine("(3) Grande");
            Console.Write("Elige un valor:");
            opcion = Console.ReadLine();
            switch(opcion)
            {
                case "1":
                case "pequeña":
                    if (menu == "")
                        menu = "Gaseosa pequeña";
                    valor += 25;
                    break;
                case "2":
                case "mediana":
                    menu = "Gaseosa mediana";
                    valor += 25;
                    goto case "1";
                case "3":
                    menu = "Gaseosa grande";
                    valor += 50;
                    goto case "1";
                default:
                    menu = "mal";
                    Console.WriteLine("Elija entre las opciones.");
                    break;
            }
            if (menu!="mal")
                break;
        }
        Console.Write("Ud. eligio " + menu + ", su valor es de $" + valor);
    }    
}
Anuncios
Anuncios

Para este caso usamos un ejemplo un poco mas real donde tenemos a nuestra cadena de comida rapida favorita: McTinchicus, en la cual nos pregunta de que tamaño queremos la gaseosa (pequeña, mediana o grande) con la opcion de poder ingresar los numeros tambien, primero crearemos tres variables por fuera del ciclo for:

        string opcion, menu;
        int valor = 0;

En este caso volveremos a usar el ciclo for pero para repetir todo en caso de nos equivoquemos de opciones, nuestra primer linea del bloque sera setear a menu con nada o vacio, no nulo, luego mostraremos el mensaje en pantalla, para luego dejar un Console.ReadLine para que ingresemos las opciones, en este ejemplo, eliminamos a valor y usamos opcion y de tipo string, esto nos permitira recibir tanto el numero como la descripcion, una vez recibido pasaremos al switch, analicemos el bloque correspondiente:

            switch(opcion)
            {
                case "1":
                case "pequeña":
                    if (menu == "")
                        menu = "Gaseosa pequeña";
                    valor += 25;
                    break;
                case "2":
                case "mediana":
                    menu = "Gaseosa mediana";
                    valor += 25;
                    goto case "1";
                case "3":
                case "grande":
                    menu = "Gaseosa grande";
                    valor += 50;
                    goto case "1";
                default:
                    menu = "mal";
                    Console.WriteLine("Elija entre las opciones.");
                    break;
            }
Anuncios

En este bloque vemos como se recibe a opcion, observen como ahora los numeros estan entre comillas, esto se debe a que ahora son de tipo string, si nosotros lo dejaramos sin comillas lo tomaria como numero y no habria coincidencia, vamos a analizar el primer case:

                case "1":
                case "pequeña":
                    if (menu == "")
                        menu = "Gaseosa pequeña";
                    valor += 25;
                    break;
Anuncios

Primero chequeara por el numero, como no tiene nada no ejecuta nada y como no tiene break pasara al siguiente case, en este caso pequeña, pasara directamente y en este caso tenemos un condicional if donde verifica si menu es igual a nada, en caso de ser cierto pasa a completarlo con el mensaje asignado, para luego sumarle a valor el numero 25, como encuentra break sale del switch, veamos el segundo case:

                case "2":
                case "mediana":
                    menu = "Gaseosa mediana";
                    valor += 25;
                    goto case "1";

En este caso es muy parecido al anterior porque primero chequea si vale 2 y en caso de ser cierto sigue al proximo case porque no tiene break, aca asigna a menu otro mensaje, le suma 25 a valor pero en lugar de usar un break tenemos esto:

goto case "1";
Anuncios

Esto nos hara “ir a” (go to) al case 1, donde como tenemos un condicional que modifica menu solo si es igual a nada de lo contrario no hace nada, manteniendo nuestro valor de menu, y vuelve a incrementar en 25 a valor, dando como resultado que valor tendra un valor, valga la redundancia, de 50 y por ultimo tenemos el siguiente case:

                case "3":
                case "grande":
                    menu = "Gaseosa grande";
                    valor += 50;
                    goto case "1";

Donde hace lo mismo que case 2 pero en lugar de sumar 25 a valor le suma 50 y tambien lo devuelve a case 1, como en el caso anterior ignora a menu lo deja con el valor actual y le vuelve a sumar 25 a valor, dejandolo en 75, para ir finalizando tenemos a default:

                default:
                    menu = "mal";
                    Console.WriteLine("Elija entre las opciones.");
                    break;
Anuncios

En este caso le ingresa a menu el valor de mal y nos muestra un mensaje en pantalla de que debemos elegir correctamente, este si posee un break para salir del switch y lo primero que encuentra es este condicional:

            if (menu!="mal")
                break;
Anuncios

Chequea que menu sea distinto de mal para ejecutar break y salir del bucle for, si viene de default procedera a volver al principio del bucle y volver a comenzar, en caso de salir del bucle nos aparecera la siguiente linea que mostrara el mensaje final con el tipo de gaseosa y el valor:

Console.Write("Ud. eligio " + menu + ", su valor es de $" + valor);
Anuncios

Ahora con todo explicado procedamos a compilar nuestro programa y veamos como es su salida en el siguiente video

Anuncios

En el video podemos ver como si se selecciona correctamente nos dice que tamaño de gaseosa es y cual es el valor de la misma y en caso de que ingresemos una opcion incorrecta procede a notificarlo y vuelve al menu principal.

Nota: como vimos en este ejemplo los cases pueden soportar cualquier tipo de instruccion entre el case y el break (o el goto), inclusive un if o llamar a otro metodo.
Anuncios

En resumen, hoy hemos visto a switch, que es, para que se usa, su sintaxis, las libertades que nos permite, como mejora el concepto de las condiciones, como podemos igualar las constantes de los cases, que puede haber en los case, y tambien un par de ejemplos, el primer de tipo prueba y el segundo mas cercano a la vida real, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00