我的项目是使用setw(),setfill(),setiosflags()创建此输出:
Enter KWH used 993
C O M P S C I Electric
------------------------------------------------
Kilowatts Used 993
------------------------------------------------
Base Rate 993 @ $ 0.0475 $ 47.17
Surcharge $ 4.72
Citytax $ 1.42
______
Pay this amount $ 53.31
After May 20th Pay $ 55.44
我可以使用我的代码使用它,但只有使用Kilowatts是2位数。如果它是更多的数字,我的正确理由不起作用。我可以编辑代码,使其正确对齐3位数,4位数,依此类推。当我的代码将被测试时,我不知道将输入什么Kilowatts,所以我需要适用于任何长度数字的Kilowatts的代码。
/*
* File: main.cpp
* Author: -------------------------
*
* Created on ----------------------
*/
#include <cstdlib>
#include <iomanip>
#include <iostream>
using namespace std;
/*
*
*/
int main() {
float br; // base rate
float surcharge; // surcharge
float taxrate; // tax rate
float late; // late rate
float kwh; // kilowatts used
float bc; // base cost
float scc; // surcharge cost
float ctc; // city tax cost
br = .0475; // kilowatt rate
surcharge = .1; // surcharge rate
taxrate = .03; // tax rate
late = .04; //rate if payment is late
// cout.width(38);
cout << "Kilowatts used last month: ";
cin >> kwh; // get kwh used from user
cout << "\n";
cout << "\n";
cout << " C O M P S C I Electric " << "\n";
cout << setiosflags(ios::fixed|ios::showpoint) << setprecision(2); // set ios flags
cout << setfill('-') << setw(38) << "\n"; // display dashes in line
cout << setiosflags(ios::left) << "Kilowatts Used" << setfill(' ') << setw(23) << resetiosflags(ios::left) << kwh << "\n"; // output kwh formally
cout << setfill('-') << setw(38); // separate
cout << "\n" << "\n";
// calculations
bc = br * kwh;
scc = surcharge * kwh;
ctc = taxrate * kwh;
cout << left << "Base Rate " << kwh << " @ $0.0475 " << setfill(' ') << setw(4) << right << "$" << bc << "\n"; //output base rate, right justify cost
cout << left << "Surcharge" << setw(24) << right << "$" << scc << "\n"; // output surcharge cost, right justify cost
return 0;
}
当我使用setw()
进行正确辩解时,我不理解resetiosflags(ios::left)
的必要性。我尝试使用setiosflags(ios::left)
和resetiosflags(ios::left)
替换right
和left
;
我是一名c ++初学者,使用netbeans c ++编写代码,使用g ++编译。我真的不太了解格式化控制台输出,所以我将不胜感激任何帮助。我不一定要使用顶部指定的3个函数,只要不同的方式与任何浮点长度一致。谢谢!
答案 0 :(得分:2)
setw(n)设置下一个输出的宽度,而setiosflags(ios :: left)和setiosflags(ios :: right)设置该输出的对齐方式。我更喜欢使用std :: left和std :: right而不是setiosflags,因为它看起来更干净。
当您输出这样的基本费率时:
cout << left << "Base Rate " << kwh << " @ $0.0475 " << setfill(' ') << setw(4) << right << "$" << bc << "\n"; //output base rate, right justify cost
这一行的部分表示setw(4)仅对美元符号应用宽度4,而不是美元符号和变量bc。这就是为什么你得到不同输入的不同结果。没有为变量输出本身指定宽度。每次要输出特定宽度的东西时,必须先调用setw。此外,将这样冗长的代码行分成单独的行以便于阅读是个好主意。
我将此代码更正为:
/*
* Output Base Rate
*/
cout << setfill(' ');
cout << left << "Base Rate ";
cout << right << setw(8) << kwh;
cout << " @ $" << right;
// Reset precision to 4 to output kilowatt rate, then reset back to 2 for currency
cout << setprecision(4);
cout << setw(6) << br;
cout << setprecision(2);
cout << setw(10) << "$";
cout << setw(7) << bc << "\n";
我还发现在尝试调试控制台应用程序输出时,将填充字符更改为_而不是空格很有用。 setw函数在控制台输出中非常重要,尤其是当您尝试以固定宽度输出所有内容时。例如,如果要输出:
Surcharge $ 4.72
这有三个部分:
这可以通过以下方式实现:
cout << left << "Surcharge";
cout << right << setw(31) << "$";
cout << setw(7) << scc << "\n";
确定31是美元的适当宽度,因为我的输出宽度是49(包括新行char)。我把“附加费”中的字符数(9)中的美元符号(1)和宽度我希望我的货币输出(7) - (4位加上小数加上精度)和总计(17)加了一个额外的对于新行(\ n)并从49(31)中减去它。
我已经重新编写了一些代码,它与顶部的项目输出相匹配。我在那里发表了一些评论,以使事情更加清晰。
这是:
float br; // base rate
float surcharge; // surcharge
float taxrate; // tax rate
float late; // late rate
float kwh; // kilowatts used
float bc; // base cost
float scc; // surcharge cost
float ctc; // city tax cost
br = .0475; // kilowatt rate
surcharge = .1; // surcharge rate
taxrate = .03; // tax rate
late = .04; //rate if payment is late
// cout.width(38);
cout << "Kilowatts used last month: ";
cin >> kwh; // get kwh used from user
cout << "\n";
cout << "\n";
cout << " C O M P S C I Electric " << "\n";
// Set float precision and formats
cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(2);
// Display first serparator
cout << setfill('-') << setw(48) << "\n";
// Display Kilowatts input
cout << left << "Kilowatts Used" << setfill(' ') << setw(8) << right << kwh << "\n";
// Display second separator
cout << setfill('-') << setw(48); // separate
cout << "\n" << "\n";
// do calculations
bc = br * kwh;
scc = surcharge * kwh;
ctc = taxrate * kwh;
/*
* Output Base Rate
*/
cout << setfill(' ');
cout << left << "Base Rate ";
cout << right << setw(8) << kwh;
cout << " @ $" << right;
// Reset precision to 4 to output kilowatt rate, then reset back to 2 for currency
cout << setprecision(4);
cout << setw(6) << br;
cout << setprecision(2);
cout << setw(10) << "$";
cout << setw(7) << bc << "\n";
/*
* Output Surcharge
*/
cout << left << "Surcharge";
cout << right << setw(31) << "$";
cout << setw(7) << scc << "\n";
return 0;
希望这有帮助。
汤姆