VisualStdio2019_C++校园学生信息管理系统

//源文件main函数#include"StudentManager.h"
int main()
{StudentManager manager;manager.run();  //无参构造调用参数return 0;
}
//头文件 student#pragma once
#include
#include
using namespace std;
//定义抽象学生类
class Student
{
protected:   //属性定义为protected//姓名string name;      //studentname 在protect中取不出 需要重载//学号string number;//性别string sex;//年龄int age;
public:   //头文件声明成员方法//声明成员函数,基本信息输入;void baseInput();//声明纯虚函数—信息输入函数input( )    ——含有纯虚函数 故为抽象类virtual void input() = 0;//声明虚函数:信息输出函数output( )virtual void output();//重载  可用"==运算符"实现bool operator ==(string p_name);//声明纯虚函数保存学生信息virtual void save() = 0;
};
//源文件 student#include"Student.h"
//实现成员函数:基本信息输入 baseInput()
void Student::baseInput()
{cout << "姓名:";cin >> name;cout << "学号:";cin >> number;cout << "性别:";cin >> sex;cout << "年龄:";cin >> age;
}
//纯虚函数不可实现,在子类里实现,父类定义//实现虚函数:信息输出函数output( )
void Student::output()
{cout << name<<'\t' << number<<'\t' << sex<<'\t' << age<<'\t';   //'\t'实现空四对齐  使数据在一个开头
}
//实现运算符== 的重载
bool Student::operator==(string p_name)
{return name == p_name;
}
//头文件 pupil#pragma once
#include"Student.h"
//定义小学生类;公有继承——student
class Pupil : public Student
{//自己私有的独特属性:就读学校&&开学年份
private://新增就读学校string school;//新增开学年份int startstudy;
public:  //声明纯虚函数;实现重写父类纯虚函数;virtual void input();//声明虚函数;重写父类outputvirtual void output();//声明虚函数;重写父类savevirtual void save();
};
//源文件  pupil#include"Pupil.h"
#include    //重写父类save保存文件头文件
//实现纯虚函数,重写父类input()
void Pupil::input()
{baseInput();cout << "就读学校:";cin >> school;cout<<"入学年份:";cin >> startstudy;cout << "学生信息录入成功!" << endl;   //endl:换行
}
//实现虚函数,重写父类output
void Pupil::output()
{Student::output();  //写父类的类限定   调用基类继承来的同名函数cout << school << '\t' << startstudy << endl;
}
void Pupil::save()
{//1-创建流对象ofstream ofs("PupilData.txt", ios::app);  //避免覆盖上一次数据,不使用out方式打开写入对象  用app追加写入下一行//2-写内容ofs << name << " " << number << " " << sex << " " << age << " " << startstudy << endl;//3-关闭流对象ofs.close();
}
// 头文件 UnderGraduate#pragma once
#include"Student.h"
//定义大学生类,共有继承Student
class UnderGraduate :public Student
{
private://新增专业属性string speciality;
public://声明纯虚函数;实现重写父类纯虚函数;virtual void input();//声明虚函数;重写父类outputvirtual void output();//声明虚函数;重写父类savevirtual void save();
};
//源文件 UnderGraduate#include"UnderGraduate.h"
#include    //重写父类save保存文件头文件
//实现纯虚函数,重写父类input()
void UnderGraduate::input()
{//调用基类继承来的成员函数baseInput();cout << "专业:";cin >> speciality;cout << "学生信息录入成功!" << endl;
}
//实现虚函数,重写父类output
void UnderGraduate::output()
{//调用基类继承来的同名函数Student::output();//输出增加的数据成员cout << speciality << endl;
}
//实现虚函数;重写父类save
void UnderGraduate::save()
{//1-创建流对象ofstream ofs("UnderGraduateData.txt",ios::app);  //避免覆盖上一次数据,不使用out方式打开写入对象  用app追加写入下一行//2-写内容ofs << name << " " << number << " " << sex << " " << age << " " << speciality << endl;//3-关闭流对象ofs.close();
}
//头文件 StudentManager//
#pragma once   //头文件资源调用仅调用一次;
#include
#include
using namespace std;
#include"UnderGraduate.h"
#include"Pupil.h"const int N = 30;   ///常量N表示学生上限
class StudentManager
{
protected:int type;    //定义选择系统版本类型的属性:1大学生  2小学生//大学生数组UnderGraduate udts[N];//小学生数组Pupil pups[N];//当前大学生人数int numU;//当前小学生人数int numP;
public://声明默认构造函数StudentManager();//声明菜单功能函数;而后  在源文件去实现void showMenu();    ///成员函数命名规则首字母小写;//声明系统启动功能函数void run();//声明输入学生信息函数void inputStudent(int type);//声明按姓名查询信息函数bool searchStudent(int type);//声明学生信息浏览函数void browseStudent(int type);//声明按姓名查询信息函数void updateStudent(int type);//声明按姓名删除学生信息void deleteStudent(int type);//声明保存学生信息void saveStudent(int type);//声明析构造函数~StudentManager();
};
//源文件 StudentManager#include"StudentManager.h"
/*#include"Pupil.h"
#include"UnderGraduate.h"*///StudentManager中已有上述两头文件,避免重复
//实现默认构造函数
StudentManager::StudentManager()
{numU = numP = 0;
}
//实现菜单功能函数
void StudentManager::showMenu()
{cout << "请输入系统类型(1-大学生)-(2-小学生) --:";cin >> type;   //调用头文件里的属性type  已引用#include"StudentManager.h" type可直接用cout << "********学生信息管理系统********" << endl;if (type == 1){cout << "********大学生版本入口**********" << endl;}else if (type == 2){cout << "********小学生版本入口**********" << endl;}else{cout << "选择错误,请重新选择!" << endl;showMenu();return;}cout << "********0 :退出系统************" << endl;cout << "********1 :切换系统版本********" << endl;cout << "********2 :录入学生信息********" << endl;cout << "********3 :查询学生信息********" << endl;cout << "********4 :浏览全部学生********" << endl;cout << "********5 :修改学生信息********" << endl;cout << "********6 :删除学生信息********" << endl;cout << "********7 :保存学生信息********" << endl;
}
//声明系统启动功能函数
void StudentManager::run()
{showMenu();  //先把菜单显示
/*       //测试多态int type;cout << "请选择—> 1-大学生,2-小学生:";cin >> type;Student* ptr;  //指正变量ptr  指向不同的子类队空间if (type == 1){ptr = new UnderGraduate;}else{ptr = new Pupil;}*/
int choice;  //选择菜单编号
//循环语句使得功能不断使用——dowhile循环
do
{cout << "请输入你的选择:";cin >> choice;switch (choice)  //到底选的哪一项{case 0:  //0——退出系统cout << "成功退出,欢迎下次使用" << endl;break;//1.切换系统版本case 1:showMenu();break;//2.录入学生信息case 2:/*ptr->input();ptr->output();*/inputStudent(type);break;//3.查询学生信息case 3:searchStudent(type);break;//4.游览全部学生信息case 4:browseStudent(type);break;//5.修改学生信息case 5:updateStudent(type);break;//6.按姓名删除学生信息case 6:deleteStudent(type);break;//7.保存学生信息case 7:saveStudent(type);break;default:   //当输入值非0~7时cout << "功能菜单编号选择错误!" << endl;break;}
} while (choice);  //当且仅当输入0时终止
}
//实现输入学生信息函数
void StudentManager::inputStudent(int type)
{cout << "\n*********2.录入学生信息********" << endl;Student* ptr;   //声明父类指针switch (type)   //判断哪一个系统{//大学生版本case 1:if (numU == N)   //判断当前是否存满{cout << "\n大学生人数已经存满!" << endl;return;}//基类指针指向Underraduate类对象ptr = &udts[numU];//父类指针指向当前的数组空间//动态多态,调用大学生input()函数ptr->input();numU++;break;//小学生版本case 2:if (numP == N)   //判断当前是否存满{cout << "\n小学生人数已经存满!" << endl;return;}//基类指针指向Underraduate类对象ptr = &pups[numP];//父类指针指向当前的数组空间//动态多态,调用大学生input()函数ptr->input();numP++;break;}
}
//实现按姓名查询信息函数
bool StudentManager::searchStudent(int type)
{cout << "\n********3.查询学生信息********" << endl;string searchName;Student* ptr;  //父类指针,当前所指向的查找的学生对象int i, num;  //num:版本的学生人数cout << "\n输入你要查找的学生姓名:";cin >> searchName;switch (type){case 1://numU 当前大学生注册人数num = numU;for (i = 0; i < num; i++){ptr = &udts[i];//调用重载的operator ==运算符if((*ptr) == searchName)      //if((*ptr).name==searchName)  此name不可访问 故重写==运算符重载  类似:bool Student::operator==(string p_name){break;}}break;case 2://numP 当前小学生注册人数num = numP;for (i = 0; i < num; i++){ptr = &pups[i];//调用重载的operator ==运算符if ((*ptr) == searchName)//if((*ptr).name==searchName)  此name不可访问 故重写==运算符重载  类似:bool Student::operator==(string p_name){break;}}break;}//没有查询到学生信息if (i == num){cout << "\n无此人信息" << endl;return false;}else{//动态多态ptr->output();return true;}
}
//实现学生信息浏览函数
void StudentManager::browseStudent(int type)
{cout << "\n********4.游览全部学生********" << endl;Student* ptr;int num;if (type == 1)num = numU;if (type == 2)num = numP;cout << "\n********学生信息数据列表********\n";if (num == 0){cout << "\n当前没有学生数据!\n";return;}switch (type){case 1:cout << "姓名" << '\t'<< "学号" << '\t' << "性别" << '\t' << "年龄" << '\t';  //  \t 表头各项对齐cout << "专业" << '\n';for (int i = 0; i < numU; i++){ptr = &udts[i];ptr->output();}break;case 2:cout << "姓名" << '\t' << "学号" << '\t' << "性别" << '\t' << "年龄" << '\t';  //  \t 表头各项对齐cout << "就读学校" << '\t' << "入学时间" << '\n';for (int i = 0; i < numP; i++){ptr = &pups[i];ptr->output();}break;}
}
//实现按姓名查询信息函数
void StudentManager::updateStudent(int type)
{cout << "\n********5.修改学生信息********" << endl;string searchName;Student* ptr;  //父类指针,当前所指向的查找的学生对象int i, num;  //num:版本的学生人数cout << "\n输入你要修改的学生姓名:";cin >> searchName;switch (type){case 1://numU 当前大学生注册人数num = numU;for (i = 0; i < num; i++){ptr = &udts[i];//调用重载的operator ==运算符if ((*ptr) == searchName)//if((*ptr).name==searchName)  此name不可访问 故重写==运算符重载  类似:bool Student::operator==(string p_name){break;}}break;case 2://numP 当前小学生注册人数num = numP;for (i = 0; i < num; i++){ptr = &pups[i];//调用重载的operator ==运算符if ((*ptr) == searchName)//if((*ptr).name==searchName)  此name不可访问 故重写==运算符重载  类似:bool Student::operator==(string p_name){break;}}break;}//没有查询到学生信息if (i == num){cout << "\n无此人信息" << endl;}else{//动态多态ptr->input();}
}
//实现按姓名删除学生信息
void StudentManager::deleteStudent(int type)
{cout << "\n********6.删除学生信息********" << endl;string searchName;Student* ptr;  //父类指针,当前所指向的查找的学生对象int i, num;  //num:版本的学生人数cout << "\n输入你要删除的学生姓名:";cin >> searchName;switch (type){case 1://numU 当前大学生注册人数num = numU;for (i = 0; i < num; i++){ptr = &udts[i];//调用重载的operator ==运算符if ((*ptr) == searchName)//if((*ptr).name==searchName)  此name不可访问 故重写==运算符重载  类似:bool Student::operator==(string p_name){for (int k = i; k < numU - 1; k++){udts[k] = udts[k + 1];}numU--;cout << "学生信息删除成功!" << endl;break;}}break;case 2://numP 当前小学生注册人数num = numP;for (i = 0; i < num; i++){ptr = &pups[i];//调用重载的operator ==运算符if ((*ptr) == searchName)//if((*ptr).name==searchName)  此name不可访问 故重写==运算符重载  类似:bool Student::operator==(string p_name){for (int k = i; k < numP - 1; k++){pups[k] = pups[k + 1];}numP--;cout << "学生信息删除成功!" << endl;break;}}break;}//没有查询到学生信息if (i == num){cout << "\n无此人信息" << endl;}
}
//实现保存学生信息
void StudentManager::saveStudent(int type)
{cout << "\n********7.保存所有学生信息到文件中********" << endl;Student* ptr;int num;if (type == 1)num = numU;if (type == 2)num = numP;if (num == 0){cout << "\n当前没有学生数据!\n";return;}switch (type){case 1:for (int i = 0; i < numU; i++){ptr = &udts[i];   //无法直接访问对象私有保护成员udts[i].name  无法进行文件操作,需写入pupil、UnderStudent.cpp中ptr->save();}cout << "大学生—学生数据保存成功,请查看根目录数据文件" << endl;break;case 2:for (int i = 0; i < numP; i++){ptr = &pups[i];ptr->save();}cout << "小学生—学生数据保存成功,请查看根目录数据文件" << endl;break;}
}
//实现析构造函数
StudentManager::~StudentManager()
{}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部