Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: Ruffles en Abril 29, 2013, 01:14:48 am

Título: [Solucionado] Switch en C++
Publicado por: Ruffles en Abril 29, 2013, 01:14:48 am
Soy nuevo en esta comunidad asi que espero este sea el lugar correcto para posear esto
Apenas estoy aprendiendo C++ y quiero hacer un pequeño programa que me de 3 opciones "sumar, restar, y   multiplicar" pero cuando presiono la tecla que corresponde a la opcion es cuando tengo el problema espero me puedan ayudar


Código: [Seleccionar]
#include <iostream>
#include <stdio.h>

using namespace std;

void Addittion();
void Substraction();
void Multiplication();

int main()
{
    int a;
    int b;
    int c;
    cout << "Select an option by entering the number... \n";
    cout << "(1)Sum \n" << "(2)Rest \n" << "(3)Multiply \n";

    scanf("%d",&a);
    scanf("%d",&b);
    scanf("%d",&c);

    if(a==1){
        Addittion();
    }
    if(b==2){
        Substraction();
    }
    if(c==3){
        Multiplication();
    }

    return 0;
}

void Addittion()
{
    int num1;
    int num2;
    int sum;

    cout << "Enter a number \n";
    cin >> num1;

    cout << "Enter a second number \n";
    cin >> num2;

    sum = num1 + num2;

    cout << "The answer is " << sum << endl;
}

void Substraction()
{
        int rst1;
        int rst2;
        int rstAns;

        cout << "Enter a number \n";
        cin >> rst1;

        cout << "Enter a second number \n";
        cin >> rst2;

        rstAns = rst1 - rst2;
        cout << "The answer is " << rstAns <<endl;

}

void Multiplication()
{
    int mult1;
    int mult2;
    int multAns;

    cout << "Enter a number \n";
    cin >> mult1;

    cout << "Enter a number \n";
    cin >> mult2;

    multAns = mult1 + mult2;

    cout << "The Answer is" << multAns << endl;
}
Título: Re:Problema con C++
Publicado por: Ruffles en Abril 29, 2013, 01:34:29 am
Oh al parecer ya había un caso como el mio lo leí y lo entendí un poco, no conocía el comando "case" me sirvió mucho si leen esto no se molesten en solucionar el problema, seria mejor si me explicaran en terminos muy simples para que sirve el comando "switch"

Asi es como lo solucione por si alguien necesita saber..
Código: [Seleccionar]
#include <iostream>
#include <stdio.h>

using namespace std;

void Addittion();
void Substraction();
void Multiplication();

int main()
{
    int a;
    cout << "Select an option by entering the number... \n";
    cout << "(1)Sum \n" << "(2)Rest \n" << "(3)Multiply \n";

    a=getchar();

    switch(a){
    case '1':
        Addittion();

    case '2':
        Substraction();

    case '3':
        Multiplication();
    }

    return 0;
}

void Addittion()
{
    int num1;
    int num2;
    int sum;

    cout << "Enter a number \n";
    cin >> num1;

    cout << "Enter a second number \n";
    cin >> num2;

    sum = num1 + num2;

    cout << "The answer is " << sum << endl;
}

void Substraction()
{
        int rst1;
        int rst2;
        int rstAns;

        cout << "Enter a number \n";
        cin >> rst1;

        cout << "Enter a second number \n";
        cin >> rst2;

        rstAns = rst1 - rst2;
        cout << "The answer is " << rstAns <<endl;

}

void Multiplication()
{
    int mult1;
    int mult2;
    int multAns;

    cout << "Enter a number \n";
    cin >> mult1;

    cout << "Enter a number \n";
    cin >> mult2;

    multAns = mult1 * mult2;

    cout << "The Answer is " << multAns << endl;
}


De nuevo tuve problemas, al parecer me falto el comando "break" no creí que fuera necesario, les agradecería si alguien me dijera como hacerle para que cuando presionen otro carácter que no sea una de las opciones, me pida una opción valida sin terminar el programa (espero haberme explicado)

y aqui otra ves el codigo despues de haber corregido algunos errores xD
Código: [Seleccionar]
#include <iostream>
#include <stdio.h>

using namespace std;

void Addittion();
void Substraction();
void Multiplication();

int main()
{
    int a;
    cout << "Select an option by entering the number... \n";
    cout << "(1)Sum \n" << "(2)Rest \n" << "(3)Multiply \n";

    a=getchar();

    switch(a){
    case '1':
        Addittion();
        break;

    case '2':
        Substraction();
        break;

    case '3':
        Multiplication();
        break;
    }

    return 0;
}

void Addittion()
{
    int num1;
    int num2;
    int sum;

    cout << "Enter a number \n";
    cin >> num1;

    cout << "Enter a second number \n";
    cin >> num2;

    sum = num1 + num2;

    cout << "The answer is " << sum << endl;
}

void Substraction()
{
        int rst1;
        int rst2;
        int rstAns;

        cout << "Enter a number \n";
        cin >> rst1;

        cout << "Enter a second number \n";
        cin >> rst2;

        rstAns = rst1 - rst2;
        cout << "The answer is " << rstAns <<endl;

}

void Multiplication()
{
    int mult1;
    int mult2;
    int multAns;

    cout << "Enter a number \n";
    cin >> mult1;

    cout << "Enter a number \n";
    cin >> mult2;

    multAns = mult1 * mult2;

    cout << "The Answer is " << multAns << endl;
}
Título: Re:Problema con C++
Publicado por: Weyne en Abril 29, 2013, 01:46:17 am
Hola @Ruffles,

"if" sirve para condiciones simples, en cambio "switch" sirve para condiciones mas amplias como en este caso.


http://ejemplos.mis-algoritmos.com/Uso-basico-del-Switch
Título: Re:Problema con C++
Publicado por: Ruffles en Abril 29, 2013, 01:56:45 am
Muchas gracias Weyne, me gusta cuando me dan respuestas simples pero comprensibles 
Título: Re:Problema con C++
Publicado por: CrozzCyborg en Abril 29, 2013, 03:53:00 am
._. ahm bueno mira una recomendacion es que podrias no usar la libreria stdio.h ya que esa es de C en tal caso de que no la uses entonces esta parte estaria mal:
Código: [Seleccionar]
a=getchar();
ya que es de la libreria stdio.h, tendrias que asignar el valor de la variable con "cin" de esta forma

Código: [Seleccionar]
cin >> a;
y harian exactamente lo mismo. Además en el switch no deberias de usar comillas simples para los números '1' , '2' , '3' deberias de ponerlos tal cual de esta forma:

Código: [Seleccionar]
    switch(a){
    case 1:
        Addittion();
        break;

    case 2:
        Substraction();
        break;

    case 3:
        Multiplication();
        break;
    }

en cuanto a lo de "les agradecería si alguien me dijera como hacerle para que cuando presionen otro carácter que no sea una de las opciones, me pida una opción valida sin terminar el programa (espero haberme explicado)" puedes hacerlo con un bucle y usando el default en el switch, algo asi:

Código: [Seleccionar]
    int a = 0;
    cout << "Select an option by entering the number... \n";
    cout << "(1)Sum \n" << "(2)Rest \n" << "(3)Multiply \n";

while(!a)
{
cin >> a;

switch(a){
case 1:
Addittion();
break;

case 2:
Substraction();
break;

case 3:
Multiplication();
break;

default:
cout << "Introduce una opcion valida: ";
a = 0;
}
}

Si no entiendes una parte creo que podria explicarte, espero te sirva.
Título: Re:Problema con C++
Publicado por: CrozzCyborg en Abril 29, 2013, 03:55:42 am
Casi lo olvido. por si acaso te pongo también todo el code como lo deje al final cambiando las cosas que te dije:

Código: [Seleccionar]
#include <iostream>

using namespace std;

void Addittion();
void Substraction();
void Multiplication();

int main()
{
    int a = 0;
    cout << "Select an option by entering the number... \n";
    cout << "(1)Sum \n" << "(2)Rest \n" << "(3)Multiply \n";

while(!a)
{
cin >> a;

switch(a){
case 1:
Addittion();
break;

case 2:
Substraction();
break;

case 3:
Multiplication();
break;

default:
cout << "Introduce una opcion valida: ";
a = 0;
}
}

    return 0;
}

void Addittion()
{
    int num1;
    int num2;
    int sum;

    cout << "Enter a number \n";
    cin >> num1;

    cout << "Enter a second number \n";
    cin >> num2;

    sum = num1 + num2;

    cout << "The answer is " << sum << endl;
}

void Substraction()
{
        int rst1;
        int rst2;
        int rstAns;

        cout << "Enter a number \n";
        cin >> rst1;

        cout << "Enter a second number \n";
        cin >> rst2;

        rstAns = rst1 - rst2;
        cout << "The answer is " << rstAns <<endl;

}

void Multiplication()
{
    int mult1;
    int mult2;
    int multAns;

    cout << "Enter a number \n";
    cin >> mult1;

    cout << "Enter a number \n";
    cin >> mult2;

    multAns = mult1 * mult2;

    cout << "The Answer is " << multAns << endl;
}
Título: Re:Switch en C++
Publicado por: JAG en Abril 29, 2013, 08:57:50 am
Bien!! Venía a contestarte pero ya veo que lo han hecho correctamente jejeje así que solo vengo para cambiar el título del post por uno más descriptivo. Me gustaría que de aquí en adelante si ven un post el cual creen ustedes que debería tener otro título que describiese mejor la pregunta podrían usar el botón de "reportar al moderador".
En cuanto a tu problema, como digo lo veo resuelto... avísanos si tienes alguna duda o si ya podemos dar por solucionado el post.
Saludos!!
Título: Re:Switch en C++
Publicado por: Ruffles en Abril 29, 2013, 11:10:00 pm
Gracias CrozzCyborg, no sabia que la librería studio.h era de C... lo de las comillas simples no sabia si importaban o no cuando lei otro post así que las puse, bueno hasta ahí todo lo entendí bien pero me gustaría que me expliques esta parte:
Código: [Seleccionar]
While(!a)
y otras preguntas que me quedron son
porque asignaste el valor "0" a la vriable "a" si de todas maneras el usuario es quien le asigna el valor a la variable?
afectaria no darle el valor de cero?
ya se que es un bucle, pero que significa el comando "default" o cual es su funcion?

muchas gracias por su paciencia xD
Título: Re:Switch en C++
Publicado por: CrozzCyborg en Abril 29, 2013, 11:34:49 pm
Gracias CrozzCyborg, no sabia que la librería studio.h era de C... lo de las comillas simples no sabia si importaban o no cuando lei otro post así que las puse, bueno hasta ahí todo lo entendí bien pero me gustaría que me expliques esta parte:
Código: [Seleccionar]
While(!a)
y otras preguntas que me quedron son
porque asignaste el valor "0" a la vriable "a" si de todas maneras el usuario es quien le asigna el valor a la variable?
afectaria no darle el valor de cero?
ya se que es un bucle, pero que significa el comando "default" o cual es su funcion?

muchas gracias por su paciencia xD

Si afectaria, mira.. el bucle while funciona de la siguiente forma, con esta sintaxis:

Código: [Seleccionar]
while(a){
    ....
}

nos indica que mientras la variable "a" sea true se va a ejecutar lo que esta dentro de las llaves, lo que hacemos en el programa con el signo ! es negar la variable, si la variable es true dara false, y si es false es true (espero haberme explicado) entonces a la hora de declarar la variable le damos el valor 0 para que sea false (y luego en el while la negamos para que mande true y SI se ejecute el bucle while)

Ahora en el switch el default sirve algo parecido a un else, cuando no se cumple ninguna condicion de los "case" entonces se ejecuta lo del default.

El programa lo que hace es primero asignar la variable a 0 para que sea equivalente a false, ya dentro del bucle el usuario le da un valor, si este valor no es ninguno de los que hemos pensado entonces se ejecutara lo del default lo cual volvera a asignar la variable a 0 haciendo que nuestro bucle se repita, en cambio si el valor de la variable corresponde con los que hemos pensado este valor no se modificara, al tener un valor diferente a 0 la variable es equivalente a true y como en el bucle esta siendo negada sera false y dara por terminado el bucle xD espero explicarme bien. Suerte.
Título: Re:Switch en C++
Publicado por: Ruffles en Abril 30, 2013, 12:08:19 am
de nuevo muchas gracias Crozz, tarde en entenderte pero al final lo comprendí, bueno al parecer eso es todo, ya pueden dar el tema por solucionado
Título: Re:[Solucionado] Switch en C++
Publicado por: ravenheart en Mayo 11, 2013, 04:06:16 pm
"if" sirve para condiciones simples, en cambio "switch" sirve para condiciones mas amplias como en este caso.

Incorrecto. Es más bien al revés. "switch" sirve para condiciones simples, normalmente sólo sirve para comprobar si el valor de la variable es igual a una constante. "if" sirve para evaluar cualquier condición que seas capaz de expresar.

Por ejemplo:
Código: [Seleccionar]
if (a == 1)
{
   //caso 1
   ...
}
else if (a == 2)
{
   //caso 2
   ...
}
else if (a == 3)
{
   //caso 3
   ...
}
...

Se puede reemplazar con un switch:
Código: [Seleccionar]
switch (a)
{
    case 1:
        //caso 1
        ...
        break;
    case 2:
        //caso 2
        ...
        break;
    case 3:
        //caso 3
        ...
        break;
    ...
    default:
        //cualquier otro caso no especificado
        ...
        break;
}

Ahora, si tienes condiciones más complejas:
Código: [Seleccionar]
if (a >= 1 && a <= 10)
{
   //caso 1
   ...
}
else if ((b % 5) == 0)
{
   //caso 2
   ...
}
...

No hay forma posible de hacer un switch equivalente.

La ventaja del switch es que es muy rápido. Si tienes un if muy largo, se tienen que hacer todas las comparaciones hasta que se encuentra la buena. En el caso del switch, el compilador es capaz de calcular dónde tiene que entrar, sin hacer todas las comparaciones anteriores.

Yo personalmente NUNCA utilizo switch, porque la sintaxis es muy engorrosa: añade dos niveles de tabulación, hay que poner el break en cada caso (y si se te olvida la puedes liar) y, en definitiva, es muy largo. El aumento de velocidad es marginal, y cualquier compilador digno de ese nombre debería ser capaz de optimizar el if, convirtiéndolo en un switch internamente cuando sea posible.