Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Duda con Switch - Case

Estas en el tema de Duda con Switch - Case en el foro de C/C++ en Foros del Web. Buenas, bueno primero antes que nada permitanme aclararles que en esto del lenguaje C++ como tal estoy viendo lo básico en la universidad que estudio, ...
  #1 (permalink)  
Antiguo 15/04/2015, 23:13
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Pregunta Duda con Switch - Case

Buenas, bueno primero antes que nada permitanme aclararles que en esto del lenguaje C++ como tal estoy viendo lo básico en la universidad que estudio, por lo tanto suelo perderme un poco de acuerdo a los términos técnicos planteados en el problema.

Bien, el problema es el siguiente, una de las actividades fue que debemos hacer un programa en el cual se debe introducir el monto total de una compra, luego de ello escribir el color de una pelota que retiras al realizar la compra y de acuerdo al color que aparezca, obtienes un descuento.

El código que planteó el profesor fue el siguiente:
Código C++:
Ver original
  1. /*
  2. ===================================================================================
  3. En una tienda de descuento se efectúa una promoción en la cual se hace un descuento
  4. sobre el valor de la compra total según el color de la bolita que el cliente
  5. saque al pagar en caja. Si la bolita es de color blanco no se le hará
  6. descuento alguno, si es verde se le hará un 10% de descuento,
  7. si es amarilla un 25%, si es azul un 50% y si es roja un 100%.
  8. Determinar la cantidad final que el cliente deberá pagar por su compra.
  9. se sabe que solo hay bolitas de los colores mencionados.
  10. ===================================================================================
  11. */
  12. #include <stdio.h>  //  Archivo de la biblioteca estándar de Entrada/Salida.
  13. #include <math.h> // archivo estandar de la biblioteca de matematicas
  14. #include <stdlib.h> // Aritméticas, Números aleatorios; y • Conversión de cadenas.
  15.  
  16. int main(int argc, char *argv[])
  17. {
  18.   char mensaje;
  19.   float Monto, Descuento, TotalPagar;
  20.   const Azul= Azul;
  21.  
  22.   printf("Dime el Monto de la Compra= ");
  23.   scanf("%f", &Monto);  
  24.   printf("=============================================================\n");
  25.   printf("Dime El Color que Recibiste\n");
  26.   scanf("%s",&mensaje);
  27.   printf("=============================================================\n");
  28.  
  29.   switch (mensaje)
  30.   {  
  31.     case 'Blanco':
  32.     case 'blanco':
  33.     case 'BLANCO':
  34.             Descuento= 0;
  35.             printf("El Descuento por la Compra es: %f\n",Descuento);
  36.             break;          
  37.     case 'Verde':  
  38.     case 'verde':
  39.     case 'VERDE':          
  40.             Descuento= ( Monto * 0.10);
  41.             printf("El Descuento por la Compra es: %f\n",Descuento);
  42.             break;            
  43.     case 'Amarillo':
  44.     case 'amarillo':
  45.     case 'AMARILLO':
  46.             Descuento= (Monto * 0.25);
  47.             printf("El Descuento por la Compra es: %f\n",Descuento);
  48.             break;          
  49.     case 'Azul':
  50.     case 'azul':
  51.     case '4':
  52.             Descuento= (Monto * 0.50);
  53.             printf("El Descuento por la Compra es: %f\n",Descuento);
  54.             break;            
  55.     case 'Rojo':
  56.     case 'rojo':
  57.     case 'ROJO':
  58.             (Descuento= Monto);
  59.             printf("El Descuento por la Compra es: %f\n",Descuento);
  60.             break;            
  61.   }
  62.  
  63.   TotalPagar= Monto - Descuento;
  64.  
  65.   printf("El Monto A pagar Total Por la Compra Es= %f\n",TotalPagar);
  66.    
  67.   system("PAUSE"); 
  68.   return 0;
  69. }

Bueno, ya analizando el código, dio errores de compilación.

Por lo tanto estuve investigando y acomodando el código de acuerdo a que pudiera ejecutar bien el programa, pero me percate de que al introducir el color, este no hace nada, sino que finaliza el programa.

Observen:



Acomodando el case y colocando un solo carácter, en vez de "blanco" colocas la inicial que es "b", este se ejecuta con normalidad.

Captura:



Disculpen tanto las vueltas, pero es para ir explicando lo que estuve haciendo mas o menos para llegar a la conclusión de que el case solo permite un carácter, si colocas 2, no se ejecuta.

Ahora la duda es. ¿Únicamente es posible en los case colocar variables de un solo carácter o este permite ejecutar mas caracteres? De ser así, que estructura o sentencia debo utilizar para que los case se ejecuten con mas de un carácter?.

Aquí está el código que utilicé para que lograra funcionar el programa:

Código C++:
Ver original
  1. #include <stdio.h> //  Archivo de la biblioteca estándar de Entrada/Salida.
  2. #include <math.h> // archivo estandar de la biblioteca de matematicas
  3. #include <stdlib.h> // Aritméticas, Números aleatorios; y • Conversión de cadenas.
  4. int main(int argc, char *argv[])
  5. {
  6.   char mensaje;
  7.   float Monto, Descuento, TotalPagar;
  8.   const int Azul= Azul;
  9.   printf("Dime el Monto de la Compra:");
  10.   scanf("%f",&Monto);  
  11.   printf("=============================================================\n");
  12.   printf("Dime El Color que Recibiste:");
  13.   scanf("%s",&mensaje);
  14.   printf("=============================================================\n");
  15.   switch (mensaje)
  16.   {  
  17.     case 'b':
  18.             TotalPagar = Monto;    
  19.             printf("Lo sentimos, no obtuvo ningun descuento\n");
  20.             printf("El monto total a pagar es:%f\n",TotalPagar);
  21.             break;          
  22.   }
  23.   system("pause"); 
  24.   return 0;
  25. }

PD: Utilicé la secuencia enum y tampoco funcionó, no tengo conocimiento si esa función se usa en C++ o lo declaré mal.

Bueno, eso es todo y en verdad lamento mucho la molestia de acuerdo a tantas vueltas, espero que me puedan ayudar .

Saludos.

Última edición por DarkScripter; 15/04/2015 a las 23:16 Razón: Falta de información
  #2 (permalink)  
Antiguo 16/04/2015, 00:39
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Duda con Switch - Case

Buenos días.

Si el código que os ha puesto no es más que un ejemplo que tenéis que adaptar para conseguir que funcione puedo decirte que es un poco inutil:

Código C++:
Ver original
  1. case 'Blanco':

Para empezar, las comillas simples sirven, única y exclusivamente, con caracteres sueltos como 'c', 'a', 'X', pero nunca para cadenas de texto. Éstas tienen que ir encerradas con comillas dobles: "Blanco".

El segundo error que tiene esa línea (así como todos los case) es que un case únicamente puede hacer comparaciones con tipos nativos no punteros (bool, int, float, double, char). Y, le pese a quien le pese, la clase "string" no es un tipo nativo de C++, por lo que no puedes usarlo para estos menesteres.

Para salir airoso de una situación así tienes dos opciones:

* Sustituir el switch por una secuencia de if ... else if ... else if ...

* Asignar un índice a cada color: Blanco -> 1, Negro -> 2, ... y usas ese indice en los case. La conversión la puedes hacer de diferentes maneras, pero para no solapar esta solución con la anterior puedes usar un vector o un mapa:

Código C++:
Ver original
  1. std::map< std::string, int > colores;
  2. colores[ "blanco" ] = 1;
  3. colores[ "negro" ] = 2;
  4.  
  5. // ...
  6.  
  7. // A "colores" le estamos pidiendo el valor asignado a la clave. La clave es el color y el valor es el índice asignado a dicho color
  8. int colorInt = colores[ mensaje ];
  9. switch( colorInt )
  10. {
  11.   case 1: // Blanco
  12.     // ...
  13.   case 2: // Negro
  14.     // ...
  15.   default: // Color desconocido
  16.     // ...
  17. }

Un saludo.
  #3 (permalink)  
Antiguo 16/04/2015, 20:33
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

Buenas, muchas gracias por responder bro.

Con respecto a lo del código, el profesor siempre lo coloca y nosotros lo copiamos y luego vemos si ejecuta y le mostramos la captura.

En este caso, no sé que le dio que puso esas declaraciones, como si estuviera inventando.

Por eso empezé a investigar y sin respuesta alguna, llegue a este foro a preguntar.

Entonces en resumen, lo que debo buscar en si es una sentencia o función para asignar un indice a cada color?.

¿Tiene nombre técnico o lo puedo buscar asi tal cual?.

Saludos.
  #4 (permalink)  
Antiguo 16/04/2015, 21:12
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Duda con Switch - Case

Eso seria el case 'Blanco'....
Código C++:
Ver original
  1. #include <stdio.h>  //  Archivo de la biblioteca estándar de Entrada/Salida.
  2. #include <math.h> // archivo estandar de la biblioteca de matematicas
  3. #include <stdlib.h> // Aritméticas, Números aleatorios; y • Conversión de cadenas.
  4.  
  5. int main ( int argc, char *argv[] ) {
  6.     char mensaje[100];
  7.     float Monto, Descuento, TotalPagar;
  8.    
  9.    
  10.     printf ( "Dime el Monto de la Compra= " );
  11.     scanf ( "%f", &Monto );
  12.     printf ( "=============================================================\n" );
  13.     printf ( "Dime El Color que Recibiste\n" );
  14.     scanf ( "%s", mensaje );
  15.     printf ( "=============================================================\n" );
  16.    
  17.     //pelota blanca
  18.     if ( mensaje == "Blanco" || mensaje == "blanco" || mensaje == "BLANCO" ) {
  19.         Descuento = 0;
  20.         printf ( "El Descuento por la Compra es: %f\n", Descuento );
  21.     }
  22.    
  23.     //poner aqui pelota roja, azul... Lo que sea XD
  24.    
  25.    
  26.     TotalPagar = Monto - Descuento;
  27.    
  28.     printf ( "El Monto A pagar Total Por la Compra Es= %f\n", TotalPagar );
  29.    
  30.     getchar();
  31.     return 0;
  32. }

Es adaptarlo para cada color ;)
  #5 (permalink)  
Antiguo 16/04/2015, 21:52
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

Jajajajajajajaja, muchas gracias bro, pero en si lo que busco es adaptarlo con el switch y case, es decir buscar que haga las instrucciones cuando se escriba blanco,rojo y todo lo demas, que de a eso venía mi duda si los case se pueden colocar con más de un caracter.

porque puedo adaptarlo a un menu sencillo y meter las opciones, pero quiero aprender sobre esas situaciones.

En verdad aprecio tu ayuda, y si me puedes guiar de acuerdo como hacer con esos case para que se escriban completo en verdad apreciaría la ayuda.

Nuevamente gracias y disculpa, saludos.
  #6 (permalink)  
Antiguo 17/04/2015, 03:25
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Duda con Switch - Case

Código C++:
Ver original
  1. #include <stdio.h>  
  2. #include <math.h>  
  3. #include <stdlib.h>
  4. #include <map>      //incluya el map y esto es C++
  5.  
  6. int main ( int argc, char *argv[] ) {
  7.     char mensaje[100];
  8.     float Monto, Descuento, TotalPagar;
  9.     std::map< std::string, int > colores;
  10.     //Variantes para blanco
  11.     colores[ "blanco" ] = 1;
  12.     colores[ "Blanco" ] = 1;
  13.     colores[ "BLANCO" ] = 1;
  14.    
  15.     //Declarar otros colores...
  16.     colores[ "Verde" ] = 2;
  17.    
  18.    
  19.     printf ( "Dime el Monto de la Compra= " );
  20.     scanf ( "%f", &Monto );
  21.     printf ( "=============================================================\n" );
  22.     printf ( "Dime El Color que Recibiste\n" );
  23.     scanf ( "%s", mensaje );
  24.     printf ( "=============================================================\n" );
  25.    
  26.    
  27.     int colorInt = colores[ mensaje ];
  28.     switch ( colorInt ) {
  29.         case 1: // Blanco, Blanco o BLANCO
  30.             Descuento= 0;
  31.             printf("El Descuento por la Compra es: %f\n",Descuento);            
  32.             break;
  33.        
  34.         //caso2....    
  35.            
  36.         default:
  37.             printf("\nEl color no color no existe\n");
  38.             break;
  39.     }
  40.    
  41.    
  42.     TotalPagar = Monto - Descuento;
  43.    
  44.     printf ( "El Monto A pagar Total Por la Compra Es= %f\n", TotalPagar );
  45.    
  46.     getchar();
  47.     return 0;
  48. }

Venga... tu a lo más difícil XD.

Por cierto... Si en tu universidad echan a tu profes, diles que estoy sin trabajo. Calculo que no le queda mucho si programa cosas como esta XDDD
  #7 (permalink)  
Antiguo 17/04/2015, 03:36
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Duda con Switch - Case

Cita:
Iniciado por vangodp Ver Mensaje
Venga... tu a lo más difícil XD.
También puedes pasar la cadena a minúsculas y te evitas el tener varios elementos con el mismo índice:

Código C++:
Ver original
  1. // ...
  2.  
  3.   // Convertimos a minúsculas, opción 1
  4.   std::locale loc;
  5.   for( auto& c : mensaje ) c = std::tolower( c, loc );
  6.  
  7.   // opción 2:
  8.   for( auto& c : mensaje ) c = tolower( c );
  9.  
  10.   int colorInt = colores[ mensaje ];
  11.   // ...
  #8 (permalink)  
Antiguo 17/04/2015, 05:04
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Duda con Switch - Case

No entiendo como os complicáis tanto.

- Lo principal es hacer lo que ha comentado @eferion y trabajar con minúsculas o mayúsculas porque sino si alguien pone por error "BLanco" el programa fallará.

- Segundo, que utilidad tiene tener un array para que te devuelva un int y uses ese int en un switch para calcular el descuento? Es mucho más sencillo y óptimo tener un array que consultes por el color, como estás haciendo ahora, y en lugar de devolver un "int" para simular un enumerado, que te devuelva directamente el descuento. Si el color no se encuentra en el array pues simplemente tendrás un descuento de CERO.

Con estos dos cambios, el tener que agregar un nuevo color y su correspondiente descuento simplemente sería añadir un valor más en la inicialización del array. El resto del programa no se tendría que tocar con lo que sería más mantenible. Compara eso con todo lo que tendrías que añadir si lo haces como hasta ahora con el switch...
__________________
Aviso: No se resuelven dudas por MP!
  #9 (permalink)  
Antiguo 17/04/2015, 05:38
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Duda con Switch - Case

Cita:
Iniciado por Malenko Ver Mensaje
- Segundo, que utilidad tiene tener un array para que te devuelva un int y uses ese int en un switch para calcular el descuento? Es mucho más sencillo y óptimo tener un array que consultes por el color, como estás haciendo ahora, y en lugar de devolver un "int" para simular un enumerado, que te devuelva directamente el descuento. Si el color no se encuentra en el array pues simplemente tendrás un descuento de CERO.
A nivel práctico seguramente sí, pero cuando estás aprendiendo muchas veces te toca hacer ejercicios "inútiles" o de formas poco ortodoxas símplemente porque necesitas practicar las diferentes características del lenguaje.

Si una imposición es usar un "switch"... pues es un requisito que no puedes evitar y lo mejor que puedes hacer es adaptarte... si me dices que tienes libertad absoluta entonces la cosa cambia, pero mientras tanto...

Un saludo.
  #10 (permalink)  
Antiguo 17/04/2015, 05:56
 
Fecha de Ingreso: septiembre-2008
Mensajes: 38
Antigüedad: 16 años, 2 meses
Puntos: 2
Totalmente de acuerdo... Cambia a minúsculas ... Tolower :)
  #11 (permalink)  
Antiguo 17/04/2015, 06:28
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Duda con Switch - Case

Es que no se como un maestro que hace case 'blanco': tiene trabajo. >_<
  #12 (permalink)  
Antiguo 17/04/2015, 15:29
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

Buenas, gracias a todos por sus respuestas, y con respecto a lo que dice malenko, entiendo pero no puedo modificar el código a mi manera porque para mi es mas tedioso hacerlo con el if y else, pero me es mas sencillo hacerlo asi o con el switch y case con menú y la "lección" trata sobre el switch y case.

Pero como quiero aprender como dice vangodp "a lo dificil" xD, por eso me detuve aquí a preguntar y pedir ayuda.

Con respecto a los códigos que me han dado, disculpen mi ignorancia o falta de conocimiento, sería mas o menos así?:

Código C++:
Ver original
  1. #include <stdio.h> //  Archivo de la biblioteca estándar de Entrada/Salida.
  2. #include <math.h> // archivo estandar de la biblioteca de matematicas
  3. #include <stdlib.h> // Aritméticas, Números aleatorios; y • Conversión de cadenas.
  4. #include <map>
  5. int main(int argc, char *argv[])
  6. {
  7.   char mensaje[100];
  8.   float Monto, Descuento, TotalPagar;
  9.   std::map< std::string, int > colores;
  10.    colores["blanco"]=1;
  11.    colores["verde"]=2;
  12.    colores["amarillo"]=3;
  13.    colores["azul"]=4;
  14.    colores["rojo"]=5;
  15.   printf("Dime el Monto de la Compra:");
  16.   scanf("%f",&Monto);  
  17.   printf("=============================================================\n");
  18.   printf("Dime El Color que Recibiste:");
  19.   scanf("%s",&mensaje);
  20.   printf("=============================================================\n");
  21.   for( auto& c : mensaje ) c = tolower( c );
  22.   int colorInt = colores[ mensaje ];
  23.   switch ( colorInt )
  24.   {  
  25.     case 1:
  26.             TotalPagar = Monto;    
  27.             printf("Lo sentimos, no obtuvo ningun descuento\n");
  28.             printf("El monto total a pagar es:%f\n",TotalPagar);
  29.             break;          
  30.   }
  31.   system("pause"); 
  32.   return 0;
  33. }

La verdad en parte a veces me cuesta entender los ejemplos, ya que los debo ver con un programa como tal :(.

Mil disculpas nuevamente, saludos.

PD: Vangodp, si eres de Venezuela postúlate xD
  #13 (permalink)  
Antiguo 17/04/2015, 21:49
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Duda con Switch - Case

El unico error es que no debes poner el & en la linea: scanf ( "%s", mensaje ); delante de mensaje. Eso es por que el proprio nombre se considera un puntero al primer elemento de la cadena.

A efectos mensaje es lo mismo que &mensaje[0](un puntero a la primera posición de la cadena). Como ves ya lleva el & y por eso no debes poner.

Cambia scanf ( "%s", &mensaje ); por scanf ( "%s", mensaje );.

Suerte ;)
  #14 (permalink)  
Antiguo 17/04/2015, 23:14
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

Gracias bro, bueno lo compilé y me salieron varios pero varios errores, uso el compilador dev c++ ya que ese es el que usa el profe :(.

Los errores son los siguientes, no vienen tanto al código sino a otros archivos:

Este me aparece con respecto a los colores:
Código C++:
Ver original
  1. no match for 'operator[]' in 'colores["blanco"]'
asi con verde, amarillo, etc.

Despues de ese error aparece este en cada uno de los colores:
Código C++:
Ver original
  1. candidates are: _Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::string, _Tp = int, _Compare = std::less<std::string>, _Alloc = std::allocator<std::pair<const std::string, int> >]

Línea 32 del código que es donde esta el for, me sale esto:
Código C++:
Ver original
  1. [expected primary-expression before "auto" ] y expected ';' before "auto"

Línea 33:
Código C++:
Ver original
  1. no match for 'operator[]' in 'colores[mensaje]'.

Línea 34:
Código C++:
Ver original
  1. expected primary-expression before "switch"
Código C++:
Ver original
  1. expected `)' before "switch"
Código C++:
Ver original
  1. at global scope 34 e In instantiation of `std::pair<const std::string, int>':

Ya los errores a partir de alli, me lleva a otros archivos, este error aparece en el archivo stl_tree.h:

Código C++:
Ver original
  1. instantiated from `std::_Rb_tree_node<std::pair<const std::string, int> >'
  2. Línea 135: _Val _M_value_field;
  3. Línea 565: { _M_erase(_M_begin()); }
  4. Línea 1064: _M_erase(_S_right(__x));

Este aparece en el archivo stl_pair.h:

Código C++:
Ver original
  1. `std::pair<_T1, _T2>::first' has incomplete type
  2. Línea 73: _T1 first;

Y este ultimo me aparece en el archivo stringfwd.h

Código C++:
Ver original
  1. declaration of `const struct std::string'
  2. Línea 56: class basic_string;

Bueno, estaré investigando sobre todo estos errores para ir indagando mas sobre este tipo de situaciones.

Muchas gracias a todos por su ayuda, cualquier cosa estaré al tanto aca a ver si conocen solución a esos problemas :(

Última edición por DarkScripter; 17/04/2015 a las 23:19
  #15 (permalink)  
Antiguo 18/04/2015, 02:23
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Duda con Switch - Case

Cita:
Iniciado por DarkScripter Ver Mensaje
Este me aparece con respecto a los colores:
Código C++:
Ver original
  1. no match for 'operator[]' in 'colores["blanco"]'
asi con verde, amarillo, etc.
Pega tu código completo... o te falta algo o estás usando un compilador con errores.

Cita:
Iniciado por DarkScripter Ver Mensaje
Línea 32 del código que es donde esta el for, me sale esto:
Código C++:
Ver original
  1. [expected primary-expression before "auto" ] y expected ';' before "auto"
"auto" es una palabra que está disponible si compilas usando el estándar C++11 o superior (es bastante reciente). Si usas un compilador antiguo no tendrás acceso a este estándar.

Una variante usando sintaxis más antigua sería:

for( size_t i=0; i<mensaje.length(); ++i ) mensaje[i] = tolower(mensaje[i]);

El resto de errores están relacionados con el uso de map... no les des más importancia.

Un saludo
  #16 (permalink)  
Antiguo 18/04/2015, 05:09
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Duda con Switch - Case

dejame que te haga una pregunta: ¿Es tu dev C++ el 4.9.2, o algo así? La 4 vamos, por que si lo es será por eso.

Deberías usar dev C++ pero la version orwell. Busque "dev C++ Orwell" en google.

Lo que pasa es que ahora me tiene dudas... ¿Si tu maestro usa el 4 tu puedes usar el 5? Lo digo por que seria lo mismo que usar otro. XD

El devC++ 4 esta obsoleto ya que esta descontinuado, el compilador es antiguo, y el IDE no recibe más actualizaciones por parte de su creador. Es este señor llamado Orwell el que está actualizando de forma regular, de ahí que le llamen Dev c++ Orwell.

Piensa lo y dependiendo de lo que veas tendrás que modificar el programa por enésima vez. O bien podrías sugerir actualizar el compilador de la uni. jajaj.

Por cierto. yo uso codeblocks naugtly build, con mingw W-64 4.9.2 que es casi lo ultimo.
La cosa consiste en tener mingw o gcc medianamente actualizado.
Si no me equivoco los de linux ya van por gcc 5. XD

Lo que quiero decir es que no se si le va hacer gracia a tu maestro si llevas un programa diferente al que sabes que es lo ultimo y que funciona, pero que a tu profes no le guste, por que no le va compilar por ser su compilador obsoleto.

Tú no tienes la culpa vamos... Aún hay centros de formación que usan borland con getch() jajaja

Suerte!
  #17 (permalink)  
Antiguo 18/04/2015, 12:40
 
Fecha de Ingreso: abril-2015
Mensajes: 7
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

hola amigo

lo que yo haria para este programa seria a cada color darle un numero

ejemplo

blanco =1

entonces en el case pones

case 1;

el proceso que haga cada color

espero y te sirva
  #18 (permalink)  
Antiguo 18/04/2015, 14:55
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

Cita:
vangodp
Respuesta: Duda con Switch - Case:
dejame que te haga una pregunta: ¿Es tu dev C++ el 4.9.2, o algo así? La 4 vamos, por que si lo es será por eso.
Si bro el 4.9.9.2, instalé el 5.10 que me dijiste que es de la versión más reciente de Orwell y me sale esto ahora:

Ya, verificando los problemas, solo me encuentro con estos 2:

Línea 33:
Código C++:
Ver original
  1. for( auto& c : mensaje ) c = tolower( c );

[Error] ISO C++ forbids declaration of 'c' with no type [-fpermissive]
Y
[Error] range-based 'for' loops are not allowed in C++98 mode

Tenía otros errores de acuerdo al string, pero ya lo solucioné.

Solo había que agregar la librería string en la cabecera al inicio del programa.

Estaré al tanto y seguiré buscando solución al problema para que por fín pueda ejecutarme :(.

Saludos.

Última edición por DarkScripter; 18/04/2015 a las 15:38
  #19 (permalink)  
Antiguo 18/04/2015, 16:21
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Duda con Switch - Case

Cita:
Iniciado por DarkScripter Ver Mensaje
Estaré al tanto y seguiré buscando solución al problema para que por fín pueda ejecutarme :(.
Si miras mis respuestas ya te di solución para ese error:

Cita:
Iniciado por eferion Ver Mensaje
Una variante usando sintaxis más antigua sería:

Código C++:
Ver original
  1. for( size_t i=0; i<mensaje.length(); ++i ) mensaje[i] = tolower(mensaje[i]);
Un saludo
  #20 (permalink)  
Antiguo 18/04/2015, 21:15
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

Cita:
Iniciado por eferion Ver Mensaje
Si miras mis respuestas ya te di solución para ese error:

Código C++:
Ver original
  1. for( size_t i=0; i<mensaje.length(); ++i ) mensaje[i] = tolower(mensaje[i]);

Un saludo
De igual manera da error, de otro tipo, dice esto:

[Error] request for member 'length' in 'mensaje', which is of non-class type 'char [100]'

Buscaré ese error tambn a ver si hay solución.

Saludos y mcuhas gracias por la ayuda eferion.
  #21 (permalink)  
Antiguo 19/04/2015, 03:52
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Duda con Switch - Case

Cita:
Iniciado por DarkScripter Ver Mensaje
De igual manera da error, de otro tipo, dice esto:

[Error] request for member 'length' in 'mensaje', which is of non-class type 'char [100]'

Buscaré ese error tambn a ver si hay solución.

Saludos y mcuhas gracias por la ayuda eferion.
Cambia mensaje... de char[100] a std::string
  #22 (permalink)  
Antiguo 19/04/2015, 06:46
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Duda con Switch - Case

Te recomiendo lo que te ha dicho eferion, usar strings. Pero una posible solución es:

/*Siendo mensaje una cadena de caracter estilo C. Ejemplo char cString [100];*/
Código C++:
Ver original
  1. int tam = sizeof(mensaje);
  2. for( size_t i=0; i<tam; ++i ) mensaje[i] = tolower(mensaje[i]);

...pero si usas string no tienes por que preocuparte por tamaños. ;)

También deberías ir al menú que esta al lado(CodeWarnings) y activar los avisos (-Wall). La ruta es:
menu: Herramientas/Configuración/Code Warnings: Active la opción Show most warnings(-Wall)
Esta opción te va mostrar mas que avisos consejos sobre algunas cosas, muy útil ;).

Por ejemplo si intentas hacer eso en C++:char* p = "hola mundo"; no te esta diciendo que es un [error] si no aviso: [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]. Puedes hacerlo si quieres, simplemente que se desaconseja por completo, los motivos ya los investigas tu. XD

Asi que recuerda:
activar C++11:
menu: Herramientas/Configuración/Generación de Código: Elija en la opción Language standart(-std) la opción ISO C++11.

Avisos o warnings (-Wall)
menu: Herramientas/Configuración/Code Warnings: Active la opción Show most warnings(-Wall)

Con eso ya deberías tener todo ok.
  #23 (permalink)  
Antiguo 19/04/2015, 11:58
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

Buenas, ya ejecutó pero cuando pongo el color, se queda hasta allí.

Observen:



Jooo, ya me había emocionado y todo :(.

Saludos :(.
  #24 (permalink)  
Antiguo 19/04/2015, 13:54
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Duda con Switch - Case

Cita:
Iniciado por DarkScripter Ver Mensaje
Buenas, ya ejecutó pero cuando pongo el color, se queda hasta allí.

Observen:



Jooo, ya me había emocionado y todo :(.

Saludos :(.
Pon el codigo... Pero tiene pinta a que te has comido alguna condición en el switch
  #25 (permalink)  
Antiguo 19/04/2015, 14:12
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Duda con Switch - Case

Código C++:
Ver original
  1. #include <stdio.h> //  Archivo de la biblioteca estándar de Entrada/Salida.
  2. #include <math.h> // archivo estandar de la biblioteca de matematicas
  3. #include <stdlib.h> // Aritméticas, Números aleatorios; y • Conversión de cadenas.
  4. #include <map>
  5. int main(int argc, char *argv[]) {
  6.     char mensaje[100];
  7.     float Monto, Descuento, TotalPagar;
  8.     std::map< std::string, int > colores;
  9.     colores["blanco"]=1;
  10.     colores["verde"]=2;
  11.     colores["amarillo"]=3;
  12.     colores["azul"]=4;
  13.     colores["rojo"]=5;
  14.     printf("Dime el Monto de la Compra:");
  15.     scanf("%f",&Monto);
  16.     printf("=============================================================\n");
  17.     printf("Dime El Color que Recibiste:");
  18.     scanf("%s", mensaje);
  19.     printf("=============================================================\n");
  20.     for( auto& c : mensaje ) c = tolower( c );
  21.     int colorInt = colores[ mensaje ];
  22.     switch ( colorInt ) {
  23.         case 1:
  24.             TotalPagar = Monto;
  25.             printf("Lo sentimos, no obtuvo ningun descuento\n");
  26.             printf("El monto total a pagar es:%f\n",TotalPagar);
  27.             break;
  28.         case 2:
  29.             //verde
  30.             break;
  31.         case 3:
  32.             //amarillo
  33.             break;
  34.         case 4:
  35.             //azul
  36.             break;
  37.         case 5:
  38.             //rojo
  39.             break;
  40.         default:
  41.             std::cout << "No existe ese caso" << std::endl
  42.             break;                                             
  43.     }
  44.      
  45.     system("pause");
  46.     return 0;
  47. }

Este es el código que me compila. Si tienes otro diferente ponlo aquí. No te olvides de sacar la & delante de mensaje a la hora de leer. Lo compile en Dev C++ igual que tu.
  #26 (permalink)  
Antiguo 19/04/2015, 19:35
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

Este es el código que tengo bro:

Código C++:
Ver original
  1. #include <stdio.h> //  Archivo de la biblioteca estándar de Entrada/Salida.
  2. #include <math.h> // archivo estandar de la biblioteca de matematicas
  3. #include <stdlib.h> // Aritméticas, Números aleatorios; y • Conversión de cadenas.
  4. #include <map>
  5. #include <string>
  6. int main(int argc, char *argv[])
  7. {
  8.   std::string mensaje;
  9.   float Monto, Descuento, TotalPagar;
  10.   std::map< std::string, int > colores;
  11.    colores["blanco"]=1;
  12.    colores["verde"]=2;
  13.    colores["amarillo"]=3;
  14.    colores["azul"]=4;
  15.    colores["rojo"]=5;
  16.     printf("Introduce el monto de la compra:");
  17.     scanf("%f",&Monto);  
  18.     printf("=============================================================\n\n");
  19.     printf("Introduce el color que has recibido:");
  20.     scanf("%s",&mensaje);
  21.     printf("=============================================================\n\n");
  22.     for( size_t i=0; i<mensaje.length(); ++i ) mensaje[i] = tolower(mensaje[i]);
  23.     int colorInt = colores[ mensaje ];
  24.     switch ( colorInt )
  25.     {  
  26.         case 1:
  27.             Descuento = 0;    
  28.             printf("Lo sentimos, no obtuvo ningun descuento\n\n");
  29.             break;      
  30.         case 2:    
  31.             Descuento= (Monto*0.10);
  32.             printf("El Descuento por la Compra es: %f\n\n",Descuento);
  33.             break;
  34.         case 3:
  35.             Descuento= (Monto * 0.25);
  36.             printf("El Descuento por la Compra es: %f\n\n",Descuento);
  37.             break;
  38.         case 4:
  39.             Descuento= (Monto * 0.50);
  40.             printf("El Descuento por la Compra es: %f\n\n",Descuento);
  41.             break;
  42.         case 5:
  43.             (Descuento= Monto);
  44.             printf("El Descuento por la Compra es: %f\n\n",Descuento);
  45.             break;                          
  46.     }
  47.   TotalPagar= Monto - Descuento;
  48.   printf("El monto total a pagar es= %f\n\n",TotalPagar);
  49.   system("pause"); 
  50.   return 0;
  51. }

El ejecuta normalmente si le quito el for y hace sus sentencias normal, pero ahora no sé que pasó que me dio ese error de no hacer los case.

Cuando el destino te dice que no eres bueno en algo :(.

Saludos
  #27 (permalink)  
Antiguo 20/04/2015, 00:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Duda con Switch - Case

Estás programando en C++. Para gestionar la entrada (teclado) / salida (consola) en C++ es casi más recomendable usar las clases cin y cout, las cuales se encuentran en la librería iostream. La ventaja de usar esta librería es que es compatible con la clase "string" de C++:

Código C++:
Ver original
  1. std::cout << "Introduce el monto de la compra:" ;
  2. std::cin >> Monto;
  3. std::cout << "=============================================================\n\n";
  4. std::cout << "Introduce el color que has recibido:";
  5. std::cin >> mensaje;
  6. std::cout << "=============================================================\n\n";

Con esto ya debería funcionar tu programa. Sin embargo me gustaría destacar un pequeño detalle... si el usuario introduce un color no válido la aplicación no va a mostrar ningún mensaje... en mi opinión, lo que puedes hacer, es añadir la opción "default" al final del switch y mostrar ahí un mensaje de error:

Código C++:
Ver original
  1. switch( )
  2. {
  3.   // ...
  4.  
  5.   default:
  6.   {
  7.     // Mensaje de error
  8.   }
  9. }

Un saludo
  #28 (permalink)  
Antiguo 20/04/2015, 00:24
 
Fecha de Ingreso: abril-2015
Ubicación: En mi casa
Mensajes: 15
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Duda con Switch - Case

Cita:
Iniciado por eferion Ver Mensaje
Estás programando en C++. Para gestionar la entrada (teclado) / salida (consola) en C++ es casi más recomendable usar las clases cin y cout, las cuales se encuentran en la librería iostream. La ventaja de usar esta librería es que es compatible con la clase "string" de C++:

Código C++:
Ver original
  1. std::cout << "Introduce el monto de la compra:" ;
  2. std::cin >> Monto;
  3. std::cout << "=============================================================\n\n";
  4. std::cout << "Introduce el color que has recibido:";
  5. std::cin >> mensaje;
  6. std::cout << "=============================================================\n\n";

Con esto ya debería funcionar tu programa. Sin embargo me gustaría destacar un pequeño detalle... si el usuario introduce un color no válido la aplicación no va a mostrar ningún mensaje... en mi opinión, lo que puedes hacer, es añadir la opción "default" al final del switch y mostrar ahí un mensaje de error:

Código C++:
Ver original
  1. switch( )
  2. {
  3.   // ...
  4.  
  5.   default:
  6.   {
  7.     // Mensaje de error
  8.   }
  9. }

Un saludo
Así es bro, funciona al toque, muchas gracias en verdad por toda la ayuda y lamento mucho que haya sido tan novato y haber dado muchos problemas de acuerdo a esto. También le doy las gracias a Vangodp porque ambos me enseñaron mucho y me tuvieron paciencia xD.

PD: Mañana veo esa clase, tiempo de abofetear al profe por inventor :(.

Saludos y nuevamente gracias :), cierro tema.
  #29 (permalink)  
Antiguo 20/04/2015, 03:54
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Duda con Switch - Case

Programar es eso compañero. Es leer y releer hasta que quedas con la copla ;)
No desista nunca.

Suerte.

Etiquetas: case, char, funcion, int, programa, switch
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:18.