【问题标题】:How do I return 8.0 instead of 8 when using streams?使用流时如何返回 8.0 而不是 8?
【发布时间】:2018-10-15 08:46:13
【问题描述】:

此代码的格式和输出与我的作业的示例输出相匹配,但问题是我返回 8,而我希望它是 8.0

我该怎么办?

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>

using namespace std;

void runningSum(istream &in, ostream &out)
{
    string line, str;
    double sum = 0, max = 0;
    while (getline(in, line))
    {
        istringstream sin(line);
        out << "running sum = ";
        while (sin >> str)
        {
            sum = sum + stod(str);
            out << sum << " ";

            if(max < sum) max = sum;
        }
        out << "\nmax sum = " << max << endl;
    }
}

int main()
{
    ifstream in("in.txt");
    runningSum(in, cout);
    return 0;
}
// in.txt: 3.25 4.5 -8.25 7.25 3.5 4.25 -6.5 5.25
// my output:
// running sum = 3.25 7.75 -0.5 6.75 10.25 14.5 8 13.25
// max sum = 14.5
// desired output:
// running sum = 3.25 7.75 -0.5 6.75 10.25 14.5 8.0 13.25
// max sum = 14.5

【问题讨论】:

  • 请将预期结果和实际结果作为文本而不是图像插入!
  • 对不起,我是新来的。如果可以的话,我刚才在我的 main 函数下的 cmets 中添加了它们。
  • 为什么要显示为8.0?这是您作业中的要求吗?
  • -0.508.00等会被扣分吗?
  • 很抱歉让您失望,但如果要求将样本输出字符与字符匹配,那么您的教育工作者就是无能的白痴。现在我们已经排除了这个令人不快的事实,匹配示例输出的最简单方法是检查您输出的每个数字,如果它足够接近整数,则在数字之后输出 .0 作为文本。

标签: c++ ostream


【解决方案1】:

您的代码相当合理,只是要求有点棘手。

我的建议是编写一个函数以将doubles 格式化为所需的格式,必要时添加尾随“.0”

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>
#include <cmath>

std::string format(double value)
{
    std::stringstream ss;
    ss << value;
    // check for existing decimal point
    if (ss.str().find('.') == std::string::npos)
    {
        ss << ".0";
    }
    return ss.str();
}

void runningSum(istream &in, ostream &out)
{
    for (std::string line; getline(in, line);)
    {
        double sum = 0;
        double max = std::numeric_limits<double>::lowest(); // could be always negative
        std::istringstream sin(line);
        out << "running sum = ";
        for (double value; sin >> value;)
        {
            sum += value;
            out << format(sum) << " ";

            max = std::max(max, sum);
        }
        out << "\nmax sum = " << format(max) << "\n";
    }
}

int main()
{
    std::ifstream in("in.txt");
    runningSum(in, std::cout);
    return 0;
}

【讨论】:

  • 有点棘手 看起来你拼错了“完全白痴”。你的代码doesn't match it all that well。你需要一些东西,而不是超出你典型的初学者的知识。
  • 如果教授想要精确传递 IEEE 754 中无法表示的十进制数,我会同意“完全愚蠢”。所有示例都是二进制分数
  • 据称教授想要匹配他最喜欢的输出格式,这不能直接用 C++ 表达。这迫使学生专注于无用的细节,而不是学习重要的技能。这就是为什么要求是愚蠢的。问题不在于 IEEE 754 中无法表示的十进制数,问题在于默认输出格式 rounds 数字(在 IEEE 754 中可以表示 --- 你无法掌握其他任何东西)。所以简单的检查value == std::floor(value) 是不够的。
  • 经常有以指定格式显示的业务需求,学习将其推到系统边缘是很有用的。当你阅读文本时,你当然可以得到无法表示的小数
  • 无论如何,将检查切换到字符串查找。
猜你喜欢
  • 2014-11-02
  • 1970-01-01
  • 2015-08-07
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2021-10-23
相关资源
最近更新 更多