C ++代码有效,但似乎非常低效

时间:2016-07-02 08:01:15

标签: c++

我正在学习C ++并且让我的代码完成我想要的所有操作,但似乎代码效率不高,因为我基本上将输出控制台中的代码加倍,因此它显示在文本文件中。如果可以的话,你能解释一下我做错了什么,你建议我做些什么来提高代码的效率。 (第一列需要左对齐,第二列必须在控制台和文本文件中正确对齐,我相信我做的正确。)

<g>

3 个答案:

答案 0 :(得分:8)

  1. 您对效率低下的怀疑完全无根据且无关紧要。这样一个简单的I / O绑定代码完全不需要优化,如果从头开始编写整个I / O子系统,任何性能提升都可以忽略不计。

  2. 您没有目标效率指标或任何效率测量。换句话说,你既不知道你的代码有多快(或慢),也不知道它应该有多快。没有测量和目标,所有优化都是无用的(或者充其量,非常浪费。)

  3. 您的代码可能看起来更好。无论额外的空行是你的工作还是粘贴代码的副作用,你都不会费心去除它们。您应该记住,代码的外观很重要。 (更新:我看到你已经解决了这个问题.Kudos!)

  4. 请不要使用全局变量,除非您有一些经验,并且您认为确实需要它们。在这种情况下,你没有。如果您将变量的范围更改为local,请记住也要初始化它们。

  5. 不要使用char数组来表示字符串。使用std::string s。它们具有所有阵列功能和更多功能,并且更安全,更方便。

  6. 一种方法可以节省一些打字/复制+粘贴并消除代码中的一些冗余(这是非常糟糕的)是使用std::cout对象的类型和{{}的父类1}}类型为std::ofstream。你可以编写将这种类型的对象作为参数的函数,只写出你要写出的内容,然后你会调用这些函数两次:一次使用std::ostream,一次使用你的文件。

  7. 除了所有这些要点之外,我希望你能记住这一点:除非你能客观地证明这是一个问题,否则不要担心性能和优化。

    (对不起这个回复的语气; 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)

  1. 您可以编写一个函数来打印文件和输出中的值。

    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); 
    
  2. C ++有内置字符串数据类型,使用它代替char数组。

  3. 如果您已加入using namespace std,那么您不必再次指定coutcin等来自std名称空间。

  4. 不要使用全局变量。

  5. 仅举例:

    #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::coutstd::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;
}