我目前正在使用C ++编写Stroustrup的编程 - 原理和实践。在第4章的最后,有一个演习要求你开始编写一个程序,并在你下线时一步一步地改变它。我现在迈出了一步,在这一点上,该计划应该:
到目前为止,一切似乎都在起作用,但是如果到目前为止最后一个条目是最小的,它将不会输出。我做错了什么?
double convert(double num, string type);
constexpr double centimeters_per_meter = 100;
constexpr double centimeters_per_inch = 2.54;
constexpr double inches_per_foot = 12;
int main()
{
cout << "Please enter a number and a unit (cm, m, in, ft): \n";
double x;
string unit;
double smallest = 0, largest = 0;
while (cin >> x >> unit) {
double x_in_meters = convert(x, unit);
if (x_in_meters < smallest && x_in_meters != 0) {
cout << "\nThis is the smallest number so far!\n";
smallest = x_in_meters;
}
else if (x_in_meters > largest && x_in_meters != 0) {
cout << "\nThis is the largest number so far!\n";
largest = x_in_meters;
}
else {}
}
return 0;
}
double convert(double num, string type)
{
double num_in_meters = 0.0;
if (type == "cm") {
num_in_meters = num / centimeters_per_meter;
cout << num << " " << type << " is " << num_in_meters << " meters\n";
return num_in_meters;
}
else if (type == "m") {
num_in_meters = num;
cout << num_in_meters << " meters\n";
return num_in_meters;
}
else if (type == "in") {
num_in_meters = num * centimeters_per_inch / centimeters_per_meter;
cout << num << " " << type << " is " << num_in_meters << " meters\n";
return num_in_meters;
}
else if (type == "ft") {
num_in_meters = num * inches_per_foot * centimeters_per_inch / centimeters_per_meter;
cout << num << " " << type << " is " << num_in_meters << " meters\n";
return num_in_meters;
}
else {
cout << "I don't understand " << type << " as a unit\n";
return 0;
}
}
答案 0 :(得分:1)
解决这类逻辑错误的最佳方法是使用示例值通过头脑中的代码。所以让我们来看看你的代码:
要解决此问题,一个好的解决方案是将最小值和最大值都设置为处理的第一个值。这有很多好处:
如果您只输入1个总值,那么该值在技术上既是最小值也是最大值。
如果您输入两个值:经过第一个值后,程序会将最小值和最大值都设置为第一个值。当它考虑第二个值时,它将决定它是更小还是更大。再次,这是有效的。
对于任何更大的值,我们知道我们的代码现在可以使用。
答案 1 :(得分:0)
您正在将smallest
初始化为零,因此您输入较小值的唯一方法是输入负数。
您应该使用bool
变量来指示您是否输入了任何值。当您获得第一个值时,请将smallest
和largest
都设置为该值。