2016-11-25 4 views
1

Итак, я делаю калькулятор с основным меню, чтобы я продолжал операцию до тех пор, пока пользователь не нажмет $, а затем вернется в главное меню. Когда я тестирую его, он бросает мой код в бесконечный цикл. Что я сделал не так? Ниже приведен фрагмент одной функции. (меню объявлено недействительным)Застревает в бесконечном цикле при попытке разрыва цикла while

float makeSum(float num1, float num2) { 

float r = 0; 
bool ended = false; 
do { 
    cout << "Please provide the first number: " << endl; 
    cin >> num1; 

    if (num1 == '$') { 
     ended = true; 
    } 

    cout << "Please provide the second number: " << endl; 
    cin >> num2; 

    if (num2 == '$') { 
     ended = true; 

    r = num1 + num2; 
    cout << "Result: " << r << endl; 
} while (!ended); 

menu(); 
return r; 

} 
+0

Функция, которую вы показываете, не должна строиться, она не имеет закрывающей скобки '}'. –

+0

В каком случае вы ожидали бы значения типа 'float', считанного от пользователя, для проверки как равного' '$ ''? Конечно, нет, если пользователь вводит '$', поскольку потоковые операторы не знают, как преобразовать это значение в значение с плавающей запятой. Если ваша реализация использует набор символов ASCII (или один из них совместим с ним), ввод значения «36» приведет к завершению цикла, потому что '36' является интегральным значением' '$ ''. – Peter

ответ

5

Это не сработает наверняка. Когда вы говорите:

float num2; 

, а затем позже:

cin >> num2; 

Тогда только поплавки будет считан из входного потока. Одним из путей выхода из этого иметь, внутри цикла:

string input; 
... 
cin >> input; 
if (input == "$") break; 
istringstream s(input); 
float num; 
s >> num; // now you read a float from the string 

Другое дело, что это просто легче вырваться из петли, используя break как я показал в фрагменте кода выше, вместо использования булевский флаг и проверка его.

+1

, кроме того, вы всегда должны проверять состояние cin, потому что, если он терпит неудачу, у вас будут входные данные, которые вам не нужны, поэтому ваши проверки не будут работать (большую часть времени). – kevr

+1

'float num = std :: stof (input)' будет проще читать, чем с помощью IMO 'istringstream'. –

+0

@ kevr Есть многое, что нужно улучшить, я попытался ответить на вопрос в его нынешнем виде. Здесь много примеров кода на Stackoverflow и в других местах. –

Смежные вопросы