Autor
|
Tema: If o Switch? (Leído 8,764 veces)
|
|
OmarHack
Desconectado
Mensajes: 1.268
|
Siempre pongo ejemplos malos, uso mas de un carácter, si no usaría char Tengo 500 lineas de código, por eso no pongo el original. xDDD No creo que se pueda mejorar más, porque el código no tiene más. xD Muchas gracias de nuevo, sí le añado algo y necesito ayuda os aviso. Lo dejo con el while entonces! Tengo que leerme algún libro para ver como están implementadas las sentencias y saber cual es mejor para cada caso, en lo cursos no suelen venir. Un saludo! PD: No estoy haciendo un diccionario, pero seguro que el funcionamiento del diccionario me puede ayudar a implementar alguna función más.
|
|
|
En línea
|
I like to test things.
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
A ver si esto te ayuda: const char *arrays[] = {"a", "b", "c"}; const char *respuestas[] = {"a", "cualquier cosa", "mi gato se llama guantes"}; do { cout << "Puede poner su letra:" << endl; cin >> string1; size_t i; bool found = false; for(i=0; i<(sizeof(arrays)/sizeof(arrays[0])); i++) { if(string1 == arrays[i]) { found = true; break; } } if(found) cout << respuestas[i] << endl; else /* Aqui haces lo que quieras si no se encuentra nada */ } while (string1 != "salir"); return 0;
|
|
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
OmarHack
Desconectado
Mensajes: 1.268
|
Tampoco me sirve! Así en mi caso creo que haría el código más largo, complejo, y lento.
|
|
|
En línea
|
I like to test things.
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
A ver si esto te ayuda: const char *arrays[] = {"a", "b", "c"}; const char *respuestas[] = {"a", "cualquier cosa", "mi gato se llama guantes"}; do { cout << "Puede poner su letra:" << endl; cin >> string1; size_t i; bool found = false; for(i=0; i<(sizeof(arrays)/sizeof(arrays[0])); i++) { if(string1 == arrays[i]) { found = true; break; } } if(found) cout << respuestas[i] << endl; else /* Aqui haces lo que quieras si no se encuentra nada */ } while (string1 != "salir"); return 0;
Para eso está la clase maps Insisto en que te veas los videos OmarHack. Puedes hacer un map con todas las respuestas, el valor que te devuelva el map será otra cadena, un número o un puntero a una función.¿Lo que quieres es implementar comandos no?
|
|
|
En línea
|
|
|
|
OmarHack
Desconectado
Mensajes: 1.268
|
Para eso está la clase maps Insisto en que te veas los videos OmarHack. Puedes hacer un map con todas las respuestas, el valor que te devuelva el map será otra cadena, un número o un puntero a una función.¿Lo que quieres es implementar comandos no? fue el primer vídeo que vi, el del uso de find en map. Pero estoy buscando añadir funcionalidades a mi programa, y haciendo el código de esa manera aprendo bastante, pero no me sirve para añadir funcionalidades. Justo, es lo que más me interesa ahora mismo!
|
|
|
En línea
|
I like to test things.
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
fue el primer vídeo que vi, el del uso de find en map. Pero estoy buscando añadir funcionalidades a mi programa, y haciendo el código de esa manera aprendo bastante, pero no me sirve para añadir funcionalidades. Justo, es lo que más me interesa ahora mismo!
Pues eso es lo que estás buscando! Un map en toda regla. Te pongo un ejemplo sencillo: #include <iostream> #include <map> using namespace std; typedef void (*Puntero_A_Funcion)(void); void Copiar(); void Escribir(); void Cortar(); int main() { void (*Funcion)(void); // Puntero a funcion sin argumentos string Mensaje; map<string,Puntero_A_Funcion> Comandos; Comandos["write"] = Escribir; Comandos["copy"] = Copiar; Comandos["cut"] = Cortar; cout<<"Introduzca comando: "; cin>>Mensaje; Funcion = Comandos[Mensaje]; // Obtengo el puntero a la funcion correspondiente if (Funcion) // Si existe la funcion Funcion(); // llamar a la funcion else cout<<"Error, no existe el comando introducido"; return 0; } void Escribir() { cout<<"Has escrito write"; } void Cortar() { cout<<"Has escrito cortar"; } void Copiar() { cout<<"Has escrito copiar"; }
En tú código deberías definir las funciones en un archivo aparte para no liarte ¡Saludos!
|
|
|
En línea
|
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
Muy buen aporte amchacon, no le había visto esa funcionalidad a la clase map.
|
|
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
OmarHack
Desconectado
Mensajes: 1.268
|
Muy bueno, pero no es mas sencillo: if (string1 == "Escribir") { cout << "Has escrito write" <<endl; //Llamada a la función si fuera necesario. }
¿O esa forma tiene alguna ventaja sobre la anterior?
|
|
|
En línea
|
I like to test things.
|
|
|
lapras
|
La ventaja que tine el map es que tiene un coste constante. Por otra parte, en una sucesión de ifs el coste depende linealmente de el número de ifs. Si tienes poquitos ifs vale la pena. Pero si tienes un muchos imagínate si será costoso comprobar todas las condiciones una a una. Los maps tinen una función hash que permite calcular el puntero sin depender del número de entradas que tenga.
|
|
|
En línea
|
|
|
|
|
|