If o Switch?

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

0 Miembros y 2 Visitantes están viendo este tema.

OmarHack

¿Cuál es más rápido y/o pide menos recursos?

Código (cpp) [Seleccionar]
if (numero == 1)
{cout << "uno";}

if (numero == 2)
{cout << "dos";

if (numero == 3)
{cout << "tres";

........................
........................
........................

if (numero == 100)
{cout << "cien";





Código (cpp) [Seleccionar]
switch (numero)
case 1:
cout << "uno"
break;
case 2:
................
................
.................


Saludos.
I like to test things.

dato000

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.



OmarHack

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

Código (cpp) [Seleccionar]

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

amchacon

#3
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:

Código (cpp) [Seleccionar]

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

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

mr.blood

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

OmarHack

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:

Código (cpp) [Seleccionar]
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:

Código (cpp) [Seleccionar]
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!
I like to test things.

amchacon

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

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

mr.blood

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

amchacon

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

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar