elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  If o Switch?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: If o Switch?  (Leído 8,763 veces)
OmarHack


Desconectado Desconectado

Mensajes: 1.268


Ver Perfil
If o Switch?
« en: 15 Junio 2013, 03:21 am »

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

Código
  1. if (numero == 1)
  2. {cout << "uno";}
  3.  
  4. if (numero == 2)
  5. {cout << "dos";
  6.  
  7. if (numero == 3)
  8. {cout << "tres";
  9.  
  10. ........................
  11. ........................
  12. ........................
  13.  
  14. if (numero == 100)
  15. {cout << "cien";




Código
  1. switch (numero)
  2. case 1:
  3. cout << "uno"
  4. break;
  5. case 2:
  6. ................
  7. ................
  8. .................
  9.  
  10.  
Saludos.


En línea

I like to test things.
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: If o Switch?
« Respuesta #1 en: 15 Junio 2013, 03:39 am »

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.


En línea


OmarHack


Desconectado Desconectado

Mensajes: 1.268


Ver Perfil
Re: If o Switch?
« Respuesta #2 en: 15 Junio 2013, 11:47 am »

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
  1. do {
  2.  
  3. cout << "Puede poner su letra:" << endl;
  4.  
  5. if (string1 == "a")
  6. {cout << "a" <<endl;}
  7.  
  8. if (string1 == "b")
  9. {cout << "ab"<<endl;}
  10.  
  11. if (string1 == "c")
  12. {cout << "abc"<<endl;}
  13.  
  14. .........................
  15.  
  16. .........................
  17.  
  18. .........................
  19.  
  20.  
  21. if (string1 == "z")
  22. {cout << "abcdefghijklmnñopqrstuvwxyz" <<endl;}
  23.  
  24. ] 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!
En línea

I like to test things.
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: If o Switch?
« Respuesta #3 en: 15 Junio 2013, 12:12 pm »

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
  1. int Contador = 0;
  2. char Texto;
  3. char Cadena[256];
  4.  
  5. do {
  6.  
  7. cout << "Puede poner su letra, introduza 0 para salir" << endl;
  8. cin>>Texto;
  9.  
  10. if (Texto >= 'a' && Texto <= 'z')
  11. {
  12.    Cadena[Contador] = Texto;
  13.    Contador++;
  14. }
  15.  
  16. } while (Texto != '0');
  17.  
  18. Cadena[Contador] = '\0';
  19.  
  20. cout<<Cadena;
  21.  

Aunque en un programa normal yo usaría string.
« Última modificación: 15 Junio 2013, 12:13 pm por amchacon » En línea

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


Desconectado Desconectado

Mensajes: 1.268


Ver Perfil
Re: If o Switch?
« Respuesta #4 en: 15 Junio 2013, 12:18 pm »

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!
En línea

I like to test things.
mr.blood

Desconectado Desconectado

Mensajes: 150


Ver Perfil
Re: If o Switch?
« Respuesta #5 en: 15 Junio 2013, 12:26 pm »

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.

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. char abecedario[]="abcdefghijklmnopqrstuvwxyz";
  6. char letra;
  7.  
  8. do
  9. {
  10. letra=getchar();
  11. if( letra>='a' && letra<='z' )
  12. {
  13. abecedario[letra-'a'+1]='\0';
  14. puts(abecedario);
  15. abecedario[letra-'a'+1]=letra+1;
  16. }
  17.  
  18. }while(letra!='0');
  19.  
  20. return 0;
  21. }
  22.  

Puedes hacerlo con un if y un for, pero creo que es menos eficaz.

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. char letra;
  6. int i;
  7.  
  8. do
  9. {
  10. letra=getchar();
  11. if( letra>='a' && letra<='z' )
  12. {
  13. for(i='a';i<=letra;i++)
  14. putchar(i);
  15. putchar('\n');
  16. }
  17.  
  18. }while(letra!='0');
  19.  
  20. return 0;
  21. }
  22.  

Sa1uDoS
En línea

OmarHack


Desconectado Desconectado

Mensajes: 1.268


Ver Perfil
Re: If o Switch?
« Respuesta #6 en: 15 Junio 2013, 12:39 pm »

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
  1. do {
  2.  
  3. cout << "Puede poner su letra:" << endl;
  4.  
  5. if (string1 == "a")
  6. {cout << "a" <<endl;}
  7.  
  8. if (string1 == "b")
  9. {cout << "cualquier cosa"<<endl;}
  10.  
  11. if (string1 == "c")
  12. {cout << "mi gato se llama guantes"<<endl;}
  13.  
  14. .........................
  15.  
  16. .........................
  17.  
  18. .........................
  19.  
  20.  
  21. if (string1 == "z")
  22. {cout << "lo del abecedario era solo un ejemplo" <<endl;}
  23.  
  24. ] while (string1 != "salir");
  25. return 0;


Con goto:

Código
  1. Inicio:
  2. cout << "Puede poner su letra:" << endl;
  3.  
  4. if (string1 == "a")
  5. {cout << "a" <<endl;}
  6.  
  7. if (string1 == "b")
  8. {cout << "cualquier cosa"<<endl;}
  9.  
  10. if (string1 == "c")
  11. {cout << "mi gato se llama guantes"<<endl;}
  12.  
  13. .........................
  14.  
  15. .........................
  16.  
  17. .........................
  18.  
  19.  
  20. if (string1 == "z")
  21. {cout << "lo del abecedario era solo un ejemplo" <<endl;}
  22.  
  23. ] if (string1 != "salir");
  24. {goto Inicio;}
  25. else return 0;
  26.  

Si el código o la sintaxis tiene fallos da igual, es solo para que entendáis lo que quiero decir.
Saludos!
En línea

I like to test things.
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: If o Switch?
« Respuesta #7 en: 15 Junio 2013, 12:46 pm »

Código
  1. if (string1 != "salir");
  2. {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".
En línea

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

Desconectado Desconectado

Mensajes: 150


Ver Perfil
Re: If o Switch?
« Respuesta #8 en: 15 Junio 2013, 12:49 pm »

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
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: If o Switch?
« Respuesta #9 en: 15 Junio 2013, 12:50 pm »

El 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).
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Switch?
Redes
Sarayins 4 2,486 Último mensaje 7 Julio 2014, 09:53 am
por ccrunch
PoC, más rapido if-else o switch? « 1 2 »
Programación C/C++
engel lex 15 7,390 Último mensaje 10 Diciembre 2014, 16:30 pm
por zShackra
switch
Programación C/C++
C4ss4ndr4__4__4 2 2,752 Último mensaje 5 Mayo 2021, 19:33 pm
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines