C++从入门到精通 第十七章(终极案例)

 写在前面:

  1. 本系列专栏主要介绍C++的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程,笔者的原创部分主要在示例代码的注释部分。
  2. 除了参考下面的链接教程以外,笔者还参考了其它的一些C++教材(比如计算机二级教材和C语言教材),笔者认为重要的部分大多都会用粗体标注(未被标注出的部分可能全是重点,可根据相关部分的示例代码量和注释量判断,或者根据实际经验判断)。
  3. 如有错漏欢迎指出。

参考教程:黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili

一、通讯录管理系统

1、系统需求

(1)通讯录管理系统中需要实现的功能如下:

①添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人。

②显示联系人:显示通讯录中所有联系人信息。

③删除联系人:按照姓名进行删除指定联系人。

④查找联系人:按照姓名查看指定联系人信息。

⑤修改联系人:按照姓名重新修改指定联系人。

⑥清空联系人:清空通讯录中所有信息。

⑦退出通讯录:退出当前使用的通讯录。

(2)菜单界面效果如下图:

2、参考代码

#include<iostream>
using namespace std;
#include<string>
#define MAX 1000

//封装函数显示菜单界面
void showMenu()
{
	cout << "***************************" << endl;
	cout << "*****  1、添加联系人  *****" << endl;
	cout << "*****  2、显示联系人  *****" << endl;
	cout << "*****  3、删除联系人  *****" << endl;
	cout << "*****  4、查找联系人  *****" << endl;
	cout << "*****  5、修改联系人  *****" << endl;
	cout << "*****  6、清空联系人  *****" << endl;
	cout << "*****  0、退出通讯录  *****" << endl;
	cout << "***************************" << endl;
}
//设计联系人结构体
struct Person
{
	string m_name;  //姓名
	int m_Sex;      //性别:1-男  2-女
	int m_Age;      //年龄
	string m_Phone; //电话号码
	string m_Addr;  //地址
};
//设计通讯录结构体
struct Addressbooks
{
	struct Person personArray[MAX];  //通讯录中保存的联系人数组
	int m_Size;                      //通讯录当前记录联系人个数
};
//添加联系人
void addPerson(struct Addressbooks * abs)
{
	if (abs->m_Size == MAX-1)
	{
		cout << "通讯率已满,无法添加!" << endl;
		return;
	}
	else
	{
		string name;
		cout << "请输入姓名: " << endl;
		cin >> name;
		abs->personArray[abs->m_Size].m_name = name;
		int sex = 0;
		cout << "请输入性别: " << endl;
		cout << "1---男  2---女 " << endl;
		cin >> sex;
		while (true)
		{
			if (sex == 1 || sex == 2)
			{
				abs->personArray[abs->m_Size].m_Sex = sex;
				break;    //输入有效的性别数字,可以成功记录,退出循环,否则重新输入
			}
			else
			{
				cout << "你是不是找茬?好好输!" << endl;
				cin >> sex;
			}
		}
		int age = 0;
		cout << "请输入年龄: " << endl;
		cin >> age;
		abs->personArray[abs->m_Size].m_Age = age;
		string number;
		cout << "请输入联系电话: " << endl;
		cin >> number;
		abs->personArray[abs->m_Size].m_Phone = number;
		string address;
		cout << "请输入家庭住址: " << endl;
		cin >> address;
		abs->personArray[abs->m_Size].m_Addr = address;
		(abs->m_Size)++;     //更新通讯录人数
		cout << "添加成功" << endl;
		system("pause");  //请按任意键继续
		system("cls");    //清屏操作
	}
}
//显示所有联系人
void showPreson(Addressbooks * abs)
{
	if ((abs->m_Size) == 0)
	{
		cout << "通讯录没有联系人" << endl;
	}
	else
	{
		for (int i = 0; i < abs->m_Size; i++)
		{
			cout << "姓名:" << abs->personArray[i].m_name << "\t";
			cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
			cout << "年龄:" << abs->personArray[i].m_Age << "\t";
			cout << "电话:" << abs->personArray[i].m_Phone << "\t";
			cout << "家庭住址:" << abs->personArray[i].m_Addr << endl;
		}
	}
	system("pause");  //请按任意键继续
	system("cls");    //清屏操作
}
//检测(判断)联系人是否存在
int isExist(Addressbooks * abs,string name)
{
	for (int i = 0; i < abs->m_Size; i++)
	{
		if (abs->personArray[i].m_name == name)  //如果找到用户输入的姓名
		{
			return i;        //把用户在通讯录的位置返回去
		}
	}
	return -1;       //找不到该用户,返回-1
}
//删除联系人
void deletePreson(Addressbooks * abs)
{
	cout << "请输入删除联系人姓名:" << endl;
	string name;
	cin >> name;
	if (isExist(abs, name) == -1)     //先查这个人在不在
	{
		cout << "查无此人,删不了" << endl;
	}
	else              //要删人,直接把这个人后面的人的数据往前移一格,覆盖这个人的数据
	{
		for (int i = isExist(abs, name); i < abs->m_Size; i++)
		{
			abs->personArray[i] = abs->personArray[i + 1];
		}
		abs->m_Size--;    //更新通讯录中的人员数
		cout << "删除成功" << endl;
	}
	system("pause");  //请按任意键继续
	system("cls");    //清屏操作
}
//查找联系人
void findPerson(Addressbooks * abs)
{
	cout << "请输入您要查找的联系人:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret == -1)     //先查这个人在不在
	{
		cout << "查无此人" << endl;
	}
	else
	{
		cout << "姓名:" << abs->personArray[ret].m_name << "\t";
		cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
		cout << "年龄:" << abs->personArray[ret].m_Age << "\t";
		cout << "电话:" << abs->personArray[ret].m_Phone << "\t";
		cout << "家庭住址:" << abs->personArray[ret].m_Addr << endl;
	}
	system("pause");  //请按任意键继续
	system("cls");    //清屏操作
}
//修改联系人
void modifyPerson(Addressbooks * abs)
{
	cout << "请输入您要修改的联系人:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs, name);
	if (ret == -1)     //先查这个人在不在
	{
		cout << "查无此人" << endl;
	}
	else
	{
		cout << "请输入修改后的姓名:" << endl;
		cin >> abs->personArray[ret].m_name;
		cout << "请输入修改后的性别(1--男,2--女):" << endl;
		int sex = 0;
		while (true)
		{
			cin >> sex;
			if (sex == 1 || sex == 2)
			{
				abs->personArray[ret].m_Sex = sex;
				break;
			}
			else
			{
				cout << "你输入了无效数字,重输!" << endl;
			}
		}
		cout << "请输入修改后的年龄:" << endl;
		cin >> abs->personArray[ret].m_Age ;
		cout << "请输入修改后的电话号码:" << endl;
		cin >> abs->personArray[ret].m_Phone ;
		cout << "请输入修改后的家庭住址:" << endl;
		cin >> abs->personArray[ret].m_Addr ;
		cout << "修改成功了捏" << endl;
	}
	system("pause");  //请按任意键继续
	system("cls");    //清屏操作
}
//清空联系人
void cleanPerson(Addressbooks * abs)
{
	abs->m_Size = 0;    //把当前记录联系人数量置零,做逻辑清空操作
	//上面的函数全都需要m_Size参与,一旦这个值为0,很多语句都不会执行
	cout << "通讯录已清空" << endl;
	system("pause");  //请按任意键继续
	system("cls");    //清屏操作
}

int main(){

	int select = 0;  //创建用户选择输入的变量
	Addressbooks abs;//创建通讯录结构体变量
	abs.m_Size = 0;  //初始化通讯录中当前人员个数

	showMenu();    //菜单调用
	while (true)
	{
		cin >> select;
		switch (select)
		{
		case 1:
			addPerson(&abs);   //利用地址传递,可以修饰实参
			break;  //添加联系人
		case 2:
			showPreson(&abs);
			break;  //显示联系人
		case 3:
		    deletePreson(&abs);
			break;  //删除联系人
		case 4:
			findPerson(&abs);
			break;  //查找联系人
		case 5:
			modifyPerson(&abs);
			break;  //修改联系人
		case 6:
			cleanPerson(&abs) ;
			break;  //清空联系人
		case 0:
		{
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
		}
			break;  //退出通讯录
		default:break;
		}
		showMenu();       //清屏后重新显示菜单
	}
}

二、职工管理系统

1、系统需求

(1)公司中职工分为普通员工、经理、老板三类,显示信息时需要显示职工编号、职工姓名、职工岗位、以及职责。

(2)管理系统中需要实现的功能如下:

①退出管理程序:退出当前管理系统.

②增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号、姓名、部门编号。

③显示职工信息:显示公司内部所有职工的信息。

④删除离职职工:按照编号删除指定的职工。

⑤修改职工信息:按照编号修改职工个人信息。

⑥查找职工信息:按照职工的编号或者职工的姓名进行查找相关的人员信息。

⑦按照编号排序:按照职工编号,进行排序,排序规则由用户指定。

⑧清空所有文档:清空文件中记录的所有职工信息 (清空前需要再次确认,防止误删)。

(3)系统界面效果图如下:

2、参考代码

(1)职工管理系统.cpp

#include<iostream>
using namespace std;
#include"workerManager.h"
#include"worker.h"
#include"employee.h"
#include"boss.h"
#include"manager.h"

void test01()
{
	Worker *w1 = NULL;
	w1 = new Employee(1, "张三", 1);
	w1->showInof();
	delete w1;
	Worker *w2 = NULL;
	w2 = new Manager(2, "李四", 2);
	w2->showInof();
	delete w2;
	Worker *w3 = NULL;
	w3 = new Boss(3, "王五", 3);
	w3->showInof();
	delete w3;
}

int main()
{
	/*test01();
	return 0;*/
	WorkerManager wm;
	int choice = 0;
	while (true)
	{
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0:      //退出系统
			wm.exitSystem();
			break;
		case 1:      //增加职工
			wm.Add_Emp();
			break;
		case 2:      //显示职工
			wm.Show_Emp();
			break;
		case 3:      //删除职工
			wm.Del_Emp();
			break;
		case 4:      //修改职工
			wm.Mod_Emp();
			break;
		case 5:      //查找职工
			wm.Find_Emp();
			break;
		case 6:      //职工排序
			wm.Sort_Emp();
			break;
		case 7:      //清空文档
			wm.Clean_File();
			break;
		default:
		{
			cout << "你是不是不想干了?重输!" << endl;
			system("pause");
			system("cls");
			break;
		}
		}
	}

	system("pause");

	return 0;
}

(2)workermanager.cpp

#include"workerManager.h"
#include<string>

WorkerManager::WorkerManager()
{
	ifstream ifs;                 //如果文件不存在
	ifs.open(FILENAME, ios::in);  //读文件
	if (!ifs.is_open())         
	{
		//cout << "文件不存在!" << endl;
		m_EmpNum = 0;           //初始化人数
		m_EmpArray = NULL;      //初始化数组指针
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}
	char ch;                    //如果文件为空
	ifs >> ch;
	if (ifs.eof())              
	{
		//cout << "文件为空!" << endl;
		m_EmpNum = 0;           //初始化人数
		m_EmpArray = NULL;      //初始化数组指针
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}
	int num = this->get_EmpNum();
	//cout << "职工人数为: " << num << endl;
	this->m_EmpNum = num;
	this->m_EmpArray = new Worker*[this->m_EmpNum];  //开辟空间
	this->init_Emp();                            //将文件中的数据存到数组中
}
int WorkerManager::get_EmpNum()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);  //打开文件,读它

	int id;
	string name;
	int dId;

	int num = 0;
	while (ifs >> id && ifs >> name && ifs >> dId)
	{
		num++;    //统计人数的变量
	}
	return num;
}
WorkerManager::~WorkerManager()
{
	if (this->m_EmpArray != NULL)
	{
		delete[]this->m_EmpArray;
		this->m_EmpArray = NULL;
	}
}
void WorkerManager::Show_Menu()
{
	cout << "********************************************" << endl;
	cout << "*********  欢迎使用职工管理系统! **********" << endl;
	cout << "*************  0.退出管理程序  *************" << endl;
	cout << "*************  1.增加职工信息  *************" << endl;
	cout << "*************  2.显示职工信息  *************" << endl;
	cout << "*************  3.删除离职职工  *************" << endl;
	cout << "*************  4.修改职工信息  *************" << endl;
	cout << "*************  5.查找职工信息  *************" << endl;
	cout << "*************  6.按照编号排序  *************" << endl;
	cout << "*************  7.清空所有文档  *************" << endl;
	cout << "********************************************" << endl;
	cout << endl;
}
void WorkerManager::exitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);            //退出系统
}
void WorkerManager::Add_Emp()
{
	cout << "请输入需要增加职工的数量: ";
	int AddNum = 0;
	cin >> AddNum;
	if (AddNum > 0)
	{
		int newSize = this->m_EmpNum + AddNum;      //计算新空间的大小
		Worker ** newSpace = new Worker*[newSize];  //开辟新空间
		if (this->m_EmpArray != NULL)               //将原空间下的内容存放到新空间下
		{
			for (int i = 0; i < m_EmpNum; i++)
			{
				newSpace[i] = m_EmpArray[i];
			}
		}
		for (int i = 0; i < AddNum; i++)            //输入新数据
		{
			int id;
			string name;
			int dSelect;
			cout << "请输入第" << i + 1 << "个新职工的编号: ";
			bool pass = true;
			while (true)
			{
				cin >> id;
				for (int i = 0; i < m_EmpNum; i++)
				{
					if (m_EmpArray[i]->m_Id == id)
					{
						cout << "该编号已存在,请核实输入是否有误!" << endl;
						cout << "重新输入: ";
						pass = false;
						break;
					}
				}
				if (pass)
				{
					break;
				}
			}
			cout << "请输入第" << i + 1 << "个新职工的姓名: ";
			cin >> name;
			cout << "请选择第" << i + 1 << "个新职工的岗位: " << endl
				<< "1、普通职工" << endl
				<< "2、经理" << endl
				<< "3、老板" << endl;
			cin >> dSelect;
			Worker * worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, 1);
				break;
			case 2:
				worker = new Manager(id, name, 2);
				break;
			case 3:
				worker = new Boss(id, name, 3);
				break;
			default:
				break;
			}
			newSpace[m_EmpNum + i] = worker;
		}
		delete[]this->m_EmpArray;     //释放原有空间
		this->m_EmpArray = newSpace;  //更新新空间的指向
		m_EmpNum = newSize;           //更新新的个数
		cout << "添加成功了嗷" << endl; 
		this->m_FileIsEmpty = false;  //更新职工不为空的标志
		save();
	}
	else
	{
		cout << "你是不是想扣工资?" << endl;
	}
	system("pause");
	system("cls");
}
void WorkerManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);
	for (int i = 0; i < this->m_EmpNum; i++)
	{
		ofs << this->m_EmpArray[i]->m_Id << "  "
			<< this->m_EmpArray[i]->m_Name << "  "
			<< this->m_EmpArray[i]->m_Deptid << endl;
	}
	ofs.close();
}
void WorkerManager::init_Emp()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	
	int id;
	string name;
	int dId;

	int index = 0;
	while (ifs >> id && ifs >> name && ifs >> dId)
	{
		Worker * worker = NULL;
		switch (dId)
		{
		case 1:
			worker = new Employee(id, name, dId);
			break;
		case 2:
			worker = new Manager(id, name, dId);
			break;
		case 3:
			worker = new Boss(id, name, dId);
			break;
		default:
			break;
		}
		this->m_EmpArray[index] = worker;
		index++;
	}
	ifs.close();
}
void WorkerManager::Show_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < m_EmpNum; i++)    //利用多态调用函数接口
		{
			this->m_EmpArray[i]->showInof();
		}
	}
	system("pause");
	system("cls");
}
int WorkerManager::IsExist(int id)
{
	int index = -1;
	for (int i = 0; i < m_EmpNum; i++)
	{
		if (m_EmpArray[i]->m_Id == id)
		{
			index = i;
			break;
		}
	}
	return index;
}
void WorkerManager::Del_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		int id = 0;
		cout << "请输入需要删除职工的编号: " << endl;
		cin >> id;
		int id0 = IsExist(id);
		if (id0 == -1)
		{
			cout << "没找到该编号对应的员工,请核实是否输入正确" << endl;
		}
		else
		{
			cout << "您确定要删除吗?" << endl;
			cout << "姓名: " << m_EmpArray[id0]->m_Name;
			switch (m_EmpArray[id0]->m_Deptid)
			{
			case 1:
				cout << "  职位:普通员工" << endl;
				break;
			case 2:
				cout << "  职位:经理" << endl;
				break;
			case 3:
				cout << "  职位:老板" << endl;
				break;
			default:
				break;
			}
			int select = 0;
			cout << "输入1即删除,输入其它数则将直接回到主界面" << endl;
			cin >> select;
			if (select == 1)
			{
				for (int i = id0; i < m_EmpNum - 1; i++)
				{
					m_EmpArray[i] = m_EmpArray[i + 1];
				}
				m_EmpNum--;   //更新数组中记录的人员个数
				save();       //数据同步更新到文件中
			}
		}
	}
	system("pause");
	system("cls");
}
void WorkerManager::Mod_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		int id = 0;
		cout << "请输入需要修改职工的编号: " << endl;
		cin >> id;
		int id0 = IsExist(id);
		if (id0 == -1)
		{
			cout << "没找到该编号对应的员工,请核实是否输入正确" << endl;
		}
		else
		{
			int newId = 0;
			string newName = "";
			int dSelect = 0;
			cout << "查到" << id << "号职工的姓名为" << m_EmpArray[id0]->m_Name;
			switch (m_EmpArray[id0]->m_Deptid)
			{
			case 1:
				cout << "  职位:普通员工" << endl;
				break;
			case 2:
				cout << "  职位:经理" << endl;
				break;
			case 3:
				cout << "  职位:老板" << endl;
				break;
			default:
				break;
			}
			cout << "请输入新职工号(如果不是更改这项,输入原来的即可,下同理): " << endl;
			cin >> newId;
			cout << "请输入新姓名: " << endl;
			cin >> newName;
			cout << "请输入新岗位相应的编号: " << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			cin >> dSelect;
			Worker * worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(newId, newName, 1);
				break;
			case 2:
				worker = new Manager(newId, newName, 2);
				break;
			case 3:
				worker = new Boss(newId, newName, 3);
				break;
			default:
				break;
			}
			this->m_EmpArray[id0] = worker;
			cout << "修改成功了嗷" << endl;
			save();
		}
	}
	system("pause");
	system("cls");
}
void WorkerManager::Find_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		int select = 0;
		cout << "按照职工编号查找请输入1: " << endl;
		cout << "按照职工姓名查找请输入2: " << endl;
		cout << "筛选相应岗位的所有员工请输入3: " << endl;
		cin >> select;
		if (select == 1)
		{
			cout << "输入需要查找的职工编号:";
			int id = 0;
			int j1 = 0;
			cin >> id;
			for (int i = 0; i < m_EmpNum; i++)
			{
				if (m_EmpArray[i]->m_Id == id)
				{
					m_EmpArray[i]->showInof();
					break;
				}
				j1++;
			}
			if (j1 == m_EmpNum)
			{
				cout << "查无此人" << endl;
			}
		}
		else if (select == 2)
		{
			cout << "输入需要查找的职工姓名:";
			string name;
			cin >> name;
			int j2 = 0;
			for (int i = 0; i < m_EmpNum; i++)
			{
				if (m_EmpArray[i]->m_Name == name)
				{
					m_EmpArray[i]->showInof();
					j2++;
				}
			}
			if (j2 == 0)
			{
				cout << "查无此人" << endl;
			}
		}
		else if (select == 3)
		{
			cout << "请输入筛选目标岗位相应的编号: " << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			int slt = 0;
			cin >> slt;
			switch (slt)
			{
			case 1:
			{
				for (int i = 0; i < m_EmpNum; i++)
				{
					if (m_EmpArray[i]->m_Deptid == 1)
					{
						m_EmpArray[i]->showInof();
					}
				}
				break;
			}
			case 2:
			{
				for (int i = 0; i < m_EmpNum; i++)
				{
					if (m_EmpArray[i]->m_Deptid == 2)
					{
						m_EmpArray[i]->showInof();
					}
				}
				break;
			}
			case 3:
			{
				for (int i = 0; i < m_EmpNum; i++)
				{
					if (m_EmpArray[i]->m_Deptid == 3)
					{
						m_EmpArray[i]->showInof();
					}
				}
				break;
			}
			default:
				cout << "你输入了无效编号,再见" << endl;
				break;
			}
		}
		else
		{
			cout << "666666666666666666,6死了" << endl;
		}
	}
	system("pause");
	system("cls");
}
void WorkerManager::Sort_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		cout << "按照编号进行升序排序请扣1,按照编号进行降序排序请扣2,不要乱扣哦";
		int select;
		cin >> select;
		if (select == 1)
		{
			for (int i = 0; i < m_EmpNum-1; i++)
			{
				for (int j = 0; j < m_EmpNum - i - 1; j++)
				{
					if (m_EmpArray[j]->m_Id > m_EmpArray[j + 1]->m_Id)
					{
						Worker * temp = m_EmpArray[j + 1];
						m_EmpArray[j + 1] = m_EmpArray[j];
						m_EmpArray[j] = temp;
					}
				}
			}
		}
		else if (select == 2)
		{
			for (int i = 0; i < m_EmpNum - 1; i++)
			{
				for (int j = 0; j < m_EmpNum - i - 1; j++)
				{
					if (m_EmpArray[j]->m_Id < m_EmpArray[j + 1]->m_Id)
					{
						Worker * temp2 = m_EmpArray[j + 1];
						m_EmpArray[j + 1] = m_EmpArray[j];
						m_EmpArray[j] = temp2;
					}
				}
			}
		}
		else
		{
			cout << "建议你回炉重造" << endl;
		}
	}
	save();
	Show_Emp();
}
void WorkerManager::Clean_File()
{
	cout << "你确定要清空全部数据?输入1就不能后悔了哦!不想删除就随便输入一个其它数。" << endl;
	int select = 0;
	cin >> select;
	if (select == 1)
	{
		ofstream ofs(FILENAME, ios::trunc);   //清空文件(删除文件后重新创建)
		ofs.close();                          //关闭文件
		if (this->m_EmpArray != NULL)
		{
			for (int i = 0; i < m_EmpNum; i++)
			{
				delete this->m_EmpArray[i];
				this->m_EmpArray[i] = NULL;
			}
			delete[] this->m_EmpArray;
			m_EmpArray = NULL;
			m_EmpNum = 0;
			m_FileIsEmpty = true;
		}
		cout << "清空成功!" << endl;
	}
	system("pause");
	system("cls");
}

(3)manager.cpp

#include"manager.h"
#include<string>

void Manager::showInof()
{
	cout << "编号: " << m_Id
		<< "\t姓名:" << m_Name
		<< "\t岗位:" << this->getDeptname()
		<< "\t岗位职责: " << "完成老板交代的任务,并下发任务给普通员工" << endl;
}
string Manager::getDeptname()
{
	return string("经理");
}
Manager::Manager(int id, string name, int did)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_Deptid = did;
}

(4)employee.cpp

#include"employee.h"
#include<string>

void Employee::showInof()
{
	cout << "编号: " << m_Id
		<< "\t姓名:" << m_Name
		<< "\t岗位:" << this->getDeptname()
		<< "\t岗位职责: " << "完成经理交代的任务" << endl;
}
string Employee::getDeptname()
{
	return string("普通员工");
}
Employee::Employee(int id, string name, int did)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_Deptid = did;
}

(5)boss.cpp

#include"boss.h"
#include<string>

void Boss::showInof()
{
	cout << "编号: " << m_Id
		<< "\t姓名:" << m_Name
		<< "\t岗位:" << this->getDeptname()
		<< "\t岗位职责: " << "管理公司所有事物" << endl;
}
string Boss::getDeptname()
{
	return string("老板");
}
Boss::Boss(int id, string name, int did)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_Deptid = did;
}

(6)workerManager.h

#pragma once
#include<iostream>
using namespace std;
#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"

#include<fstream>
#define FILENAME "empFile.txt"

class WorkerManager
{
public:
	WorkerManager();
	void Show_Menu();
	void exitSystem();
	~WorkerManager();
	int m_EmpNum;           //记录文件中的人数个数
	Worker ** m_EmpArray;   //员工数组的指针
	void Add_Emp();         //增加职工---
	void save();            //把数据写入文件
	bool m_FileIsEmpty;     //判断文件是否为空的标志
	int get_EmpNum();       //统计文件中的人数
	void init_Emp();        //初始化职工
	void Show_Emp();        //显示职工---
	void Del_Emp();         //删除职工---
	int IsExist(int id);    //判断职工是否存在
	void Mod_Emp();         //修改职工---
	void Find_Emp();        //查找职工---
	void Sort_Emp();        //职工排序---
	void Clean_File();      //清空数据---
};

(7)worker.h

#pragma once
#include<iostream>
using namespace std;
#include<string>

class Worker
{
public:
	int m_Id;
	string m_Name;
	int m_Deptid;
	virtual void showInof() = 0;
	virtual string getDeptname() = 0;
};

(8)manager.h

#pragma once
#include<iostream>
using namespace std;
#include"worker.h"

class Manager :public Worker
{
public:
	Manager(int id, string name, int did);
	void showInof();
	string getDeptname();
};

(9)employee.h

#pragma once
#include<iostream>
using namespace std;
#include"worker.h"

class Employee :public Worker
{
public:
	Employee(int id,string name,int did);
	void showInof();
	string getDeptname();
};

(10)boss.h

#pragma once
#include<iostream>
using namespace std;
#include"worker.h"

class Boss :public Worker
{
public:
	Boss(int id, string name, int did);
	void showInof();
	string getDeptname();
};

三、演讲比赛流程管理系统

1、系统需求

(1)比赛规则和流程:

①学校举行一场演讲比赛,共有12个人参加。

②比赛共两轮,第一轮为淘汰赛,第二轮为决赛。

③比赛方式:分组比赛,每组6个人,选手每次要随机分组,进行比赛。

④每名选手都有对应的编号,如 10001 ~ 10012。

⑤第一轮分为两个小组,每组6个人,按照选手编号进行抽签后顺序演讲。

⑥当小组演讲完后,根据评分淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。

⑦第二轮为决赛,得分前三名的胜出。

⑧每轮比赛过后需要显示晋级选手的信息。

(2)程序功能:

①开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段。

②查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csv后缀名保存。

③清空比赛记录:将文件中数据清空。

④退出比赛程序:可以退出当前程序。

(3)程序效果图:

2、参考代码

(1)main.cpp

#include<iostream>
using namespace std;
#include"speechManager.h"
#include<ctime>

int main()
{
	srand((unsigned)time(NULL));
	speechManager m;
	/*for (map<int, Speaker>::iterator it = m.m_Speaker.begin(); it != m.m_Speaker.end(); it++)
	{
		cout << "选手编号:" << it->first
			<< " 姓名: " << it->second.m_Name
			<< " 成绩: " << it->second.m_Score[0] << endl;
	}*/
	int choice = 0;
	while (true)
	{
		m.show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 1:    //开始比赛
			m.startSpeech();
			break;
		case 2:    //查看记录
			m.showRecord();
			break;
		case 3:    //清空记录
			m.clearRecord();
			break;
		case 0:    //退出程序
			m.Exitsystem();
			break;
		default:
			system("cls");
			break;
		}
	}

	system("pause");

	return 0;
}

(2)speaker.h

#pragma once
#include<iostream>
#include<string>
using namespace std;

class Speaker
{
public:

	double m_Score[2];   //可能有两轮得分
	string m_Name;       //姓名

};

(3)speechManager.h

#pragma once
#include<iostream>
#include<vector>
#include<map>
#include<deque>
#include<algorithm>
#include<numeric>
#include<fstream>
#include<string>
#include"speaker.h"
using namespace std;

class speechManager
{
public:
	speechManager();   //构造函数

	~speechManager();  //析构函数

	void show_Menu();  //菜单显示
	void Exitsystem(); //退出系统***

	vector<int>v1;     //所有选手的容器12人
	vector<int>v2;     //第一轮晋级容器6人
	vector<int>vVictory;   //前三名容器3人
	map<int, Speaker>m_Speaker;   //存放编号以及对应选手的容器
	int m_Index;       //比赛轮数
	bool fileIsEmpty;  //判断文件是否为空标志
	map<int, vector<string>>m_Record;   //存放往届记录的容器

	void init_Speech();  //初始化属性
	void createSpeaker(); //创建选手
	void startSpeech();   //开始比赛***
	void speechDraw();    //抽签
	void speechContest(); //比赛
	void showScore();     //显示结果
	void saveRecord();    //保存记录
	void loadRecord();    //读取记录
	void showRecord();    //查看记录***
	void clearRecord();   //清空记录***
};

(4)speechManager.cpp

#include"speechManager.h"
#include<algorithm>

speechManager::speechManager()
{
	init_Speech();
	createSpeaker();
	loadRecord();
}

speechManager::~speechManager()
{

}

void speechManager::show_Menu()
{
	cout << "********************************************" << endl;
	cout << "*************  欢迎参加演讲比赛 ************" << endl;
	cout << "*************  1.开始演讲比赛  *************" << endl;
	cout << "*************  2.查看往届记录  *************" << endl;
	cout << "*************  3.清空比赛记录  *************" << endl;
	cout << "*************  0.退出比赛程序  *************" << endl;
	cout << "********************************************" << endl;
	cout << endl;
}

void speechManager::Exitsystem()
{
	cout << "欢迎下次使用~" << endl;
	system("pause");
	exit(0);
}

void speechManager::init_Speech()
{
	this->m_Index = 1;            //初始化比赛轮数
	this->v1.clear();             //容器保证为空
	this->v2.clear();
	this->vVictory.clear();
	this->m_Speaker.clear();
	this->m_Record.clear();
}

void speechManager::createSpeaker()
{
	string nameSeed = "ABCDEFGHIJKL";
	for (int i = 0; i < 12; i++)
	{
		string name = "选手";
		name += nameSeed[i];
		Speaker speaker;
		speaker.m_Name = name;
		speaker.m_Score[0] = 0;
		v1.push_back(10001 + i);
		m_Speaker.insert(make_pair(i + 10001, speaker));
	}
}

void speechManager::speechDraw()
{
	cout << "第" << m_Index << "轮选手抽签:" << endl;
	cout << "-------------------------------" << endl;
	cout << "抽签后演讲顺序如下:" << endl;
	if (m_Index == 1)
	{
		random_shuffle(v1.begin(), v1.end());
		for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
		{
			cout << *it << " ";
		}
		cout << endl;
	}
	if (m_Index == 2)
	{
		random_shuffle(v2.begin(), v2.end());
		for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)
		{
			cout << *it << " ";
		}
		cout << endl;
	}
	cout << "----------------------------------" << endl;
	system("pause");
	cout << endl;
}
void speechManager::speechContest()
{
	cout << "第" << m_Index << "轮比赛开始:" << endl;
	cout << "-------------------------------" << endl;
	multimap<double, int, greater<int>> groupScore;
	int num = 0;
	vector<int>v_Src;

	if (m_Index == 1)
	{
		v_Src = v1;
	}
	if (m_Index == 2)
	{
		v_Src = v2;
	}
	
	for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++)
	{
		num++;
		deque<double>sc;
		for (int i = 0; i < 10; i++)   //十个评委打分
		{
			double cc = (rand() % 400 + 600) / 10.f;
			//cout << cc << " ";
			sc.push_back(cc);
		}
		sort(sc.begin(),sc.end(),greater<double>());
		sc.pop_back();   //去除最低分
		sc.pop_front();  //去除最高分
		double avg = accumulate(sc.begin(), sc.end(), 0.0f) / (double)sc.size();
	    //cout << "编号: " << *it  << " 选手: " << this->m_Speaker[*it].m_Name << " 获取平均分为: " << avg << endl;  //打印分数
		groupScore.insert(make_pair(avg, *it));
		//m_Speaker[*it]  中括号内为key值,不是简单的数组下标
		this->m_Speaker[*it].m_Score[this->m_Index - 1] = avg;
		
		if (num % 6 == 0)
		{
			int i = 0;
			cout << "第" << num / 6 << "小组比赛名次:" << endl;
			for (multimap<double, int, greater<int>>::iterator it2 = groupScore.begin(); it2 != groupScore.end(); it2++, i++) 
			{
				cout << "编号:" << it2->second << "  姓名:" << m_Speaker[it2->second].m_Name
					<< "  成绩:" << m_Speaker[it2->second].m_Score[m_Index - 1] << endl;
				
				if (m_Index == 1 && i < 3) 
				{
					v2.push_back(it2->second);
				}
				if (m_Index == 2 && i < 3)
				{
					vVictory.push_back(it2->second);
				}
			}
			groupScore.clear();
		}
	}
	cout << "------------- 第" << this->m_Index << "轮比赛完毕  ------------- " << endl;
	system("pause");
}
void speechManager::showScore()
{
	cout << "-------第" << m_Index << "轮晋级选手信息如下-------" << endl;
	vector<int>v_Src;
	if (m_Index == 1)
	{
		v_Src = v2;
	}
	if (m_Index == 2)
	{
		v_Src = vVictory;
	}
	for (vector<int>::iterator it = v_Src.begin(); it != v_Src.end(); it++)
	{
		cout << "选手编号:" << *it << "  姓名:" << m_Speaker[*it].m_Name 
			<< "  得分:" << m_Speaker[*it].m_Score[m_Index - 1] << endl;
	}
	system("pause");
	system("cls");
	this->show_Menu();
}
void speechManager::saveRecord()
{
	ofstream ofs;
	ofs.open("speech.csv", ios::out | ios::app);  //用追加的方式写文件
	for (vector<int>::iterator it = vVictory.begin(); it != vVictory.end(); it++)
	{
		ofs << *it << "," << this->m_Speaker[*it].m_Score[1] << ",";
	}
	ofs << endl;
	ofs.close();
	cout << "记录成功保存" << endl;
}

void speechManager::startSpeech()
{
	speechDraw();
	speechContest();
	showScore();
	m_Index++;
	speechDraw();
	speechContest();
	showScore();
	saveRecord();
	init_Speech();
	createSpeaker();
	loadRecord();

	cout << "本届比赛完毕" << endl;
	this->fileIsEmpty = false;
	system("pause");
	system("cls");
}

void speechManager::loadRecord()
{
	ifstream ifs("speech.csv", ios::in);
	//没有文件情况
	if (!ifs.is_open())
	{
		//cout<< "文件不存在" << endl;
		this->fileIsEmpty = true;
		ifs.close();
		return;
	}
	//文件清空清空
	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
		//cout << "文件为空" << endl;
		this->fileIsEmpty = true;
		ifs.close();
		return;
	}
	this->fileIsEmpty = false;
	ifs.putback(ch);   //将上面读取的单个字符放回
	
	int index = 0;
	string data;
	while (ifs >> data)
	{
		//cout << data << endl;
		vector<string>v;
		int pos = -1;   //查逗号位置的变量(写文件时数据用逗号分隔了)
		int start = 0;
		while (true)
		{
			pos = data.find(",", start);
			if (pos == -1)
			{
				break;
			}
			string temp = data.substr(start, pos - start);
			//cout << temp << endl;
			v.push_back(temp);
			start = pos + 1;
		}
		this->m_Record.insert(make_pair(index, v));
		index++;
	}
	ifs.close();
}
void speechManager::showRecord()
{
	if (this->fileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else 
	{
		for (int index = 0; index < this->m_Record.size(); index++)
		{
			cout << "第" << index + 1 << "届  冠军编号:" << m_Record[index][0] << " 得分:" << m_Record[index][1]
				<< " 亚军编号:" << m_Record[index][2] << " 得分:" << m_Record[index][3]
				<< " 季军编号:" << m_Record[index][4] << " 得分:" << m_Record[index][5] << endl;
		}
	}
	system("pause");
	system("cls");
}

void speechManager::clearRecord()
{
	cout << "确认清空?" << endl;
	cout << "1、确认" << endl;
	cout << "2、返回" << endl;

	int select = 0;
	cin >> select;

	if (select == 1)
	{
		//打开模式 ios::trunc 如果存在删除文件并重新创建
		ofstream ofs("speech.csv", ios::trunc);
		ofs.close();

		//初始化属性
		this->init_Speech();

		//创建选手
		this->createSpeaker();

		//获取往届记录
		this->loadRecord();

		cout << "清空成功!" << endl;
	}
	system("pause");
	system("cls");
}

四、机房预约系统

1、系统需求

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

(2)分别有三种身份使用该程序:

①学生代表:申请使用机房。

②教师:审核学生的预约申请。

③管理员:给学生、教师创建账号。

(3)机房总共有3间:

①1号机房最多允许20人同时使用。

②2号机房最多允许50人同时使用。

③3号机房最多允许100人同时使用。

(4)申请的订单每周由管理员负责清空;学生可以预约未来一周内的机房使用,预约的日期为周一至周五,预约时需要选择预约时段(上午、下午);教师来审核预约,依据实际情况审核预约通过或者不通过。

(5)系统具体需求:

①首先进入登录界面,可选登录身份有:学生代表、老师、管理员(、退出)。

②每个身份都需要进行验证后才能进入子菜单:

[1]学生需要输入:学号、姓名、登录密码。

[2]老师需要输入:职工号、姓名、登录密码。

[3]管理员需要输入:管理员姓名、登录密码。

③学生具体功能:

[1]申请预约——预约机房。

[2]查看自身的预约——查看自己的预约状态。

[3]查看所有预约——查看全部预约信息以及预约状态。

[4]取消预约——取消自身的预约,预约成功或审核中的预约均可取消。

[5]注销登录——退出登录。

④教师具体功能:

[1]查看所有预约——查看全部预约信息以及预约状态。

[2]审核预约——对学生的预约进行审核。

[3]注销登录——退出登录.

⑤管理员具体功能:

[1]添加账号——添加学生或教师的账号,需要检测学生编号或教师职工号是否重复。

[2]查看账号——可以选择查看学生或教师的全部信息。

[3]查看机房——查看所有机房的信息。

[4]清空预约——清空所有预约记录。

[5]注销登录——退出登录。

2、参考代码

(1)main.cpp

#include<iostream>
#include<string>
#include<fstream>
#include<numeric>
using namespace std;
#include"Identity.h"
#include"globalFile.h"
#include"manager.h"
#include"student.h"
#include"teacher.h"

void managerMenu(Identity * &manager)
{
	
	while (true)
	{
		Manager * man = (Manager *)manager;
		manager->opermenu();
		int choice = 0;
		cin >> choice;
		switch (choice)
		{
		case 1:    //添加账号
		{
			cout << "添加账号" << endl;
			man->addPerson();
			break;
		}
		case 2:    //查看账号
		{
			cout << "查看账号" << endl;
			man->showPerson();
			break;
		}
		case 3:    //查看机房
		{
			cout << "查看机房" << endl;
			man->showComputer();
			break;
		}
		case 4:    //清空预约
		{
			cout << "清空预约" << endl;
			man->cleanFile();
			break;
		}
		case 0:    //注销登录
		{
			delete manager;
			cout << "注销成功" << endl;
			system("pause");
			system("cls");
			return;
			break;
		}
		default:
		{
			cout << "输入无效数字,请重输" << endl;
			system("pause");
			system("cls");
			break;
		}
		}
	}
}
void studentMenu(Identity * &student)
{
	while (true)
	{
		Student * man = (Student *)student;
		student->opermenu();
		int choice = 0;
		cin >> choice;
		switch (choice)
		{
		case 1:    //申请预约
		{
			cout << "申请预约" << endl;
			man->applyOrder();
			break;
		}
		case 2:    //查看我的预约
		{
			cout << "查看我的预约" << endl;
			man->showMyOrder();
			break;
		}
		case 3:    //查看所有预约
		{
			cout << "查看所有预约" << endl;
			man->showALLOrder();
			break;
		}
		case 4:    //取消预约
		{
			cout << "取消预约" << endl;
			man->cancelOrder();
			break;
		}
		case 0:    //注销登录
		{
			delete student;
			cout << "注销成功" << endl;
			system("pause");
			system("cls");
			return;
			break;
		}
		default:
		{
			cout << "输入无效数字,请重输" << endl;
			system("pause");
			system("cls");
			break;
		}
		}
	}
}
void teacherMenu(Identity * &teacher)
{
	while (true)
	{
		Teacher * man = (Teacher *)teacher;
		teacher->opermenu();
		int choice = 0;
		cin >> choice;
		switch (choice)
		{
		case 1:    //查看所有预约
		{
			cout << "查看所有预约" << endl;
			man->showALLOrder();
			break;
		}
		case 2:    //审核预约
		{
			cout << "查看我的预约" << endl;
			man->validOrder();
			break;
		}
		case 0:    //注销登录
		{
			delete teacher;
			cout << "注销成功" << endl;
			system("pause");
			system("cls");
			return;
			break;
		}
		default:
		{
			cout << "输入无效数字,请重输" << endl;
			system("pause");
			system("cls");
			break;
		}
		}
	}
}

void LoginTn(string fileName, int type)
{
	Identity * person = NULL;
	ifstream ifs;
	ifs.open(fileName, ios::in);
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		ifs.close();
		return;
	}
	string name;
	string password;
	int id;

	if (type == 1)
	{
		cout << "请输入您的学生学号:";
		cin >> id;
	}
	if (type == 2)
	{
		cout << "请输入您的教师工号:";
		cin >> id;
	}
	cout << "请输入您的账号(姓名):";
	cin >> name;
	cout << "请输入您的账号密码:";
	cin >> password;
	int ID;
	string PASSWORD;
	string NAME;
	if (type == 1)
	{
		while (ifs >> ID && ifs >> NAME && ifs >> PASSWORD)
		{
			if (ID == id && NAME == name && PASSWORD == password)
			{
				cout << "学生验证登录成功" << endl;

				system("pause");
				system("cls");
				person = new Student(id, name, password);  //创建学生对象
				studentMenu(person);  //进入学生代表子菜单
				return;
			}
		}
	}
	else if (type == 2)
	{
		while (ifs >> ID && ifs >> NAME && ifs >> PASSWORD)
		{
			if (ID == id && NAME == name && PASSWORD == password)
			{
				cout << "教师验证登录成功" << endl;

				system("pause");
				system("cls");
				person = new Teacher(id, name, password);  //创建教师对象
				teacherMenu(person);  //进入教师子菜单
				return;
			}
		}
	}
	else if (type == 3)
	{
		while (ifs >> NAME && ifs >> PASSWORD)
		{
			if (NAME == name && PASSWORD == password)
			{
				cout << "管理员验证登录成功" << endl;

				system("pause");
				system("cls");
				person = new Manager(name, password);  //创建管理员对象
				managerMenu(person);  //进入管理员子菜单
				return;
			}
		}
	}
	cout << "验证登录失败!" << endl;

	system("pause");
	system("cls");
	return;
}

int main()
{
	while (true)
	{
		cout << "======================  欢迎来到传智播客机房预约系统  ====================="
			<< endl;
		cout << endl << "请输入您的身份" << endl;
		cout << "\t\t -------------------------------\n";
		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|          0.退    出           |\n";
		cout << "\t\t|                               |\n";
		cout << "\t\t -------------------------------\n";
		cout << "输入您的选择: ";

		int select = 0;
		cin >> select;

		switch (select)
		{
		case 1:     //学生代表
			LoginTn(STUDENT_FILE, 1);
			break;
		case 2:     //老师
			LoginTn(TEACHER_FILE, 2);
			break;
		case 3:     //管理员
			LoginTn(ADMIN_FILE, 3);
			break;
		case 0:     //退出
		{
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		}
		default:
		{
			cout << "输入有误,请重新输入" << endl;
			system("pause");
			system("cls");
			break;
		}
		}
	}

	system("pause");

	return 0;
}

(2)manager.cpp

#include"manager.h"
#include"computerRoom.h"
#include<algorithm>
#include<numeric>

Manager::Manager()
{

}
Manager::Manager(string name, string pwd)    //有参构造
{
	this->m_Name = name;
	this->m_Pwd = pwd;
	initVector();
	initComputerRoom();
}

void Manager::opermenu()    //菜单界面
{
	cout << "欢迎管理员:" << this->m_Name << "登录!" << endl;
	cout << "\t\t ---------------------------------\n";
	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 ---------------------------------\n";
	cout << "请选择您的操作: " << endl;
}
void Manager::addPerson()           //添加账号
{
	cout << "请输入添加账号的类型:" << endl << "1、添加学生" << endl 
		<< "2、添加老师" << endl;

	string fileName;
	ofstream ofs;
	string tip;
	string errortip;
	int select = 0;
	while (true)
	{
		cin >> select;
		if (select == 1)
		{
			fileName = STUDENT_FILE;
			tip = "请输入学生学号:";
			errortip = "该学生已有账号!";
			break;
		}
		if (select == 2)
		{
			fileName = TEACHER_FILE;
			tip = "请输入职工编号:";
			errortip = "该职工已有账号!";
			break;
		}
		cout << "输入无效数字,请重新输入" << endl;
	}
	ofs.open(fileName, ios::out);
	int id;
	string name;
	string password;

	cout << tip;
	cin >> id;
	bool ret = checkRepeat(id, select);
	if (!ret)
	{
		cout << errortip << endl;
	}
	else
	{
		cout << "请输入姓名:";
		cin >> name;
		cout << "请输入密码:";
		cin >> password;
		ofs << id << " " << name << " " << password << endl;
		cout << "添加成功!" << endl;
	}
	system("pause");
	system("cls");
	ofs.close();
	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.open(TEACHER_FILE, ios::in);
	if (!ifs.is_open())
	{
		cout << "读取文件失败" << endl;
		return;
	}
	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();
}
bool Manager::checkRepeat(int id, int type)
{
	if (type == 1)
	{
		vector<Student>::iterator it = vStu.begin();
		for (; it != vStu.end(); it++)
		{
			if (it->m_Id == id)
			{
				break;
			}
		}
		if (it == vStu.end())
		{
			return true;
		}
	}
	else if (type == 2)
	{
		vector<Teacher>::iterator it = vTea.begin();
		for (; it != vTea.end(); it++)
		{
			if (it->m_EmpId == id)
			{
				break;
			}
		}
		if (it == vTea.end())
		{
			return true;
		}
	}
	return false;
}
void Manager::showPerson()          //查看账号
{
	cout << "请选择查看内容:" << endl << "1、查看所有学生" << endl
		<< "2、查看所有老师" << endl;

	int select = 0;
	while (true)
	{
		cin >> select;
		if (select == 1)
		{
			for (vector<Student>::iterator it = vStu.begin(); it != vStu.end(); it++)
			{
				cout << "学号:" << it->m_Id << "  姓名:" 
					<< it->m_Name << "  密码:" << it->m_Pwd << endl;
			}
			system("pause");
			system("cls");
			break;
		}
		if (select == 2)
		{
			for (vector<Teacher>::iterator it = vTea.begin(); it != vTea.end(); it++)
			{
				cout << "职工号:" << it->m_EmpId << "  姓名:"
					<< it->m_Name << "  密码:" << it->m_Pwd << endl;
			}
			system("pause");
			system("cls");
			break;
		}
		cout << "输入无效数字,请重新输入" << endl;
	}
}

void Manager::showComputer()        //查看机房信息
{
	cout << "机房信息如下:" << endl;
	for (vector<ComputerRoom>::iterator it = vCom.begin(); it != vCom.end(); it++)
	{
		cout << "机房编号:" << it->m_ComId << "  机房最大容量:" << it->m_MaxNum << endl;
	}
	system("pause");
	system("cls");
}
void Manager::cleanFile()           //清空预约记录
{
	ofstream ofs(ORDER_FILE, ios::trunc);
	ofs.close();
	cout << "清空成功!" << endl;
	system("pause");
	system("cls");
}
void Manager::initComputerRoom()
{
	vCom.clear();
	ifstream ifs;
	ifs.open(COMPUTER_FILE, ios::in);
	int id;
	int maxnum;
	while (ifs >> id && ifs >> maxnum)
	{
		ComputerRoom com;
		com.m_ComId = id;
		com.m_MaxNum = maxnum;
		vCom.push_back(com);
	}
	ifs.close();
}

(3)orderFile.cpp

#include"orderFile.h"

OrderFile::OrderFile()
{
	ifstream ifs(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)
	{
		string 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());
			m.insert(make_pair(key, value));
		}
		pos = interval.find(":");
		if (pos != -1)
		{
			key = interval.substr(0, pos);
			value = interval.substr(pos + 1, interval.size());
			m.insert(make_pair(key, value));
		}
		pos = stuId.find(":");
		if (pos != -1)
		{
			key = stuId.substr(0, pos);
			value = stuId.substr(pos + 1, stuId.size());
			m.insert(make_pair(key, value));
		}
		pos = stuName.find(":");
		if (pos != -1)
		{
			key = stuName.substr(0, pos);
			value = stuName.substr(pos + 1, stuName.size());
			m.insert(make_pair(key, value));
		}
		pos = roomId.find(":");
		if (pos != -1)
		{
			key = roomId.substr(0, pos);
			value = roomId.substr(pos + 1, roomId.size());
			m.insert(make_pair(key, value));
		}
		pos = status.find(":");
		if (pos != -1)
		{
			key = status.substr(0, pos);
			value = status.substr(pos + 1, status.size());
			m.insert(make_pair(key, value));
		}
		m_orderData.insert(make_pair(m_Size,m));
		m_Size++;
	}
	ifs.close();
}

void OrderFile::updateOrder()
{
	if (this->m_Size == 0)
	{
		return;
	}
	ofstream ofs(ORDER_FILE, ios::out | ios::trunc);
	for (int i = 0; i < m_Size; i++)
	{
		ofs << "date:" << this->m_orderData[i]["date"] << " ";
		ofs << "interval:" << this->m_orderData[i]["interval"] << " ";
		ofs << "stuId:" << this->m_orderData[i]["stuId"] << " ";
		ofs << "stuName:" << this->m_orderData[i]["stuName"] << " ";
		ofs << "roomId:" << this->m_orderData[i]["roomId"] << " ";
		ofs << "status:" << this->m_orderData[i]["status"] << endl;
	}
	ofs.close();
}

(4)student.cpp

#include"student.h"

Student::Student()
{

}
Student::Student(int id, string name, string pwd)  //有参构造
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_Pwd = pwd;
	ifstream ifs (COMPUTER_FILE, ios::in);
	ComputerRoom com;
	while (ifs >> com.m_ComId&&ifs >> com.m_MaxNum)
	{
		vCom.push_back(com);
	}
	ifs.close();
}

void Student::opermenu()  //菜单界面
{
	cout << "欢迎学生代表:" << this->m_Name << "登录!" << endl;
	cout << "\t\t ----------------------------------\n";
	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 ----------------------------------\n";
	cout << "请选择您的操作: " << endl;
}
void Student::applyOrder()        //申请预约
{
	cout << "机房开放时间为周一至周五!" << endl;
	cout << "请输入申请预约的时间:(输入对应数字编号!)" << endl;
	cout << "1、周一" << endl << "2、周二" << endl 
		<< "3、周三" << endl << "4、周四" << endl << "5、周五" << endl;
	int choice = 0;
	while (true)
	{
		cin >> choice;
		if (choice == 1 || choice == 2 || choice == 3 || choice == 4 || choice == 5)
		{
			break;
		}
		cout << "你输入了无效数字,请重新输入" << endl;
	}
	cout << "请输入申请预约的时间段:(输入对应数字编号!)" << endl;
	cout << "1、上午" << endl << "2、下午" << endl;
	int choice2 = 0;
	while (true)
	{
		cin >> choice2;
		if (choice2 == 1 || choice2 == 2)
		{
			break;
		}
		cout << "你输入了无效数字,请重新输入" << endl;
	}
	cout << "请选择机房:(输入对应数字编号!)" << endl;
	cout << "1、一号机房容量:" << vCom[0].m_MaxNum << endl;
	cout << "2、二号机房容量:" << vCom[1].m_MaxNum << endl;
	cout << "3、三号机房容量:" << vCom[2].m_MaxNum << endl;
	int choice3 = 0;
	while (true)
	{
		cin >> choice3;
		if (choice3 == 1 || choice3 == 2 || choice == 3)
		{
			break;
		}
		cout << "你输入了无效数字,请重新输入" << endl;
	}
	cout << "预约成功!请耐心等待审核……" << endl;
	ofstream ofs;
	ofs.open(ORDER_FILE, ios::app);
	ofs << "date:" << choice << " ";            //日期
	ofs << "interval:" << choice2 << " ";       //时间段
	ofs << "stuId:" << this->m_Id << " ";       //学生编号
	ofs << "stuName:" << this->m_Name << " ";   //学生姓名
	ofs << "roomId:" << choice3 << " ";         //预约机房号
	ofs << "status:" << 1 << endl;              //预约状态
	ofs.close();

	system("pause");
	system("cls");
}
void Student::showMyOrder()       //查看我的预约
{
	OrderFile of;
	if (of.m_Size == 0)
	{
		cout << "无预约记录" << endl;
		system("pause");
		system("cls");
		return;
	}
	int i = 0;
	for (; i < of.m_Size; i++)
	{
		if (atoi(of.m_orderData[i]["stuId"].c_str()) == this->m_Id)
		{
			cout << "预约日期:周" << of.m_orderData[i]["date"] << "  时段:" 
				<< (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午") << "  机房:";
			cout << of.m_orderData[i]["roomId"] << "  状态:";
			if (atoi(of.m_orderData[i]["status"].c_str()) == 1)
			{
				cout << "审核中" << endl;
			}
			if (atoi(of.m_orderData[i]["status"].c_str()) == 2)
			{
				cout << "已预约" << endl;
			}
			if (atoi(of.m_orderData[i]["status"].c_str()) == -1)
			{
				cout << "预约失败" << endl;
			}
			if (atoi(of.m_orderData[i]["status"].c_str()) == 0)
			{
				cout << "取消的预约" << endl;
			}
		}
	}
	system("pause");
	system("cls");
}
void Student::showALLOrder()      //查看所有预约
{
	OrderFile of;
	if (of.m_Size == 0)
	{
		cout << "无预约记录" << endl;
		system("pause");
		system("cls");
		return;
	}
	for (int i = 0; i < of.m_Size; i++)
	{
		cout << i + 1 << "、";
		cout << "预约日期:周" << of.m_orderData[i]["date"] << "  时段:"
			<< (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午") << "  机房:";
		cout << of.m_orderData[i]["roomId"] << "  状态:";
		if (atoi(of.m_orderData[i]["status"].c_str()) == 1)
		{
			cout << "审核中" << endl;
		}
		if (atoi(of.m_orderData[i]["status"].c_str()) == 2)
		{
			cout << "已预约" << endl;
		}
		if (atoi(of.m_orderData[i]["status"].c_str()) == -1)
		{
			cout << "预约失败" << endl;
		}
		if (atoi(of.m_orderData[i]["status"].c_str()) == 0)
		{
			cout << "取消的预约" << endl;
		}
	}
	system("pause");
	system("cls");
}
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 (atoi(of.m_orderData[i]["stuId"].c_str()) == this->m_Id&&
			(atoi(of.m_orderData[i]["status"].c_str()) == 1|| atoi(of.m_orderData[i]["status"].c_str()) == 2))
		{
			v.push_back(i);
			cout << index++ << "、";
			cout << "预约日期:周" << of.m_orderData[i]["date"] << "  时段:"
				<< (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午") << "  机房:";
			cout << of.m_orderData[i]["roomId"] << "  状态:";
			if (atoi(of.m_orderData[i]["status"].c_str()) == 1)
			{
				cout << "审核中" << endl;
			}
			if (atoi(of.m_orderData[i]["status"].c_str()) == 2)
			{
				cout << "已预约" << endl;
			}
		}
	}
	int select = 0;
	cout << "请输入需要取消的记录,0代表返回" << endl;
	
	while (true)
	{
		cin >> select;
		if (select == 0)
		{
			system("pause");
			system("cls");
			return;
		}
		else
		{
			of.m_orderData[v[select - 1]]["status"] = "0";
			break;
		}
		cout << "输入有误,请重新输入" << endl;
	}
	cout << "已取消预约" << endl;

	of.updateOrder();
	system("pause");
	system("cls");
}

(5)teacher.cpp

#include"teacher.h"

Teacher::Teacher()
{

}
Teacher::Teacher(int empid, string name, string pwd)    //有参构造
{
	this->m_EmpId = empid;
	this->m_Name = name;
	this->m_Pwd = pwd;
}

void Teacher::opermenu()   //菜单界面
{
	cout << "欢迎教师:" << this->m_Name << "登录!" << endl;
	cout << "\t\t ----------------------------------\n";
	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|          0.注销登录              |\n";
	cout << "\t\t|                                  |\n";
	cout << "\t\t ----------------------------------\n";
	cout << "请选择您的操作: " << endl;
}
void Teacher::showALLOrder()       //查看所有预约
{
	OrderFile of;
	if (of.m_Size == 0)
	{
		cout << "无预约记录" << endl;
		system("pause");
		system("cls");
		return;
	}
	for (int i = 0; i < of.m_Size; i++)
	{
		cout << i + 1 << "、";
		cout << "预约日期:周" << of.m_orderData[i]["date"] << "  时段:"
			<< (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午") << "  机房:";
		cout << of.m_orderData[i]["roomId"] << "  状态:";
		if (atoi(of.m_orderData[i]["status"].c_str()) == 1)
		{
			cout << "审核中" << endl;
		}
		if (atoi(of.m_orderData[i]["status"].c_str()) == 2)
		{
			cout << "已预约" << endl;
		}
		if (atoi(of.m_orderData[i]["status"].c_str()) == -1)
		{
			cout << "预约失败" << endl;
		}
		if (atoi(of.m_orderData[i]["status"].c_str()) == 0)
		{
			cout << "取消的预约" << endl;
		}
	}
	system("pause");
	system("cls");
}
void Teacher::validOrder()         //审核预约
{
	OrderFile of;
	
	cout << "待审核的预约记录如下:" << endl;
	int index = 1;
	vector<int>v;
	for (int i = 0; i < of.m_Size; i++)
	{
		if (atoi(of.m_orderData[i]["status"].c_str()) == 1)
		{
			cout << index++ << "、";
			cout << "预约日期:周" << of.m_orderData[i]["date"] << "  时段:"
				<< (of.m_orderData[i]["interval"] == "1" ? "上午" : "下午") << "  机房:";
			cout << of.m_orderData[i]["roomId"] << "  状态:审核中" << endl;
			v.push_back(i);
		}
	}
	if (index == 1)
	{
		cout << "无需要审核的预约记录" << endl;
		system("pause");
		system("cls");
		return;
	}
	cout << "请输入审核的预约记录,0代表返回" << endl;
	int choice = 0;
	while (true)
	{
		cin >> choice;
		if (choice == 0)
		{
			system("pause");
			system("cls");
			return;
		}
		if (choice < index&&choice>0)
		{
			break;
		}
		cout << "你输入了无效数字,请重新输入" << endl;
	}
	cout << "1、通过" << endl << "2、不通过" << endl;
	int select = 0;
	while (true)
	{
		cin >> select;
		if (select == 0)
		{
			break;
		}
		if (select == 1)
		{
			of.m_orderData[v[choice - 1]]["status"] = "2";
			cout << "审核完毕!" << endl;
			break;
		}
		if (select == 2)
		{
			of.m_orderData[v[choice - 1]]["status"] = "-1";
			cout << "审核完毕!" << endl;
			break;
		}
		cout << "你输入了无效数字,请重新输入" << endl;
	}
	of.updateOrder();
	system("pause");
	system("cls");
}

(6)computerRoom.h

#pragma once
#include<iostream>
using namespace std;

class ComputerRoom
{
public:
	int m_ComId;   //机房id号
	int m_MaxNum;  //机房最大容量
};

(7)globalFile.h

#pragma once

//管理员文件
#define ADMIN_FILE     "admin.txt"
//学生文件
#define STUDENT_FILE   "student.txt"
//教师文件
#define TEACHER_FILE   "teacher.txt"
//机房信息文件
#define COMPUTER_FILE  "computerRoom.txt"
//订单文件
#define ORDER_FILE     "order.txt"

(8)Identity.h

#pragma once
#include<iostream>
#include<string>
using namespace std;

class Identity     //身份抽象类
{
public:
	string m_Name;    //用户名
	string m_Pwd;     //密码

	virtual void opermenu() = 0;  //操作菜单

};

(9)manager.h

#pragma once
#include<iostream>
#include<string>
#include<fstream>
#include<vector>
#include"Identity.h"
#include"globalFile.h"
#include"student.h"
#include"teacher.h"
#include"computerRoom.h"
#include<algorithm>
using namespace std;

class Manager :public Identity
{
public:
	Manager();
	Manager(string name, string pwd);    //有参构造

	virtual void opermenu();    //菜单界面
	void addPerson();           //添加账号
	void showPerson();          //查看账号
	void showComputer();        //查看机房信息
	void cleanFile();           //清空预约记录

	//初始化容器
	void initVector();

	//学生容器
	vector<Student> vStu;

	//教师容器
	vector<Teacher> vTea;

	//检测重复 参数:(传入id,传入类型) 返回值:(true 代表有重复,false代表没有重复)
	bool checkRepeat(int id, int type);

	//机房容器
	vector<ComputerRoom> vCom;
	void initComputerRoom();    //初始化机房信息
};

(10)orderFile.h

#pragma once
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
#include <map>
#include "globalFile.h"

class OrderFile
{
public:

	//构造函数
	OrderFile();

	//更新预约记录
	void updateOrder();

	//记录的容器  key --- 记录的条数  value --- 具体记录的键值对信息
	map<int, map<string, string>> m_orderData;

	//预约记录条数
	int m_Size;
};

(11)student.h

#pragma once
#include<iostream>
#include<string>
#include"Identity.h"
#include"globalFile.h"
#include"computerRoom.h"
#include"orderFile.h"
#include<fstream>
#include<vector>
using namespace std;

class Student :public Identity
{
public:
	Student();
	Student(int id, string name, string pwd);  //有参构造

	virtual void opermenu();  //菜单界面
	void applyOrder();        //申请预约
	void showMyOrder();       //查看我的预约
	void showALLOrder();      //查看所有预约
	void cancelOrder();       //取消预约

	int m_Id;   //学生学号
	//机房容器
	vector<ComputerRoom> vCom;
};

(12)teacher.h

#pragma once
#include<iostream>
#include<string>
#include<vector>
#include"orderFile.h"
#include"Identity.h"
#include"globalFile.h"
using namespace std;

class Teacher :public Identity
{
public:
	Teacher();
	Teacher(int empid, string name, string pwd);    //有参构造

	virtual void opermenu();   //菜单界面
	void showALLOrder();       //查看所有预约
	void validOrder();         //审核预约
	
	int m_EmpId;   //教师工号
};

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

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

相关文章

SD-WAN如何降低运维成本、简化运维工作?

在当今数字化浪潮中&#xff0c;企业对网络的需求愈发迫切&#xff0c;要求网络在安全性、可靠性和灵活性方面都能够得到保障。然而&#xff0c;随着企业上云和远程办公等需求的不断增加&#xff0c;传统的WAN网络已经难以满足企业的多样化需求&#xff0c;所需的运维成本也越来…

数据结构之链表经典算法QJ题目

目录 单链表经典算法题目1. 单链表相关经典算法OJ题&#xff1a;移除链表元素思路一&#xff1a;思路二&#xff1a; 2. 单链表相关经典算法QI题&#xff1a;链表的中间节点思路一思路二 3. 单链表相关经典算法QJ题&#xff1a;反转链表思路一思路二 4. 单链表相关经典算法QJ题…

微信小程序 ---- 慕尚花坊 项目初始化

目录 项目介绍 01. 项目概述 02. 项目演示 03. 项目技术栈 04. 接口文档 申请开发权限 项目初始化 01. 创建项目与项目初始化 02. 自定义构建 npm 集成Sass 03. 集成项目页面文件 04. VsCode 开发小程序项目 项目介绍 01. 项目概述 [慕尚花坊] 是一款 同城鲜花订购…

文心一言 VS 讯飞星火 VS chatgpt (199)-- 算法导论15.2 1题

一、用go语言&#xff0c;对矩阵规模序列(5&#xff0c;10&#xff0c;3&#xff0c;12&#xff0c;5&#xff0c;50&#xff0c;6)&#xff0c;求矩阵链最优括号化方案。 文心一言&#xff0c;代码正常运行&#xff1a; 在Go语言中&#xff0c;为了找到矩阵链乘法的最优括号…

【鸿蒙 HarmonyOS 4.0】TypeScript开发语言

一、背景 HarmonyOS 应用的主要开发语言是 ArkTS&#xff0c;它由 TypeScript&#xff08;简称TS&#xff09;扩展而来&#xff0c;在继承TypeScript语法的基础上进行了一系列优化&#xff0c;使开发者能够以更简洁、更自然的方式开发应用。值得注意的是&#xff0c;TypeScrip…

普中51单片机学习(串口通信)

串口通信 原理 计算机通信是将计算机技术和通信技术的相结合&#xff0c;完成计算机与外部设备或计算机与计算机之间的信息交换 。可以分为两大类&#xff1a;并行通信与串行通信。并行通信通常是将数据字节的各位用多条数据线同时进行传送 。控制简单、传输速度快&#xff1…

QT-Day3

思维导图 作业 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码…

minium-小程序自动化测试框架

提起 UI 自动化测试&#xff0c;web 端常用 Selenium&#xff0c;手机端常用 Appium&#xff0c;那么很火的微信小程序可以用什么工具来进行自动化测试&#xff1f;本篇将介绍一款专门用于微信小程序的自动化测试工具 - minium。 简介 minium 是为小程序专门开发的自动化框架…

职业技能鉴定服务中心前端静态页面(官网+证书查询)

有个朋友想做职业技能培训&#xff0c;会发证书&#xff0c;证书可以在自己网站可查。想做一个这样的网站&#xff0c;而且要特别土&#xff0c;一眼看上去像xxx官方网站&#xff0c;像jsp .net技术开发的网站。用htmlcssjquery还原了这样子一个前端页面&#xff0c;这里分享给…

字节一面 : post为什么会发送两次请求?

同源策略 在浏览器中&#xff0c;内容是很开放的&#xff0c;任何资源都可以接入其中&#xff0c;如 JavaScript 文件、图片、音频、视频等资源&#xff0c;甚至可以下载其他站点的可执行文件。 但也不是说浏览器就是完全自由的&#xff0c;如果不加以控制&#xff0c;就会出…

【JVM】五种对象引用

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;JVM ⛺️稳中求进&#xff0c;晒太阳 几种常见的对象引用 可达性算法中描述的对象引用&#xff0c;一般指的是强引用&#xff0c;即是GCRoot对象对普通对象有引用关系&#xff0c;只要这层…

C++ 基础算法 双指针 数组元素的目标和

给定两个升序排序的有序数组 A 和 B &#xff0c;以及一个目标值 x 。 数组下标从 0 开始。 请你求出满足 A[i]B[j]x 的数对 (i,j) 。 数据保证有唯一解。 输入格式 第一行包含三个整数 n,m,x &#xff0c;分别表示 A 的长度&#xff0c;B 的长度以及目标值 x 。 第二行包…

游戏配置二级缓存一致性问题解决方案

游戏服务器进程在启动的时候&#xff0c;一般会把所有策划配置数据加载到内存里&#xff0c;将主键以及对应的记录存放在一个HashMap容器里&#xff0c;这称为一级缓存。部分功能可能还需要缓存其他数据&#xff0c;这些称为二级缓存。举个例子&#xff0c;对于如下的玩家升级表…

【嵌入式学习】QT-Day3-Qt基础

1> 思维导图 https://lingjun.life/wiki/EmbeddedNote/20QT 2> 完善登录界面 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后…

代码随想录算法训练营第22天|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

235.二叉搜索树的最近公共祖先 思路:这题可以利用二叉搜索树的特性能更明确的去左右方向找pq。所以什么遍历顺序都可以。 如果pq的值都小于root值,说明pq一定在左子树,去左子树遍历。 如果pq的值都大于root值,则在右子树。 排除以上两种情况,最后一种情况就是pq分别在root左…

金蝶云星空使用插件打开单据列表

文章目录 金蝶云星空使用插件打开单据列表核心代码操作测试 金蝶云星空使用插件打开单据列表 核心代码 表单插件-按钮点击事件 ListShowParameter showParam new ListShowParameter();showParam.IsLookUp false;//是否查找数据showParam.OpenStyle.ShowType ShowType.Moda…

【SQL注入】靶场SQLI DUMB SERIES-24通过二次注入重置用户密码

先使用已知信息admin/admin登录进去查下题&#xff0c;发现可以修改密码 猜测可能存在的SQL语句&#xff1a;UPDATE user SET password新密码 WHERE user用户名 and password旧密码 假设我们知道有个admin用户&#xff0c;但是不知道其密码&#xff0c;如何可以将其密码重置&…

费舍尔FISHER金属探测器探测仪维修F70

美国FISHER LABS费舍尔地下金属探测器&#xff0c;金属探测仪等维修&#xff08;考古探金银铜探宝等仪器&#xff09;。 费舍尔F70视听目标ID金属探测器&#xff0c;Fisher 金属探测器公司成立于1931年&#xff0c;在实验条件很艰苦的情况下&#xff0c;研发出了地下金属探测器…

Elasticsearch Update By Query详解

1. 使用场景 一般在以下几种情况时&#xff0c;我们需要重建索引&#xff1a; 索引的 Mappings 发生变更&#xff1a;字段类型更改&#xff0c;分词器及字典更新 索引的 Setting 发生变更&#xff1a;索引的主分片数发生改变 集群内&#xff0c;集群间需要做数据迁移 Elastiic…

【AIGC】基于深度学习的图像生成与增强技术

摘要&#xff1a; 本论文探讨基于深度学习的图像生成与增强技术在图像处理和计算机视觉领域的应用。我们综合分析了主流的深度学习模型&#xff0c;特别是生成对抗网络&#xff08;GAN&#xff09;和变分自编码器&#xff08;VAE&#xff09;等&#xff0c;并就它们在实际应用中…
最新文章