2012-08-09 41 views
1

我是C++的新手,我自己学习它,并且正在使用Deitel的书籍“C++如何编程 - 第7版”。现在,请当我删除了“固定的”流处理器看看下面的代码“固定”流操纵器被移除时的问题

#include <iostream> 
    #include <iomanip> 
    #include <cmath> 

    using namespace std; 

    int main() 
    { 
     double principle = 1000; 
     double amount; 
     double rate = 0.05; 

     cout << "Year" << setw(21) << "Amount on deposit" << endl; 

     cout << fixed << setprecision(2); 

     for(int years=1; years<=10; years++) 
     { 
      amount = principle * pow(1.0+rate,1.0); 

      cout << setw(4) << years << setw(21) << amount << endl; 
     } 
} 

,输出变成愚蠢的,这意味着,只要ASCII字母和数字。当我插入它时,输出没有任何问题。我的问题是,为什么会发生这种情况?对于所有具有“双”型输出的程序,“固定”是强制性的吗?请帮忙。

另一件事。什么是流操纵器?作为一名Java开发人员,我认为这些可能是某种常量变量,但事实并非如此!他们是方法?那为什么括号不在那里?请回答这个问题。

感谢

+0

操纵器是功能。棘手的一点是你没有调用函数并将结果发送到流,你实际上将函数_themselves_发送到流(这就是为什么没有括号)。该流识别函数的类型,然后调用将其自身作为参数的函数。然后'setw'函数修改流的宽度。他们这样做的原因是因为你可以编写一个从未见过的新功能并简单地使用它。枚举是不可能的。 – 2014-03-21 03:21:37

回答

6

输出不“变得愚蠢”:你只需让输出流为你的浮点数选择格式奥林匹克数字,并选择科学记数法。这给你1e+03(意思是1*10^3)而不是1050.00。使用fixed告诉你不想要科学记数法的流;你也可以使用scientific强制科学格式。由于精确的格式取决于您的应用要求,所以使用fixedscientific的选择最终取决于您。

+0

谢谢你的回复:) – 2012-08-09 14:34:58

1

机械臂喜欢固定的功能,但如果你想在普通()为它那么它应该是这样的:

固定(COUT); //代替使用< <或>>您将流传递到操纵器函数。

更多的看到这个参考上操纵:

http://www.cplusplus.com/reference/iostream/manipulators/

此外,固定的文档可以在这里找到:

http://www.cplusplus.com/reference/iostream/manipulators/fixed/

希望这有助于

+0

感谢您的回复。似乎很多东西都在那里! – 2012-08-09 14:36:00

0

如果您已经选择了一个更广泛的精密,如果没有fixed,你的输出将会不同。

 cout << setprecision(6); // 6 instead of 2 

然后你的输出看起来会更像你的预期。 (顺便说一下,您应该通过将获得的利息折叠回原则来计算复利。)

否则,只有setprecision(2),格式化程序决定使用科学记数法来仅显示2位精度。

但是,由于您希望输出提供固定数量的数字,因此您提供的内容(包括fixedsetprecision(2))都可以做到这一点。