Cambiar if-else por switch

Iniciado por mbmbiofreak, 30 Junio 2014, 14:01 PM

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

mbmbiofreak

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



int Comprobar_Archivo_Conf(char *cadena,int parametro)
{
if (strcmp("energia_bolas_verdes",cadena)==0)
 {
  if (parametro>=500&&parametro<=1500)
   {
    segmento_01[ENERGIA_BOLAS_VERDES]=parametro;
    return 1;
   }
 }
 else
  if (strcmp("num_bolas_rojas",cadena)==0)
   {
    if (parametro>3&&parametro<7)
     {
      segmento_01[NUM_BOLAS_ROJAS]=parametro;
      return 1;
     }
   }
   else
    if (strcmp("intervalo_rojas",cadena)==0)
     {
      if (parametro>=3&&parametro<=6)
       {
        segmento_01[INTERVALO_ROJAS]=parametro;
        return 1;
       }
     }
     else
      if (strcmp("intervalo_azules",cadena)==0)
       {
        if (parametro>=3&&parametro<=6)
         {
          segmento_01[INTERVALO_AZULES]=parametro;
          return 1;
         }
       }
       else
        if (strcmp("num_bolas_negras",cadena)==0)
         {
          if (parametro>=3&&parametro<=5)
           {
            segmento_01[NUM_BOLAS_NEGRAS]=parametro;
            return 1;
           }
         }
         else
          if (strcmp("intervalo_negras",cadena)==0)
           {
            if (parametro>=3&&parametro<=6)
             {
              segmento_01[INTERVALO_NEGRAS]=parametro;
              return 1;
             }
           }
           else
            if (strcmp("bolas_verdes_pequenas",cadena)==0)
             {
              if (parametro>=2&&parametro<=5)
               {
                segmento_01[BOLAS_VERDES_PEQUENAS]=parametro;
                return 1;
               }
             }
             else
              if (strcmp("puntuacion_t1_roja",cadena)==0)
               {
                if (parametro==100)
                 {
                  segmento_01[PUNTUACION_T1_ROJA]=parametro;
                  return 1;
                 }
               }
               else
                if (strcmp("puntuacion_t2_roja",cadena)==0)
                 {
                  if (parametro==120)
                   {
                    segmento_01[PUNTUACION_T2_ROJA]=parametro;
                    return 1;
                   }
                 }
                 else
                  if (strcmp("puntuacion_t3_roja",cadena)==0)
                   {
                    if (parametro==140)
                     {
                      segmento_01[PUNTUACION_T3_ROJA]=parametro;
                      return 1;
                     }
                   }
                   else
                    if (strcmp("puntuacion_t4_roja",cadena)==0)
                     {
                      if (parametro==160)
                       {
                        segmento_01[PUNTUACION_T4_ROJA]=parametro;
                        return 1;
                       }
                     }
                     else
                      if (strcmp("puntuacion_bola_negra",cadena)==0)
                       {
                        if (parametro==200)
                         {
                          segmento_01[PUNTUACION_BOLA_NEGRA]=parametro;
                          return 1;
                         }
                       }
                       else
                        if (strcmp("quita_energia_roja",cadena)==0)
                         {
                          if (parametro>=10&&parametro<=25)
                           {
                            segmento_01[QUITA_ENERGIA_ROJA]=parametro;
                            return 1;
                           }
                         }
return 0;
} // fin funcion Comprobar_Archivo_Conf

eferion

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


typedef struct
{
 char etiqueta[100];
 int index;
} Dato;

// Es un ejemplo, procura no usar variables globales
Dato[ MAX_DATOS ] datos;

void Configurar( )
{
 strcpy( datos[ 0 ].etiqueta, "energia_bolas_verdes" );
 datos[ 0 ].index = 0;

 strcpy( datos[ 1 ].etiqueta, "num_bolas_rojas" );
 datos[ 1 ].index = 1;

 strcpy( datos[ 2 ].etiqueta, "intervalo_rojas" );
 datos[ 2 ].index = 2;

 // ...
}

int Comprobar_Archivo_Conf( char *cadena, int parametro )
{
 int to_return = 0;

 int i;
 for ( i = 0; i< MAX_DATOS; i++ )
 {
   if ( strcmp( datos[ i ].etiqueta , cadena ) == 0 )
   {
     segmento_01[ datos[ i ].index ] = parametro;
     to_return = 1;
     break;
   }
 }

 return to_return;
}

Eternal Idol

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 (c++) [Seleccionar]
const Dato datos[] =
{
   { "energia_bolas_verdes", 0},
   { "num_bolas_rojas", 1} //etc
};
//...
for (x = 0; x < sizeof(datos) / sizeof(datos[0]); ++x)
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

Muchas gracias por las respuestas, voy a probarlo!