教务管理系统项目报告目录教务管理系统项目报告 (1)小组成员 (1)项目核心功能 (1)程序结构 (2)Person类及其派生类 (2)Course类 (3)Class类 (3)运行截图 (4)项目代码 (9)Class.h (9)Course.h (10)Person.h (11)Class.cpp (14)Person.cpp (17)main.cpp (20)项目总结 (26)小组成员信息学院: 李天雄2016329621064启新学院: 陈一霖2016339960012启新学院: 刘合然2016339960022项目核心功能1.学生a)选课b)查看课表c)查看成绩2.教师a)查看课表b)给学生评分c)查看班级所有学生的成绩程序结构Person类及其派生类•Person基类•成员变量•姓名•Id•性别•成员函数•name()•id()•gender()•Student类•成员变量•基类全部成员变量•学号•学院•课程列表•成员函数•基类全部成员函数•选课相关函数•schoolTimeTable()•gradeList()•其他•Teacher类•成员变量•基类全部成员变量•工号•学院•课程列表•成员函数•基类全部成员函数•选课相关函数•set_score()•schoolTimeTable()•gradeList()•其他Course类•成员变量•名称•学院•类型•学分•成员函数•相关信息更改函数Class类•成员变量•课程•班级成员•老师•学生•成绩•上课时间•上课地点•成员函数•添加删除老师, 学生•展示分数•展示班级成员运行截图项目代码Class.h#ifndef CLASS_H#define CLASS_H#include <iostream>#include <algorithm>#include <vector>#include <map>#include "Person.h"#include "Course.h"class Student;using namespace std;classClass{private:Course * course;struct t{t(Student & s_, double v_) { s = &s_; v = v_;} t() {}~t() {}Student * s;double v;bool operator<(t & b){return v >b.v;}};set<Teacher *> teachers;string Position;int Time;public:vector<t> students;voidshow_stu() const{for(auto &x : students){cout<<x.s->name() << " " <<x.s->id() <<endl;}}Class(Course & c) : course(&c) {}~Class() {}const string & name() { return course->name(); } Course ccourse() {return *course;}voidset_time(int t) { Time = t; };voidset_position(const string & t) { Position = t; }const string & position() { return Position; }int time() { return Time; }voidadd_student(Student & s, bool flag = 1); voiddelete_student(Student & s, bool flag = 1); voidset_score(Student & s, double ds);voidshow_teachers() const;void show() const;doubleshow_score(const Student & s) const;voidadd_teacher(Teacher & t, bool flag = 1); voiddelete_teacher(Teacher & t, bool flag = 1); };#endif // CLASS_HCourse.h#ifndef COURSE_H#define COURSE_H#include <iostream>#include <algorithm>#include <vector>#include <string>#include <set>using namespace std;class Teacher;class Course{private:string Name;string Type;string Department;double Credit;public:Course(const string & n = "UNKNOW", const string & t = "UNKNOW", const string & d = "UNKNOW") :Name(n), Type(t), Department(d){}~Course() {}voidset_name(const string & t) { Name = t; }voidset_type(const string & t) { Type = t; }voidset_department(const string & t) { Department = t; }voidset_credit(double t) { Credit = t; }const string & name() const { return Name; }const string & type() const { return Type;}const string & department() const { return Department;}double credit() const { return Credit; }// void show() const;};#endif // COURSE_HPerson.h#ifndef PERSON_H#define PERSON_H#include <iostream>#include <algorithm>#include <vector>#include <set>classClass;class Student;using namespace std;typedef long long LL;typedefconst string & CSR; //const string UNK = "UNKNOW";class Course;class Person{private:string Name;LL Id;string Gender;public:Person(CSR n = UNK, LL i = 0ll, CSR g = UNK) :Name(n), Id(i), Gender(g) {}virtual ~Person() {}LL id() const { return Id; }CSR name() const { return Name; }CSR gender() const { return Gender; }voidset_name(CSR n) { Name = n; }virtual void set_id(LL i) { Id = i; }voidset_gender(CSR g) { Gender = g; }virtual void schoolTimeTable() const {}; virtual void gradeList() const{};};class Teacher :public Person{private:LL Job_id;string Department;set<Class *> classes;public:Teacher(const string n = UNK, LL j = 0, CSR g = UNK) :Person(n, j, g), Job_id(j) {}virtual ~Teacher() {}LL jobid() const { return Job_id; }CSR department() const { return Department; }voidset_jobid(LL j) { Job_id = j; }voidset_department(CSR d) { Department = d; }voidadd_class(Class & c, bool flag =1); voiddelete_class(Class & c, bool flag =1); voidshow_class();voidset_score(Class & c, Student &, double v);virtual void schoolTimeTable() const;virtual void gradeList() const;};class Student :public Person{private:LL Stu_id;string Department;set<Class *> classes;public:Student(const string n = UNK, LL s = 0, CSR g = UNK) :Person(n, s, g), Stu_id(s) {}virtual ~Student() {}LL stu_id() const { return Stu_id; }CSR department() const { return Department; }voidset_stuid(LL s) { Stu_id = s; }voidset_department(CSR d) { Department = d; }voidadd_class(Class & c, bool flag = 1); voiddelete_class(Class & c, bool flag = 1);voidshow_class() const;voidset_score();voidshow_score() const;doublecal() const;double cal2() const;virtual void schoolTimeTable() const;virtual void gradeList() const;};#endif // PERSON_HClass.cpp#include <iostream>#include <algorithm>#include <vector>#include <map>#include "Course.h"#include "Person.h"#include "Class.h"using namespace std;#include "Person.h"#include "Course.h"#include <set>void Class::add_teacher(Teacher & t, bool flag)//, bool flag){if(teachers.find(&t) != teachers.end()){if(flag) cout<< () << "已经是"<< this->course->name() << "的任课老师, 不用再次添加"<<endl;return;}teachers.insert(&t);if(flag) cout<< "已将"<< () << "添加为"<< this->course->name() << "的任课老师t.add_class(*this, 0);}void Class::delete_teacher(Teacher & t, bool flag)//, bool flag){if(teachers.find(&t) == teachers.end()){if(flag) cout<< this->course->name() << "没有"<< () << "这名老师"<<endl; return ;}teachers.erase(&t);if(flag) cout<< "已将"<< () << "从"<< this->course->name() << "删除"<<endl;t.delete_class(*this, 0);}void Class::show_teachers() const{for(auto ite = teachers.begin(); ite!=teachers.end(); ){cout<< (**ite).name();if((++ite)!=teachers.end()) cout<< ",";}}void Class::show() const{cout<< course->name() << ""<< course->type();cout<< " "<< Position;cout<<endl;cout<< "任课老师: ";show_teachers();cout<<endl;}void Class::add_student(Student & s, bool flag){for(inti=0; i<(int)students.size(); ++i){if(students[i].s == &s){if(flag) cout<< () << "已经是"<< name() << "课的学生,无需再次添加"<<endl;return;}students.push_back(t(s, -1));if(flag) cout<< "已将"<< () << "添加到"<< name() <<endl;}void Class::delete_student(Student & s, bool flag){for(inti=0; i<(int)students.size(); ++i){if(students[i].s == &s){if(flag) cout<< "已将"<< () << "从"<< name() << "删除"<<endl; return;}}if(flag) cout<< () << "不是"<< name() << "课的学生,无需删除"<<endl; }void Class::set_score(Student & s, double ds){for(inti=0; i<(int)students.size(); ++i){if(students[i].s == &s){students[i].v = ds;cout<< "已将"<< () << "的"<< name() << "课成绩设置为"<< ds <<endl;cout<< students[i].s->name() << " " << students[i].v <<endl;return;}}cout<< "未找到该学生,设置失败"<<endl;}double Class::show_score(const Student & s) const{for(inti=0; i<(int)students.size(); ++i){if(&s == students[i].s) return students[i].v;}return -1;}Person.cpp#include "Person.h"#include "Course.h"#include "Class.h"using namespace std;void Teacher::add_class(Class & c, bool flag)//, bool flag){if(classes.find(&c) != classes.end()){if(flag) cout<< this->name() << "已经是"<< () << "的教师, 无需重复添加"<<endl;return;}classes.insert(&c);if(flag) cout<< "已将"<< () << "添加为"<< this->name() << "老师的任教课程"<<endl;c.add_teacher(*this, 0);}void Teacher::delete_class(Class & c, bool flag)//, bool flag){if(classes.find(&c) == classes.end()){if(flag) cout<< this->name() << "未执教"<< () << ",无需删除"<<endl;return ;}classes.erase(&c);if(flag) cout<< "已将"<< () << "从"<< this->name() << "的任教课程中删除"<<endl;c.delete_teacher(*this, 0);}void Teacher::show_class(){for(auto ite = classes.begin(); ite!=classes.end(); ){cout<< (**ite).name();if((++ite)!=classes.end()) cout<< ",";}}void Teacher::schoolTimeTable() const{cout<< name() << "的课程表:\n";cout<< "课程\t上课时间\n";for(auto ite = classes.begin(); ite!=classes.end(); ++ite){cout<< (**ite).name() << "\t" << (**ite).time()<< " : 00" <<endl;}}void Teacher::gradeList() const{cout<< name() << "的所有学生的成绩:\n";for(auto ite : classes){cout<<ite->name() << "所有学生成绩" <<endl;for(auto stu : ite->students){cout<<stu.s->name() << "\t" <<stu.v<<endl;}}}void Student::show_class() const{cout<< "所有课程:"<<endl;cout<< "课程\t\t老师\t\t位置\t"<<endl;for(auto ite=classes.begin(); ite!=classes.end(); ++ite){cout<< (*ite)->name() << "\t\t";(*ite)->show_teachers();cout<<"\t\t";cout<< (*ite)->position();cout<<endl;}}void Student::add_class(Class &c, bool flag){if(classes.find(&c) != classes.end()){cout<< "您已经添加了"<< () << ", 无需再次添加"<<endl; return ;}classes.insert(&c);c.add_student(*this);cout<< "已选择"<< () <<endl;}void Student::delete_class(Class & c, bool flag){if(classes.find(&c) == classes.end()){cout<< "您未选"<< () << "这门课程,无需删除"<<endl;return;}classes.erase(&c);c.delete_student(*this);cout<< "已删除"<< () <<endl;}double Student::cal() const{double s1 = 0, s2 = 0;for(auto ite = classes.begin(); ite!=classes.end(); ++ite){s1 += (*ite)->ccourse().credit();s2 += (*ite)->ccourse().credit() * (*ite)->show_score(*this) / 20;}return s2/s1;}void Teacher::set_score(Class & c, Student & s, double v){for(auto ite = classes.begin(); ite!=classes.end(); ++ite){if((*ite) == &c){Class cla = (**ite);cla.set_score(s, v);}}}void Student::show_score() const{for(auto ite = classes.begin(); ite!=classes.end(); ++ite){cout<< (*ite)->name();cout<< "\t";cout<< (*ite)->show_score(*this);cout<<endl;}}void Student::schoolTimeTable() const{cout<< name() << "的课表:\n";cout<< "课程\t上课时间\n";for(auto ite = classes.begin(); ite!=classes.end(); ++ite) {cout<< (**ite).name() << "\t" << (**ite).time() << " : 00" <<endl;}}void Student::gradeList() const{cout<< name() << "的成绩单: \n";show_score();cout<< "平均绩点:\t" <<cal() <<endl;}main.cpp//-std=c++11#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <vector>#include <windows.h>#include "Person.h"#include "Course.h"#include "Class.h"const string Star = "**********";#define clssystem("cls");using namespace std;int main(){Student s[3] ={Student("孙一", 20000, "男"),Student("周二", 20001, "男"),Student("吴三", 20002, "男"),};Teacher t[5] ={Teacher("张三", 10000, "男"),Teacher("李四", 10001, "男"),Teacher("王五", 10002, "男"),Teacher("赵四", 10003, "男"),Teacher("钱六", 10004, "女"),};Course c[4]{Course("C++", "必修理论课程", "信息学院"),Course("形式与政策", "选修理论课程", "马克思学院"),Course("程序设计", "必修实践课程", "信息学院"),Course("羽毛球", "体育课"),};c[0].set_credit(5);c[1].set_credit(3);c[2].set_credit(2.5);c[3].set_credit(1);Class cc[4]{Class(c[0]),Class(c[1]),Class(c[2]),Class(c[3]),};cc[0].set_position("2N111");cc[1].set_position("10-100");cc[2].set_position("4S523");cc[3].set_position("3N134");cc[0].set_time(2);cc[1].set_time(3);cc[2].set_time(4);cc[3].set_time(6);cc[0].add_teacher(t[0]);cc[0].add_teacher(t[1]);t[2].add_class(cc[1]);t[3].add_class(cc[2]);cc[3].add_teacher(t[4]);clscout<< Star << "教务管理系统" << Star <<endl;cout<< "学生登录(1)\n老师登录(2)\n退出系统(3)\n"; inttt;while(cin>>tt&&tt!=3){clsif(tt == 1){cout<< "请输入您的学号:_____\b\b\b\b\b";int id;cin>> id;Student * p = nullptr;for(inti=0; i<3; ++i){if(s[i].id() == id){p = &s[i];cout<< s[i].id();break;}}if(p == nullptr){cout<< "学号不存在\n";}else{clscout<< "欢迎您, " << p->name() << "同学" <<endl;cout<< "选课(1)\n查看课表(2)\n查看成绩(3)\n退出(4)\n"; while(cin>>tt&&tt!=4){clsif(tt==1){cout<< "可选课程:\n";for(inti=0; i<4; ++i){cout<< "课程编码:" << i+1 <<endl;cc[i].show();cout<<endl;}cout<< "请输入您要选的课程编码(0退出):_\b";while(cin>>tt&&tt){--tt;if(tt>3) cout<< "不存在\n"; else p->add_class(cc[tt]);cout<< "请输入您要选的课程编码(0退出):_\b";}}else if(tt==2){p->schoolTimeTable();cout<< "按任意键退出" <<endl;getchar();getchar();}else{p->show_score();cout<<endl;cout<< "按任意键退出" <<endl;getchar();getchar();}clscout<< "欢迎您, " << p->name() << "同学" <<endl;cout<< "选课(1)\n查看课表(2)\n查看成绩(3)\n退出(4)\n";}}}else{cout<< "请输入您的工号:_____\b\b\b\b\b";cin>>tt;Teacher * p = nullptr;for(inti=0; i<5; ++i) cout<< t[i].id() <<endl;for(inti=0; i<5; ++i){if(tt == t[i].id()){p = &t[i];break;}}cout<< p <<endl;if(p == nullptr){cout<< "工号不存在\n";}else{clscout<< "欢迎您, " << p->name() << "老师" <<endl;cout<< "查看课表(1)\n评定成绩(2)\n查看成绩(3)\n退出(4)\n"; while(cin>>tt&&tt != 4){clsif(tt==1){p->schoolTimeTable();cout<< "按任意键退出";getchar();getchar();}else if(tt==2){for(inti=0; i<4; ++i){cout<< "课程id:" << i+1 <<endl;cc[i].show();cout<<endl;}cout<< "请输入课程id(0退出):_";while(cin>>tt&&tt){--tt;if(tt>3){cout<< "不存在" <<endl;}else{clscout<< "学生信息" <<endl;cc[tt].show_stu();cout<< "输入学号和成绩(学号为0退出):";int x;doublettt;while(cin>> x >>ttt&& x){for(inti=0; i<3; ++i){if(s[i].id() == x){ cc[tt].set_score(s[i], ttt);}}cout<< "输入学号和成绩(学号为0退出):";}}for(inti=0; i<4; ++i){cout<< "课程id:" << i+1 <<endl;cc[i].show(); cout<<endl;}cout<< "请输入课程id(0退出):_";}}else{p->gradeList();cout<< "任意键退出\n";getchar();getchar();}clscout<< "欢迎您, " << p->name() << "老师" <<endl;cout<< "查看课表(1)\n评定成绩(2)\n查看成绩(3)\n退出(4)\n";}}}clscout<< Star << "教务管理系统" << Star <<endl;cout<< "学生登录(1)\n老师登录(2)\n退出系统(3)\n";}return 0;}项目总结项目利用了C++类的继承功能, 提高了代码的重用率, 减小了工作量. 但功能总体上还是偏简陋, 希望在以后能够添加更多的功能, 完善这个项目.。