Basic Prog Prob

时间:2011-10-06 14:00:48

标签: c++

我一直在努力自我教导自己如何编码,但这种练习问题很难实现!任何帮助将不胜感激。我已经完成了代码和逻辑,但只有一个是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的第一个分数。任何帮助将不胜感激。

3 个答案:

答案 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)

顺便说一下:countcountercounterr - &gt;像这样的命名变量肯定会失去你的头发

答案 2 :(得分:0)

您所描述的是从代码中得到的。当ID更改(prev != id)时,它将不会执行与if ( prev == id )部分一起使用的块中的代码,因此不会更新highlow等变量。我认为,无论prev是否等于id,您总是希望执行该块中的一些代码。特别是检查新的高分或低分,但也许在那里的一切?