C++ 初学者:如何防止 table 中的文本将任何文本推到它的右侧?
C++ Beginner: How do I prevent the text in my table from pushing any text to the right of it?
我正在为我的 Fundamentals I class 编写一个非常基础的程序,并且我的所有内容 98% 都按预期工作。
这个程序取三个年级的名字,取平均值,输出到一个table,但是由于assignmentName[]
和grade[]
在同一行代码,所以将 grade[]
推向右侧,确定用户输入的字符数。
Screenshot of the problem
这是我目前为 table 编写的代码:
cout << "___________________________\n";
cout << name << "'s Grade Chart\n";
cout << "---------------------------\n";
cout << setprecision(1) << fixed;
cout << "Grade for " << assignmentName[0] << setw(8) << grade[0] << endl;
cout << "Grade for " << assignmentName[1] << setw(8) << grade[1] << endl;
cout << "Grade for " << assignmentName[2] << setw(8) << grade[2] << endl;
cout << "\nYour average grade between those three assignments is: " << setw(1) << avg << endl;`
而不是写作:
"Grade for " << assignmentName[x] << setw[y] << grade(z)
写入:
"Grade for " << setw[a] << assignmentName[x] << setw[y] << grade(z)
其中 a 在每种情况下都大于 x。
也许这应该可以解决它。
您的 a 应该是 10 或 15 之类的东西。我希望它在那之后有效。试试吧。
我评论了,"Place another setw(N)
where N is a bit bigger than the largest assignmentName
before each << assignmentName
."
但转念一想这比这更有趣,所以我认为真正的答案是有序的。
首先,一些阅读材料:
Documentation on std::left
and std::right
现在继续表演!
首先我们需要知道最大的赋值名有多大
size_t max = 0;
for (const string & assn: assignmentName)
{
max = std::max(max, assn.length());
// You may need
//max = std::max(max, strlen(assn));
// if you've been forced to resort to barbarism and c-style strings
}
max++; // one extra character just in case we get a really long grade.
有时这会变得更整洁。例如 std::max_element
可以消除我们用来获取最大赋值名称长度的循环的需要。在这种情况下,我们正在寻找字符串的大小,而不是字符串的词法顺序,所以我认为循环和 std::max
对大脑来说更容易一些。
现在要格式化,我们打印左对齐的姓名和右对齐的成绩,姓名填充 max
个字符,成绩填充 8 个字符。
cout << "Grade for " << std::left << setw(max) << assignmentName[0]
<< std::right << setw(8) << grade[0] << '\n'
<< "Grade for " << std::left << setw(max) << assignmentName[1]
<< std::right << setw(8) << grade[1] << '\n'
<< "Grade for " << std::left << setw(max) << assignmentName[2]
<< std::right << setw(8) << grade[2] << '\n';
请注意,它现在变大了 cout
。这样做主要是为了演示目的,因为我认为它看起来更好。它并没有真正为您节省很多处理时间,如果有的话。节省时间的是缺少 endl
s。 endl
实际上是一个非常昂贵的操作,因为它不仅结束一行,而且还刷新。它将流中缓冲的所有内容强制输出到底层媒体,在本例中为控制台。当计算机可以避免真正离开计算机,直到他们真的不得不离开时,计算机才处于最佳状态。绘制到屏幕比写入 RAM 或缓存要昂贵得多,所以除非万不得已,否则不要这样做。
我正在为我的 Fundamentals I class 编写一个非常基础的程序,并且我的所有内容 98% 都按预期工作。
这个程序取三个年级的名字,取平均值,输出到一个table,但是由于assignmentName[]
和grade[]
在同一行代码,所以将 grade[]
推向右侧,确定用户输入的字符数。
Screenshot of the problem
这是我目前为 table 编写的代码:
cout << "___________________________\n";
cout << name << "'s Grade Chart\n";
cout << "---------------------------\n";
cout << setprecision(1) << fixed;
cout << "Grade for " << assignmentName[0] << setw(8) << grade[0] << endl;
cout << "Grade for " << assignmentName[1] << setw(8) << grade[1] << endl;
cout << "Grade for " << assignmentName[2] << setw(8) << grade[2] << endl;
cout << "\nYour average grade between those three assignments is: " << setw(1) << avg << endl;`
而不是写作:
"Grade for " << assignmentName[x] << setw[y] << grade(z)
写入:
"Grade for " << setw[a] << assignmentName[x] << setw[y] << grade(z)
其中 a 在每种情况下都大于 x。 也许这应该可以解决它。
您的 a 应该是 10 或 15 之类的东西。我希望它在那之后有效。试试吧。
我评论了,"Place another setw(N)
where N is a bit bigger than the largest assignmentName
before each << assignmentName
."
但转念一想这比这更有趣,所以我认为真正的答案是有序的。
首先,一些阅读材料:
Documentation on std::left
and std::right
现在继续表演!
首先我们需要知道最大的赋值名有多大
size_t max = 0;
for (const string & assn: assignmentName)
{
max = std::max(max, assn.length());
// You may need
//max = std::max(max, strlen(assn));
// if you've been forced to resort to barbarism and c-style strings
}
max++; // one extra character just in case we get a really long grade.
有时这会变得更整洁。例如 std::max_element
可以消除我们用来获取最大赋值名称长度的循环的需要。在这种情况下,我们正在寻找字符串的大小,而不是字符串的词法顺序,所以我认为循环和 std::max
对大脑来说更容易一些。
现在要格式化,我们打印左对齐的姓名和右对齐的成绩,姓名填充 max
个字符,成绩填充 8 个字符。
cout << "Grade for " << std::left << setw(max) << assignmentName[0]
<< std::right << setw(8) << grade[0] << '\n'
<< "Grade for " << std::left << setw(max) << assignmentName[1]
<< std::right << setw(8) << grade[1] << '\n'
<< "Grade for " << std::left << setw(max) << assignmentName[2]
<< std::right << setw(8) << grade[2] << '\n';
请注意,它现在变大了 cout
。这样做主要是为了演示目的,因为我认为它看起来更好。它并没有真正为您节省很多处理时间,如果有的话。节省时间的是缺少 endl
s。 endl
实际上是一个非常昂贵的操作,因为它不仅结束一行,而且还刷新。它将流中缓冲的所有内容强制输出到底层媒体,在本例中为控制台。当计算机可以避免真正离开计算机,直到他们真的不得不离开时,计算机才处于最佳状态。绘制到屏幕比写入 RAM 或缓存要昂贵得多,所以除非万不得已,否则不要这样做。