2012-02-09 10 views
5

Soy muy nuevo en el concepto de programación en C++. Estoy queriendo tener una declaración de multi condición si uso el || oy el y & & en una sola declaración. Cuando le pregunto al profesor de la universidad sobre eso. Ella dijo que era posible y luego insultó mi conocimiento limitado sobre el tema. Todos los ejemplos a los que tengo acceso muestran una declaración múltiple & & y solo una muestra el ||. No muestra que se usen juntos. Me gustaría aprender cómo hacer funcionar la línea. Adjuntaré el código que tengo. El área problemática es la última parte de la codificación.multi condición if statement C++

# include <iostream> 
# include <cstring> 

using namespace std; 

main() 
{ 

    const int maximumHours = 774; 
    char customerPackage; 
    double hoursUsed = 0, 
      packageA = 9.95, 
      packageB = 14.95, 
      packageC = 19.95, 
      overPackageA = 2.00, 
      overPackageB = 1.00, 
      overTime = 0, 
      amountDue = 0, 
      excessCharged = 0; 

    cout << "Please enter the customer's package: "; 
    cin >> customerPackage; 

    switch (customerPackage) 
    { 
     case 'a' : 
      cout << "Please enter the number of hours used: "; 
       cin >> hoursUsed; 
      break; 

     case 'A' : 
      cout << "Please enter the number of hours used: "; 
       cin >> hoursUsed; 
      break; 

     case 'b' : 
      cout << "Please enter the number of hours used: "; 
       cin >> hoursUsed; 
      break; 

     case 'B' : 
      cout << "Please enter the number of hours used: "; 
       cin >> hoursUsed; 
      break; 

     case 'c' : 
      cout << "Please enter the number of hours used: "; 
       cin >> hoursUsed; 
      break; 

     case 'C' : 
      cout << "Please enter the number of hours used: "; 
      cin >> hoursUsed; 
      break;   
     default: cout << "Error." 
      << " Please enter the customer's purchased package: "; 
     cin >> customerPackage; 
    }  

    if (customerPackage ='a' || customerPackage ='A' && hoursUsed >= 10)   
     amountDue = packageA; 
     else 
      overTime = packageA - hoursUsed; 
      excessCharged = overTime * overPackageA; 
      amountDue = packageA + excessCharged; 
} 
+6

Haga la comparación con '==', not '='. Y asegúrese de usar '()' para eliminar la ambigüedad de sus condiciones. De lo contrario ... ¿qué pasa? Llamar a su código un "área problemática" no nos da mucho que seguir en términos de averiguar qué quiere que haga y no lo hace. –

+0

operador de comparación es * == * en c/C++ – Gigi

+3

Además, hazte un favor y coloca paréntesis alrededor de cada comparación, solo para que tú y todos los demás estén seguros del orden de los && y || encima. –

Respuesta

10

Su problema es que && tiene mayor precedencia que || por lo que necesita parens. Como se señaló en un comentario también es necesario utilizar == en lugar de asignación (=):

if ((customerPackage =='a' || customerPackage =='A') && hoursUsed >= 10)

0

se pueden utilizar paréntesis para especificar el orden en que se ejecutan los operadores booleanos. Es probable que desee evaluar el primer ||, por lo que tendría que utilizar:

if ((customerPackage == 'a' || customerPackage == 'A') && hoursUsed >= 10) 

El && normalmente se evalúa primero por defecto, ya que tiene mayor precedencia, por lo que su código es equivalente a esto:

if (customerPackage == 'a' || (customerPackage == 'A' && hoursUsed >= 10)) 

Además, como se señala en los comentarios, utilice == para comparar y = para la asignación.

+0

gracias. esta es una información muy útil y, en caso de que necesite pedir ayuda nuevamente, me esforzaré por ser más detallada. – user1200066

+0

fuera del espacio postal, supongo. volverá a publicar con nueva información – user1200066

4
if (customerPackage ='a' || customerPackage ='A' && hoursUsed >= 10) 

Estás tan cerca de tener la respuesta correcta. Te voy a dar dos consejos:

  1. El operador = no es el mismo que el operador ==. = es el operador de asignación. Evalúa su lado derecho y almacena el resultado en la variable nombrada en su lado izquierdo. Quiere ==, el operador de igualdad. Prueba para ver si su lado derecho y su lado izquierdo son iguales.

  2. Use el paréntesis (...) para hacer cumplir su intención de orden de evaluación. Claramente quiere decir "Si el paquete de cliente es 'a' o es 'A', y también las horas utilizadas son suficientemente grandes, entonces ...".

Pruebe esta línea:

if ((customerPackage == 'a' || customerPackage == 'A') && hoursUsed >= 10) 
6

Otros ya que han ayudado con el problema que se ha notado.Voy a empezar con un problema distinto que al parecer no ha notado (todavía):

else 
     overTime = packageA - hoursUsed; 
     excessCharged = overTime * overPackageA; 
     amountDue = packageA + excessCharged; 

Si quieres los tres de esos estados controlados por el else, necesitará englobar en los apoyos para crear una sentencia compuesta :

else { 
    overTime = packagA - hoursUsed; 
    excessCharged = overTime * overPackageA; 
    amountDue = packageA + excessCharged; 
} 

Tal como está en este momento, su código es realmente:

else 
     overTime = packageA - hoursUsed; 
    excessCharged = overTime * overPackageA; 
    amountDue = packageA + excessCharged; 

es decir, los cálculos para excessCharged y amountDue se llevan a cabo independientemente de si la condición en la declaración if era verdadera o falsa.

También me cuenta que su estado de cuenta switch en realidad no lograr mucho:

switch (customerPackage) 
{ 
    case 'a' : 
     cout << "Please enter the number of hours used: "; 
      cin >> hoursUsed; 
     break; 

    case 'A' : 
     cout << "Please enter the number of hours used: "; 
      cin >> hoursUsed; 
     break; 

    case 'b' : 
     cout << "Please enter the number of hours used: "; 
      cin >> hoursUsed; 
     break; 

    case 'B' : 
     cout << "Please enter the number of hours used: "; 
      cin >> hoursUsed; 
     break; 

    case 'c' : 
     cout << "Please enter the number of hours used: "; 
      cin >> hoursUsed; 
     break; 

    case 'C' : 
     cout << "Please enter the number of hours used: "; 
     cin >> hoursUsed; 
     break;   
    default: cout << "Error." 
     << " Please enter the customer's purchased package: "; 

En particular, se toma exactamente la misma acción para todos los casos (excepto el valor por defecto). Se puede simplificar esto un poco mediante el uso de las caídas a través de casos:

switch (customerPackage) { 
    case 'a': 
    case 'A': 
    case 'b': 
    case 'B': 
    case 'c': 
    case 'C': 
      cout << "Please enter the number of hours used: "; 
      cin >> hoursUsed; 
      break; 
    default: 
     cout << "Error " /* ... */; 
} 

Alternativamente, usted podría considerar algo como:

static const char valid[] = "aAbBcC"; 

if (strchr(valid, userPackage)) { 
    cout << "Please enter the number of hours used: "; 
    cin >> hoursUsed; 
} 
else { 
    std::cout << "Error: Please enter the customer's purchased package"; 
    std::cin >> userPackage; 
} 

Personalmente, sin embargo, yo estructuro cosas un poco diferente: en primer lugar conseguir una entrada válida, a continuación, obtener la siguiente:

do { 
    std::cout << "Please enter the customer's purchased package (a, b, or c): "; 
    std::cin >> userPackage; 
} while (!strchr(valid, userPackage)); 

std::cout << "Please enter the number of hours used: "; 
std::cin >> hoursUsed; 

if (tolower(customerPackage == 'a') && hoursUsed >= 10) 
// ... 
+0

En primer lugar, gracias a todos los que me están ayudando. Realicé cambios basados ​​en la información que se comparte aquí y doy crédito donde corresponde. Ya casi termino con el programa. Estoy teniendo dos problemas. uno es que el problema es pasar por todos los paquetes y calcular las cantidades incorrectas. He retrocedido e hice los cambios sugeridos para el problema de no caerme de la declaración if cuando sea necesario. Sé que es un pequeño paso que me estoy perdiendo. Nuevamente gracias a todos. – user1200066

+0

+1 para un análisis detallado. – erict

0

Con el nuevo problema que está teniendo (en el que pidió other question), necesitará algún tipo de reestructuración.

if ((customerPackage == 'b' || customerPackage == 'B') && hoursUsed <= 20) 

    amountDue = packageB; 

    else 
    { 
     /* calculations */ 
    } 

no es correcto, que debería ser

if (customerPackage == 'b' || customerPackage == 'B') 
{ 
    if (hoursUsed <= 20) 
    { 
     amountDue = packageB; 
    } 
    else 
    { 
     /* calculations */ 
    } 
} 

otro caso, sólo se ejecutará la primera declaración cuando el paquete = B y hora = 20, de lo contrario los cálculos se realizarán en todos los otros casos, como cuando el paquete es A, o C.

Espero que esto ayude!