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