我的程序正确运行了第一个For循环,然后在第2个和第3个循环中跳过了Cin。然后,当循环完成时,它会继续计算第一个索引[0]的BMI,并正确执行此操作并给出正确的答案,但是对于索引1和[2]则什么也不做,因为没有输入任何信息,因为已跳过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都被跳过,但是在计算第一个索引的BMI时,第一个循环已正确存储:
您会发现循环结束时出现错误。从迭代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
是,不是eof
,不是fail
,不是bad
。当该fail
位置1时,cin
将不起作用。因此,您会看到结果。查看链接中的图表,您会看到以下内容:
I / O操作上的逻辑错误
您正在执行将“ true”插入的I / O操作bool
。单词true可能存储为字符数组或字符串,而不是布尔值。应该如何将其cin
转换为布尔值?您需要捕获输入并将其转换为bool
或,以使用可以显式转换为的输入bool
。
例如:
cout << "Is Patient " << i << " Male? (1 for Male, 0 for Female):";
cin >> Patients[i].isMale;
在这种情况下,cin
识别1
并0
为整数,并且可以整数转换成一个布尔值。0为假,其他所有为真。另一种选择是让库执行和使用boolalpha
。您可以在这里阅读有关内容。
这显示了一个更大的问题。如果我写“两点五”作为身高的答案怎么办?在这种情况下,我们可以假定用户具有一定的智能,但是考虑这样的事情将有助于将来编写更健壮的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句