直方图格式

时间:2014-01-19 16:27:10

标签: c++ format histogram

我正在编写一个程序,用于从double数据类型的数组创建水平直方图。我能够让程序显示每个子间隔的边界以及正确的星号数。但是,数据未格式化。

以下是负责输出的程序部分:

// endpoints == the boundaries of each sub-interval
// frequency == the number of values which occur in a given sub-interval
for (int i = 0; i < count - 1; i++)
{
    cout << setprecision(2) << fixed;
    cout << endPoints[i] << " to " << endPoints[i + 1] << ": ";
    for (int j = frequency[i]; j > 0; j--)
    {
        cout << "*";
    }
    cout << " (" << frequency[i] << ")" << endl;
}

以下是我的输出结果:

0.00 to 3.90: *** (3)
3.90 to 7.80: * (1)
7.80 to 11.70: * (1)
11.70 to 15.60:  (0)
15.60 to 19.50: ***** (5)

这就是我希望它的样子:

00.00 to 04.00: *** (3)
04.00 to 08.00: * (1)
08.00 to 12.00: * (1)
12.00 to 16.00:  (0)
16.00 to 20.00: ****** (6)

我查了C ++语法,发现了setw()和setprecision()之类的东西。我试图用两种方法来格式化我的直方图,但却无法让它看起来像模型。我希望有人可以告诉我,如果我在正确的轨道上,如果是这样,如何实现setw()和/或setprecision()来正确格式化我的直方图。

1 个答案:

答案 0 :(得分:2)

假设所有数字都在[0,100]区间内,你想要的是一系列操纵者,如:

#include <iostream>
#include <iomanip>

int main() {
    std::cout
        << std::setfill('0') << std::setw(5)
        << std::setprecision(2) << std::fixed
        << 2.0
        << std::endl;

    return 0;
}

将输出:

02.00

这是一个值,您可以轻松地根据自己的需要进行调整。

例如,您可以将其转换为运算符并使用它:

#include <iostream>
#include <iomanip>

class FixedDouble {
public:
    FixedDouble(double v): value(v) {}
    const double value;
}

std::ostream & operator<< (std::ostream & stream, const FixedDouble &number) {
    stream
        << std::setfill('0') << std::setw(5)
        << std::setprecision(2) << std::fixed
        << number.value
        << std::endl;

    return stream;
}

int main() {
    //...

    for (int i = 0; i < count - 1; i++) {
        std::cout
            << FixedDouble(endPoints[i])
            << " to "
            << FixedDouble(endPoints[i + 1])
            << ": ";
    }

    for (int j = frequency[i]; j > 0; j--) {
        std::cout << "*";
    }
    std::cout << " (" << frequency[i] << ")" << std::endl;

    //...
}