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; //机房id
	int 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 注销登录。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法】队列+bfs算法 解决树的相关算法题(C++)

文章目录 1. 前言2. 算法题429.N叉树的层序遍历103.二叉树的锯齿形层序遍历662.二叉树最大宽度515.在每个树行中找最大值 1. 前言 队列 与 宽度优先算法&#xff08;BFS&#xff09;是解决很多算法问题的常见工具。 BFS通过逐层遍历图或树的节点来寻找解决问题的最短路径或最…

画图案例分享

案例 1 from scipy.misc import derivative from scipy.integrate import quad import matplotlib.pyplot as plt import numpy as np import pandas as pd from scipy.stats import norm import warningsplt.style.use(ggplot) np.random.seed(37) warnings.filterwarnings(i…

《Linux C编程实战》笔记:出错处理

这一节书上把它放到线程这一章&#xff0c;按理说应该在前面就讲了 头文件errno.h定义了变量errno&#xff0c;它存储了错误发生时的错误码&#xff0c;通过错误码可以得到错误的信息 程序开始执行时&#xff0c;变量errno被初始化为0。很多库函数在执行过程中遇到错误时就会…

排序算法9----计数排序(C)

计数排序是一种非比较排序&#xff0c;不比较大小 。 1、思想 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 2、步骤 1、统计数据&#xff1a;统计每个数据出现了多少次。&#xff08;建立一个count数组&#xff0c;范围从[MIN,MAX],MAX代表arr中…

关于gltf模型格式文件的学习

目录 glTF模型 小黄鸭的gltf模型 字段分析 scene nodes meshes primitives attributes indices mode material accessors bufferView byteOffset count componentType type materials textures images samplers magFilter与minFilter wrapS与wrapT 进行…

10个用于Android开发的有用的Kotlin库及示例

10个用于Android开发的有用的Kotlin库及示例 在Android开发领域&#xff0c;Kotlin已成为一门领先的语言&#xff0c;带来了现代语法和功能的浪潮。随着Kotlin的崛起&#xff0c;涌现出了许多专为其定制的库&#xff0c;进一步增强了开发体验。本文将深入介绍其中的10个库&…

2024年美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

C语言从入门到实战——动态内存管理

动态内存管理 前言一、 为什么要有动态内存分配二、 malloc和free2.1 malloc2.2 free 三、calloc和realloc3.1 calloc3.2 realloc 四、常见的动态内存的错误4.1 对NULL指针的解引用操作4.2 对动态开辟空间的越界访问4.3 对非动态开辟内存使用free释放4.4 使用free释放一块动态开…

赤藓糖醇行业研究:预计2029年将达到3.5亿美元

赤藓糖醇是一种四碳糖醇&#xff0c;存在于多种食物中&#xff0c;如葡萄、梨、西瓜等&#xff0c;可由微生物发酵法和化学合成法两种方法制备&#xff0c;目前商业化生产中均采用微生物发酵法。赤藓糖醇由葡萄糖发酵制作而成&#xff0c;上游原料主要包括葡萄糖、玉米淀粉糖和…

Android中的anr定位指导与建议

1.背景 8月份安卓出现了一次直播间卡死(ANR)问题&#xff0c;且由于排查难度较大&#xff0c;持续了较长时间。本文针对如何快速定位安卓端出现ANR问题进行总结和探讨. 这里大致补充一下当时的情况,当时看到情景的是从某一个特定的场景下进入直播间后整个直播间界面立刻就卡住…

23年11月移动广告行业大盘趋势,借鉴双 11 ,年货节该如何提高广告收益

前言 年货节开始啦&#xff0c;我们可以借鉴2023年双11期间的广告大盘趋势&#xff0c;洞悉如何在大型促销期间调整广告运营策略以提升效果。年货节是一个绝佳的时机&#xff0c;可以利用在双11期间积累的经验和策略&#xff0c;进行相应的调整和优化。通过精准定位广告投放高…

Elasticsearch:和 LIamaIndex 的集成

LlamaIndex 是一个数据框架&#xff0c;供 LLM 应用程序摄取、构建和访问私有或特定领域的数据。 LlamaIndex 是开源的&#xff0c;可用于构建各种应用程序。 在 GitHub 上查看该项目。 安装 在 Docker 上设置 Elasticsearch 使用以下 docker 命令启动单节点 Elasticsearch 实…

maven无法识别本地maven仓库包解决方案

前言&#xff1a;由于本地maven仓库已经有了相关依赖包&#xff0c;idea还是去远程仓库下载(不知何原因&#xff0c;生产上到远程仓库的网络突然不通了)&#xff0c;故需要自己本地上传相关包到生产主机并修改setttings文件来强制读取本地仓库方案 settings文件修改如下方式即…

iPad如何连接到Wi-Fi,这里提供详细步骤

这篇文章解释了如何将iPad连接到Wi-Fi&#xff0c;无论是公共Wi-Fi网络还是需要密码的专用网络。 将iPad连接到Wi-Fi 当你想让iPad联机时&#xff0c;请按照以下步骤连接到Wi-Fi&#xff1a; 1、在iPad的主屏幕上&#xff0c;点击设置。 2、点击Wi-Fi。 3、要启动iPad搜索附…

数据库作业三

1.创建student和score表 2.为student表和score表增加记录 3.查询student表的所有记录 4.查询student表的第2条到4条记录 5.从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 6.从st…

Zabbix6.4 图形乱码怎么办

Zabbix6.4 图形乱码怎么办 Zabbix6.4 安装后&#xff0c;进入主机图形展示&#xff0c;你会发现文字部分乱成了乱码。 找一台Microsoft Windows 7/10/11的电脑&#xff0c;打开C:\Windows\Fonts 找到【楷体 常规】&#xff0c;将字体复制到桌面。 桌面上就会多出simkai.ttf字…

5.2 基于深度学习和先验状态的实时指纹室内定位

文献来源 Nabati M, Ghorashi S A. A real-time fingerprint-based indoor positioning using deep learning and preceding states[J]. Expert Systems with Applications, 2023, 213: 118889.&#xff08;5.2_基于指纹的实时室内定位&#xff0c;使用深度学习和前一状态&…

抖音弹幕直播玩法汉字找不同文字找不同无人值执守自动玩游戏自带语音播报的开发日志

#找不同# 要解决如下几个问题&#xff1a; 1.声音sprite的录制和调用&#xff0c;解决方案以及解决库如下&#xff1a; howler.min.js://一款不错的音频播放js库。 2.鼠标自动飘浮,使用的库 anime.min.js 3.资源预加载 preload.min.js 4.其它使用到的库 jquery,vue

Docker安装开源Blog(Typecho)

前言 首先这个镜像是centos7.9进行安装PHP环境&#xff0c;然后挂载目录去运行的&#xff0c;镜像大概300MB左右&#xff0c;没学过PHP&#xff0c;没办法给Dockerfile文件 参考文章&#xff1a;Docker安装Typecho | D-y Blog感知不强&#xff0c;图一乐https://www.wlul.top…

开放式耳机哪个品牌好?2024最新开放式耳机选购指南!实测避雷!

如果你是一个对音质和舒适度有要求的人&#xff0c;那么你一定要看看开放式耳机了&#xff0c;开放式耳机不是像封闭式耳机那样堵着耳朵&#xff0c;它能够提供更宽广的音场和更自然声音&#xff0c;佩戴也更加舒适&#xff0c;那么哪个品牌的开放式耳机最好呢&#xff1f;接下…