在項目中,有些代碼需要被各個模塊調用。為瞭解耦,可以把這些公共部分的代碼整合到一個子項目中,併發布到本地,實現多個項目共用代碼。 新建子項目。 maven -clean 命令,測試maven環境;測試通過後使用maven -install 將項目打包併發布到本地倉庫。 在其他項目中,通過<depen ...
【C++】學生管理系統 一道非常經典的C語言題目,用C++實現 題目如下:
- 輸入功能:由鍵盤輸入10個學生的學號、姓名、三科成績,並計算出平均成績和總成績,然後將它存入文件stud.dat。
- 插入功能:按學號增加一個學生信息,並將其插入到stud.dat中。
- 排序功能,按要求對學生信息進行排序,分為按學號和按總成績進行排序兩種情形,並輸出結果。
- 查詢功能:按要求查找學生信息,分為按學號和姓名進行查詢兩種情形,並輸出結果。
- 刪除功能:按要求將學生信息刪除,分為按學號和姓名進行刪除兩種情形。
- 輸出功能:按學號輸出學生信息。
整體思路:
- 程式啟動的時候判斷文件(stu.dat)是否存在,如果文件不存在,則正常執行,如果文件存在,先獲取文件中學生的個數,根據學生的個數創建對象數組,將內容創建成學生對象,保存在對象數組1里,再向下執行。
- 用Switch語句來判斷不同的輸入。
- 新增學生,根據 原來對象數組1儲存的人數+新增的人數 來確定新的動態數組2的大小,將原本對象數組1內的內容保存在新的對象數組2里,再將新增的內容儲存在後面,每次新增完,直接保存到文件。
- 排序學生,根據學號或者姓名,寫一個數組的冒泡排序即可
- 查詢學生,寫一個函數,判斷學生是否存在,如果存在返回學生所在數組的下標,根據下標輸出內容
- 刪除學生,用查詢學生寫的函數,根據下標刪除學生
- cout對象數組裡的內容就完事
實現代碼
#include <iostream> #include<fstream> #include<string> #define line for (int n = 0; n <= 100; n++) cout << "-" #define FILENAME "stdu.dat" using namespace std; class student { //學生類 public: int Is_Exist(string stuId, int a); int get_student_number(); //獲取文件中學生人數 bool File_Is_Empty; //文件是否為空的標識 student *studentArray; //將文件中的內容,以student對象方式儲存在studentArray[]數組中 int student_number; //學生人數 string studentId; //學號 string name; //姓名 float score[3];//成績*3 float Total; // 總分 int Average;//平均分 void sort(int n=1); //排序函數 void delete_stu(); //刪除學生 void init(); //初始化內容,將文件中的內容讀到studentArray中 void save(); //保存文件 void show();//展示界面 void add_stu(int number = 1); //添加學生 void showInfo(); //展示學生信息 void search();//搜索學生 student() //預設構造函數,判斷文件是否為空,設置File_Is_Empty值 { ifstream ifs; ifs.open(FILENAME, ios::in); if (!ifs.is_open()) { this->student_number = 0; this->studentArray = NULL; this->studentId = "0"; this->name = "0"; this->score[0] = 0; this->Average = 0; this->Total = 0; this->File_Is_Empty = true; ifs.close(); return; } char c; ifs >> c; if (ifs.eof()) { //文件空 this->student_number = 0; this->studentArray = NULL; this->studentId = "0"; this->name = "0"; this->score[0] = 0; this->Average = 0; this->Total = 0; this->File_Is_Empty = true; ifs.close(); return; } int num = this->get_student_number(); //獲取文件中學生數量 this->student_number = num; //cout << "現在學生人數為:" << num << endl;; //system("pause"); }; ~student() //析構函數 { delete[]this->studentArray; this->studentArray = NULL; //防止指針變為野指針 } student(string stuId,string stuName, float stuScore[3]) //帶參數的構造函數 { this->studentId = stuId; this->name = stuName; for (int i = 0; i < 3; i++) this->score[i] = stuScore[i]; this->Average = (stuScore[0] + stuScore[1] + stuScore[2]) / 3; this->Total = stuScore[0] + stuScore[1] + stuScore[2]; }; }; void student::sort(int n) //排序,當n=1的時候為按學號排序,n=2為按總成績排序 { int num1; //學號在設計的時候是string類型,用int類型排序需要atoi,用num接收轉換過的值 int num2; // student a; //用於交換對象數組的中間變數 if (this->File_Is_Empty) //判斷文件是否為空 { cout << "數據文件不存在或者為空\n"; system("pause"); } else { cout << "3.學生信息排序\n"; if (n == 1) { cout << "將學生信息按學號順序排序\n"; for (int i = 0; i < this->student_number - 1; i++)//冒泡排序 { for (int t = 0; t < this->student_number - 1 - i; t++) { num1 = atoi(this->studentArray[t].studentId.c_str()); //將string類型變數變為int類型 num2 = atoi(this->studentArray[t + 1].studentId.c_str()); if (num1 > num2) a = this->studentArray[t + 1], this->studentArray[t + 1] = this->studentArray[t], this->studentArray[t] = a; } } } if (n == 2) { cout << "將學生信息按總成績順序排序\n"; for (int i = 0; i < this->student_number - 1; i++)//冒泡排序 { for (int t = 0; t < this->student_number - 1 - i; t++) { if (this->studentArray[t].Total > this->studentArray[t + 1].Total) a = this->studentArray[t + 1], this->studentArray[t + 1] = this->studentArray[t], this->studentArray[t] = a; } } } } } void student::search() //查找學生成績 { string id; int ret; //studentArray[]的下標,在Is_Exist()中 int a = 1; //判斷根據學號查找還是姓名查找 cout << "4.查找學生成績\n" << "1.按照學號查找\t2.根據姓名查找\n輸入你的選項>"; cin >> a; if (a == 1) { cout << "請輸入學號:", cin >> id; ret = this->Is_Exist(id, 1); } else if (a == 2) { cout << "請輸入姓名:", cin >> id; ret = this->Is_Exist(id, 2); } else { ret = this->Is_Exist(id, 1); } if (ret == -1) { system("cls"); cout << "學生不存在" << endl; } else { cout << "查找成功,下麵為該學生信息\n" << endl; cout << "學號:" << this->studentArray[ret].studentId << " 姓名:" << this->studentArray[ret].name << endl << "各門成績:語文:" << this->studentArray[ret].score[0] << " 數學:" << this->studentArray[ret].score[0] << " 英語:" << this->studentArray[ret].score[2] << " 平均成績:" << this->studentArray[ret].Average << " 總成績:" << this->studentArray[ret].Total << endl; } system("pause"); } int student::Is_Exist(string stuId,int a) { //a=1 則使用學生學號查找 //a=2 則使用學生姓名查找 if (File_Is_Empty) //判斷文件是否不存在或者為空,如果為空則返回-2 { cout << "數據文件不存在或者為空\n"; system("pause"); return -2; } for (int i = 0; i < this->student_number; i++) { if ((a==1)&&(this->studentArray[i].studentId == stuId)) //根據學號查找 { return i; } if ((a == 2) && (this->studentArray[i].name == stuId)) //根據姓名查找 { return i; } } return -1; //如果沒找到返回-1 } void student::delete_stu() //刪除學生 { int ret; //接收 Is_Exist的返回值,返回值是此學生在studentArray[]里的下標 string id; //可以用來接收學號或者姓名 int a = 1; //判斷是按照學生學號尋找還是根據學生姓名尋找 cout << "5.刪除學生成績\n" << "1.按照學號刪除\t2.根據姓名刪除\n輸入你的選項>"; cin >> a; if (a == 1) //按照學生學號查找 { cout << "請輸入學號:", cin >> id; ret = this->Is_Exist(id, 1); } else if(a==2)//按照學生姓名 { cout << "請輸入姓名:", cin >> id; ret = this->Is_Exist(id, 2); } else //預設按照學生學號進行查找 { cout << "請輸入學號:", cin >> id; ret = this->Is_Exist(id, 1); } if (ret == -1) //返回值為-1則學生不存在 { system("cls"); cout << "學生不存在"<<endl; } else if(ret == -2) //返回值為-2文件不存在或為空,直接退出函數 { return; } else //如果學生信息存在,並且ret是studentArray[]中的下標 {//輸出要刪除的學生信息 cout << "該學生的信息將被刪除"<<endl; cout << "學號:" << this->studentArray[ret].studentId << " 姓名:" << this->studentArray[ret].name << endl << "各門成績:語文:" << this->studentArray[ret].score[0] << " 數學:" << this->studentArray[ret].score[0] << " 英語:" << this->studentArray[ret].score[2] << " 平均成績:" << this->studentArray[ret].Average << " 總成績:" << this->studentArray[ret].Total << endl; for (int i = ret; i < this->student_number - 1; i++) { this->studentArray[i] = this->studentArray[i + 1]; } this->student_number--; this->save(); } system("pause"); } void student::init() { string name; //用來儲存讀取到的姓名 string student_id;//用來儲存讀取到的學號 int i = 0; //標識符,用來把實例化的類儲存到對應的對象數組 float score[3]; //用來儲存讀取到的成績 float total; //用來儲存讀取到的成總分 int average; //用來儲存讀取到的平均分 ifstream inf; //實例化一個文件對象 this->studentArray = new student[this->student_number]; //根據讀取到的學生數量開闢空間,學生數量 inf.open(FILENAME, ios::in); while (inf >> student_id && inf >> name && inf >> score[0]&& inf >> score[1] && inf >> score[2] && inf >> average && inf >> total) { //格式化讀取文件,從文件讀到變數 student stu(student_id, name, score); //使用讀到的值實例化student對象 this->studentArray[i] = stu; //把實例化的對象放到stu1對象的studentArray中 i++; } } int student::get_student_number() //獲取文件中學生的數量,在add_stu()函數中加上需要增加的學生數量,為最新需要開闢的空間的大小 { string name; string student_id; int num=0; //每格式化讀取一塊數據,則加1人數 float score[3]; float total; int average; ifstream inf; inf.open(FILENAME, ios::in); while (inf >> student_id && inf >> name && inf >> score[0] && inf >> score[1] && inf >> score[2] && inf >> average && inf >> total) { num++; } inf.close(); return num; //返回學生數量 } void student::save() //將stu1中studentArray中的每個student對象儲存到文件中 { ofstream ofs; ofs.open(FILENAME,ios::out); for (int i = 0; i < this->student_number; i++) { ofs << this->studentArray[i].studentId << " " << this->studentArray[i].name << " " << this->studentArray[i].score[0] << " " << this->studentArray[i].score[1] << " " << this->studentArray[i].score[2]<< " " <<this->studentArray[i].Average<<" "<< this->studentArray->Total<<" "; } } void student::showInfo() //顯示學生信息 { if (this->File_Is_Empty) //構造函數里的文件標識符,判斷文件是否存在或者為空,每實例化一個對象都檢查一遍 { system("cls"); cout << "文件不存在或內容為空,請先輸入數據\n"; } else { //文件不為空則輸出stu1中studentArray中儲存的內容 for (int i=0;i<this->student_number;i++) { cout << "學號:" << this->studentArray[i].studentId << " 姓名:" << this->studentArray[i].name << endl << "各門成績:語文:" << this->studentArray[i].score[0] << " 數學:" << this->studentArray[i].score[1] << " 英語:" << this->studentArray[i].score[2] << " 平均成績:" << this->studentArray[i].Average << " 總成績:" << this->studentArray[i].Total << endl; line; cout << endl; } } system("pause"); } void student::add_stu(int add_number) //添加學生 { //計算需要的新的空間大小 int newsize = this->student_number + add_number; //需要開闢的空間 = 文件中學生的人數+需要添加的數量 //cout << "newxize=" << newsize; student *newspace = new student[newsize]; //開闢記憶體空間 student *stu3; string name; string studentId; float score[3]; if (this->studentArray!= NULL) //如果studentArray不為空就先將studentArray中的內容先複製到newspace數組中,再在newspace中增加學生信息, //最後再將newspace的內容複製到studentArray中,實現動態數組 { for (int i = 0; i < this->student_number; i++) { newspace[i] = this->studentArray[i]; } } for (int i = 0; i < add_number; i++) //輸入學生信息 { cout << "請輸入學生姓名:", cin >> name, cout << endl; cout << "請輸入學生學號:", cin >> studentId, cout << endl; cout << "請輸入學生語文成績:", cin >> score[0], cout << endl; cout << "請輸入學生數學成績:", cin >> score[1], cout << endl; cout << "請輸入學生英語成績:", cin >> score[2], cout << endl; line; cout << endl; student stu3(studentId, name, score); //將輸入的內容實例化成對象 newspace[this->student_number + i] = stu3; //將對象依次儲存到newspace中 } delete[] this->studentArray; this->studentArray = newspace; //將newspace賦給studentArray,用來在別的成員函數中訪問 this->student_number = newsize; //更新學生人數大小 this->File_Is_Empty = false; // 輸入了內容以後,文件不為空 this->save(); //保存到文件中 cout << "添加成功"<<endl; system("pause"); } void student::show() { cout << "1.輸入學生成績" << endl << "2.增加學生成績" << endl << "3.學生信息排序" << endl << "4.查找學生成績" << endl << "5.刪除學生成績" << endl << "6.顯示學生成績" << endl << "7.安全退出系統" << endl; line; cout << endl; cout<< "輸入你的選擇>:"; } student stu1; //實例化對象,此時已經得到文件中的學生數量 int main() { int choice=7; stu1.init(); // 將文件里的內容按照格式讀入記憶體,儲存到 // cout << "stu1里的人數" << stu1.student_number; // system("pause"); while (true) { system("cls"); stu1.show(); cin >> choice; line; cout << endl; if (cin.good() && choice <= 7 && choice >= 1) //判斷用戶輸入是否合法 { switch (choice) { case 1: //添加學生功能,預設參數為1,用來增加學生時直接調用,初始化添加十個學生時傳遞參數10 stu1.add_stu(10); break; case 2: //增加學生,要求按照學號順序插入,則在增加學生後調用排序函數,再進行保存 { stu1.add_stu(); stu1.sort(); stu1.save(); } break; case 3: //排序功能 { int n = 1; cout << "1.按照學號排序\t2.按照總成績排序\n"; cin >> n; stu1.sort(n); stu1.showInfo(); } break; case 4: //搜索功能 stu1.search(); break; case 5: //刪除功能 stu1.delete_stu(); break; case 6: //顯示學生信息 stu1.showInfo(); break; case 7: //退出程式 return 0; break; default