我正在学习 Stroustrup 的编程 - 目前使用 C++ 的原理和实践。在第 4 章的末尾,有一个练习要求您开始编写程序,并在您进行下去时一次一步地修改它。在这一点上,程序应该:
- 要求用户提供数字和测量单位(英尺、英寸、厘米或米)
- 将数字存储在 double 变量中,并将单位存储在字符串中。
- 只接受英尺、英寸、厘米或米。
- 将输入的数据转换为米并输出结果。
- 存储迄今为止输入的最小金额、迄今为止输入的最大金额,并告诉用户最近的输入是否是新的最大/最小。
到目前为止,一切似乎都在工作,除了如果最后一个条目是迄今为止最小的则它不会输出。我做错了什么?
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。但是,您假设这些值不是最终值,因为它们将被其他值替换。
- 假设我输入了一个很大的单位值。它不会小于 smallest,即 0,但会大于 largest,也是 0。因此,largest 将始终设置为最大。
- 但是,如果我设置一个较小的单位值,无论它有多小,该值仍然是正数,因此永远不会小于0。这就是您的逻辑错误所在。
要解决这个问题,一个好的解决方案是将最小值和最大值都设置为第一个处理的值。这有很多好处:
如果您总共只输入 1 个值,那么从技术上讲,该值既是最小值也是最大值。
如果您输入两个值:经过第一个值后,程序会将最小值和最大值都设置为第一个值。当它考虑第二个值时,它将决定它是更小还是更大。这再次奏效。
对于任何更大的值大小,我们知道我们的代码现在可以工作。
关于c++ - 为什么我的函数不记录最小的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256322/