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

Documentation on std::max

现在继续表演!

首先我们需要知道最大的赋值名有多大

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。这样做主要是为了演示目的,因为我认为它看起来更好。它并没有真正为您节省很多处理时间,如果有的话。节省时间的是缺少 endls。 endl 实际上是一个非常昂贵的操作,因为它不仅结束一行,而且还刷新。它将流中缓冲的所有内容强制输出到底层媒体,在本例中为控制台。当计算机可以避免真正离开计算机,直到他们真的不得不离开时,计算机才处于最佳状态。绘制到屏幕比写入 RAM 或缓存​​要昂贵得多,所以除非万不得已,否则不要这样做。