Почему мой цикл while выполняется независимо от того, что я ввожу? - PullRequest
0 голосов
/ 23 марта 2011
/*********************************************************
** Purpose: Asks the user for cable package they bought **
** and the amount of hrs they used and //tells them     **
** their monthly bill                                   **
**********************************************************/                                        




#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    //Defining variables
    double hours_over;  //Amount of hrs the user went over their monthly allottment
    double extra_pay;   //Extra bill amount for going over monthly hrs allotted
    double monthly_bill;  //Monthly bill the user will pay
    int hours;          // How many hours the user used during the month
    char package;       //The package the user chose

    //Getting the package the user bought
    cout << "Your monthly subscription bill is based on your package.";
    cout << "\n\nWhat package did you buy? Enter A, B or C: ";
    cin >> package;

    //Validating user input-must enter A, B or C
    while (package != 'A' || package != 'B' || package != 'C')
    {
      cout << "\nPlease enter A, B or C(capitalized).";
      cout << "\n\nWhat package did you buy?: ";
      cin >> package;
    }

    //Getting hours the user used during month
    cout << "How many hours did you use?: ";
    cin >> hours;

    //Validating user input-hrs cant exceed 744
    while (hours > 744)
    {
      cout << "I'm sorry but your monthly usage cannot exceed 744 hrs.";
      cout << "\nPlease enter another number.";
      cout << "How many hours did you use?: ";
      cin >> hours;
    }

    //Fixing decimal place of answers
    cout << setprecision(2) << fixed << showpoint << endl;

    //Switch statement-go to the package the user bought
    switch (package)
    {
       case 'A':
            if (hours > 10)
            {
                      hours_over=hours-10;
                      extra_pay=hours_over*(2.00);
                      monthly_bill=9.95+extra_pay;

                      cout << "Your monthly bill is: $" << monthly_bill << endl;
            }
            else
            {
                 cout << "Your monthly bill is: $9.95";
            }
            break;

       case 'B':
            if (hours > 20)
            {
                      hours_over=hours-20;
                      extra_pay=hours_over;
                      monthly_bill=14.95+extra_pay;

                      cout << "Your monthly bill is: $" << monthly_bill << endl;
            }
            else
            {
                 cout << "Your monthly bill is: $14.95";
            }
            break;

       case 'C':
            cout << "Your monthly bill is: $19.95";
            break;

       default:
            break;   
    }

cin.get();
return 0;
}

Ответы [ 7 ]

3 голосов
/ 23 марта 2011

Ваш тест на A, B или C неправильный

 while (package != 'A' || package != 'B' || package != 'C')

должно быть

 while (package != 'A' && package != 'B' && package != 'C')
2 голосов
/ 23 марта 2011

Рассмотрим ваше выражение:

while (package != 'A' || package != 'B' || package != 'C') {

Пусть пакет имеет значение "A".

Это оценивается как

false || true || true

что, конечно, верно.

1 голос
/ 23 марта 2011

Эта строка всегда имеет значение true:

while (package != 'A' || package != 'B' || package != 'C')

вероятно, оно должно быть:

while (package != 'A' && package != 'B' && package != 'C')
0 голосов
/ 23 марта 2011
cin >> package;
//Validating user input-must enter A, B or C
while (package != 'A' || package != 'B' || package != 'C')
{
  cout << "\nPlease enter A, B or C(capitalized).";
  cout << "\n\nWhat package did you buy?: ";
  cin >> package;
}

Что если значение package равно B , введенному внутри цикла.Он удовлетворяет первому условию package != 'A' и, поскольку после него выполняется ИЛИ ( true || false || true приводит к true ), цикл входит,Вы должны использовать && вместо этого.Итак, измени

 while (package != 'A' && package != 'B' && package != 'C')
 {
     // .....
 }
0 голосов
/ 23 марта 2011

Прежде всего, этот код:

//Validating user input-must enter A, B or C
if (package != 'A' || package != 'B' || package != 'C')
{
  cout << "\nPlease enter A, B or C(capitalized).";
  cout << "\n\nWhat package did you buy?: ";
  cin >> package;
}

не будет работать, потому что (1) вы сравниваете строку (пакет) с символами, и (2) вы используете || (или) вместо && (и). Также (3) вы, вероятно, хотите «пока» вместо «если».

Цикл while работал нормально для меня.

0 голосов
/ 23 марта 2011

«while» будет зацикливаться только тогда, когда вы этого хотите, но «if» будет всегда срабатывать;это то, что вы имели ввиду?«Если» относительно A, B или C всегда срабатывает, потому что вы использовали «||»значение "или", чтобы связать условия.Для любого значения вашей переменной всегда верно, что это не A, или не B, или не C!

0 голосов
/ 23 марта 2011

Вы должны проверить, удалось ли cin передать значение нужного типа, ala if (cin >> my_int), затем использовать std::cin.clear() после ошибочного ввода, прежде чем заставить их повторно вводить значение.В противном случае такие значения мусора, как, например, некоторый текстовый ввод, который не может быть преобразован в int, оставляют std::cin в состоянии ошибки, а следующее std::cin >> xxx даже не предпринимается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...