使用函数输出最高平均值

时间:2017-12-06 06:42:03

标签: c++ arrays file max

我应该创建一个函数,它接收数组作为参数,并搜索3个等级中平均值最高的学生,并返回到数组中学生的主要位置。

4个阵列是: 学号(9位数) 数学等级 科学等级 英语成绩

最后,它应该将文件中的数据读入数组。

档案数据是:

123456789
60
70
80
987654321
70
80
90
999888777
75
85
65
111222333
55
65
75
444555666
63
73
83

我需要有关如何使用数组和函数读取文件数据的帮助。

这是我到目前为止所做的:

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;

int findHighest(int Mgrade[5], int Sgrade1[5], int Egrade[5], long Snumber[5]);

main()
{
    int Mgrade[5], Sgrade[5], Egrade[5];
    long Snumber[5];

    char num_from_file;
    ifstream infile;
    char mystring[20];
    int grade;
    infile.open("testdata.txt", ios::in);

    if (infile)
    {

        cout<<"File opened successfully\n";
        {
            do
            {

                infile.get(mystring,21); //(example from other program)
                infile.ignore(80,'\n');// (what should go here instead)

                infile>> grade;//(example from other program)
                infile.ignore(80,'\n');// (what should go here instead)

                if (infile.eof())
                {
                    break;
                }

                cout<<mystring<<'\t'<<grade<<endl<<endl;
                //cout<<'\t'<<num_from_file<<endl;
            }
            while(1);
        }
    }
    else
    {
        cout<<"error opening file";
    }

    infile.close();

    return 0;
}

1 个答案:

答案 0 :(得分:1)

只需使用getline(),就像这样:

#include <fstream>
#include <iostream>
#include <string>

int main(void) {
    int Mgrade[5], Sgrade[5], Egrade[5];
    long Snumber[5];
    std::ifstream input("testdata.txt");
    int index = 0, counter = 0;
    for( std::string line; getline( input, line ); ) {
        if(counter == 4) {
            counter = 0;
            index++;
        }
        if(counter == 0) {
            Snumber[index] = std::stol(line);
        } else if(counter == 1) {
            Mgrade[index] = std::stoi(line);
        } else if(counter == 2) {
            Sgrade[index] = std::stoi(line);
        } else if(counter == 3) {
            Egrade[index] = std::stoi(line);
        }
        counter++;
    }
    return 0;
}

代码逐行读取文件(代码中的变量input)并使用for循环来实现。

在循环的每次迭代中,变量line将包含我们正在读取的文件的当前行。例如,在第一次迭代中,line将等于"123456789"

现在我使用两个整数indexcounter。第一个用于索引数组,因为我们正在读第一个学生,我们想要填充每个数组的第一个单元格(即index等于0)。

counter用于跟踪idnex位学生已读取的行数。我们希望为每个学生阅读4行,因此当我们阅读他的数字时counter将为0,当我们阅读他的数学成绩时为{1},当我们阅读他的科学成绩时为2,当我们阅读他的英语成绩时为3。在每次迭代结束时,计数器增加1。

现在,当counter等于4时,这意味着我们应该开始为下一个学生读取数据,因此我们必须将index增加1,这样,例如,如果我们正在阅读第一个学生的数据(index等于0),现在我们需要(index等于1)。

此外,counter应该重新初始化为0,以便我们使用if-else语句正确读取他的数字和成绩。