/*
* 作 者: 霍雨佳
* 完成日期:2014 年3月6日
* 版 本 号:v1.0
* 问题描述:利用结构体数组等知识对学生的成绩进行统计。
* 样例输入:略
* 样例输出:略
* 问题分析:(1)从文件中读出数据,存放到结构体数据中。
(2)求出每名同学的总分(可以在读入过程中顺便计算)
(3)输出结构体数组中所有同学的记录。
(4)按总分排序(降序);
(5)输出排序后的成绩单;
(6)有30名同学可以获得奖学金,规则是总分高者优先,有挂科者不得奖学金,请输出可以的奖学金的同学的名单
*/
#include <iostream>
#include <cstdlib>//调用 exit(1)需要包含cstdlib
#include <fstream>//操作文件必写
#include <iomanip>
using namespace std;
struct Student
{
char num[13]; //学号
char name[10];
int cpp;
int math;
int english;
int grade; //总成绩
double average;//均值
};
void output(Student s [],int n);//输出所有同学的记录
void sort(Student s [],int n);//按总分排序(降序)
void put(Student s [],int n);//输出排序后的成绩单
void out(Student s [],int n);//输出得奖学金同学名单
int main()
{
int i;
Student stu[1500];
int stuNum=0;
//从文件中读取数据,存放到定义的结构体数组中
ifstream infile("score.txt",ios::in);//以输入方式打开文件
if(!infile)//测试是否成功打开
{
cerr<<"open error!"<<endl;
exit(1);
}
i=0;
while(infile>>stu[i].num>>stu[i].name>>stu[i].cpp>>stu[i].math>>stu[i].english)
{
stu[i].grade=stu[i].cpp+stu[i].math+stu[i].english;//计算总成绩
++stuNum;
++i;
}
infile.close();
output(stu,stuNum);
sort(stu,stuNum);
cout<<"按总分排序后的名单为:"<<endl;
put(stu,stuNum);
cout<<"获得奖学金的同学有:"<<endl;
out(stu,stuNum);
return 0;
}
void output(Student s[],int n)//输出所有同学的记录
{
int j;
cout<<setw(13)<<"学号"<<setw(13)<<"姓名"<<setw(13)<<"C++"<<setw(13)<<"高数"<<setw(13)<<"英语"<<setw(13)<<"总分"<<endl;
for(j=0; j<n; j++)
{
cout<<setw(13)<<s[j].num<<setw(13)<<s[j].name<<setw(13)<<s[j].cpp<<setw(13)<<s[j].math<<setw(13)<<s[j].english<<setw(13)<<s[j].grade<<endl;
}
}
void sort(Student s[],int n)//按总分排序(降序)
{
int j,i;
Student m;
for(j=0; j<n-1; j++) //冒泡排序法
{
for(i=0; i<n-1-j; i++)
{
if(s[i].grade<s[i+1].grade)
{
m=s[i];
s[i]=s[i+1];
s[i+1]=m;
}
}
}
}
void put(Student s[],int n) //输出排序后成绩单
{
int j;
cout<<setw(13)<<"学号"<<setw(13)<<"姓名"<<setw(13)<<"C++"<<setw(13)<<"高数"<<setw(13)<<"英语"<<setw(13)<<"总分"<<endl;
for(j=0; j<n; j++)
{
cout<<setw(13)<<s[j].num<<setw(13)<<s[j].name<<setw(13)<<s[j].cpp<<setw(13)<<s[j].math<<setw(13)<<s[j].english<<setw(13)<<s[j].grade<<endl;
}
}
void out(Student s [],int n)//输出得奖学金同学名单
{
int i;
for(i=0;i<30;)
{
if(s[i].cpp>=60&&s[i].math>=60&&s[i].english>=60)
{
cout<<setw(13)<<s[i].num<<setw(13)<<s[i].name<<setw(13)<<s[i].cpp<<setw(13)<<s[i].math<<setw(13)<<s[i].english<<setw(13)<<s[i].grade<<endl;
i++;
}
}
}
运行结果:
丫丫,做好了
开始运行结果直接看不懂,乱七八糟的,一点一点终于调好了,对于文件的应用不熟练
加油加油~~~