C語言實現班級成績管理系統
阿新 • • 發佈:2020-07-25
C語言課程設計——班級成績管理系統
題目:
對一個有N個學生的班級,每個學生有M門課程。該系統實現對班級成績的錄入、顯示、修改、排序、儲存等操作的管理。功能
要求:
(1)本系統採用一個結構體陣列,每個資料的結構應當包括:學號、姓名、M門課程名稱。
(2)本系統顯示這樣的選單:
請選擇系統功能項:
a、成績錄入
b、成績顯示
c、成績儲存
d、成績排序
e、成績修改(要求先輸入密碼)
f、成績統計
1)顯示每門課程成績最高的學生的基本資訊
2)顯示每門課程的平均成績
3)顯示超過某門課程平均成績的學生人數
g、退出系統
1)執行一個具體的功能之後,程式將重新顯示選單。
程式碼:
#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,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; }