c++学习笔记-STL案例-机房预约系统5-学生模块

前言

衔接上一篇“c++学习笔记-STL案例-机房预约系统4-管理员模块”,本文主要设计学生模块,从学生登录和注销、申请预约、显示预约、取消预约四个功能进行分析和实现。


目录

8 学生模块

8.1 学生登录和注销

8.1.1 构造函数

8.1.2 学生子菜单

8.1.3 菜单功能实现

8.1.4 接口对接

8.1.5  测试结果

8.2 申请预约

8.2.1 获取机房信息

8.2.2 预约功能实现

8.2.3 测试结果

8.3 显示预约

8.3.1 创建预约类

8.3.2 显示自身预约

8.3.3 显示所有预约

8.4 取消预约

8.4.1 取消预约思想

8.4.2 取消预约功能实现

​编辑 8.4.3 测试结果


8 学生模块

8.1 学生登录和注销

8.1.1 构造函数

在student类的构造函数中,初始化学生信息,代码如下:

//有参构造 参数:学号、姓名、密码
Student::Student(int id, string name, string pwd)
{//初始化属性this->m_Id = id;this->m_Name = name;this->m_Pwd = pwd;
}

 添加位置如图:

8.1.2 学生子菜单

  • 在机房预约系统.cpp中,当用户登录学生,添加学生菜单接口
  • 将不同的分支提供出来

        申请预约

        查看我的预约

        查看所有预约

        取消预约

        注销登录

  • 实现注销功能

添加全局函数void studentMenu(Identity* &student):

//进入学生的子菜单
void studentMenu(Identity* &student)
{while(true){//调用学生的子菜单student->operMenu();//将父类指针 转为子类对象指针,调用子类的其他接口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");return;}}
}

 添加位置如图:

8.1.3 菜单功能实现

在实现成员函数void Student::operMenu()代码如下:

//菜单界面
void Student::operMenu()
{cout << "欢迎学生代表" << this->m_Name << "登录!" << endl;cout << "\t\t -------------------------------------------------" << endl;cout << "\t\t|                                                 |\n";cout << "\t\t|                 1.申请预约                      |\n";cout << "\t\t|                                                 |\n";cout << "\t\t|                 2.查看我的预约                  |\n";cout << "\t\t|                                                 |\n";cout << "\t\t|                 3.查看所有预约                  |\n";cout << "\t\t|                                                 |\n";cout << "\t\t|                 4.取消预约                      |\n";cout << "\t\t|                                                 |\n";cout << "\t\t|                 0.注销登录                      |\n";cout << "\t\t|                                                 |\n";cout << "\t\t -------------------------------------------------" << endl;cout << "请选择您的操作:" << endl;
}

  添加位置如图:

8.1.4 接口对接

  • 在学生登录成功后,调用学生的子菜单界面
  • 在学生登录分支中,添加代码:
	//进入学生身份的子菜单studentMenu(person);

   添加位置如图:

8.1.5  测试结果

登录成功测试:

 注销成功测试:

8.2 申请预约

8.2.1 获取机房信息

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

在student.h中添加新头文件和新的成员函数如下:

#include"computerRoom.h"
#include<vector>
	//机房容器vector<ComputerRoom> vCom;

在student.cpp学生的有参构造函数中追加如下代码:

//有参构造 参数:学号、姓名、密码
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 com;while (ifs>>com.m_Comid && ifs>>com.m_MaxNum){//将读取的信息放入容器中vCom.push_back(com);}ifs.close();
}

   添加位置如图:

至此,vCom中保存了所有机房信息。

8.2.2 预约功能实现

在student.cpp中实现成员函数void Student::applyOrder()

//申请预约
void Student::applyOrder()
{cout << "机房开放时间为周一至周五" << endl;cout << "请输入申请预约的时间:" << endl;cout << "1、 周一" << endl;cout << "2、 周二" << endl;cout << "3、 周三" << endl;cout << "4、 周四" << endl;cout << "5、 周五" << endl;int date = 0;  //日期int interval = 0;  //时间断int room = 0;  //机房号while (true){cin >> date;if (date >= 1 && date <= 5){break;}cout << "输入有误,请重新输入" << endl;}cout << "请输入申请预约的时间段:" << endl;cout << "1、 上午" << endl;cout << "2、 下午" << endl;while (true){cin >> interval;if (interval >= 1 && interval <= 2){break;}cout << "输入有误,请重新输入" << endl;}cout << "请选择机房:" << endl;for (int i = 0; i < vCom.size(); i++){cout << vCom[i].m_Comid << "号机房容量为:" << vCom[i].m_MaxNum << endl;}while (true){cin >> room;if (room >= 1 && room <= 3){break;}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 << "roomId:" << room << " ";ofs << "status:" << 1 << endl;ofs.close();system("pause");system("cls");}

    添加位置如图:

8.2.3 测试结果

在order.txt文件中生成如下 内容:

  • data是周一至周五,1代表“周一”
  • interval是时间段,1代表“上午”
  • stuId是学生学号,这里学生学号为“1”
  • stuName学生姓名,这里学生姓名为“张三”
  • roomId预约的机房号,这里预约了2号机房
  • statues 预约状态,1代表“在审核中...”

8.3 显示预约

map容器嵌套map容器,外层map容器可以值是第几条信息,内层map是每条信息具体内容(data、interval、stuId、stuName、roomId、status)据结构展示:

8.3.1 创建预约类

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

(1)在头文件以及源文件下分别创建orderFile.h和orderFile.cpp文件

(2)orderFile.h中添加如下代码:

#pragma once
#include<iostream>
using namespace std;
#include"globalFile.h"
#include<fstream>
#include<map>class OrderFile
{
public://构造函数OrderFile();//更新预约记录void updateOrder();//记录预约条数int m_Size;//记录所有预约信息的容器  key 记录条数   value 记录键值对信息map<int, map<string, string>> m_orderDate;
};

    添加位置如图: 

 (3)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;//date:1111string 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));}//截取时间段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));}//将小map容器放到大map中this->m_orderDate.insert(make_pair(this->m_Size, m));m_Size++;	}//测试大mapfor (map<int, map<string, string>>::iterator it = m_orderDate.begin(); it != m_orderDate.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;}ifs.close();
}//更新预约记录
void OrderFile::updateOrder()
{if (this->m_Size == 0){return;//预约记录0条,直接return}ofstream ofs(ORDER_FILE, ios::out | ios::trunc);for (int i = 0; i < this->m_Size; i++){ofs << "date:" << this->m_orderDate[i]["date"] << " ";ofs << "interval" << this->m_orderDate[i]["interval"] << " ";ofs << "stuId" << this->m_orderDate[i]["stuId"] << " ";ofs << "stuName" << this->m_orderDate[i]["stuName"] << " ";ofs << "roomId" << this->m_orderDate[i]["roomId"] << " ";ofs << "status" << this->m_orderDate[i]["status"] << endl;}}

8.3.2 显示自身预约

(1)首先我们先添加几条预约记录,order.txt文件内容如下,四条预约信息:

(2)在Student类的void Student::showOrder()成员函数中,添加如下代码:

//查看我的预约
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_orderDate[i]["stuId"].c_str()))//找到自身预约{cout << "预约日期:周" << of.m_orderDate[i]["date"] << " ";cout << "时间段:" << (of.m_orderDate[i]["interval"] == "1" ? "上午" : "下午") << " ";cout << "机房号:" << of.m_orderDate[i]["roomId"] << " ";string status = "状态:";//1 审核中  2 已预约  -1 预约失败  0 取消预约if (of.m_orderDate[i]["status"] == "1"){status += "审核中";}else if (of.m_orderDate[i]["status"] == "2"){status += "预约成功";}else if (of.m_orderDate[i]["status"] == "-1"){status += "预约失败,审核未通过";}else{status += "预约已取消";}cout << status << endl;}else{cout << "无预约记录!" << endl;system("pause");system("cls");return;}}system("pause");system("cls");
}

    添加位置如图: 

其中将string 转int
        第一步:string 利用.c_str() 转const char *
        第二步:利用 atoi(const char *) 转int 

(3)测试结果

张三查看自己的预约:

李四查看自己的预约: 

王五(并无预约记录)查看自己的预约: 

8.3.3 显示所有预约

(1)在Student类的void Student::showAllOrder()成员函数中,添加如下代码:

//查看所有预约
void Student::showAllOrder()
{OrderFile of;if (of.m_Size == 0){cout << "无预约记录" << endl;system("pause");system("cls");}for (int i = 0; i < of.m_Size; i++){cout << i + 1 << "、  ";cout << "预约日期:周" << of.m_orderDate[i]["date"] << " ";cout << "时段:" << (of.m_orderDate[i]["interval"]=="1"?"上午":"下午") << " ";cout << "学号:" << of.m_orderDate[i]["stuId"] << " ";cout << "姓名:" << of.m_orderDate[i]["stuName"] << " ";cout << "机房号" << of.m_orderDate[i]["roomId"] << " ";string status = "状态:";//1 审核中  2 已预约  -1 预约失败  0 取消预约if (of.m_orderDate[i]["status"] == "1"){status += "审核中";}else if (of.m_orderDate[i]["status"] == "2"){status += "预约成功";}else if (of.m_orderDate[i]["status"] == "-1"){status += "预约失败,审核未通过";}else{status += "取消预约";}cout << status << endl;}system("pause");system("cls");
}

    添加位置如图: 

(2)测试结果

 登录学生代表张三账号后,查看所有预约如下:

8.4 取消预约

8.4.1 取消预约思想

筛选出该学号的预约→筛选出状态为“审核中”或“预约成功”的预约→记录符合条件预约的index于vector<int>v中→根据用户选择select-1取得实际下标→更改选中下标的状态为“0”取消预约

8.4.2 取消预约功能实现

在Student类的void Student::cancelOrder()成员函数中,添加如下代码:

//取消预约
void Student::cancelOrder()
{OrderFile of;if (of.m_Size == 0){cout << "无预约记录!" << endl;system("pause");system("cls");return;}cout << "审核中或预约成功的记录可以取消" << endl;vector<int>v;//存放在最大容器的编号int index = 1;for (int i = 0; i < of.m_Size; i++){//先判断是自身的学号if (this->m_Id == atoi(of.m_orderDate[i]["stuId"].c_str())){//再筛选状态  审核中或预约成功if (of.m_orderDate[i]["status"] == "1" || of.m_orderDate[i]["status"] == "2"){v.push_back(i);cout << index++ << "、 ";cout << "预约日期:周" << of.m_orderDate[i]["date"]<<" ";cout << "时间段:" << (of.m_orderDate[i]["interval"] == "1" ? "上午" : "下午") << " ";cout << "机房号:" << of.m_orderDate[i]["roomId"] << " ";string status = "状态:";if (of.m_orderDate[i]["status"] == "1"){status += "审核中";}else if (of.m_orderDate[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_orderDate[v[select - 1]]["status"] = "0";of.updateOrder();cout << "已经取消预约" << endl;break;}}cout << "输入有误,请重新输入" << endl;}system("pause");system("cls");
}

     添加位置如图: 

 8.4.3 测试结果

查看张三的预约有如下:

选择取消预约功能:

查看预约,取消张三的第四条预约成功:

 

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

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

相关文章

gitlab 部署项目新分支

公司代码管理平台新切换到gitlab下&#xff0c;上线发版流程随之变更 1新建分支&#xff0c;开发完成&#xff0c;提交新分支 2.去gitlab平台上找到Merge requests 3 点击右上角的New merge request select source branch 选择新建的分支 点击 compare branches and contin…

Vulnhub靶机:driftingblues 7

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;driftingblues7&#xff08;10.0.2.23&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entr…

鸿蒙应用开发-仿微信消息对话列表

功能介绍&#xff1a; 仿微信消息对话列表&#xff0c;显示发送文本和接收文本&#xff0c;参考文档创建列表。 知识点&#xff1a; 熟悉对List控件的使用。熟悉对Text控制定义&#xff0c;如修改边框等。手动控制列表的跳转。动态添加列表数据。使用构造函数初始化数据。 …

mysql常见的需求,对于关键字的使用

如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能 如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能&#xff0c;也可以根据实际需求自定义一个函数。这种技术在一些需要对数据进…

【翻译】在Qt Designer中创建主窗口(Main Windows)

原文地址&#xff1a;https://doc.qt.io/qt-6/designer-creating-mainwindows.html Qt Designer 可用于为不同用途创建用户界面&#xff0c;并为每个用户界面提供不同类型的模板。主窗口模板用于创建具有菜单栏、工具栏和停靠窗口部件的应用程序窗口。 通过打开文件菜单并选择…

【新】Unity Meta Quest MR 开发(一):Passthrough 透视配置

文章目录 &#x1f4d5;教程说明&#x1f4d5;配置透视的串流调试功能&#x1f4d5;第一步&#xff1a;设置 OVRManager&#x1f4d5;第二步&#xff1a;添加 OVRPassthroughLayer 脚本&#x1f4d5;第三步&#xff1a;在场景中添加虚拟物体&#x1f4d5;第四步&#xff1a;设置…

DETR 个人理解

DETR 个人理解 目录 DETR 个人理解 概念说明 transformer网络结构 整体流程 损失计算 整体理解 结果说明 论文 代码 参考链接 个人拙见&#xff0c;仅供参考&#xff0c;欢迎指正交流 这篇论文还是挺重要的&#xff0c;因为是transforms用于目标检测的第一篇论文&am…

【征服redis2】redis的事务介绍

目录 目录 1.redis事务介绍 2 事务出错的处理 3.Java如何使用redis事务 1.redis事务介绍 在前面我们介绍了redis的几种典型数据结构和应用&#xff0c;本文我们来看一下redis的事务问题。事务也是数据库的重要主题&#xff0c;熟悉关系型数据库的读者应该对事务比较了解&a…

openGauss学习笔记-202 openGauss 数据库运维-常见故障定位案例-不同用户查询同表显示数据不同

文章目录 openGauss学习笔记-202 openGauss 数据库运维-常见故障定位案例-不同用户查询同表显示数据不同202.1 不同用户查询同表显示数据不同202.1.1 问题现象202.1.2 原因分析202.1.3 处理办法 openGauss学习笔记-202 openGauss 数据库运维-常见故障定位案例-不同用户查询同表…

FPGA之分布RAM(1)

SLICEM 资源可以实现分布式 RAM。可以实现的 RAM 类型&#xff1a; 单口 RAM 双端口 简单的双端口 四端口 下表给出了通过1SLICEM中的4个LUT可以实现的RAM类型 1.32 X2 Quad Port Distributed RAM 我们介绍过把 6 输入 LUT 当作 2 个 5输入 LUT 使用&#xff0c;在这里&a…

【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)

[18/01/2024]&#xff1a;目前为了准备蓝桥杯做一些资料贴&#xff0c;于是写下这一篇博客。 各种资料均来源于网络以及部分书籍、手册等文档&#xff0c;参考不保证其准确性。 如果在准备蓝桥杯&#xff0c;可与我私信共同学习&#xff01;&#xff01;&#xff01;&#xf…

每日OJ题_算法_滑动窗口⑤_力扣904水果成篮

目录 力扣904. 水果成篮 解析及代码1&#xff08;使用容器&#xff09; 解析及代码2&#xff08;开数组&#xff09; 力扣904. 水果成篮 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 难度 中等 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这…