C++笔记打卡第25天(机房预约系统)

1.机房预约系统需求

1.1 系统简介

学校有几个规格不同的机房,使用时经常会出现重复现象,现开发一套机房预约系统,解决这一问题。

1.2 身份简介

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

  • 学生代表:申请试用机房
  • 教师:审核学生的预约申请
  • 管理员:为学生和教师创建账号

1.3 机房简介

总共有3种机房:

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

1.4 申请简介

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

1.5 系统具体需求

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

2.创建主菜单

2.1 菜单实现

int main()
{cout << "************欢迎使用机房预约系统******************" << endl;cout << "\\t\\t ----------------------------------\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           1.学生登录             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           2.老师登录             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|          3.管理员登录            |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|            0.退出               |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t ----------------------------------\\n" << endl;cout << "请输入您的选择:" ;system("pause");return 0;
}

2.2 搭建接口

nt main()
{int select = 0;while(true){cout << "************欢迎使用机房预约系统******************" << endl;...cout << "请输入您的选择:" ;cin >> select;switch (select){case 1:/* code */break;case 2:/* code */break;case 3:/* code */break;case 0:/* code */break;default:cout << "输入有误!请重新输入!" << endl;system("pause");system("cls");break;}}system("pause");return 0;
}

3.实现退出功能

在main函数分支0选项中:

case 0:cout << "欢迎您下次使用" << endl;return 0;break;

4.创建身份类

4.1 身份的基类

  • 在整个系统中有三种身份:分别为学生、老师、管理员
  • 三种身份有共性也有特性。因此可以定义一个身份基类
  • 在头文件下创建identify.h文件

在identify.h中:

#pragma once
#include<iostream>
using namespace std;class Identify
{
public:// 纯虚函数实现多态virtual void openMenu() = 0;string m_name;string m_password;
};

!无需任何具体实现,因此无需创建identify.cpp

4.2 学生类

创建student.h和student.cpp:

在student.h写声明:

#pragma once
#include<iostream>
#include<identify.h>
using namespace std;class Student: public Identify
{
public:// 默认构造Student();// 有参构造Student(string name, string password, int id);// 子菜单virtual void openMenu();// 申请预约void applyOrder();// 查看我的预约void showMyOrder();// 查看所有预约void showAllOrder();// 取消预约void cancelOrder();// 学生学号int m_id;
};

在student.cpp写具体实现:

#include<student.h>// 默认构造
Student::Student()
{}// 有参构造
Student::Student(string name, string password, int id)
{}// 子菜单
void Student::openMenu()
{}// 申请预约
void Student::applyOrder()
{}// 查看我的预约
void Student::showMyOrder()
{}// 查看所有预约
void Student::showAllOrder()
{}// 取消预约
void Student::cancelOrder()
{}

4.3 老师类

创建teacher.h和teacher.cpp:

在teacher.h中:

#pragma once
#include<iostream>
#include<identify.h>
using namespace std;class Teacher: public Identify
{
public:// 默认构造Teacher();// 有参构造Teacher(string name, string password, int tid);// 子菜单virtual void openMenu();// 审核预约void validOrder();// 查看所有预约void showAllOrder();// 职工号int m_tid;
};

在teacher.cpp中:

#include<teacher.h>// 默认构造
Teacher::Teacher()
{}// 有参构造
Teacher::Teacher(string name, string password, int tid)
{}// 子菜单
void Teacher::openMenu()
{}// 审核预约
void Teacher::validOrder()
{}// 查看所有预约
void Teacher::showAllOrder()
{}

4.4 管理员类

创建manager.h和manager.cpp:

在manager.h中:

#pragma once
#include<iostream>
#include<identify.h>
using namespace std;class Manager: public Identify
{
public:// 默认构造Manager();// 有参构造Manager(string name, string password);// 子菜单virtual void openMenu();// 添加账号void addPerson();// 查看账号void showPerson();// 查看机房信息void showComputer();// 清空预约记录void cleanFile();
};

在manager.cpp中:

#include<manager.h>// 默认构造
Manager::Manager()
{}// 有参构造
Manager::Manager(string name, string password)
{}// 子菜单
void Manager::openMenu()
{}// 添加账号
void Manager::addPerson()
{}// 查看账号
void Manager::showPerson()
{}// 查看机房信息
void Manager::showComputer()
{}// 清空预约记录
void Manager::cleanFile()
{}

5 登录模块

5.1 添加全局文件

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

并在同级目录下,创建这几个文件

5.2 封装登录函数

  • 根据用户的选择,进入不同的身份登录
  • 在预约系统的.cpp文件中添加全局函数void LogIn(string fileName, int type)
// 登录
void LoginIn(string filename, int type)
{Identify* person = NULL;  // 创建父类指针指向子类对象// 读文件ifstream ifs;ifs.open(filename, ios::in);if(!ifs.is_open()){cout << "文件不存在" << endl;ifs.close();return;}// 准备接受用户的信息int Id = 0;string name;string password;if(type == 1){cout << "请输入您的学号:" << endl;cin >> Id;}else if(type == 2){cout << "请输入您的职工号:" << endl;cin >> Id;}cout << "请输入您的用户名:" << endl;cin >> name;cout << "请输入密码:" << endl;cin >> password;if(type == 1){// 学生身份验证}else if(type == 2){// 老师身份验证}else if(type == 3){// 管理员身份验证}cout << "验证登录失败!" << endl;system("pause");system("cls");return; 
}

在main函数的不同分支中,加入接口

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:...default:cout << "输入有误!请重新输入!" << endl;system("pause");system("cls");break;}

5.3 学生登录实现

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

1 张三 123
2 李四 123456

在LoginIn函数中验证学生身份:

if(type == 1){// 学生身份验证int fId;string fname;string fpassword;while(ifs >> fId && ifs >> fname && ifs >> fpassword){if(Id == fId && name == fname && password == fpassword){cout << "验证登陆成功!" << endl;system("pause");system("cls");person = new Student(name, password, Id);/* code */  // studentmenu(person) 子菜单return;}}}

5.4 教师登录实现

在teacher.txt中加入一条信息,用于测试:

1 老王 999

在LoginIn函数中验证老师身份:

else if(type == 2){// 老师身份验证int fId;string fname;string fpassword;while(ifs >> fId && ifs >> fname && ifs >> fpassword){if(Id == fId && name == fname && password == fpassword){cout << "验证登陆成功!" << endl;system("pause");system("cls");person = new Teacher(name, password, Id);/* code */  // teachermeenu(person)return;}}}

5.5 管理员登录实现

在admin.txt中添加一条测试信息:

小刘 123456

在LoginIn函数中验证管理员身份:

else if(type == 3){// 管理员身份验证string fname;string fpassword;while(ifs >> fname && ifs >> fpassword){if(name == fname && password == fpassword){cout << "验证登陆成功!" << endl;system("pause");system("cls");person = new Manager(name, password);/* code */  // managermenu(person)return;}}}

6.管理员模块

6.1 管理员登录和注销

在构造函数中初始化管理员信息:

// 有参构造
Manager::Manager(string name, string password)
{this->m_name = name;this->m_password = password;
}

在main.cpp中添加全局函数展示管理员子菜单:

// 进入管理员子菜单
void managermenu(Identify* &manager)
{while(true){manager->openMenu();// 将父类指针转为子类指针,可以调用子类特有的接口// 将一个指向基类的指针转换为指向派生类的指针Manager* man = (Manager*) manager;int select = 0;cout << "请输入您的选择:" ;cin >> select;switch(select){case 1:man->addPerson();break;case 2:man->showPerson();break;case 3:man->showComputer();break;case 4:man->cleanFile();break;case 0:delete manager;cout << "注销成功" << endl;system("pause");system("cls");return;default:cout << "输入错误!请重新输入!" << endl;;system("pause");system("cls");break;}}
}

6.2 添加账号

void Manager::addPerson()
{int select = 0;cout << "请输入需要添加的账号类型(1-添加学生, 2-添加教师):";cin >> select;int Id;string name;string password;ofstream ofs;if(select == 1){ofs.open(STUDENT_FILE, ios::out | ios::app);cout << "请输入学号:" << endl;}else{ofs.open(TEACHER_FILE, ios::out | ios::app);cout << "请输入职工号:" << endl;}cin >> Id;cout << "请输入用户名:" << endl;cin >> name;cout << "请输入密码:" << endl;cin >> password;ofs << Id << " " << name << " " << password << endl;ofs.close();cout << "添加成功!" << endl;system("pause");system("cls");return;
}

6.3 去重操作

  • 要去除重复的账号,首先要先将学生和老师的账号信息获取到程序中,方可检测
  • 在manager.h中,添加两个容器,存放学生和老师的信息
  • 添加一个成员函数initVector()初始化容器
    void initVector();vector<Student> vStu;vector<Teacher> vTea;
void Manager::initVector()
{// 确保容器是空的vStu.clear();vTea.clear();// 读取学生文件中的信息ifstream ifs;ifs.open(STUDENT_FILE, ios::in);if(!ifs.is_open()){cout << "文件不存在" << endl;system("pause");system("cls");return;}Student s;while(ifs >> s.m_id && ifs >> s.m_name && ifs >> s.m_password){vStu.push_back(s);}cout << "当前系统中学生数量为:" << vStu.size() << endl;ifs.close();// 读取教师文件中的信息ifstream ifs1;ifs1.open(TEACHER_FILE, ios::in);if(!ifs1.is_open()){cout << "文件不存在" << endl;system("pause");system("cls");return;}Teacher t;while(ifs1 >> t.m_tid && ifs1 >> t.m_name && ifs1 >> t.m_password){vTea.push_back(t);}cout << "当前系统中教师数量为:" << vTea.size() << endl;ifs.close();
}

检测是否有重复:

bool checkRepeat(int id, int type);
bool Manager::checkRepeat(int id, int type)
{if(type == 1){for(vector<Student>::iterator it=vStu.begin(); it!=vStu.end(); it++){if(it->m_id == id){return true;}}return false;}else{for(vector<Teacher>::iterator it=vTea.begin(); it!=vTea.end(); it++){if(it->m_tid == id){return true;}}return false;}
}

将这个检测函数加入添加账号的函数当中:

void Manager::addPerson()
{...string Tip;string errorTip;...if(select == 1){...Tip = "请输入学号:";errorTip = "学号重复!请重新输入!";}else{...Tip = "请输入职工号:";errorTip = "职工号重复!请重新输入!";}while(true){cout << Tip;cin >> Id;bool ret = this->checkRepeat(Id, select);if(ret){cout << errorTip << endl;}else{break;}}...// 更新vectorthis->initVector();...
}

这里存在一个bug,对于刚添加的账号没有及时更新到容器中,导致无法检测重复

只需要在函数最后加上更新的步骤 this->initVector()!

6.4 显示账号

// 查看账号
void Manager::showPerson()
{int select = 0;cout << "请选择要查看的内容(1-所有学生信息, 2-所有教师信息):" << endl;cin >> select;if(select == 1){for(vector<Student>::iterator it=vStu.begin(); it!=vStu.end(); it++){cout << "学号:" << it->m_id << " 姓名:" << it->m_name << " 密码:" << it->m_password << endl;}}else{for(vector<Teacher>::iterator it=vTea.begin(); it!=vTea.end(); it++){cout << "职工号:" << it->m_tid << " 姓名:" << it->m_name << " 密码:" << it->m_password << endl;}}system("pause");system("cls");
}

6.5 查看机房

将信息录入computerRoom.txt中:

1 20
2 50
3 100

创建机房类computerRoom.h:

#pragma once
#include<iostream>
using namespace std;class ComputerRoom
{
public:int m_ConId;  // 机房idint m_MaxNum;  // 机房最大容量
};

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

  vector<ComputerRoom> vCR;

在Manager的构造函数中进行初始化:

// 有参构造
Manager::Manager(string name, string password)
{...ifstream ifs;ifs.open("computerRoom.txt", ios::in);ComputerRoom cr;while(ifs >> cr.m_ConId && ifs >> cr.m_MaxNum){vCR.push_back(cr);}cout << "当前机房数量为:" << vCR.size() << endl;ifs.close();
}

查看机房信息:

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

6.6 清空预约记录

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

7.学生模块

7.1 学生登录和注销

在构造函数中初始化学生信息:

Student::Student(string name, string password, int id)
{this->m_name = name;this->m_password = password;this->m_id = id;
}

进入学生子菜单界面:

// 进入学生子菜单
void studentmenu(Identify* &student)
{while(true){student->openMenu();// 将父类指针转为子类指针,可以调用子类特有的接口Student* stu = (Student*) student;int select = 0;cout << "请输入您的选择:" ;cin >> select;switch(select){case 1:stu->applyOrder();break;case 2:stu->showMyOrder();break;case 3:stu->showAllOrder();break;case 4:stu->cancelOrder();break;case 0:delete student;cout << "注销成功" << endl;system("pause");system("cls");return;default:cout << "输入错误!请重新输入!" << endl;;system("pause");system("cls");break;}}
}

显示菜单的函数:

// 子菜单
void Student::openMenu()
{cout << "欢迎学生" << this->m_name << "登录!" << endl;cout << "\\t\\t **********************************\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           1.申请预约             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           2.我的预约             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           3.所有预约             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           4.取消预约             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           0.注销登录             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t **********************************\\n" << endl;
}

7.2 申请预约

在申请预约时,学生可以看到机房的信息,因此我们需要让学生获取到机房的信息。

在student.h中添加机房容器:

#include<vector>
#include<fstream>
#include<computerRoom.h>
#include<globalFile.h>vector<ComputerRoom> vCR;

在有参构造中进行初始化:

// 有参构造
Student::Student(string name, string password, int id)
{...ifstream ifs;ifs.open(COMPUTER_FILE, ios::in);ComputerRoom cr;while(ifs >> cr.m_ConId && ifs >> cr.m_MaxNum){vCR.push_back(cr);}cout << "当前机房数量为:" << vCR.size() << endl;ifs.close();
}

学生申请预约,并将预约信息保存到order.txt中:

// 申请预约
void Student::applyOrder()
{int date = 0;cout << "机房开放时间为周一至周五!" << endl;cout << "请输入申请预约的时间(1-周一, 2-周二, 3-周三, 4-周四, 5-周五):";while(true){cin >> date;if(date > 0 && date < 6){break;}else{cout << "输入错误!请重新输入!" << endl;}}int interval = 0;  // 时间段cout << "请输入申请预约的时间(1-上午, 2-下午):";while(true){cin >> interval;if(interval > 0 && interval< 3){break;}else{cout << "输入错误!请重新输入!" << endl;}}int room = 0;  // 机房idfor(int i=0; i<vCR.size(); i++){cout << vCR[i].m_ConId << "号机房最大容量为:" << vCR[i].m_MaxNum<<  endl;}cout << "请输入申请预约的机房编号:";while(true){cin >> room;if(room > 0 && room < 4){break;}else{cout << "输入错误!请重新输入!" << endl;}}cout << "预约成功!审核中" << endl;ofstream ofs;ofs.open(ORDER_FILE,ios::app);ofs << "date:" << date << " " ;ofs << "interval:" << interval << " ";ofs << "stuId:" << this->m_id << " "; ofs << "stuName:" << this->m_name << " "; ofs << "room:" << room << " ";ofs << "status:" << 1 << endl;ofs.close();system("pause");system("cls");
}

7.3 显示预约记录

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

创建orderFile.h和orderFile.cpp文件:

#pragma once
#include<iostream>
#include<globalFile.h>
#include<fstream>
#include<map>
#include<string>
using namespace std;class OrderFile
{
public:OrderFile();// 更新预约记录void updateOrder();// 记录预约条数int m_Size;// 记录所有预约信息的容器 key记录条数,map具体记录属性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 room;string status;this->m_Size = 0;  // 记录条数while(ifs >> date && ifs >> interval && ifs >> stuID && ifs >> stuName && ifs >> room && ifs >> status){// date:1string key;string value;map<string,string> m;int pos = date.find(":");  // 4if(pos!= -1){key = date.substr(0, pos);value = date.substr(pos+1);m.insert(make_pair(key, value));}pos = interval.find(":");  // 4if(pos!= -1){key = interval.substr(0, pos);value = interval.substr(pos+1);m.insert(make_pair(key, value));}pos = stuID.find(":");  // 5if(pos!= -1){key = stuID.substr(0, pos);value = stuID.substr(pos+1);m.insert(make_pair(key, value));}pos = stuName.find(":");  // 4if(pos!= -1){key = stuName.substr(0, pos);value = stuName.substr(pos+1);m.insert(make_pair(key, value));}pos = room.find(":");  // 4if(pos!= -1){key = room.substr(0, pos);value = room.substr(pos+1);m.insert(make_pair(key, value));}pos = status.find(":");  // 4if(pos!= -1){key = status.substr(0, pos);value = status.substr(pos+1, date.size()-pos-1);m.insert(make_pair(key, value));}this->m_OrderData.insert(make_pair(this->m_Size, m));this->m_Size++;}ifs.close();for(map<int,map<string,string>>::iterator it=this->m_OrderData.begin(); it!=this->m_OrderData.end(); it++){cout << "key=" << it->first << " value=" << endl;for(map<string,string>::iterator its=it->second.begin(); its!=it->second.end(); its++){cout << its->first << ":" << its->second << " ";}cout << endl;}
}
// 更新预约记录
void OrderFile::updateOrder()
{if(this->m_Size == 0){return;}ofstream ofs;ofs.open(ORDER_FILE, ios::out | ios::trunc);for(int i=0; i<this->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 << "room:" << this->m_OrderData[i]["room"] << " ";ofs << "status:" << this->m_OrderData[i]["status"] << endl;}ofs.close();
}

7.4 显示自身预约记录

// 查看我的预约
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 *)转为intif(this->m_id == atoi(of.m_OrderData[i]["stuId"].c_str())){cout << "预约日期: 周" << of.m_OrderData[i]["date"];cout << "  时间段:" << ((of.m_OrderData[i]["interval"]=="1") ? "上午" : "下午");cout << "  机房编号:" << of.m_OrderData[i]["room"];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 << endl;}}system("pause");system("cls"); 
}

7.5 显示所有预约

// 查看所有预约
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 << "预约日期: 周" << 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]["room"];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 << endl;}system("pause");system("cls"); 
}

7.6 取消预约

// 取消预约
void Student::cancelOrder()
{OrderFile of;if(of.m_Size == 0){cout << "无预约记录" << endl;system("pause");system("cls");return;}cout << "审核中或预约成功的记录可以取消。" << endl;cout << "当前可以取消的记录如下:" << endl;vector<int> v;  // 存放在最大容器中的下标编号int index = 1;for(int i=0; i<of.m_Size; i++){if(this->m_id == atoi(of.m_OrderData[i]["stuId"].c_str())){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]["room"];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 << endl;}}}int select = 0;while(true){cout << "请输入需要取消的记录编号,输入0表示返回:";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;}}else{cout << "输入错误!请重新输入!" << endl;}}system("pause");system("cls"); 
}

8.教师模块

8.1 教师登录与注销

在构造函数中初始化教师信息:

// 有参构造
Teacher::Teacher(string name, string password, int tid)
{this->m_name = name;this->m_password = password;this->m_tid = tid;
}

进入教师子菜单界面:

void teachermenu(Identify* &teacher)
{while(true){teacher->openMenu();Teacher* tea = (Teacher*) teacher;int select = 0;cout << "请输入您的选择:" ;cin >> select;switch(select){case 1:tea->validOrder();break;case 2:tea->showAllOrder();break;case 0:delete teacher;cout << "注销成功" << endl;system("pause");system("cls");return;default:cout << "输入错误!请重新输入!" << endl;;system("pause");system("cls");break;}}
}

显示菜单的函数:

void Teacher::openMenu()
{cout << "欢迎教师" << this->m_name << "登录!" << endl;cout << "\\t\\t **********************************\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           1.审核预约             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           2.所有预约             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t|           0.注销登录             |\\n" << endl;cout << "\\t\\t|                                 |\\n" << endl;cout << "\\t\\t **********************************\\n" << endl;
}

8.2 展示所有预约

// 查看所有预约
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 << ".";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]["room"];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 << endl;}system("pause");system("cls");
}

8.3 审核预约

void Teacher::validOrder()
{OrderFile of;if(of.m_Size == 0){cout << "当前无预约记录" << endl;system("pause");system("cls");return;}int index = 1;vector<int> v;cout << "待审核的预约记录如下:" << endl;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]["room"];cout << "  状态:审核中" << endl;}}int select = 0;int ret = 0;while(true){cout << "请选择您要审核的记录编号, 输入0表示返回:";cin >> select;if(select >=0 && select <=v.size()){if(select == 0){break;}cout << "请选择审核结果(1-通过, 2-不通过):";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");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解网络原理3----TCP核心特性介绍(上)【面试高频考点】

文章目录 前言TCP协议段格式一、确认应答【保证可靠性传输的机制】二、超时重传【保证可靠性传输的机制】三、连接管理机制【保证可靠性传输的机制】3.1建立连接&#xff08;TCP三次握手&#xff09;---经典面试题3.2断开连接&#xff08;四次挥手&#xff09;3.3TCP状态转换 四…

车载电子电器架构 —— 如何理解和使用Update bit

车载电子电器架构 —— 如何理解和使用Update bit 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不…

RabbitMQ(Docker 单机部署)

序言 本文给大家介绍如何使用 Docker 单机部署 RabbitMQ 并与 SpringBoot 整合使用。 一、部署流程 拉取镜像 docker pull rabbitmq:3-management镜像拉取成功之后使用下面命令启动 rabbitmq 容器 docker run \# 指定用户名-e RABBITMQ_DEFAULT_USERusername \# 指定密码-e R…

C++学习--点滴记录011

11函数提高 11.1 函数默认参数 在C中&#xff0c;函数的形参列表中的形参可以有默认值 语法&#xff1a; 返回值类型 函数名 &#xff08;参数 默认值&#xff09;{} 示例&#xff1a; #include <iostream> using namespace std;int func(int a, int b 10, int c …

IoTDB 入门教程 基础篇③——基于Linux系统快速安装启动和上手

文章目录 一、前文二、下载三、解压四、上传五、启动六、执行七、停止八、参考 一、前文 IoTDB入门教程——导读 二、下载 下载二进制可运行程序&#xff1a;https://dlcdn.apache.org/iotdb/1.3.1/apache-iotdb-1.3.1-all-bin.zip 历史版本下载&#xff1a;https://archive.…

springboot 集成 flowable

随着企业对于业务流程管理需求的增加&#xff0c;流程引擎在企业信息化建设中的作用越来越重要。Flowable是一个开源的轻量级业务流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;它支持BPMN 2.0标准。 Flowable的一些特点&#xff1a; 安装集成&#xff1a;Flow…

每日一题(AL001):A+B Format--字符串处理

找输出的顺序很重要&#xff1a; #include<bits/stdc.h> using namespace std; int main(){int a,b;cin>>a>>b;int sumab;if(sum0) cout<<0;bool ftrue;vector<char> v;if(sum<0) {ffalse; sum-sum;}while(sum>0){char cstatic_cast<c…

Redis之Stream流

reidis为了抢占市场份额&#xff0c;推出了自己的消息队列&#xff0c;Stream流&#xff0c; 常用操作如下&#xff1a; xadd name id值 key value key1 value1...&#xff1a;若不存在为name的stream流&#xff0c;则创建一个新的名为name的stream流。这里id相当于数据库中的…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 1

以下摘录一些章节片段&#xff1a; 1. 概论 自动驾驶系统的认知中有一些模糊的地方&#xff0c;比如自动驾驶系统如何定义的问题&#xff0c;自动驾驶的研发为什么会有那么多的子模块&#xff0c;怎么才算自动驾驶落地等等。本章想先给读者一个概括介绍&#xff0c;了解自动驾…

R语言中,查看经安装的包,查看已经加载的包,查看特定包是否已经安装,安装包,更新包,卸载包

创建于&#xff1a;2024.5.4 R语言中&#xff0c;查看经安装的包&#xff0c;查看已经加载的包&#xff0c;查看特定包是否已经安装&#xff0c;安装包&#xff0c;更新包&#xff0c;卸载包 文章目录 1. 查看经安装的包2. 查看已经加载的包3. 查看特定包是否已经安装4. 安装包…

【netty系列-03】深入理解NIO的基本原理和底层实现(详解)

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

B树与B+树

B树定义 每个节点最多有m-1个关键字&#xff08;可以存有的键值对&#xff0c;m表示树的高度&#xff09;根节点最少可以只有1个关键字非根节点至少有m/2个关键字每个节点中的关键字都按照从小到大的顺序排列&#xff0c;每个关键字的左子树中的所有关键字都小于它&#xff0c…

如何将 redis 快速部署为 docker 容器?

部署 Redis 作为 Docker 容器是一种快速、灵活且可重复使用的方式&#xff0c;特别适合开发、测试和部署环境。本文将详细介绍如何将 Redis 部署为 Docker 容器&#xff0c;包括 Docker 安装、Redis 容器配置、数据持久化、网络设置等方面。 步骤 1&#xff1a;安装 Docker 首…

JavaEE 多线程详细讲解(1)

1.线程是什么 &#xff08;shift F6&#xff09;改类名 1.1.并发编程是什么 &#xff08;1&#xff09;当前的CPU&#xff0c;都是多核心CPU &#xff08;2&#xff09;需要一些特定的编程技巧&#xff0c;把要完成的仍无&#xff0c;拆解成多个部分&#xff0c;并且分别让…

中国打造成熟工艺产能,台积电力推先进工艺,反杀成功了!

分析机构指出2023年Q4全球芯片市场28纳米及以上工艺芯片占比在快速下降&#xff0c;已跌穿五成&#xff0c;这主要是台积电力推芯片企业向先进工艺发展&#xff0c;与中国大陆打造的成熟工艺芯片抗衡。 分析机构指出2023年Q4全球芯片以工艺划分&#xff0c;28纳米及以上工艺的芯…

考研入门55问---基础知识篇

考研入门55问---基础知识篇 01 &#xff1e;什么是研究生入学考试&#xff1f; 研究生是指大专和本科之后的深造课程。以研究生为最高学历, 研究生毕业后&#xff0c;也可称研究生&#xff0c;含义为研究生学历的人。在中国大陆地区&#xff0c;普通民众一般也将硕士毕业生称…

[入门] Unity Shader前置知识(5) —— 向量的运算

在Unity中&#xff0c;向量无处不在&#xff0c;我想很多人都使用过向量类的内置方法 normalized() 吧&#xff0c;我们都知道该方法是将其向量归一化从而作为一个方向与速度相乘&#xff0c;以达到角色朝任一方向移动时速度都相等的效果&#xff0c;但内部具体是如何将该向量进…

Spring - 8 ( 10000 字 Spring 入门级教程 )

一&#xff1a; MyBatis 1.1 引入 MyBatis 我们学习 MySQL 数据库时&#xff0c;已经学习了 JDBC 来操作数据库, 但是 JDBC 操作太复杂了. 我们先来回顾⼀下 JDBC 的操作流程: 创建数据库连接池 DataSource通过 DataSource 获取数据库连接 Connection编写要执行带 ? 占位符…

21岁的人生赚51W!拒绝捞男捞女,翻身也要爱惜身体!——早读(逆天打工人爬取热门微信文章解读)

身体是革命的本钱 引言Python 代码第一篇 卢克文工作室 捞女在今天的中国是怎样的存在第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 我将我的健康视为生活的基石 不会为了短暂的成功而牺牲 我珍惜身体 知道健康是实现梦想的前提 引言 这里毕竟是一个程序员的代码学习平台…

LVS/NAT工作模式介绍及配置

1.1 LVS/NAT模式工作原理 LVS&#xff08;Linux Virtual Server&#xff09;的网络地址转换&#xff08;NAT&#xff09;模式是一种在网络层&#xff08;第四层&#xff09;实现负载均衡的方法。在NAT模式中&#xff0c;Director Server&#xff08;DS&#xff09;充当所有服务…