Ayuda con este codigo C++

mrandina

Nuevo
Registrado
13 Ago 2019
Mensajes
2
Puntos
0
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...:guiño::guiño:


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...
 

Wonnie

Master Chapuzas
Registrado
7 Jul 2014
Mensajes
390
Puntos
28
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:

mrandina

Nuevo
Registrado
13 Ago 2019
Mensajes
2
Puntos
0
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 if:).
 

fernandito89

Chapuzas Senior
Registrado
12 Sep 2019
Mensajes
75
Puntos
0
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
 

PiCoTTo

Chapuzas Jr
Registrado
2 Sep 2019
Mensajes
6
Puntos
0
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 if:).
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.
 
Arriba