2016-11-25 1 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

또한, 실패하면 항상 원하지 않는 입력 값을 가지므로 검사가 실패합니다 (대부분의 경우). – kevr

+1

'float num = std :: stof (input)'은'istringstream' IMO를 사용하는 것보다 읽기가 쉽습니다. –

+0

@kevr 개선해야 할 것이 많이 있습니다. 나는 그 질문에 답하려고 노력했습니다. 여기에 Stackoverflow와 다른 곳에서 많은 코드 예제가 있습니다. –

관련 문제