2017-02-03 61 views
-1

我的程序正確運行第一個For循環,然後在第二和第三循環中跳過Cin。然後當循環結束時,繼續計算第一個索引[0]的BMI,並正確執行此操作,並給出正確的答案,但對索引的1和[2]沒有任何影響,因爲沒有輸入任何信息,因爲cin被跳過。爲什麼我的程序在For循環的第一個循環後跳過cin >>?

#include "stdafx.h" 
#include <iostream> 
#include <string> 
using namespace std; 

struct Patient 
{ 
    double height; 
    double weight; 
    int age; 
    bool isMale; 
}; 


int main() 
{ 
Patient Patients[3]; 

for (int i = 0; i < 3; i++) { 
    cout << "Patient "<< i << " Height: "; 
    cin >> Patients[i].height; 
    cout << "Patient " << i << " Weight: "; 
    cin >> Patients[i].weight; 
    cout << "Patient " << i << " Age: "; 
    cin >> Patients[i].age; 
    cout << "Is Patient " << i << " Male True or False: "; 
    cin >> Patients[i].isMale; 
    cout << endl << endl; 

    } 

    cout << endl << endl; 

    for (int i = 0; i < 3; i++) { 
     float BMI = Patients[i].weight/(Patients[i].height *Patients[i].height); 
     cout << "Patient " << i << " Has A BMI of: " << BMI << endl << endl; 
     } 

return 0; 
} 

這是控制檯,您可以在第一循環中的所有CIN的被跳過,但第一循環結束後看到正確保存,因爲它couted第一指數BMI:

+1

基於您發佈的代碼,一切看起來都很好。你有沒有試過用調試器來查看你的代碼,看看發生了什麼? – Andy

+3

相關/ dupe:http://stackoverflow.com/questions/26203441/cin-and-boolean-input – NathanOliver

+1

顯示輸入和輸出。如果您輸入的類型不正確,有時會導致問題。也可以嘗試打印出cin狀態位。按照建議運行調試器。 – sbail95

回答

1

你看,你是在循環結尾處有錯誤。您可以從迭代2和3看出cin每次的行爲方式都不相同。有幾個來自ios的錯誤狀態標誌可以幫助你看到這裏出了什麼問題。詳情請參閱iso::good。如果您添加這些檢查:

for (int i = 0; i < 3; i++) { 
cout << "Patient " << i << " Height: "; 
cin >> Patients[i].height; 
cout << "Patient " << i << " Weight: "; 
cin >> Patients[i].weight; 
cout << "Patient " << i << " Age: "; 
cin >> Patients[i].age; 
cout << "Is Patient " << i << " Male True or False: "; 
cin >> Patients[i].isMale; 
cout << cin.good() << '\n'; 
cout << cin.eof() << '\n'; 
cout << cin.fail() << '\n'; 
cout << cin.bad() << '\n'; 
cout << endl << endl; 
} 

,你會看到什麼如果cin不再good,它不是eoffail,它不是bad。在設置fail位時,cin將不起作用。因此你會看到結果。縱觀鏈接中的圖表,你看到這一點:

邏輯錯誤的I/O操作

你被預成型插入「真」成bool的I/O操作。單詞true可能被存儲爲字符數組或字符串,而不是布爾值。 cin應如何將其轉換爲布爾值?您需要捕捉輸入並將其轉換爲bool或切換爲使用可明確轉換爲bool的輸入。

例如:

cout << "Is Patient " << i << " Male? (1 for Male, 0 for Female):"; 
cin >> Patients[i].isMale; 

在這種情況下cin識別10爲整數,並且可以一個整數轉換成一個布爾值。 0是錯誤的,其他的都是真的。另一個選擇是讓圖書館做它並使用boolalpha。你可以閱讀它here

這顯示了一個更大的問題。如果我寫「兩點五」作爲身高的答案,會發生什麼?在這種情況下,我們可以假設用戶有一些智能,但考慮這樣的事情將有助於將來編寫更健壯的代碼。

相關問題