Resultados 1 al 5 de 5

Tema: Ayuda con este codigo C++



  1. #1
    Chapuzillas Junior
    Fecha de ingreso
    13 ago, 19
    Ubicación
    Gijón, Asturias
    Mensajes
    2
    Agradecido: 1

    Ayuda con este codigo C++

    Hola, soy un poco novato en la programación y tengo un simple código que no soy capaz de compilar...
    A ver si alguien me puede ayudar. El codigo es este:


    #include "pch.h"
    #include "string"
    #include <iostream>


    using namespace std;


    int main(){


    string nombre;
    int edad;


    cout << "Hola, sea usted bienvenido a la central de bomberos." << endl << "Por favor introduzca su nombre completo" << endl;

    cin >> nombre;


    cout << "Ahora, por favor introduzca su edad" << endl;


    cin >> edad;


    if (edad >= 18) {

    cout << "Perfecto, es usted apto para ser bombero." << endl;


    }


    else {


    cout << "Lo sentimos mucho, pero usted no es apto para ser bombero debido a su edad." << endl;


    exit(-1);
    }


    cout << "Ingrese la modalidad:";

    string modalidad;
    cin >> modalidad;


    switch (modalidad)
    {
    case "bombero": cout << "Usted ha seleccionado ser BOMBERO";
    break;
    case "oficinista": cout << "Usted ha seleccionado ser OFICINISTA";
    break;
    case "comunicador": cout << "Usted ha seleccionado ser CONTROLADOR";
    break;


    default: cout << "Usted ha ingresado una modalidad no valida";
    }
    }


    Gracias de antemano...Ayuda con este codigo C++Ayuda con este codigo C++


    Cabe destacar que el error se encuentra en la funcion switch. La verdad no se si se pueden utilizar "strings" dentro de switch, ya que si numero los casos en vez de darles un nombre si funciona...

  2. Los siguientes usuarios han agradecido a mrandina su comentario:


  3. #2
    Snorlax que impide el paso a los Troll
    Fecha de ingreso
    07 jul, 14
    Mensajes
    383
    Agradecido: 72
    Hasta donde yo se, en C/C++ los Switch son comparaciones numéricas únicamente.

    La forma de comparar String es mediante if y else if usando strcmp(string1, string2). En tu caso seria algo así:

    if (strcmp(modalidad, "bombero")) == 0){
    cout << "Usted ha seleccionado ser BOMBERO";
    } else if (strcmp(modalidad, "oficinista")) == 0){
    cout << "Usted ha seleccionado ser OFICINISTA";
    } else if (strcmp(modalidad, "comunicador")) == 0){
    cout << "Usted ha seleccionado ser CONTROLADOR";
    } else {
    cout << "Usted NO ha seleccionado algo valido";
    }


    El ultimo else puedes saltartelo, pero es recomendable tenerlo para control de errores.

    EDITO: Me falta decir que hay una manera de "hacer funcionar" los switch con strings, pero se trata de transformarlos mediante una "tabla" para que sean valores numéricos (Por ejemplo mediante un Hash), no obstante, no recomendaría eso a nadie, si que ganarías velocidad ejecución, pero la complejidad que supone implementarlo esta quizás por encima de los conocimientos que tienes ahora mismo.
    Última edición por Wonnie; 14/08/2019 a las 19:57 Razón: Indentaciones

  4. #3
    Chapuzillas Junior
    Fecha de ingreso
    13 ago, 19
    Ubicación
    Gijón, Asturias
    Mensajes
    2
    Agradecido: 1
    He probado tu comentario, pero no se por que no compilaba. Al final lo he conseguido con "else if" pero sin el strcmp. Ha quedado algo así:

    string modalidad;


    cin >> modalidad;


    if (modalidad == "Bombero") {


    cout << "Ha elegido usted ser BOMBERO";
    }
    else if (modalidad == "Oficinista") {


    cout << "Ha elegido usted ser Oficinista";
    }
    else if (modalidad == "Controlador") {


    cout << "Ha elegido usted ser Controlador" << endl << endl;
    }

    Así me funciona, gracias de todos modos por la idea del else ifAyuda con este codigo C++.

  5. #4
    Chapuzillas del montón
    Fecha de ingreso
    12 sep, 19
    Mensajes
    37
    Agradecido: 6
    Podrías eliminar los else if. No es una buena práctica, y no se deben utilizar. A nosotros, en una bootcamp que estoy haciendo de desarrollo web (Full-Stack), solo nos dejan usar los if para así optimizar el código y ahorrar memoria de la máquina.

    Programar sin condicionales | MagMax Blog

  6. #5
    Chapuzillas Junior
    Fecha de ingreso
    02 sep, 19
    Mensajes
    5
    Agradecido: 0
    Ayuda con este codigo C++ Iniciado por mrandina Ayuda con este codigo C++
    He probado tu comentario, pero no se por que no compilaba. Al final lo he conseguido con "else if" pero sin el strcmp. Ha quedado algo así:

    string modalidad;


    cin >> modalidad;


    if (modalidad == "Bombero") {


    cout << "Ha elegido usted ser BOMBERO";
    }
    else if (modalidad == "Oficinista") {


    cout << "Ha elegido usted ser Oficinista";
    }
    else if (modalidad == "Controlador") {


    cout << "Ha elegido usted ser Controlador" << endl << endl;
    }

    Así me funciona, gracias de todos modos por la idea del else ifAyuda con este codigo C++.
    Efectivamente, los casos de switch solo pueden contener expresiones numéricas constantes, es decir, ni cadenas de texto ni variables de ningún tipo.

    Por otro lado, la especificación del estándar C++ no indica cómo implementar el switch. Pero los compiladores suelen optimizarlo transformándolo en una tabla donde se salta directamente al código de cada caso sin pasar por las comprobaciones de los casos previos, cosa que sí hacen con el if()... else if(). Es por eso que de cara al rendimiento, cuando se tiene un número de casos importante, la penalización de no usar switch se puede notar. Más info: Something You May Not Know About the Switch Statement in C/C++ - CodeProject

    En general en programación (no sólo en C++) el hábito de comparar cadenas para tomar decisiones es mala decisión. Yo me acostumbraría cuanto antes a tratar con números (enumeraciones) y dejar el reconocimiento de texto al vuelo para problemas donde resulte imprescindible. Una solución para transformar rápidamente cadenas de texto en un número equivalente es definir un mapa std::map:

    #include <iostream>
    #include <map>

    enum Modalidad { BOMBERO, OFICINISTA, COMUNICADOR };
    std::map<string, Modalidad> modMap;

    main() {
    modMap["bombero"] = BOMBERO;
    modMap["oficinista"] = OFICINISTA;
    modMap["comunicador"] = COMUNICADOR;

    cin >> modalidad;
    switch(modMap[modalidad]) {
    case BOMBERO:
    ...
    ...
    }

    Para un punto más de calidad de cara al usuario, faltaría añadir que no se distinga entre mayúsculas y minúsculas.

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  

Hacemos uso de cookies propias y de terceros para proporcionar una mejor experiencia de usuario. Al seguir navegando entendemos que acepta nuestra Más información .

Aceptar