赞
踩
一个结课级别的C++项目,模拟学校机房的运行和管理。
项目需求如下:
使用者身份
机房简介
申请规则
系统按身份登录,每个身份通过账号密码的验证之后进入子菜单:
1. 学生菜单
2. 教师菜单
3. 管理员菜单
1. 主页面
- int main() {
- while (true)
- {
- int select = 0;
- cout << "================== Welcome to Computer Room Reserving System ==================" << endl;
- cout << endl << "Please Enter Your Identity" << endl;
- cout << "\t\t ----------------------------------------------\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 1. Student |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 2. Teacher |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 3. Administrator |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 0. Quit |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t ----------------------------------------------\n";
- cout << "Please enter: ";
- cin >> select;
- switch (select) {
- case 1:
- LogIn(STUDENT_FILE, 1);
- break;
- case 2:
- LogIn(TEACHER_FILE, 2);
- break;
- case 3:
- LogIn(ADMIN_FILE, 3);
- break;
- case 0:
- cout << "Thanks! Bye" << endl;
- system("pause");
- return 0;
- break;
- default:
- cout << "Wrong input! Please re-enter !" << endl;
- system("cls");
- break;
- }
-
- }
- system("pause");
- return 0;
- }
死循环+switch实现界面选择,算是基操了
身份类创建
基类
- #pragma once
- #include <iostream>
-
- // 身份抽象类
- class Identity {
- public:
- // 操作菜单 纯虚函数
- virtual void openMenu() = 0;
-
- // 用户名
- std::string m_name;
- // 密码
- std::string m_password;
-
- };
学生类
- #pragma once
- #include <iostream>
- #include "identity.h"
-
- class Student : public Identity {
- public:
- int student_id;
-
- // 默认构造
- Student();
- // 有参构造 学号、姓名、密码
- Student(int student_id, std::string name, std::string pwd);
-
- // 菜单界面
- virtual void openMenu();
-
- // 申请预约
- void applyOrder();
-
- // 查看自身预约
- void showMyOrder();
-
- // 查看所有预约
- void showAllOrder();
-
- // 取消预约
- void cancelOrder();
-
- };
教师类
- #pragma once
- #include <iostream>
- #include "identity.h"
-
- class Teacher : public Identity {
- public:
- int teacher_id;
-
- // 默认构造
- Teacher();
-
- // 有参构造 工号、姓名、密码
- Teacher(int teacher_id, std::string name, std::string pwd);
-
- // 菜单界面
- virtual void openMenu();
-
- // 查看所有预约
- void showAllOrder();
-
- // 审核预约
- void validOrder();
-
- };
管理员类
- #pragma once
- #include <iostream>
- #include "identity.h"
-
- class Administrator : public Identity {
- public:
- // 默认构造
- Administrator();
-
- // 有参构造 账号、密码
- Administrator(std::string name, std::string pwd);
-
- // 菜单界面
- virtual void openMenu();
-
- // 添加账号
- void addAccount();
-
- // 查看账号
- void showAccount();
-
- // 查看机房
- void showRoom();
-
- // 清空预约
- void clearOrder();
-
- };
登录模块
在头文件中定义所有的使用到的文件名方便不同文件的文件操作
- #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"
注:显示中文的话,文件格式采用ansi编码格式保存,utf-8会读出乱码
三种身份的登录及其验证
- // 登录功能
- void LogIn(string fileName, int type) {
-
- // 父类指针,用于指向子类对象
- Identity* person = NULL;
- ifstream ifs;
- ifs.open(fileName, ios::in);
-
- if (!ifs.is_open()) {
- cout << "No File!" << endl;
- ifs.close();
- return;
- }
-
- // 初始化id、名字和密码
- int id = 0;
- string name;
- string pwd;
-
- // 身份判断
- if (type == 1) {
- cout << "Please enter student_ID: " << endl;
- cin >> id;
- }
- else if (type == 2) {
- cout << "Please enter staff_ID: " << endl;
- cin >> id;
- }
-
- cout << "Please enter your name: " << endl;
- cin >> name;
-
- cout << "Please enter your password: " << endl;
- cin >> pwd;
-
- if (type == 1) {
- // 学生身份验证
- int fId;
- string fName;
- string fPwd;
- while (ifs >> fId && ifs >> fName && ifs >> fPwd) {
- /* cout << fId << endl;
- cout << fName << endl;
- cout << fPwd << endl; */
- if (fId == id && fName == name && fPwd == pwd) {
- cout << "student log in successfully!" << endl;
- system("pause");
- system("cls");
- // 创建学生对象
- person = new Student(id, name, pwd);
- studentMenu(person);
- 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 << "teacher log in successfully!" << endl;
- system("pause");
- system("cls");
- // 创建教师对象
- person = new Teacher(id, name, pwd);
- teacherMenu(person);
- return;
- }
- }
- }
- else {
- // 管理员身份验证
- int fId;
- string fName;
- string fPwd;
- while (ifs >> fName && ifs >> fPwd){
- if (fName == name && fPwd == pwd) {
- cout << "admin log in successfully!" << endl;
- system("pause");
- system("cls");
- // 创建管理员对象
- person = new Administrator(name, pwd);
- adminMenu(person);
- return;
- }
- }
- }
- cout << "Login Fail!" << endl;
- system("pause");
- system("cls");
- ifs.close();
- }
管理员身份登录,功能模块:
- void adminMenu(Identity*& admin) {
- while (true) {
- // 父类指针调用子类共同接口
- admin->openMenu();
- // 将父类指针转为子类指针,调用子类其他接口
- Administrator* ad = (Administrator*)admin;
- int select = 0;
- cin >> select;
- // 添加账号
- if (select == 1) {
- cout << " add account " << endl;
- ad->addAccount();
- }
- // 查看账号
- else if (select == 2) {
- cout << " show account " << endl;
- ad->showAccount();
- }
- // 查看机房
- else if (select == 3) {
- cout << " show room " << endl;
- ad->showRoom();
- }
- // 清空预约
- else if (select == 4) {
- cout << " clear order " << endl;
- ad->clearOrder();
- }
- // 注销登录
- else {
- cout << "log out" << endl;
- return;
- // delete admin;
- }
-
- }
- }
先写管理员部分,因为学生和老师的账号都由其创建,其职能如下:
头文件定义如下:
- #pragma once
- #include <iostream>
- #include <fstream>
- #include "identity.h"
- #include "globalFile.h"
- #include <vector>
- #include "student.h"
- #include "teacher.h"
- #include "computerRoom.h"
- #include <algorithm>
-
- void printStudent(Student& s);
- void printTeacher(Teacher& t);
-
- class Administrator : public Identity {
- public:
- // 默认构造
- Administrator();
-
- // 有参构造 账号、密码
- Administrator(std::string name, std::string pwd);
-
- // 菜单界面
- virtual void openMenu();
-
- // 添加账号
- void addAccount();
-
- // 查看账号
- void showAccount();
-
- // 查看机房
- void showRoom();
-
- // 清空预约
- void clearOrder();
-
- // 初始化容器
- void initVector();
-
- // 检测重复,参数1是学号/工号,参数2是检测类型
- bool checkRepeat(int id, int type);
-
- // 学生容器
- std::vector<Student> vStu;
-
- // 老师容器
- std::vector<Teacher> vTea;
-
- // 机房容器
- std::vector<computerRoom> vCom;
- };
administrator.cpp 管理员各功能函数实现:
- #include "administrator.h"
- #include <iostream>
- using namespace std;
- // 默认构造
- Administrator::Administrator() {
-
- }
-
- // 有参构造 账号、姓名、密码
- Administrator::Administrator(string name, string pwd) {
- this->m_name = name;
- this->m_password = pwd;
-
- //初始化容器, 获取文件中所有学生和老师的账号信息
- this->initVector();
-
- //初始化机房信息
- ifstream ifs;
- ifs.open(COMPUTER_FILE, ios::in);
- if (!ifs.is_open()) {
- cout << "fail to open " << endl;
- return;
- }
- computerRoom com;
- while (ifs >> com.m_ID && ifs >> com.m_Volume) {
- vCom.push_back(com);
- }
- ifs.close();
- // cout << "Room num: " << vCom.size() << endl;
- }
-
- // 菜单界面
- void Administrator::openMenu() {
- cout << "================== Welcome Administrator==================" << endl;
- cout << "\t\t ----------------------------------------------\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 1. Add Acounts |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 2. Show Accounts |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 3. Show Room |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 4. Clear Order |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| Other. Log Out |\n";
- cout << "\t\t ----------------------------------------------\n";
- cout << "Please enter: ";
- }
-
- // 添加账号
- void Administrator::addAccount() {
- cout << "Please enter the type of account you want to add:" << endl;
- cout << "1. student" << endl;
- cout << "2. teacher" << endl;
- string fileName; // 操作文件名
- string tip; // 协助显示信息
- ofstream ofs;
- int select = 0;
- cin >> select;
- if (select == 1) {
- fileName = STUDENT_FILE;
- tip = "Please enter student_id: ";
- }
- else {
- fileName = TEACHER_FILE;
- tip = "Please enter staff_id: ";
- }
-
- ofs.open(fileName, ios::out | ios::app);
- int id; //学号/工号
- string name; // 姓名
- string pwd; // 密码
-
- while(true){
- cout << tip << endl;
- cin >> id;
- bool is_repeat = checkRepeat(id, select);
- if (is_repeat) {
- cout << "repeat id input, please re-enter! " << endl;
- }
- else {
- break;
- }
- }
-
- cout << "Please enter your name: " << endl;
- cin >> name;
-
- cout << "Please enter your password: " << endl;
- cin >> pwd;
-
- ofs << id << " " << name << " " << pwd << " " << endl;
- cout << "Add Successfully! " << endl;
- system("pause");
- system("cls");
- ofs.close();
- // 添加完毕后重新初始化维持重复检测状态
- this->initVector();
- }
-
- // 查看账号
- void Administrator::showAccount() {
- cout << "Please choose what to show: " << endl;
- cout << "1. show all students " << endl;
- cout << "2. show all teachers" << endl;
- int select = 0;
- cin >> select;
- if (select == 1) {
- cout << "message of all students is below: " << endl;
- for_each(vStu.begin(), vStu.end(), printStudent);
- }
- else {
- cout << "message of all teachers is below:" << endl;
- for_each(vTea.begin(), vTea.end(), printTeacher);
- }
- system("pause");
- system("cls");
- }
-
- // 查看机房
- void Administrator::showRoom() {
- cout << "The message of computer room is below: " << endl;
- for (vector<computerRoom>::iterator it = vCom.begin(); it != vCom.end(); it++) {
- cout << "Room number: " << it->m_ID << "Room volume: " << it->m_Volume << endl;
- }
- system("pause");
- system("cls");
- }
-
- // 清空预约
- void Administrator::clearOrder() {
- ofstream ofs(ORDER_FILE, ios::trunc);
- ofs.close();
- cout << "Clear successfully! " << endl;
- system("pause");
- system("cls");
- }
-
- // 初始化操作
- void Administrator::initVector() {
- vStu.clear();
- vTea.clear();
- ifstream ifs;
-
- // 读取学生信息和老师信息存入容器,用于去重操作
- // 读取学生
- ifs.open(STUDENT_FILE, ios::in);
- if (!ifs.is_open()) {
- cout << "read file fail! " << endl;
- return;
- }
- Student s;
- while (ifs >> s.student_id && ifs >> s.m_name && ifs >> s.m_password) {
- vStu.push_back(s);
- }
- cout << "The amount of students is: " << vStu.size() << endl;
- ifs.close();
-
- // 读取老师
- ifs.open(TEACHER_FILE, ios::in);
- if (!ifs.is_open()) {
- cout << "read file fail! " << endl;
- return;
- }
- Teacher t;
- while (ifs >> t.teacher_id && ifs >> t.m_name && ifs >> t.m_password) {
- vTea.push_back(t);
- }
- cout << "The amount of teachers is: " << vTea.size() << endl;
- ifs.close();
- }
-
- // 检测重复
- bool Administrator::checkRepeat(int id, int type) {
- // 检测学生
- if (type == 1) {
- for (vector<Student>::iterator it = vStu.begin(); it != vStu.end(); it++) {
- if (id == it->student_id) {
- return true;
- }
- }
- }
- // 检测老师
- else {
- for (vector<Teacher>::iterator it = vTea.begin(); it != vTea.end(); it++) {
- if (id == it->teacher_id) {
- return true;
- }
- }
- }
- return false;
- }
-
- // 打印账号信息
- void printStudent(Student &s) {
- cout << "student_id: " << s.student_id << " student_name: " << s.m_name << endl;
- }
-
- void printTeacher(Teacher &t) {
- cout << "teacher_id: " << t.teacher_id << " teacher_name: " << t.m_name << endl;
- }
对于每次添加账号的查重,需要及时保持管理员类中负责学生和老师账号容器的重新初始化,使得重复检测有效。
然后完成学生部分,因为老师是用来审核预约的,因此需要学生主体先创建预约,学生功能如下:
学生登录部分和管理员类似:
- // 学生身份登录
- void studentMenu(Identity*& student) {
- while (true) {
- // 父类指针调用子类共同接口
- student->openMenu();
- // 将父类指针转为子类指针,调用子类其他接口
- Student* stu = (Student*)student;
- int select = 0;
- cin >> select;
- // 申请预约
- if (select == 1) {
- cout << "add order " << endl;
- stu->applyOrder();
- }
- // 查看自身预约
- else if (select == 2) {
- cout << "show order " << endl;
- stu->showMyOrder();
- }
- // 查看所有预约
- else if (select == 3) {
- cout << "show all orders " << endl;
- stu->showAllOrder();
- }
- // 取消预约
- else if (select == 4) {
- cout << "clear order " << endl;
- stu->cancelOrder();
- }
- // 注销登录
- else {
- cout << "log out" << endl;
- return;
- //delete admin;
- }
-
- }
- }
学生部分的功能涉及到预约的显示操作,因此定义orderFile类用于处理预约记录和更新。
orderFile.h:
- #pragma once
- #include <iostream>
- using namespace std;
- #include "globalFile.h"
- #include <fstream>
- #include <string>
- #include <map>
-
- class orderFile {
- public:
- orderFile();
-
- // 预约数量
- int m_Size;
-
- // 预约记录,使用嵌套map存储
- map<int, map<string, string>> m_Data;
-
- // 更新预约记录
- void updateOrder();
- };
orderFile.cpp:
- #include "orderFile.h"
-
- 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(":");
- if (pos != -1) {
- key = date.substr(0, pos);
- value = date.substr(pos + 1, date.size()- pos -1);
- m.insert(make_pair(key, value));
- //cout << value << endl;
- //switch(stoi(value)){
- // case 1:
- // m.insert(make_pair(key, "Monday"));
- // break;
- // case 2:
- // m.insert(make_pair(key, "Tuesday"));
- // break;
- // case 3:
- // m.insert(make_pair(key, "Wednesday"));
- // break;
- // case 4:
- // m.insert(make_pair(key, "Thursday"));
- // break;
- // case 5:
- // m.insert(make_pair(key, "Friday"));
- // break;
- // default:
- // break;
- //}
- }
-
- // 截取时间段
- pos = interval.find(":");
- // cout << "interval " << interval << endl;
- if (pos != -1) {
- key = interval.substr(0, pos);
- value = interval.substr(pos + 1, interval.size() - pos - 1);
- m.insert(make_pair(key, value));
- }
-
- // 截取学号
- // cout << "stuID " << stuID << endl;
- 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_Data.insert(make_pair(this->m_Size, m));
- this->m_Size++;
- }
- ifs.close();
-
- // test
- /*for (map<int, map<string, string>>::iterator it = m_Data.begin(); it != m_Data.end(); it++) {
- cout << "No." << 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() {
- if (this->m_Size == 0) {
- return; // 无预约记录直接返回
- }
- ofstream ofs(ORDER_FILE, ios::out | ios::trunc); // 删除并重新写入
- for (int i = 0; i < this->m_Size; i++) {
- ofs << "date:" << this->m_Data[i]["date"] << " ";
- ofs << "interval:" << this->m_Data[i]["interval"] << " ";
- ofs << "stuID:" << this->m_Data[i]["stuID"] << " ";
- ofs << "stuName:" << this->m_Data[i]["stuName"] << " ";
- ofs << "roomID:" << this->m_Data[i]["roomID"] << " ";
- ofs << "status:" << this->m_Data[i]["status"] << " ";
- }
- ofs.close();
- }
-
-
关键点在于字符串的切分以及重新的存取,更新
student.cpp:
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include "student.h"
- #include "globalFile.h"
- #include "computerRoom.h"
- using namespace std;
- // 将数字转换为星期
- string day[5] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };
-
- // 默认构造
- Student::Student() {
- }
-
- // 有参构造 学号、姓名、密码
- Student::Student(int student_id, std::string name, std::string pwd) {
- this->student_id = student_id;
- this->m_name = name;
- this->m_password = pwd;
-
- //初始化机房信息
- ifstream ifs;
- ifs.open(COMPUTER_FILE, ios::in);
- if (!ifs.is_open()) {
- cout << "fail to open " << endl;
- return;
- }
- computerRoom com;
- while (ifs >> com.m_ID && ifs >> com.m_Volume) {
- vCom.push_back(com);
- }
- ifs.close();
- // cout << "Room num: " << vCom.size() << endl;
- }
-
- // 菜单界面
- void Student::openMenu() {
- cout << "\t\t================== Welcome " << this->m_name << "==================" <<endl;
- cout << "\t\t ----------------------------------------------\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 1. Add Orders |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 2. Show Orders |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 3. Show All Orders |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 4. Cancel Order |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| Other. Log Out |\n";
- cout << "\t\t ----------------------------------------------\n";
- cout << "Please enter: ";
- }
-
- // 申请预约
- void Student::applyOrder() {
- cout << "The open time of the computer room is from Monday to Friday" << endl;
- cout << "Please enter the time of your order: " << endl;
- cout << "1. Monday " << endl;
- cout << "2. Tuesday " << endl;
- cout << "3. Wednesday " << endl;
- cout << "4. Thursday " << endl;
- cout << "5. Friday " << endl;
-
- int date = 0; // 日期
- int interval = 0; // 时间段
- int room = 0; // 机房编号
-
- while (true) {
- cin >> date;
- if (date >= 1 && date <= 5) {
- break;
- }
- cout << "date out of range, please re-enter" << endl;
- }
- cout << "please enter the period of the order: " << endl;
- cout << "1. morning " << endl;
- cout << "2. afternoon " << endl;
- while (true) {
- cin >> interval;
- if (interval >= 1 && interval <= 2) {
- break;
- }
- cout << "interval out of range, please re-enter" << endl;
- }
-
- cout << "please choose the room: " << endl;
- // 改进点:机房剩余容量的计算
- while(true) {
- cin >> room;
- if (room >= 1 && room <= 3) {
- break;
- }
- cout << "wrong enter, please re-enter: " << endl;
- }
-
- cout << "order successfully! under the validation...." << endl;
-
- ofstream ofs;
- ofs.open(ORDER_FILE, ios::app);
-
- ofs << "date:" << date << " ";
- ofs << "interval:" << interval << " ";
- ofs << "stuID:" << this->student_id << " ";
- ofs << "stuName:" << this->m_name << " ";
- ofs << "roomID:" << room << " ";
- ofs << "status:" << 1 << endl;
- ofs.close();
- std::system("pause");
- std::system("cls");
- }
-
- // 查看自身预约
- void Student::showMyOrder() {
- // cout << "********************************" << endl;
- orderFile od;
- if (od.m_Size == 0) {
- cout << "no order record!" << endl;
- std::system("pause");
- std::system("cls");
- return;
- }
-
- //cout << od.m_Data[0]["stuID"] << endl;
- //cout << od.m_Data[0]["date"] << endl;
- //cout << od.m_Data[0]["interval"] << endl;
- //cout << od.m_Data[0]["roomID"] << endl;
- for (int i = 0; i < od.m_Size; i++) {
- // string to int
- // string -> .c_str() -> const char* -> atoi -> int
- if (this->student_id == atoi(od.m_Data[i]["stuID"].c_str())) {
- cout << "date: " << day[(stoi(od.m_Data[i]["date"])-1)];
- cout << " time: " << (od.m_Data[i]["interval"] == "1" ? "morning" : "afternoon");
- cout << " roomID: " << od.m_Data[i]["roomID"];
- // 1. under validation 2. success -1. fail 0. cancel
- string status = " status: ";
- if (od.m_Data[i]["status"] == "1") {
- status += "under validation";
- }
- else if (od.m_Data[i]["status"] == "2") {
- status += "order success";
- }
- else if (od.m_Data[i]["status"] == "-1") {
- status += "order fail";
- }
- else {
- status += "order cancel";
- }
- cout << status << endl;
- }
- }
- std::system("pause");
- std::system("cls");
- }
-
- // 查看所有预约
- void Student::showAllOrder() {
- orderFile od;
- if (od.m_Size == 0) {
- cout << "No order recently " << endl;
- std::system("pause");
- std::system("cls");
- return;
- }
-
- for (int i = 0; i < od.m_Size; i++) {
- cout << i + 1 << ">> ";
- cout << "stuID: " << od.m_Data[i]["stuID"];
- cout << " name: " << od.m_Data[i]["stuName"];
- cout << " date: " << day[(stoi(od.m_Data[i]["date"]) - 1)];
- cout << " interval: " << (od.m_Data[i]["interval"] == "1" ? "morning" : "afternoon");
- cout << " roomID: " << od.m_Data[i]["roomID"];
- string status = " status: ";
- if (od.m_Data[i]["status"] == "1") {
- status += "under validation";
- }
- else if (od.m_Data[i]["status"] == "2") {
- status += "order success";
- }
- else if (od.m_Data[i]["status"] == "-1") {
- status += "order fail";
- }
- else {
- status += "order cancel";
- }
- cout << status << endl;
- }
- std::system("pause");
- std::system("cls");
- }
-
- // 取消预约
- void Student::cancelOrder() {
- orderFile od;
- // 取消的预约,其状态需为审核中或预约成功
- if (od.m_Size == 0) {
- cout << "No order recently " << endl;
- std::system("pause");
- std::system("cls");
- return;
- }
- cout << "Your can cancel your orders finished or under validation, please choose: " << endl;
-
- vector<int> v;
- int index = 1;
- int j = 0;
- for (int i = 0; i < od.m_Size; i++) {
- // 先判断自身学号
- if (this->student_id == stoi(od.m_Data[i]["stuID"])) {
- // 筛选状态
- if (od.m_Data[i]["status"] == "1" || od.m_Data[i]["status"] == "2") {
- v.push_back(i);
- j++;
- cout << j << ">> ";
- cout << "stuID: " << od.m_Data[i]["stuID"];
- cout << " name: " << od.m_Data[i]["stuName"];
- cout << " date: " << day[(stoi(od.m_Data[i]["date"]) - 1)];
- cout << " interval: " << (od.m_Data[i]["interval"] == "1" ? "morning" : "afternoon");
- cout << " roomID: " << od.m_Data[i]["roomID"];
- string status = " status: ";
- if (od.m_Data[i]["status"] == "1") {
- status += "under validation";
- }
- else if (od.m_Data[i]["status"] == "2") {
- status += "order success";
- }
- else if (od.m_Data[i]["status"] == "-1") {
- status += "order fail";
- }
- else {
- status += "order cancel";
- }
- cout << status << endl;
- }
- }
- }
-
- //
- cout << "Please enter the No. of order you want to cancel, 0 to back " << endl;
- int select = 0;
- while (true) {
- cin >> select;
- if (select >= 0 && select <= v.size()) {
- if (select == 0) {
- break;
- }
- else {
- od.m_Data[v[select - 1]]["status"] = "0";
- od.updateOrder();
- cout << "cancel successfully " << endl;
- break;
- }
- }
- cout << "wrong input, please re-enter" << endl;
- }
- std::system("pause");
- std::system("cls");
- }
-
最后来编写教师模块,教师身份的职能如下:
教师身份登录:
- // 老师身份登录
- void teacherMenu(Identity*& teacher) {
- while (true) {
- // 父类指针调用子类共同接口
- teacher->openMenu();
- // 将父类指针转为子类指针,调用子类其他接口
- Teacher* tea = (Teacher*)teacher;
- int select = 0;
- cin >> select;
- // 查看所有预约
- if (select == 1) {
- cout << "show all orders " << endl;
- tea->showAllOrder();
- }
- // 审核预约
- else if (select == 2) {
- cout << "show order " << endl;
- tea->validOrder();
- }
- // 注销登录
- else {
- cout << "log out" << endl;
- return;
- //delete admin;
- }
-
- }
- }
老师模块的功能可以大量复用学生部分的代码。
teacher.cpp:
- #include "teacher.h"
- #include "student.h"
- #include "orderFile.h"
- #include <vector>
- using namespace std;
- // 将数字转换为星期
- string daylist[5] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };
-
- // 默认构造
- Teacher::Teacher() {
-
- }
-
- // 有参构造 学号、姓名、密码
- Teacher::Teacher(int id, std::string name, std::string pwd) {
- this->teacher_id = id;
- this->m_name = name;
- this->m_password = pwd;
-
- }
-
- // 菜单界面
- void Teacher::openMenu() {
- cout << "\t\t================= Welcome " << this->m_name << "! ==================" << endl;
- cout << "\t\t ----------------------------------------------\n";
- cout << "\t\t| 1. Show All Orders |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| 2. Valid Order |\n";
- cout << "\t\t| |\n";
- cout << "\t\t| Other. Log Out |\n";
- cout << "\t\t ----------------------------------------------\n";
- cout << "Please enter: ";
- }
-
- // 查看所有预约
- void Teacher::showAllOrder() {
- orderFile od;
- if (od.m_Size == 0) {
- cout << "no order record!" << endl;
- std::system("pause");
- std::system("cls");
- return;
- }
-
- for (int i = 0; i < od.m_Size; i++) {
- cout << i + 1 << ">> ";
- cout << "stuID: " << od.m_Data[i]["stuID"];
- cout << " name: " << od.m_Data[i]["stuName"];
- cout << " date: " << daylist[(stoi(od.m_Data[i]["date"]) - 1)];
- cout << " interval: " << (od.m_Data[i]["interval"] == "1" ? "morning" : "afternoon");
- cout << " roomID: " << od.m_Data[i]["roomID"];
- string status = " status: ";
- if (od.m_Data[i]["status"] == "1") {
- status += "under validation";
- }
- else if (od.m_Data[i]["status"] == "2") {
- status += "order success";
- }
- else if (od.m_Data[i]["status"] == "-1") {
- status += "order fail";
- }
- else {
- status += "order cancel";
- }
- cout << status << endl;
- }
- system("pause");
- system("cls");
- }
-
- // 审核预约
- void Teacher::validOrder() {
- orderFile od;
- if (od.m_Size == 0) {
- cout << "no order record!" << endl;
- std::system("pause");
- std::system("cls");
- return;
- }
-
- cout << "Here are orders to be valided: " << endl;
- vector<int> v;
- int j = 0;
- for (int i = 0; i < od.m_Size; i++) {
- if (od.m_Data[i]["status"] == "1") {
- v.push_back(i);
- j++;
- cout << j << ">> ";
- cout << "stuID: " << od.m_Data[i]["stuID"];
- cout << " name: " << od.m_Data[i]["stuName"];
- cout << " date: " << daylist[(stoi(od.m_Data[i]["date"]) - 1)];
- cout << " interval: " << (od.m_Data[i]["interval"] == "1" ? "morning" : "afternoon");
- cout << " roomID: " << od.m_Data[i]["roomID"];
- cout << " under validation" << endl;
- }
- }
- cout << "Please enter the num of the order you want to do validation, 0 to back" << endl;
- int select = 0;
- int ret = 0;
- while (true) {
- cin >> select;
- if (select >= 0 && select <= v.size()) {
- if (select == 0) {
- break;
- }
- else {
- cout << "Please enter the result of validation " << endl;
- cout << "1. pass " << endl;
- cout << "2. no pass " << endl;
- cin >> ret;
- if (ret == 1) {
- od.m_Data[v[select - 1]]["status"] = "2";
- }
- else {
- od.m_Data[v[select - 1]]["status"] = "-1";
- }
- od.updateOrder();
- break;
- }
- }
- cout << "wrong input, please re-enter" << endl;
- }
- system("pause");
- system("cls");
- }
-
项目整体文件视图如下:
运行后登录菜单页面如下:
完整代码见下方链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。