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

news2024/11/18 19:55:08

前言

衔接上一篇“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 注销登录。

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

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

相关文章

双线逆变器之低压转高压DC-DC拓扑结构

这是一个升压的过程&#xff0c;电池电压48V经过变压器等一系列的元器件最后升压到400V 如何让变压器形成正负电压&#xff1f; 通过让Q6Q7开通&#xff0c;Q6Q8关闭形成上下- 通过让Q6Q7关闭&#xff0c;Q6Q8开通形成上-下 前面四个管子和变压器的作用就是类似一个方波发生…

【linux进程间通信(一)】匿名管道和命名管道

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程间通信 1. 前言2. 进程间…

解决Windows下VSCode控制台乱码问题

我们在Windows使用VSCode编写C/C程序时&#xff0c;如果代码中的中文字符串使用的是UTF8编码&#xff0c;且代码内没有设置控制台的输出编码&#xff0c;或者编译时没有指定运行时编码&#xff08;GCC可以在编译时使用-fexec-charsetGBK来指定运行时的字符串编码&#xff1b;cl…

停车场车辆统计 - 华为OD统一考试

OD统一考试 (C卷) 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 特定大小的停车场&#xff0c;数组cars[]表示&#xff0c;其中1表示有车&#xff0c;0表示没车。 车辆大小不一&#xff0c;小车占一个车位&#xff08;长度1&#xff09;&#xff0c;…

IntelliJ IDEA 中输出乱码解决

最近tomcat突然在控制台输出乱码&#xff0c;各种乱码问题&#xff0c;查阅大量的资料&#xff0c;最终得以解决. IDEA控制台输出乱码 问题一&#xff1a;idea中tomcat控制台输出乱码 运行本地的tomcat\bin\start.bat文件页面显示正常 在idea中显示乱码 解决&#xff1a; 根…

计算机网络-ACL实验

一、NAT实验配置 NAT实验配置 通过基本ACL匹配VLAN 10网段&#xff0c;然后在出口设备NAT转换只要匹配到VLAN10地址则进行转换。 核心交换机 # 配置VLAN和默认路由&#xff0c;配置Trunk和Access接口 interface Vlanif10ip address 192.168.10.254 255.255.255.0 # interface V…

JVM-透彻理解字节码以及指令

一、字节码与指令概述 package ch13_bytecode;public class HelloWorld {public static void main(String[] args) {System.out.println("hello world");} }生成字节码&#xff1a; cafe babe 0000 0031 0022 0a00 0600 1409 0015 0016 0800 170a 0018 0019 0700 1a…

AI嵌入式K210项目(14)-TF卡读取

文章目录 前言一、TF卡介绍二、K210的SPI接口实验过程总结 前言 本章介绍一些读取TF卡的方法&#xff0c;本章内容和前面的项目非常类似&#xff0c;都是采用了SPI接口AI嵌入式K210项目&#xff08;11&#xff09;-SPI Flash读写 一、TF卡介绍 TF有4个数据传输端&#xff0c…

多标签节点分类

Multi-Label Node Classification on Graph-Structured Data,TMLR’23 Code 学习笔记 图结构数据的多标签分类 节点表示或嵌入方法 通常会生成查找表&#xff0c;以便将相似的节点嵌入的更近。学习到的表示用作各种下游预测模块的输入特征。 表现突出的方法是基于随机游走(ran…

开发日记3(java面向对象)

&#xff08;一&#xff09;java面向对象 1、面向过程和面向对象 很久很久以前&#xff0c;系统学习过C语言&#xff0c;但也只是学过&#xff0c;没有产生过除了考试以外的其他价值。后来工作中很多伙伴都在使用java&#xff0c;虽然当时自己不写java&#xff0c;但很久之前…

Linux CentOS stream9 nmcli

nmcli命令是redhat7或者centos7之后的命令&#xff0c;该命令可以完成网卡上所有的配置工作&#xff0c;并且可以写入配置文件&#xff0c;永久生效。 一、前期准备 在讨论、学习与训练nmcli命令前&#xff0c;必须明确几点&#xff1a; 1.开启NetworkManager 使用nmcli命令…

数据结构--串

本文为复习的草稿笔记&#xff0c;&#xff0c;&#xff0c;有点乱 1. 串的基本概念和基本操作 串是由零个或多个字符组成的有限序列 2. 串的存储结构 3.串的应用 模式匹配 BF算法&#xff08;简单匹配算法 穷举法 算法思路&#xff1a;从子串的每一个字符开始依次与主串…

百度云网盘下载速度如何提升到正常速度

引入问题 我们在下载代码学习资料的时候大多数都是百度云网盘&#xff0c;但是限速&#xff01;下载的十分的慢&#xff0c;有什么办法能让我们不开通会员就能享受正常速度呢&#xff1f; 当然有&#xff01; 解决百度云网盘下载速度过慢&#xff0c;提高到正常速度 点击右…

SpringBoot + 自定义注解 + AOP 打造通用开关

前言 最近在工作中迁移代码的时候发现了以前自己写的一个通用开关实现&#xff0c;发现挺不错&#xff0c;特地拿出来分享给大家。 为了有良好的演示效果&#xff0c;我特地重新建了一个项目&#xff0c;把核心代码提炼出来加上了更多注释说明&#xff0c;希望xdm喜欢。 案例 …

编译FFmpeg4.3.1 、x264并移植到Android

1、前言 FFmpeg 既是一款音视频编解码工具&#xff0c;同时也是一组音视频编解码开发套件。 2、准备工作 系统&#xff1a;LinuxNDK&#xff1a;android-ndk-r21b-linux-x86_64.zipFFmpeg&#xff1a;ffmpeg-snapshot.tar.bz2x264&#xff1a;x264 3、下载NDK 在linux环境中…

触摸按键控制LED灯

目录 1.理论 2.代码 2.1 touch_ctrl_led.v 2.2 tb_touch_ctrl_led 1.理论 以上的波形图的touch_flag是采用组合逻辑的方式产生的。 以上的touch_flag是采用时序逻辑产生的&#xff0c;时序逻辑会延迟一拍。 以上是上升沿和下降沿的组合逻辑和时序逻辑实现&#xff0c;逻辑或…

Spring Boot - 利用Resilience4j-Circuitbreaker实现断路器模式_防止级联故障

文章目录 PreResilience4j概述Resilience4j官方地址Resilience4j-Circuitbreaker应用场景微服务演示Address servicePOMModelRepositoryServiceControllerData InitProperties测试 Order serviceModelRepositoryServiceSet UpProperties测试 探究断路器调用order-service API 2…

spring boot学习第八篇:kafka监听消费

为了实现监听器功能 pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

.NetCore Flurl.Http 4.0.0 以上管理客户端

参考原文地址&#xff1a;Managing Clients - Flurl 管理客户端 Flurl.Http 构建在堆栈之上System.Net.Http。如果您熟悉HttpClient&#xff0c;那么您可能听说过这个建议&#xff1a;不要为每个请求创建一个新客户端&#xff1b;重复使用它们&#xff0c;否则将面临后…

navigateTo失效-跳转不了页面解决办法!uniapp\vue

改了一个小时多的错误&#xff0c;跳转页面无论怎么样都跳转不了&#xff0c;有2个问题&#xff1a; 注意&#xff1a;uniapp的报错可以在console里检查&#xff01; 1.pages.json文件没有配置路径&#xff0c; 在pages:[ ]里面加 &#xff08;根据自己的路径进行修改 {&qu…