【问题标题】:C++ How to Reduce the Number of "cout" to 6C ++如何将“cout”的数量减少到6
【发布时间】:2014-10-16 07:01:14
【问题描述】:

我想减少这个程序中使用的“cout”的数量..到目前为止,我的程序中有 9 个“cout”...... 首先我有 11 个“cout”,但我可以通过将它们放在一个方法中来减少到 9 个。但还是超过6..

#include <iostream>
#include <iomanip>
using namespace std;

static void Endline(){
     cout << endl;
}

void printHeader(int start, int end) {
     cout << setw(4) << " ";
     for (int firstrow = start; firstrow <= end; firstrow++) {
        cout << setw(3) << firstrow << " ";
     }
     // cout << endl;
     Endline();

     // Second line, lead space then proper number of dashes
     cout << setw(4) << " ";
     for (int secondrow = start; secondrow <= end; secondrow++) {
        cout << "****";
     }
     //cout << endl;
     Endline();
}

int main() {
     int start;
     int end;

     // Collect start and end of listing
     cout << "Enter a start index (integer): " << endl;
     cin >> start;

     cout << "Enter an end index (integer): " << endl;
     cin >> end;

     for (int i = start; i <= end; i++) {
        // Executes once to print header
        if (i == start) {
            printHeader(start, end);
        }

        // Now loop through columns
        for (int j = start; j <= end; j++) {
            // Once per row create first column heading
            if (j == start) {
                cout << setw(3)<<  i << "|";
            }

            // Multiply row and column
            cout << setw(3) << (i * j) << " ";
        }

        // End row
        //cout << endl;
        Endline();
      }

     return 0;
}

【问题讨论】:

  • 考虑到这两个循环都在相同的范围内迭代,您应该能够将它们组合起来。
  • 您也可以有创意,告诉用户以1 5 格式输入两个索引。然后读取字符串。
  • 这是作业问题吗?
  • 听起来像是编程高尔夫(这段代码尽量少写,使用最少的函数X等),就像高尔夫作为一项运动,在现实生活中完全没用.. . 专注于你的代码逻辑,写得清晰,逻辑清晰,保持干燥(不要重复自己)。 [我可以重写你的代码,让它使用一次cout,但这绝对没有任何好处,而且你会到处传递ostream&amp;]

标签: c++


【解决方案1】:

如果您将整个表格流式传输到 std::stringstreamcout 结果中,您可以将 couts 的数量减少到 3:

#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;

void printHeader(stringstream& result, int start, int end) {
    result<< setw(4) << " ";
    for (int firstrow = start; firstrow <= end; firstrow++) {
        result<< setw(3) << firstrow << " ";
    }
    result<< endl;

    // Second line, lead space then proper number of dashes
    result << setw(4) << " ";
    for (int secondrow = start; secondrow <= end; secondrow++) {
        result << "****";
    }
    result << endl;
}

int main() {
    int start;
    int end;

    // Collect start and end of listing
    cout << "Enter a start index (integer): " << endl;
    cin >> start;

    cout << "Enter an end index (integer): " << endl;
    cin >> end;

    stringstream result;

    for (int i = start; i <= end; i++) {
        // Executes once to print header
        if (i == start) {
            printHeader(result, start, end);
        }

        // Now loop through columns
        for (int j = start; j <= end; j++) {
            // Once per row create first column heading
            if (j == start) {
                result<< setw(3)<<  i << "|";
            }

            // Multiply row and column
            result << setw(3) << (i * j) << " ";
        }

        // End row
        result<< endl;
    }
    cout << result.str();
    return 0;
}

但是:你为什么要减少couts?根据this question cout 似乎运行良好。

【讨论】:

    【解决方案2】:

    您想要做的是减少代码中的重复次数。这是您在编程时一直想做的事情。

    因此,每当您看到两个看起来相似的代码块时(有时是因为它们来自复制粘贴),您应该寻找一种将它们编写为一个函数的方法。

     cout << setw(3)<<  i << "|";
    

    cout << setw(3) << (i * j) << " ";
    

    cout << setw(3) << firstrow << " ";
    

    几乎相同。你可以把它们写成一个函数,以要打印的数字和结束字符为参数。

    同样,

     cout << setw(4) << " ";
    

    出现两次,

     cout << "Enter a start index (integer): " << endl;
    

    也出现两次。您可以将两者包装在一个将调用两次的函数中,就像对 endl 字符所做的那样。

    这样就可以去掉4个couts,够了吧?

    【讨论】:

    • -1:将每个琐碎的输出语句包装在一个函数中只会将fluff 添加到您的程序中,从而使发生的事情变得模糊不清。如果重复有问题,最好重写逻辑。
    • 讽刺的是 setw 已经是一个函数:/* unspecified */ setw(int n) 被传递给 operator&lt;&lt;(std::ostream, ...),所以进一步包装它没有任何好处
    • 我会说,如果您建议某人使用函数来输出,您还可以解释将某人绑定到流是多么不好;告诉他们将它传递给函数。
    • 嗯,这个问题对我来说似乎是一个类问题,并且考虑到我被告知的情况,我觉得将 cout 调用包装到函数中是预期的。我认为 OP 真的不需要在他的程序中调用 6 次,也不需要再调用 cout 了。我认为尤其如此,因为这是用 endl 打印完成的(老师,作为线索?)。
    猜你喜欢
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    相关资源
    最近更新 更多