对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。功能要求:
(1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。
(2)本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
1)显示每门课程成绩最高的学生的基本信息
2)显示每门课程的平均成绩
3)显示超过某门课程平均成绩的学生人数
g、退出系统
1)执行一个具体的功能之后,程序将重新显示菜单。
2)将学生成绩保存到文件中。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef struct Student{
int ID; /*学生学号*/
char name[15]; /*学生姓名*/
vector<double> subject; /*因未知课程数量,所以课程数量采用动态数组vector*/
double sum; /*学生各科成绩总分*/
}Student;
struct Rule{
/*排序规则*/
bool operator()(const Student &stu1,const Student &stu2)const
{
if(stu1.sum!=stu2.sum) /*总分不相等按照总分从大到小排序*/
return stu1.sum>stu2.sum;
return stu1.ID>stu2.ID; /*总分相等按照学号从大到小排序*/
}
};
int N,M,i,j; /*N为学生人数,M为课程数量*/
double score; /*临时变量*/
Student temp; /*临时变量*/
vector<Student> Stu; /*本课设采用动态数组vector,防止浪费内存空间*/
bool condition=true; /*系统运行状态*/
char choice; /*用于输入来选择功能*/
/*---------------------------------------------a.成绩录入---------------------------------------------*/
void InsertScore(){
cout<<"请输入班级学生数量和课程数量:";
cin>>N>>M;
cout<<endl<<"现在请依次输入每个学生的学号、姓名和"<<M<<"门课程的成绩:"<<endl<<endl;
for(i=0;i<N;++i){
cin>>temp.ID>>temp.name;
for(j=0;j<M;++j){
cin>>score;
temp.subject.push_back(score);
}
Stu.push_back(temp);
/*------------------------------这一行很重要------------------------------*/
/*------------------------------这一行很重要------------------------------*/
vector<double>().swap(temp.subject);
/*------------------------------这一行很重要------------------------------*/
/*------------------------------这一行很重要------------------------------*/
}
cout<<endl<<"成绩录入成功!"<<endl;
}
/*---------------------------------------------b.成绩显示---------------------------------------------*/
void ShowScore(){
cout<<"学号\t\t"<<"姓名\t\t";
for(i=0;i<M;++i)
cout<<"课程"<<i+1<<"\t";
cout<<endl;
for(i=0;i<N;++i){
cout<<Stu[i].ID<<"\t"<<Stu[i].name<<"\t";
for(int j=0;j<M;++j)
cout<<Stu[i].subject[j]<<"\t";
cout<<endl;
}
}
/*---------------------------------------------c.成绩保存---------------------------------------------*/
void SaveScore(){
FILE *fp;
if((fp=fopen("stu.dat","wb"))==NULL){
cout<<"文件打开错误";
return;
}
for(i=0;i<N;++i){
if(fwrite(&Stu[i],sizeof(Student),1,fp)!=1)
cout<<"写入错误!"<<endl;
}
fclose(fp);
cout<<"成绩保存成功!"<<endl;
}
/*---------------------------------------------d.成绩排序---------------------------------------------*/
void SortScore(){
for(i=0;i<N;++i){
/*计算每个人的总成绩*/
Stu[i].sum=0;
for(j=0;j<M;++j)
Stu[i].sum+=Stu[i].subject[j];
}
sort(Stu.begin(),Stu.end(),Rule()); /*使用排序函数排序*/
cout<<"成绩排序成功!"<<endl;
}
/*---------------------------------------------e.成绩修改---------------------------------------------*/
void ModifyScore(){
string password;
int id,no;
cout<<"请输入密码开启成绩修改权限:";
cin>>password;
/*------------------------------密码输入错误------------------------------*/
while(password!="GUXUNMEI"){
cout<<endl<<"密码错误,请重新输入,若输入Q则中止进入成绩修改功能:";
cin>>password;
if(password=="Q")
return;
}
/*------------------------------密码输入正确------------------------------*/
cout<<endl<<"成功进入成绩修改功能,若学号输入-1则退出成绩修改功能!"<<endl;
while(1){
cout<<endl<<"请输入需要修改成绩的学生的学号,第几门课程以及修改后的分数:";
cin>>id;
if(id==-1){
cout<<endl<<"已成功退出成绩修改功能!"<<endl;
return;
}
cin>>no>>score;
if(no>M){
/*课程不存在*/
cout<<endl<<"不存在此课程!"<<endl;
continue;
}
for(i=0;i<N;++i){
if(Stu[i].ID==id){
Stu[i].subject[no-1]=score;
break;
}
}
if(i==N){
/*学生不存在*/
cout<<endl<<"不存在此学生!"<<endl;
continue;
}
cout<<endl<<"修改成功!"<<endl;
}
}
/*---------------------------------------------f.成绩统计---------------------------------------------*/
void CountScore(){
int maxn[M],count[M];
double k,average[M];
memset(maxn,0,sizeof(maxn));
/*--------------------显示每门课程成绩最高的学生的基本信息--------------------*/
for(i=0;i<N;++i){
for(j=0;j<M;++j){
if(Stu[i].subject[j]>Stu[i].subject[maxn[j]])
maxn[j]=i;
}
}
for(i=0;i<M;++i){
cout<<"课程"<<i+1<<"成绩最高分学生信息:"<<Stu[i].ID<<"\t"<<Stu[i].name<<"\t";
for(j=0;j<M;++j)
cout<<Stu[i].subject[j]<<"\t";
cout<<endl;
}
cout<<endl;
/*---------------------------显示每门课程的平均成绩---------------------------*/
for(j=0;j<M;++j){
k=0;
for(i=0;i<N;++i)
k+=Stu[i].subject[j];
average[j]=k/N;
cout<<"课程"<<j+1<<"的平均成绩为:"<<average[j]<<endl;
}
cout<<endl;
/*---------------------显示超过某门课程平均成绩的学生人数---------------------*/
for(j=0;j<M;++j){
count[j]=0;
for(i=0;i<N;++i){
if(Stu[i].subject[j]>average[j])
++count[j];
}
cout<<"超过课程"<<j+1<<"平均成绩的学生人数为:"<<count[j]<<endl;
}
}
/*---------------------------------------------g.退出系统---------------------------------------------*/
void ExitSystem(){
condition=false; /*全局变量condition控制程序运行*/
cout<<"已退出班级成绩管理系统"<<endl;
}
int main()
{
while(condition){
/*-----------------------------------系统菜单-----------------------------------*/
cout<<" "<<endl;
cout<<"-------------------------系统菜单-------------------------"<<endl;
cout<<" "<<endl;
cout<<" 请选择系统功能项: "<<endl;
cout<<" a.成绩录入 "<<endl;
cout<<" b.成绩显示 "<<endl;
cout<<" c.成绩保存 "<<endl;
cout<<" d.成绩排序 "<<endl;
cout<<" e.成绩修改 "<<endl;
cout<<" f.成绩统计 "<<endl;
cout<<" g.退出系统 "<<endl;
cout<<" "<<endl;
cout<<"----------------------------------------------------------"<<endl;
cout<<" "<<endl;
/*-----------------------------------选择系统功能项-----------------------------------*/
cout<<"请输入选项:";
cin>>choice;
cout<<endl;
switch(choice){
case 'a':InsertScore(); break;
case 'b':ShowScore(); break;
case 'c':SaveScore(); break;
case 'd':SortScore(); break;
case 'e':ModifyScore(); break;
case 'f':CountScore(); break;
case 'g':ExitSystem(); break;
default:cout<<"不存在此项功能!"<<endl;
}
}
return 0;
}