C++初级项目——机房预约系统
2021-03-08 20:27
标签:类对象 输入日期 构造函数 将不 现象 init global 自己 覆盖 分别有三种身份使用该程序 机房总共有3间 创建项目步骤如下: 如图: 功能描述: 运行效果如图: 测试,输入0、1、2、3会重新回到界面,输入其他提示输入有误,清屏后重新选择 效果如图: 至此,界面搭建完毕 在main函数分支 0 选项中,添加退出程序的代码: 运行程序,效果如图: 至此,退出程序功能实现 Identity.h中添加如下代码: 效果如图: 学生类主要功能是可以通过类中成员函数,实现预约实验室操作 学生类中主要功能有: student.h中添加如下代码: student.cpp中添加如下代码: 教师类主要功能是查看学生的预约,并进行审核 教师类中主要功能有: 显示教师操作的菜单界面 查看所有预约 审核预约 teacher.h中添加如下代码: 管理员类主要功能是对学生和老师账户进行管理,查看机房信息以及清空预约记录 管理员类中主要功能有: 显示管理员操作的菜单界面 添加账号 查看账号 查看机房信息 清空预约记录 manager.h中添加如下代码: 至此,所有身份类创建完毕,效果如图: 功能描述: 并且在同级目录下,创建这几个文件 功能描述: 在预约系统的.cpp文件中添加全局函数 参数: LoginIn中添加如下代码: 在student.txt文件中添加两条学生信息,用于测试 添加信息: 其中: 效果图: 在Login函数的学生分支中加入如下代码,验证学生身份 添加代码效果图 测试: 在teacher.txt文件中添加一条老师信息,用于测试 添加信息: 其中: 效果图: 在Login函数的教师分支中加入如下代码,验证教师身份 添加代码效果图 测试: 在admin.txt文件中添加一条管理员信息,由于我们只有一条管理员,因此本案例中没有添加管理员的功能 添加信息: 其中: 效果图: 在Login函数的管理员分支中加入如下代码,验证管理员身份 添加效果如图: 测试效果如图: 至此,所有身份的登录功能全部实现! 添加全局函数 添加效果如: 测试对接,效果如图: 登录成功 注销登录: 至此,管理员身份可以成功登录以及注销 功能描述: 功能要求: 在Manager的addPerson成员函数中,实现添加新账号功能,代码如下: 测试添加学生: 成功在学生文件中添加了一条信息 测试添加教师: 成功在教师文件中添加了一条信息 功能描述:添加新账号时,如果是重复的学生编号,或是重复的教师职工编号,提示有误 添加位置如图: 在Manager的有参构造函数中,获取目前的学生和教师信息 代码如下: 在有参构造函数中,调用初始化容器函数 测试,运行代码可以看到测试代码获取当前学生和教师数量 在manager.h文件中添加成员函数 在manager.cpp文件中实现成员函数 在添加学生编号或者教师职工号时,检测是否有重复,代码如下: 代码位置如图: 检测效果: bug描述: 解决方案: 在添加完毕后,加入代码: 位置如图: 再次测试,刚加入的账号不会重复添加了! 功能描述:显示学生信息或教师信息 在Manager的showPerson成员函数中,实现显示账号功能,代码如下: 测试查看学生效果 测试查看教师效果 至此,显示账号功能实现完毕 案例需求中,机房一共有三个,其中1号机房容量20台机器,2号50台,3号100台 我们可以将信息录入到computerRoom.txt中 在头文件下,创建新的文件 computerRoom.h 并添加如下代码: 在Manager管理员类下,添加机房的容器,用于保存机房信息 在Manager有参构造函数中,追加如下代码,初始化机房信息 位置如图: 因为机房信息目前版本不会有所改动,如果后期有修改功能,最好封装到一个函数中,方便维护 在Manager类的showComputer成员函数中添加如下代码: 测试显示机房信息功能: 功能描述: 清空生成的 在Manager的cleanFile成员函数中添加如下代码: 测试清空,可以随意写入一些信息在order.txt中,然后调用cleanFile清空文件接口,查看是否清空干净 添加全局函数 添加效果如图: 测试对接,效果如图: 登录验证通过: 学生子菜单: 注销登录: 在student.h中添加新的成员函数如下: 在学生的有参构造函数中追加如下代码: 追加位置如图: 至此,vCom容器中保存了所有机房的信息 在student.cpp中实现成员函数 运行程序,测试代码: 在order.txt文件中生成如下内容: 功能描述:显示预约记录时,需要从文件中获取到所有记录,用来显示,创建预约的类来管理记录以及更新 在头文件以及源文件下分别创建orderFile.h 和 orderFile.cpp文件 orderFile.h中添加如下代码: 构造函数中获取所有信息,并存放在容器中,添加如下代码: 更新预约记录的成员函数updateOrder代码如下: 首先我们先添加几条预约记录,可以用程序添加或者直接修改order.txt文件 order.txt文件内容如下: 比如我们有三名同学分别产生了3条预约记录 在Student类的 测试效果如图: 在Student类的 测试效果如图: 在Student类的 测试取消预约: 再次查看个人预约记录: 查看所有预约 查看order.txt预约文件 至此,学生模块功能全部实现 添加全局函数 添加效果如图: 测试对接,效果如图: 登录验证通过: 教师子菜单: 注销登录: 该功能与学生身份的查看所有预约功能相似,用于显示所有预约记录 在Teacher.cpp中实现成员函数 运行测试教师身份的查看所有预约功能 测试效果如图: 功能描述:教师审核学生的预约,依据实际情况审核预约 在Teacher.cpp中实现成员函数 代码如下: 测试 - 审核通过 审核通过情况 测试-审核未通过 审核未通过情况: 学生身份下查看记录: 审核预约成功! 至此本案例制作完毕! 代码目录结构如下: 具体文件如下: 各文件中具体代码:机房预约系统
1、机房预约系统需求
1.1 系统简介
1.2 身份简介
1.3 机房简介
1.4 申请简介
1.5 系统具体需求
2、创建项目
2.1 创建项目
2.2 添加文件
3、创建主菜单
3.1 菜单实现
int main() {
cout
3.2 搭建接口
int main() {
int select = 0;
while (true)
{
cout > select; //接受用户选择
switch (select)
{
case 1: //学生身份
break;
case 2: //老师身份
break;
case 3: //管理员身份
break;
case 0: //退出系统
break;
default:
cout
4、 退出功能实现
4.1 退出功能实现
cout
4.2 测试退出功能
5、 创建身份类
5.1 身份的基类
#pragma once
#include
5.2 学生类
5.2.1 功能分析
5.2.2 类的创建
#pragma once
#include
#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 类的创建
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include
#include"teacher.h"
//默认构造
Teacher::Teacher()
{
}
//有参构造 (职工编号,姓名,密码)
Teacher::Teacher(int empId, string name, string pwd)
{
}
//菜单界面
void Teacher::operMenu()
{
}
//查看所有预约
void Teacher::showAllOrder()
{
}
//审核预约
void Teacher::validOrder()
{
}
5.4 管理员类
5.4.1 功能分析
5.4.2 类的创建
#pragma once
#include
#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 全局文件添加
#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"
6.2 登录函数封装
void LoginIn(string fileName, int type)
#include "globalFile.h"
#include "identity.h"
#include
6.3 学生登录实现
1 张三 123
2 李四 123456
//学生登录验证
int fId;
string fName;
string fPwd;
while (ifs >> fId && ifs >> fName && ifs >> fPwd)
{
if (id == fId && name == fName && pwd == fPwd)
{
cout
6.4 教师登录实现
1 老王 123
//教师登录验证
int fId;
string fName;
string fPwd;
while (ifs >> fId && ifs >> fName && ifs >> fPwd)
{
if (id == fId && name == fName && pwd == fPwd)
{
cout
6.5 管理员登录实现
admin 123
admin
代表管理员用户名,123
代表管理员密码//管理员登录验证
string fName;
string fPwd;
while (ifs >> fName && ifs >> fPwd)
{
if (name == fName && pwd == fPwd)
{
cout
7、 管理员模块
7.1 管理员登录和注销
7.1.1 构造函数
//有参构造
Manager::Manager(string name, string pwd)
{
this->m_Name = name;
this->m_Pwd = pwd;
}
7.1.2 管理员子菜单
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 addPerson();
}
else if (select == 2) //查看账号
{
cout showPerson();
}
else if (select == 3) //查看机房
{
cout showComputer();
}
else if (select == 4) //清空预约
{
cout cleanFile();
}
else
{
delete manager;
cout
7.1.3 菜单功能实现
void Manager::operMenu()
代码如下://选择菜单
void Manager::operMenu()
{
cout m_Name
7.1.4 接口对接
//进入管理员子菜单
managerMenu(person);
7.2 添加账号
7.2.1 添加功能实现
//添加账号
void Manager::addPerson()
{
cout > 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 > id;
cout > name;
cout > pwd;
ofs
7.2.2 去重操作
7.2.2.1 读取信息
void initVector()
初始化容器 //初始化容器
void initVector();
//学生容器
vector
void Manager::initVector()
{
//读取学生文件中信息
ifstream ifs;
ifs.open(STUDENT_FILE, ios::in);
if (!ifs.is_open())
{
cout > s.m_Id && ifs >> s.m_Name && ifs >> s.m_Pwd)
{
vStu.push_back(s);
}
cout > t.m_EmpId && ifs >> t.m_Name && ifs >> t.m_Pwd)
{
vTea.push_back(t);
}
cout
//有参构造
Manager::Manager(string name, string pwd)
{
this->m_Name = name;
this->m_Pwd = pwd;
//初始化容器
this->initVector();
}
7.2.2.2 去重函数封装
bool checkRepeat(int id, int type);
//检测重复 参数:(传入id,传入类型) 返回值:(true 代表有重复,false代表没有重复)
bool checkRepeat(int id, int type);
bool checkRepeat(int id, int type);
bool Manager::checkRepeat(int id, int type)
{
if (type == 1)
{
for (vector
7.2.2.3 添加去重操作
string errorTip; //重复错误提示
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 > id;
bool ret = this->checkRepeat(id, 1);
if (ret) //有重复
{
cout
7.2.2.4 bug解决
//初始化容器
this->initVector();
7.3 显示账号
7.3.1 显示功能实现
void printStudent(Student & s)
{
cout > select;
if (select == 1)
{
cout
7.3.2 测试
7.4 查看机房
7.4.1 添加机房信息
7.4.2 机房类创建
#pragma once
#include
7.4.3 初始化机房信息
//机房容器
vector
//获取机房信息
ifstream ifs;
ifs.open(COMPUTER_FILE, ios::in);
ComputerRoom c;
while (ifs >> c.m_ComId && ifs >> c.m_MaxNum)
{
vCom.push_back(c);
}
cout
7.4.4 显示机房信息
//查看机房信息
void Manager::showComputer()
{
cout ::iterator it = vCom.begin(); it != vCom.end(); it++)
{
cout m_ComId m_MaxNum
7.5 清空预约
order.txt
预约文件7.5.1 清空功能实现
//清空预约记录
void Manager::cleanFile()
{
ofstream ofs(ORDER_FILE, ios::trunc);
ofs.close();
cout
8、 学生模块
8.1 学生登录和注销
8.1.1 构造函数
//有参构造(学号、姓名、密码)
Student::Student(int id, string name, string pwd)
{
//初始化属性
this->m_Id = id;
this->m_Name = name;
this->m_Pwd = pwd;
}
8.1.2 管理员子菜单
void studentMenu(Identity * &manager)
代码如下://学生菜单
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
8.1.3 菜单功能实现
void Student::operMenu()
代码如下://菜单界面
void Student::operMenu()
{
cout m_Name
8.1.4 接口对接
//进入学生子菜单
studentMenu(person);
8.2 申请预约
8.2.1 获取机房信息
//机房容器
vector
//获取机房信息
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 预约功能实现
void Student::applyOrder()
//申请预约
void Student::applyOrder()
{
cout > date;
if (date >= 1 && date > interval;
if (interval >= 1 && interval > room;
if (room >= 1 && room m_Id m_Name
8.3 显示预约
8.3.1 创建预约类
#pragma once
#include
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 m;
int pos = date.find(":");
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));
}
this->m_orderData.insert(make_pair(this->m_Size, m));
this->m_Size++;
}
//测试代码
//for (map
void OrderFile::updateOrder()
{
if (this->m_Size == 0)
{
return;
}
ofstream ofs(ORDER_FILE, ios::out | ios::trunc);
for (int i = 0; i m_orderData[i]["date"] m_orderData[i]["interval"] m_orderData[i]["stuId"] m_orderData[i]["stuName"] m_orderData[i]["roomId"] m_orderData[i]["status"]
8.3.2 显示自身预约
void Student::showMyOrder()
成员函数中,添加如下代码//查看我的预约
void Student::showMyOrder()
{
OrderFile of;
if (of.m_Size == 0)
{
cout m_Id)
{
cout
8.3.3 显示所有预约
void Student::showAllOrder()
成员函数中,添加如下代码//查看所有预约
void Student::showAllOrder()
{
OrderFile of;
if (of.m_Size == 0)
{
cout
8.4 取消预约
void Student::cancelOrder()
成员函数中,添加如下代码//取消预约
void Student::cancelOrder()
{
OrderFile of;
if (of.m_Size == 0)
{
cout v;
int index = 1;
for (int i = 0; i m_Id)
{
if (of.m_orderData[i]["status"] == "1" || of.m_orderData[i]["status"] == "2")
{
v.push_back(i);
cout > select;
if (select >= 0 && select
9、 教师模块
9.1 教师登录和注销
9.1.1 构造函数
//有参构造 (职工编号,姓名,密码)
Teacher::Teacher(int empId, string name, string pwd)
{
//初始化属性
this->m_EmpId = empId;
this->m_Name = name;
this->m_Pwd = pwd;
}
9.1.2 教师子菜单
void TeacherMenu(Person * &manager)
代码如下://教师菜单
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
9.1.3 菜单功能实现
void Teacher::operMenu()
代码如下://教师菜单界面
void Teacher::operMenu()
{
cout m_Name
9.1.4 接口对接
//进入教师子菜单
TeacherMenu(person);
9.2 查看所有预约
9.2.1 所有预约功能实现
void Teacher::showAllOrder()
void Teacher::showAllOrder()
{
OrderFile of;
if (of.m_Size == 0)
{
cout
9.2.2 测试功能
9.3 审核预约
9.3.1 审核功能实现
void Teacher::validOrder()
//审核预约
void Teacher::validOrder()
{
OrderFile of;
if (of.m_Size == 0)
{
cout v;
int index = 0;
for (int i = 0; i > select;
if (select >= 0 && select > ret;
if (ret == 1)
{
of.m_orderData[v[select - 1]]["status"] = "2";
}
else
{
of.m_orderData[v[select - 1]]["status"] = "-1";
}
of.updateOrder();
cout
9.3.2 测试审核预约
^_^
代码目录结构:
computerRoom.h
#pragma once
#include
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"
identify.h
#pragma once
#include
manager.h
#pragma once
#include
orderFile.h
#pragma once
#include
student.h
#pragma once
#include
teacher.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
#include "identify.h"
class Teacher :public Identify
{
public:
//默认构造
Teacher();
//有参构造(职工编号,姓名,密码)
Teacher(int empId, string name, string pwd);
//显示教师操作的界面菜单
virtual void operMenu();
//查看所有预约
void showAllOrder();
//审核预约
void validOrder();
//教师编号
int m_EmpId;
};
manager.cpp
#include "manager.h"
#include "student.h"
#include "teacher.h"
#include
#include "computerRoom.h"
//默认构造
Manager::Manager()
{
}
//有参构造 管理员姓名,密码
Manager::Manager(string name, string pwd)
{
//初始化管理员信息
this->m_Name = name;
this->m_Pwd = pwd;
//初始化容器
this->initVector();
}
//选择菜单
void Manager::operMenu()
{
cout m_Name > select;//接收用户的选项
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 > id;
bool ret = this->checkRepeat(id, select);//查看是否有重复
if (ret)//有重复
{
cout > name;
cout > pwd;
ofs initVector();
}
//打印学生信息
void printStudent(Student &s)
{
cout > select;
if (select == 1)
{
cout ::iterator it = vCR.begin(); it != vCR.end(); it++)
{
cout m_ComId m_MaxNum > s.m_Id && ifs >> s.m_Name && ifs >> s.m_Pwd)
{
vStu.push_back(s);//读取到vector容器中
}
cout > t.m_EmpId && ifs >> t.m_Name && ifs >> t.m_Pwd)
{
vTea.push_back(t);
}
cout > c.m_ComId && ifs >> c.m_MaxNum)
{
vCR.push_back(c);
}
cout ::iterator it = vStu.begin(); it != vStu.end(); it++)
{
if (it->m_Id == id)
{
return true;
}
}
}
else//检测职工
{
for (vector
orderFile.cpp
#include "orderFile.h"
#include
student.cpp
#include "student.h"
//默认构造
Student::Student()
{
}
//有参构造 (姓名,学号,密码)
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)
{
//将读取的信息放入到容器中
vCR.push_back(c);
}
ifs.close();
}
//菜单界面
void Student::operMenu()
{
cout m_Name > data;
if (data >= 1 && data > interveal;
if (interveal >= 1 && interveal > room;
if (room >= 1 && room m_Id m_Name m_Id)
{
cout v;
int index = 1;//用来代表可以选择的记录号
for (int i = 0; i m_Id)//找到自身的预约
{
//只能选择审核中的预约或者预约成功的预约进行取消预约操作
if (of.m_OrderData[i]["status"] == "1" || of.m_OrderData[i]["status"] == "2")
{
v.push_back(i);//将修改的预约记录下标记录下来,方便修改状态status
cout > select;
if (select >= 0 && select
teacher.cpp
#include "teacher.h"
#include "orderFile.h"
#include
下一篇:算法复习——动态规划