使用工具:visual studio
目录
在新项目下创建以下文件:
头文件(7个)
1.computerRoom.h
#pragma once//防止头文件重复包含
#include<iostream>//标准io流
using namespace std;//使用标准命名空间
class ComputerRoom//机房类
{
public:
//以下是机房的两条属性
int m_ComId;//机房编号
int m_MaxNum;//机房最大容量
};
2.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"//预约信息文件
3.identity.h
#pragma once//防止头文件重复包含
#include<iostream>//标准io流
using namespace std;//使用标准命名空间
/*在整个系统中,有三种身份:学生代表,教师,管理员
三种身份有其共性,也有特性
因此我们可以将3种身份抽象出共性
所以创建身份的基类*/
//创建身份的基类
//身份抽象类
class Identity//三种身份都有用户名和密码的属性就可以抽象出来了
{
public:
virtual void operMenu() = 0;//纯虚函数---操作子菜单
string m_Name;//用户名
string m_Pwd;//登录密码
};
4.manager.h
#pragma once//防止头文件重复包含
#include<iostream>//标准io流
using namespace std;//使用标准命名空间
#include"identity.h"//使用了库中的字符串处理函数
#include<string>//使用了库中的字符串处理函数
#include<fstream>//文件输入输出流
#include"globalFile.h"//包含存储预约信息的头文件
#include<vector>//包含容器
#include"student.h"//包含学生头文件
#include"teacher.h"//包含教师头文件
#include<algorithm>//使用了algorithm库find函数
#include"computerRoom.h"//包含机房头文件
class Manager :public Identity//管理员类
{
public:
Manager();//默认构造
Manager(string name, string pwd);//有参构造 参数:姓名、密码
virtual void operMenu();//菜单界面
void addPerson();//添加账号
void showPerson();//查看账号
void showComputer();//查看机房信息
void clearFile();//清空预约信息
void initVector();//初始化容器
void initComputerRoom();//初始化机房信息
bool checkRepeat(int id, int type);//检测重复-参数:学号或职工号,身份类型
vector<Student>vStu;//存放学生信息的容器
vector<Teacher>vTea;//存放老师信息的容器
vector<ComputerRoom>vCom;//存放机房信息的容器
};
5.orderFile.h
#pragma once//防止头文件重复包含
#include<iostream>//标准io流
using namespace std;//使用标准命名空间
#include"globalFile.h"//包含存储预约信息的头文件
#include<fstream>//文件输入输出流
#include<map>//C++ maps是一种关联式容器,包含“关键字/值”对
#include<string>//使用了库中的字符串处理函数
//一个管理文件信息的类,会把所有文件中的信息读到手,并进行维护它
//显示预约记录时,需要从文件中获取到所有记录,用来显示,创建预约的了来管理记录以及更新
//创建orderfile.h以及orderfile.cpp
class OrderFile//
{
public://
OrderFile();//构造函数
void updateOrder();//更新预约记录函数
int m_Size;//预约的条数
//key:第几条预约信息,value:当前这条预约的详细内容,value具体记录键值对信息
map<int, map<string, string>>m_OrderData;//记录所有预约的容器
//创建map嵌套map这么一个容器,
};
6.student.h
#pragma once//防止头文件重复包含
#include<iostream>//标准io流
#include<cstdlib>//可以防止 system不明确
using namespace std;//使用标准命名空间
#include"identity.h"//使用了库中的字符串处理函数
#include<string>//使用了库中的字符串处理函数
#include<vector>//包含容器
#include"computerRoom.h"//包含机房头文件
#include<fstream>//文件输入输出流
#include"globalFile.h"//包含存储预约信息的头文件
#include"orderFile.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();//取消预约
void initComputerRoom();//初始化机房信息
int m_Id;//学号
vector<ComputerRoom>vCom;//存放机房信息的容器
};
7.teacher.h
#pragma once//防止头文件重复包含
#include<iostream>//标准io流
using namespace std;//使用标准命名空间
#include"identity.h"//使用了库中的字符串处理函数
#include<string>//使用了库中的字符串处理函数
#include<fstream>//文件输入输出流
#include"globalFile.h"//包含存储预约信息的头文件
#include"orderFile.h"//
#include<vector>//包含容器
class Teacher :public Identity//教师类
{
public:
Teacher();//默认构造
Teacher(int empId, string name, string pwd);//有参构造-参数:编号、姓名、密码
virtual void operMenu();//菜单界面
void showAllOrder();//查看所有预约
void validOrder();//审核预约
int m_EmpId;//职工编号
};
源文件(5个)
1.manager.cpp
#include"manager.h"//包含manager头文件
//默认构造
Manager::Manager()//
{
}
//有参构造 参数:姓名、密码
Manager::Manager(string name, string pwd)
//
{
//以下两行代码初始化管理员信息
this->m_Name = name;//姓名
this->m_Pwd = pwd;//密码
//以下一行代码初始化容器,获取文件中学生、老师的信息
this->initVector();
//以下一行代码初始化机房信息,转到下面查看机房信息函数initComputerRoom()中 去定义
this->initComputerRoom();
}
//菜单界面
void Manager::operMenu()//管理员子菜单
{
cout << "欢迎管理员 " << this->m_Name << " 登录!" << endl;//
cout << "\t---------------------------------" << endl;
cout << "\t|\t 1-添加账号信息\t\t|" << endl;
cout << "\t|\t \t\t|" << endl;
cout << "\t|\t 2-查看账号信息\t\t|" << endl;
cout << "\t|\t \t\t|" << endl;
cout << "\t|\t 3-查看机房信息\t\t|" << endl;
cout << "\t|\t \t\t|" << endl;
cout << "\t|\t 4-清空预约信息\t\t|" << endl;
cout << "\t|\t \t\t|" << endl;
cout << "\t|\t 其它--注销登录\t\t|" << endl;
cout << "\t---------------------------------" << endl;
cout << "请输入您的选择:" << endl;
}
//添加账号
void Manager::addPerson()//
{
cout << "请选择您要添加的账号类型:" << endl;//
cout << "1-添加学生" << endl;//
cout << "2-添加教师" << endl;//
string fileName;//
string tip;//
string errorTip;//重复的错误提示
ofstream ofs;//读文件
int select = 0;//用户的选择
while (true)//提供选择
{
cin >> select;//接收
if (select == 1)//添加学生
{
fileName = STUDENT_FILE;//写到student文件中
tip = "请输入您要添加的学生学号:";//提示
errorTip = "学号重复!请重新输入:";//
break;
}
else if (select == 2)//添加教师
{
fileName = TEACHER_FILE;//写到teacher文件中
tip = "请输入您要添加的教师编号:";//提示
errorTip = "职工编号重复!请重新输入:";//
break;
}
else//
{
cout << "您的输入有误!请重新输入:" << endl;//
}
}
ofs.open(fileName, ios::out | ios::app);//写文件(追加的方式)
int id;//
string name;//
string pwd;//
cout << tip << endl;//
while (true)//
{
cin >> id;//
bool ret = checkRepeat(id, select);// 调用名为checkRepeat的函数,传入id和select作为参数,并将返回值赋给变量ret。checkRepeat函数的作用是检查id和select是否有重复的值。
if (ret)// 判断变量ret的值是否为真(非零),如果为真,则执行下面的代码块。
{
cout << errorTip << endl;//将变量errorTip的值输出到标准输出流
}
else//如果上述条件不满足,则执行下面的代码块。
{
break;//
}
}
cout << "请输入您要添加的姓名:" << endl;//
cin >> name;//
cout << "请输入您要添加的密码:" << endl;//
cin >> pwd;//
ofs << id << " " << name << " " << pwd << " " << endl;//将数据写入到文件中
cout << "添加信息成功!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
ofs.close();//
this->initVector();//更新,相当于每加一个人就重新读取文件中的信息
}
//显示学生信息
void printStudent(Student& s)//
{
cout << "学生学号:" << s.m_Id << "\t姓名:" << s.m_Name << "\t密码:" << s.m_Pwd << endl;
//
}
//显示教师信息
void printTeacher(Teacher& t)//
{
cout << "职工编号:" << t.m_EmpId << "\t姓名:" << t.m_Name << "\t密码:" << t.m_Pwd << endl;
//
}
//查看账号
void Manager::showPerson()//
{
cout << "请选择您要查看的信息类型:" << endl;//
cout << "1-查看所有学生信息" << endl;//
cout << "2-查看所有教师信息" << endl;//
int select = 0;//
while (true)//提供选项
{
cin >> select;//
if (select == 1)//查看学生信息
{
cout << "所有学生信息如下:" << endl;//
for_each(vStu.begin(), vStu.end(), printStudent);//
break;
}
else if (select == 2)//查看老师信息
{
cout << "所有教师信息如下:" << endl;//
for_each(vTea.begin(), vTea.end(), printTeacher);//
break;
}
else//
{
cout << "您的输入有误!请重新输入:" << endl;//
}
}
system("pause");//按任意键返回
system("cls");//清屏
}
//查看机房信息
void Manager::showComputer()
{
cout << "所有机房信息如下:" << endl;
for (vector<ComputerRoom>::iterator it = vCom.begin(); it != vCom.end(); it++)
//用for循环结构,将vcomuputer这个容器中的内容,进行遍历输出
{
cout << "机房编号:" << it->m_ComId << "\t机房最大容量:" << it->m_MaxNum << endl;
//遍历这个装信息的容器,输出容器里的内容,也就是输出文件里的内容
}
/* 名词解释:
`vector<ComputerRoom > ::iterator`: 是一个容器,用于装`vector`容器中的元素。
`vCom.begin()`: 是一个`vector`容器的成员函数,返回指向容器第一个元素的容器。
`vCom.end()`: 是一个`vector`容器的成员函数,返回指向容器最后一个元素之后位置的容器。
`it- > m_ComId`: `it`通过箭头运算符(`- > `)访问`ComputerRoom`对象的成员变量`m_ComId`。
`it- > m_MaxNum`: `it`通过箭头运算符(`- > `)访问`ComputerRoom`对象的成员变量`m_MaxNum`。*/
system("pause");//按任意键返回
system("cls");//清屏
}
//清空预约信息
void Manager::clearFile()//封装了一个cleanFile的成员函数
{
cout << "您确定要清空所有的预约信息吗?" << endl;//
cout << "1-确定" << endl;//
cout << "2-返回" << endl;//
int select = 0;//
while (true)//询问是否真的清空
{
cin >> select;//
if (select == 1)//
{
ofstream ofs;//我们用oftream文件的输出流对象,打开这个文件
ofs.open(ORDER_FILE, ios::trunc);//并且用trunc的方式打开
//trunc这种方式打开的时候,如果文件存在,给他删干净,再从新创建,这样等于侧面把文件清空了
ofs.close();//把这个文件对象关闭掉
cout << "清空预约信息成功!" << endl;//
break;
}
else if (select == 2)//
{
break;//
}
else//
{
cout << "您的输入有误!请重新输入:" << endl;//
}
}
system("pause");//按任意键返回
system("cls");//清屏
}
//初始化容器
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);//
Teacher t;//
while (ifs >> t.m_EmpId && ifs >> t.m_Name && ifs >> t.m_Pwd)//
{
vTea.push_back(t);//
}
cout << "当前教师数量为:" << vTea.size() << endl;//
ifs.close();//
}
//检测重复-参数:学号或职工号,身份类型
bool Manager::checkRepeat(int id, int type)//定义了一个名为checkRepeat的成员函数,返回类型为bool,参数列表为int id和int type。该函数用于检查id是否在学生或老师的容器中重复出现。
{
if (type == 1)//学生.判断type的值是否为1,如果是,则执行下面的代码块。该条件判断是根据type的值来确定要检查的容器类型。
{
for (vector<Student>::iterator it = vStu.begin(); it != vStu.end(); it++)//遍历名为vStu的vector容器中的元素,使用迭代器it进行迭代。vStu是存储学生对象的容器。
{
if (it->m_Id == id)//判断迭代器it指向的学生对象的m_Id成员变量是否等于id,如果是,则执行下面的代码块。
{
return true;//表示检查到重复。
}
}
}
else//老师
{
for (vector<Teacher>::iterator it = vTea.begin(); it != vTea.end(); it++)//遍历名为vTea的vector容器中的元素,使用迭代器it进行迭代。vTea是存储老师对象的容器。
{
if (it->m_EmpId == id)//判断迭代器it指向的老师对象的m_EmpId成员变量是否等于id,如果是,则执行下面的代码块。
{
return true;//表示检查到重复。
}
}
}
return false;//如果以上条件都不满足,则返回false,表示没有检查到重复。
}
//初始化机房信息
void Manager::initComputerRoom()
//已经在Manager管理类下,添加了机房的容器,用于保存机房信息
//在此Manager有参构造函数中,追加如下代码,初始化机房信息
{
//以下代码意为:获取机房信息
ifstream ifs;//通过一个文件流对象,读取对象
ifs.open(COMPUTER_FILE, ios::in);//读文件,利用open并且通过ios::in的方式,把COMPUTER_FILE中的信息拿到手
ComputerRoom c;//通过ComputerRoom c,准备这么一个对象
while (ifs >> c.m_ComId && ifs >> c.m_MaxNum)//通过while循环,把文件中的对象都读到手,拿到机房的id号和机房的最大的容量号
{
vCom.push_back(c);//利用push_back尾插法,把读到的对象放入到这个vCom.push_back(c)容器中
}
//以上六行代码,通过循环,已经把机房信息文件中的内容全部放到了容器中
cout << "当前机房数量为:" << vCom.size() << endl;//计算并打印机房的数量
ifs.close();//关闭文件
//以上九行代码也可以封装为一个函数,但是这里没有封装,因为“查看机房信息”这个操作在此系统中只用一次
//而且机房的规格是不变的,因此在这里没有封装的必要性
//如果学校要加入机房的话,便于日后维护,那么可以封装成一个函数
}
2.orderFile.cpp
#include"orderFile.h"//包含orderFile头文件
//构造函数
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;//初始化预约的条数,用一个变量保存预约个数,默认0
while (ifs >> date && ifs >> interval && ifs >> stuId && ifs >> stuName && ifs >> roomId && ifs >> status)
//遍历读文件
{
string key;//
string value;//
map<string, string>m;//对这些信息进行分割
int pos = date.find(":");//date,利用find找到这个:,利用find,把他的可以,value取出来,并且放到一个map容器中把小的map容器都分割好之后
//string容器中的成员函数,查找,关键字符:,返回一个关键位置position
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(":");//interval
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(":");//stuId
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(":");//stuName
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(":");//roomId
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(":");//status
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));//
this->m_Size++;//
}
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;
}*/
}
//更新预约记录
void OrderFile::updateOrder()//`void OrderFile::updateOrder()` 是一个成员函数,用于更新订单数据到文件中。
{
if (this->m_Size == 0)//预约记录为0,就不更新
{
return;
}
ofstream ofs(ORDER_FILE, ios::out | ios::trunc);//out方式写文件,trunc方式写新文件,等于都删了从新写入
for (int i = 0; i < this->m_Size; i++)//按照刚才最大的m容器中的所有数据,都拿到手,i是第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();//关闭文件
}
#include"orderFile.h"
//构造函数
OrderFile::OrderFile()
{
ifstream ifs; //创建一个输入文件流对象
ifs.open(ORDER_FILE, ios::in); //打开订单文件,以只读方式打开
string date; //订单日期
string interval; //预约时间段
string stuId; //学生ID
string stuName; //学生姓名
string roomId; //预约的机房号
string status; //预约状态
this->m_Size = 0; //初始化订单数量为0
while (ifs >> date && ifs >> interval && ifs >> stuId && ifs >> stuName && ifs >> roomId && ifs >> status)
//从文件中逐行读取订单信息,直到读取完毕
{
string key; //键
string value; //值
map<string, string>m; //创建一个map对象,用于存储订单的信息
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)); //将键值对插入到map中
}
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)); //将键值对插入到map中
}
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)); //将键值对插入到map中
}
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)); //将键值对插入到map中
}
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)); //将键值对插入到map中
}
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中
}
this->m_OrderData.insert(make_pair(this->m_Size, m)); //将订单数据插入到订单数据集合中
this->m_Size++; //订单数量加1
}
ifs.close(); //关闭文件流
}
3.student.cpp
#include"student.h"//包含student头文件
//默认构造
Student::Student()//
{
}
//有参构造-参数:学号、姓名、密码
Student::Student(int id, string name, string pwd)//在有参构造里面,接收一下呆会儿我们创建出来的这个人的信息
{
//初始化学生的三个属性
this->m_Id = id;//学号
this->m_Name = name;//姓名
this->m_Pwd = pwd;//密码
this->initComputerRoom();//初始化机房信息
}
//菜单界面
void Student::operMenu()//
{
cout << "欢迎学生代表 " << this->m_Name << " 登录!" << endl;//
cout << "\t---------------------------------" << endl;
cout << "\t|\t 1-申 请 预 约 \t\t|" << endl;
cout << "\t|\t \t\t|" << endl;
cout << "\t|\t 2-查看我的预约\t\t|" << endl;
cout << "\t|\t \t\t|" << endl;
cout << "\t|\t 3-查看所有预约\t\t|" << endl;
cout << "\t|\t \t\t|" << endl;
cout << "\t|\t 4-取消预约信息\t\t|" << endl;
cout << "\t|\t \t\t|" << endl;
cout << "\t|\t 其它--注销登录\t\t|" << endl;
cout << "\t---------------------------------" << endl;
cout << "请输入您的选择:" << endl;
}
//申请预约
void Student::applyOrder()//
{
int date = 0;//哪天
int interval = 0;//时间段
int room;//机房编号
cout << "机房开放时间为周一至周五" << endl;
cout << "请选择您要预约的时间:" << endl;
cout << "\t1-周一" << endl;
cout << "\t2-周二" << endl;
cout << "\t3-周三" << endl;
cout << "\t4-周四" << endl;
cout << "\t5-周五" << endl;
while (true)//提供选择
{
cin >> date;//
if (date >= 1 && date <= 5)//
{
break;
}
cout << "您的输入有误!请重新输入:" << endl;//
}
cout << "请选择您要预约的时间段:" << endl;//
cout << "1-上午" << endl;//
cout << "2-下午" << endl;//
while (true)//提供选择
{
cin >> interval;//具体时间段,上午or下午
if (interval >= 1 && interval <= 2)//
{
break;
}
cout << "您的输入有误!请重新输入:" << endl;//
}
cout << "请选择您要预约的机房编号:" << endl;//
for (int i = 0; i < vCom.size(); i++)//为了方便打印,循环3次
{
cout << vCom[i].m_ComId << "-" << vCom[i].m_ComId << "号机房,其容量为" << vCom[i].m_MaxNum << "人" << endl;
//利用循环,打印出3种机房的类型
}
while (true)//提供选择
{
cin >> room;//
if (room >= 1 && room <= 3)//
{
break;
}
cout << "您的输入有误!请重新输入:" << endl;//
}
cout << "预约成功!正在审核中!" << endl;//
ofstream ofs;//以上输入的所有内容要写入文件中,进行保存
ofs.open(ORDER_FILE, ios::app);//利用ofstream写文件,把输入到的信息(申请预约信息),存入到order这个文件中,这个文件用来记录预约信息
//以下是写入文件的内容
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");//清屏
}
//查看自己的预约
void Student::showMyOrder()//成员函数showMyOrder
{
OrderFile of;//拿到这个文件中所有的信息,利用刚才封装好的orderfile类,创建一个of对象
if (of.m_Size == 0)//然后这个对象判断一下,of中的size=0说明没有记录
{
cout << "无预约记录!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
return;
}
int index = 0;//
//如果有记录,把自身的信息显示
for (int i = 0; i < of.m_Size; i++)//遍历一下of对象的容器size
{
//string => int: string 利用 .c_str() 转为C语言风格的字符串 const char *
//然后: atoi( const char * ) => int
if (this->m_Id == atoi(of.m_OrderData[i]["stuId"].c_str()))//如果自己输入的学号和遍历容器后的学号一样,(最大的容器中的第i条中的学号)
{
index += 1;//
cout << index << "、";//
string mydate;//
if (of.m_OrderData[i]["date"] == "1")//
{
mydate = "周一";//
}
else if (of.m_OrderData[i]["date"] == "2")//
{
mydate = "周二";//
}
else if (of.m_OrderData[i]["date"] == "3")//
{
mydate = "周三";//
}
else if (of.m_OrderData[i]["date"] == "4")//
{
mydate = "周四";//
}
else
{
mydate = "周五";//
}
cout << "预约日期:" << mydate;//
cout << "\t时间段:" << (of.m_OrderData[i]["interval"] == "1" ? "上午" : "下午");//
cout << "\t机房编号:" << of.m_OrderData[i]["roomId"];//
string status = "\t状态:";//
//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");//清屏
}
//查看所有预约
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 << "、";//
string mydate;//
if (of.m_OrderData[i]["date"] == "1")//
{
mydate = "周一";//
}
else if (of.m_OrderData[i]["date"] == "2")//
{
mydate = "周二";//
}
else if (of.m_OrderData[i]["date"] == "3")//
{
mydate = "周三";//
}
else if (of.m_OrderData[i]["date"] == "4")//
{
mydate = "周四";//
}
else//
{
mydate = "周五";//
}
cout << "预约日期:" << mydate;//
cout << "\t时间段:" << (of.m_OrderData[i]["interval"] == "1" ? "上午" : "下午");//
cout << "\t学号:" << of.m_OrderData[i]["stuId"];//
cout << "\t姓名:" << of.m_OrderData[i]["stuName"];//
cout << "\t机房编号:" << of.m_OrderData[i]["roomId"];//
string status = "\t状态:";//
//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");//清屏
}
//取消预约
void Student::cancelOrder()//
{
OrderFile of;//写文件
if (of.m_Size == 0)//
{
cout << "无预约记录!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
return;
}
cout << "您可以取消已经申请成功或正在审核状态的预约!" << endl;//
vector<int>v;//存放大map容器的下标
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++ << "、";//
string mydate;//
if (of.m_OrderData[i]["date"] == "1")//
{
mydate = "周一";//
}
else if (of.m_OrderData[i]["date"] == "2")//
{
mydate = "周二";//
}
else if (of.m_OrderData[i]["date"] == "3")//
{
mydate = "周三";//
}
else if (of.m_OrderData[i]["date"] == "4")//
{
mydate = "周四";//
}
else//
{
mydate = "周五";//
}
cout << "预约日期:" << mydate;//
cout << "\t时间段:" << (of.m_OrderData[i]["interval"] == "1" ? "上午" : "下午");//
cout << "\t机房编号:" << of.m_OrderData[i]["roomId"];//
string status = "\t状态:";//1:审核中 2:预约成功
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;//
}
system("pause");//按任意键返回
system("cls");//清屏
}
//初始化机房信息
void Student::initComputerRoom()//和manager一样
{
ifstream ifs;//读文件
ifs.open(COMPUTER_FILE, ios::in);//读文件,通过open的方式,ios::in的方式打开文件,进行读取内容
ComputerRoom c;//创建对象
while (ifs >> c.m_ComId && ifs >> c.m_MaxNum)//从文件中,yongwhile循环,遍历获取机房的所有信息
{
vCom.push_back(c);//将读取到的信息放入这个容器中
}
//至此,vCom容器中保存了所有机房的信息
ifs.close();//关闭文件
}
4.teacher.cpp
#include"teacher.h"//包含teacher头文件
//默认构造
Teacher::Teacher()//
{
}
//有参构造-参数:编号、姓名、密码
Teacher::Teacher(int empId, string name, string pwd)在有参构造里面,接收一下呆会儿我们创建出来的这个人的信息
{
//初始化教师的三个属性
this->m_EmpId = empId;//职工编号
this->m_Name = name;//姓名
this->m_Pwd = pwd;//密码
}
//菜单界面
void Teacher::operMenu()//
{
cout << "欢迎教师 " << this->m_Name << " 登录!" << endl;//
cout << "\t---------------------------------" << endl;//
cout << "\t|\t 1-查看所有预约\t\t|" << endl;//
cout << "\t|\t \t\t|" << endl;//
cout << "\t|\t 2-审 核 预 约\t\t|" << endl;//
cout << "\t|\t \t\t|" << endl;//
cout << "\t|\t 其它--注销登录\t\t|" << endl;//
cout << "\t---------------------------------" << endl;//
cout << "请输入您的选择:" << endl;//
}
//查看所有预约
void Teacher::showAllOrder()//
{
OrderFile of;//写文件
if (of.m_Size == 0)//size计算文件的内容,如果文件里没东西
{
cout << "无预约记录!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
return;
}
for (int i = 0; i < of.m_Size; i++)//i表示信息的条数,这个循环表示给文件中的信息排序,按顺序输出
{
cout << i + 1 << "、";//序号+顿号
string mydate;//定义日期字符串
if (of.m_OrderData[i]["date"] == "1")//如果读取文件中的日期为1,那么他选择的日期为周一
{
mydate = "周一";//
}
else if (of.m_OrderData[i]["date"] == "2")//
{
mydate = "周二";//
}
else if (of.m_OrderData[i]["date"] == "3")//
{
mydate = "周三";//
}
else if (of.m_OrderData[i]["date"] == "4")//
{
mydate = "周四";//
}
else//
{
mydate = "周五";//
}
cout << "预约日期:" << mydate;//日期
cout << "\t时间段:" << (of.m_OrderData[i]["interval"] == "1" ? "上午" : "下午");//日期当天的时间段
cout << "\t学号:" << of.m_OrderData[i]["stuId"];//学号
cout << "\t姓名:" << of.m_OrderData[i]["stuName"];//姓名
cout << "\t机房编号:" << of.m_OrderData[i]["roomId"];//选择的机房编号
string status = "\t状态:";//预约状态
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");//清屏
}
// 查看所有预约
void Teacher::showAllOrder(void)//定义了一个名为`showAllOrder`的成员函数,返回类型为`void`,没有参数。该函数用于查看所有的预约记录。
{
OrderFile of;//创建一个名为`of`的`OrderFile`对象,用于读取预约记录的文件。
if (of.m_Size == 0)//判断`of`对象的`m_Size`成员变量是否为0,如果是,则执行下面的代码块。该条件判断是判断是否有预约记录。
{
cout << "无预约记录!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
return;
}
for (int i = 0; i < of.m_Size; i++)// 使用循环遍历预约记录。循环变量`i`从0开始,每次自增1,直到`of.m_Size`。
{
cout << i + 1 << "、";//输出预约记录的序号。
string mydate;//定义一个名为`mydate`的字符串变量,用于表示预约日期。
if (of.m_OrderData[i]["date"] == "1")//判断第`i`个预约记录中的"date"项的值是否为"1",如果是,则执行下面的代码块。该条件判断是根据预约记录中的日期编号确定日期。
{
mydate = "周一";//将`mydate`赋值为"周一"。
}
else if (of.m_OrderData[i]["date"] == "2")//
{
mydate = "周二";//
}
else if (of.m_OrderData[i]["date"] == "3")//
{
mydate = "周三";//
}
else if (of.m_OrderData[i]["date"] == "4")//
{
mydate = "周四";//
}
else//
{
mydate = "周五";//
}
cout << "预约日期:" << mydate;//输出预约日期。
cout << "\t时间段:" << (of.m_OrderData[i]["interval"] == "1" ? "上午" : "下午");//输出预约的时间段。根据预约记录中的"interval"项的值判断是上午还是下午。
cout << "\t学号:" << of.m_OrderData[i]["stuId"];//输出学生的学号。
cout << "\t姓名:" << of.m_OrderData[i]["stuName"];//输出学生的姓名。
cout << "\t机房编号:" << of.m_OrderData[i]["roomId"];//输出预约的机房编号。
string status = "\t状态:";//定义一个名为`status`的字符串变量,用于表示预约的状态。
if (of.m_OrderData[i]["status"] == "1")//判断第`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");//清屏
}
//审核预约
void Teacher::validOrder()//该函数用于审核预约记录
{
OrderFile of;//创建一个名为of的OrderFile对象,用于读取预约记录的文件
if (of.m_Size == 0)//判断of对象的m_Size成员变量是否为0,如果是,则执行下面的代码块。该条件判断是判断是否有预约记录。
{
cout << "无预约记录!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
return;
}
vector<int>v;//创建一个名为v的整型向量,用于存储待审核的预约记录的索引。
int index = 0;//初始化预约记录的序号。
cout << "待审核的预约信息记录如下:" << endl;//
for (int i = 0; i < of.m_Size; i++)//
{
if (of.m_OrderData[i]["status"] == "1")//
{
v.push_back(i);//
cout << ++index << "、";//
string mydate;//
if (of.m_OrderData[i]["date"] == "1")//
{
mydate = "周一";//
}
else if (of.m_OrderData[i]["date"] == "2")//
{
mydate = "周二";//
}
else if (of.m_OrderData[i]["date"] == "3")//
{
mydate = "周三";//
}
else if (of.m_OrderData[i]["date"] == "4")//
{
mydate = "周四";//
}
else//
{
mydate = "周五";//
}
cout << "预约日期:" << mydate;//
cout << "\t时间段:" << (of.m_OrderData[i]["interval"] == "1" ? "上午" : "下午");//
cout << "\t学生学号:" << of.m_OrderData[i]["stuId"];//
cout << "\t学生姓名:" << of.m_OrderData[i]["stuName"];//
cout << "\t机房编号:" << of.m_OrderData[i]["roomId"];//
string status = "\t状态:审核中";//
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;//
while (true)//
{
cin >> ret;//
if (ret == 1)//审核通过
{
of.m_OrderData[v[select - 1]]["status"] = "2";//
break;
}
else if (ret == 2)//审核不通过
{
of.m_OrderData[v[select - 1]]["status"] = "-1";//
break;
}
cout << "您的输入有误!请重新输入:" << endl;//
}
of.updateOrder();//
cout << "审核完毕!" << endl;//
break;
}
}
cout << "您的输入有误!请重新输入:" << endl;//
}
system("pause");//按任意键返回
system("cls");//清屏
}
5.机房预约系统.cpp
#include<iostream>//标准io流
using namespace std;//使用标准命名空间
#include"identity.h"//包含Identity头文件
#include<fstream>//文件输入输出流
#include<string>//
#include"globalFile.h"//包含globalFile头文件
#include"student.h"//包含student头文件
#include"teacher.h"//包含teacher头文件
#include"manager.h"//包含manager头文件
//进入学生子菜单界面
void studentMenu(Identity*& student)
//通过父类Identity指针,用引用的方式传入student,调用公共的接口
//添加这个全局函数,在学生登录成功后,会调用学生的子菜单界面
{
while (true)//提供选项
{
student->operMenu();//调用学生子菜单(利用多态,实现了这个函数,并且在子类中重写了父类的纯虚函数),意为先显示菜单,然后用指针转回去操作其他的接口123
Student* stu = (Student*)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");//清屏
break;
}
}
}
//教师子菜单
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;
}
}
}
//管理员子菜单
void managerMenu(Identity*& manager)//管理员子菜单
{
while (true)//
{
manager->operMenu();//调用管理员子菜单
Manager* man = (Manager*)manager;//
int select = 0;//
cin >> select;//
if (select == 1)//添加账号
{
man->addPerson();//
}
else if (select == 2)//查看账号
{
man->showPerson();//
}
else if (select == 3)//查看机房信息
{
man->showComputer();//
}
else if (select == 4)//清空预约
{
man->clearFile();//
}
else//注销登录
{
delete manager;//
cout << "注销登录成功!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
return;
}
}
}
/*********************************************登录功能*************************************************/
void LoginIn(string fileName, int type)
//无返回值,名为LoginIn的 登录函数
//括号里的参数:fileName→操作的文件名,type→登录人员的身份类型
{
Identity* person = NULL;//父类指针,用于指向子类的对象,设置初始值为空
ifstream ifs;//读文件
ifs.open(fileName, ios::in);//open,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)//学生身份验证
{
int fId;//fId=fileId(文件学号) 从文件中读出的学号
string fName;//fName=fileName(文件姓名)从文件中读出的姓名
string fPwd;//fPwd=filePassword(文件密码)从文件中读出的密码
while (ifs >> fId && ifs >> fName && ifs >> fPwd)//利用循环
{
if (fId == id && fName == name && fPwd == pwd)//与用户的输入对比
{
cout << "学生验证登录成功!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
person = new Student(id, name, pwd);//
studentMenu(person);//通过进入学生子菜单studentMenu函数中
return;
}
}
}
else if (type == 2)//教师身份验证
{
int fId;//从文件中读出的职工编号
string fName;//从文件中读出的姓名
string fPwd;//从文件中读出的密码
while (ifs >> fId && ifs >> fName && ifs >> fPwd)//同下
{
if (fId == id && fName == name && fPwd == pwd)//
{
cout << "教师验证登录成功!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
person = new Teacher(id, name, pwd);//
teacherMenu(person);//进入教师子菜单
return;
}
}
}
else if (type == 3)//管理员身份验证
{
string fName;//从文件中读出的姓名
string fPwd;//从文件中读出的密码
while (ifs >> fName && ifs >> fPwd)// 循环读取文件中的姓名和密码
{
if (fName == name && fPwd == pwd)//判断输入的姓名和密码是否与文件中读取的匹配
{
cout << "管理员验证登录成功!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
person = new Manager(name, pwd);//创建一个名为person的Manager对象指针,并传入姓名和密码参数
managerMenu(person);//调用managerMenu函数,进入管理员子菜单
return; //返回上一级菜单
}
}
}
cout << "您的输入有误!登录失败!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
return;
}
//以下是主函数,用于创建主菜单,搭建接口
int main()
{
int select = 0;//创建一个变量,用于接收用户的选择
//然后进入一个无限的循环分支,用while循环来接收用户的选择
//只要用户选的不是0退出,就会回到主菜单界面
system("color FC");//产生亮白色
system("color 70");//产生背景白色文字黑色
while (true)//
{
//登录界面——主菜单
cout << "\t\t\t\t|____________________________________|" << endl;
cout << "\t\t\t\t|\t\t欢迎您来到哈信息机房预约系统!\t\t |" << endl;
cout << "\t\t\t\t|____________________________________|" << endl;
cout << "\t\t\t\t|\t\t 请选择您的身份: \t\t |" << endl;//水平制表符不要动嗷
cout << "\t\t\t\t|_______________________________________|" << endl;
cout << "\t\t\t\t|\t\t\t1.学生 \t\t\t\t |" << endl;
cout << "\t\t\t\t|\t\t\t2.教师 \t\t\t\t |" << endl;
cout << "\t\t\t\t|\t\t\t3.管理员 \t\t\t |" << endl;
cout << "\t\t\t\t|\t\t\t0.退出 \t\t\t\t |" << endl;
cout << "\t\t\t\t|_____________________________________|" << endl;
cout << "请输入您的选择:";
cin >> select;//接收用户的选择
switch (select)//根据用户的选择实现不同的接口
{
case 1://用户输入1,即选择学生身份
LoginIn(STUDENT_FILE, 1);//学生登录函数
break;
case 2://用户输入2,即选择教师身份
LoginIn(TEACHER_FILE, 2);//老师登录函数
break;
case 3://用户输入3,即选择管理员身份
LoginIn(ADMIN_FILE, 3);//管理员登录函数
break;
case 0://用户输入0,即退出系统
cout << "欢迎下次使用!" << endl;//退出系统
system("pause");//按任意键返回到菜单界面
return 0;//
break;
default://若用户输入的不是1,2,3,0
cout << "您的输入有误!请重新选择!" << endl;//
system("pause");//按任意键返回
system("cls");//清屏
break;
}
}
system("pause");//按任意键返回
return 0;
}