我正在为我的基础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;`
答案 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
现在开始演出了!
首先,我们需要知道最大的分配名称有多大。
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或缓存更昂贵,所以在你不得不这样做之前不要这样做。