代码之家  ›  专栏  ›  技术社区  ›  amwalker

C中的多个提示出现问题++

  •  -3
  • amwalker  · 技术社区  · 3 年前

    我如何重写以下代码,使每个输出都有自己的提示(参见所需结果)-g++(Ubuntu 9.4.0-1ubuntu1~20.04.1)9.4.0

    #include <iostream>
    #include <string>
    
    using std::cin;
    using std::cout;
    using std::string;
    
    int main() {
    
        cout << "Enter a numeric value followed by a unit abbreviation (km,mi): ";
        double initial_value;
        string initial_unit;
        cin >> initial_value >> initial_unit; 
    
        double conversion_factor = {initial_value *1.609};
        double conversion_factor2 = {initial_value /1.609};
        std::string miles = "mi";
        std::string kilometers = "km";
    
        if (initial_unit == miles) {
           cout << initial_value << " " << initial_unit << " "<< "is" << " " << conversion_factor << "\n" << "km";
        }
        if (initial_unit == kilometers) {
           cout << initial_value << " " << initial_unit << " "<< "is" << " " << conversion_factor2 << "\n" << "mi";
        }
        else (initial_unit != kilometers, miles);
        {
           cout << "Unknown unit, please try again";
        }
    
        return 0;
    }
    

    我得到的结果:

    Enter a numeric value followed by a unit abbreviation (km,mi): 10 mi
    10 mi is 16.09
    kmUnknown unit, please try again
    

    期望结果示例:

    Enter a numeric value followed by a unit abbreviation (km,mi): 
    10 mi
    10 mi is 16.09 km  
    16.09 km
    16.09 km is 10 mi  
    20000 leagues
    Unknown unit, please try again  
    0.5 mi
    0.5 mi is 0.8045 km
    
    2 回复  |  直到 3 年前
        1
  •  2
  •   Remy Lebeau    3 年前

    声明 else (initial_unit != kilometers, miles); 是完全错误的。

    首先 ; 不应该在那里。这导致您的代码输出 Unknown unit 消息,不管是什么 initial_unit 实际上设置为。

    但更重要的是,您不能像尝试的那样将单个值与逗号分隔的值列表进行比较 comma operator operator precedence ,表达式 initial_unit != kilometers, miles 将被解释为 (initial_unit != kilometers), miles 因此表达式的结果将是 miles 不管怎样 initial_unit 实际上设置为。

    您必须单独比较每个值,如下所示:

    else if ((initial_unit != kilometers) && (initial_unit != miles))
    

    但是,你已经比较过了 initial_unit 反对 kilometers 英里 在那句话之前,所以没有必要再对它们进行比较。声明应该只是 else 本身,例如:

    if (initial_unit == miles) {
       ...
    }
    else if (initial_unit == kilometers) { // <-- you forgot the 'else' here
       ...
    }
    else { // <-- everything else!
       ...
    }
    

    现在,话虽如此,要做到你的要求,你需要运行 ,其中每次迭代都会提示用户输入新的输入,例如:

    #include <iostream>
    #include <string>
    
    using std::cin;
    using std::cout;
    using std::string;
    
    int main() {
    
        const std::string miles = "mi";
        const std::string kilometers = "km";
    
        cout << "Enter a numeric value followed by a unit abbreviation (km,mi):\n";
    
        double value;
        string unit;
    
        while (cin >> value >> unit) {
    
            if (unit == miles) {
                cout << value << " " << unit << " is " << (value * 1.609) << " " << kilometers << '\n';
            }
            else if (unit == kilometers) {
                cout << value << " " << unit << " is " << (value / 1.609) << miles << '\n';
            }
            else {
                cout << "Unknown unit, please try again\n";
            }
        }
    
        return 0;
    }
    
        2
  •  1
  •   paddy    3 年前

    你搞得一团糟。以下代码存在多个问题。

    if (initial_unit == miles) {
       cout << initial_value << " " << initial_unit << " "<< "is" << " " << conversion_factor << "\n" << "km";
    }
    if (initial_unit == kilometers) {
       cout << initial_value << " " << initial_unit << " "<< "is" << " " << conversion_factor2 << "\n" << "mi";
    }
    else (initial_unit != kilometers, miles);
    {
       cout << "Unknown unit, please try again";
    }
    

    让我们将其分解,看看实际发生了什么:

    // Output miles->km conversion
    if (initial_unit == miles) {
       cout << initial_value << " " << initial_unit << " "<< "is" << " " << conversion_factor << "\n" << "km";
    }
    
    // This condition is unrelated to the first
    if (initial_unit == kilometers) {
       cout << initial_value << " " << initial_unit << " "<< "is" << " " << conversion_factor2 << "\n" << "mi";
    } else {
        initial_unit != kilometers;  // unused inequality test
        miles;                       // unused result of comma operator
    }
    
    // This is always executed
    cout << "Unknown unit, please try again";
    

    正确的条件句链是:

    if (initial_unit == miles) {
       cout << initial_value << " " << initial_unit << " is " << conversion_factor << "km\n";
    }
    else if (initial_unit == kilometers) {
       cout << initial_value << " " << initial_unit << " is " << conversion_factor2 << "mi\n";
    }
    else {
       cout << "Unknown unit, please try again\n";
    }