c++ stl list實現簡單的學生信息管理系統 問題描述: 已知有20個學生記錄(包括學號、姓名、成績)的文件student.dat。要求編程序實現查詢、排序、插入、刪除諸功能。 系統的基本功能: A.要求顯示如下界面 **************************************** 1--------------查詢 2--------------排序 3--------------插入 4--------------刪除 **************************************** 通過選擇1-4來確定要做哪一個操作。 B.若選1,則出現如下界面 **************************************** 1.1----------按學號查詢 1.2----------按姓名查詢 1.3----------按成績查詢 **************************************** 通過選擇1.1-1.3來確定要做哪一個操作,其中:按學號查詢用二分法實現;按姓名查詢用順序法實現;按成績查詢實現查詢成績小於m分的學生;找到該生將學生記錄輸出到屏幕,若查無此人,輸出相關信息。 C.若選2,則按成績從大到小排序,姓名,學號順序也隨之調整。 D.若選3,將一個新學生記錄按學號順序插入,並把結果保存到文件student.dat中。 E.若選4,刪除指定學生的記錄,並把結果保存到文件student.dat中。 F.以上各個功能均編寫成子函數,由主函數調用實現。 c++代碼如下: [cpp] #include <<span class="GRcorrect" id="GRmark_5fc8fc187032ce782ecac928f035d97f41d26a88_iostream:0" grphrase="5fc8fc187032ce782ecac928f035d97f41d26a88" grtype="null">iostream</span>> #include <<span class="GRcorrect" id="GRmark_c85475ec45e79bf31944ddd7b9056330f5830822_fstream:0" grphrase="c85475ec45e79bf31944ddd7b9056330f5830822" grtype="null">fstream</span>> #include <list> #include <<span class="GRcorrect" id="GRmark_4b0a33f65e13f1f129d6d1e51548c3ab91888b26_cmath:0" grphrase="4b0a33f65e13f1f129d6d1e51548c3ab91888b26" grtype="null">cmath</span>> #include <string<span class="GRcorrect" id="GRmark_fcc4c679808977b2a91b05c30d2e55360b066247_.:0" grphrase="fcc4c679808977b2a91b05c30d2e55360b066247" grtype="null">.</span>h> #define MAX_STU 100//讀入學生的最大數目 /* *鄭海波 blog.csdn.net/nuptboyzhb/ *email:[email protected] */ <span class="GRcorrect" id="GRmark_d101e8caae62915e3f88a5fb668c63e9f9483281_using:0" grphrase="d101e8caae62915e3f88a5fb668c63e9f9483281" grtype="null">using</span> namespace <span class="GRcorrect" id="GRmark_d101e8caae62915e3f88a5fb668c63e9f9483281_std:1" grphrase="d101e8caae62915e3f88a5fb668c63e9f9483281" grtype="null">std</span>; class Student { public: char * name; char *ID; int grade; Student() { name = new char[strlen("Anonymous-----") + 1]; ID = new char[strlen("NoIdInput------") + 1]; grade = 0; } Student(char * pName,char * pID, int pgrade) :grade(pgrade) { name = new char[strlen(pName) + 1]; strcpy(name, pName); ID = new char[strlen(pID) + 1]; strcpy(ID, pID); } Student(const Student& rhs) :grade(rhs.grade) { name = new char[strlen(rhs.name) + 1]; strcpy(name, rhs.name); ID = new char[strlen(rhs.ID) + 1]; strcpy(ID, rhs.ID); } Student& operator=(const Student& rhs) { name = new char[strlen(rhs.name) + 1]; strcpy(name, rhs.name); ID = new char[strlen(rhs.ID) + 1]; strcpy(ID, rhs.ID); grade = rhs.grade; return *this; } // overload the == operator // for sorting purposes, we consider that two Student objects are "equal" // if they have the same grade bool operator==(const Student& rhs) const { return (grade == rhs.grade) ? true : false; } // overload the < operator // for sorting purposes, we consider that a Student object is "less than" another // if it's grade is less than the other object's grade bool operator<(const Student& rhs) const { return (grade < rhs.grade) ? true : false; } // overload the > operator // for sorting purposes, we consider that a Student object is "greater than" another // if it's grade is greater than the other object's grade bool operator>(const Student& rhs) const { return (grade > rhs.grade) ? true : false; } // 顯示學生的信息 void print() { cout << name <<" " <<ID << " " << grade << endl; } //構造函數 ~Student() { delete []name; delete []ID; } }; list<Student> lst;//學生鏈表,用於存放學生數據 void print(list<Student> lst, char * name)//輸入鏈表中所有的學生 { list<Student>::iterator it; cout << name << ":" << endl; for(it = lst.begin(); it != lst.end(); ++it) it->print(); cout << endl; } void screenA()//顯示屏幕操作A { cout<<"****************************************"<<endl; cout<<" 1--------------查詢"<<endl; cout<<" 2--------------排序"<<endl; cout<<" 3--------------插入"<<endl; cout<<" 4--------------刪除"<<endl; cout<<" 5--------------顯示"<<endl; cout<<" 6--------------保存"<<endl; cout<<" 7--------------清屏"<<endl; cout<<"****************************************"<<endl; } void screenB()//顯示屏幕查詢 { system("cls"); cout<<"****************************************"<<endl; cout<<" 1----------按學號查詢"<<endl; cout<<" 2----------按姓名查詢"<<endl; cout<<" 3----------按成績查詢"<<endl; cout<<" 4----------返回"<<endl; cout<<"****************************************"<<endl; } void searchByID()//按學號查找 { cout<<"-------請輸入學號ID"<<endl; char tID[12]; memset(tID,0,12); cin>>tID; bool flag=false; list<Student>::iterator it; for(it = lst.begin(); it != lst.end(); ++it) { if (strcmp(it->ID,tID)==0) { cout<<"----查找到,該學生信息如下:-----"<<endl; it->print(); flag=true; break; } } if (flag==false) { cout<<"未找到!"<<endl; } } void searchByName()//按名字查找 { cout<<"-------請輸入姓名:"<<endl; char tname[12]; memset(tname,0,12); cin>>tname; bool flag=false; list<Student>::iterator it; for(it = lst.begin(); it != lst.end(); ++it) { if (strcmp(it->name,tname)==0) { cout<<"----查找到,該學生信息如下:-----"<<endl; it->print(); flag=true; break; } } if (flag==false) { cout<<"未找到!"<<endl; } } void searchByGrade()//按分數查找 { cout<<"-------請輸入分數:"<<endl; int tgrade; cin>>tgrade; bool flag=false; list<Student>::iterator it; for(it = lst.begin(); it != lst.end(); ++it) { if (it->grade==tgrade) { cout<<"----查找到,該學生信息如下:-----"<<endl; it->print(); flag=true; break; } } if (flag==false) { cout<<"未找到!"<<endl; } } void sortByGrade()//按分數進行排序,由高到低 { system("cls"); cout<<"-------按分數排序完畢,結果如下:"<<endl; lst.sort( greater<Student>() ); list<Student>::iterator it; for(it = lst.begin(); it != lst.end(); ++it) { it->print(); } } void insertStudent()//插入一個學生 { system("cls"); cout<<"-------請輸入學號ID"<<endl; char tID[12]; memset(tID,0,12); cin>>tID; cout<<"-------請輸入姓名:"<<endl; char tname[12]; memset(tname,0,12); cin>>tname; cout<<"-------請輸入分數:"<<endl; int tgrade; cin>>tgrade; Student stu(tname,tID,tgrade); lst.push_back(stu); list<Student>::iterator it; for(it = lst.begin(); it != lst.end(); ++it) { it->print(); } } void deleteStudent()//按要求刪除一個學生 { system("cls"); cout<<"-------請輸入要刪除學生的學號ID:"<<endl; char tID[12]; memset(tID,0,12); cin>>tID; bool flag=false; list<Student>::iterator it; for(it = lst.begin(); it != lst.end(); ++it) { if (strcmp(it->ID,tID)==0) { cout<<"----查找到,該學生信息如下:-----"<<endl; it->print(); lst.erase(it); cout<<"刪除完畢!"<<endl; flag=true; break; } } if (flag==false) { cout<<"未找到!"<<endl; } } void inputData()//從文件中讀取數據 { cout<<"正在從文件讀入數據..."<<endl; ifstream ifile("student.dat"); if(!ifile) { cout<<"student.dat cannot be opened!"<<endl; return; } char ch; int i; for (i=0;i<MAX_STU;i++)//讀取數目 { string s_name,s_id,s_grade; if(!ifile.get(ch)) { cout<<"文件已經讀完!"<<endl; return; } while (ch!='#')//讀取姓名 { if (ch==' ')//跳過空格 { ifile.get(ch); continue; } s_name+=ch; ifile.get(ch); } ifile.get(ch); while (ch!='#')//讀取學號 { if (ch==' ') { ifile.get(ch);//跳過空格 continue; } s_id+=ch; ifile.get(ch); } ifile.get(ch); while(ch!='\n')//讀取分數 { if (ch==' ') { ifile.get(ch); continue; } s_grade+=ch; if(!ifile.get(ch)) { cout<<"文件已經讀完!"<<endl; return; } } Student temp; strcpy(temp.name,s_name.c_str()); strcpy(temp.ID,s_id.c_str()); temp.grade=atoi(s_grade.c_str()); lst.push_back(temp); } ifile.close(); system("cls"); } void SaveAsFile() { system("cls"); ofstream ofile("student.dat",ios::out); if (!ofile) { cout<<"打開文件失敗!"<<endl; return; } list<Student>::iterator it; for(it = lst.begin(); it != lst.end(); ++it) { ofile<<it->name<<"#"<<it->ID<<"#"<<it->grade<<"\n"; } cout <<"保存完畢..."<< endl; ofile.close(); return ; } int main() { inputData();//從文件中讀入數據 char ch; screenA(); while (cin>>ch) { switch(ch) { case '1': screenB(); while (cin>>ch) { int flag=0; switch(ch) { case '1': searchByID(); break; case '2': searchByName(); break; case '3': searchByGrade(); break; case '4': flag=1; break; default: flag=1; break; } if (flag==1) { break; } } break; case '2'://排序 sortByGrade(); break; case '3'://插入學生 insertStudent(); break; case '4'://刪除學生 deleteStudent(); break; case '5'://顯示當前信息 print(lst,"---------當前數據列表如下"); break; case '6'://將數據保存到文件 SaveAsFile(); break; case '7'://清屏 system("cls"); break; default: return 0; } screenA(); } cout<<"系統退出"<<endl; return 0; } student.dat內容如下: 張山 # B11010101 # 98 李四 # B11010101 # 67 王五 # B11010101 # 88 李華 # B11010101 # 76 李陽 # B11010101 # 55 張偉 # B11010101 # 87 王大為 # B11010101 # 89 李小名 # B11010101 # 92 張山一 # B11010101 # 98 李四一 # B11010101 # 67 王五一 # B11010101 # 88 李華一 # B11010101 # 76 李陽一 # B11010101 # 55 張偉一 # B11010101 # 87 王大二 # B11010101 # 89 李小登 # B11010101 # 92