我一直在努力自我教导自己如何编码,但这种练习问题很难实现!任何帮助将不胜感激。我已经完成了代码和逻辑,但只有一个是isuee。
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
ifstream fin;
int id, prev, score, scoree, high = 0, low = 0, total = 0, count = 1, counter = 0, counterr = 0;
double avg = 0;
fin.open("C:\\Users\\E\\Desktop\\Quizzes.dat");
fin >> prev;
fin >> score;
low = score;
high = score;
total = score;
while(!fin.eof())
{
fin >> id;
fin >> scoree; //Problem is that when the ID changes it still inputs a score which gets ignored
if ( counter == counterr && counter != 0 ) //Could of used a BOOL here...
{
high = scoree;
low = scoree;
total = 0;
count = 0;
}
if ( prev == id )
{
if (scoree > high)
{
high = scoree;
}
if (scoree < low)
{
low = scoree;
}
total = total + scoree;
count++;
counter = 0;
}
else
{
total = total - (high+low);
count = count - 2;
avg = total / count;
cout << "ID: " << prev << " " << "AVG: " << avg << endl;
prev = id;
counter++;
counterr++;
}
}
}
.dat文件只是一个带有ID号和分数的文本文件。这里的想法是,如果ID与检查分数相同,它会读入分数和ID。应该抛出最高和最低分,其余分数平均。所以我的逻辑是,它将所有分数加起来,并且只有在ID变化之后,你才从总数中减去最高和最低分数,然后从计数中减去 - 2来平均分数。我遇到的问题是,当我输入一个ID并且它不同时,它也会输入一个分数,并且会跳过新ID的第一个分数。任何帮助将不胜感激。
答案 0 :(得分:0)
这样做的方法是创建一个map<int, vector<int> >
存储库,然后读入学生的ID。获得ID后,将其分数附加到适当的向量(repository[ID].push_back(score)
)。
下一步是遍历map
中的每个项目(基本上遍历每个ID)并计算数组中的最大和最小位置(平凡),然后迭代它并总结不在那些下面的所有内容两个位置,然后除以repository[ID].length
(注意不要除以0!)
答案 1 :(得分:0)
更改此
if ( prev == id )
对此:
if ( prev == id || count == 0)
顺便说一下:count
,counter
,counterr
- &gt;像这样的命名变量肯定会失去你的头发
答案 2 :(得分:0)
您所描述的是从代码中得到的。当ID更改(prev != id
)时,它将不会执行与if ( prev == id )
部分一起使用的块中的代码,因此不会更新high
和low
等变量。我认为,无论prev
是否等于id
,您总是希望执行该块中的一些代码。特别是检查新的高分或低分,但也许在那里的一切?