If o Switch?

Iniciado por OmarHack, 15 Junio 2013, 03:21 AM

0 Miembros y 1 Visitante están viendo este tema.

amchacon

¿Por casualidad no estarás haciendo un diccionario no?

Si es así, te puede servir esto:
http://minidosis.org/C++/Maps/
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

OmarHack

Siempre pongo ejemplos malos, uso mas de un carácter, si no usaría char :P
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. :silbar:
I like to test things.

0xDani

A ver si esto te ayuda:

Código (cpp) [Seleccionar]

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

Tampoco me sirve!  Así en mi caso creo que haría el código más largo, complejo, y lento.
I like to test things.

amchacon

Cita de: 0xDani en 15 Junio 2013, 14:02 PM
A ver si esto te ayuda:

Código (cpp) [Seleccionar]

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  :silbar:

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?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

OmarHack

Cita de: amchacon en 15 Junio 2013, 15:11 PM
Para eso está la clase maps  :silbar:

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!
I like to test things.

amchacon

Cita de: OmarHack en 15 Junio 2013, 15:16 PM
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:

Código (cpp) [Seleccionar]
#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!
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

0xDani

Muy buen aporte amchacon, no le había visto esa funcionalidad a la clase map.
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

Muy bueno, pero no es mas sencillo:
Código (cpp) [Seleccionar]
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?
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.