C++實現(xiàn)學(xué)生成績管理系統(tǒng)
終于結(jié)束了期末考試,有時間將這學(xué)期C++作業(yè)整理一下,都是一些基礎(chǔ)的內(nèi)容,寫出來希望給一些初學(xué)者一些參考。主要使用到C++的面對對象編程思想,對學(xué)生信息類及鏈表類進行封裝
文章可能有點長,可以只參考需要的部分
題目要求
用C++及類和對象來進行抽象、封裝與實現(xiàn),用作課內(nèi)的第四次作業(yè)。注意學(xué)生的成績需要用鏈表來實現(xiàn),并且鏈表也需要實現(xiàn)封裝。
成績管理系統(tǒng)
信息描述:
現(xiàn)有學(xué)生成績信息,內(nèi)容如下
姓名 學(xué)號 語文 數(shù)學(xué) 英語
張明明 01 67 78 82
李成友 02 78 91 88
張輝燦 03 68 82 56
王露 04 56 45 77
陳東明 05 67 38 47
… … … … …
請用C++編寫一系統(tǒng),實現(xiàn)學(xué)生信息管理,包含以下功能:
(1)信息維護
要求:學(xué)生信息數(shù)據(jù)要以文件的形式保存,能實現(xiàn)學(xué)生信息數(shù)據(jù)的維護。此模塊包括子模塊有:增加學(xué)生信息、刪除學(xué)生信息、修改學(xué)生信息 。所有的學(xué)生數(shù)據(jù)需要存放于文件中;能夠從文件中讀入數(shù)據(jù),并在程序中以鏈表的形式予以實現(xiàn)。
(2)信息查詢
要求:查詢時可實現(xiàn)按姓名查詢、按學(xué)號查詢
(3)成績統(tǒng)計
要求:
輸入任意的一個課程名(如數(shù)學(xué))給出該門課程的成績的分段統(tǒng)計(以10分為一個成績段,如90-100,80-89,70-79,60-69,小于60),給出在此分數(shù)段的學(xué)生數(shù)目。
根據(jù)指定的課程名求該門課所有學(xué)生的平均成績
給出每個學(xué)生的平均成績
排序:能對用戶指定的任意課程名,按成績升序或降序排列學(xué)生數(shù)據(jù)并顯示排序結(jié)果
至少采用文本菜單界面
整體分析
此系統(tǒng)為學(xué)生成績管理系統(tǒng),根據(jù)題目要求,它需要包含:信息維護、信息查詢、成績統(tǒng)計、排序、文本界面菜單五個模塊。
為實現(xiàn)這些功能,該程序包含兩個類:
1、Student類:包含一個學(xué)生的所有信息,以及學(xué)生信息的設(shè)置和獲取函數(shù)
2、List類:包含對學(xué)生信息鏈表的所有操作
實現(xiàn)該系統(tǒng)共使用到7個文件:
1、 menu.cpp:內(nèi)含多個創(chuàng)建菜單函數(shù),用于實現(xiàn)不同模塊的功能顯示
2、 student.h:包含用于保存學(xué)生信息的Student類
3、 student.cpp:包含Student類的成員函數(shù)的實現(xiàn)
4、 list.h:包含用于操作學(xué)生信息的的List類
5、 list.cpp:包含List類的成員函數(shù)的實現(xiàn)
6、 main.cpp:調(diào)用所有的函數(shù),并進行適當(dāng)?shù)慕M合實現(xiàn)完整的學(xué)生成績管理系統(tǒng)
7、 student.txt:包含學(xué)生的全部信息
程序源碼
menu.cpp
//全部的菜單函數(shù) #include<iostream> using namespace std; //主界面 void menu() { cout<<"\n\n\t\t----------------學(xué)生成績管理系統(tǒng)------------------"<<endl<<endl; cout<<"\t\t1、信息維護功能"<<" "<<"\t2、信息查詢功能"<<endl<<endl; cout<<"\t\t3、成績統(tǒng)計功能"<<" "<<"\t4、排序功能"<<endl<<endl; cout<<"\t\t5、退出"<<endl<<endl; return; } //信息維護功能界面 void menu1() { cout<<"\n\n\t\t信息維護功能"<<endl<<endl; cout<<"\t\t1、增加學(xué)生信息"<<endl<<endl; cout<<"\t\t2、刪除學(xué)生信息"<<endl<<endl; cout<<"\t\t3、修改學(xué)生信息"<<endl<<endl; cout<<"\t\t4、返回"<<endl<<endl; return; } //信息查詢功能界面 void menu2() { cout<<"\n\n\t\t信息查詢功能"<<endl<<endl; cout<<"\t\t1、按姓名查詢"<<endl<<endl; cout<<"\t\t2、按學(xué)號查詢"<<endl<<endl; cout<<"\t\t3、返回"<<endl<<endl; return; } //成績統(tǒng)計功能界面 void menu3() { cout<<"\n\n\t\t成績統(tǒng)計功能"<<endl<<endl; cout<<"\t\t1、根據(jù)課程名對成績進行分段統(tǒng)計"<<endl<<endl; cout<<"\t\t2、各科目的平均成績"<<endl<<endl; cout<<"\t\t3、返回"<<endl<<endl; return; } //排序功能界面 void menu4() { cout<<"\n\n\t\t排序功能"<<endl<<endl; cout<<"\t\t1、降序"<<endl<<endl; cout<<"\t\t2、升序"<<endl<<endl; cout<<"\t\t3、返回"<<endl<<endl; return; }
main.cpp
//主函數(shù),采用switch結(jié)構(gòu)的多層嵌套 #include<iostream> #include<stdio.h> #include<stdlib.h> #include"student.h" #include"list.h" void menu(); void menu1(); void menu2(); void menu3(); void menu4(); using namespace std; int main(void) { int choice,choice1,choice2,choice3,choice4; List pHead; string subj; pHead.input_info(); while(1) { menu(); cout<<"請選擇你要進行的操作:"; cin>>choice; switch(choice) { //信息維護功能 case 1: while(1) { pHead.input_info(); system("cls"); menu1(); cout<<"請選擇你要進行的操作:"; cin>>choice1; switch(choice1) { //增加學(xué)生信息 case 1: pHead.output_info();//遍歷鏈表,并打印學(xué)生的信息 pHead.add_info();//增加學(xué)生信息 system("cls"); cout<<"\n\n\n\t\t學(xué)生成績信息表(更新)"<<endl; pHead.output_info();//遍歷鏈表,并打印學(xué)生的信息 pHead.save_list();//將改動保存到文件中 cout<<"\n改動已保存到文件中"<<endl<<endl; system("pause"); break; //刪除學(xué)生信息 case 2: pHead.output_info();//遍歷鏈表,并打印學(xué)生的信息 pHead.delete_info();//刪除學(xué)生信息 system("cls"); cout<<"\n\n\n\t\t學(xué)生成績信息表(更新)"<<endl; pHead.output_info();//遍歷鏈表,并打印學(xué)生的信息 pHead.save_list();//將改動保存到文件中 cout<<"\n改動已保存到文件中"<<endl<<endl; system("pause"); break; //修改學(xué)生信息 case 3: pHead.output_info();//遍歷鏈表,并打印學(xué)生的信息 pHead.modify_info();//修改學(xué)生信息 system("cls"); cout<<"\n\n\n\t\t學(xué)生成績信息表(更新)"<<endl; pHead.output_info();//遍歷鏈表,并打印學(xué)生的信息 pHead.save_list();//將改動保存到鏈表中 cout<<"\n改動已保存到文件中"<<endl<<endl; system("pause"); break; default: system("cls"); break; } if(choice1!=1&&choice1!=2&&choice1!=3) break; } break; //信息查詢功能 case 2: while(1) { system("cls"); menu2(); cout<<"請選擇你要進行的操作:"; cin>>choice2; switch(choice2) { //按姓名進行查詢 case 1: pHead.search_by_name(); system("pause"); break; //按學(xué)號進行查詢 case 2: pHead.search_by_ID(); system("pause"); //system("cls"); break; default: system("cls"); break; } if(choice2!=1&&choice2!=2) break; //break; } break; //成績統(tǒng)計功能 case 3: while(1) { system("cls"); menu3(); cout<<"請選擇你要進行的操作:"; cin>>choice3; switch(choice3) { //根據(jù)課程名給出成績的分段統(tǒng)計 case 1: cout<<"輸入課程名稱:"; cin>>subj; if(subj=="數(shù)學(xué)") pHead.separate_by_math(); else if(subj=="英語") pHead.separate_by_english(); else if(subj=="C++") pHead.separate_by_cpp(); else cout<<"沒有該科目!"<<endl; system("pause"); break; //計算各科目的平均成績 case 2: pHead.count_subject_avg();//計算各學(xué)科的平均成績 system("pause"); break; default: system("cls"); break; } if(choice3!=1&&choice3!=2) break; } break; //排序功能 case 4: while(1) { system("cls"); menu4(); cout<<"請選擇你要進行的操作:"; cin>>choice4; switch(choice4) { //升序排列 case 1: cout<<"請輸入科目名稱:"; cin>>subj; cout<<endl; if(subj=="數(shù)學(xué)") { cout<<"\t\t數(shù)學(xué)成績降序排列表"<<endl<<endl; pHead.sortMath(); } else if(subj=="英語") { cout<<"\t\t英語成績降序排列表"<<endl<<endl; pHead.sortEnglish(); } else if(subj=="C++") { cout<<"\t\tC++成績降序排列表"<<endl<<endl; pHead.sortCpp(); } else cout<<"沒有該科目!"<<endl; pHead.output_info(); cout<<endl; system("pause"); break; case 2: cout<<"請輸入科目名稱:"; cin>>subj; cout<<endl; if(subj=="數(shù)學(xué)") { cout<<"\t\t數(shù)學(xué)成績升序排列表"<<endl<<endl; pHead.sortMath_s(); } else if(subj=="英語") { cout<<"\t\t英語成績升序排列表"<<endl<<endl; pHead.sortEnglish_s(); } else if(subj=="C++") { cout<<"\t\tC++成績升序排列表"<<endl<<endl; pHead.sortCpp_s(); } else cout<<"沒有該科目!"<<endl; pHead.output_info(); cout<<endl; system("pause"); break; default: system("cls"); break; } if(choice4!=1&&choice4!=2) break; } break; default: return 0; } } pHead.delete_list(); return 0; }
student.h
#ifndef __STUDENT_H__ #define __STUDENT_H__ #include<iostream> #include<string> #include<sstream> using namespace std; class Student { public: Student(); //~Student(); public: void set_stuID(string ID);//設(shè)置學(xué)號 void set_name(string na);//設(shè)置姓名 void set_scores(double en,double m,double cp);//設(shè)置學(xué)生的各科成績 void set_num(int n);//設(shè)置學(xué)生編號 void count_avg();//計算平均成績 void count_total();//計算總成績 void get_scores(double *en,double *m,double *cp,double *sum,double *avg);//得到學(xué)生的各科成績(大英、高數(shù)、C++、總分、平均分) string get_stuID();//得到學(xué)生的學(xué)號 string get_name();//得到學(xué)生的姓名 int get_num();//得到學(xué)生的編號 private: string stuID;//學(xué)號 string name;//姓名 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總分 double average;//平均成績 int num;//學(xué)生編號 }; #endif
student.cpp
#include"student.h" #include<iostream> #include<string> #include<sstream> Student::Student() { stuID="00"; } //設(shè)置學(xué)號 void Student::set_stuID(string ID) { stuID=ID; } //設(shè)置姓名 void Student::set_name(string na) { name=na; } //設(shè)置學(xué)生的各科成績 void Student::set_scores(double en,double m,double cp) { english=en; math=m; cpp=cp; } //設(shè)置學(xué)生編號 void Student::set_num(int n) { num=n; } //計算平均成績 void Student::count_avg() { average=(english+math+cpp)/3; } //計算總成績 void Student::count_total() { total=english+math+cpp; } //得到學(xué)生的各類成績(大英、高數(shù)、C++、總分、平均分) void Student::get_scores(double *en,double *m,double *cp,double *sum,double *avg) { *en=english; *m=math; *cp=cpp; *sum=total; *avg=average; } //得到學(xué)生的學(xué)號 string Student::get_stuID() { return stuID; } //得到學(xué)生的姓名 string Student::get_name() { return name; } //得到學(xué)生的編號 int Student::get_num() { return num; }
list.h
#ifndef __LIST_H__ #define __LIST_H__ #include<iostream> #include"student.h" class List { public: List(){};//構(gòu)造函數(shù) ~List();//析構(gòu)函數(shù) public: //學(xué)生信息讀取相關(guān)函數(shù) void input_info();//創(chuàng)建鏈表,并從文件讀取學(xué)生的信息保存到鏈表中 void output_info();//遍歷鏈表,并打印學(xué)生的信息 //學(xué)生信息查詢相關(guān)函數(shù) void search_by_name();//通過姓名查找學(xué)生 void search_by_ID();//通過學(xué)號查找學(xué)生 //排序功能函數(shù) void sortEnglish();//根據(jù)英語成績對學(xué)生進行降序排名 void sortMath();//根據(jù)數(shù)學(xué)成績對學(xué)生進行降序排名 void sortCpp();//根據(jù)C++成績對學(xué)生進行降序排名 void sortEnglish_s();//根據(jù)英語成績對學(xué)生進行升序排名 void sortMath_s();//根據(jù)數(shù)學(xué)成績對學(xué)生進行升序排名 void sortCpp_s();//根據(jù)C++成績對學(xué)生進行升序排名 void sortTotal();//根據(jù)總成績對學(xué)生進行降序排序 //成績統(tǒng)計功能相關(guān)函數(shù) void separate_by_english();//根據(jù)英語成績進行分段統(tǒng)計 void separate_by_math();//根據(jù)數(shù)學(xué)成績進行分段統(tǒng)計 void separate_by_cpp();//根據(jù)C++成績進行分段統(tǒng)計 void count_subject_avg();//計算各學(xué)科的平均成績 //學(xué)生信息維護功能函數(shù) void modify_info();//修改學(xué)生信息 void delete_info();//刪除學(xué)生信息 void add_info();//增加學(xué)生信息 public: void save_list();//將列表保存至文件中 void delete_list();//銷毀鏈表,釋放內(nèi)存空間 private: Student stu;//學(xué)生數(shù)據(jù)體 List *pHead;//頭指針 List *pNext;//指向下一組學(xué)生信息的指針 }; #endif
list.cpp
#include<iostream> #include<fstream> #include<stdio.h> #include<cstdlib> #include<cstring> #include<iomanip> #include"list.h" using namespace std; List::~List() { pHead=NULL; pNext=NULL; } //從文件導(dǎo)入學(xué)生信息,并保存在鏈表中 void List::input_info() { List *current=NULL; List *previous=NULL; pHead=NULL; string name;//姓名 string stuID;//學(xué)號 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 int n=0;//用于統(tǒng)計學(xué)生的數(shù)量,同時設(shè)置編號 ifstream fin; fin.open("student.txt",ios::in); if(!fin) { cout<<"Fail to open the file!"<<endl; exit(0); } //創(chuàng)建鏈表,并保存數(shù)據(jù) while(1) { if(!(fin>>name>>stuID>>english>>math>>cpp))//從文件中讀取數(shù)據(jù) break; ++n;//編號遞增 //cout<<name<<' '<<stuID<<' '<<english<<' '<<math<<' '<<cpp<<endl; current=new List;//創(chuàng)建結(jié)點 if(pHead==NULL) pHead=current;//保存頭指針 if(previous!=NULL) previous->pNext=current;//將前一個結(jié)點的pNext指向當(dāng)前結(jié)點 //將文件中的一組數(shù)據(jù)保存在當(dāng)前結(jié)點 current->stu.set_name(name);//保存學(xué)生的姓名 current->stu.set_stuID(stuID);//保存學(xué)生的學(xué)號 current->stu.set_scores(english,math,cpp);//保存英語、數(shù)學(xué)、C++成績 current->stu.count_avg();//計算平均成績,并保存 current->stu.count_total();//計算總分 current->stu.set_num(n); current->pNext=NULL; previous=current; } //關(guān)閉文件 fin.close(); //cout<<"已成功從文件導(dǎo)入"<<n<<"個學(xué)生的信息"<<endl; } //遍歷鏈表,打印學(xué)生信息 void List::output_info() { string name;//姓名 string stuID;//學(xué)號 int num; double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 int n=0;//設(shè)置編號 cout<<"\n編號\t"<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<"總分\t"<<"平均分\t"<<endl; List *p=pHead; while(p!=NULL) { ++n; p->stu.set_num(n);//重新設(shè)置編號 name=p->stu.get_name(); stuID=p->stu.get_stuID(); num=p->stu.get_num(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<fixed<<setprecision(2)<<num<<'\t'<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl; p=p->pNext;//設(shè)置指針指向下一個結(jié)點 } cout<<endl; } //根據(jù)姓名來查找學(xué)生信息 void List::search_by_name() { string name;//姓名 string stuID;//學(xué)號 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 int flag=0;//用來標(biāo)記是否找到對應(yīng)的學(xué)生 List *p=pHead; string na; cout<<"請輸入你要查詢的學(xué)生的姓名:"; cin>>na; while(p!=NULL) { name=p->stu.get_name(); if(name==na) { flag++; stuID=p->stu.get_stuID(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"\n該學(xué)生的信息如下:"<<endl<<endl; cout<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<"總分\t"<<"平均分\t"<<endl; cout<<fixed<<setprecision(2)<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl; break; } p=p->pNext;//設(shè)置指針指向下一個結(jié)點 } if(flag==0) cout<<"沒有找到該學(xué)生!"<<endl; } //根據(jù)學(xué)號來查找學(xué)生 void List::search_by_ID() { string name;//姓名 string stuID;//學(xué)號 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 int flag=0;//用來標(biāo)記是否找到對應(yīng)的學(xué)生 List *p=pHead; string ID; cout<<"請輸入你要查詢的學(xué)生的學(xué)號:"; cin>>ID; while(p!=NULL) { stuID=p->stu.get_stuID(); if(stuID==ID) { flag++; name=p->stu.get_name(); cout<<"\n該學(xué)生的信息如下:"<<endl<<endl; p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<"總分\t"<<"平均分\t"<<endl; cout<<fixed<<setprecision(2)<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl; break; } p=p->pNext;//設(shè)置指針指向下一個結(jié)點 } if(flag==0) cout<<"沒有找到該學(xué)生!"<<endl; } //根據(jù)C++成績對學(xué)生進行降序排名 void List::sortCpp() { double english;//英語成績 double math;//數(shù)學(xué)成績 double total;//總成績 double average;//平均成績 //C++成績 double cpp1; double cpp2; List *p; List *q; List temp;//臨時的對象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math,&cpp1,&total,&average); q->stu.get_scores(&english,&math,&cpp2,&total,&average); if(cpp1<cpp2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根據(jù)數(shù)學(xué)成績對學(xué)生進行降序排名 void List::sortMath() { double english;//英語成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 //數(shù)學(xué)成績 double math1; double math2; List *p; List *q; List temp;//臨時的對象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math1,&cpp,&total,&average); q->stu.get_scores(&english,&math2,&cpp,&total,&average); if(math1<math2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根據(jù)英語成績對學(xué)生進行降序排名 void List::sortEnglish() { double cpp;//C++成績 double math;//數(shù)學(xué)成績 double total;//總成績 double average;//平均成績 //英語成績 double english1; double english2; List *p; List *q; List temp;//臨時的對象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english1,&math,&cpp,&total,&average); q->stu.get_scores(&english2,&math,&cpp,&total,&average); if(english1<english2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根據(jù)英語成績對學(xué)生進行升序排名 void List::sortEnglish_s() { double cpp;//C++成績 double math;//數(shù)學(xué)成績 double total;//總成績 double average;//平均成績 //英語成績 double english1; double english2; List *p; List *q; List temp;//臨時的對象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english1,&math,&cpp,&total,&average); q->stu.get_scores(&english2,&math,&cpp,&total,&average); if(english1>english2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根據(jù)數(shù)學(xué)成績對學(xué)生進行升序排名 void List::sortMath_s() { double english;//英語成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 //數(shù)學(xué)成績 double math1; double math2; List *p; List *q; List temp;//臨時的對象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math1,&cpp,&total,&average); q->stu.get_scores(&english,&math2,&cpp,&total,&average); if(math1>math2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根據(jù)C++成績對學(xué)生進行升序排名 void List::sortCpp_s() { double english;//英語成績 double math;//數(shù)學(xué)成績 double total;//總成績 double average;//平均成績 //C++成績 double cpp1; double cpp2; List *p; List *q; List temp;//臨時的對象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math,&cpp1,&total,&average); q->stu.get_scores(&english,&math,&cpp2,&total,&average); if(cpp1>cpp2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根據(jù)總成績對學(xué)生進行降序排名 void List::sortTotal() { double english;//英語成績 double cpp;//C++成績 double math;//數(shù)學(xué)成績 double average;//平均成績 //總成績 double sum1; double sum2; List *p; List *q; List temp;//臨時的對象 for(p=pHead;p->pNext!=NULL;p=p->pNext) for(q=p->pNext;q!=NULL;q=q->pNext) { p->stu.get_scores(&english,&math,&cpp,&sum1,&average); q->stu.get_scores(&english,&math,&cpp,&sum2,&average); if(sum1<sum2) { temp.stu=q->stu; q->stu=p->stu; p->stu=temp.stu; } } } //根據(jù)英語成績進行分段統(tǒng)計 void List::separate_by_english() { //sortEnglish();//調(diào)用根據(jù)英語成績排序函數(shù) string name;//姓名 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 int t1=0,t2=0,t3=0,t4=0,t5=0;//用于統(tǒng)計各分數(shù)段的人數(shù) List *p=pHead; while(p!=NULL) { p->stu.get_scores(&english,&math,&cpp,&total,&average); if(english>=90&&english<=100) ++t1; else if(english>=80&&english<=89) ++t2; else if(english>=70&&english<=79) ++t3; else if(english>=60&&english<=69) ++t4; else ++t5; p=p->pNext; } cout<<"\n\t\t\t英語成績分段統(tǒng)計表"<<endl<<endl; cout<<"\t\t分數(shù)段\t"<<"100-90\t"<<"89-80\t"<<"79-70\t"<<"69-60\t"<<"59-0\t"<<endl<<endl; cout<<"\t\t人數(shù)\t"<<t1<<'\t'<<t2<<'\t'<<t3<<'\t'<<t4<<'\t'<<t5<<endl<<endl; } //根據(jù)數(shù)學(xué)成績進行分段統(tǒng)計 void List::separate_by_math() { //sortEnglish();//調(diào)用根據(jù)英語成績排序函數(shù) string name;//姓名 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 int t1=0,t2=0,t3=0,t4=0,t5=0;//用于統(tǒng)計各分數(shù)段的人數(shù) List *p=pHead; while(p!=NULL) { p->stu.get_scores(&english,&math,&cpp,&total,&average); if(math>=90&&math<=100) ++t1; else if(math>=80&&math<=89) ++t2; else if(math>=70&&math<=79) ++t3; else if(math>=60&&math<=69) ++t4; else ++t5; p=p->pNext; } cout<<"\n\t\t\t數(shù)學(xué)成績分段統(tǒng)計表"<<endl<<endl; cout<<"\t\t分數(shù)段\t"<<"100-90\t"<<"89-80\t"<<"79-70\t"<<"69-60\t"<<"59-0\t"<<endl<<endl; cout<<"\t\t人數(shù)\t"<<t1<<'\t'<<t2<<'\t'<<t3<<'\t'<<t4<<'\t'<<t5<<endl<<endl; } //根據(jù)C++成績進行分段統(tǒng)計 void List::separate_by_cpp() { //sortEnglish();//調(diào)用根據(jù)英語成績排序函數(shù) string name;//姓名 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 int t1=0,t2=0,t3=0,t4=0,t5=0;//用于統(tǒng)計各分數(shù)段的人數(shù) List *p=pHead; while(p!=NULL) { p->stu.get_scores(&english,&math,&cpp,&total,&average); if(cpp>=90&&cpp<=100) ++t1; else if(cpp>=80&&cpp<=89) ++t2; else if(cpp>=70&&cpp<=79) ++t3; else if(cpp>=60&&cpp<=69) ++t4; else ++t5; p=p->pNext; } cout<<"\n\t\t\tC++成績分段統(tǒng)計表"<<endl<<endl; cout<<"\t\t分數(shù)段\t"<<"100-90\t"<<"89-80\t"<<"79-70\t"<<"69-60\t"<<"59-0\t"<<endl<<endl; cout<<"\t\t人數(shù)\t"<<t1<<'\t'<<t2<<'\t'<<t3<<'\t'<<t4<<'\t'<<t5<<endl<<endl; } //計算各學(xué)科的平均成績 void List::count_subject_avg() { double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 double english_avg;//英語平均成績 double math_avg;//數(shù)學(xué)平均成績 double cpp_avg;//C++平均成績 int n=0;//用于記錄學(xué)生人數(shù) double Esum=0,Msum=0,Csum=0;//用于計算各科目總分 List *p=pHead; while(p!=NULL) { p->stu.get_scores(&english,&math,&cpp,&total,&average); Esum+=english; Msum+=math; Csum+=cpp; ++n; p=p->pNext; } english_avg=Esum/n; math_avg=Msum/n; cpp_avg=Csum/n; cout<<"各科目的平均成績?nèi)缦?<<endl; cout<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<endl; cout<<english_avg<<'\t'<<math_avg<<'\t'<<cpp_avg<<endl; } //修改學(xué)生的信息 void List::modify_info() { string name;//姓名 string stuID;//學(xué)號 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 List *p=pHead; char content[20]; cout<<"請輸入信息待修改學(xué)生的姓名或?qū)W號:"; cin>>content; //根據(jù)輸入來進行查找并修改 if(content[0]>='0'&&content[0]<='9') { int flag=0;//標(biāo)記是否找到對應(yīng)學(xué)生; string ID=content; while(p!=NULL) { stuID=p->stu.get_stuID(); if(stuID==ID) { flag++; name=p->stu.get_name(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"\n姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<"總分\t"<<"平均分\t"<<endl; cout<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl<<endl; cout<<"請輸入修改后的信息"<<endl; cout<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<endl; cin>>name>>stuID>>english>>math>>cpp; p->stu.set_name(name);//重新設(shè)置姓名 p->stu.set_stuID(stuID);//重新設(shè)置學(xué)號 p->stu.set_scores(english,math,cpp);//重新設(shè)置各科成績 p->stu.count_total();//重新計算總成績 p->stu.count_avg();//重新計算平均成績 break; } p=p->pNext;//設(shè)置指針指向下一個結(jié)點 } if(flag==0) cout<<"沒有找到該學(xué)生!"<<endl; } else { int flag=0;//標(biāo)記是否找到對應(yīng)學(xué)生; string na=content;//將字符串?dāng)?shù)組轉(zhuǎn)化成string類型 while(p!=NULL) { name=p->stu.get_name(); if(name==na) { flag++; stuID=p->stu.get_stuID(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<"總分\t"<<"平均分\t"<<endl; cout<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl<<endl; cout<<"請輸入修改后的信息"<<endl; cout<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<endl; cin>>name>>stuID>>english>>math>>cpp; p->stu.set_name(name);//重新設(shè)置姓名 p->stu.set_stuID(stuID);//重新設(shè)置學(xué)號 p->stu.set_scores(english,math,cpp);//重新設(shè)置各科成績 p->stu.count_total();//重新計算總成績 p->stu.count_avg();//重新計算平均成績 break; } p=p->pNext;//設(shè)置指針指向下一個結(jié)點 } if(flag==0) cout<<"沒有找到該學(xué)生!"<<endl; } } //刪除學(xué)生信息 void List::delete_info() { string name;//姓名 string stuID;//學(xué)號 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 //int n=0;//記錄已遍歷的學(xué)生的人數(shù) List *p=pHead;//指向當(dāng)前結(jié)點的指針 List *pf=NULL;//指向前一個結(jié)點的指針 char content[20]; cout<<"請輸入信息待刪除學(xué)生的姓名或?qū)W號:"; cin>>content; //根據(jù)輸入來進行查找并刪除 if(content[0]>='0'&&content[0]<='9') { int flag=0;//標(biāo)記是否找到對應(yīng)學(xué)生; string ID=content; char answer;//記錄回答的內(nèi)容 while(p!=NULL) { //++n; stuID=p->stu.get_stuID(); if(stuID==ID) { flag++; name=p->stu.get_name(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<"總分\t"<<"平均分\t"<<endl; cout<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl<<endl; cout<<"你確定要刪除這組信息嗎?(Y/N)"; cin>>answer; if(tolower(answer)=='y') { if(pf==NULL) { List *temp=p;//暫時保存指向該結(jié)點的指針 pHead=p->pNext;//跳過當(dāng)前結(jié)點,實現(xiàn)信息的刪除 delete temp;//將其所占內(nèi)存刪除 } else { List *temp=p;//暫時保存指向該結(jié)點的指針 pf->pNext=p->pNext;//跳過當(dāng)前結(jié)點,實現(xiàn)信息的刪除 delete temp;//將其所占內(nèi)存刪除 } cout<<"\t該組信息已刪除!"<<endl; break; } else { break; } } pf=p;//保存當(dāng)前指針 p=p->pNext;//設(shè)置指針指向下一個結(jié)點 } if(flag==0) cout<<"沒有找到該學(xué)生!"<<endl; } else { int flag=0;//標(biāo)記是否找到對應(yīng)學(xué)生; string na=content;//將字符串?dāng)?shù)組轉(zhuǎn)化成string類型 char answer;//記錄回答的內(nèi)容 while(p!=NULL) { //++n; name=p->stu.get_name(); if(name==na) { flag++; stuID=p->stu.get_stuID(); p->stu.get_scores(&english,&math,&cpp,&total,&average); cout<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<"總分\t"<<"平均分\t"<<endl; cout<<name<<'\t'<<stuID<<'\t'<<english<<'\t'<<math<<'\t'<<cpp<<'\t'<<total<<'\t'<<average<<endl<<endl; cout<<"你確定要刪除這組信息嗎?(Y/N)"; cin>>answer; if(tolower(answer)=='y') { if(pf==NULL) { List *temp=p;//暫時保存指向該結(jié)點的指針 pHead=p->pNext;//跳過當(dāng)前結(jié)點,實現(xiàn)信息的刪除 delete temp;//將其所占內(nèi)存刪除 } else { List *temp=p;//暫時保存指向該結(jié)點的指針 pf->pNext=p->pNext;//跳過當(dāng)前結(jié)點,實現(xiàn)信息的刪除 delete temp;//將其所占內(nèi)存刪除 } cout<<"\t該組信息已刪除!"<<endl; break; } else { break; } } pf=p;//保存當(dāng)前指針 p=p->pNext;//設(shè)置指針指向下一個結(jié)點 } if(flag==0) cout<<"沒有找到該學(xué)生!"<<endl; } } //增加學(xué)生信息 void List::add_info() { string name;//姓名 string stuID;//學(xué)號 int num;//編號 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 int location=0;//位置編號 int flag=0;//標(biāo)記是否有對應(yīng)的編號 List *p=pHead;//指向當(dāng)前結(jié)點的指針 List *pf=NULL;//指向前一個結(jié)點的指針 cout<<"請輸入你想增加的信息的位置(位置編號,大于0):"; cin>>location; while(p!=NULL)//遍歷鏈表 { num=p->stu.get_num(); if(num==location) { ++flag; cout<<"請輸入新增學(xué)生的信息"<<endl; cout<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<endl; cin>>name>>stuID>>english>>math>>cpp; List *new_node=new List;//創(chuàng)建一個新的結(jié)點 new_node->stu.set_name(name); new_node->stu.set_stuID(stuID); new_node->stu.set_scores(english,math,cpp); new_node->stu.count_total();//計算總成績 new_node->stu.count_avg();//計算平均成績 if(pf==NULL) { new_node->pNext=p; pHead=new_node; break; } else { new_node->pNext=p; pf->pNext=new_node; break; } } pf=p; p=p->pNext; } if(flag==0) { cout<<"請輸入新增學(xué)生的信息"<<endl; cout<<"姓名\t"<<"學(xué)號\t"<<"英語\t"<<"數(shù)學(xué)\t"<<"C++\t"<<endl; cin>>name>>stuID>>english>>math>>cpp; List *new_node=new List;//創(chuàng)建一個新的結(jié)點 new_node->stu.set_name(name); new_node->stu.set_stuID(stuID); new_node->stu.set_scores(english,math,cpp); new_node->stu.count_total();//計算總成績 new_node->stu.count_avg();//計算平均成績 pf->pNext=new_node; new_node->pNext=NULL; } } //保存鏈表至文件中 void List::save_list() { string name;//姓名 string stuID;//學(xué)號 double english;//英語成績 double math;//數(shù)學(xué)成績 double cpp;//C++成績 double total;//總成績 double average;//平均成績 List *p=pHead; ofstream fout; fout.open("student.txt",ios::out); while(p!=NULL) { name=p->stu.get_name(); stuID=p->stu.get_stuID(); p->stu.get_scores(&english,&math,&cpp,&total,&average); fout<<name<<' '<<stuID<<' '<<english<<' '<<math<<' '<<cpp<<endl; p=p->pNext; } fout.close(); } //銷毀鏈表,釋放內(nèi)存空間 void List::delete_list() { List *p=pHead; List *pt; while(p!=NULL) { pt=p; p=p->pNext; delete pt; } pt=NULL; pHead=NULL; p=NULL; }
student.txt
小趙 01 90 90 90
小王 02 84 84 89
小方 03 86 85 90
小李 04 90 76 70
小劉 05 89 78 90
小曹 06 60 78 69
小張 07 80 70 90
小田 08 90 90 90
小童 09 89 78 67
如果程序運行不了,或有什么問題的話,歡迎在評論區(qū)留言
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Linux系統(tǒng)調(diào)用--getrlimit()與setrlimit()函數(shù)的方法
本篇文章是對在Linux系統(tǒng)中調(diào)用getrlimit()與setrlimit()函數(shù)的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05Qt Design Studio創(chuàng)建工程的實現(xiàn)方法
Qt Design Studio它允許設(shè)計人員和開發(fā)人員使用通用的設(shè)計、開發(fā)、分析和調(diào)試工具在不同的開發(fā)平臺上共享一個項目,本文主要介紹了Qt Design Studio創(chuàng)建工程的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下2022-05-05