我正在编写一个程序,接受输入并将其格式化为“名称分数”。 以下是需要做的事情“这是Moonglow的格式。
文本文件由单词组成。如果一个单词是一个数字,那么这是一个学生在一个问题上的得分,所以你将它添加到学生的考试成绩中。
如果单词不是数字,而是单词“NAME”,则下一个单词是学生的姓名(Moonglow只使用名字 - 姓氏是公司名称和非个人名称。)
如果单词是“AVERAGE”,那么您开始读取数字,直到您读到一个不是数字的单词(或者是文件的结尾)。您平均所有这些数字并将其添加到分数中。由于Moonglow有点分散,有时一些数字不遵循“AVERAGE”。在这种情况下,您忽略“AVERAGE”。 “
我的问题是我以某种方式进入了一个无限循环,并花了几个小时试图解决这个问题。这是一个非常简单的程序,我似乎无法让它工作!
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stdlib.h>
using namespace std;
int main()
{
string s, name = "test";
string buffer;
double qScore, eScore, totalExam = 0, grade = 0, numExam = 0, finalGrade, avg = 0;
while (!cin.eof())
{
if (cin >> qScore)
{
if (cin.fail())
{
cin.clear();
}
else
{
grade += qScore;
}
}
else if (cin >> s)
{
if (s == "NAME")
{
cin >> s;
s = name;
}
else if (s == "AVERAGE")
{
while (cin >> eScore)
{
numExam++;
totalExam += eScore;
}
cin.clear();
}
}
}
if (numExam == 0)
{
avg = 0;
}
else
{
avg = (totalExam / numExam);
}
finalGrade = avg + grade;
cout << name << " " << finalGrade << endl;
return 0;
}
// end of main
答案 0 :(得分:1)
我不会为你编写代码(因为这显然是一个家庭作业问题),但我会提出一些建议,告诉我如何以完全不同的方式完成这项工作。希望这个伪代码有所帮助。
编辑:我错过了AVERAGE的逻辑以及分数应如何运作,我正在进行一些更正。 (注意,通过这些更改,添加新状态可能会更好。我会考虑正常,名称,起始平均值,平均值,结束时间。但它取决于您。)
1)定义这些状态(也许使用枚举):
2)你想阅读一个&#34;令牌&#34;并按以下规则过渡。请注意,在这种情况下,令牌将是一个字符串,用空格分隔(例如&#34; NAME&#34;,&#34; AVERAGE&#34;,&#34; Bob&#34;,&#34; 11&# 34;,&#34; 23&#34;)。
3)为了处理输入,首先将所有内容读入字符串变量。然后,您可以在需要时使用stringstream
转换为double。只需阅读我所描述的所有字符串(标记)并按上述方法处理它们,直到达到EOL。
&#34;代码&#34;:
while (cin >> s)
{
if (state == state_normal)
{
if (s == "NAME") { state = state_name; }
else if (s == "AVERAGE")
{
state = state_average;
// You are starting a new average, initialize these variables to 0
scoresToAverage = 0;
numberOfScores = 0;
}
else if (isNumber(s))
{
number = convertToNumber(s);
score += number;
}
}
if (state == state_name)
{
name = s;
state = state_normal;
}
if (state == state_average)
{
bool calculateAverage = false;
if (s == "NAME")
{
state = state_name;
calculateAverage = true;
}
else if (s == "AVERAGE")
{
state = state_average;
calculateAverage = true;
}
else if (isNumber(s))
{
number = convertToNumber(s);
scoresToAverage += number;
numberOfScores++;
}
else
{
state = state_normal;
calculateAverage = true;
}
// If you are DONE averaging, calculate the average and add it to the total
if (calculateAverage)
{
if (numberOfScores > 0)
{
score += (scoresToAverage / numberOfScores);
}
scoresToAverage = 0;
numberOfScores = 0;
}
}
}
// done reading input, just print!
isNumber
需要一个字符串,并且可以检查第一个字符是否为数字(&#39; 0&#39;,&#39; 1&#39;,...)。它可能更漂亮,并查看每个字符的数字/小数。
convertToNumber
接受一个字符串并转换为double。可以使用stringstreams
进行转换,也可以使用旧的atoi
。