所以我试图用多维数组打印一个完全的主板
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;
}
正如您所看到的,我的代码效率低且冗长。
使用多维分数数组打印电路板的最有效方法(或更有效的方法)是什么?
答案 0 :(得分:1)
正如评论所指出的那样,您的代码几乎尽可能高效。缩短它对运行时间的影响很小,而不是模糊其含义。但是,你可以采取一些措施加快速度。
通过使用operator<<
并将其包含在现有字符串文字中(在编译时评估),避免额外调用std::end
,评估\n
和unnecessary buffer flushes时间)。
使用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
以使其更易于测试。