我正在编写一个程序,用于从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()来正确格式化我的直方图。
答案 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;
//...
}