C++学习记录 七、C++实战项目机房预约管理系统

    科技2026-04-19  6

    再系统地过一次,夯实基础

    学习目标:

    过一遍黑马程序员C/C++学习视频

    文章目录

    学习目标:学习内容:一、C++基础入门二、通讯录管理系统三、C++核心编程三、 C++核心编程(面向对象) 继承四、基于多态的企业职工系统五、C++提高编程(1)五、C++提高编程(2)六、基于STL泛化编程的演讲比赛七、C++实战项目机房预约管理系统1. 机房预约系统需求1.1 系统简介1.2 身份简介1.3 机房简介1.4 申请简介1.5 系统具体需求 2. 创建项目3. 创建主菜单3.1 菜单实现3.2 搭建接口 4. 退出功能实现5. 创建身份类5.1 身份的基类5.2 学生类5.2.1 功能分析5.2.2 类的创建 5.3 老师类5.3.1 功能分析5.3.2 类的创建 5.4 管理员类5.4.1 功能分析5.4.2 类的创建 6. 登录模块6.1 全局文件添加6.2 登录函数封装6.3 学生登录实现6.4 教师登录实现6.5 管理员登录实现 7. 管理员模块7.1 管理员登录和注销7.1.1 构造函数7.1.2 管理员子菜单7.1.3 菜单功能实现7.1.4 接口对接 7.2 添加账号7.2.1 添加功能实现7.2.2 去重操作7.2.2.1 读取信息7.2.2.2 去重函数封装7.2.2.3 添加去重操作7.2.2.4 bug解决 7.3 显示账号7.4 查看机房7.4.1 添加机房信息7.4.2 机房类创建7.4.3 初始化机房信息7.4.4 显示机房信息 7.5 清空预约7.5.1 清空功能实现 8. 学生模块8.1 学生登录和注销8.1.1 构造函数 8.1.2 学生子菜单8.1.3 菜单功能实现8.1.4 接口对接 8.2 申请预约8.2.1 获取机房信息8.2.2 预约功能实现 8.3 显示预约8.3.1 创建预约类8.3.2 显示自身预约8.3.3 显示所有预约 8.4 取消预约 9. 教师模块9.1 教师登录和注销9.1.1 构造函数9.1.2 教师子菜单9.1.3 菜单功能实现9.1.4 接口对接 9.2 查看所有预约9.2.1 所有预约功能实现 9.3 审核预约 学习产出:

    学习内容:

    一、C++基础入门


    二、通讯录管理系统


    三、C++核心编程

    三、 C++核心编程(面向对象) 继承


    四、基于多态的企业职工系统


    五、C++提高编程(1)

    五、C++提高编程(2)


    六、基于STL泛化编程的演讲比赛


    七、C++实战项目机房预约管理系统

    1. 机房预约系统需求

    1.1 系统简介

    学校有几个规格不同的机房, 由于使用时经常出现“撞车”现象,现开发一套机房预约系统,解决这一问

    1.2 身份简介

    分别有三种身份使用该程序

    学生代表: 申请使用机房教师: 审核学生的预约申请管理员: 给学生、教师创建账号

    1.3 机房简介

    机房总共有三件

    1号机房 — 最大容量20人2号机房 — 最大容量50人3号机房 — 最大容量100人

    1.4 申请简介

    申请的订单每周由管理员负责清空学生可以预约未来一周内的机房使用,预约的日期为周一至周五,预约时需要选择预约时段(上午、下午)教师来审核预约,依赖实际情况审核预约通过或者不通过

    1.5 系统具体需求

    首先进入登录界面,可选登录身份有: 学生代表老师管理员退出 每个身份都需要进行验证后,进入子菜单 学生需要输入:学号、姓名、登录密码老师需要输入:职工号、姓名、登陆密码管理员需要输入:管理员姓名、登录密码 学生具体功能 申请预约 — 预约机房查看自身的预约 — 查看自己的预约状态查看所有预约 — 查看全部预约信息以及预约状态取消预约 — 取消自身的预约,预约成功或审核中的预约均可以取消注销登录 — 退出登录 教师具体功能 查看所有预约 — 查看全部预约信息以及预约状态审核预约 — 对学生的预约进行审核注销登录 — 退出登录 管理员具体功能 添加账号 — 添加学生或教师的账号,需要检测学生编号或教师职工号是否重复查看账号 — 可以选择查看学生或教师的全部信息查看机房 — 查看所有机房的信息

    2. 创建项目

    3. 创建主菜单

    功能描述:

    设计主要菜单,与用户进行交互

    3.1 菜单实现

    在主函数中添加菜单提示 int main() { cout << endl << "请输入您的身份" << endl; cout << "\t\t ---------------------------------\n"; cout << "\t\t | |\n"; cout << "\t\t | 1.学生代表 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 2.老 师 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 3.管 理 员 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 0.退 出 |\n"; cout << "\t\t | |\n"; cout << "\t\t ---------------------------------\n"; cout << "请输入您的选择:"; system("pause"); system("cls"); return 0; }

    3.2 搭建接口

    接受用户的选择,搭建接口在main中添加代码 int main() { int select = 0; while (true) { cout << endl << "请输入您的身份" << endl; cout << "\t\t ---------------------------------\n"; cout << "\t\t | |\n"; cout << "\t\t | 1.学生代表 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 2.老 师 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 3.管 理 员 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 0.退 出 |\n"; cout << "\t\t | |\n"; cout << "\t\t ---------------------------------\n"; cout << "请输入您的选择:"; cin >> select;//接受用户选择 switch (select) { case 1://学生身份 break; case 2://老师身份 break; case 3://管理员身份 break; case 0://退出系统 break; default: cout << "输入有误,请重新选择!" << endl; system("pause"); system("cls"); break; } } system("pause"); system("cls"); return 0; }

    4. 退出功能实现

    在main函数分支0选项中,添加退出程序代码:

    case 0://退出系统 cout << "欢迎下一次使用" << endl; system("pause"); return 0; break;

    5. 创建身份类

    5.1 身份的基类

    在整个系统中,有三种身份,分别为:学生代表、老师以及管理员三种身份有其共性,也有其特性,因此我们可以将三种身份抽象出一个身份基类 identity在头文件下创建identity.h文件,并添加如下代码 #pragma once #include <iostream> #include <string> using namespace std; //身份抽象类 class Identity { public: //操作菜单 纯虚函数 //每个子类都有自己单独的操作菜单 virtual void operMenu() = 0; string m_Name;//用户名 string m_Pwd;//密码 };

    5.2 学生类

    5.2.1 功能分析
    学生类主要功能是可以通过类中成员函数,实现预约实验室操作学生类中主要功能有: 显示学生操作的菜单界面申请预约查看自身预约查看所有预约取消预约
    5.2.2 类的创建
    在头文件以及源文件下创建student.h和student.cpp文件 //student.h //学生类 class Student :public Identity { public: //默认构造 Student(); //有参构造 Student(int id, string name, string pwd); //菜单界面 virtual void operMenu(); //申请预约 void applyOrder(); //查看我的预约 void showMyOrder(); //查看所有预约 void showAllOrder(); //取消预约 void cancelOrder(); //学生学号 int m_Id; }; //student.cpp #include "student.h" Student::Student() { } Student::Student(int id, string name, string pwd) { } void Student::operMenu() { } void Student::applyOrder() { } void Student::showMyOrder() { } void Student::showAllOrder() { } void Student::cancelOrder() { }

    5.3 老师类

    5.3.1 功能分析
    教师类主要功能是查看学生的预约,并进行审核教师类种主要功能有: 显示教师操作的菜单界面查看所有预约审核预约
    5.3.2 类的创建
    在头文件以及源文件下创建teacher.h和teacher.cpp文件 //teacher.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include "Identity.h" class Teacher :public Identity { public: //默认构造 Teacher(); //有参构造 Teacher(int id, string name, string pwd); //菜单界面 virtual void operMenu(); //查看所有预约 void showAllOrder(); //审核所有预约 void validOrder(); //教师编号 int m_EmpId; }; //teacher.cpp #include "teacher.h" Teacher::Teacher() { } Teacher::Teacher(int id, string name, string pwd) { } void Teacher::operMenu() { } void Teacher::showAllOrder() { } void Teacher::validOrder() { }

    5.4 管理员类

    5.4.1 功能分析
    管理员类主要功能是对学生和老师账户进行管理,查看机房信息以及清空预约记录管理员类中主要功能有: 显示管理员操作的菜单界面添加账号查看账号查看机房信息清空预约记录
    5.4.2 类的创建
    //manager.h #pragma once #include<iostream> using namespace std; #include "Identity.h" class Manager :public Identity { public: //默认构造 Manager(); //有参构造 Manager(string name, string pwd); //选择菜单 virtual void operMenu(); //添加账号 void addPerson(); //查看账号 void showPerson(); //查看机房信息 void showComputer(); //清空预约记录 void cleanFile(); }; //maganer.cpp #include "manager.h" Manager::Manager() { } Manager::Manager(string name, string pwd) { } void Manager::operMenu() { } void Manager::addPerson() { } void Manager::showPerson() { } void Manager::showComputer() { } void Manager::cleanFile() { }

    6. 登录模块

    6.1 全局文件添加

    功能描述:

    不同的身份可能会用到不同的文件操作,我们可以将所有的文件名定义到一个全局的文件中在头文件中添加 globalFile.h 文件并添加如下代码: #pragma once //管理员文件 constexpr auto ADMIN_FILE = "admin.txt"; //学生文件 constexpr auto STUDENT_FILE = "student.txt"; //教师文件 constexpr auto TEACHER_FILE = "teacher.txt"; //机房信息文件 constexpr auto COMPUTER_FILE = "computerRoom.txt"; //订单文件 constexpr auto ORDER_FILE = "order.txt";

    并在同级目录下创建相关.txt文件

    6.2 登录函数封装

    功能描述:

    根据用户的选择,进入不同的身份登录

    在预约系统的.cpp文件中添加全局函数 void LoginIn(string fileName, int type) 参数:

    fileName — 操作的文件名type — 登录的身份 (1代表学生、 2代表老师、 3代表管理员) #include <iostream> #include "globalFile.h" #include "Identity.h" #include <fstream> #include <string> using namespace std; //登录功能 参数1 操作文件名 参数2 操作身份类型 void LoginIn(string fileName, int type) { //父类指针 用于指向子类对象 Identity* person = nullptr; //读文件 ifstream ifs; ifs.open(fileName, ios::in); //判断文件是否存在 if (!ifs.is_open()) { cout << "文件不存在" << endl; ifs.close(); return; } //准备接受用户信息 int id = 0; string name; string pwd; //判断身份 if (type == 1) { //学生身份 cout << "请输入您的学号:" << endl; cin >> id; } else if (type == 2) { cout << "请输入您的职工号:" << endl; cin >> id; } cout << "请输入用户名:" << endl; cin >> name; cout << "请输入密码:" << endl; cin >> pwd; if (type == 1) { //学生身份验证 } else if (type == 2) { //教师身份验证 } else if (type == 3) { //管理员身份验证 } cout << "验证登录失败!" << endl; system("pause"); system("cls"); return; } int main() { int select = 0; while (true) { cout << endl << "请输入您的身份" << endl; cout << "\t\t ---------------------------------\n"; cout << "\t\t | |\n"; cout << "\t\t | 1.学生代表 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 2.老 师 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 3.管 理 员 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 0.退 出 |\n"; cout << "\t\t | |\n"; cout << "\t\t ---------------------------------\n"; cout << "请输入您的选择:"; cin >> select;//接受用户选择 switch (select) { case 1://学生身份 LoginIn(STUDENT_FILE, 1); break; case 2://老师身份 LoginIn(TEACHER_FILE, 2); break; case 3://管理员身份 LoginIn(ADMIN_FILE, 3); break; case 0://退出系统 cout << "欢迎下一次使用" << endl; system("pause"); return 0; break; default: cout << "输入有误,请重新选择!" << endl; system("pause"); system("cls"); break; } } system("pause"); system("cls"); return 0; }

    6.3 学生登录实现

    在student.txt文件中添加两条学生信息,用于测试

    添加信息

    1 张三 123 2 李四 123456

    其中:

    第一列代表 学号第二列代表 学生姓名第三列代表 密码

    在LoginIn函数的学生分支中加入如下代码,验证学生身份

    if (type == 1) { //学生身份验证 int fId; string fName; string fPwd; while (ifs >> fId && ifs >> fName && ifs >> fPwd) { //与用户输入的信息做对比 if (id == fId && name == fName && pwd == fPwd) { cout << "学生验证登录成功!" << endl; system("pause"); system("cls"); person = new Student(id, name, pwd); //进入学生身份的子菜单 return; } } }

    6.4 教师登录实现

    在teacher.txt文件中添加一条老师信息,用于测试

    添加信息

    1 laowang 123

    在LoginIn函数的教师分支中添加如下代码,验证身份

    else if (type == 2) { //教师身份验证 int fId; string fName; string fPwd; while (ifs >> fId && ifs >> fName && ifs >> fPwd) { //与用户输入的信息做对比 if (id == fId && name == fName && pwd == fPwd) { cout << "教师验证登录成功!" << endl; system("pause"); system("cls"); person = new Teacher(id, name, pwd); //进入老师身份的子菜单 return; } } }

    6.5 管理员登录实现

    在admin.txt文件中添加一条管理员信息,由于只有一条管理员,因此没有添加管理员的功能

    admin 123

    在LoginIn函数的管理员分支中添加如下代码,验证身份

    else if (type == 3) { //管理员身份验证 string fName; string fPwd; while (ifs >> fName && ifs >> fPwd) { //与用户输入的信息做对比 if (name == fName && pwd == fPwd) { cout << "管理员验证登录成功!" << endl; system("pause"); system("cls"); person = new Manager(name, pwd); //进入管理员身份的子菜单 return; } } }

    7. 管理员模块

    7.1 管理员登录和注销

    7.1.1 构造函数
    在manager类的构造函数中,初始化管理员信息 Manager::Manager(string name, string pwd) { this->m_Name = name; this->m_Pwd = pwd; }
    7.1.2 管理员子菜单
    在机房预约系统.cpp中,当用户登录的是管理员,添加管理员菜单接口将不同的分支提供出来 添加账号查看账号查看机房清空预约注销登录 实现注销功能

    添加全局函数 void managerMenu(Identity*& manager)

    //进入管理员子菜单界面 void managerMenu(Identity*& manager) { while (true) { //调用管理员子菜单 manager->operMenu(); //将父类指针 转为子类指针,调用子类里其他接口 Manager* man = (Manager*)manager; int select = 0; //接受用户的选项 cin >> select; if (select == 1) { //添加账号 cout << "添加账号" << endl; man->addPerson(); } else if (select == 2) { //查看账号 cout << "查看账号" << endl; man->showPerson(); } else if (select == 3) { //查看机房信息 cout << "查看机房" << endl; man->showComputer(); } else if (select == 4) { //清空预约 cout << "清空预约" << endl; man->cleanFile(); } else { delete manager;//销毁堆区对象 cout << "注销成功" << endl; system("pause"); system("cls"); return; } } }
    7.1.3 菜单功能实现
    再实现成员函数 void Manager::operMenu() void Manager::operMenu() { cout << "欢迎管理员:" << this->m_Name << "登录" << endl; cout << "\t\t ---------------------------------\n"; cout << "\t\t | |\n"; cout << "\t\t | 1.添加账号 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 2.查看账号 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 3.查看机房 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 4.清空预约 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 0.注销登录 |\n"; cout << "\t\t | |\n"; cout << "\t\t ---------------------------------\n"; cout << "请输入您的操作:"; }
    7.1.4 接口对接
    管理员成功登录后,调用管理员子菜单界面在管理员登录验证分支中,添加代码 else if (type == 3) { //管理员身份验证 string fName; string fPwd; while (ifs >> fName && ifs >> fPwd) { //与用户输入的信息做对比 if (name == fName && pwd == fPwd) { cout << "管理员验证登录成功!" << endl; system("pause"); system("cls"); person = new Manager(name, pwd); //进入管理员身份的子菜单 managerMenu(person); return; } } }

    7.2 添加账号

    功能描述:

    给学生或教师添加新的账号

    功能要求:

    添加时学生学号不能重复、教师职工号不能重复
    7.2.1 添加功能实现

    在Manager的addPerson成员函数中实现

    void Manager::addPerson() { cout << "请输入添加账号的类型" << endl; cout << "1、添加学生" << endl; cout << "2、添加老师" << endl; string fileName;//操作的文件名 string tip;//提示id号 ofstream ofs;//文件操作对象 int select = 0; cin >> select;//接受用户的选项 if (select == 1) { //添加的是学生 fileName = STUDENT_FILE; tip = "请输入学号:"; } else { fileName = TEACHER_FILE; tip = "请输入职工编号:"; } //利用追加的方式 写文件 ofs.open(fileName, ios::out | ios::app); int id; string name; string pwd; cout << tip << endl; cin >> id; cout << "请输入姓名:" << endl; cin >> name; cout << "请输入密码:" << endl; cin >> pwd; //向文件中添加数据 ofs << id << " " << name << " " << pwd << " " << endl; cout << "添加成功" << endl; system("pause"); system("cls"); ofs.close(); }
    7.2.2 去重操作

    功能描述: 添加新账号时,如果是重复的学生编号,或是重复的教师职工编号,提示有误

    7.2.2.1 读取信息
    要去除重复的账号,首先要将学生和教师的账号信息获取到程序中,方可检测在manager.h中,添加两个容器,用于存放学生和教师的信息添加一个新的成员函数 void initVector()初始化容器 //初始化容器 void initVector(); //学生容器 vector<Student> vStu; //教师容器 vector<Teacher> vTea;

    在Manager.cpp中实现

    void Manager::initVector() { //确保容器清空状态 vStu.clear(); vTea.clear(); //读取学生信息 ifstream ifs; ifs.open(STUDENT_FILE, ios::in); if (!ifs.is_open()) { cout << "文件读取失败" << endl; return; } Student s; while (ifs >> s.m_Id && ifs >> s.m_Name && ifs >> s.m_Pwd) { vStu.push_back(s); } //测试 cout << "当前学生数量为:" << vStu.size() << endl; ifs.close(); //读取老师信息 ifs.open(TEACHER_FILE, ios::in); if (!ifs.is_open()) { cout << "文件读取失败" << endl; return; } Teacher t; while (ifs >> t.EmpId && ifs >> t.m_Name && ifs >> t.m_Pwd) { vTea.push_back(t); } //测试 cout << "当前老师数量为:" << vTea.size() << endl; ifs.close(); }

    在有参构造函数中,调用初始化容器函数

    Manager::Manager(string name, string pwd) { this->m_Name = name; this->m_Pwd = pwd; //初始化容器 this->initVector(); }
    7.2.2.2 去重函数封装

    在manager.h文件中添加成员函数 bool checkRepeat(int id, int type);

    //检查重复 参数:(传入id,传入类型) 返回值:(true 代表有重复, false 代表没有重复) bool checkRepeat(int id, int type);

    在manager.cpp中实现

    bool Manager::checkRepeat(int id, int type) { if (type == 1) { for (vector<Student>::iterator it = vStu.begin(); it != vStu.end(); it++) { if (id == it->m_Id) return true; } } else { for (vector<Teacher>::iterator it = vTea.begin(); it != vTea.end(); it++) { if (id == it->m_EmpId) return true; } } return false; }
    7.2.2.3 添加去重操作

    在添加学生学号或教师职工号时,检测是否有重复

    if (select == 1) { //添加的是学生 fileName = STUDENT_FILE; tip = "请输入学号:"; errorTip = "学号重复,请重新输入"; } else { fileName = TEACHER_FILE; tip = "请输入职工编号:"; errorTip = "学号重复,请重新输入"; } //利用追加的方式 写文件 ofs.open(fileName, ios::out | ios::app); int id; string name; string pwd; cout << tip << endl; while (true) { cin >> id; bool ret = this->checkRepeat(id, select); if (ret)//有重复 cout << errorTip << endl; else break; }
    7.2.2.4 bug解决

    bug描述:

    虽然可以检测重复的账号,但是刚添加的账号由于没有更新到容器中,因此不会做检测导致刚加入的账号的学生号或者职工编号,再次添加时依然可以重复

    解决方案:

    在每次添加新账号时,重新初始化容器

    在添加完毕后,加入init代码:

    //向文件中添加数据 ofs << id << " " << name << " " << pwd << " " << endl; cout << "添加成功" << endl; system("pause"); system("cls"); ofs.close(); //初始化容器 this->initVector();

    7.3 显示账号

    在Manager的showPerson成员函数中,实现显示账号功能

    void printStudent(Student& s) { cout << "学号:" << s.m_Id << " 姓名:" << s.m_Name << " 密码:" << s.m_Pwd << endl; } void printTeacher(Teacher& t) { cout << "学号:" << t.m_EmpId << " 姓名:" << t.m_Name << " 密码:" << t.m_Pwd << endl; } //查看账号 void printStudent(Student& s) { cout << "学号:" << s.m_Id << " 姓名:" << s.m_Name << " 密码:" << s.m_Pwd << endl; } void printTeacher(Teacher& t) { cout << "学号:" << t.m_EmpId << " 姓名:" << t.m_Name << " 密码:" << t.m_Pwd << endl; } //查看账号 void Manager::showPerson() { cout << "请选择查看内容:" << endl; cout << "1、查看所有的学生" << endl; cout << "2、查看所有的老师" << endl; int select = 0;//接受用户选择 cin >> select; if (select == 1) { //查看学生 cout << "所有学生信息如下:" << endl; for_each(vStu.begin(), vStu.end(), printStudent); } else { //查看老师 cout << "所有老师信息如下:" << endl; for_each(vTea.begin(), vTea.end(), printTeacher); } system("pause"); system("cls"); }

    7.4 查看机房

    7.4.1 添加机房信息

    案例需求中,机房一共有三个,其中1号机房容量20,二号50,三号100台 将信息录入到computerRoom.txt中

    7.4.2 机房类创建

    在头文件下,创建新的文件 computerRoom.h

    #pragma once #include <iostream> using namespace std; //机房类 class ComputerRoom { public: int m_ComId;//机房Id号 int m_MaxNum;//机房最大容量 };
    7.4.3 初始化机房信息

    在Manager管理员类下,添加机房的容器,用于保存机房信息

    //机房容器 vector<ComputerRoom> vCom;

    在Manager有参构造函数中,追加代码,初始化机房信息

    Manager::Manager(string name, string pwd) { this->m_Name = name; this->m_Pwd = pwd; //初始化容器 this->initVector(); //获取机房信息 ifstream ifs; ifs.open(COMPUTER_FILE, ios::in); ComputerRoom c; while (ifs >> c.m_ComId && ifs >> c.m_MaxNum) { vCom.push_back(c); } cout << "当前机房数量为:" << vCom.size() << endl; ifs.close(); }
    7.4.4 显示机房信息

    在Manager类的showComputer成员函数中添加如下代码

    void Manager::showComputer() { cout << "机房信息如下:" << endl; for (vector<ComputerRoom>::iterator it = vCom.begin(); it != vCom.end(); it++) { cout << "机房编号:" << it->m_ComId << " 机房最大容量" << it->m_MaxNum << endl; } system("pause"); system("cls"); }

    7.5 清空预约

    功能描述: 清空生成的 order.txt 预约文件

    7.5.1 清空功能实现

    在manager的clean成员函数中添加如下代码:

    void Manager::cleanFile() { ofstream ofs(ORDER_FILE, ios::trunc); ofs.close(); cout << "清空成功!" << endl; system("pause"); system("cls"); }

    8. 学生模块

    8.1 学生登录和注销

    8.1.1 构造函数
    在Student类的构造函数中,初始化学生信息 Student::Student(int id, string name, string pwd) { //初始化属性 this->m_Id = id; this->m_Name = name; this->m_Pwd = pwd; }

    8.1.2 学生子菜单

    在机房预约系统.cpp中,当用户登录的时学生菜单接口将不同的分支提供出来 申请预约查看我的预约查看所有预约取消预约注销登录 实现注销功能

    添加main全局函数 void studentMenu(Identity*& student)

    //学生菜单 void studentMenu(Identity*& student) { while (true) { //学生菜单 student->operMenu(); Student* stu = (Student*) student; int select = 0; cin >> select; if (select == 1) { //申请预约 stu->applyOrder(); } else if (select == 2) { //查看自身预约 stu->showMyOrder(); } else if (select == 3) { //查看所有预约 stu->showAllOrder(); } else if (select == 4) { //取消预约 stu->cancelOrder(); } else { delete student; cout << "注销成功" << endl; system("pause"); system("cls"); return; } } }
    8.1.3 菜单功能实现
    实现成员函数 void Student::operMenu() void Student::operMenu() { cout << "欢迎学生代表:" << this->m_Name << "登录" << endl; cout << "\t\t ---------------------------------\n"; cout << "\t\t | |\n"; cout << "\t\t | 1.申请预约 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 2.查看我的预约 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 3.查看所有预约 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 4.取消预约 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 0.注销登录 |\n"; cout << "\t\t | |\n"; cout << "\t\t ---------------------------------\n"; cout << "请输入您的操作:"; }
    8.1.4 接口对接
    学生成功登录后,调用学生的子菜单界面在学生登录分支中,添加代码 if (type == 1) { //学生身份验证 int fId; string fName; string fPwd; while (ifs >> fId && ifs >> fName && ifs >> fPwd) { //与用户输入的信息做对比 if (id == fId && name == fName && pwd == fPwd) { cout << "学生验证登录成功!" << endl; system("pause"); system("cls"); person = new Student(id, name, pwd); //进入学生身份的子菜单 studentMenu(person); return; } } }

    8.2 申请预约

    8.2.1 获取机房信息
    在申请预约时,学生可以看到机房的信息,因此我们需要让学生获取到机房的信息 在student.h中添加新的成员函数: //机房容器 vector<ComputerRoom> vCom;

    在学生的有参构造函数中追加代码:

    Student::Student(int id, string name, string pwd) { //初始化属性 this->m_Id = id; this->m_Name = name; this->m_Pwd = pwd; //获取机房信息 ifstream ifs; ifs.open(COMPUTER_FILE, ios::in); ComputerRoom c; while (ifs >> c.m_ComId && ifs >> c.m_MaxNum) { vCom.push_back(c); } ifs.close(); }
    8.2.2 预约功能实现

    在student.cpp中实现成员函数 void Student::applyOrder()

    void Student::applyOrder() { cout << "机房开放时间为周一至周五" << endl; cout << "请输入申请预约的时间:" << endl; cout << "1、周一" << endl; cout << "2、周二" << endl; cout << "3、周三" << endl; cout << "4、周四" << endl; cout << "5、周五" << endl; int date = 0; int interval = 0; int room = 0; while (true) { cin >> date; if (date >= 1 && date <= 5) { break; } cout << "输入有误,请重新输入"; } cout << "请输入申请预约的时间段:" << endl; cout << "1、上午" << endl; cout << "2、下午" << endl; while (true) { cin >> interval; if (interval >= 1 && interval <= 2) { break; } cout << "输入有误,请重新输入" << endl; } cout << "请选择机房:" << endl; cout << "1号机房容量:" << vCom[0].m_MaxNum << endl; cout << "2号机房容量:" << vCom[1].m_MaxNum << endl; cout << "3号机房容量:" << vCom[2].m_MaxNum << endl; while (true) { cin >> room; if (room >= 1 && room <= 3) { break; } cout << "输入有误,请重新输入" << endl; } cout << "预约成功!审核中" << endl; ofstream ofs(ORDER_FILE, ios::app); ofs << "date:" << date << " "; ofs << "interval:" << interval << " "; ofs << "stuId:" << this->m_Id << " "; ofs << "stuName:" << this->m_Name << " "; ofs << "roomId:" << room << " "; ofs << "status:" << 1 << endl; ofs.close(); system("pause"); system("cls"); }

    8.3 显示预约

    8.3.1 创建预约类

    功能描述:显示预约记录时,需要从文件中获取到所有记录,用来显示,创建预约的类来管理记录以及更新

    在头文件以及源文件下分别创建orderFile.h和orderFile.cpp文件 orderFile.h添加代码:

    #pragma once #include <iostream> using namespace std; #include <map> #include "globalFile.h" class OrderFile { public: //构造函数 OrderFile(); //更新预约记录 void updateOrder(); //记录的容器 key --- 记录的条数 value ---具体记录的键值对信息 map<int, map<string, string>> m_orderData; //预约记录条数 };

    构造函数中获取所有信息,并存放在容器中,添加如下代码:

    OrderFile::OrderFile() { ifstream ifs; ifs.open(ORDER_FILE, ios::in); string date;//日期 string interval;//时间段 string stuId;//学生编号 string stuName;//学生姓名 string roomId;//机房编号 string status;//预约状态 this->m_Size = 0;//记录条数 while (ifs >> date && ifs >> interval && ifs >> stuId && ifs >> stuName && ifs >> roomId && ifs >> status) { //测试 //cout << date << endl; //cout << interval << endl; //cout << stuId << endl; //cout << stuName << endl; //cout << roomId << endl; //cout << status << endl; //cout << endl; string key; string value; map<string, string> m; //截取时间段 int pos = date.find(":"); // 4 if (pos != -1) { key = date.substr(0, pos); value = date.substr(pos + 1, date.size() - pos - 1); m.insert(make_pair(key, value)); } //截取间隔 pos = interval.find(":"); if (pos != -1) { key = interval.substr(0, pos); value = interval.substr(pos + 1, interval.size() - pos - 1); m.insert(make_pair(key, value)); } //截取学号 pos = stuId.find(":"); if (pos != -1) { key = stuId.substr(0, pos); value = stuId.substr(pos + 1, stuId.size() - pos - 1); m.insert(make_pair(key, value)); } //截取姓名 pos = stuName.find(":"); if (pos != -1) { key = stuName.substr(0, pos); value = stuName.substr(pos + 1, stuName.size() - pos - 1); m.insert(make_pair(key, value)); } //截取机房号 pos = roomId.find(":"); if (pos != -1) { key = roomId.substr(0, pos); value = roomId.substr(pos + 1, roomId.size() - pos - 1); m.insert(make_pair(key, value)); } //截取状态 pos = status.find(":"); if (pos != -1) { key = status.substr(0, pos); value = status.substr(pos + 1, status.size() - pos - 1); m.insert(make_pair(key, value)); } //将小map容器放入到大的map容器中 this->m_orderData.insert(make_pair(this->m_Size, m)); } ifs.close(); //测试最大map容器 //for (map<int, map<string, string>>::iterator it = m_orderData.begin(); // it != m_orderData.end(); it++) { // cout << "条数为:" << it->first << " value = " << endl; // for (map<string, string>::iterator mit = (*it).second.begin(); // mit != (*it).second.end(); mit++) { // cout << " key = " << mit->first << " value = " << mit->second << " "; // } // cout << endl; //} }

    更新预约记录的成员函数updateOrder代码如下:

    void OrderFile::updateOrder() { if (this->m_Size == 0) { return; } ofstream ofs(ORDER_FILE, ios::out | ios::trunc); for (int i = 0; i < m_Size; i++) { ofs << "date:" << this->m_orderData[i]["date"] << " "; ofs << "interval:" << this->m_orderData[i]["interval"] << " "; ofs << "stuId:" << this->m_orderData[i]["stuId"] << " "; ofs << "stuName:" << this->m_orderData[i]["stuName"] << " "; ofs << "roomId:" << this->m_orderData[i]["roomId"] << " "; ofs << "status:" << this->m_orderData[i]["status"] << endl; } ofs.close(); }
    8.3.2 显示自身预约

    在Student类的 void Student::showMyOrder() 成员函数中,添加如下代码:

    //查看自身预约 //查看自身预约 void Student::showMyOrder() { OrderFile of; if (of.m_Size == 0) { cout << "无预约记录" << endl; system("pause"); system("cls"); return; } for (int i = 0; i < of.m_Size; i++) { //string 转 int //string 利用 .c_str() 转 const char* //利用 atoi(const char*) 转 int if (atoi(of.m_orderData[i]["stuId"].c_str()) == this->m_Id) { cout << "预约日期: 周" << of.m_orderData[i]["date"]; cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午": "下午"); cout << " 机房号:" << of.m_orderData[i]["roomId"]; string status = "状态:"; //1 审核中 2 已预约 -1 预约失败 0 取消预约 if (of.m_orderData[i]["status"] == "1") { status += "审核中"; } else if (of.m_orderData[i]["status"] == "2") { status += "预约成功"; } else if (of.m_orderData[i]["status"] == "-1") { status += "预约失败,审核未通过"; } else { status += "预约已取消"; } cout << " " << status; cout << endl; } } system("pause"); system("cls"); }
    8.3.3 显示所有预约

    在Student类的 void Student::showAllOrder() 成员函数中,添加如下代码

    void Student::showAllOrder() { OrderFile of; if (of.m_Size == 0) { cout << "无预约记录" << endl; system("pause"); system("cls"); return; } for (int i = 0; i < of.m_Size; i++) { cout << i + 1 << "、"; cout << "预约日期: 周" << of.m_orderData[i]["date"]; cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午"); cout << " 学号:" << of.m_orderData[i]["stuId"]; cout << " 姓名:" << of.m_orderData[i]["stuName"]; cout << " 机房:" << of.m_orderData[i]["roomId"]; string status = "状态:"; //1 审核中 2 已预约 -1 预约失败 0 取消预约 if (of.m_orderData[i]["status"] == "1") { status += "审核中"; } else if (of.m_orderData[i]["status"] == "2") { status += "预约成功"; } else if (of.m_orderData[i]["status"] == "-1") { status += "预约失败,审核未通过"; } else { status += "预约已取消"; } cout << " " << status; cout << endl; } system("pause"); system("cls"); }

    8.4 取消预约

    在Student类的 void Student::cancelOrder() 成员函数中,添加如下代码:

    //取消预约 void Student::cancelOrder() { OrderFile of; if (of.m_Size == 0) { cout << "无预约记录" << endl; system("pause"); system("cls"); return; } cout << "审核中或以预约成功的记录可以取消,请输入取消的记录" << endl; vector<int> v; int index = 1; for (int i = 0; i < of.m_Size; i++) { if (atoi(of.m_orderData[i]["stuId"].c_str()) == this->m_Id) { if (of.m_orderData[i]["status"] == "1" || of.m_orderData[i]["status" == "2"]) { v.push_back(i); cout << index++ << "、 "; cout << "预约日期:周" << of.m_orderData[i]["date"]; cout << " 时段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午"); cout << " 机房:" << of.m_orderData[i]["roomId"]; string status = " 状态:"; if (of.m_orderData[i]["status"] == "1") { status += "审核中"; } else if (of.m_orderData[i]["status"] == "2") { status += "预约成功"; } cout << status << endl; } } } cout << "请输入取消的记录,0代表返回" << endl; int select = 0; while (true) { cin >> select; if (select >= 0 && select <= v.size()) { if (select == 0) { break; } else { of.m_orderData[v[select - 1]]["status"] = "0"; of.updateOrder(); cout << "已取消预约" << endl; break; } } cout << "输入有误,请重新输入" << endl; } }

    9. 教师模块

    9.1 教师登录和注销

    9.1.1 构造函数
    在Teacher类的构造函数中,初始化教师信息 Teacher::Teacher(int empId, string name, string pwd) { //初始化属性 this->m_EmpId = empId; this->m_Name = name; this->m_Pwd = pwd; }
    9.1.2 教师子菜单
    在机房预约系统.cpp中,当用户登录的是教师,添加教师菜单接口将不同的分支提供出来 查看所有预约审核预约注销登录 实现注销功能

    添加全局函数 void TeachrMenu(Identity*& teacher)

    //教师菜单 void TeacherMenu(Identity*& teacher) { while (true) { //教师菜单 teacher->operMenu(); Teacher* tea = (Teacher*)teacher; int select = 0; cin >> select; if (select == 1) { //查看所有预约 tea->showAllOrder(); } else if (select == 2) { //审核预约 tea->validOrder(); } else { delete teacher; cout << "注销成功" << endl; system("pause"); system("cls"); return; } } }
    9.1.3 菜单功能实现
    再实现成员函数 void Teacher::operMenu() { cout << "欢迎教师:" << this->m_Name << "登录!" << endl; cout << "\t\t ---------------------------------\n"; cout << "\t\t | |\n"; cout << "\t\t | 1.查看所有预约 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 2.审核预约 |\n"; cout << "\t\t | |\n"; cout << "\t\t | 0.注销登录 |\n"; cout << "\t\t | |\n"; cout << "\t\t ---------------------------------\n"; cout << "请选择您的操作:"; }
    9.1.4 接口对接
    教师成功登陆后,调用教师的子菜单界面再教师登录分支中,添加代码 else if (type == 2) { //教师身份验证 int fId; string fName; string fPwd; while (ifs >> fId && ifs >> fName && ifs >> fPwd) { //与用户输入的信息做对比 if (id == fId && name == fName && pwd == fPwd) { cout << "教师验证登录成功!" << endl; system("pause"); system("cls"); person = new Teacher(id, name, pwd); //进入老师身份的子菜单 TeacherMenu(person); return; } } }

    9.2 查看所有预约

    9.2.1 所有预约功能实现

    该功能与学生身份的查看所有预约功能相似,用于显示所有预约记录

    在Teacher.cpp中实现成员函数 void Teacher::showAllOrder()

    void Teacher::showAllOrder() { OrderFile of; if (of.m_Size == 0) { cout << "无预约记录" << endl; system("pause"); system("cls"); return; } for (int i = 0; i < of.m_Size; i++) { cout << i + 1 << "、"; cout << "预约日期: 周" << of.m_orderData[i]["date"]; cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午"); cout << " 学号:" << of.m_orderData[i]["stuId"]; cout << " 姓名:" << of.m_orderData[i]["stuName"]; cout << " 机房:" << of.m_orderData[i]["roomId"]; string status = "状态:"; //1 审核中 2 已预约 -1 预约失败 0 取消预约 if (of.m_orderData[i]["status"] == "1") { status += "审核中"; } else if (of.m_orderData[i]["status"] == "2") { status += "预约成功"; } else if (of.m_orderData[i]["status"] == "-1") { status += "预约失败,审核未通过"; } else { status += "预约已取消"; } cout << " " << status; cout << endl; } system("pause"); system("cls"); }

    9.3 审核预约

    功能描述:教师审核学生的预约,依据实际情况审核预约

    在Teacher.cpp中实现成员函数 void Teacher::validOrder()

    void Teacher::validOrder() { OrderFile of; if (of.m_Size == 0) { cout << "无预约记录" << endl; system("pause"); system("cls"); return; } cout << "待审核的预约记录如下:" << endl; vector<int> v; int index = 0; for (int i = 0; i < of.m_Size; i++) { if (of.m_orderData[i]["status"] == "1") { v.push_back(i); cout << ++index << "、"; cout << "预约日期:周" << of.m_orderData[i]["date"]; cout << " 时间段:" << (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午"); cout << " 学生编号:" << of.m_orderData[i]["stuId"]; cout << " 学生姓名:" << of.m_orderData[i]["stuName"]; cout << " 机房编号:" << of.m_orderData[i]["roomId"]; string status = "状态: 审核中"; cout << status << endl; } } cout << "请输入审核的预约记录, 0代表返" << endl; int select = 0;//接收用户选择的预约记录 int ret = 0;//接收预约结果记录 while (true) { cin >> select; if (select >= 0 && select <= v.size()) { if (select == 0) break; else { cout << "请输入审核结果" << endl; cout << "1、通过" << endl; cout << "2、不通过" << endl; cin >> ret; if (ret == 1) { //通过 of.m_orderData[v[select - 1]]["status"] = "2"; } else { //不通过 of.m_orderData[v[select - 1]]["status"] = "-1"; } of.updateOrder();//更新记录 cout << "审核完毕" << endl; break; } } cout << "输入有误,请重新输入!" << endl; } system("pause"); system("cls"); }

    学习产出:

    1、github 啃STL简化项目,能够自己实现STL相关项目 2、做一个微信小程序,具体功能暂定

    Processed: 0.012, SQL: 9