C ++ Бесконечный цикл while, если указан неправильный тип для условия - PullRequest
0 голосов
/ 20 февраля 2019

[ОБНОВЛЕНО] У меня есть следующий код в C ++ (пропуская ненужные детали):

#include <iostream>

using namespace std;
int main() {
    double value;
    double sum = 0;
    double max, min;
    string msg = "Enter next value (-1) to end: ";
    int validCounter = 0;

do{
    cout << msg;
    cin >> value;  // Values assumed to be numbers
}
while (value <= 0 and value != -1);

if (value > 0.0){sum+= value, max = value, min = value, validCounter = 1;}  // Initial values of min, max, validCounter = 1
while (value != -1){
    cout << msg;
    cin >> value;

    // Only take positive values into consideration for stats
    if (value > 0) {
        validCounter++;
        sum += value;
        if (value > max) { max = value; }
        if (value < min) { min = value; }
    }
}
cout << to_string(validCounter) + " valid value(s) entered" << endl;
if (validCounter > 0){
    cout << "Minimum: " + to_string(min) << endl;
    cout << "Maximum: " + to_string(max) << endl;
    cout << "Moyenne: " + to_string(sum/validCounter) << endl;
}

return 0;

}

Однако, когда будет предложено ввести значение (должно бытьдля простоты, это программа для начинающих) если введенное значение не является двойным, цикл while начинает бесконечно отображать подсказку ввода.Почему это?Это из-за того, что сравнение String! = -1 (или любого другого не типа int / double) вызывает повторение цикла?Я совершенно запутался здесь.

1 Ответ

0 голосов
/ 20 февраля 2019

замените

do{
    cout << msg;
    cin >> value;  // Values assumed to be numbers
}
while (value <= 0 and value != -1);

на

do {
  cout << msg;
  if (!(cin >> value)) {
    string dummy;

    cin.clear();   // to be able to read double
    cin >> dummy; // to remove the non float
    value = 0;
  }
  while (value <= 0 and value != -1);

, вам нужно сбросить ошибку, чтобы иметь возможность читать снова, затем, чтобы обойти неправильный ввод, может быть, вы также можете просто прочитатьперсонаж, решить, что делать в случае ошибки

Пример:

#include <iostream>
using namespace std;

int main()
{
  double value;

  do {
    cout << "value please" << endl;
    if (!(cin >> value)) {
      string dummy;

      cin.clear();
      cin >> dummy;
      value = 0;
    }
  } while (value <= 0 and value != -1);

  cout << "valid double :" << value << endl;
  return 0;
}

Компиляция и выполнение:

% ./a.out
value please
aze
value please
-12
value please
12
valid double :12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...