/*Student.h*/
#pragma once #include<string.h> using namespace std; #include<string> class Student { public: //ID age name math english sport 专业 是子类都具有的 所以就在基类中声明 int ID; int age; string major = "1"; char name[20]; float math, english, sport; Student *next; //链表指针 //一下get函数 因为子类的专业不同 所以实现的方式不同 声明虚函数 在子类中实现 virtual float get_shi_bian_fun(); virtual float get_fan_han_fen_xi() ; virtual float get_wei_fen_jihe(); virtual float get_zonghe_english(); virtual float get_spoken_english(); virtual float get_zu_cheng_yuanli(); virtual float get_ti_xi_jie_gou(); virtual float get_hui_bian(); virtual string get_major(); //因为每个子类遍历的东西也不同 所以遍历函数也要为虚函数 在子类中以不同的方式来实现 virtual void traverse(Student *t); virtual float get_main_average();//取平均数也一样,返回平均成绩 virtual float get_average_score(); virtual void change(); //每个成员的科目不一样,需要修改的东西也不一样 Student(); virtual ~Student(); };
/*Student.cpp
/*Math_Student.h*/ #pragma once #include "Student.h" #include <string> class Math_Student : public Student { public: //特有的科目成员 都声明为float float shi_bian_fun; float fan_han_fen_xi; float wei_fen_jihe; string major = "Math_Student";//专业直接初始化 Math_Student(); ~Math_Student(); //get函数 方便在manage类里面拿到数据信息 float get_shi_bian_fun(); float get_fan_han_fen_xi() ; float get_wei_fen_jihe() ; float get_main_average(); float get_average_score(); string get_major(); //遍历信息 void traverse(Student *t); void change(); //修改信息 };
/*Math_Student.cpp*/ #include "Math_Student.h" #include<iostream> #include"string.h" using namespace std; Math_Student::Math_Student() { cout << "请输入学生信息:" << endl; cout << "age:" << endl; cin >> age; getchar(); cout << "name:"; cin >> name; getchar(); cout << "ID:" << endl; cin >> ID; getchar(); cout << "sport_score:" << endl; cin >>sport; getchar(); cout << "math_score:" << endl; cin >> math; getchar(); cout << "english_score" << endl; cin >> english; getchar(); cout << "shi_bian_fun_score" << endl; cin >>shi_bian_fun; getchar(); cout << "fan_han_fen_xi_score" << endl; cin >>fan_han_fen_xi; getchar(); cout << "wei_fen_jihe_score" << endl; cin >>wei_fen_jihe; getchar(); cout << "录入成功!" << endl; } Math_Student::~Math_Student() { } void Math_Student::change() { cout << " 实变函数:" << endl; cin >> shi_bian_fun; getchar(); cout << " 泛函分析:" << endl; cin >> fan_han_fen_xi; getchar(); cout << " 微分几何:" << endl; cin >> wei_fen_jihe; getchar(); } void Math_Student::traverse(Student *t) { //公共的信息修改 在 manage 里面 这里来到类里面来修改特有的信息 cout << "学生信息为:" << endl << " 学号:" << t->ID << " 姓名:" <<name << " 年龄:" <<age << " 专业:" <<major << endl <<"公共课成绩:"<<endl << " 数学:" <<math << " 英语:" <<english << " 体育:" << sport << endl << "专业课成绩:"<<endl <<" 实变函数:"<<t->get_shi_bian_fun()<<" 泛函分析:"<<t->get_fan_han_fen_xi()<<" 微分几何:"<<t->get_wei_fen_jihe()<<endl <<endl; } float Math_Student::get_main_average() { return ((math + english + sport) / 3.0); } float Math_Student::get_average_score() { float av = 0; av += math; av += sport; av += english, av += shi_bian_fun, av += fan_han_fen_xi, av += wei_fen_jihe; return (av / 6.0); } float Math_Student:: get_shi_bian_fun() { return shi_bian_fun; } float Math_Student ::get_fan_han_fen_xi() { return fan_han_fen_xi; } float Math_Student::get_wei_fen_jihe() { return wei_fen_jihe; } string Math_Student::get_major() { return major; } ;
/*English_Student.h*/ #pragma once #include "Student.h" #include <string> class English_Student : public Student { public: //特有成员变量 float zonghe_english; float spoken_english; string major = "English_Student"; English_Student(); ~English_Student(); float get_zonghe_english(); float get_spoken_english(); string get_major(); float get_main_average(); void change(); void traverse(Student *t); float get_average_score(); };
/*English_Student.cpp*/ #include "English_Student.h" #include<iostream> #include"string.h" using namespace std; English_Student::English_Student() { cout << "age:" << endl; cin >> age; getchar(); cout << "name:"; cin >> name; getchar(); cout << "ID:" << endl; cin >> ID; getchar(); cout << "sport_score:" << endl; cin >> sport; getchar(); cout << "math_score:" << endl; cin >> math; getchar(); cout << "english_score" << endl; cin >> english; cout << "zonghe_english_score" << endl; cin >> zonghe_english; cout << "spoken_english_score" << endl; cin >> spoken_english; getchar(); cout << "录入成功!" << endl; } English_Student::~English_Student() { } void English_Student::change() { //公共的信息修改 在 manage 里面 这里来到类里面来修改特有的信息 cout << " 综合英语:" << endl; cin >> zonghe_english; cout << " 口语英语:" << endl; cin >> spoken_english; getchar(); } void English_Student:: traverse(Student *t) { //因为实在 类里面 可以直接访问到数据 //输出的信息 分了 几行 便于好看 cout << "学生信息为:" << endl << " 学号:" << ID << " 姓名:" << name << " 年龄:" << age << " 专业:" << major << endl <<"公共课成绩:"<<endl << " 数学:" << math << " 英语:" << english << " 体育:" << sport << endl << "专业课成绩:" <<endl <<" 综合英语:"<< t->get_zonghe_english() << " 口语英语:" << t->get_spoken_english() <<endl <<endl; } float English_Student::get_average_score() { float av = 0.0; //来求和 在类里面 可以访问到数据 av += math; av += sport; av += english; av += zonghe_english; av += spoken_english; return (av / 5.0) ; //返回平均分 /5.0 为float } float English_Student::get_main_average() { //直接返回 公共课平均分 为float return ((math + english + sport) / 3.0); } float English_Student::get_zonghe_english() { return zonghe_english; //返回综合英语的分 } float English_Student::get_spoken_english() { return spoken_english;//返回口语英语的分 } string English_Student::get_major() { return major; //返回专业 为string } ;
/*IT_Student.h*/ #pragma once #include "Student.h" #include <string> class IT_Student : public Student { public: //特有科目成员变量 float zu_cheng_yuanli; float ti_xi_jie_gou; float hui_bian; string major = "IT_Student"; //一系列get函数 返回float float get_zu_cheng_yuanli(); float get_ti_xi_jie_gou(); float get_hui_bian(); float get_average_score(); float get_main_average(); string get_major(); IT_Student(); ~IT_Student(); void traverse(Student *t); void change(); };
/*IT_Student.cpp*/ #include "IT_Student.h" #include<iostream> #include"string.h" using namespace std; IT_Student::IT_Student() { cout << "age:" << endl; cin >> age; getchar(); cout << "name:"; cin >> name; getchar(); cout << "ID:" << endl; cin >> ID; getchar(); cout << "sport_score:" << endl; cin >> sport; getchar(); cout << "math_score:" << endl; cin >> math; getchar(); cout << "english_score" << endl; cin >> english; cout << "zu_cheng_yuanli_score" << endl; cin >> zu_cheng_yuanli; cout << "ti_xi_jie_gou_score" << endl; cin >> ti_xi_jie_gou; cout << "hui_bian_score" << endl; cin >> hui_bian; getchar(); cout << "录入成功!" << endl; } IT_Student::~IT_Student() { } void IT_Student::change() { //公共的信息修改 在 manage 里面 这里来到类里面来修改特有的信息 cout << " 组成原理:" << endl; cin >> zu_cheng_yuanli; cout << " 体系结构:" << endl; cin >> ti_xi_jie_gou; cout << " 汇编语言:" << endl; cin >> hui_bian; getchar(); } float IT_Student::get_main_average() { return ((math + english + sport) / 3.0); } void IT_Student::traverse(Student *t) { //因为实在 类里面 可以直接访问到数据 //输出的信息 分了 几行 便于好看 cout << "学生信息为:" << endl << " 学号:" << ID << " 姓名:" << name << " 年龄:" << age << " 专业:" << major << endl <<"公共课成绩:"<<endl << " 数学:" <<math << " 英语:" << english << " 体育" << sport << endl << "专业课成绩: "<<endl <<" 组成原理:"<< t->get_zu_cheng_yuanli() << " 体系结构:" << t->get_ti_xi_jie_gou() <<" 汇编语言:"<<t->get_hui_bian()<< endl <<endl; } float IT_Student::get_average_score() { float av = 0; av += math; av += sport; av += english; av += zu_cheng_yuanli; av += ti_xi_jie_gou; av += hui_bian; return (av / 6.0); } float IT_Student::get_zu_cheng_yuanli() { return zu_cheng_yuanli; }
/*main.cpp*/ **#include "manage_student.h" #include "Student.h" #include<iostream> #include "Math_Student.h" #include "IT_Student.h" #include "English_Student.h" using namespace std; /*void traverse(Student *head) { int index = 1; // 用于计数第几个学生 Student *temp = head; while (temp != NULL) { //同样一直到后面没有地址结束 cout << temp->math; temp = temp->next; } }*/ void menu(Student *head,manage_student Chead) { int m = 0; int ID = 0; int conter = 0; while (1) { cout << " ***************请选择您需要的操作:****************" << endl; cout << " * 1. 增加学生信息 *" << endl; cout << " * 2. 删除学生信息 *" << endl; cout << " * 3. 修改学生信息 *" << endl; cout << " * 4. 按学号ID查询 *" << endl; cout << " * 5. 查询某位学生的平均分 *" << endl; cout << " * 6. 某个学生的三科平均成绩 *" << endl; cout << " * 7. 按公共课平均分从高到低排序 *" << endl; cout << " * 8. 遍历学生信息 *" << endl; cout << " * 9. 结束功能并把信息写入文件中 *" << endl; cout << " * 0. 退出程序 *" << endl; cout << " ***************************************************" << endl; rewind(stdin); cin >> m; if (m >=0 && m < 10) { switch (m) { case 1: Chead.append_student(head); break; case 2: {cout << "要删除学生信息的学号:"; cin >> ID; head = Chead.delete_student(head, ID, Chead.getlength(head)); }break; case 3: {cout << "需要修改学生信息的同学ID:"; cin >> ID; Chead.change_message(head, ID); }break; case 4: {cout << "按学号查询 请输入需要查询的同学的ID为:"; cin >> ID; Chead.search(head, ID); }break; case 5: { cout << "请输入您需要查询学生的平均成绩的ID:"; cin >> ID; Chead.get_average_score(head,Chead.getlength(head),ID ); }break; case 6: { cout << "请输入您需要查询学生的平均成绩的ID:"; cin >> ID; Student *t = head; while (t != NULL) { if (t->ID == ID) { cout << "该同学的公共课平均成绩为:" << t->get_main_average() << endl; }t = t->next; } break; } case 7: { Chead.rank_average_score(head, Chead.getlength(head)); cout << "排序成功!"; break; } case 8: { Student *t = head; while (t != NULL) { t->traverse(t); t=t->next; }break; } case 9: { Chead.openfile(head, Chead.getlength(head)); cout << "写入文件成功!"; break; } case 0: { Chead.release(head);//结束之前free掉链表 return; } } } else cout << "输入有错误 请输入0-9的整数"; continue; }
/*manage_student.h*/ #pragma once #include<iostream> #include "Student.h" class manage_student { public: //存入文件 传入头指针和长度 void openfile(Student *head, int len); //成绩排序 传入头指针和长度 void rank_average_score(Student *head,int len); //修改信息 指定ID找到学生信息 修改 传入头 和 ID void change_message(Student *head, int ID); //增加信息 传入头就可以 void append_student(Student *head); //删除学生信息 传入头 需要删除学生信息的ID 链表长度 Student * delete_student(Student *head,int ID,int len); //创建链表 Student * create(); //搜索查询学生信息 根据ID搜索 void search(Student *head, int ID); //得到链表的长度 传入头 返回链表长度 int getlength(Student *head); //得到平均分 显示平均分 void get_average_score(Student *head, int len,int ID); void release(Student *head); manage_student(); ~manage_student(); };
/*manage_student.cpp*/ #include "manage_student.h" #include "Student.h" #include<iostream> #include "Math_Student.h" #include "IT_Student.h" #include "English_Student.h" #include<string.h> using namespace std; #include<fstream> #include<iomanip> manage_student::manage_student() { } manage_student::~manage_student() { } Student * manage_student:: create() { int num = 0; //来计数 输入的第几个学生 int temp; //用来输入选择初始化的学生的专业 int len = 0; //表示链表的长度 cin >> len; //也就是初始输入需要添加的学生数目 Student stu;//用来初始化指针 Student *pre = &stu; Student *c = &stu; Student *Head = &stu; //最后要返回的头指针 while (num < len) { cout << "************您需要添加此学生的专业是? 1:数学系 2:英语系 3:计算机系" << endl; cin >> temp; if (temp == 1) { c = new Math_Student; //一定要new一个**********不然会覆盖之前的 if (num == 0) { // 千万不能 Math_Student c 这个错误调了几天!!!!!! Head = c; // 头指针的地址 Head->next = NULL; //第一个的尾给空 pre = Head; //pre指向 前一个 也就是头 } if (num) { pre->next = c; //前一个的尾接到下一个的地址 pre = pre->next; //pre 指向next指针 pre->next = NULL; //next指针指向的 弄为空 } ++num; continue; } else if (temp ==2 ) { c = new English_Student; if (num == 0) { Head = c; // 头指针的地址 Head->next = NULL; //第一个的尾给空 pre = Head; //pre指向 前一个 也就是头 } if (num) { pre->next = c; //前一个的尾接到下一个的地址 pre = pre->next; //pre 指向next指针 pre->next = NULL; //next指针指向的 弄为空 } ++num; continue; } else if (temp == 3) { c = new IT_Student; if (num == 0) { Head = c; // 头指针的地址 Head->next = NULL; //第一个的尾给空 pre = Head; //pre指向 前一个 也就是头 } if (num) { pre->next = c; //前一个的尾接到下一个的地址 pre = pre->next; //pre 指向next指针 pre->next = NULL; //next指针指向的 弄为空 } ++num; continue; } else { cout << "输入有误!请重新输入" << endl; continue; } } return Head; //把头指针返回到main里 便于取用 } int manage_student::getlength(Student * head) { int num = 1; //=0 或者 =1 取决于while的判断条件 Student *t=head; while (t->next != 0) { //当head指向后面没有了 它就是NULL 结束 ++num; t = t->next; //如果head 不是NULL ++num后要把head指针指向最后 } return num; //返回int长度 } void manage_student::search(Student *head,int ID) { Student *t = head; //用*t来遍历 while (t != NULL) { //只要t不是空 就进入 if (t->ID == ID) { //如果匹配到 ID t->traverse(t); //用基类的指针调用子类的遍历方法 }t = t->next; } } void manage_student::release(Student *head) { Student *n; //需要一个指针存着下一个地址 while (head != NULL) { n = head->next; //把n指向下一块要释放的地址 free(head); head = n; //然后再把head从前一个地址移到下一个地址 } } void manage_student::append_student(Student *head) { Student *c = head; //都用基类的指针来操作 Student *t = head; int temp; while (t->next != NULL) { t = t->next; //把t移动到最后一块链表 } cout << "************您需要添加此学生的专业是? 1:数学系 2:英语系 3:计算机系" << endl; cin >> temp; if (temp == 1) { c = new Math_Student; //一定要new一个 t->next = c; //前一个的尾接到下一个的地址 t = t->next; //pre 指向next指针 t->next = NULL; //next指针指向的 弄为空 } else if (temp == 2) { c = new English_Student; //一定要new一个 t->next = c; //前一个的尾接到下一个的地址 t = t->next; //pre 指向next指针 t->next = NULL; //next指针指向的 弄为空 } else if (temp == 3) { c = new IT_Student; //一定要new一个 t->next = c; //前一个的尾接到下一个的地址 t = t->next; //pre 指向next指针 t->next = NULL; //next指针指向的 弄为空 } else { cout << "输入有误!请重新输入" << endl; } } Student * manage_student::delete_student(Student *head, int ID,int len) { //用*t来遍历 Student *t = head; Student *temp;//临时指针 for (int i = 0; i < (len - 1); ++i) { if (i == 0) { //如果就是第一块链表 需要特殊处理 因为头Head会变 if (head->ID == ID) { head = head->next; delete t; return head; } //一定要返回一个新的头Head if ((t->next)->ID == ID) { //如果是第二块链表匹配 temp = t->next; //把第一块跟第三块连接起来 t->next = (t->next)->next; delete temp; return head; //delete调 第二块 返回头Head } } if (i != 0) { if ((t->next)->ID == ID) { //如果遍历的不是第一块了,操作都一样 temp = t->next; //前一块的next t->next = (t->next)->next; //前后连接 delete temp; return head; //删掉中间 }t = t->next; } }cout << "删除成功!" << endl; return head; //返回头指针 } void manage_student::change_message(Student *head, int ID) { Student *t = head; while (t!= NULL) { if (t->ID == ID) {//ID匹配 进入 // 匹配属于数学系 if (t->get_major() == "Math_Student") { //在此处修改公共的信息 cout << "*******请输入要修改的学生信息:" << endl; cout << " ID:" << endl; cin >> t->ID; cout << " 姓名:" << endl; cin >> t->name; cout << " 年龄:" << endl; cin >> t->age; cout << " 数学:" << endl; cin >> t->math; cout << " 英语:" << endl; cin >> t->english; cout << " 体育:" << endl; cin >> t->sport; t->change(); //然后再去子类里面调用change修改特有的成员变量 } if (t->get_major() == "English_Student") { cout << "*******请输入要修改的学生信息:" << endl; cout << " ID:" << endl; cin >> t->ID; cout << " 姓名:" << endl; cin >> t->name; cout << " 年龄:" << endl; cin >> t->age; cout << " 数学:" << endl; cin >> t->math; cout << " 英语:" << endl; cin >> t->english; cout << " 体育:" << endl; cin >> t->sport; t->change(); } if (t->get_major() == "IT_Student") { cout << "*******请输入要修改的学生信息:" << endl; cout << " ID:" << endl; cin >> t->ID; cout << " 姓名:" << endl; cin >> t->name; cout << " 年龄:" << endl; cin >> t->age; cout << " 数学:" << endl; cin >> t->math; cout << " 英语:" << endl; cin >> t->english; cout << " 体育:" << endl; cin >> t->sport; t->change(); } cout << "信息修改完成!"<<endl; return; } t = t->next; } cout << "对不起!查无此人,请重新确认学号是否输入正确,谢谢!"<<endl; } void manage_student::rank_average_score(Student *head,int len) { Student *t = head; //用*t来 遍历 Student *pre = head;//把前面的存着 来跟后面的比较 t = t->next; //t往后移动一个 int ID; char name[20]; float math, english, sport; for (int i = 0; i < (len - 1); ++i) { while (t != NULL) { //如果后面的平均分比前面的平均分高 就进入 if ( t->get_average_score() >pre->get_average_score() ){ strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name); ID = t->ID; t->ID = pre->ID; pre->ID = ID; math = t->math; t->math = pre->math; pre->math = math; sport = t->sport; t->sport = pre->sport; pre->sport = sport; english = t->english; t->english = pre->english; pre->english = english; } t = t->next; //t每次循环完了之后 就把pre后移一个 t接在pre的后面 }pre = pre->next; t = pre->next; } } void manage_student::openfile(Student *head, int len) { //同样用t遍历 Student *t = head; ofstream ofile; //定义输出文件 ofile.open("D:\\学生信息"); //作为输出文件打开 //for循环把链表 里面的信息写入文件 for (int i = 0; i < len; ++i) { //判断系别 因为每个专业的成员不一样 if (t->get_major() == "Math_Student") { ofile << "录入的各学生的信息如下: " << endl; ofile << " 基本信息:" << " 学号" << t->ID << " 姓名:" << t->name << " 年龄:" << t->age << " 专业:" << t->get_major() << endl << " 公共课成绩:" << " 数学:" << t->math << " 英语:" << t->english << " 体育:" << t->sport << endl << " 专业课成绩:" << " 实变函数" << t->get_shi_bian_fun() << " 泛函分析:" << t->get_fan_han_fen_xi() << " 微分几何" << t->get_wei_fen_jihe() << endl; t = t->next; continue; } if (t->get_major() == "English_Student") { ofile << "录入的各学生的信息如下: " << endl; ofile << " 基本信息:" << " 学号" << t->ID << " 姓名:" << t->name << " 年龄:" << t->age << " 专业:" << t->get_major() << endl << " 公共课成绩:" << " 数学:" << t->math << " 英语:" << t->english << " 体育:" << t->sport << endl << " 专业课成绩:" << " 综合英语:" << t->get_zonghe_english() << " 口语英语:" << t->get_spoken_english() << endl; t = t->next; continue; } if (t->get_major() == "IT_Student") { ofile << "录入的各学生的信息如下: " << endl; ofile << " 基本信息:" << " 学号" << t->ID << " 姓名:" << t->name << " 年龄:" << t->age << " 专业:" << t->get_major() << endl << " 公共课成绩:" << " 数学:" << t->math << " 英语:" << t->english << " 体育:" << t->sport << endl << " 专业课成绩:" << " 组成原理:" << t->get_zu_cheng_yuanli() << " 体系结构:" << t->get_ti_xi_jie_gou() << " 汇编语言:" << t->get_hui_bian() << endl; t = t->next; continue; } } ofile.close(); return ; } void manage_student::get_average_score(Student *head, int len,int ID) { Student *t = head; //用t遍历 for (int i = 0; i < len; ++i) { if (t->ID == ID) { //用基类的指针调用子类的函数 返回平均分 输出 cout << "该学生的平均成绩为:" << t->get_average_score() << endl; return; } t = t->next; } cout << "请确认您输入的ID是否有误" << endl; } ;
} void main() { cout << "欢迎进入学生管理系统!请输入需要添加的学生数: "<<endl; Student temp; //用来初始化指针 Student *Head=&temp; Student *t=&temp; int len; manage_student Chead; Head=Chead.create();//把头地址传回来给Head 指向的是第一个类stu menu(Head, Chead); //调用菜单函数 system("pause"); return; }
float IT_Student::get_ti_xi_jie_gou() { return ti_xi_jie_gou; } float IT_Student::get_hui_bian() { return hui_bian; } string IT_Student::get_major() { return major; } ;
*/
#include "Student.h" #include<iostream> Student::Student() { } Student::~Student() { } //这些函数都是假的 真正实现在子类里面 float Student::get_average_score() { return 0; } float Student::get_main_average() { return 0; } void Student::traverse(Student *t) { cout << "我在Student 里面" << endl; } float Student:: get_shi_bian_fun() { return 0; } float Student::get_fan_han_fen_xi() { return 0; } float Student::get_wei_fen_jihe() { return 0; } float Student::get_zonghe_english() { return 0; } float Student::get_spoken_english() { return 0; } float Student::get_zu_cheng_yuanli() { return 0; } float Student::get_ti_xi_jie_gou() { return 0; } float Student::get_hui_bian() { return 0; } string Student::get_major() { return 0; } void Student::change() { } ;