读取双打和单词,并根据阅读内容执行动作
Reading in both doubles and words and performing actions based on what is read
我正在编写一个程序,该程序将输入和将其格式化为"名称分数"。这是需要做的"这是Moonglow的格式。
-
文本文件由单词组成。如果一个单词是一个数字,那么这是学生在问题上的分数,因此您将其添加到学生的考试成绩中。
-
如果这个单词不是数字,而是"名称"一词,那么下一个单词是学生的名字(Moonglow仅使用名字 - 姓氏是公司和非个人化)。
-
如果单词为"平均",则开始读取数字,直到读取一个不是数字的单词(或者是文件的末尾)。您平均所有这些数字,并将其添加到分数中。由于Moonglow有点分散,有时数字不会遵循"平均值"。在这种情况下,您会忽略"平均值"。"
我的问题是我已经以某种方式进入了一个无限的循环,并花了几个小时试图解决这个问题。这是一个非常简单的程序,我似乎无法使其工作!
#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
我不会为您编写代码(因为这显然是一个家庭作业问题),但是我将提供一些有关如何完全不同的建议。希望此伪代码有所帮助。
编辑:我错过了平均逻辑以及分数应该如何工作的逻辑,我正在做一些更正。(注意,随着这些更改,最好添加新状态。我认为正常,名称,开头,平均,Endaverage。但这取决于您。
1)定义这些状态(也许使用枚举):
- 正常(可能有一个更好的名字)
- 名称
- 平均
2)您想阅读一个"令牌",并使用以下规则过渡。请注意,在这种情况下,令牌将是一个字符串,被空间隔开(例如"名称","平均"," Bob"," 11"," 23")。
- 如果状态是正常的(这也是初始状态)
- 如果令牌为"名称",请转到状态名称
- 如果令牌为"平均",请进入州平均值
- 如果令牌从这些字符'0','1','2',...'9'开始
- 如果状态为姓名
- 将令牌复制到您的"名称"变量中,过渡到正常状态
- 如果状态为平均
- 如果您得到一个数字,请将其添加到临时计数中并增加计数器
- 如果您得到一个不是"名称","平均"或一个数字的字符串,请返回正常状态
- 如果您得到"名称",请转到name state
- 进入此状态之前,您需要重置临时计数/计数器才能计算平均
- 在离开此状态之前,计算平均水平并将其添加到总分
3)对于处理输入,首先将所有内容读取 everything 首先将其读取到字符串变量中。然后,您可以使用stringstream
s在需要时转换为双倍。如我所描述的那样,只需阅读所有字符串(令牌),然后将它们如上所述,直到您到达EOL。
"代码":
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
取一个字符串,可以检查第一个字符是一个数字('0','1',...)。它可能更典型,并查看每个字符的数字/小数。
convertToNumber
取一个字符串并转换为双重。可以使用stringstreams
进行转换,或者只是旧的atoi
。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 文本文件中的单词链表
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 在指针的帮助下,文本文件中单词的频率
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- 如何根据单词在文本中出现的概率输出单词
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- 我的控制台正在打印随机单词以及没有执行正确的数学运算
- 读取双打和单词,并根据阅读内容执行动作