C++實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng)
本文實(shí)例為大家分享了C++實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
一、問題描述
設(shè)計(jì)一個(gè)學(xué)生成績管理程序,實(shí)現(xiàn)按班級完成對學(xué)生成績信息的錄入和修改,并用文件保存。實(shí)現(xiàn)按班級輸出學(xué)生的成績單;實(shí)現(xiàn)按學(xué)號和姓名進(jìn)行查詢,按平均成績進(jìn)行排序功能。
二、基本要求
(1)使用面向?qū)ο缶幊趟枷刖帉戦_發(fā)過程中需要用到的類,比如:Person 類,學(xué)生類繼承Person類,管理類實(shí)現(xiàn)對成績信息的操作。
(2)輸入和輸出可以使用文本文件重定向輸入(保存數(shù)據(jù)為磁盤文件);也可以使用標(biāo)準(zhǔn)輸入輸出進(jìn)行(提交時(shí)需要提交TXT格式輸入數(shù)據(jù))。比如 score.txt 的文件(包含 20 個(gè) 以上記錄),包含數(shù)據(jù)信息有:學(xué)號(長度為10位,不允許重復(fù))、姓名、班級(至少有 2 個(gè))、 課程成績(至少 3 門);在運(yùn)行程序時(shí)自動(dòng)載入,若文件不存則創(chuàng)建一個(gè)空文件。平均成績 不作為類成員,只是在程序運(yùn)行時(shí)產(chǎn)生,也不須保存。
平均成績設(shè)置獨(dú)立的計(jì)算函數(shù),對文件的所有數(shù)據(jù)進(jìn)行遍歷,將每個(gè)人三門課程的成績累加起來然后除以課程數(shù)最終得到每個(gè)人的平均成績,在每次輸出時(shí),將平均成績同時(shí)輸出出來,但在文件保存時(shí)對平均成績不保存。
(3)程序運(yùn)行時(shí)顯示菜單功能,按班錄入成績,查詢個(gè)人成績,修改成績,按班輸出成績單,按平均分排序顯示。
按平均分排序顯示需要對所有同學(xué)的平均成績進(jìn)行比較,然后排序,初步考慮在遍歷的過程中進(jìn)行比較,然后借助中間變量進(jìn)行排序,后來查找資料發(fā)現(xiàn)頭文件下有sort專門的排序函數(shù),不過默認(rèn)的是從小到大的排序,因此需要對排序方式進(jìn)行定義。
(4)基本功能要求具有增、刪、改、查。
基本流程圖
(1)score.h
#include <iostream> #include <string>//為了使用string類? #include <vector>//vector數(shù)組的頭文件? #include <fstream>//文件操作的頭文件? #include<conio.h>//使用getch()函數(shù) #include<algorithm>//使用庫函數(shù)sort進(jìn)行排序? using namespace std;? class person { ?? ?public: ?? ??? ?string Number;//學(xué)號? ?? ??? ?string Name;//姓名? ?? ??? ?string Class;//班級? ?? ??? ?person(){} //缺省構(gòu)造函數(shù)? ?? ??? ?~person(){}//析構(gòu)函數(shù)? } ; class student:public person//學(xué)生類,繼承person類? { ?? ?public: ?? ??? ?double Lesson_1;//課程1? ?? ??? ?double Lesson_2;//課程2? ?? ??? ?double Lesson_3; //課程3? ?? ?friend istream& operator>>(istream& in, student & t)//重載>>操作符 ?? ?{ ?? ??? ?in>>t.Number>>t.Name>>t.Class>>t.Lesson_1>>t.Lesson_2>>t.Lesson_3; ?? ? }? ?? ?friend ostream& operator<<(ostream& out, const student& t)//重載<<操作符? ?? ?{ ?? ??? ?out<<t.Number<<"\t"<<t.Name<<"\t"<<t.Class<<"\t"<<t.Lesson_1<<"\t"<<t.Lesson_2<<"\t"<<t.Lesson_3<<endl;? ?? ?} }; class Admin//管理類? { ?? ?public: ?? ??? ?vector<student>stu;//vector數(shù)組? ?? ??? ?void AddScore();//添加成績 ? ?? ??? ?void ShowScore();//顯示成績? ?? ??? ?void ChangeScore();//修改成績? ?? ??? ?void ShowClass();//按班輸出成績單 ?? ??? ?void DelScore();//刪除學(xué)生成績? ?? ??? ?void SearchScore();//查找學(xué)生成績? ?? ??? ?void ShowSort();//按平均分排序? ?? ??? ?int GetScore();//獲取文件中的學(xué)生成績? ?? ??? ?void Keep();//保存為文件數(shù)據(jù)? };
(2)main.cpp
#include"score.h" void Admin::AddScore()//添加 成績? { ?? ?student s; //定義student類的對象? ?? ?cout<<"Input Number: "; cin>>s.Number;? ?? ?cout<<"Input Name: "; cin>>s.Name;? ?? ?cout<<"Input Class: "; cin>>s.Class;? ?? ?cout<<"Input學(xué)生課程1的成績: "; cin>>s.Lesson_1;? ?? ?cout<<"Input學(xué)生課程2的成績: "; cin>>s.Lesson_2;? ?? ?cout<<"Input學(xué)生課程3的成績: "; cin>>s.Lesson_3;? ?? ?stu.push_back(s); ?? ?cout<<"學(xué)生成績添加成功!"<<endl;? } void Admin::ShowScore()//顯示所有學(xué)生的成績? { ?? ?vector<student>::iterator iter; //定義學(xué)生Vector數(shù)組的迭代器? ?? ?for(iter=this->stu.begin();iter!=this->stu.end();iter++)//對vector數(shù)組進(jìn)行遍歷,調(diào)用begin()和end()函數(shù)進(jìn)行? ?? ?{ ?? ??? ?cout<<"Number: "<<iter->Number<<" ? Name: ?"<<iter->Name<<" ?Class: ?"<<iter->Class<<" ?課程1: ?"<<iter->Lesson_1 ?? ??? ?<<" ?課程2: ?"<<iter->Lesson_2<<" ?課程3: ?"<<iter->Lesson_3<<" ?平均分: ?"<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl; ?? ??? ?}?? ? } void Admin::ChangeScore()//修改學(xué)生成績信息? { ?? ?if(stu.empty())//判斷數(shù)組是否有學(xué)生成績信息,? ?? ?{ ?? ??? ?cout<<"暫無學(xué)生成績信息,無法修改"<<endl; ?? ??? ?return; ?//返回主函數(shù)? ?? ?} ?? ?string _name; ?? ?cout<<"Input Name: ";cin>>_name; ?? ?vector<student>::iterator iter; //定義學(xué)生Vector數(shù)組的迭代器? ?? ?for(iter=this->stu.begin();iter!=this->stu.end();)//對vector數(shù)組進(jìn)行遍歷,調(diào)用begin()和end()函數(shù)進(jìn)行? ?? ?{ ?? ??? ?if(iter->Name==_name) ? ?//根據(jù)輸入的Name找到成績信息? ?? ??? ?{ ?? ??? ??? ?cout<<"Input Number: ";cin>>iter->Number; ?? ??? ??? ?cout<<"Input Class: ";cin>>iter->Class;? ?? ??? ??? ?cout<<"Input 課程1的成績: ";cin>>iter->Lesson_1;? ?? ??? ??? ?cout<<"Input 課程2的成績: ";cin>>iter->Lesson_2;? ?? ??? ??? ?cout<<"Input 課程3的成績: ";cin>>iter->Lesson_3;? ?? ??? ??? ?this->Keep(); ?//調(diào)用keep函數(shù)將修改后的數(shù)據(jù)保存? ?? ??? ??? ?cout<<"修改成功!"<<endl;? ?? ??? ?} ?? ??? ?else ?? ??? ??? ?iter++;? ?? ?} } void Admin::ShowClass()//按Class輸出成績單? { ?? ?string _Class; ?? ?cout<<"Input ?Class: "; cin>>_Class; ?? ?if(Class!="網(wǎng)絡(luò)1901"||Class!="網(wǎng)絡(luò)1902")? ?? ?{ ?? ??? ?cout<<"請?jiān)诰W(wǎng)絡(luò)1901和網(wǎng)絡(luò)1902兩個(gè)班之間選擇"<<endl' ?? ??? ?return;'? ?? ?} ?? ?vector<student>::iterator iter; //定義學(xué)生Vector數(shù)組的迭代器? ?? ?for(iter=this->stu.begin();iter!=this->stu.end();iter++)//對vector數(shù)組進(jìn)行遍歷,調(diào)用begin()和end()函數(shù)進(jìn)行? ?? ?{ ?? ??? ?if(iter->Class==_Class) ?? ??? ?{ ?? ??? ?cout<<"Number: "<<iter->Number<<" ? Name: ?"<<iter->Name<<" ?Class: ?"<<iter->Class<<" ?課程1: ?"<<iter->Lesson_1 ?? ??? ?<<" ?課程2: ?"<<iter->Lesson_2<<" ?課程3: ?"<<iter->Lesson_3<<" ?平均分: ?"<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl;} ?? ?} }? void Admin::DelScore()//刪除學(xué)生成績? { ?? ?if(stu.empty())//判斷vector數(shù)組是否有學(xué)生成績信息,? ?? ?{ ?? ??? ?cout<<"暫無學(xué)生成績信息,無法修改"<<endl; ?? ??? ?return; ?//返回主函數(shù)? ?? ?} ?? ?string _name; ?? ?cout<<"Input ?Name: ?" ;cin>>_name; ?? ?vector<student>::iterator iter; //定義學(xué)生Vector數(shù)組的迭代器? ?? ?for(iter=this->stu.begin();iter!=this->stu.end();)//對vector數(shù)組進(jìn)行遍歷,調(diào)用begin()和end()函數(shù)進(jìn)行? ?? ?{ ?? ??? ?if(iter->Name==_name){ ?? ??? ??? ?stu.erase(iter);//從vector數(shù)組中刪除這條學(xué)生信息? ?? ??? ??? ?this->Keep();//保存學(xué)生信息? ?? ??? ?} ?? ?} }? void Admin::SearchScore()//查詢學(xué)生成績信息? { ?? ?cout<<" ? ? 1、按 姓 名 查 找"<<endl; ?? ?cout<<" ? ? 2、按 學(xué) 號 查 找 ?"<<endl;? ?? ?int n; ?? ?cout<<"請選擇-> "; cin>>n; ?? ?switch(n) ?? ?{ ?? ??? ?case 1: ?? ??? ??? ?{ ?? ??? ??? ??? ?string _name; ?? ??? ??? ??? ?cout<<"Input ?Name: "; cin>>_name; ?? ??? ??? ??? ?vector<student>::iterator iter; //定義學(xué)生Vector數(shù)組的迭代器? ?? ??? ??? ??? ?for(iter=this->stu.begin();iter!=this->stu.end();iter++)//對vector數(shù)組進(jìn)行遍歷,調(diào)用begin()和end()函數(shù)進(jìn)行? ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(iter->Name==_name) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?cout<<"Number: "<<iter->Number<<" ? Name: ?"<<iter->Name<<" ?Class: ?"<<iter->Class<<" ?課程1: ?"<<iter->Lesson_1 ?? ??? ??? ??? ??? ?<<" ?課程2: ?"<<iter->Lesson_2<<" ?課程3: ?"<<iter->Lesson_3<<" ?平均分: ?"<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl;} ?? ??? ??? ??? ?} ?? ??? ??? ?}break; ?? ??? ?case 2: ?? ??? ??? ?{ ?? ??? ??? ??? ?string _number; ?? ??? ??? ??? ?cout<<"Input ?Number: "; cin>>_number; ?? ??? ??? ??? ?vector<student>::iterator iter; //定義學(xué)生Vector數(shù)組的迭代器? ?? ??? ??? ??? ?for(iter=this->stu.begin();iter!=this->stu.end();iter++)//對vector數(shù)組進(jìn)行遍歷,調(diào)用begin()和end()函數(shù)進(jìn)行? ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?if(iter->Number==_number) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?cout<<"Number: "<<iter->Number<<" ? Name: ?"<<iter->Name<<" ?Class: ?"<<iter->Class<<" ?課程1: ?"<<iter->Lesson_1 ?? ??? ??? ??? ??? ?<<" ?課程2: ?"<<iter->Lesson_2<<" ?課程3: ?"<<iter->Lesson_3<<" ?平均分: ?"<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl;} ?? ??? ??? ??? ?}?? ? ?? ??? ??? ?} ?? ?}? ?} bool operator < (student &A,student &B)//定義排序規(guī)則? { ?? ?return (A.Lesson_1+A.Lesson_2+A.Lesson_3)/3 > (B.Lesson_1+B.Lesson_2+B.Lesson_3)/3; } void Admin::ShowSort()//按平均分排序? { ?? ?sort(stu.begin(),stu.end());//調(diào)用庫函數(shù)sort? ?? ?vector<student>::iterator iter;//定義迭代器? ?? ?for (iter = this->stu.begin(); iter != this->stu.end();iter++ )//對vector數(shù)組進(jìn)行循環(huán)? ?? ?{?? ??? ? ?? ??? ?cout<<"Number: "<<iter->Number<<" ? Name: ?"<<iter->Name<<" ?Class: ?"<<iter->Class<<" ?課程1: ?"<<iter->Lesson_1 ?? ??? ?<<" ?課程2: ?"<<iter->Lesson_2<<" ?課程3: ?"<<iter->Lesson_3<<" ?平均分: ?"<<(iter->Lesson_1+iter->Lesson_2+iter->Lesson_3)/3<<endl; ?? ?} ?}? int Admin::GetScore()//從文件中獲取學(xué)生成績數(shù)據(jù)? { ?? ?fstream readfile("score.txt");//打開文件操作? ?? ?int rows = 0; ?? ?if (readfile)//先判斷文件是否存在,如果文件存在 ?? ?{ ?? ??? ?student s; ?? ??? ?if (!(readfile >>s.Number>>s.Name>>s.Class>>s.Lesson_1>>s.Lesson_2>>s.Lesson_3))//如果第一次讀取為空 ?? ??? ?{ ?? ??? ??? ?cout << "文件為空"<<endl; ?? ??? ??? ?return 1; ?? ??? ?} ?? ??? ?stu.push_back(s); //push_back將文件中的數(shù)據(jù)存入Vector數(shù)組中? ?? ??? ?rows++; ?? ??? ?while(readfile >>s.Number>>s.Name>>s.Class>>s.Lesson_1>>s.Lesson_2>>s.Lesson_3)//讀取后存入vector容器中 ?? ??? ?{ ?? ??? ??? ?rows++; ?? ??? ??? ?stu.push_back(s); //vector數(shù)組第要調(diào)用 push_back函數(shù)進(jìn)行讀入? ?? ??? ?} ?? ??? ?cout<<"數(shù)據(jù)讀取成功!"<<endl;? ?? ??? ?readfile.close();//文件操作完成后,需要關(guān)閉文件? ?? ??? ?return rows; ?? ?} ?? ?else ?? ?{ ?? ??? ?ofstream outfile;//磁盤中不存在文件的話則創(chuàng)建 ?? ??? ?outfile.open("score.txt");//創(chuàng)建通訊錄文件? ?? ??? ?if (!outfile.is_open()) //未能打開新創(chuàng)建的文件? ?? ??? ?{ ?? ??? ??? ?cout << "文件沒有創(chuàng)建!"<<endl; ?? ??? ??? ?return -1; ?? ??? ?} ?? ??? ?else?? ?cout<<"文件為空"<<endl;? ?? ??? ?outfile.close();//文件操作完成后,需要關(guān)閉文件? ?? ?} ?? ?return 2; ?} void Admin::Keep()//保存? ?{ ??? ?ofstream outfile("score.txt");//打開文件? ?? ?vector<student>::iterator iter;//vector數(shù)組保存的磁盤文件? ?? ?for (iter=this->stu.begin(); iter!=this->stu.end();iter++) //vector數(shù)組的頭部要用begin(),尾部要用end(),從頭到尾利用迭代器進(jìn)行遍歷 ?? ?{ ?? ??? ?outfile<<iter->Number<<"\t"<<iter->Name<<"\t"<<iter->Class<<"\t"<<iter->Lesson_1<<"\t"<<iter->Lesson_2<<"\t"<<iter->Lesson_3<<endl; ?? ?} ?? ?outfile.close(); //關(guān)閉文件? }? int main() { ?? ?int n; ?? ?Admin a;//定義對象? ?? ?a.GetScore();//從文件中讀取數(shù)據(jù)? ?? ?do{ ?? ??? ?cout<<endl<<" 學(xué)生成績管理系統(tǒng) ?"<<endl; ?? ??? ?cout<<"1、添加學(xué)生成績 ? " <<endl; ? ?? ??? ?cout<<"2、顯示學(xué)生成績 ? " <<endl;? ?? ??? ?cout<<"3、修改學(xué)生成績 ? " <<endl;? ?? ??? ?cout<<"4、按班級顯示學(xué)生成績" <<endl;? ?? ??? ?cout<<"5、刪除學(xué)生成績 ? " <<endl;? ?? ??? ?cout<<"6、按平均分排序?qū)W生成績" <<endl;? ?? ??? ?cout<<"7、查詢學(xué)生個(gè)人成績" <<endl;? ?? ??? ?cout<<"8、保存并退出 ? " <<endl;? ?? ??? ?cout<<"請選擇 " ;cin>>n; ?? ??? ?switch(n) ?? ??? ?{ ?? ??? ??? ?case 1: a.AddScore();getch();break; ?? ??? ??? ?case 2: a.ShowScore();getch();break; ?? ??? ??? ?case 3: a.ChangeScore();getch();break; ?? ??? ??? ?case 4: a.ShowClass();getch();break; ?? ??? ??? ?case 5: a.DelScore();getch();break; ?? ??? ??? ?case 6: a.ShowSort();getch();break; ?? ??? ??? ?case 7: a.SearchScore(); getch();break; ?? ??? ??? ?case 8: exit(0); ?? ??? ? }? ?? ?}while(1); ?? ?return 0;
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法
今天小編就為大家分享一篇關(guān)于C語言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02C語言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Qt實(shí)現(xiàn)繪制網(wǎng)格背景的示例代碼
這篇文章主要介紹了Qt如何實(shí)現(xiàn)繪制網(wǎng)格背景,并且能實(shí)現(xiàn)窗口大小調(diào)整時(shí)網(wǎng)格背景也自動(dòng)調(diào)整重繪,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06基于C++實(shí)現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)
本文的主要思想是Kinect SDK 讀取彩色、深度、骨骼信息并用OpenCV顯示,非常的實(shí)用,有需要的小伙伴可以參考下2015-12-12C語言實(shí)現(xiàn)單位車輛調(diào)度管理
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)單位車輛調(diào)度管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語言運(yùn)用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了C語言運(yùn)用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10C++實(shí)現(xiàn)快捷店會員管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快捷店會員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03c語言實(shí)現(xiàn)兩個(gè)單鏈表的交叉合并方式
今天小編就為大家分享一篇c語言實(shí)現(xiàn)兩個(gè)單鏈表的交叉合并方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12linux c++ 服務(wù)器端開發(fā)面試必看書籍整理
這篇文章主要介紹了linux c++ 服務(wù)器端開發(fā)面試必看書籍整理,需要的朋友可以參考下2020-02-02