成绩计算与统计——C++程序,C++程序

文本文件 score.txt记录学生的原始成绩,statistic.txt存放各专业学生人数的统计情况,原始数据内容如下,总共 40 行。

第 1 列是序号

第 2 列是学号

第 3 列是姓名

第 4 列是专业

第 5 列是平时成绩

第 6 列是期中成绩

第 7 列是期末成绩

第 8 列是总评成绩

总评成绩 = 平时成绩*10% + 期中成绩*30% + 期末成绩*60%

编程目标:计算每个学生的总评成绩,并按总评成绩从高到低排序,将排序后的 结果输出到另外一个文本文件中,并统计班级中各个专业的学生人数,写入statistic.txt文件中。格式如下

第 1 列是序号

第 2 列是学号

第 3 列是姓名

第 4 列是专业

第 5 列是平时成绩

第 6 列是期中成绩

第 7 列是期末成绩

第 8 列是总评成绩,输出的顺序是按总评成绩降序输出。
提示:

struct StudentScore{

int serialNum;//序号

int id;//学号

string name;//姓名

string major;//专业

float regularScore;//平时成绩

float midtermScore;//期中成绩

float examScore;//期末成绩 float finalScore;//总评成绩

};

函数声明建议如下:

void printScore(StudentScore *stu); //输出到屏幕

void parseScore(StudentScore *s, string str); //解析一行文本

bool readFromFile(StudentScore *s, int count, string inputFileName); /
/从文件读取

void calculateMajor (StudentScore *s);//统计班上各专业人数并写入文件

void calculateFinalScore (StudentScore *s, int count); //计算总评成绩

void sortScoreDesc(StudentScore *s, int count); //排序函数,总成绩降序
排,

//排序可以链表也可以数组

void writeToFile(StudentScore *s, int count,string outputFileName); //
输出到文件

图片说明

https://wenku.baidu.com/view/d671ecec551810a6f5248683.html

发了半天时间搞定,文件输出格式不知道满足你的要求不,程序运行输出两个文件:
major.txt:统计班上各专业人数
result.txt:排序函数,总成绩降序

#include <iostream>
#include <string.h>
#include <fstream>
#include <vector>
#include <algorithm>


using namespace std;

struct StudentScore{
    int serialNum;//序号
    int id;//学号
    string name;//姓名
    string major;//专业
    float regularScore;//平时成绩
    float midtermScore;//期中成绩
    float examScore;//期末成绩 
    float finalScore;//总评成绩
};

StudentScore stu[10000];
int totalcount = 0;

//输出到屏幕
void printScore(StudentScore *stu) 
{
    cout << "序号    :" << stu->serialNum << endl;
    cout << "学号    :" << stu->id << endl;
    cout << "姓名    :" << stu->name << endl;
    cout << "专业    :" << stu->major << endl;
    cout << "平时成绩 :" << stu->regularScore << endl;
    cout << "期中成绩 :" << stu->midtermScore << endl;
    cout << "期末成绩 :" << stu->examScore << endl;
    cout << "总评成绩 :" << stu->finalScore << endl;
}

//解析一行文本
void parseScore(StudentScore *s, string str) 
{
    //1     200637096       王莎莎      保险0605        85      80      51
    if(s != NULL )
    {
        int flag = 0;
        int flag1 = 0;
        string temp ;

        //
        for(auto iter = str.begin(); iter != str.end(); ++iter)
        {
            if((*iter != ' ') && (*iter != '\t'))
            {
                //有效数据标志
                flag1 = 1;
                temp += *iter;
            } else {
                if(!flag1)
                {
                    continue;
                }

                //数据内容
                switch(flag)
                {
                case 0:
                    s->serialNum = stoi(temp);
                    flag++;
                    break;
                case 1:
                    s->id = stoi(temp);
                    flag++;
                    break;
                case 2:
                    s->name = temp;
                    flag++;
                    break;
                case 3:
                    s->major = temp;
                    flag++;
                    break;
                case 4:
                    s->regularScore = stof(temp);
                    flag++;
                    break;
                case 5:
                    s->midtermScore = stof(temp);
                    flag++;
                    break;
                case 6:
                    s->examScore = stof(temp);
                    flag++;
                    break;
                default:
                    break;
                }
                temp.clear();
                flag1 = 0;
            }
        }
        s->examScore = stof(temp);

        // printScore(s);
    }


}

//从文件读取
bool readFromFile(StudentScore *s, int count, string inputFileName) 
{
    int i = 0;
    ifstream ifile;
    string line;
    ifile.open(inputFileName);

    getline(ifile, line);
    // cout << line << endl;

    while(ifile)
    {
        getline(ifile, line);
        //防止重复读取最后一行
        if(ifile.peek() == '\n')
            break;

        parseScore(&s[i++], line);

        totalcount++;

        if(i >= count)
        {
            return false;;            
        }
    }

    return true;
}

struct MajorInfo {
    string major;
    int count;
};

//统计班上各专业人数并写入文件
void calculateMajor (StudentScore *s, int count)
{
    int flag = 1;
    vector<MajorInfo> vm;
    ofstream fout("major.txt");

    for(int i=0 ; i< count; i++)
    {
        flag = 0;
        for(auto iter = vm.begin(); iter != vm.end(); iter++)
        {
            if(s[i].major.compare(iter->major) == 0)
            {
                flag = 1;
                iter->count++;
            }
        }

        if(!flag)
        {
            MajorInfo temp;

            temp.major = s[i].major;
            temp.count = 1;

            vm.push_back(temp);
        }
    }
    fout << "班级专业\t\t数量" << endl;
    for(auto iter = vm.begin(); iter != vm.end(); iter++)
    {
        fout << iter->major << "\t\t" << iter->count << endl;
    }

    fout.close();
}

//计算总评成绩
void calculateFinalScore (StudentScore *s, int count) 
{
    for(int i = 0; i < count; i++)
    {
        s[i].finalScore = s[i].regularScore * 0.1 + s[i].midtermScore * 0.3 + s[i].examScore * 0.6;
    }
}

bool myfunction(StudentScore a, StudentScore b)
{
    return (a.finalScore < b.finalScore);
}

//排序函数,总成绩降序排,
void sortScoreDesc(StudentScore *s, int count) 
{
    sort(&s[0], &s[count], myfunction);
}

//排序可以链表也可以数组
void writeToFile(StudentScore *s, int count,string outputFileName)
{
    ofstream fout(outputFileName);

    fout <<"序号\t\t学号\t\t姓名\t\t班级\t\t平时成绩\t\t期中成绩\t\t期末成绩\t\t总评成绩"<< endl;
    for(int i=0; i< count; i++)
    {
        // printScore(&s[i]);
        fout << s[i].serialNum << "\t\t" << s[i].id  << "\t" << s[i].name << "\t\t" \
        << s[i].major << "\t" << s[i].regularScore << "\t\t\t" << s[i].midtermScore << "\t\t\t" \
        << s[i].examScore << "\t\t\t" << s[i].finalScore << endl;
    }

    fout.close();
}



int main(int argc, char *argv[])
{
    bool ret;

    //string str = "1     200637096       王莎莎      保险0605        85      80      51";
    //parseScore(&stu, str);
    ret = readFromFile(stu, 10000, "score.txt");
    if(ret == false)
    {
        return -1;
    }

    calculateMajor(stu, totalcount);

    calculateFinalScore(stu, totalcount);

    sortScoreDesc(stu, totalcount);

    writeToFile(stu, totalcount, "result.txt");

    return 0;
}