C++实现学生信息管理系统

来自:互联网
时间:2020-12-10
阅读:

C++的课设作业,分享出来,希望给初学者一些帮助。

该系统主要用到C++的继承,虚函数。所有学生的信息保存在一个异质链表中,并且链表也进行了封装

课设题目

设计一个学生管理系统,要求如下:

1、学生来自英语系,数学系、计算机系:

a) 每个学生的公共信息部分包括:学号、姓名、年龄、系别,高数成绩、英语成绩、体育成绩;
b) 英语系学生有综合英语、口语等课程成绩;
c) 数学系学生有实变函数、泛函分析、微分几何等课程成绩;
d) 计算机系学生有计算机组成原理、计算机体系结构、汇编语言等课程成绩。

每个学生可以查询相应信息(学号、姓名、年龄、系别及成绩信息);可以查询各门课程的平均成绩。
用类及类的派生实现上述功能,要求使用类的继承、虚函数、虚基类的C++语言特性;要求每个类采用不同的方式实现构造函数;

2、设计一个学生管理类,其中包含可变学生数目,要求实现:

1)初始化,所有学生的信息组织以链表方式实现;
2)实现指定学生的信息查询(如利用学号、姓名等方式);
3)按照公共课平均成绩排序;
4)按照学生所有课程的平均成绩排序;
5)增加学生;
6)删除指定学生。

3、注意构造函数和析构函数的实现方式。每个类的申明需放在单独的头文件中(即一个类的申明放在一个后缀名为h的文件中),每个类的实现放在一个单独的cpp文件中。测试程序(即包含main函数的程序)单独放在一个cpp文件中。

整体分析

根据题目要求该学生信息管理系统可分为五个功能模块:

1、 信息读取及输出功能:从文件中读取学生信息
将学生信息打印到屏幕上

2、 信息维护功能:增加学生信息
删除学生信息

3、 信息查询功能:根据学号查询学生信息
根据姓名查询学生信息

4、 成绩统计功能:计算各学科的平均分

5、 排序功能:按照公共课平均成绩进行排序
按照全部课程的平均成绩进行排序
为实现以上功能,使用了类的继承,虚函数的C++语言特性

共使用五个类:

1、 Student类:包含学生共同信息的类,共派生出三个类
2、 Csstudent类:计算机系学生类,由Student类派生而来
3、 Enstudent类:英语系学生类,由Student类派生而来
4、Mstudent类:数学系学生类,由Student类派生而来
4、 List类:链表类,包含对学生信息链表的各种操作

共使用到13个文件:<

1、 menu.cpp:内含多个创建菜单函数,用于实现不同模块的功能显示
2、 main.cpp:调用所有的函数,并进行适当的组合实现完整的学生成绩管理系统
3、 student.h:包含用于保存学生公共信息及相关操作函数的Student类
4、 student.cpp:包含Student类的成员函数的实现
5、 csstudent.h:包含用于保存计算机系学生信息及相关操作的Csstudent类
6、 csstudent.cpp:包含Csstudent类的成员函数的实现
7、 enstudent.h:包含用于保存英语系学生信息及相关操作的Enstudent类
8、 enstudent.cpp:包含Enstudent类的成员函数的实现
9、 mstudent.h:包含用于保存数学系学生信息及相关操作的Mstudent类
10、 mstudent.cpp:包含Mstudent类的成员函数的实现
11、 list.h:包含用于操作学生信息的的List类
12、 list.cpp:包含List类的成员函数的实现
13、 student.txt:包含学生的全部信息

多个类的继承关系图如下:

C++实现学生信息管理系统

源代码

main.cpp

#include<iostream>
using namespace std;
//主界面
void menu()
{
 cout<<"\n\n\t\t----------------学生成绩管理系统------------------"<<endl<<endl;
 cout<<"\t\t1、信息维护功能"<<" "<<"\t2、信息查询功能"<<endl<<endl;
 cout<<"\t\t3、成绩统计功能"<<" "<<"\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;
}

//成绩统计功能界面
void menu3()
{
 cout<<"\n\n\t\t成绩统计功能"<<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、根据公共课平均成绩排序"<<endl<<endl;
 cout<<"\t\t2、根据全部科目平均成绩排序"<<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;

 //成绩统计功能
 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)
  {
  //根据公共课平均成绩排序
  case 1:
  pHead.sort_by_public();
  pHead.output_info();
  cout<<endl;
  system("pause");
  break;
  case 2:
  //根据全部科目平均成绩排序
  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;//高数成绩
 double english;//英语成绩
 double PE;//体育成绩
 double sum_part;//总分
 double average_part;//公共成绩的平均分
public:
 Student(){}//无参数的构造函数
 Student(string _name,string _stuID,int _age,string _department,double _math,double _english,double _pe);//含参数的构造函数
 Student(const Student& stu);//拷贝构造函数
 virtual ~Student(){}//析构函数
public:
 //设置学生信息相关函数
 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();//计算公共科目的平均分

 //获取学生信息相关函数
 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;
//含参数的构造函数
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;
}
//拷贝构造函数
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(){}//无参数的构造函数
 //带初始化列表的构造函数
 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(){}//析构函数
public:
 //设置学生信息相关函数
 virtual void count_sum();//计算总分
 virtual void count_average();//计算平均分

 //获取学生信息相关函数
 virtual double get_sum();//获得总分
 virtual double get_average();//获得平均分
 virtual void get_scores(double* c_c,double*c_a,double *ass);//获取学生的专业成绩
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;
}
//获取学生的专业成绩
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(){}//不含参数的构造函数
 //带初始化列表的构造函数
 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(){}//析构函数
public:
 //设置学生信息相关函数
 virtual void count_sum();//计算总分
 virtual void count_average();//计算平均分

 //获取学生信息相关函数
 virtual double get_sum();//获得总分
 virtual double get_average();//获得平均分
 virtual void get_scores(double* c_e,double* s_e,double* no);//获得学生的专业成绩
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;
}
//获得学生的专业成绩
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(){}//不含参数的构造函数
 //带初始化列表的构造函数
 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(){}//析构函数
public:
 //设置学生信息相关函数
 virtual void count_sum();//计算总分
 virtual void count_average();//计算平均分

 //获取学生信息相关函数
 virtual double get_sum();//获得总分
 virtual double get_average();//获得平均分
 virtual void get_scores(double* r_f,double* f_a,double* d_g);//获得学生的专业成绩
public:
 virtual void display_info();//将学生信息打印到屏幕上
 virtual void save_node(ofstream& fout);//将学生信息保存到文件中
private:
 double sum;//全部科目的总分
 double average;//全部科目的平均分
 double real_variable_f;//实变函数成绩
 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;
}
//获得学生的专业成绩
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(){}//无参数构造函数
public:
 void input_info();//从文件导入学生信息,保存到链表中
 void output_info();//将链表中的数据打印到屏幕上
 void count_sub_avg();//计算各个科目的平均分
public:
 void search_by_ID();//根据学号查找学生信息
 void search_by_name();//根据姓名查找学生信息
public:
 void sort_by_public();//根据专业课成绩平均分进行排序
 void sort_by_all();//根据学生所有科目的平均分进行排序
public:
 void add_info();//增加学生信息
 void delete_info();//删除指定学生的信息
 //void modify_info();//修改学生信息
public:
 void save_list();//将链表保存到文件中
 void delete_list();//销毁链表

private:
 List *pHead;//链表的头指针
 Student *data;//指向学生信息的指针
 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;//高数成绩
 double english;//英语成绩
 double pe;//体育成绩

 double c_c;//计算机组成原理成绩
 double c_a;//计算机体系结构成绩
 double ass;//汇编语言成绩

 double c_e;//综合英语成绩
 double s_e;//口语成绩

 double r_f;//实变函数成绩
 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);
 }
 //创建链表
 while(1)
 {
 //判断是否读完文件
 if(!(fin>>name>>stuID>>age>>department>>math>>english>>pe))
 break;
 else
 {
 ++num;
 //根据不同专业的学生 new 不同的对象,根据不同院系设置各科分数
 if(department=="计算机")
 {
 current=new List;//创建新结点
 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;//创建新结点
 fin>>c_e>>s_e;
 current->data=new Enstudent(name,stuID,age,department,math,english,pe,c_e,s_e);
 }
 else if(department=="数学系")
 {
 current=new List;//创建新结点
 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();//关闭文件
}
//将链表中的数据打印到屏幕上
void List::output_info()
{
 List *p=pHead;//保存头节点
 int num=0;//设置编号
 cout<<"编号\t"<<"姓名\t"<<"学号\t"<<"年龄\t"<<"系别\t\t"<<"数学\t"<<"英语\t"<<"体育\t"<<"平均分\t"<<"专业课1\t"<<"专业课2\t"<<"专业课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;//高数成绩,英语成绩,体育成绩
 double math_sum=0,english_sum=0,pe_sum=0;//高数、英语、体育总分
 double math_avg,english_avg,pe_avg;//高数、英语、体育平均分

 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;//实变函数成绩,泛函分析成绩,微分几何成绩
 double r_f_sum=0,f_a_sum=0,d_g_sum=0;//实变函数成绩,泛函分析成绩,微分几何成绩总分
 double r_f_avg,f_a_avg,d_g_avg;//实变函数成绩,泛函分析成绩,微分几何成绩平均分

 int n=0;//记录所有学生的数量
 int cn=0;//记录计算机系的学生数量
 int en=0;//记录英语系的学生数量
 int mn=0;//记录数学系的学生数量

 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=="数学系")
 {
 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;//数学平均成绩
 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<<"数学\t"<<"英语\t"<<"体育"<<endl;
 cout<<math_avg<<'\t'<<english_avg<<'\t'<<pe_avg<<endl<<endl;

 cout<<"计算机系专业课平均成绩:"<<endl;
 cout<<"计算机组成原理:"<<c_c_avg<<endl;
 cout<<"计算机体系结构:"<<c_a_avg<<endl;
 cout<<"汇编语言:"<<ass_avg<<endl<<endl;

 cout<<"数学系专业课平均成绩:"<<endl;
 cout<<"实变函数:"<<r_f_avg<<endl;
 cout<<"泛函分析:"<<f_a_avg<<endl;
 cout<<"微分几何:"<<d_g_avg<<endl<<endl;

 cout<<"英语系专业课平均成绩:"<<endl;
 cout<<"综合英语:"<<c_e_avg<<endl;
 cout<<"英语口语:"<<s_e_avg<<endl;
}
//根据学号查找学生信息
void List::search_by_ID()
{
 List *p=pHead;//保存头节点
 int flag=0;//用来标记是否找到对应的学生
 string ID;//保存学生的学号
 cout<<"请输入你要查询的学生的学号:";
 cin>>ID;
 cout<<"编号\t"<<"姓名\t"<<"学号\t"<<"年龄\t"<<"系别\t\t"<<"数学\t"<<"英语\t"<<"体育\t"<<"平均分\t"<<"专业课1\t"<<"专业课2\t"<<"专业课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;
}
//根据姓名查找学生信息
void List::search_by_name()
{
 List *p=pHead;//保存头节点
 int flag=0;//用来标记是否找到对应的学生
 string name;//保存学生的学号
 cout<<"请输入你要查询的学生的姓名:";
 cin>>name;
 cout<<"编号\t"<<"姓名\t"<<"学号\t"<<"年龄\t"<<"系别\t\t"<<"数学\t"<<"英语\t"<<"体育\t"<<"平均分\t"<<"专业课1\t"<<"专业课2\t"<<"专业课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;
}

//根据公共课成绩平均分进行降序排序
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();//调用基类的函数得到学生公共课的平均成绩
 avg2=q->data->Student::get_average();
 if(avg1<avg2)
 {
 List temp;//临时结点对象
 temp.data=p->data;
 p->data=q->data;
 q->data=temp.data;
 }
 }
}
//根据学生所有科目的平均分进行排序
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();//调用派生类的函数,得到学生所有科目的平均分
 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;//高数成绩
 double english;//英语成绩
 double pe;//体育成绩

 double c_c;//计算机组成原理成绩
 double c_a;//计算机体系结构成绩
 double ass;//汇编语言成绩

 double c_e;//综合英语成绩
 double s_e;//口语成绩

 double r_f;//实变函数成绩
 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<<"请输入新增学生所属系别(计算机/英语系/数学系):";
 cin>>department;
 cout<<"请输入学生的信息"<<endl;
 if(department=="计算机")
 {
 new_node=new List;//创建一个新的结点
 cout<<"姓名\t"<<"学号\t"<<"年龄\t"<<"数学\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;//创建一个新的结点
 cout<<"姓名\t"<<"学号\t"<<"年龄\t"<<"数学\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=="数学系")
 {
 new_node=new List;//创建一个新的结点
 cout<<"姓名\t"<<"学号\t"<<"年龄\t"<<"数学\t"<<"英语\t"<<"体育\t"<<"实变函数\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<<"请输入新增学生所属系别(计算机/英语系/数学系):";
 cin>>department;
 cout<<"请输入学生的信息"<<endl;
 if(department=="计算机")
 {
 new_node=new List;//创建一个新的结点
 cout<<"姓名\t"<<"学号\t"<<"年龄\t"<<"数学\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;//创建一个新的结点
 cout<<"姓名\t"<<"学号\t"<<"年龄\t"<<"数学\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=="数学系")
 {
 new_node=new List;//创建一个新的结点
 cout<<"姓名\t"<<"学号\t"<<"年龄\t"<<"数学\t"<<"英语\t"<<"体育\t"<<"实变函数\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<<"请输入信息待删除学生的姓名或学号:";
 cin>>content;

 //根据输入来进行查找并删除
 if(content[0]>='0'&&content[0]<='9')
 {
 int flag=0;//标记是否找到对应学生;
 string ID=content;
 char answer;//记录回答的内容

 while(p!=NULL)
 {
 stuID=p->data->get_stuID();
 if(stuID==ID)
 {
 flag++;
 cout<<"编号\t"<<"姓名\t"<<"学号\t"<<"年龄\t"<<"系别\t\t"<<"数学\t"<<"英语\t"<<"体育\t"<<"平均分\t"<<"专业课1\t"<<"专业课2\t"<<"专业课3\t"<<"平均分\t"<<endl;
 p->data->display_info();

 cout<<"你确定要删除这组信息吗?(Y/N)";
 cin>>answer;
 if(tolower(answer)=='y')
 {
  if(pf==NULL)
  {
  delete p->data;//删除学生信息所占内存
  List *temp=p;//暂时保存指向该结点的指针
  pHead=p->pNext;//跳过当前结点,实现信息的删除
  delete temp;//将其所占内存删除
  }
  else
  {
  delete p->data;//删除学生信息所占内存
  List *temp=p;//暂时保存指向该结点的指针
  pf->pNext=p->pNext;//跳过当前结点,实现信息的删除
  delete temp;//将其所占内存删除
  }
  cout<<"\t该组信息已删除!"<<endl;
  break;
 }
 else
 {
  break;
 }
 }
 pf=p;//保存当前指针
 p=p->pNext;//设置指针指向下一个结点
 }
 if(flag==0)
 cout<<"没有找到该学生!"<<endl;
 }
 else
 {
 int flag=0;//标记是否找到对应学生;
 string na=content;//将字符串数组转化成string类型
 char answer;//记录回答的内容

 while(p!=NULL)
 {
 //++n;
 name=p->data->get_name();
 if(name==na)
 {
 flag++;
 cout<<"编号\t"<<"姓名\t"<<"学号\t"<<"年龄\t"<<"系别\t\t"<<"数学\t"<<"英语\t"<<"体育\t"<<"平均分\t"<<"专业课1\t"<<"专业课2\t"<<"专业课3\t"<<"平均分\t"<<endl;
 p->data->display_info();

 cout<<"你确定要删除这组信息吗?(Y/N)";
 cin>>answer;
 if(tolower(answer)=='y')
 {
  if(pf==NULL)
  {
  delete p->data;//删除学生信息所占内存
  List *temp=p;//暂时保存指向该结点的指针
  pHead=p->pNext;//跳过当前结点,实现信息的删除
  delete temp;//将其所占内存删除
  }
  else
  {
  delete p->data;//删除学生信息所占内存
  List *temp=p;//暂时保存指向该结点的指针
  pf->pNext=p->pNext;//跳过当前结点,实现信息的删除
  delete temp;//将其所占内存删除
  }

  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;//删除学生信息所占内存
 delete pt;//删除链表结点所占内存
 }
 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 数学系 78 89 69 89 90 60
小刘 04 20 英语系 89 79 79 80 89
小李 05 19 计算机 69 60 67 89 90 90
小田 06 21 数学系 89 90 90 78 89 90

如果程序无法运行,或有什么问题,欢迎在评论区留言.

返回顶部
顶部