C++笔记16:C++第七阶段:机房预约系统---返回引用vector<Orders>&的bug解释

0913

1.1 系统简介

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

1.2 身份简介

分别有三种身份使用该程序:
学生申请使用机房,可以预约未来一周内的机房使用,预约的日期为周一至周五,预约时需要选择预约时段(上午、下午);
教师审核学生的预约申请,依据实际情况审核预约通过或者不通过;
管理员:给学生、教师创建账号,所有申请订单每周由管理员负责清空

1.3 机房简介

机房总共有3间:
1号机房 — 最大容量20人
2号机房 — 最多容量50人
3号机房 — 最多容量100人

1.4 系统具体需求:

首先进入登录界面,可选登录身份有:

  • 学生代表
  • 老师
  • 管理员
  • 退出

每个身份都需要进行验证后,进入子菜单

  • 学生需要输入 :学号、姓名、登录密码
  • 老师需要输入:职工号、姓名、登录密码
  • 管理员需要输入:管理员姓名、登录密码

学生具体功能:

  • 申请预约 — 预约机房
  • 查看自身的预约 — 查看自己的预约状态
  • 查看所有预约 — 查看全部预约信息以及预约状态
  • 取消预约 — 取消自身的预约,预约成功或审核中的预约均可取消
  • 注销登录 — 退出登录

教师具体功能:

  • 查看所有预约 — 查看全部预约信息以及预约状态
  • 审核预约 — 对学生的预约进行审核
  • 注销登录 — 退出登录

管理员具体功能:

  • 添加账号 — 添加学生或教师的账号,需要检测学生编号或教师职工号是否重复
  • 查看账号 — 可以选择查看学生或教师的全部信息
  • 查看机房 — 查看所有机房的信息
  • 清空预约 — 清空所有预约记录
  • 查看所有预约 — 查看全部预约信息以及预约状态
  • 注销登录 — 退出登录

1.5程序代码分析:

1.系统管理类:class ManageSystem

ManageSystem.h:
#pragma once
#include"Managers.h"
#include"Students.h"
#include"Teachers.h"

#define filePath_student  "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\student.txt"
#define filePath_manage  "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\admin.txt"
#define filePath_teacher  "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\teacher.txt"

class ManageSystem {
   
public:
	bool flag_exit;//退出系统的标志

	ManageSystem();//构造函数
	~ManageSystem();//析构函数

	void showMenu();//显示菜单
	void controlProgress();//控制系统流程
	void exitSystem();//退出系统
	void studentModule(); //学生模块
	void teacherModule(); //教师模块
	void managerModule();//管理员模块

};

补充:学生模块、教师模块、管理员模块
进入三个模块的操作界面(controlPro())都要进行验证登录makeSureLogIn(),这部分在他们的父类Person类中实现;

ManageSystem.cpp:
#include"ManageSystem.h"

2.Person基类:class Persons

类中包含的内容为所有子类所共有的信息(其实就相当于三个子类的全局变量或者全局函数放到父类中,大家继承后都可以直接调用):

Person.h:
#pragma once
#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
#include<vector>
#include<map>
#include"Orders.h"

using namespace std;
class Persons {
   
public:
	
	string name;//姓名
	string password;//登录密码
	string filePath_student = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\student.txt";
	string filePath_manage = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\admin.txt";
	string filePath_teacher = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\teacher.txt";
	string filePath_comRoom = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\computerRoom.txt";
	string filePath_reserveFile = "E:\\c++example\\0913 C++第七阶段\\机房预约系统0913\\机房预约系统0913\\reserveFile.txt";
	
	Persons();
	~Persons();

	void controlPro();//学生、老师、管理员都有各自的功能和控制流程
	int getNum();//获取文件中的行数
	void showAllBooking();	//查看所有预约
	vector<Orders> saveToVector(string filePath);//把文件中的所有内容保存到一个vector容器中
	void pritnVector(vector<Orders>& v);//打印容器vector<Orders>& v
	void saveFile(vector<Orders>& v);//保存预约记录到文件中
	void changeStatus(int xuhao, int newStatus);//改变文件中第xuhao行记录的状态,并且保存到文件中
	bool makeSureLogIn(int num, string name, string password, string filePath);//登录验证---学生、教师、管理员
	void saveFile(int num, string name, string password, string filePath);//保存文件:管理员创建的学生/教师信息
	int strToInt(string str);//string->int
	string outputStatus(string status);//输出预约状态
};

补充:
一、vector saveToVector(string filePath);
读取预约记录文件,把文件中的所有内容保存到一个vector容器中,有用到这个函数的地方有:
Person类中的查看所有预约函数、改变状态函数;
Managers类中的获取机房剩余容量函数;
Teachers类中的审核预约函数;
Students类中的查看我的预约、取消预约。
二、void saveFile(vector& v);
保存预约记录到文件中,
①在申请预约的时候一次只会保存一条预约记录到文件中,且不止一次调用此成员函数,所以ofs.open(filePath_reserveFile, ios::out| ios::app);
②但在修改预约状态的时候会将文件中所有预约状态保存到vector中,相当于重写整个预约状态的文件,所以ofs.open(filePath_reserveFile, ios::out );
因此在函数中先判断参数v的大小(v.size())是否大于1,
if (v.size() > 1) {②}else{①}
三、void changeStatus(int xuhao, int newStatus);
把文件中第xuhao行的预约记录状态改为newStatus,并且保存到文件中
修改状态包括将(审核中/已通过的)预约状态改为取消状态1->0;2->0 和 将审核中的状态改为通过/未通过1->2;1->-1;,所以
//形参xuhao表示要修改的预约记录在文件中的第几行
//形参newStatus表示将预约状态改成什么(0取消、2通过、-1不通过)
四、bool makeSureLogIn(int num, string name, string password, string filePath);
登录验证—学生、教师、管理员:
形参分别是账号(学号、职工号)、用户名、密码、要验证的文件路径,在函数中对账号做个判断,是-1说明是管理员,因为管理员没有账号,所以直接输入-1
五、void saveFile(int num, string name, string password, string filePath);
保存文件:管理员创建的学生/教师信息
Managers类中的添加账号有用到,参数里包括账号(学号、职工号)、用户名、密码、要保存到的文件路径,因为只会创建学生和教师信息,所以不涉及账号有可能为-1的情况
六、int strToInt(string str);
类型转换:string->int。读取文件时都是string类型,需要把类型转换成int型才方便使用
七、string outputStatus(string status);
输出预约状态:从文件中读到的是string型数字(0、1、2、-1),先转换成int型数字,再利用switch转换成string型预约状态(已取消、审核中、已通过、未通过)。

Person.cpp:
#include"Person.h"

3.预约记录类:class Orders

预约记录文件中保存七项内容,全部放到Orders类中:

Person.h:
#pragma once
#include<iostream>
#include<string>
#include<sstream>
#i
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值