我正在学习C ++并且让我的代码完成我想要的所有操作,但似乎代码效率不高,因为我基本上将输出控制台中的代码加倍,因此它显示在文本文件中。如果可以的话,你能解释一下我做错了什么,你建议我做些什么来提高代码的效率。 (第一列需要左对齐,第二列必须在控制台和文本文件中正确对齐,我相信我做的正确。)
<g>
答案 0 :(得分:8)
您对效率低下的怀疑完全无根据且无关紧要。这样一个简单的I / O绑定代码完全不需要优化,如果从头开始编写整个I / O子系统,任何性能提升都可以忽略不计。
您没有目标效率指标或任何效率测量。换句话说,你既不知道你的代码有多快(或慢),也不知道它应该有多快。没有测量和目标,所有优化都是无用的(或者充其量,非常浪费。)
您的代码可能看起来更好。无论额外的空行是你的工作还是粘贴代码的副作用,你都不会费心去除它们。您应该记住,代码的外观很重要。 (更新:我看到你已经解决了这个问题.Kudos!)
请不要使用全局变量,除非您有一些经验,并且您认为确实需要它们。在这种情况下,你没有。如果您将变量的范围更改为local,请记住也要初始化它们。
不要使用char数组来表示字符串。使用std::string
s。它们具有所有阵列功能和更多功能,并且更安全,更方便。
一种方法可以节省一些打字/复制+粘贴并消除代码中的一些冗余(这是非常糟糕的)是使用std::cout
对象的类型和{{}的父类1}}类型为std::ofstream
。你可以编写将这种类型的对象作为参数的函数,只写出你要写出的内容,然后你会调用这些函数两次:一次使用std::ostream
,一次使用你的文件。
除了所有这些要点之外,我希望你能记住这一点:除非你能客观地证明这是一个问题,否则不要担心性能和优化。
(对不起这个回复的语气; OP说他是初学者,这让我有一种讲课的心情!)
更新:您可以编写如下函数:
std::cout
现在,您将为每行输出调用此函数两次:一次为void LineOut (std::ostream & os, std::string const & entry, double value)
{
int dots = 28 - 2 - int(entry.size()); // 2 for ": "
if (dots < 0) dots = 0;
os << entry << ": " << std::string('.', dots) << "$" << value << std::endl;
}
// Call it like this:
LineOut(std::cout, "Gross Amount", gross);
LineOut( file, "Gross Amount", gross);
,一次为您的文件。
显然还有其他方法和更好的方法,但我怀疑这个小项目是否值得。
答案 1 :(得分:3)
您可以编写一个函数来打印文件和输出中的值。
void WriteToFileAndOutput(const double &val, const string &s, ofstream &fname) {
cout << left << setw(28) << s;
cout << right << setw(7) << val << endl;
fname << left << setw(28) << s;
fname << right << setw(7) << val << endl;
}
//You can use it as
WriteToFileAndOutput(gross, "Gross Amount: ............ $", file);
WriteToFileAndOutput(fiTax, "Federal Tax: ............. $", file);
C ++有内置字符串数据类型,使用它代替char数组。
如果您已加入using namespace std
,那么您不必再次指定cout
,cin
等来自std名称空间。
不要使用全局变量。
仅举例:
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
using namespace std;
void WriteToFileAndOutput(const double &val, const string &s, ofstream &fname) {
cout << left << setw(28) << s;
cout << right << setw(7) << val << endl;
fname << left << setw(28) << s;
fname << right << setw(7) << val << endl;
}
int main() {
string name;
double gross, fiTax, sTax, ssTax, mediTax, pPlan, hInsurance, tax, total;
cout << "Please enter your name: ";
getline(cin,name);
cout << "Please enter your gross amount: ";
cin >> gross;
cout << fixed;
cout << setprecision(2);
fiTax = gross * .15;
sTax = gross * .035;
ssTax = gross * .0575;
mediTax = gross * .0275;
pPlan = gross * .05;
hInsurance = 75;
tax = fiTax + sTax + ssTax + mediTax + pPlan + hInsurance;
total = gross - tax;
ofstream file;
file << fixed << setprecision(2);
file.open("report.txt");
cout << left << setw(28) << name << endl;
file << left << setw(28) << name << endl;
WriteToFileAndOutput(gross, "Gross Amount: ............ $", file);
WriteToFileAndOutput(fiTax, "Federal Tax: ............. $", file);
WriteToFileAndOutput(sTax, "State Tax: ............... $", file);
WriteToFileAndOutput(ssTax, "Social Security Tax: ..... $", file);
WriteToFileAndOutput(mediTax, "Medicare/medicaid Tax: ... $", file);
WriteToFileAndOutput(pPlan, "Pension Plan: ............ $", file);
WriteToFileAndOutput(hInsurance, "Health Insurance: ........ $", file);
WriteToFileAndOutput(total, "Net Pay: ................. $", file);
file.close();
return 0;
}
答案 2 :(得分:2)
减少代码冗余的一种方法是创建一个执行打印的功能。 C++
输出流类都是std::ostream
的子类。这意味着您可以编写一个接受std::ostream&
(引用std::ostream
)并将其传递给任何输出流的函数,例如std::cout
或std::ofstream
。
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
using namespace std;
char name[256];
double gross;
double fiTax;
double sTax;
double ssTax;
double mediTax;
double pPlan;
double hInsurance;
double tax;
double total;
// function prints info to any std::ostream
void print_to(std::ostream& out)
{
out << left<< setw(28) << name << endl;
out << left << setw(28) << "Gross Amount: ............ $";
out << right << setw(7) << gross << endl;
out << left << setw(28) << "Federal Tax: ............. $";
out << right << setw(7) << fiTax << endl;
out << left << setw(28) << "State Tax: ............... $";
out << right << setw(7) << sTax << endl;
out << left << setw(28) << "Social Security Tax: ..... $";
out << right << setw(7) << ssTax << endl;
out << left << setw(28) << "Medicare/medicaid Tax: ... $";
out << right << setw(7) << mediTax << endl;
out << left << setw(28) << "Pension Plan: ............ $";
out << right << setw(7) << pPlan << endl;
out << left << setw(28) << "Health Insurance: ........ $";
out << right << setw(7) << hInsurance << endl;
out << left << setw(28) << "Net Pay: ................. $";
out << right << setw(7) << total << endl;
}
int main() {
std::cout << "Please enter your name: ";
std::cin.getline(name, 256);
cout << "Please enter your gross amount: ";
cin >> gross;
std::cout << std::fixed;
std::cout << std::setprecision(2);
fiTax = gross * .15;
sTax = gross * .035;
ssTax = gross * .0575;
mediTax = gross * .0275;
pPlan = gross * .05;
hInsurance = 75;
tax = fiTax + sTax + ssTax + mediTax + pPlan + hInsurance;
total = gross - tax;
system("cls");
// an std::ofstream is a sub-class of std::ostream
ofstream file;
file << std::fixed << std::setprecision(2);
file.open("report.txt");
print_to(file);
file.close();
// an std::cout is a sub-class of std::ostream
print_to(std::cout);
return 0;
}