c++ - 为什么我的函数不记录最小的答案?

标签 c++

我正在学习 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;
    }

}

最佳答案

解决此类逻辑错误的最佳方法是使用示例值在脑海中检查代码。因此,让我们跟踪您的代码:

  1. 您将最小值和最大值设置为 0。但是,您假设这些值不是最终值,因为它们将被其他值替换。
  2. 假设我输入了一个很大的单位值。它不会小于 smallest,即 0,但会大于 largest,也是 0。因此,largest 将始终设置为最大。
  3. 但是,如果我设置一个较小的单位值,无论它有多小,该值仍然是正数,因此永远不会小于0。这就是您的逻辑错误所在。

要解决这个问题,一个好的解决方案是将最小值和最大值都设置为第一个处理的值。这有很多好处:

  1. 如果您总共只输入 1 个值,那么从技术上讲,该值既是最小值也是最大值。

  2. 如果您输入两个值:经过第一个值后,程序会将最小值和最大值都设置为第一个值。当它考虑第二个值时,它将决定它是更小还是更大。这再次奏效。

  3. 对于任何更大的值大小,我们知道我们的代码现在可以工作。

关于c++ - 为什么我的函数不记录最小的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256322/

相关文章:

c++ - 在单独的终端上从 Ncurses 应用程序获取输出

c++ - optional<T> 进入 C++ 标准的含义

c++ - 存在错误代码时的输出参数与 NRVO

c++ - Windows 中的 CONDITION_VARIABLE;不会编译

c++ - 分配包含 STL vector 的结构时发生内存泄漏

c++ - 从文件路径c++获取目录

c++ - 无法在windows上编译WxWidget项目

gdal - 如何使用 visual studio 在 QT 中制作 GUI?

c++ - 使用 ostream 格式化整数输出

c++ - NEON 浮点乘法比预期慢