c++学习笔记-STL案例-机房预约系统4-管理员模块

前言

衔接上一篇“c++学习笔记-STL案例-机房预约系统3-登录模块”,本文主要设计管理员模块,从管理员登录和注销、添加账号、显示账号、查看机房、清空预约五个功能进行分析和实现。


目录

7 管理员模块

7.1 管理员登录和注销

7.1.1 构造函数

​编辑7.1.2 管理员子菜单

7.1.3 菜单功能实现

​编辑

7.1.4 接口对接

7.4.5 测试结果

7.2 添加账号

7.2.1 添加账号

7.2.2 添加功能实现

7.2.3 测试结果

7.2.4 去重操作

7.2.4.1 获取文件中学生和老师信息

7.2.4.2 去重函数封装

7.2.4.3 添加去重操作

7.2.4.4 bug解决

 7.3 显示账号

7.3.1 显示功能实现

7.3.2 测试结果

7.4 查看机房

7.4.1 添加机房信息

7.4.2 机房类创建

7.4.3 初始话机房信息

7.4.4 显示机房信息

7.4.5 测试结果

7.5 清空预约

7.51. 清空功能实现

7.5.2 确认清除判断

7.5.3 测试结果

总结


7 管理员模块

7.1 管理员登录和注销

7.1.1 构造函数

  • 在manager类的构造函数中,初始化管理员信息,代码如下:

//有参构造 参数:管理员姓名、密码
Manager::Manager(string name, string pwd)
{//初始化管理员信息this->m_Name = name;this->m_Pwd = pwd;
}

添加位置如图:

7.1.2 管理员子菜单

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

        添加账号

        查看账号

        查看机房

        清空预约

        注销登录

实现注销功能

  • 添加全局函数 void managerMenu(Identity * &manager),代码如下:
//进入管理员子菜单
void managerMenu(Identity*& manager)
{while (true){//调用管理员子菜单manager->operMenu();//父类指针创建子类对象,调用共同接口//将父类指针 转为子类对象指针,调用子类的其他接口Manager* man = (Manager*)manager;  // (Manager*)是强制转换int select = 0;//接收用户选择cin >> select;if (select == 1){//添加账号cout << "添加账号" << endl;man->addPerson();}else if (select == 2){//查看账号cout << "查看账号" << endl;man->showPerson();}else if (select == 3){//查看机房cout << "查看机房" << endl;man->showComputer();}else if (select == 4){//清空预约cout << "清空预约" << endl;man->clearFile();}else{//注销登录delete manager;//销毁堆区对象cout << "注销成功" << endl;system("pause");return;}}
}

 添加位置如图:

         其中,void managerMenu(Identity * &manager), “  Identity * 父类指针接收,前面创建人时用父类指针创建的具体人;
        Manager* man = (Manager*)manager;  // (Manager*)是强制转换,将父类指针 转为子类对象指针,调用子类的其他接口

7.1.3 菜单功能实现

  • 在实现成员函数void Manager::operMenu()代码如下:
//manager子菜单界面
void Manager::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;
}

添加位置如图:  

7.1.4 接口对接

  • 管理员成功登录后,调用管理员子菜单界面
  • 在管理员登录验证分支中,添加代码:
				//进入管理员身份子菜单managerMenu(person);

7.4.5 测试结果

登录成功

 选1-4后会重复出现管理员子菜单,因为管理员功能还未实现,但是显示“添加账号”表示成功进入添加账号分支:

7.2 添加账号

7.2.1 添加账号

(1) 功能描述:

  • 给学生或教师添加新的账号

(2) 功能要求:

  • 添加学生学号不能重复、教师职工号不能重复

7.2.2 添加功能实现

在Manager.h中添加"globalFile.h"引入文件的宏定义,添加"fstream"做文件写出到txt相关操作,如下图所示:

在Manager.cpp的addPerson()成员函数中,实现添加新账号功能,代码如下:

//添加账号
void Manager::addPerson()
{cout << "请输入添加账号的类型:" << endl;cout << "1、添加学生" << endl;cout << "2、添加老师" << endl;string fileName;//操作文件名string tip;//提示id号ofstream ofs;//文件操作对象int select = 0;cin >> 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 << tip << endl;cin >> id;cout << "请输入您的姓名:" << endl;cin >> name;cout << "请输入密码:" << endl;cin >> pwd;//向文件中添加数据ofs << id << " " << name << " " << pwd << endl;cout << "添加成功" << endl;system("pause");system("cls");ofs.close();}

其中,app追加的方式写文件 ofs.open(fileName, ios::out | ios::app),可以实现在原有信息上添加新的信息。

添加位置如图: 

7.2.3 测试结果

登录管理员账号:

添加学生账号:

添加老师账号:

7.2.4 去重操作

7.2.4.1 获取文件中学生和老师信息
  • 要去除重复的账号,首先要将学生和老师的账号信息获取到程序中,方可检测

  • 在manager.h中,添加两个容器,用于存放学生和教师信息
  • 添加一个新的成员函数 void initVector()  初始化容器

(1)添加头文件#include<vector>、#include"student.h"、#include"teacher.h";添加vStu、vTea、initVector()

	//学生容器vector<Student> vStu;//老师容器vector<Teacher> vTea;//初始化容器void initVector();

添加位置如图:

(2)实现initVector():

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();
}

添加位置如图: 

(3)测试结果:

7.2.4.2 去重函数封装

(1)在manager.h文件中添加成员函数bool checkRepeat(int id,int type);

(2)在manager.cpp文件中实现成员函数bool checkRepeat(int id,int type);

//检测重复 参数:(传入id,传入类型)  返回:(true 代表重复;false 代码不重复)
bool Manager::checkRepeat(int id, int type)
{if (type == 1){//检测学生for (vector<Student>::iterator it = vStu.begin(); it != vStu.end(); it++){if (id == it->m_Id){return true;}}}else{//检测老师for (vector<Teacher>::iterator it = vTea.begin(); it != vTea.end(); it++){if (id == it->m_EmpId){return true;}}}return false;
}

 添加位置如图: 

7.2.4.3 添加去重操作

在manager.cpp的void Manager::addPerson()函数中增加如下代码:

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 << tip << endl;while (true){cin >> id;bool ret = checkRepeat(id, select);if (ret)//有重复{cout << errorTip << endl;}else{break;}}

 添加位置如图: 

测试结果:

(1)控制台显示“添加成功”

 (2)txt文本中新增了王五的数据:

7.2.4.4 bug解决

(1)bug描述:

  • 虽然可以检测到重复的账号,但是刚添加的账号由于没有更新到容器中,因此不会被检查
  • 导致刚加入的账号的学号或者职工号,再次添加时依然会重复

(2)解决方案:

  • 在每次添加新账号时,重新初始化容器

在添加完毕后加入代码:

//初始化容器this->initVector();

添加位置如图: 

 7.3 显示账号

功能描述:显示学生信息或教师信息

7.3.1 显示功能实现

在manager.h添加#include<algorithm>

在manager.cpp的showPerson()成员函数中,实现显示账号功能,代码如下:

//打印学生信息
void printStudent(Student& s)
{cout << "学号:" << s.m_Id << "  姓名:" << s.m_Name << "  密码:" << s.m_Pwd << endl;
}//打印老师信息
void printTeacher(Teacher& t)
{cout << "职工号:" << t.m_EmpId << "  姓名:" << t.m_Name << "  密码:" << t.m_Pwd <<endl;
}//查看账号
void Manager::showPerson()
{cout << "请选择要查看的内容" << endl;cout << "1、查看所有的学生" << endl;cout << "2、查看所有的老师" << endl;int select = 0;//接收用户的选择cin >> select;if (select == 1){//查看学生cout << "所有学生的信息如下:" << endl;for_each(vStu.begin(), vStu.end(), printStudent);}else{//查看老师cout << "所有老师的信息如下:" << endl;for (vTea.begin(), vTea.end(), printTeacher);}system("pause");system("cls");
}

添加位置如图:

复习一下:managerMenu函数管理子菜单中,添加了showPerson()函数,可以调用这里的查看函数,显示查看所有学生信息或老师信息的结果

7.3.2 测试结果

查看学生:

查看老师:

7.4 查看机房

7.4.1 添加机房信息

在案例需求中,机房一共有三个,其中1号机房容量20台机器,2号50台机器,3号100台机器

在comnputerRoom.txt中添加三条信息:

7.4.2 机房类创建

在头文件下,创建新的文件computerRoom.h

并添加如下代码:

#pragma once
#include<iostream>
using namespace std;//机房类
class ComputerRoom
{
public:int m_Comid; //机房idint m_MaxNum; //机房最大容量
};

添加位置如图:

7.4.3 初始话机房信息

在Manager管理员类下,添加机房的容器,用于保护机房信息

在Manager.cpp 有参构造函数中,追加如下代码,初始化机房信息:

//初始化机房信息this->initComVector();
void Manager::initComVector()
{//获取机房信息ifstream ifs;ifs.open(COMPUTER_FILE, ios::in);ComputerRoom c;while (ifs >> c.m_Comid && ifs >> c.m_MaxNum){this->vCom.push_back(c);}cout << "当前机房数量:" << vCom.size() << endl;ifs.close();
}

添加位置如图:

7.4.4 显示机房信息

在manager类的showComputer成员函数中添加如下代码:

//查看机房
void Manager::showComputer()
{cout << "机房的信息如下:" << endl;for_each(vCom.begin(), vCom.end(), printComputerRoom);system("pause");system("cls");
}

添加位置如图:

7.4.5 测试结果

登录管理员账号后,当前机房数量为3,查看机房具体信息:

7.5 清空预约

功能描述:清空生成的order.txt预约文件

7.51. 清空功能实现

(1)实现思路

ofstream ofs(ORDER_FILE, ios::trunc);

trunc的方式打开:如果文件存在,删除后重新创建

(2)在Manager的cleanFile成员函数中添加如下代码:

//清空预约记录
void Manager::clearFile()
{ofstream ofs(ORDER_FILE, ios::trunc);ofs.close();cout << "清空成功!" << endl;system("pause");system("cls");
}

 添加位置如图:

7.5.2 确认清除判断

在机房预约系统.cpp中void managerMenu(Identity*& manager)函数的分支4下添加如下代码:

	else if (select == 4){//清空预约cout << "确认清空?" << endl;cout << "1 确认" << endl;cout << "2 取消" << endl;cin >> selectConcret;if (selectConcret == 1){cout << "清空预约" << endl;man->clearFile();}system("pause");system("cls");}

  添加位置如图:

7.5.3 测试结果

在order.txt添加如下测试信息:

 登录管理员账号后选择“清空预约”:

再次打开order.txt文件后清空了信息:

 还可以选择“取消”,则信息不会被清空。


总结

        本文围绕管理员账号的功能:添加账号、查看账号、查看机房、清空预约、注销登录,进行了实现与测试,主要运用了c++中的文件流fstream、容器vector、算法algorithm,main函数调用LogIn函数登录管理员账号,LogIn的分支3为管理员身份验证,验证成功就通过managerMenu进入管理员身份子菜单,子菜单接受用户输入的操作选项:1 添加账号;2 查看账号;3 查看机房;4 清空预约;5 注销登录。

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

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

相关文章

加速电压对扫描电子显微镜成像的影响

扫描电子显微镜&#xff08;SEM&#xff09;是一种利用聚焦电子束扫描样品表面&#xff0c;通过激发和收集二次电子、特征X射线等信号&#xff0c;获得样品表面形貌和成分信息的分析仪器。在SEM成像过程中&#xff0c;加速电压是一个关键参数&#xff0c;对成像效果具有重要影响…

【概述版】悲剧先于解析:在大型语言模型的新时代,历史重演了

这篇论文探讨了大型语言模型&#xff08;LLM&#xff09;的成功对自然语言处理&#xff08;NLP&#xff09;领域的影响&#xff0c;并提出了在这一新时代中继续做出有意义贡献的方向。作者回顾了2005年机器翻译中大型语法模型的第一个时代&#xff0c;并从中汲取教训和经验。他…

运动型蓝牙耳机推荐哪款?2024运动耳机排行榜最新

​运动耳机在运动爱好者的装备清单中占有重要地位&#xff0c;要求舒适佩戴、卓越音质和环境适应性。市面上的运动耳机琳琅满目&#xff0c;选择合适的可能令人犹豫。那么都有哪些运动耳机值得入手呢&#xff1f;今天来跟大家聊聊运动耳机推荐哪款。 1.南卡开放式耳机&#xff…

数据结构:链式栈

stack.h /* * 文件名称&#xff1a;stack.h * 创 建 者&#xff1a;cxy * 创建日期&#xff1a;2024年01月18日 * 描 述&#xff1a; */ #ifndef _STACK_H #define _STACK_H#include <stdio.h> #include <stdlib.h>typedef struct stack{int data…

环形链表问题2(返回链表开始入环的第一个节点)

环形链表问题2&#xff08;返回链表开始入环的第一个节点&#xff09; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream…

妇幼保健院污水处理需要哪些工艺设备

妇幼保健院作为医疗机构&#xff0c;在日常运营中会产生大量的污水&#xff0c;因此污水处理是一个非常重要的环节。为了保证污水得到有效处理&#xff0c;并达到相关的排放标准&#xff0c;妇幼保健院污水处理工艺设备是必不可少的。 首先&#xff0c;妇幼保健院污水处理需要一…

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

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

大数据开发之Hadoop(Yarn)

第 1 章&#xff1a;Yarn资源调度器 思考&#xff1a; 1、如何管理集群资源&#xff1f; 2、如何给任务合理分配资源&#xff1f; Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等运…

防止AWS主机被攻击

虚拟机经常连接不上 由于工作需要&#xff0c;自己在亚马逊买了台EC2主机&#xff0c;并在上面安装了工作要用的软件&#xff0c;以前是只有关键时间点才会连不上&#xff0c;可是最近几乎每隔一天就连不上&#xff0c;导致工作受影响&#xff0c;所以决定花时间看看怎么回事。…

分享一个基于easyui前端框架开发的后台管理系统模板

这是博主自己在使用的一套easyui前端框架的后台管理系统模版&#xff0c;包含了后端的Java代码&#xff0c;已经实现了菜单控制、权限控制功能&#xff0c;可以直接拿来使用。 springboot mybatis mybatis-plus实现的增删查改完整项目&#xff0c;前端使用了easyui前端框架。…

文件系统和IO流

目录 ​文件系统和IO流 一:文件的认知 认识文件 树型结构组织和⽬录: 文件路径&#xff08;Path): 文件形式: 二:File的方法 File的概述: File的属性 File的构造方法 File常用的get系列方法 ⽰例一:观察get系列的特点和差异 File常用的增,删方法 示例二:普通文件…

Unity 编辑器篇|(十)Handles (全面总结 | 建议收藏)

目录 1. 前言2 参数总览3 Handles两种使用方式3.1 基于Editor类的OnSceneGUI3.2 基于EditorWindow 4 Handles绘制4.1 Draw&#xff1a;绘制元几何体(点、线、面)4.1.1 抗锯齿&#xff1a; DrawAAPolyLine 、 DrawAAConvexPolygon4.1.2 绘制实线: DrawLine 、 DrawLines 、DrawP…

排序:非递归的归并排序

目录 递归与非递归的思想对比&#xff1a; 递归&#xff1a; 非递归&#xff1a; 代码解析&#xff1a; 完整代码&#xff1a; 递归与非递归的思想对比&#xff1a; 递归&#xff1a; 在之前的归并排序&#xff0c;它的核心思想是通过不断的分割&#xff0c;从一个数组变…

HTML 表单

文章目录 表单什么是表单GET和POST两种提交方式有什么不同?表单元素表单项外文本单行文本输入框单行文本密码框单选框复选框下拉列表框上传文件隐藏域填写邮箱填写电话填写数字填写日期进度条多行文本输入框提交按钮取消按钮 用户注册案例 表单 什么是表单 form:表单元素 此…

机器人强化学习-双机械臂

概要 基于 robosuite 库&#xff0c;进行双臂机器人学习训练 环境测试 下面展示下分别控制两个机械手随机运动的画面&#xff1a; 双臂显示场景如下&#xff1a;双臂调用代码如下&#xff1a; import numpy as np import robosuite as suite import robomimic import rob…

【vue2】状态管理之 Vuex

文章目录 一、介绍1、概念 2、工作示意图3、安装4、简单示例 二、核心1、State1.1 组件中获取 Vuex 的状态1.2 mapState 辅助函数1.3 对象展开运算符 2、Getter2.1 基本使用2.2 通过属性访问2.3 通过方法访问2.4 mapGetters 辅助函数 3、Mutation3.1 定义 mutation3.2 commit 提…

多线程排序(java版)

&#x1f4d1;前言 本文主要是【排序】——多线程排序的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#x…

Docker-02-镜像项目部署

Docker-02-镜像&项目部署 文章目录 Docker-02-镜像&项目部署一、镜像①&#xff1a;镜像结构②&#xff1a;Dockerfile③&#xff1a;构建镜像01&#xff1a;构建02&#xff1a;查看镜像列表03&#xff1a;运行镜像 二、网络①&#xff1a;容器的网络IP地址②&#xff…

数据中心负载测试的常用工具和技术有哪些?

数据中心负载测试是评估系统在高负载下的性能和稳定性的重要手段。通过模拟大量用户并发访问&#xff0c;可以检测系统的瓶颈和潜在问题&#xff0c;为优化系统性能提供依据。以下是一些常用的数据中心负载测试工具和技术&#xff1a; Apache JMeter&#xff1a;JMeter是一个开…

《世界之外》提前开测,网易打响国乙大战

1月18日&#xff0c;国乙市场迎来了一场大战。 原定于1月26日开服的网易新乙游《世界之外》&#xff0c;突然宣布在1月18日进行不删档、不限量测试&#xff0c;从某种意义上来说&#xff0c;其实就等同于提前公测。 而同一天开服的还有叠纸的全新3D乙游《恋与深空》&#xff…