从输入中获取数字和单位作为双精度和字符串 - 编程:使用 C++ 的原则和实践

Posted

技术标签:

【中文标题】从输入中获取数字和单位作为双精度和字符串 - 编程:使用 C++ 的原则和实践【英文标题】:Getting a number and a unit from input as a double and a string -- Programming: Principles and Practices Using C++ 【发布时间】:2015-10-02 07:43:38 【问题描述】:

我一直在阅读 Bjarne Stroustrup 的《编程:为我自己的利益使用 C++ 的原则和实践》。这不是家庭作业,也不是上学的。

我对第 4 章的这个练习已经束手无策了。我应该从输入中获取一个数字和一个单位,将数字存储为双精度数,将单位存储为 while 循环中的字符串,然后跟踪迄今为止看到的最大和最小数字。它非常适用于像“m”或“g”这样的一个字符的单位,但是当我输入一个像“cm”或“ft”这样的两个字符的单位时,循环结束并且程序终止。以下是我的代码:

#include <iostream>

using namespace std;

int main()

    double temp = 0;
    string unit = " ";
    double largest = 0;
    double smallest = 0;

    while (cin >> temp >> unit)
    
        if (largest == 0 && smallest == 0)
        
            largest = temp;
            smallest = temp;
            cout << "That's the largest number seen so far.\n";
            cout << "That's the smallest number seen so far.\n";
        
        else if (temp >= largest)
        
            largest = temp;
            cout << "That's the largest number seen so far.\n";
        
        else if (temp <= smallest)
        
            smallest = temp;
            cout << "That's the smallest number seen so far.\n";
        
        else
        
            cout << temp << '\n';
        

    
    return 0;

我非常感谢在解决此问题方面的任何帮助。快把我逼疯了。

【问题讨论】:

您确定您正在使用您向我们展示的程序,与您向我们展示的完全一样吗? Because it seems to work fine. 看起来您的编译器假定字符串是没有 string 标头的字符... @JoachimPileborg 如果是这样的话,那么我能想到的唯一问题就是我运行它的环境。我正在使用 Xcode 并在 Xcode 的控制台模拟器中对其进行测试。 @SergeBallesta #include 仍然没有解决问题。 【参考方案1】:

在它编译之前我需要#include &lt;string&gt;,并且我添加了额外的“printf()”stmts 用于调试。

但是您的代码应该可以工作:一个字符或多个字符。

这是我的(修改后的)代码:

#include <iostream>
#include <string>

using namespace std;

int main()

    double temp = 0;
    string unit = " ";
    double largest = 0;
    double smallest = 0;

    while (cin >> temp >> unit)
    
        cout << "NEXT: temp=" << temp << ", unit=" << unit << "\n";
        if (largest == 0 && smallest == 0)
        
            largest = temp;
            smallest = temp;
            cout << "That's the largest number seen so far.\n";
            cout << "That's the smallest number seen so far.\n";
        
        else if (temp >= largest)
        
            largest = temp;
            cout << "That's the largest number seen so far.\n";
        
        else if (temp <= smallest)
        
            smallest = temp;
            cout << "That's the smallest number seen so far.\n";
        
        else
        
            cout << temp << '\n';
        

    
    cout << "DONE: temp=" << temp << ", unit=" << unit << ", smallest=" << smallest << ", largest=" << largest << "\n";
    return 0;

这是示例输出:

12 cm
NEXT: temp=12, unit=cm
That's the largest number seen so far.
That's the smallest number seen so far.
6 "
NEXT: temp=6, unit="
That's the smallest number seen so far.
18 feet
NEXT: temp=18, unit=feet
That's the largest number seen so far.
^D
DONE: temp=18, unit=feet, smallest=6, largest=18

【讨论】:

感谢您的评论。它仍然对我不起作用。输入 12cm 给出以下结果:DONE: temp=0, unit=m, minimum=7, maximum=7 您需要一个介于“12”和“cm”之间的空格。由于您要求两个变量 - 您需要空格(“分隔符”)来分隔它们。 @AnthonyRossello 这是因为 cin 失败了,因为它试图读取一个明显的字符串“12cm”而不是像它需要的数字。更正是在12到cm之间加一个空格或者回车,然后将t“12”作为数字读入temp,将“cm”作为字符串读入unit【参考方案2】:

好的,谢谢大家的帮助。

问题似乎是编译器/系统特定的。我的代码与 OSX 的默认编译器存在问题,但在 Windows 10 上使用 MinGW 作为编译器运行相同的代码可以完美运行。多么奇怪的错误。如果有人对如何使用其默认编译器使该程序在 OSX 上运行有任何提示,将不胜感激。

【讨论】:

这不是“编译器错误”。请参阅下面的回复。

以上是关于从输入中获取数字和单位作为双精度和字符串 - 编程:使用 C++ 的原则和实践的主要内容,如果未能解决你的问题,请参考以下文章

C++,如何从字符串中获取正确的双精度值?

将工作代码从双精度转换为四精度:如何从输入文件中读取 FORTRAN 中的四精度数字

如何避免以科学记数法表示的双精度数和数字的字符串到数字转换?

将一个字符串解析为两个双精度

如何拆分具有字符串和双精度的输入文本文件?

用逗号作为小数分隔符解析双精度