为什么我的功能不能记录最小的答案?

时间:2015-08-27 17:55:51

标签: c++

我目前正在使用C ++编写Stroustrup的编程 - 原理和实践。在第4章的最后,有一个演习要求你开始编写一个程序,并在你下线时一步一步地改变它。我现在迈出了一步,在这一点上,该计划应该:

  • 向用户询问一个数字和一个度量单位(英尺,英寸,厘米或米)
  • 将数字存储在双变量中,并将单位存储在字符串中。
  • 仅接受ft,in,cm或m。
  • 将输入的数据转换为米并输出结果。
  • 存储目前为止输入的最小金额,即目前为止输入的最大金额,并告诉用户最近的条目是否为新的最大/最小条目。

到目前为止,一切似乎都在起作用,但是如果到目前为止最后一个条目是最小的,它将不会输出。我做错了什么?

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;
    }

}

2 个答案:

答案 0 :(得分:1)

解决这类逻辑错误的最佳方法是使用示例值通过头脑中的代码。所以让我们来看看你的代码:

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

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

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

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

答案 1 :(得分:0)

您正在将smallest初始化为零,因此您输入较小值的唯一方法是输入负数。

您应该使用bool变量来指示您是否输入了任何值。当您获得第一个值时,请将smallestlargest都设置为该值。