¿Cuál es más rápido y/o pide menos recursos?
if (numero == 1)
{cout << "uno";}
if (numero == 2)
{cout << "dos";
if (numero == 3)
{cout << "tres";
........................
........................
........................
if (numero == 100)
{cout << "cien";
switch (numero)
case 1:
cout << "uno"
break;
case 2:
................
................
.................
Saludos.
Pues realmente no es por su gasto de recursos, sino más bien por el desgaste mental que supone el leer un conjunto muy grande de if anidados, para esos casos de opcion multiple de eleccion de casos de uso, es muy util el switch, como un menu de seleccion o una consecuencia deliberada por un evento intencionado, como puede ser la lectura de un dato determinado.
El if es muy bueno cuando hay sumas logica de trabajo (es decir, usando AND/OR en los casos de condicional) pues eso permite ahorrar mucho espacio y asumir un caso de uso de una forma muy eficiente.
Digamos, en SDL o allegro como estamos trabajando, he visto que inicializar el modo video, sonido, yo que se, algo, seria muy molesto inicializarlos con un switch, mientras que con un if en una sola linea puede validarse ese tipo de comandos.
Todo depende de la forma en que lo uses, yo no lo veria por el lado de recursos sino por el lado de la eficiencia y el entendimiento de codigo.
El código en el que estoy trabajando no es nada complejo, y por eso, entender lo entiende cualquiera. Los if no son anidados, son una lista enorme (100 o así) dentro del main pero solo un par contienen un par de if anidados. Y lo que quiero es ahorrar tiempo de ejecución y recursos en la medida de lo posible.
El programa ahora es algo así:
do {
cout << "Puede poner su letra:" << endl;
if (string1 == "a")
{cout << "a" <<endl;}
if (string1 == "b")
{cout << "ab"<<endl;}
if (string1 == "c")
{cout << "abc"<<endl;}
.........................
.........................
.........................
if (string1 == "z")
{cout << "abcdefghijklmnñopqrstuvwxyz" <<endl;}
] while (string1 != "salir");
Haciéndolo así tengo pensar como mostrar por pantalla que no se a elegido ninguna letra del abecedario. Algo así como meter todos los if dentro de otro y a este ponerle un else con el texto.
También podría pasar todo a un switch y poner eso último de que no se eligió ninguna letra del abecedario en un default.
Lo que me importa es saber cual requiere menos recursos y cual tarda menos en ejecutarse.
¿ Qué me aconsejas en este caso?
Un saludo!
Ese metodo es lento, puesto que tiene que hacer 28 comprobaciones cada vez. Otra cosa que también ayuda es usar char* y no string (los string usan memoria dinámica, eso hace que sean "un pelín" más lentos).
Intenta hacer las mínimas comprobaciones posibles:
int Contador = 0;
char Texto;
char Cadena[256];
do {
cout << "Puede poner su letra, introduza 0 para salir" << endl;
cin>>Texto;
if (Texto >= 'a' && Texto <= 'z')
{
Cadena[Contador] = Texto;
Contador++;
}
} while (Texto != '0');
Cadena[Contador] = '\0';
cout<<Cadena;
Aunque en un programa normal yo usaría string.
Resulta que no se puede dar de parámetro un string a un switch así que me quedo con los if.
El código que me acabas de poner es mucho mejor que el que puse, pero para mi programa no me sirve, es distinto en un par de detalles.
Gracias a los 2!
EDITO: Antes de postear se publicaron dos nuevas respuestas ;).
Creo que se que quieres hacer y es bastante más fácil de hacer de lo que planteas.
#include <stdio.h>
int main()
{
char abecedario[]="abcdefghijklmnopqrstuvwxyz";
char letra;
do
{
letra=getchar();
if( letra>='a' && letra<='z' )
{
abecedario[letra-'a'+1]='\0';
puts(abecedario);
abecedario[letra-'a'+1]=letra+1;
}
}while(letra!='0');
return 0;
}
Puedes hacerlo con un if y un for, pero creo que es menos eficaz.
#include <stdio.h>
int main()
{
char letra;
int i;
do
{
letra=getchar();
if( letra>='a' && letra<='z' )
{
for(i='a';i<=letra;i++)
putchar(i);
putchar('\n');
}
}while(letra!='0');
return 0;
}
Sa1uDoS
No, no es eso. Eso fue lo que di a entender sin querer.
Ahora tengo otra duda ya que me e puesto a mejorar el código.
¿Cómo es más eficiente el código, con un do while? ¿O con un goto?
El programa se repetirá cada vez que se muestre el cout del string que se haya puesto.
Algo así con bucle while:
do {
cout << "Puede poner su letra:" << endl;
if (string1 == "a")
{cout << "a" <<endl;}
if (string1 == "b")
{cout << "cualquier cosa"<<endl;}
if (string1 == "c")
{cout << "mi gato se llama guantes"<<endl;}
.........................
.........................
.........................
if (string1 == "z")
{cout << "lo del abecedario era solo un ejemplo" <<endl;}
] while (string1 != "salir");
return 0;
Con goto:
Inicio:
cout << "Puede poner su letra:" << endl;
if (string1 == "a")
{cout << "a" <<endl;}
if (string1 == "b")
{cout << "cualquier cosa"<<endl;}
if (string1 == "c")
{cout << "mi gato se llama guantes"<<endl;}
.........................
.........................
.........................
if (string1 == "z")
{cout << "lo del abecedario era solo un ejemplo" <<endl;}
] if (string1 != "salir");
{goto Inicio;}
else return 0;
Si el código o la sintaxis tiene fallos da igual, es solo para que entendáis lo que quiero decir.
Saludos!
if (string1 != "salir");
{goto Inicio;}
Eso es equivalente al while anterior (el compilador lo traduce de la misma forma).
Otra cosa es, que para comprobar una letra no deberías usar "cadenas".
Si das un ejemplo concreto, seguramente podamos ayudarte a optimizarlo al máximo.
El compilador lo traduce de la misma forma, pero el goto no es una buena práctica de programación.
Sa1uDoS
Cita de: mr.blood en 15 Junio 2013, 12:49 PMEl compilador lo traduce de la misma forma, pero el goto no es una buena práctica de programación.
El goto tiene usos legítimos y válidos. Lo que es una mala práctica de programación es usarlo en exceso (o peor aún, usarlo para saltar entre funciones).
¿Por casualidad no estarás haciendo un diccionario no?
Si es así, te puede servir esto:
http://minidosis.org/C++/Maps/
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:
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;
Tampoco me sirve! Así en mi caso creo que haría el código más largo, complejo, y lento.
Cita de: 0xDani en 15 Junio 2013, 14:02 PM
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 :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?
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!
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:
#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!
Muy buen aporte amchacon, no le había visto esa funcionalidad a la clase map.
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?
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.
Interesante, cuando el programa esté más avanzado lo implementaré jeje.