文本文件 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;
}