C 初学者:如何防止表中的文本将任何文本推向其右侧

C++ Beginner: How do I prevent the text in my table from pushing any text to the right of it?

本文关键字:文本 任何 初学者 何防止      更新时间:2023-10-16

我正在为我的基础知识制作一个非常基本的程序,并且我的所有工作都按预期工作了98%。

此程序以三个成绩的名称,平均它们的名称,并将它们输出到表中,但是由于assignmentName[]grade[]的代码行相同,因此将grade[]推到正确的确定用户输入的字符数量。问题的屏幕截图

这是我目前为表格写的代码:

cout << "___________________________n";
cout << name << "'s Grade Chartn";
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;`

我发表了评论,"将另一个 setw(N)放在每个 << assignmentName之前最大的 assignmentName。"

,但第二个认为这比这更有趣,所以我认为一个真正的答案是按顺序进行的。

首先,一些阅读材料:

std::leftstd::right

的文档

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。这主要是出于演示目的,因为我认为它看起来更好。在处理时间内,它并不能为您节省很多(如果有的话)。节省时间的是缺乏endl s。endl实际上是一个非常昂贵的操作,因为它不仅结束了一条线,而且还会冲洗。它迫使在这种情况下,在溪流中被缓冲到基础媒体的任何游戏机。当计算机能够避免真正离开计算机之前,直到真正的计算机才能达到最佳状态。绘制到屏幕上比写入RAM或缓存要贵,所以不要这样做。

而不是写作:

"Grade for " << assignmentName[x] << setw[y] << grade(z)

写:

"Grade for " << setw[a]  << assignmentName[x] << setw[y] << grade(z)

其中 a 在每种情况下都大于 x 。也许应该解决它。

您的 a 应该是10或15之类的东西。我希望在那之后起作用。尝试。