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

Tengo este algoritmo: Duda con condicional

Estas en el tema de Tengo este algoritmo: Duda con condicional en el foro de C/C++ en Foros del Web. Quisiera saber como puedo cambiar en los condicionales el numero que estoy asignando por una palabra, por ejemplo que escriba ROJA y me imprima un ...
  #1 (permalink)  
Antiguo 03/04/2016, 19:14
 
Fecha de Ingreso: marzo-2016
Mensajes: 20
Antigüedad: 8 años
Puntos: 0
Mensaje Tengo este algoritmo: Duda con condicional

Quisiera saber como puedo cambiar en los condicionales el numero que estoy asignando por una palabra, por ejemplo que escriba ROJA y me imprima un tipo de descuento.. Ya estuve realizando varias pruebas y solo me funciona con números.



#include <iostream>

using namespace std;
int main()
{
float Bola,PrecioDes,CantidadAP;

PrecioDes=0;
CantidadAP=0;

cout<<("\nIntroduzca el precio total: ");

cin>> CantidadAP;

cout<<("\nCual es el codigo de la bolita: ");

cin>> Bola;

if(Bola==1) {
cout<<("\nNo posee descuento") << endl;
}

else if (Bola==2) {
cout<<("\nPosee un descuento de 10%") << endl;

PrecioDes=(CantidadAP-((CantidadAP*10)/100));

cout <<"\nTotal a pagar es: " << PrecioDes << endl;
}

else if (Bola==3){
cout<<("\nPosee un descuento de 25%");

PrecioDes=(CantidadAP-((CantidadAP*25)/100));

cout <<"\nTotal a pagar es: " << PrecioDes << endl;
}

else if(Bola==4){
cout<<("\nPosee un descuento de 50%") << endl;

PrecioDes=(CantidadAP-((CantidadAP*50)/100));

cout <<"\nTotal a pagar es: " << PrecioDes << endl;
}

else {

cout<< "\nLa compra es gratis" << endl;

}
system("PAUSE");
return(0);

}
  #2 (permalink)  
Antiguo 03/04/2016, 23:27
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Tengo este algoritmo: Duda con condicional

Lo primero antes de nada. Si Bola únicamente almacena enteros debería ser int en vez de float. Si no quieres errores raros en tu código acostúmbrate a usar el tipo correcto para cada variable.

Y otro detalle más, std::cout no necesita paréntesis para sacar el contenido por la pantalla.

Lo que pretendes puedes hacerlo de varias formas, pero básicamente todas pasan por comparar números o cadenas.

Para hacer la versión sencilla, es decir, comparando palabras, tienes que tener en cuenta que no es posible comparar dos char* usando el operador de comparación ==, sino que has una función del tipo strcmp. Una opción más sencilla es usar la clase std::string:

Código C++:
Ver original
  1. std::string bola;
  2. cout<<("\nCual es el color de la bolita: ");
  3.  
  4. cin>> bola;
  5.  
  6. if(Bola==" negro") {
  7.   cout<<("\nNo posee descuento") << endl;
  8. }
  9.  
  10. else if (Bola=="rojo") {
  11.   cout<<("\nPosee un descuento de 10%") << endl;
  12. }

Por cierto, nota que el código es sensible al uso de mayúsculas.

Otra opción pasa por comparar códigos. En este caso recuperamos un string y calculamos el código que tiene asociado. En este caso, por claridad, se puede usar la clase std::map para guardar la relación entre un color y su código:

Código C++:
Ver original
  1. std::map<std::string,int> mapa;
  2. mapa["negro"]=1;
  3. mapa["rojo"]=2;
  4.  
  5. std::string bola;
  6. cout<<("\nCual es el color de la bolita: ");
  7.  
  8. cin>> bola;
  9. int codigo=mapa[bola];
  10.  
  11.  
  12. if(codigo==1) {
  13.   cout<<("\nNo posee descuento") << endl;
  14. }
  15.  
  16. else if (codigo==2) {
  17.   cout<<("\nPosee un descuento de 10%") << endl;
  18. }

Aunque quizás, ya puestos, lo suyo sería que el mapa almacenase directamente el descuento, lo que nos permitiría ahorrarnos código repetido:


Código C++:
Ver original
  1. std::map<std::string,int> mapa;
  2. mapa["negro"]=0;
  3. mapa["rojo"]=10;
  4. // ...
  5.  
  6. cout<<("\nCual es el color de la bolita: ");
  7.  
  8. std::string bola;
  9. cin>> bola;
  10. int descuento=mapa[bola];
  11.  
  12. if(descuento==0)
  13.   cout< ("\nNo posee descuento" << endl;
  14. else if (descuento==100)
  15.   cout<< "\nLa compra es gratis" << endl;
  16. else
  17. {
  18.   cout<<"\nPosee un descuento de " << descuento << "%" << endl;
  19.  
  20.   float PrecioDes=(CantidadAP-((CantidadAP*descuento)/100));
  21.  
  22.   cout <<"\nTotal a pagar es: " << PrecioDes << endl;
  23. }

Hay más formas de hacerlo pero las expuestas bastan para darte una idea sobre cómo resolver el problema.

Por cierto, copiar y pegar el código no te va a servir de mucho a la hora del examen. Es recomendable que entiendas lo que estás poniendo aunque la solución propuesta no sea la mejor de todas.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 12/04/2016, 08:17
 
Fecha de Ingreso: marzo-2016
Mensajes: 20
Antigüedad: 8 años
Puntos: 0
Respuesta: Tengo este algoritmo: Duda con condicional

GRacias amigo! Me sirvio mucho tu ayuda.. Tambien encontre otra forma utilizando el string.. Ya que necesitaba imprimir era caracteres
  #4 (permalink)  
Antiguo 12/04/2016, 10:37
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Tengo este algoritmo: Duda con condicional

Me surge una duda acerca de lo que haces con std::map. Si tienes:
Código C++:
Ver original
  1. std::map<std::string,int> mapa;
  2. mapa["negro"]=0;
  3. mapa["rojo"]=10;
  4.  
  5. cout<<("\nCual es el color de la bolita: ");
  6.  
  7. std::string bola;
  8. cin>> bola;
  9. int descuento=mapa[bola];
Y bola vale por ejemplo "verde" ¿que comportamiento tendría? Es que nunca traté con ello.
  #5 (permalink)  
Antiguo 12/04/2016, 17:11
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: Tengo este algoritmo: Duda con condicional

Cita:
Y bola vale por ejemplo "verde" ¿que comportamiento tendría? Es que nunca traté con ello.
Según el estándar. El hacer mapa["Verde"], literalmente se crea una nueva entrada para esa llave.

Lo que sucede a continuación es que al crearse el nuevo elemento, y el valor ser de tipo int, se inicializa a 0.
Al final, se regresa una referencia a a ese int inicializado en 0.

Sin embargo, si el valor fueran arreglos o estructuras mas complejas, no hay inicialización, por lo que podrías obtener basura en los diferentes campos.

Saludos
  #6 (permalink)  
Antiguo 13/04/2016, 01:06
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Tengo este algoritmo: Duda con condicional

Cita:
Iniciado por Instru Ver Mensaje
Sin embargo, si el valor fueran arreglos o estructuras mas complejas, no hay inicialización, por lo que podrías obtener basura en los diferentes campos.
Si el campo "valor" del mapa únicamente puede devolver basura si se trata de un objeto y su constructor por defecto no está correctamente implementado.

El motivo es que std::map, al pedirle una clave que no existe, crea una nueva entrada en su lista interna y el campo "valor" se inicializa llamando a su constructor por defecto (si lo hubiese) o asignando el valor 0, el cual es aceptado por todos los tipos nativos (int, float, double, char, punteros...)

Lo que sí que puede presentar basura (o incluso un casque en la aplicación) es, en el caso de que el campo valor sea un puntero, intentar acceder al contenido del mismo. A estas alturas de la vida todos entendemos que acceder al contenido de un puntero nulo no es nunca una buena idea.

Lo comentado anteriormente explica por qué podemos tener problemas al intentar meter en el campo valor de un mapa una clase con su constructor por defecto deshabilitado (por ejemplo declarado en la parte private) o borrado (usando delete en C++11 en adelante). La razón que subyace detrás es que en el caso de los templates el compilador únicamente compila las funciones que se usan realmente. En este caso el operador[], de usarlo, trata de llamar al constructor por defecto y eso tira un error de compilación... pero si se evita su uso el mapa no tendrá inconvenientes en aceptar objetos sin constructor por defecto.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #7 (permalink)  
Antiguo 13/04/2016, 03:58
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Tengo este algoritmo: Duda con condicional

Entonces para el ejercicio en cuestión no es tan buena idea usar std::map sobre todo si el valor 0es un valor válido ¿no? Y suponiendo que 0 no es un valor válido y se ha creado ¿como corriges eso para quitarlo del mapa?
  #8 (permalink)  
Antiguo 13/04/2016, 04:23
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Tengo este algoritmo: Duda con condicional

Hay formas de saber si la clave existe o no en el mapa:
Código C++:
Ver original
  1. int main()
  2. {
  3.   std::map<int,int> mapa;
  4.   mapa.insert(std::make_pair(1,11));
  5.   mapa.insert(std::make_pair(4,67));
  6.   mapa.insert(std::make_pair(9,18));
  7.   mapa[5] = 22;
  8.  
  9.   for( auto i=0; i<10; i++ )
  10.   {
  11.     if( mapa.count(i) == 0 )
  12.       std::cout << "La clave " << i << " no existe en el mapa\n";
  13.     else
  14.       std::cout << "mapa[" << i << "] = " << mapa[i] << "\n";
  15.   }
  16. }

Para evitar lanzar dos búsquedas por cada clave que existe en el mapa se pueden usar también iteradores:

Código C++:
Ver original
  1. int main()
  2. {
  3.   std::map<int,int> mapa;
  4.   mapa.insert(std::make_pair(1,11));
  5.   mapa.insert(std::make_pair(4,67));
  6.   mapa.insert(std::make_pair(9,18));
  7.   mapa[5] = 22;
  8.  
  9.   for( auto i=0; i<10; i++ )
  10.   {
  11.     auto it = mapa.find(i);
  12.     if( it == mapa.end() )
  13.       std::cout << "La clave " << i << " no existe en el mapa\n";
  14.     else
  15.       std::cout << "mapa[" << i /* tambien se puede usar it->first */ << "] = " << it->second << "\n";
  16.   }
  17. }
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: saludos
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 14:09.