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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Cambiar if-else por switch
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cambiar if-else por switch  (Leído 2,038 veces)
mbmbiofreak

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Cambiar if-else por switch
« en: 30 Junio 2014, 14:01 pm »

Buenas tardes a tod@s,

Estoy haciendo un programa y tengo una función con bastantes sentencias if-else, creo que se podría reducir el código con la sentencia switch-case, pero no me funciona (creo que el problema está en reconocer cadenas de caracteres).

A continuación os dejo la función por si alguien sabe como ponerlo con la sentencia switch-case.

Un saludo!!


Código
  1. int Comprobar_Archivo_Conf(char *cadena,int parametro)
  2. {
  3. if (strcmp("energia_bolas_verdes",cadena)==0)
  4.  {
  5.   if (parametro>=500&&parametro<=1500)
  6.    {
  7.     segmento_01[ENERGIA_BOLAS_VERDES]=parametro;
  8.     return 1;
  9.    }
  10.  }
  11.  else
  12.   if (strcmp("num_bolas_rojas",cadena)==0)
  13.    {
  14.     if (parametro>3&&parametro<7)
  15.      {
  16.       segmento_01[NUM_BOLAS_ROJAS]=parametro;
  17.       return 1;
  18.      }
  19.    }
  20.    else
  21.     if (strcmp("intervalo_rojas",cadena)==0)
  22.      {
  23.       if (parametro>=3&&parametro<=6)
  24.        {
  25.         segmento_01[INTERVALO_ROJAS]=parametro;
  26.         return 1;
  27.        }
  28.      }
  29.      else
  30.       if (strcmp("intervalo_azules",cadena)==0)
  31.        {
  32.         if (parametro>=3&&parametro<=6)
  33.          {
  34.           segmento_01[INTERVALO_AZULES]=parametro;
  35.           return 1;
  36.          }
  37.        }
  38.        else
  39.         if (strcmp("num_bolas_negras",cadena)==0)
  40.          {
  41.           if (parametro>=3&&parametro<=5)
  42.            {
  43.             segmento_01[NUM_BOLAS_NEGRAS]=parametro;
  44.             return 1;
  45.            }
  46.          }
  47.          else
  48.           if (strcmp("intervalo_negras",cadena)==0)
  49.            {
  50.             if (parametro>=3&&parametro<=6)
  51.              {
  52.               segmento_01[INTERVALO_NEGRAS]=parametro;
  53.               return 1;
  54.              }
  55.            }
  56.            else
  57.             if (strcmp("bolas_verdes_pequenas",cadena)==0)
  58.              {
  59.               if (parametro>=2&&parametro<=5)
  60.                {
  61.                 segmento_01[BOLAS_VERDES_PEQUENAS]=parametro;
  62.                 return 1;
  63.                }
  64.              }
  65.              else
  66.               if (strcmp("puntuacion_t1_roja",cadena)==0)
  67.                {
  68.                 if (parametro==100)
  69.                  {
  70.                   segmento_01[PUNTUACION_T1_ROJA]=parametro;
  71.                   return 1;
  72.                  }
  73.                }
  74.                else
  75.                 if (strcmp("puntuacion_t2_roja",cadena)==0)
  76.                  {
  77.                   if (parametro==120)
  78.                    {
  79.                     segmento_01[PUNTUACION_T2_ROJA]=parametro;
  80.                     return 1;
  81.                    }
  82.                  }
  83.                  else
  84.                   if (strcmp("puntuacion_t3_roja",cadena)==0)
  85.                    {
  86.                     if (parametro==140)
  87.                      {
  88.                       segmento_01[PUNTUACION_T3_ROJA]=parametro;
  89.                       return 1;
  90.                      }
  91.                    }
  92.                    else
  93.                     if (strcmp("puntuacion_t4_roja",cadena)==0)
  94.                      {
  95.                       if (parametro==160)
  96.                        {
  97.                         segmento_01[PUNTUACION_T4_ROJA]=parametro;
  98.                         return 1;
  99.                        }
  100.                      }
  101.                      else
  102.                       if (strcmp("puntuacion_bola_negra",cadena)==0)
  103.                        {
  104.                         if (parametro==200)
  105.                          {
  106.                           segmento_01[PUNTUACION_BOLA_NEGRA]=parametro;
  107.                           return 1;
  108.                          }
  109.                        }
  110.                        else
  111.                         if (strcmp("quita_energia_roja",cadena)==0)
  112.                          {
  113.                           if (parametro>=10&&parametro<=25)
  114.                            {
  115.                             segmento_01[QUITA_ENERGIA_ROJA]=parametro;
  116.                             return 1;
  117.                            }
  118.                          }
  119. return 0;
  120. } // fin funcion Comprobar_Archivo_Conf


« Última modificación: 30 Junio 2014, 14:08 pm por Eternal Idol » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Cambiar if-else por switch
« Respuesta #1 en: 30 Junio 2014, 14:43 pm »

Puedes mapear todos los resultados y así la función que comprueba los resultados se queda sin ifs

Código
  1. typedef struct
  2. {
  3.  char etiqueta[100];
  4.  int index;
  5. } Dato;
  6.  
  7. // Es un ejemplo, procura no usar variables globales
  8. Dato[ MAX_DATOS ] datos;
  9.  
  10. void Configurar( )
  11. {
  12.  strcpy( datos[ 0 ].etiqueta, "energia_bolas_verdes" );
  13.  datos[ 0 ].index = 0;
  14.  
  15.  strcpy( datos[ 1 ].etiqueta, "num_bolas_rojas" );
  16.  datos[ 1 ].index = 1;
  17.  
  18.  strcpy( datos[ 2 ].etiqueta, "intervalo_rojas" );
  19.  datos[ 2 ].index = 2;
  20.  
  21.  // ...
  22. }
  23.  
  24. int Comprobar_Archivo_Conf( char *cadena, int parametro )
  25. {
  26.  int to_return = 0;
  27.  
  28.  int i;
  29.  for ( i = 0; i< MAX_DATOS; i++ )
  30.  {
  31.    if ( strcmp( datos[ i ].etiqueta , cadena ) == 0 )
  32.    {
  33.      segmento_01[ datos[ i ].index ] = parametro;
  34.      to_return = 1;
  35.      break;
  36.    }
  37.  }
  38.  
  39.  return to_return;
  40. }


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Cambiar if-else por switch
« Respuesta #2 en: 30 Junio 2014, 16:19 pm »

Siendo que los datos parecen ser constantes - y de cualquier modo algun mecanismo de sincronizacion seria necesario - en la misma linea (etiqueta podria ser char * ya que estamos):

Código
  1. const Dato datos[] =
  2. {
  3.    { "energia_bolas_verdes", 0},
  4.    { "num_bolas_rojas", 1} //etc
  5. };
  6. //...
  7. for (x = 0; x < sizeof(datos) / sizeof(datos[0]); ++x)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
mbmbiofreak

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Cambiar if-else por switch
« Respuesta #3 en: 30 Junio 2014, 21:38 pm »

Muchas gracias por las respuestas, voy a probarlo!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cambiar un Switch por un do-while « 1 2 »
Programación C/C++
anonimo3.0 10 6,417 Último mensaje 8 Julio 2012, 20:18 pm
por anonimo3.0
Cambiar color de Fondo a través de un checkbox/Switch y GET
PHP
Samylmy94 1 5,043 Último mensaje 19 Febrero 2014, 18:52 pm
por #!drvy
Cambiar Switch por If/else o Do/while
Java
tanGoO_4 2 2,644 Último mensaje 9 Febrero 2015, 13:58 pm
por Usuario Invitado
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines