C語言課程設計——班級成績管理系統
題目:
對一個有N個學生的班級,每個學生有M門課程。該系統實現對班級成績的錄入、顯示、修改、排序、保存等操作的管理。功能要求:
(1)本系統採用一個結構體數組,每個數據的結構應當包括:學號、姓名、M門課程名稱。
(2)本系統顯示這樣的菜單:
請選擇系統功能項:
a、成績錄入
b、成績顯示
c、成績保存
d、成績排序
e、成績修改(要求先輸入密碼)
f、成績統計
1)顯示每門課程成績最高的學生的基本信息
2)顯示每門課程的平均成績
3)顯示超過某門課程平均成績的學生人數
g、退出系統
1)執行一個具體的功能之後,程序將重新顯示菜單。
2)將學生成績保存到文件中。
代碼:
#include<vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
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;
}