C ++初学者:如何防止表格中的文本向右侧推送任何文本?

时间:2017-09-23 03:25:04

标签: c++ debugging setw

我正在为我的基础I课程开设一个非常基础的课程,我有98%的工作按预期工作。

此程序采用三个等级的名称,对它们进行平均,然后将它们输出到表格中,但由于assignmentName[]grade[]在同一行代码上,因此它会推送grade[]在右边确定用户输入了多少个字符。 Screenshot of the problem

以下是我目前为该表编写的代码:

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;`

2 个答案:

答案 0 :(得分:0)

而不是写作:

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

写:

{{1}}

在每种情况下, a 大于 x 。 也许这应该解决它。

你的 a 应该是10或15之类的东西。我希望它能在那之后起作用。试试吧。

答案 1 :(得分:0)

我发了评论,&#34;在每个setw(N)之前放置另一个assignmentName,其中N比最大<< assignmentName大一点。&#34;

但是第二个想到它比这更有趣,所以我认为真正的答案是有序的。

首先,一些阅读材料:

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。这主要是出于演示目的而进行的,因为我觉得它看起来更好。在处理时间方面,它并没有为你节省太多(如果有的话)。节省时间是缺少endl的。 endl实际上是一个非常昂贵的操作,因为它不仅会结束一条线,而且还会刷新。它强制将流中缓冲的任何内容输出到底层媒体,在这种情况下是控制台。计算机处于最佳状态时,他们可以避免实际走出计算机,直到他们真的不得不这样做。绘制到屏幕上比写入RAM或缓存更昂贵,所以在你不得不这样做之前不要这样做。