溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++實現(xiàn)學生信息管理系統(tǒng)的方法

發(fā)布時間:2020-12-11 10:59:23 來源:億速云 閱讀:498 作者:小新 欄目:開發(fā)技術

了解C++實現(xiàn)學生信息管理系統(tǒng)的方法?這個問題可能是我們?nèi)粘W習或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

該系統(tǒng)主要用到C++的繼承,虛函數(shù)。所有學生的信息保存在一個異質(zhì)鏈表中,并且鏈表也進行了封裝

課設題目

設計一個學生管理系統(tǒng),要求如下:

1、學生來自英語系,數(shù)學系、計算機系:

a) 每個學生的公共信息部分包括:學號、姓名、年齡、系別,高數(shù)成績、英語成績、體育成績;
b) 英語系學生有綜合英語、口語等課程成績;
c) 數(shù)學系學生有實變函數(shù)、泛函分析、微分幾何等課程成績;
d) 計算機系學生有計算機組成原理、計算機體系結構、匯編語言等課程成績。

每個學生可以查詢相應信息(學號、姓名、年齡、系別及成績信息);可以查詢各門課程的平均成績。
用類及類的派生實現(xiàn)上述功能,要求使用類的繼承、虛函數(shù)、虛基類的C++語言特性;要求每個類采用不同的方式實現(xiàn)構造函數(shù);

2、設計一個學生管理類,其中包含可變學生數(shù)目,要求實現(xiàn):

1)初始化,所有學生的信息組織以鏈表方式實現(xiàn);
2)實現(xiàn)指定學生的信息查詢(如利用學號、姓名等方式);
3)按照公共課平均成績排序;
4)按照學生所有課程的平均成績排序;
5)增加學生;
6)刪除指定學生。

3、注意構造函數(shù)和析構函數(shù)的實現(xiàn)方式。每個類的申明需放在單獨的頭文件中(即一個類的申明放在一個后綴名為h的文件中),每個類的實現(xiàn)放在一個單獨的cpp文件中。測試程序(即包含main函數(shù)的程序)單獨放在一個cpp文件中。

整體分析

根據(jù)題目要求該學生信息管理系統(tǒng)可分為五個功能模塊:

1、 信息讀取及輸出功能:從文件中讀取學生信息
將學生信息打印到屏幕上

2、 信息維護功能:增加學生信息
刪除學生信息

3、 信息查詢功能:根據(jù)學號查詢學生信息
根據(jù)姓名查詢學生信息

4、 成績統(tǒng)計功能:計算各學科的平均分

5、 排序功能:按照公共課平均成績進行排序
按照全部課程的平均成績進行排序
為實現(xiàn)以上功能,使用了類的繼承,虛函數(shù)的C++語言特性

共使用五個類:

1、 Student類:包含學生共同信息的類,共派生出三個類
2、 Csstudent類:計算機系學生類,由Student類派生而來
3、 Enstudent類:英語系學生類,由Student類派生而來
4、Mstudent類:數(shù)學系學生類,由Student類派生而來
4、 List類:鏈表類,包含對學生信息鏈表的各種操作

共使用到13個文件:<

1、 menu.cpp:內(nèi)含多個創(chuàng)建菜單函數(shù),用于實現(xiàn)不同模塊的功能顯示
2、 main.cpp:調(diào)用所有的函數(shù),并進行適當?shù)慕M合實現(xiàn)完整的學生成績管理系統(tǒng)
3、 student.h:包含用于保存學生公共信息及相關操作函數(shù)的Student類
4、 student.cpp:包含Student類的成員函數(shù)的實現(xiàn)
5、 csstudent.h:包含用于保存計算機系學生信息及相關操作的Csstudent類
6、 csstudent.cpp:包含Csstudent類的成員函數(shù)的實現(xiàn)
7、 enstudent.h:包含用于保存英語系學生信息及相關操作的Enstudent類
8、 enstudent.cpp:包含Enstudent類的成員函數(shù)的實現(xiàn)
9、 mstudent.h:包含用于保存數(shù)學系學生信息及相關操作的Mstudent類
10、 mstudent.cpp:包含Mstudent類的成員函數(shù)的實現(xiàn)
11、 list.h:包含用于操作學生信息的的List類
12、 list.cpp:包含List類的成員函數(shù)的實現(xiàn)
13、 student.txt:包含學生的全部信息

多個類的繼承關系圖如下:

C++實現(xiàn)學生信息管理系統(tǒng)的方法

源代碼

main.cpp

#include<iostream>
using namespace std;
//主界面
void menu()
{
 cout<<"\n\n\t\t----------------學生成績管理系統(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、增加學生信息"<<endl<<endl;
 cout<<"\t\t2、刪除學生信息"<<endl<<endl;
 cout<<"\t\t3、返回"<<endl<<endl;
 return;
}

//信息查詢功能界面
void menu2()
{
 cout<<"\n\n\t\t信息查詢功能"<<endl<<endl;
 cout<<"\t\t1、按姓名查詢"<<endl<<endl;
 cout<<"\t\t2、按學號查詢"<<endl<<endl;
 cout<<"\t\t3、返回"<<endl<<endl;
 return;
}

//成績統(tǒng)計功能界面
void menu3()
{
 cout<<"\n\n\t\t成績統(tǒng)計功能"<<endl<<endl;
 cout<<"\t\t1、各科目的平均成績"<<endl<<endl;
 cout<<"\t\t2、返回"<<endl<<endl;
 return;
}


//排序功能界面
void menu4()
{
 cout<<"\n\n\t\t排序功能"<<endl<<endl;
 cout<<"\t\t1、根據(jù)公共課平均成績排序"<<endl<<endl;
 cout<<"\t\t2、根據(jù)全部科目平均成績排序"<<endl<<endl;
 cout<<"\t\t3、返回"<<endl<<endl;
 return;
}

main.cpp

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include"student.h"
#include"csstudent.h"
#include"list.h"
using namespace std;

void menu();
void menu1();
void menu2();
void menu3();
void menu4();

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)
  {
  //增加學生信息
  case 1:
  pHead.output_info();//遍歷鏈表,并打印學生的信息
  pHead.add_info();//增加學生信息
  system("cls");
  cout<<"\n\n\n\t\t學生成績信息表(更新)"<<endl;
  pHead.output_info();//遍歷鏈表,并打印學生的信息
  pHead.save_list();//將改動保存到文件中
  cout<<"\n改動已保存到文件中"<<endl<<endl;
  system("pause");
  break;
  //刪除學生信息
  case 2:
  pHead.output_info();//遍歷鏈表,并打印學生的信息
  pHead.delete_info();//刪除學生信息
  system("cls");
  cout<<"\n\n\n\t\t學生成績信息表(更新)"<<endl;
  pHead.output_info();//遍歷鏈表,并打印學生的信息
  pHead.save_list();//將改動保存到文件中
  cout<<"\n改動已保存到文件中"<<endl<<endl;
  system("pause");
  break;
  default:
  system("cls");
  break;
  }
  if(choice1!=1&&choice1!=2)
  break;
 }
 break;

 //信息查詢功能
 case 2:
 while(1)
 {
  system("cls");
  menu2();
  cout<<"請選擇你要進行的操作:";
  cin>>choice2;
  switch(choice2)
  {
  //按姓名進行查詢
  case 1:
  pHead.search_by_name();
  system("pause");
  break;
  //按學號進行查詢
  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)
  {
  //計算各科目的平均成績
  case 1:
  pHead.count_sub_avg();//計算各學科的平均成績
  system("pause");
  break;
  default:
  system("cls");
  break;
  }
  if(choice3!=1)
  break;
 }
 break;

 //排序功能
 case 4:
 while(1)
 {
  system("cls");
  menu4();
  cout<<"請選擇你要進行的操作:";
  cin>>choice4;
  switch(choice4)
  {
  //根據(jù)公共課平均成績排序
  case 1:
  pHead.sort_by_public();
  pHead.output_info();
  cout<<endl;
  system("pause");
  break;
  case 2:
  //根據(jù)全部科目平均成績排序
  pHead.sort_by_all();
  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<cstring>
#include<sstream>
#include<fstream>
using namespace std;
class Student
{
private:
 //共同的學生信息
 int num;//學生的編號
 string stuID;//學生的學號
 string name;//學生的姓名
 int age;//學生的年齡
 string department;//學生所屬學院
 //共有的科目成績
 double math;//高數(shù)成績
 double english;//英語成績
 double PE;//體育成績
 double sum_part;//總分
 double average_part;//公共成績的平均分
public:
 Student(){}//無參數(shù)的構造函數(shù)
 Student(string _name,string _stuID,int _age,string _department,double _math,double _english,double _pe);//含參數(shù)的構造函數(shù)
 Student(const Student& stu);//拷貝構造函數(shù)
 virtual ~Student(){}//析構函數(shù)
public:
 //設置學生信息相關函數(shù)
 void set_num(int n);//設置學生的編號
 void set_stuID(string ID);//設置學生的學號
 void set_name(string na);//設置學生的姓名
 void set_age(int a);//設置學生的年齡
 void set_department(string dept);//設置學生所屬的學院
 void set_scores_part(double m,double en,double pe);//設置學生的各科成績

 virtual void count_sum();//計算公共科目的總分
 virtual void count_average();//計算公共科目的平均分

 //獲取學生信息相關函數(shù)
 int get_num();//獲取學生的編號
 string get_stuID();//獲得學生的學號
 string get_name();//獲得學生的姓名
 int get_age();//獲得學生的年齡
 string get_department();//獲得學生的所屬學院
 virtual void get_scores(double *m,double *en,double *pe);//獲得學生的公共科目的各項成績
 virtual double get_sum();//獲得公共成績的總分
 virtual double get_average();//獲得公共成績的平均分

 virtual void display_info();//將學生信息打印到屏幕上
 virtual void save_node(ofstream& fout);//將學生信息保存到文件中

};
#endif // _STUDENT_H

student.cpp

#include<iostream>
#include<cstring>
#include<sstream>
#include"student.h"
#include<fstream>
using namespace std;
//含參數(shù)的構造函數(shù)
Student::Student(string _name,string _stuID,int _age,string _department,double _math,double _english,double _pe)
{
 stuID=_stuID;
 name=_name;
 age=_age;
 department=_department;
 math=_math;
 english=_english;
 PE=_pe;
}
//拷貝構造函數(shù)
Student::Student(const Student& stu)
{
 stuID=stu.stuID;
 name=stu.name;
 age=stu.age;
 department=stu.department;
 math=stu.math;
 english=stu.english;
 PE=stu.PE;
}
//設置學生的編號
void Student::set_num(int n)
{
 num=n;
}
//設置學生的學號
void Student::set_stuID(string ID)
{
 stuID=ID;
}
//設置學生的姓名
void Student::set_name(string na)
{
 name=na;
}
//設置學生的年齡
void Student::set_age(int a)
{
 age=a;
}
//設置學生所屬的學院
void Student::set_department(string dept)
{
 department=dept;
}
//設置學生的各科成績
void Student::set_scores_part(double m,double en,double pe=0)
{
 math=m;
 english=en;
 PE=pe;
}
//計算公共科目的總分
void Student::count_sum()
{
 sum_part=math+english+PE;
}
//計算公共科目的平均分
void Student::count_average()
{
 average_part=(math+english+PE)/3;
}

//獲取學生的編號
int Student::get_num()
{
 return num;
}
//獲得學生的學號
string Student::get_stuID()
{
 return stuID;
}
//獲得學生的姓名
string Student::get_name()
{
 return name;
}
//獲得學生的年齡
int Student::get_age()
{
 return age;
}
//獲得學生的所屬學院
string Student::get_department()
{
 return department;
}
//獲得學生的各項成績
void Student::get_scores(double *m,double *en,double *pe)
{
 *m=math;
 *en=english;
 *pe=PE;
}
//獲取學生的編號
double Student::get_sum()
{
 return sum_part;
}
//獲得公共成績的平均分
double Student::get_average()
{
 return average_part;
}
//將學生信息打印到屏幕上
void Student::display_info()
{
 cout<<num<<'\t'<<name<<'\t'<<stuID<<'\t'<<age<<'\t'<<department<<"\t\t"<<math<<'\t'<<english<<'\t'<<PE<<'\t'<<average_part<<'\t';
}
//將學生信息保存到文件中
void Student::save_node(ofstream& fout)
{
 fout<<name<<' '<<stuID<<' '<<age<<' '<<department<<' '<<math<<' '<<english<<' '<<PE<<' ';
}

csstudent.h

#ifndef _CSSTUDENT_H
#define _CSSTUDENT_H
#include<iostream>
#include<cstring>
#include<sstream>
#include<fstream>
#include"student.h"
using namespace std;
class Csstudent:public Student
{
public:
 Csstudent(){}//無參數(shù)的構造函數(shù)
 //帶初始化列表的構造函數(shù)
 Csstudent(string _name,string _stuID,int _age,string _department,double _math,double _english,double _pe,double c_c,double c_a,double ass):
 Student(_name,_stuID,_age,_department,_math,_english,_pe)
 {
 c_composition=c_c;
 c_architecture=c_a;
 assembly_lan=ass;
 }

 virtual ~Csstudent(){}//析構函數(shù)
public:
 //設置學生信息相關函數(shù)
 virtual void count_sum();//計算總分
 virtual void count_average();//計算平均分

 //獲取學生信息相關函數(shù)
 virtual double get_sum();//獲得總分
 virtual double get_average();//獲得平均分
 virtual void get_scores(double* c_c,double*c_a,double *ass);//獲取學生的專業(yè)成績
public:
 virtual void display_info();//將學生信息打印到屏幕上
 virtual void save_node(ofstream& fout);//將學生信息保存到文件中
private:
 double sum;//全部科目的總分
 double average;//全部科目的平均分
 double c_composition;//計算機組成原理成績
 double c_architecture;//計算機體系結構成績
 double assembly_lan;//匯編語言成績
};
#endif

csstudent.cpp

#include<iostream>
#include<cstring>
#include<sstream>
#include<fstream>
#include"student.h"
#include"csstudent.h"

//計算所有科目的總分
void Csstudent::count_sum()
{
 double part=Student::get_sum();
 sum=part+c_composition+c_architecture+assembly_lan;
}
//計算全部科目的平均分
void Csstudent::count_average()
{
 average=sum/6;
}

//獲得學生全部科目的總分
double Csstudent::get_sum()
{
 return sum;
}
//獲得學生全部科目的平均分
double Csstudent::get_average()
{
 return average;
}
//獲取學生的專業(yè)成績
void Csstudent::get_scores(double* c_c,double*c_a,double *ass)
{
 *c_c=c_composition;
 *c_a=c_architecture;
 *ass=assembly_lan;
}
//將學生信息打印到屏幕上
void Csstudent::display_info()
{
 Student::display_info();
 cout<<c_composition<<'\t'<<c_architecture<<'\t'<<assembly_lan<<'\t'<<average<<endl;
}
//將學生信息保存到文件中
void Csstudent::save_node(ofstream& fout)
{
 Student::save_node(fout);
 fout<<c_composition<<' '<<c_architecture<<' '<<assembly_lan<<endl;
}

enstudent.h

#ifndef _ENSTUDENT_H
#define _ENSTUDENT_H
#include<iostream>
#include<cstring>
#include<sstream>
#include<fstream>
#include"student.h"
using namespace std;
class Enstudent:public Student
{
public:
 Enstudent(){}//不含參數(shù)的構造函數(shù)
 //帶初始化列表的構造函數(shù)
 Enstudent(string _name,string _stuID,int _age,string _department,double _math,double _english,double _pe,double c_e,double s_e):
 Student(_name,_stuID,_age,_department,_math,_english,_pe)
 {
 comprehensive_en=c_e;
 spoken_en=s_e;
 }

 virtual ~Enstudent(){}//析構函數(shù)
public:
 //設置學生信息相關函數(shù)
 virtual void count_sum();//計算總分
 virtual void count_average();//計算平均分

 //獲取學生信息相關函數(shù)
 virtual double get_sum();//獲得總分
 virtual double get_average();//獲得平均分
 virtual void get_scores(double* c_e,double* s_e,double* no);//獲得學生的專業(yè)成績
public:
 virtual void display_info();//將學生信息打印到屏幕上
 virtual void save_node(ofstream& fout);//將學生信息保存到文件中
private:
 double sum;//全部科目的總分
 double average;//全部科目的平均分
 double comprehensive_en;//綜合英語成績
 double spoken_en;//口語成績
};
#endif
(八)enstudent.cpp
#include<iostream>
#include<cstring>
#include<sstream>
#include<fstream>
#include"student.h"
#include"enstudent.h"

//計算所有科目的總分
void Enstudent::count_sum()
{
 double part=Student::get_sum();
 sum=part+comprehensive_en+spoken_en;
}
//計算全部科目的平均分
void Enstudent::count_average()
{
 average=sum/5;
}

//獲得學生全部科目的總分
double Enstudent::get_sum()
{
 return sum;
}
//獲得學生全部科目的平均分
double Enstudent::get_average()
{
 return average;
}
//獲得學生的專業(yè)成績
void Enstudent::get_scores(double* c_e,double* s_e,double* no)
{
 *c_e=comprehensive_en;
 *s_e=spoken_en;
}
//將學生信息打印到屏幕上
void Enstudent::display_info()
{
 Student::display_info();
 cout<<comprehensive_en<<'\t'<<spoken_en<<"\t\t"<<average<<endl;
}
//將學生信息保存到文件中
void Enstudent::save_node(ofstream& fout)
{
 Student::save_node(fout);
 fout<<comprehensive_en<<' '<<spoken_en<<endl;
}

mstudent.h

#ifndef _MSTUDENT_H
#define _MSTUDENT_H
#include<iostream>
#include<cstring>
#include<sstream>
#include<fstream>
#include"student.h"
using namespace std;
class Mstudent:public Student
{
public:
 Mstudent(){}//不含參數(shù)的構造函數(shù)
 //帶初始化列表的構造函數(shù)
 Mstudent(string _name,string _stuID,int _age,string _department,double _math,double _english,double _pe,double r_f,double f_a,double d_g):
 Student(_name,_stuID,_age,_department,_math,_english,_pe)
 {
 real_variable_f=r_f;
 f_analysis=f_a;
 diff_geometry=d_g;
 }

 virtual ~Mstudent(){}//析構函數(shù)
public:
 //設置學生信息相關函數(shù)
 virtual void count_sum();//計算總分
 virtual void count_average();//計算平均分

 //獲取學生信息相關函數(shù)
 virtual double get_sum();//獲得總分
 virtual double get_average();//獲得平均分
 virtual void get_scores(double* r_f,double* f_a,double* d_g);//獲得學生的專業(yè)成績
public:
 virtual void display_info();//將學生信息打印到屏幕上
 virtual void save_node(ofstream& fout);//將學生信息保存到文件中
private:
 double sum;//全部科目的總分
 double average;//全部科目的平均分
 double real_variable_f;//實變函數(shù)成績
 double f_analysis;//泛函分析成績
 double diff_geometry;//微分幾何成績
};
#endif

mstudent.cpp

#include<iostream>
#include<cstring>
#include<sstream>
#include<fstream>
#include"student.h"
#include"mstudent.h"
//設置所有科目的總分

//計算所有科目的總分
void Mstudent::count_sum()
{
 double part=Student::get_sum();
 sum=part+real_variable_f+f_analysis+diff_geometry;
}
//計算全部科目的平均分
void Mstudent::count_average()
{
 average=sum/6;
}

//獲得學生全部科目的總分
double Mstudent::get_sum()
{
 return sum;
}
//獲得學生全部科目的平均分
double Mstudent::get_average()
{
 return average;
}
//獲得學生的專業(yè)成績
void Mstudent::get_scores(double* r_f,double* f_a,double* d_g)
{
 *r_f=real_variable_f;
 *f_a=f_analysis;
 *d_g=diff_geometry;
}
//將學生信息打印到屏幕上
void Mstudent::display_info()
{
 Student::display_info();
 cout<<real_variable_f<<'\t'<<f_analysis<<'\t'<<diff_geometry<<'\t'<<average<<endl;
}
 
//將學生信息保存到文件中
void Mstudent::save_node(ofstream& fout)
{
 Student::save_node(fout);
 fout<<real_variable_f<<' '<<f_analysis<<' '<<diff_geometry<<endl;
}

list.h

#ifndef _LIST_H
#define _LIST_H
#include<iostream>
#include"student.h"
#include"csstudent.h"
#include"enstudent.h"
#include"mstudent.h"
using namespace std;
class List
{
public:
 List(){}//無參數(shù)構造函數(shù)
public:
 void input_info();//從文件導入學生信息,保存到鏈表中
 void output_info();//將鏈表中的數(shù)據(jù)打印到屏幕上
 void count_sub_avg();//計算各個科目的平均分
public:
 void search_by_ID();//根據(jù)學號查找學生信息
 void search_by_name();//根據(jù)姓名查找學生信息
public:
 void sort_by_public();//根據(jù)專業(yè)課成績平均分進行排序
 void sort_by_all();//根據(jù)學生所有科目的平均分進行排序
public:
 void add_info();//增加學生信息
 void delete_info();//刪除指定學生的信息
 //void modify_info();//修改學生信息
public:
 void save_list();//將鏈表保存到文件中
 void delete_list();//銷毀鏈表

private:
 List *pHead;//鏈表的頭指針
 Student *data;//指向?qū)W生信息的指針
 List *pNext;//指向下一個結點的指針
};
 
#endif // _LIST_H

(十二)list.cpp

#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<stdio.h>
#include<sstream>
#include"list.h"
#include"student.h"
#include"csstudent.h"
#include"enstudent.h"
#include"mstudent.h"
using namespace std;

//從文件導入學生信息,保存到鏈表中
void List::input_info()
{
 int num=0;//學生的編號
 string stuID;//學生的學號
 string name;//學生的姓名
 int age;//學生的年齡
 string department;//學生所屬學院

 double math;//高數(shù)成績
 double english;//英語成績
 double pe;//體育成績

 double c_c;//計算機組成原理成績
 double c_a;//計算機體系結構成績
 double ass;//匯編語言成績

 double c_e;//綜合英語成績
 double s_e;//口語成績

 double r_f;//實變函數(shù)成績
 double f_a;//泛函分析成績
 double d_g;//微分幾何成績

 List *current=NULL;//指向當前結點的指針
 List *previous=NULL;//指向前一個結點的指針
 ifstream fin;
 fin.open("student.txt",ios::in);
 if(!fin)
 {
 cout<<"Fail to open the file!"<<endl;
 exit(0);
 }
 //創(chuàng)建鏈表
 while(1)
 {
 //判斷是否讀完文件
 if(!(fin>>name>>stuID>>age>>department>>math>>english>>pe))
 break;
 else
 {
 ++num;
 //根據(jù)不同專業(yè)的學生 new 不同的對象,根據(jù)不同院系設置各科分數(shù)
 if(department=="計算機")
 {
 current=new List;//創(chuàng)建新結點
 fin>>c_c>>c_a>>ass;
 current->data=new Csstudent(name,stuID,age,department,math,english,pe,c_c,c_a,ass);
 }
 else if(department=="英語系")
 {
 current=new List;//創(chuàng)建新結點
 fin>>c_e>>s_e;
 current->data=new Enstudent(name,stuID,age,department,math,english,pe,c_e,s_e);
 }
 else if(department=="數(shù)學系")
 {
 current=new List;//創(chuàng)建新結點
 fin>>r_f>>f_a>>d_g;
 current->data=new Mstudent(name,stuID,age,department,math,english,pe,r_f,f_a,d_g);
 }
 else
 {
 cout<<"Don't have this department"<<endl;
 exit(0);
 }
 }

 if(previous==NULL)
 pHead=current;//保存頭結點
 if(previous!=NULL)
 previous->pNext=current;//保存前一個結點的地址

 current->data->set_num(num);
 current->data->Student::count_sum();//計算公共科目的總分
 current->data->Student::count_average();//計算公共科目的平均分
 current->data->count_sum();//計算全部科目的總分
 current->data->count_average();//計算全部科目的平均分

 current->pNext=NULL;
 previous=current;
 }
 fin.close();//關閉文件
}
//將鏈表中的數(shù)據(jù)打印到屏幕上
void List::output_info()
{
 List *p=pHead;//保存頭節(jié)點
 int num=0;//設置編號
 cout<<"編號\t"<<"姓名\t"<<"學號\t"<<"年齡\t"<<"系別\t\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"平均分\t"<<"專業(yè)課1\t"<<"專業(yè)課2\t"<<"專業(yè)課3\t"<<"平均分\t"<<endl;
 while(p!=NULL)
 {
 ++num;
 p->data->set_num(num);
 p->data->display_info();
 p=p->pNext;
 }
}
//計算各個科目的平均分
void List::count_sub_avg()
{
 string stuID;//學生的學號
 string department;//學生所屬學院

 double math,english,pe;//高數(shù)成績,英語成績,體育成績
 double math_sum=0,english_sum=0,pe_sum=0;//高數(shù)、英語、體育總分
 double math_avg,english_avg,pe_avg;//高數(shù)、英語、體育平均分

 double c_c,c_a,ass;//計算機組成原理成績,計算機體系結構成績,匯編語言成績
 double c_c_sum=0,c_a_sum=0,ass_sum=0;//計算機組成原理成績,計算機體系結構成績,匯編語言總分
 double c_c_avg,c_a_avg,ass_avg;//計算機組成原理成績,計算機體系結構成績,匯編語言平均分

 double c_e,s_e;//綜合英語成績,口語成績
 double c_e_sum=0,s_e_sum=0;//綜合英語成績,口語總分
 double c_e_avg,s_e_avg;//綜合英語成績,口語平均分

 double r_f,f_a,d_g;//實變函數(shù)成績,泛函分析成績,微分幾何成績
 double r_f_sum=0,f_a_sum=0,d_g_sum=0;//實變函數(shù)成績,泛函分析成績,微分幾何成績總分
 double r_f_avg,f_a_avg,d_g_avg;//實變函數(shù)成績,泛函分析成績,微分幾何成績平均分

 int n=0;//記錄所有學生的數(shù)量
 int cn=0;//記錄計算機系的學生數(shù)量
 int en=0;//記錄英語系的學生數(shù)量
 int mn=0;//記錄數(shù)學系的學生數(shù)量

 List* p=pHead;
 while(p!=NULL)
 {
 ++n;
 department=p->data->get_department();
 p->data->Student::get_scores(&math,&english,&pe);
 math_sum+=math;
 english_sum+=english;
 pe_sum+=pe;
 if(department=="計算機")
 {
 p->data->get_scores(&c_c,&c_a,&ass);
 c_c_sum+=c_c;
 c_a_sum+=c_a;
 ass_sum+=ass;
 ++cn;
 }
 else if(department=="英語系")
 {
 p->data->get_scores(&c_e,&s_e,NULL);
 c_e_sum+=c_e;
 s_e_sum+=s_e;
 ++en;
 }
 else if(department=="數(shù)學系")
 {
 p->data->get_scores(&r_f,&f_a,&d_g);
 r_f_sum+=r_f;
 f_a_sum+=f_a;
 d_g_sum+=d_g;
 ++mn;
 }
 else
 {
 cout<<"Don't have this department!"<<endl;
 exit(0);
 }
 p=p->pNext;
 }
 math_avg=math_sum/n;//數(shù)學平均成績
 english_avg=english_sum/n;
 pe_avg=pe_sum/n;

 c_c_avg=c_c_sum/cn;
 c_a_avg=c_a_sum/cn;
 ass_avg=ass_sum/cn;

 c_e_avg=c_e_sum/en;
 s_e_avg=s_e_sum/en;

 r_f_avg=r_f_sum/mn;
 f_a_avg=f_a_sum/mn;
 d_g_avg=d_g_sum/mn;
 cout<<"公共課平均成績:"<<endl;
 cout<<"數(shù)學\t"<<"英語\t"<<"體育"<<endl;
 cout<<math_avg<<'\t'<<english_avg<<'\t'<<pe_avg<<endl<<endl;

 cout<<"計算機系專業(yè)課平均成績:"<<endl;
 cout<<"計算機組成原理:"<<c_c_avg<<endl;
 cout<<"計算機體系結構:"<<c_a_avg<<endl;
 cout<<"匯編語言:"<<ass_avg<<endl<<endl;

 cout<<"數(shù)學系專業(yè)課平均成績:"<<endl;
 cout<<"實變函數(shù):"<<r_f_avg<<endl;
 cout<<"泛函分析:"<<f_a_avg<<endl;
 cout<<"微分幾何:"<<d_g_avg<<endl<<endl;

 cout<<"英語系專業(yè)課平均成績:"<<endl;
 cout<<"綜合英語:"<<c_e_avg<<endl;
 cout<<"英語口語:"<<s_e_avg<<endl;
}
//根據(jù)學號查找學生信息
void List::search_by_ID()
{
 List *p=pHead;//保存頭節(jié)點
 int flag=0;//用來標記是否找到對應的學生
 string ID;//保存學生的學號
 cout<<"請輸入你要查詢的學生的學號:";
 cin>>ID;
 cout<<"編號\t"<<"姓名\t"<<"學號\t"<<"年齡\t"<<"系別\t\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"平均分\t"<<"專業(yè)課1\t"<<"專業(yè)課2\t"<<"專業(yè)課3\t"<<"平均分\t"<<endl;
 while(p!=NULL)
 {
 if(ID==p->data->get_stuID())
 {
 ++flag;
 p->data->display_info();
 break;
 }
 p=p->pNext;
 }
 if(flag==0)
 cout<<"Can't find this student!"<<endl;
}
//根據(jù)姓名查找學生信息
void List::search_by_name()
{
 List *p=pHead;//保存頭節(jié)點
 int flag=0;//用來標記是否找到對應的學生
 string name;//保存學生的學號
 cout<<"請輸入你要查詢的學生的姓名:";
 cin>>name;
 cout<<"編號\t"<<"姓名\t"<<"學號\t"<<"年齡\t"<<"系別\t\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"平均分\t"<<"專業(yè)課1\t"<<"專業(yè)課2\t"<<"專業(yè)課3\t"<<"平均分\t"<<endl;
 while(p!=NULL)
 {
 if(name==p->data->get_name())
 {
 ++flag;
 p->data->display_info();
 break;
 }
 p=p->pNext;
 }
 if(flag==0)
 cout<<"Can't find this student!"<<endl;
}

//根據(jù)公共課成績平均分進行降序排序
void List::sort_by_public()
{
 List *p=NULL;
 List *q=NULL;
 double avg1,avg2;
 for(p=pHead;p->pNext!=NULL;p=p->pNext)
 for(q=p->pNext;q!=NULL;q=q->pNext)
 {
 avg1=p->data->Student::get_average();//調(diào)用基類的函數(shù)得到學生公共課的平均成績
 avg2=q->data->Student::get_average();
 if(avg1<avg2)
 {
 List temp;//臨時結點對象
 temp.data=p->data;
 p->data=q->data;
 q->data=temp.data;
 }
 }
}
//根據(jù)學生所有科目的平均分進行排序
void List::sort_by_all()
{
 List *p=NULL;
 List *q=NULL;
 double avg1,avg2;
 for(p=pHead;p->pNext!=NULL;p=p->pNext)
 for(q=p->pNext;q!=NULL;q=q->pNext)
 {
 avg1=p->data->get_average();//調(diào)用派生類的函數(shù),得到學生所有科目的平均分
 avg2=q->data->get_average();
 if(avg1<avg2)
 {
 List temp;//臨時結點對象
 temp.data=p->data;
 p->data=q->data;
 q->data=temp.data;
 }
 }
}
//增加學生信息
void List::add_info()
{
 int num=0;//學生的編號
 string stuID;//學生的學號
 string name;//學生的姓名
 int age;//學生的年齡
 string department;//學生所屬學院

 double math;//高數(shù)成績
 double english;//英語成績
 double pe;//體育成績

 double c_c;//計算機組成原理成績
 double c_a;//計算機體系結構成績
 double ass;//匯編語言成績

 double c_e;//綜合英語成績
 double s_e;//口語成績

 double r_f;//實變函數(shù)成績
 double f_a;//泛函分析成績
 double d_g;//微分幾何成績

 int location=0;//位置編號
 int flag=0;//標記是否有對應的編號

 List *p=pHead;//指向當前結點的指針
 List *pf=NULL;//指向前一個結點的指針
 List *new_node;//指向新增結點的指針
 cout<<"請輸入你想增加的信息的位置(位置編號,大于0):";
 cin>>location;

 while(p!=NULL)//遍歷鏈表
 {
 num=p->data->get_num();
 if(num==location)
 {
 ++flag;

 cout<<"請輸入新增學生所屬系別(計算機/英語系/數(shù)學系):";
 cin>>department;
 cout<<"請輸入學生的信息"<<endl;
 if(department=="計算機")
 {
 new_node=new List;//創(chuàng)建一個新的結點
 cout<<"姓名\t"<<"學號\t"<<"年齡\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"計算機組成原理\t"<<"計算機體系結構\t"<<"匯編語言\t"<<endl;
 cin>>name>>stuID>>age>>math>>english>>pe>>c_c>>c_a>>ass;
 new_node->data=new Csstudent(name,stuID,age,department,math,english,pe,c_c,c_a,ass);
 }
 else if(department=="英語系")
 {
 new_node=new List;//創(chuàng)建一個新的結點
 cout<<"姓名\t"<<"學號\t"<<"年齡\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"綜合英語\t"<<"口語\t"<<endl;
 cin>>name>>stuID>>age>>math>>english>>pe>>c_e>>s_e;
 new_node->data=new Enstudent(name,stuID,age,department,math,english,pe,c_e,s_e);
 }
 else if(department=="數(shù)學系")
 {
 new_node=new List;//創(chuàng)建一個新的結點
 cout<<"姓名\t"<<"學號\t"<<"年齡\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"實變函數(shù)\t"<<"泛函分析\t"<<"微分幾何\t"<<endl;
 cin>>name>>stuID>>age>>math>>english>>pe>>r_f>>f_a>>d_g;
 new_node->data=new Mstudent(name,stuID,age,department,math,english,pe,r_f,f_a,d_g);
 }
 else
 {
 cout<<"Don't have this department!"<<endl;
 exit(0);
 }
 new_node->data->Student::count_sum();//計算公共科目的總分
 new_node->data->Student::count_average();//計算公共科目的平均分
 new_node->data->count_sum();//計算全部科目的總分
 new_node->data->count_average();//計算全部科目的平均分

 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<<"請輸入新增學生所屬系別(計算機/英語系/數(shù)學系):";
 cin>>department;
 cout<<"請輸入學生的信息"<<endl;
 if(department=="計算機")
 {
 new_node=new List;//創(chuàng)建一個新的結點
 cout<<"姓名\t"<<"學號\t"<<"年齡\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"計算機組成原理\t"<<"計算機體系結構\t"<<"匯編語言\t"<<endl;
 cin>>name>>stuID>>age>>math>>english>>pe>>c_c>>c_a>>ass;
 new_node->data=new Csstudent(name,stuID,age,department,math,english,pe,c_c,c_a,ass);
 }
 else if(department=="英語系")
 {
 new_node=new List;//創(chuàng)建一個新的結點
 cout<<"姓名\t"<<"學號\t"<<"年齡\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"綜合英語\t"<<"口語\t"<<endl;
 cin>>name>>stuID>>age>>math>>english>>pe>>c_e>>s_e;
 new_node->data=new Enstudent(name,stuID,age,department,math,english,pe,c_e,s_e);
 }
 else if(department=="數(shù)學系")
 {
 new_node=new List;//創(chuàng)建一個新的結點
 cout<<"姓名\t"<<"學號\t"<<"年齡\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"實變函數(shù)\t"<<"泛函分析\t"<<"微分幾何\t"<<endl;
 cin>>name>>stuID>>age>>math>>english>>pe>>r_f>>f_a>>d_g;
 new_node->data=new Mstudent(name,stuID,age,department,math,english,pe,r_f,f_a,d_g);
 }
 else
 {
 cout<<"Don't have this department!"<<endl;
 exit(0);
 }
 new_node->data->Student::count_sum();//計算公共科目的總分
 new_node->data->Student::count_average();//計算公共科目的平均分
 new_node->data->count_sum();//計算全部科目的總分
 new_node->data->count_average();//計算全部科目的平均分

 pf->pNext=new_node;
 new_node->pNext=NULL;
 }
}
//刪除指定學生的信息
void List::delete_info()
{
 string name;//姓名
 string stuID;//學號

 List *p=pHead;//指向當前結點的指針
 List *pf=NULL;//指向前一個結點的指針

 char content[20];
 cout<<"請輸入信息待刪除學生的姓名或?qū)W號:";
 cin>>content;

 //根據(jù)輸入來進行查找并刪除
 if(content[0]>='0'&&content[0]<='9')
 {
 int flag=0;//標記是否找到對應學生;
 string ID=content;
 char answer;//記錄回答的內(nèi)容

 while(p!=NULL)
 {
 stuID=p->data->get_stuID();
 if(stuID==ID)
 {
 flag++;
 cout<<"編號\t"<<"姓名\t"<<"學號\t"<<"年齡\t"<<"系別\t\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"平均分\t"<<"專業(yè)課1\t"<<"專業(yè)課2\t"<<"專業(yè)課3\t"<<"平均分\t"<<endl;
 p->data->display_info();

 cout<<"你確定要刪除這組信息嗎?(Y/N)";
 cin>>answer;
 if(tolower(answer)=='y')
 {
  if(pf==NULL)
  {
  delete p->data;//刪除學生信息所占內(nèi)存
  List *temp=p;//暫時保存指向該結點的指針
  pHead=p->pNext;//跳過當前結點,實現(xiàn)信息的刪除
  delete temp;//將其所占內(nèi)存刪除
  }
  else
  {
  delete p->data;//刪除學生信息所占內(nèi)存
  List *temp=p;//暫時保存指向該結點的指針
  pf->pNext=p->pNext;//跳過當前結點,實現(xiàn)信息的刪除
  delete temp;//將其所占內(nèi)存刪除
  }
  cout<<"\t該組信息已刪除!"<<endl;
  break;
 }
 else
 {
  break;
 }
 }
 pf=p;//保存當前指針
 p=p->pNext;//設置指針指向下一個結點
 }
 if(flag==0)
 cout<<"沒有找到該學生!"<<endl;
 }
 else
 {
 int flag=0;//標記是否找到對應學生;
 string na=content;//將字符串數(shù)組轉(zhuǎn)化成string類型
 char answer;//記錄回答的內(nèi)容

 while(p!=NULL)
 {
 //++n;
 name=p->data->get_name();
 if(name==na)
 {
 flag++;
 cout<<"編號\t"<<"姓名\t"<<"學號\t"<<"年齡\t"<<"系別\t\t"<<"數(shù)學\t"<<"英語\t"<<"體育\t"<<"平均分\t"<<"專業(yè)課1\t"<<"專業(yè)課2\t"<<"專業(yè)課3\t"<<"平均分\t"<<endl;
 p->data->display_info();

 cout<<"你確定要刪除這組信息嗎?(Y/N)";
 cin>>answer;
 if(tolower(answer)=='y')
 {
  if(pf==NULL)
  {
  delete p->data;//刪除學生信息所占內(nèi)存
  List *temp=p;//暫時保存指向該結點的指針
  pHead=p->pNext;//跳過當前結點,實現(xiàn)信息的刪除
  delete temp;//將其所占內(nèi)存刪除
  }
  else
  {
  delete p->data;//刪除學生信息所占內(nèi)存
  List *temp=p;//暫時保存指向該結點的指針
  pf->pNext=p->pNext;//跳過當前結點,實現(xiàn)信息的刪除
  delete temp;//將其所占內(nèi)存刪除
  }

  cout<<"\t該組信息已刪除!"<<endl;
  break;
 }
 else
 {
  break;
 }
 }
 pf=p;//保存當前指針
 p=p->pNext;//設置指針指向下一個結點
 }
 if(flag==0)
 cout<<"沒有找到該學生!"<<endl;
 }
}
//將鏈表保存到文件中
void List::save_list()
{
 List *p=pHead;//用來遍歷鏈表的指針
 ofstream fout;
 fout.open("student.txt",ios::out);
 while(p!=NULL)
 {
 p->data->save_node(fout);
 p=p->pNext;
 }
 fout.close();//關閉文件
}
//銷毀鏈表
void List::delete_list()
{
 List *p=pHead;
 List *pt;
 while(p!=NULL)
 {
 pt=p;
 p=p->pNext;
 delete pt->data;//刪除學生信息所占內(nèi)存
 delete pt;//刪除鏈表結點所占內(nèi)存
 }
 pt=NULL;
 pHead=NULL;
 p=NULL;
}

student.txt

小王 02 18 英語系 78 79 80 68 89
小趙 01 19 計算機 90 90 90 89 89 89
小張 03 19 數(shù)學系 78 89 69 89 90 60
小劉 04 20 英語系 89 79 79 80 89
小李 05 19 計算機 69 60 67 89 90 90
小田 06 21 數(shù)學系 89 90 90 78 89 90

感謝各位的閱讀!看完上述內(nèi)容,你們對C++實現(xiàn)學生信息管理系統(tǒng)的方法大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關文章內(nèi)容,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI