Problemas con código de parquímetro.

Iniciado por OmarHack, 4 Abril 2013, 04:15 AM

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

OmarHack

E estado haciendo este código que en teoría es bastante simple pero no me encuentro con nada más que problemas, el primero es con el operador "||" debo estarlo usando mal. El segundo es con los if y else, que me muestra todos los else independientemente de si los if se cumplen (aparecen los 3 Precio en pantalla). Y por último el resultado de la variable "Precio" asignado por los if (cuando es menor o igual a 60) no da los precios correctos.
A ver sí sabéis por qué pasa esto, lo he probado y modificado unas cuantas veces y nada '--
Un saludo!



Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

//Delaración globales
    int tipoVehiculo; // 1 = Coche  // 2 = Moto  // 3 = Camión
    int minutosEstancia; // Minutos totales de estacionamiento en parking
    int minutosDiferencia; // Minutos en los que se aplicará la tarifa reducida
    const float precioTarifaBaseCoche = 3.75; // Cantidad a abonar por 1 hora + entrada
    const float precioTarifaBaseMoto = 1.95; // Cantidad a abonar por 1 hora + entrada
    const float precioTarifaBaseCamion = 6.75; // Cantidad a abonar por 1 hora + entrada
    const float precioEntrada = 0.75; // Precio entrada
    const int minutosCambio = 60; // Minutos en los que se aplica la tarifa normal
    const float tarifaNormalCoche = 0.05; // Precio por minuto
    const float tarifaReducidaCoche = 0.03; // Precio por minuto al pasar 1 hora
    const float tarifaNormalMoto = 0.02; // Precio por minuto
    const float tarifaReducidaMoto = 0.01; // Precio por minuto al pasar 1 hora
    const float tarifaNormalCamion = 0.10; // Precio por minuto
    const float tarifaReducidaCamion = 0.05; // Precio por minuto al pasar 1 hora
    float Precio = 0; // Precio definitivo que pagará el cliente

int main()
{



cout << "Si usas un coche pulse 1:\nSi usas moto pulse 2:\nSi usas camion pulsa 3:\n"; // Pide al usuario que indique el tipo de vehículo a estacionar
cin >> tipoVehiculo; // Asigna el número introducido a la variable

if (tipoVehiculo != 1 || 2 || 3) {cout << "No a introducido un numero apto";} // Si la variable no vale 1 o 2 o 3 muestra en pantalla en pantalla el texto
else { // En caso de que el valor de la variable sí sea 1 o 2 o 3 pregunta cuantos minutos ha estado estacionado su vehículo
cout << "¿Cuantos minutos a estado su vehiculo en el parking?";
cin >> minutosEstancia;} // Asigna los minutos dados por el usuario a la variable

minutosDiferencia = minutosEstancia - minutosCambio; // Asigna un valor a la variable



if (tipoVehiculo = 1) // Si es un coche...
{
     if (minutosEstancia <= minutosCambio) // Y ha estado aparcado durante 1 hora o menos...
     {Precio = minutosEstancia * tarifaNormalCoche + precioEntrada; //Precio = Minutos por precio minuto, más tarifa por entrar
     cout <<"El precio es de:" << Precio << "Euros";} // Y muestra en pantalla el importe a pagar
     else {Precio = precioTarifaBaseCoche + minutosDiferencia * tarifaReducidaCoche; // Si en cambio ha estado aparcado más tiempo, calcula el precio a partir de la primera hora y se lo suma al precio de la primera hora
     cout <<"El precio es de:" << Precio << "Euros";} // Y muestra en pantalla el importe a pagar

if (tipoVehiculo = 2) // Si es una moto...
{
     if (minutosEstancia <= minutosCambio) // Ídem coche
     {Precio = minutosEstancia * tarifaNormalMoto + precioEntrada;
     cout <<"El precio es de:" << Precio << "Euros";}
     else {Precio = precioTarifaBaseMoto + minutosDiferencia * tarifaReducidaMoto;
     cout <<"El precio es de:" << Precio << "Euros";}

if (tipoVehiculo = 3)
{
     if (minutosEstancia <= minutosCambio) // Ídem coche
     {Precio = minutosEstancia * tarifaNormalCamion + precioEntrada;
     cout <<"El precio es de:" << Precio << "Euros";}
     else {Precio = precioTarifaBaseCamion + minutosDiferencia * tarifaReducidaCamion;
cout <<"El precio es de:" << Precio << "Euros";}




return 0;
}}
  }}
I like to test things.

x64core

Depura el codigo para que sepas que es lo no esta bien.

rir3760

#2
En C y C++ no debes indicar una condicion de esta forma:
Código (cpp) [Seleccionar]
tipoVehiculo != 1 || 2 || 3
Ya que no tendra el efecto que esperas.

En su lugar debes comparar la variable contra cada uno de los valores:
Código (cpp) [Seleccionar]
tipoVehiculo != 1 || tipoVehiculo != 2 || tipoVehiculo != 3
Pero eso no funcionara ya que la condicion esta mal (debido al uso del operador OR logico), para el caso debe ser:
Código (cpp) [Seleccionar]
tipoVehiculo != 1 && tipoVehiculo != 2 && tipoVehiculo != 3

Es mejor invertir los bloques y verificar si la entrada del usuario es correcta al introducir uno, dos o tres, de esta forma:
Código (cpp) [Seleccionar]
if (tipoVehiculo == 1 || tipoVehiculo == 2 || tipoVehiculo == 3){
  cout << "¿Cuantos minutos a estado su vehiculo en el parking?";
  cin >> minutosEstancia;
}else {
  cout << "No a introducido un numero apto";}
}


Y todos los condicionales como este:
Código (cpp) [Seleccionar]
if (tipoVehiculo = 1)
Se ejecutaran ya que estas utilizando el operador de asignacion "=" cuando deberias utilizar el de comparacion "==".

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

OmarHack

I like to test things.

henkel

mas o menos va así

if (tipoVehiculo < 0 || tipoVehiculo >3 )//así corre


porque no se puede así
tipoVehiculo != 1 || tipoVehiculo != 2 || tipoVehiculo != 3 //caso 1
o así
tipoVehiculo != 1 && tipoVehiculo != 2 && tipoVehiculo != 3 //caso 2

por que en el caso uno si el usuario escribe 1 y el programa vea si tipodeVehiculo es distinto de uno es verdadero pero tipodeVehiculo es distinto de dos no porque el usuario escribió 1

en el segundo caso tampoco es posible por la misma razón si el usuario ingreso 3 tipodeVehiculo es diferente de 1 y de 2  nunca podrá ser al mismo tiempo diferente de 1 y ala vez de 3
Henkel007

rir3760

Cita de: henkel en  4 Abril 2013, 05:42 AM
tipoVehiculo != 1 && tipoVehiculo != 2 && tipoVehiculo != 3 //caso 2

[...]

en el segundo caso tampoco es posible por la misma razón si el usuario ingreso 3 tipodeVehiculo es diferente de 1 y de 2  nunca podrá ser al mismo tiempo diferente de 1 y ala vez de 3
No.

Las condiciones:
Código (cpp) [Seleccionar]
// 1
tipoVehiculo < 0 || tipoVehiculo > 3 // Deberia ser: tipoVehiculo < 1 || tipoVehiculo > 3

// 2
tipoVehiculo != 1 && tipoVehiculo != 2 && tipoVehiculo != 3

Son casi equivalentes y resultan en true si el valor de tipodeVehiculo no es 1, 2 o 3. La primera también resulta en true si tipodeVehiculo es igual a cero (supongo en un error).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

OmarHack

Arreglado :) funcionó perfectamente el que me puso rir3760
Muchísimas gracias a todos.
Tuve un fallo creando el código con los if else, tenía los "}" al final de todo y no al fin de cada if, y así no se cumplían los cout de Precio de moto y camión solo los de coche. Aquí está el código acabado y por fin sin bugs!  :D

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

//Delaración globales
    int tipoVehiculo; // 1 = Coche  // 2 = Moto  // 3 = Camión
    int minutosEstancia; // Minutos totales de estacionamiento en parking
    int minutosDiferencia; // Minutos en los que se aplicará la tarifa reducida
    const float precioTarifaBaseCoche = 3.75; // Cantidad a abonar por 1 hora + entrada
    const float precioTarifaBaseMoto = 1.95; // Cantidad a abonar por 1 hora + entrada
    const float precioTarifaBaseCamion = 6.75; // Cantidad a abonar por 1 hora + entrada
    const float precioEntrada = 0.75; // Precio entrada
    const int minutosCambio = 60; // Minutos en los que se aplica la tarifa normal
    const float tarifaNormalCoche = 0.05; // Precio por minuto
    const float tarifaReducidaCoche = 0.03; // Precio por minuto al pasar 1 hora
    const float tarifaNormalMoto = 0.02; // Precio por minuto
    const float tarifaReducidaMoto = 0.01; // Precio por minuto al pasar 1 hora
    const float tarifaNormalCamion = 0.10; // Precio por minuto
    const float tarifaReducidaCamion = 0.05; // Precio por minuto al pasar 1 hora
    float Precio = 0; // Precio definitivo que pagará el cliente

int main()
{



cout << "Si usas un coche pulse 1:\nSi usas moto pulse 2:\nSi usas camion pulsa 3:\n"; // Pide al usuario que indique el tipo de vehículo a estacionar
cin >> tipoVehiculo; // Asigna el número introducido a la variable

if (tipoVehiculo != 1 && tipoVehiculo != 2 && tipoVehiculo != 3) {cout << "No a introducido un numero apto";} // Si la variable no vale 1 o 2 o 3 muestra en pantalla en pantalla el texto
else { // En caso de que el valor de la variable sí sea 1 o 2 o 3 pregunta cuantos minutos ha estado estacionado su vehículo
cout << "¿Cuantos minutos a estado su vehiculo en el parking?";
cin >> minutosEstancia;} // Asigna los minutos dados por el usuario a la variable

minutosDiferencia = minutosEstancia - minutosCambio; // Asigna un valor a la variable



if (tipoVehiculo == 1) // Si es un coche...
{
     if (minutosEstancia <= minutosCambio) // Y ha estado aparcado durante 1 hora o menos...
     {Precio = minutosEstancia * tarifaNormalCoche + precioEntrada; //Precio = Minutos por precio minuto, más tarifa por entrar
     cout <<"El precio es de:" << Precio << "Euros";} // Y muestra en pantalla el importe a pagar
     else {Precio = precioTarifaBaseCoche + minutosDiferencia * tarifaReducidaCoche; // Si en cambio ha estado aparcado más tiempo, calcula el precio a partir de la primera hora y se lo suma al precio de la primera hora
     cout <<"El precio es de:" << Precio << "Euros";} // Y muestra en pantalla el importe a pagar
}
if (tipoVehiculo == 2) // Si es una moto...
{
     if (minutosEstancia <= minutosCambio) // Ídem coche
     {Precio = minutosEstancia * tarifaNormalMoto + precioEntrada;
     cout <<"El precio es de:" << Precio << "Euros";}
     else {Precio = precioTarifaBaseMoto + minutosDiferencia * tarifaReducidaMoto;
     cout <<"El precio es de:" << Precio << "Euros";}
}
if (tipoVehiculo == 3)
{
     if (minutosEstancia <= minutosCambio) // Ídem coche
     {Precio = minutosEstancia * tarifaNormalCamion + precioEntrada;
     cout <<"El precio es de:" << Precio << "Euros";}
     else {Precio = precioTarifaBaseCamion + minutosDiferencia * tarifaReducidaCamion;
cout <<"El precio es de:" << Precio << "Euros";}

}


return 0;
}
I like to test things.

85

#7
Cita de: OmarHack en  4 Abril 2013, 17:07 PM
... sin bugs!  :D

con que sin bugs eh? arre XD

cuando tenés así..


if (tipoVehiculo == 1) // Si es un coche...
{
...
}
if (tipoVehiculo == 2) // Si es una moto...
{
...
}
if (tipoVehiculo == 3)
{
...
}


se utiliza IF + ELSE IF de esta forma:

if (tipoVehiculo == 1) // Si es un coche...
{
...
}
else f (tipoVehiculo == 2) // Si es una moto...
{
...
}
else if (tipoVehiculo == 3)
{
...
}


eso para que no tengas que comprobar todos los casos innecesariamente.

mejor aún, es usar un selector de casos 'SWITCH', el cual actúa como una tabla indexada, con la cual se puede acceder a la posición correcta dentro de la tabla, de esta forma:

switch(tipoVehiculo)
{
case 1: {...}break;
case 2: {...}break;
case 3: {...}break;
}


PS: era pseudocódigo no es para compilar
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/

OmarHack

Con la expresión "sin bugs" me refiero a que el código funciona como yo quiero que funcione, y sin errores. Ahora es lo que hace.
Muchas gracias igualmente, aun voy aprendiendo poco a poco en algunos de mis ratos libres. Si no es por vosotros iva a tener muy difícil seguir aprendiendo de forma autodidacta.
I like to test things.