用于打印特定板C ++的最有效的代码

时间:2014-05-25 21:46:52

标签: c++ for-loop multidimensional-array

所以我试图用多维数组打印一个完全的主板

char score[10][10] = {' '};

   a b c d e f g h i j
  +-------------------+
 0|                   |
 1|                   |
 2|                   |
 3|                   |
 4|                   |
 5|                   |
 6|                   |
 7|                   |
 8|                   |
 9|                   |
  +-------------------+

目前这是我的代码:

#include <iostream>
using namespace std;
#include <vector>
#include <string.h>

int main() {
    char score[10][10] = {' '};

    cout << "   a b c d e f g h i j" << endl;
    cout << "  +-------------------+" << endl;

    for (int i = 0; i < 10; i++) {
        cout << " " << i << "|";
        for (int j = 0; j < 10; j++) {
            cout << score[i][j];
        }
        if(i == 0) {
            cout << "                  |";
        } else {
            cout << "                   |";
        }
        cout << endl;
    }
    cout << "  +-------------------+" << endl;
}

正如您所看到的,我的代码效率低且冗长。

使用多维分数数组打印电路板的最有效方法(或更有效的方法)是什么?

3 个答案:

答案 0 :(得分:1)

正如评论所指出的那样,您的代码几乎尽可能高效。缩短它对运行时间的影响很小,而不是模糊其含义。但是,你可以采取一些措施加快速度。

  1. 通过使用operator<<并将其包含在现有字符串文字中(在编译时评估),避免额外调用std::end,评估\nunnecessary buffer flushes时间)。

  2. 使用printf代替cout。见&#34;表现&#34; this article的一部分。

答案 1 :(得分:0)

正如其他人已经指出的那样,提高效率的方法并不多,特别是在限制使用cout流的情况下。

但对于“冗长”的部分,这是几行和字符较短,尽管是C ++ 11:

cout << "   a b c d e f g h i j\n"
        "  +-------------------+\n";
for (int i = 0; i < 10; i++) {
    cout << ' ' << i << '|';
    for (char s : score[i])
      cout << s;
    cout << "         |\n";
}
cout << "  +-------------------+\n";

我不明白为什么应该在末尾打印空格而不是很好地对齐内部列,但我按照你在代码中所做的那样。

我还摆脱了不必要的endl触发流刷新并将单字母字符串更改为字符常量,但我对那里产生的效率增益有点怀疑。毕竟,它只是打印一些输出,而不是时间关键的计算任务。

答案 2 :(得分:0)

我会假设,当你说你想要高效不冗长时,你真正想要的是你想要它正确可读

我不相信你现在拥有的是“正确的”。我假设char score[10][10]将包含每个方块的单个可打印字符,也可能是您不想打印任何内容的单元格的空字符。并且您希望将score的内容打印到显示的模板中。按照目前的情况,如果你将一个空格以外的任何东西放入char score[10][10],你就会弄乱你的模板。

至于可读性,我认为你现在所拥有的是相当可读的,也许通过让一些functions extracted具有有意义的名字而受益,但这只是我个人的偏好。基于我对你在这里尝试做什么的假设是我的纠正和重构版本:

#include <iostream>
#include <vector>
#include <string>

void printHeader() {
  std::cout << "   a b c d e f g h i j\n";
  std::cout << "  +-------------------+\n";
}

void printFooter() {
  std::cout << "  +-------------------+\n";
}

void printRowStart(int i) {
  std::cout << " " << i << "|";
}

void printRowEnd() {
  std::cout << "|\n";
}

void printSquare(char score) {
  char printable_score = (score != '\0') ? score : ' ';
  std::cout << printable_score;
}

void printRowScore(char (&row_score)[10]) {
  printSquare(row_score[0]);
  for (int i = 1; i != 10; ++i) {
    std::cout << " ";
    printSquare(row_score[i]);
  }
}

void printScore(char (&score)[10][10]) {
  printHeader();
  for (int i = 0; i != 10; ++i) {
    printRowStart(i);
    printRowScore(score[i]);
    printRowEnd();
  }
  printFooter();
}

int main(){
  char score[10][10] = { { 0 } };

  // Added to test assumed usage
  score[4][5] = 'x';
  score[4][6] = 'x';

  printScore(score);
}

您可能还需要考虑将代码打印到通用ostream以使其更易于测试。