银行管理系统

使用Python实现银行管理系统 在本篇博文中,我们将使用Python编写一个简单的银行管理系统,该系统具有开户、查询、取款、存款、转账、锁定、解锁、存盘和退出等功能。我们将逐步分析每个功能,并提供相应的代码实现。 阅读详情

cpp 版

职员管理系统

  1. 查询职员信息:

    • 按工号或姓名查找职员的详细信息,包括工号、姓名、性别、年龄和密码。
  2. 入职:

    • 添加新职员到系统,录入信息包括工号、姓名、性别、年龄和密码。
    • 检查工号是否已存在,防止重复入职。
  3. 离职:

    • 根据工号和密码删除指定职员。
    • 验证密码,确保离职操作的安全性。
  4. 修改职员信息:

    • 修改指定职员的密码,提高系统安全性。
  5. 显示所有职员信息:

    • 展示所有职员的详细信息列表。
  6. 保存职员信息:

    • 将职员信息保存至指定文件,以便数据持久化。

客户管理系统

  1. 查询账户信息:

    • 通过账号、开户人姓名或开户日期查询客户账户信息。
  2. 开户:

    • 为客户创建新账户,录入信息包括账号、姓名、性别、密码、金额、开户日期和开户状态。
    • 检查账号是否已存在,防止重复开户。
  3. 销户:

    • 根据账号和密码删除指定账户。
    • 验证密码,确保销户操作的安全性。
  4. 修改账户密码:

    • 修改指定账户的密码,提高账户安全性。
  5. 账户排序:

    • 提供多种排序方式,包括按账号、姓名、金额或开户日期排序。
  6. 存款:

    • 向指定账户添加金额,更新账户余额。
  7. 取款:

    • 从指定账户扣除金额,需检查账户余额是否充足。
  8. 转账:

    • 在两个账户之间转移金额,包括同银行和跨银行转账。
    • 计算并扣除转账手续费。
  9. 计算利息:

    • 根据存款期限和类型(活期或定期)计算利息。
  10. 保存账户信息:

    • 将账户信息保存至指定文件,以便数据持久化。
  11. 显示所有账户信息:

    • 展示所有客户的账户详细信息列表。

排队管理系统

  1. VIP放号:

    • 为客户放号并进入VIP队列,提升重要客户的服务体验。
  2. Normal放号:

    • 为客户放号并进入普通队列。
  3. VIP队首完成服务:

    • 完成当前VIP客户的服务,并提示下一号,提高服务效率。
  4. Normal队首完成服务:

    • 完成当前普通客户的服务,并提示下一号。
  5. 展示目前得分情况:

    • 展示当前服务人员的服务质量得分,包括服务客户数和平均得分。

网点查询系统

  1. 学校网点介绍:

    • 提供学校内各银行网点的详细介绍。
  2. 游览网点路线:

    • 提供游览银行网点的最佳路线,方便用户访问。
  3. 查询网点间最短路径:

    • 使用迪杰斯特拉算法查询两个网点间的最短路径。
  4. 查询网点信息:

    • 查询特定网点的详细信息,如位置、服务内容等。
  5. 更改图的信息:

    • 对网点间的关系图进行修改,包括增加或删除网点和边。
  6. 查询景点间可行路径:

    • 查询两个景点间所有可能的路径。
  7. 打印邻接矩阵:

    • 打印网点关系图的邻接矩阵,用于分析和调试。
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <string>
#include <fstream>
#include <vector>
#include <windows.h>
#include <queue>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

// 定义客户结构体
struct Banker
{
	string account_num; // 银行账户
	string name;		// 银行卡持有人姓名
	string sex;			// 银行卡持有人性别
	int password;		// 银行卡密码
	long long money;	// 银行卡金额
	int open_time;		// 开户日期
	string states;		// 开户状态
	string type;		// 客户类型
	Banker *next;
};
// 使用typedef时,这样定义更清晰,先定义结构体,再用typedef取别名
typedef Banker *BankList;

// 定义职员结构体
struct Staff
{
	string Number; // 工号
	string name;   // 姓名
	string sex;	   // 性别
	int age;	   // 年龄
	int password;  // 密码
	double grade;  // 客户所打的平均分
	int n;		   // 总接待人数
	Staff *next;
};
// 同样先定义结构体,再取别名
typedef Staff *StaffList;

// 叫号系统的号 全局变量
queue<int> normalQue;
queue<int> VIPQue;
int normalNum = 1, VIPNum = 1;
int cnt = 0;

// 定义一个较大的数来表示无穷大,用于初始化图的邻接矩阵中表示无边的情况
const int Infinity = 99999;
// 这里建议使用const修饰,使其成为常量,更符合语义

// 图的顶点结构体
typedef struct Vertex
{
	int position;			// 顶点编号
	char name[50];			// 顶点名称
	char introduction[200]; // 顶点简介
} Vertex;

// 图的边结构体,用于表示邻接矩阵中的元素,即边的权值等信息
typedef struct Arc
{
	int adj; // 边的权值,这里假设是表示距离等含义的数值
} ArcType;

// 图的数据结构定义
typedef struct MGraph
{
	int vexnum;			  // 顶点个数
	int arcnum;			  // 边的个数
	Vertex vexs[35];	  // 顶点数组,假设最多有35个顶点,可根据实际情况调整大小
	ArcType arcs[35][35]; // 邻接矩阵,用于存储边的信息,同样假设最多35个顶点
} MGraph;

// 全局变量声明,用于存储路径信息和顶点访问状态
int d[35];
int visited[35];
MGraph campus;
// 函数

void Choice_a_person(); // 选择待操作人员(银行职员/客户)
void Menu1();			// 职员系统主菜单
void InitList1();		// 初始化菜单
void SelectStaff();		// 查询职员信息
void AddStaff();		// 入职
void DeleteStaff();		// 离职
void Revise();			// 修改职员信息
void Readfile1();		// 读入文件
void Save1();			// 保存账户的信息
void Display1();		// 显示所有职员信息
void mytime();			// 时间显示函数

void InitList2();				// 初始化菜单
bool account_num_exist();		// 判断账户是否存在
void SelectAccount();			// 查询账户信息
void Open_an_ccount();			// 开户
void Pin_households();			// 销户
void Modify_account_password(); // 修改账户密码
void Sort_accountInfo();		// 账户排序
void deposit();					// 存款
void withdrawals();				// 取款
void transfer();				// 转账
double cal_year();				// 计算开户时长
void Calculation_interest();	// 利息计算
void Save2();					// 保存账户的信息
void Readfile2();				// 读入文件
void Menu2();					// 客户系统主菜单
void Wait();					// 增强用户交互体验
void Choice_a_file();			// 选择待操作的文件
void Display2();				// 显示所有用户信息

void Menu3();		   // 排队系统菜单
void Menu3_2();		   // 排队系统员工登录界面
void releaseVIP();	   // VIP放号
void releaseNormal();  // Normal放号
void endVIPServe();	   // 结束VIP服务(出队当前 提示下一号)
void endNormalServe(); // 结束Normal服务(出队当前 提示下一号)
void DisplayVIP();	   // 打印VIP队列当前状态
void DisplayNormal();  // 打印Normal队列当前状态
void Grade();		   // 客户为服务打分

void Menu4();			   // 网点系统菜单栏
MGraph initgraph();		   // 对图初始化
int locatevex();		   // 查找景点在图中的序号
void path();			   // 打印路径
int allpath();			   // 打印所有路径
void shortestpath_dij();   // 迪杰斯特拉求最短路径
int creatgragh();		   // 构造图的邻接矩阵
int newgraph();			   // 更新图的信息
int enarc();			   // 增加一条边
int envex();			   // 增加一个点
int delvex();			   // 删除一个点
int delarc();			   // 删除一条边
void printmatrix();		   // 打印邻接矩阵
int changegraph();		   // 图操作的主要调度函数
void shortestpath_floyd(); // Floyd查最短路径
void seeabout();		   // 查询景点信息
void browsecompus();	   // 显示所有顶点信息
void mainwork4();		   // 主要工作函数

// 职员管理系统初始化菜单
void InitList1(StaffList &SL)
{
	SL = new Staff;
	SL->next = NULL;
}

// 客户管理系统初始化菜单
void InitList2(BankList &BL)
{
	BL = new Banker;
	BL->next = NULL;
}

// 判断账户是否存在
bool account_num_exist(BankList &BL, string account_num)
{
	Banker *p = BL->next;
	while (p)
	{
		if (p->account_num == account_num)
			return true;
		p = p->next;
	}
	return false;
}
// 判断员工是否存在
bool staff_num_exist(StaffList &SL, string staff_num)
{
	Staff *p = SL->next;
	while (p)
	{
		if (p->Number == staff_num)
			return true;
		p = p->next;
	}
	return false;
}
// 1、查询职员信息
void SelectStaff(StaffList &SL)
{
	cout << "1:按工号查找 " << endl;
	cout << "2:按员工姓名查找 " << endl;
	string num;	 // 工号
	string name; // 姓名
	int ch;
	Staff *p = SL->next;
	bool isFound = false;
	cin >> ch;
	switch (ch)
	{
	case 1:
	{
		cout << "请输入要查询的工号: ";
		cin >> num;
		while (p)
		{
			if (p->Number == num)
			{
				cout << "工号\t\t" << "姓名\t" << "性别\t" << "年龄\t" << "密码" << endl;
				cout << p->Number << "\t" << p->name << "\t" << p->sex << "\t" << p->age << "\t" << p->password << endl;
				isFound = true;
				break;
			}
			p = p->next;
		}
	}
	break;
	case 2:
	{
		cout << "请输入要查询的姓名: ";
		cin >> name;
		while (p)
		{
			if (p->name == name)
			{
				cout << "工号\t\t" << "姓名\t" << "性别\t" << "年龄\t" << "密码" << endl;
				cout << p->Number << "\t" << p->name << "\t" << p->sex << "\t" << p->age << "\t" << p->password << endl;
				isFound = true;
				break;
			}
			p = p->next;
		}
	}
	break;
	default:
		cout << "输入有误!" << endl;
		break;
	}
	if (!isFound)
		cout << "未查找到!" << endl;
}
// 2、入职
void AddStaff(StaffList &SL)
{
	Staff *p = new Staff;
	p->next = NULL;
	cout << "请输入需要入职的工号:";
	cin >> p->Number;
	if (staff_num_exist(SL, p->Number))
	{
		cout << "入职失败,该员工已存在" << endl;
		return;
	}
	cout << "请输入入职员工的姓名:";
	cin >> p->name;
	cout << "请输入入职员工的性别(男,女):";
	cin >> p->sex;
	cout << "请输入入职员工的年龄:";
	cin >> p->age;
	cout << "请输入员工账户的密码(6位):";
	int password;
	char charPassword[20]; // 用于存储密码字符数组
	int i = 0;
	char ch;
	while ((ch = _getch()) != '\r') // \r是回车键
	{
		if (ch == '\b' && i > 0) // 处理退格键
		{
			cout << "\b \b";
			--i;
		}
		else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
		{
			charPassword[i++] = ch;
			cout << '*';
		}
	}
	charPassword[i] = '\0';		   // 字符串结束标志
	password = atoi(charPassword); // 将字符数组转换为整数
	cout << endl;
	p->password = password;

	Staff *pp = SL;
	while (pp->next)
	{
		pp = pp->next;
	}
	pp->next = p;
	cout << "入职成功!" << endl;
}
// 3、离职
void DeleteStaff(StaffList &SL)
{
	string account_num; // 账户
	int password;		// 密码
	Staff *p = SL;
	cout << "请输入需要离职的员工工号:";
	cin >> account_num;
	if (staff_num_exist(SL, account_num))
	{
		cout << "请输入需要离职的员工的密码:";
		char charPassword[20]; // 用于存储密码字符数组
		int i = 0;
		char ch;
		while ((ch = _getch()) != '\r') // \r是回车键
		{
			if (ch == '\b' && i > 0) // 处理退格键
			{
				cout << "\b \b";
				--i;
			}
			else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
			{
				charPassword[i++] = ch;
				cout << '*';
			}
		}
		charPassword[i] = '\0';		   // 字符串结束标志
		password = atoi(charPassword); // 将字符数组转换为整数
		cout << endl;
		cout << "\n";
		while (p->next != NULL)
		{
			if (p->next->Number == account_num && p->next->password == password)
			{
				cout << "离职成功!" << endl;
				Staff *pt = p->next;
				p->next = pt->next;
				delete pt;
				return;
			}
			p = p->next;
		}
		cout << "\n输入的密码有误!" << endl;
	}
	else
	{
		cout << "此员工不存在!" << endl;
	}
}

// 4、修改职员密码
void Revise(StaffList &SL)
{
	string account_num; // 账户
	int password;		// 密码
	Staff *p = SL->next;
	cout << "请输入需要修改的员工工号:";
	cin >> account_num;
	if (staff_num_exist(SL, account_num))
	{
		cout << "请输入需要修改的员工的密码:";
		char charPassword[20]; // 用于存储密码字符数组
		int i = 0;
		char ch;
		while ((ch = _getch()) != '\r') // \r是回车键
		{
			if (ch == '\b' && i > 0) // 处理退格键
			{
				cout << "\b \b";
				--i;
			}
			else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
			{
				charPassword[i++] = ch;
				cout << '*';
			}
		}
		charPassword[i] = '\0';		   // 字符串结束标志
		password = atoi(charPassword); // 将字符数组转换为整数
		cout << endl;
		cout << "\n";
		while (p != NULL)
		{
			if (p->Number == account_num && p->password == password)
			{
				cout << "请输入新的密码:";
				int password;
				char charPassword[20]; // 用于存储密码字符数组
				int i = 0;
				char ch;
				while ((ch = _getch()) != '\r') // \r是回车键
				{
					if (ch == '\b' && i > 0) // 处理退格键
					{
						cout << "\b \b";
						--i;
					}
					else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
					{
						charPassword[i++] = ch;
						cout << '*';
					}
				}
				charPassword[i] = '\0';		   // 字符串结束标志
				password = atoi(charPassword); // 将字符数组转换为整数
				cout << endl;
				p->password = password;
				cout << "修改成功!" << endl;
				return;
			}
			p = p->next;
		}
		cout << "密码错误!" << endl;
	}
	else
	{
		cout << "此员工不存在!" << endl;
	}
}

// 5、显示所有职员信息
void Display1(StaffList &SL)
{
	if (SL->next == NULL)
	{
		cout << "该职员表为空!" << endl;
	}
	else
	{
		Staff *p = SL->next;
		cout << "工号\t\t" << "姓名\t" << "性别\t" << "年龄\t" << "密码" << endl;
		while (p)
		{
			cout << p->Number << "\t" << p->name << "\t" << p->sex << "\t" << p->age << "\t" << p->password << endl;
			p = p->next;
		}
	}
}
// 6、保存职员信息
void Save1(StaffList &SL, string file)
{
	ofstream ofs;
	ofs.open(file.c_str());
	Staff *p = SL->next;
	while (p)
	{
		ofs << p->Number << "\t" << p->name << "\t" << p->sex << "\t" << p->age << "\t" << p->password << endl;

		p = p->next;
	}
	ofs.close();
	cout << "保存成功!" << endl;
}
// 1、查询账户信息
void SelectAccount(BankList &BL)
{
	cout << "1:按账号查找:" << endl;
	cout << "2:按开户人姓名查找:" << endl;
	cout << "3:按开户日期查找:" << endl;
	string account_num; // 账户
	string name;		// 姓名
	int open_time;		// 开户日期
	int ch;
	Banker *p = BL->next;
	cin >> ch;
	switch (ch)
	{
	case 1:
	{
		cout << "请输入需要查询的账号:";
		cin >> account_num;
		while (p)
		{
			if (p->account_num == account_num)
			{
				cout << "账户\t\t姓名\t性别\t密码\t金额\t\t开户日期\t开户状态" << endl;
				cout << p->account_num << "\t" << p->name << "\t" << p->sex << "\t" << p->password
					 << "\t" << p->money << "\t" << p->open_time << "\t" << p->states << endl;
				return;
			}
			p = p->next;
		}
	}
	break;
	case 2:
	{
		cout << "请输入需要查询的开户人姓名:";
		cin >> name;
		while (p)
		{
			if (p->name == name)
			{
				cout << "账户\t\t姓名\t性别\t密码\t金额\t\t开户日期\t开户状态" << endl;
				cout << p->account_num << "\t" << p->name << "\t" << p->sex << "\t" << p->password
					 << "\t" << p->money << "\t" << p->open_time << "\t" << p->states << endl;
				return;
			}
			p = p->next;
		}
	}
	break;
	case 3:
	{
		cout << "请输入需要查询的开户日期:";
		cin >> open_time;
		while (p)
		{
			if (p->open_time == open_time)
			{
				cout << "账户\t\t姓名\t性别\t密码\t金额\t\t开户日期\t开户状态" << endl;
				cout << p->account_num << "\t" << p->name << "\t" << p->sex << "\t" << p->password
					 << "\t" << p->money << "\t" << p->open_time << "\t" << p->states << endl;
				return;
			}
			p = p->next;
		}
	}
	break;
	default:
		cout << "输入有误!" << endl;
		break;
	}
	cout << "未查找到!" << endl;
}

// 2、开户
void Open_an_ccount(BankList &BL)
{
	Banker *p = new Banker;
	p->next = NULL;
	cout << "请输入需要开户的账户:";
	cin >> p->account_num;
	if (account_num_exist(BL, p->account_num))
	{
		cout << "开户失败,账户已存在" << endl;
		return;
	}
	cout << "请输入需要开户的姓名:";
	cin >> p->name;
	cout << "请输入需要开户的性别(男,女):";
	cin >> p->sex;
	cout << "请输入需要开户的密码(6位):";
	int password;
	char charPassword[20]; // 用于存储密码字符数组
	int i = 0;
	char ch;
	while ((ch = _getch()) != '\r') // \r是回车键
	{
		if (ch == '\b' && i > 0) // 处理退格键
		{
			cout << "\b \b";
			--i;
		}
		else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
		{
			charPassword[i++] = ch;
			cout << '*';
		}
	}
	charPassword[i] = '\0';		   // 字符串结束标志
	password = atoi(charPassword); // 将字符数组转换为整数
	cout << endl;
	p->password = password;
	cout << "请输入需要开户的金额:";
	cin >> p->money;
	cout << "请输入需要开户的开户日期(如:20050731):";
	cin >> p->open_time;
	cout << "请输入需要开户的开户状态(活期,定期):";
	cin >> p->states;
	Banker *pp = BL;
	while (pp->next)
	{
		pp = pp->next;
	}
	pp->next = p;
	cout << "开户成功!" << endl;
}

// 3、销户
void Pin_households(BankList &BL)
{
	string account_num; // 账户
	int password;		// 密码
	Banker *p = BL;
	cout << "请输入需要销户的账户:";
	cin >> account_num;
	if (account_num_exist(BL, account_num))
	{
		cout << "请输入需要销户的密码:";
		char charPassword[20]; // 用于存储密码字符数组
		int i = 0;
		char ch;
		while ((ch = _getch()) != '\r') // \r是回车键
		{
			if (ch == '\b' && i > 0) // 处理退格键
			{
				cout << "\b \b";
				--i;
			}
			else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
			{
				charPassword[i++] = ch;
				cout << '*';
			}
		}
		charPassword[i] = '\0';		   // 字符串结束标志
		password = atoi(charPassword); // 将字符数组转换为整数
		cout << endl;
		cout << "\n";
		while (p->next != NULL)
		{
			if (p->next->account_num == account_num && p->next->password == password)
			{
				cout << "销户成功!" << endl;
				Banker *pt = p->next;
				p->next = pt->next;
				delete pt;
				return;
			}
			p = p->next;
		}
		cout << "\n输入的密码有误!" << endl;
	}
	else
	{
		cout << "此账户不存在!" << endl;
	}
}

// 4、修改账户密码
void Modify_account_password(BankList &BL)
{
	string account_num; // 账户
	int password;		// 密码
	Banker *p = BL->next;
	cout << "请输入需要修改的账户:";
	cin >> account_num;
	if (account_num_exist(BL, account_num))
	{
		cout << "请输入需要修改的账户密码:";
		char charPassword[20]; // 用于存储密码字符数组
		int i = 0;
		char ch;
		while ((ch = _getch()) != '\r') // \r是回车键
		{
			if (ch == '\b' && i > 0) // 处理退格键
			{
				cout << "\b \b";
				--i;
			}
			else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
			{
				charPassword[i++] = ch;
				cout << '*';
			}
		}
		charPassword[i] = '\0';		   // 字符串结束标志
		password = atoi(charPassword); // 将字符数组转换为整数
		cout << endl;
		cout << "\n";
		while (p != NULL)
		{
			if (p->account_num == account_num && p->password == password)
			{
				cout << "请输入新的密码:";
				int password;
				char charPassword[20]; // 用于存储密码字符数组
				int i = 0;
				char ch;
				while ((ch = _getch()) != '\r') // \r是回车键
				{
					if (ch == '\b' && i > 0) // 处理退格键
					{
						cout << "\b \b";
						--i;
					}
					else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
					{
						charPassword[i++] = ch;
						cout << '*';
						
					}
				}
				charPassword[i] = '\0';		   // 字符串结束标志
				password = atoi(charPassword); // 将字符数组转换为整数
				cout << endl;
				p->password = password;
				cout << "修改成功!" << endl;
				return;
			}
			p = p->next;
		}
		cout << "密码错误!" << endl;
	}
	else
	{
		cout << "此账户不存在!" << endl;
	}
}

// 5、账户排序
void Sort_accountInfo(BankList &BL)
{
	int ch;
	cout << "1:按账号排序" << endl;
	cout << "2:按开户人姓名排序" << endl;
	cout << "3:按金额排序" << endl;
	cout << "4:按开户日期排序" << endl;
	cout << "请输入选择的排序编号:" << endl;
	cin >> ch;
	Banker *p1 = BL->next;
	switch (ch)
	{
	case 1:
	{
		for (; p1->next != NULL; p1 = p1->next)
		{
			for (Banker *p2 = p1->next; p2 != NULL; p2 = p2->next)
			{
				if (p1->account_num > p2->account_num) // 升序排列
				{
					Banker *p11 = p1->next;
					Banker *p22 = p2->next;
					Banker t = *p1;
					*p1 = *p2;
					*p2 = t;
					p1->next = p11;
					p2->next = p22;
				}
			}
		}
		cout << "排序成功!" << endl;
	}
	break;
	case 2:
	{
		for (; p1->next != NULL; p1 = p1->next)
		{
			for (Banker *p2 = p1->next; p2 != NULL; p2 = p2->next)
			{
				if (p1->name > p2->name) // 升序排列
				{
					Banker *p11 = p1->next;
					Banker *p22 = p2->next;
					Banker t = *p1;
					*p1 = *p2;
					*p2 = t;
					p1->next = p11;
					p2->next = p22;
				}
			}
		}
		cout << "排序成功!" << endl;
	}
	break;
	case 3:
	{
		for (; p1->next != NULL; p1 = p1->next)
		{
			for (Banker *p2 = p1->next; p2 != NULL; p2 = p2->next)
			{
				if (p1->money > p2->money) // 升序排列
				{
					Banker *p11 = p1->next;
					Banker *p22 = p2->next;
					Banker t = *p1;
					*p1 = *p2;
					*p2 = t;
					p1->next = p11;
					p2->next = p22;
				}
			}
		}
		cout << "排序成功!" << endl;
	}
	break;
	case 4:
	{
		for (; p1->next != NULL; p1 = p1->next)
		{
			for (Banker *p2 = p1->next; p2 != NULL; p2 = p2->next)
			{
				if (p1->open_time > p2->open_time) // 升序排列
				{
					Banker *p11 = p1->next;
					Banker *p22 = p2->next;
					Banker t = *p1;
					*p1 = *p2;
					*p2 = t;
					p1->next = p11;
					p2->next = p22;
				}
			}
		}
		cout << "排序成功!" << endl;
	}
	break;
	default:
		cout << "您的输入有误!" << endl;
	}
}

// 6、存款
void deposit(BankList &BL)
{
	string account_num; // 账户
	int password;		// 密码
	Banker *p = BL->next;
	cout << "请输入需要存款的账户:";
	cin >> account_num;
	if (account_num_exist(BL, account_num))
	{
		cout << "请输入需要存款的账户密码:";
		char charPassword[20]; // 用于存储密码字符数组
		int i = 0;
		char ch;
		while ((ch = _getch()) != '\r') // \r是回车键
		{
			if (ch == '\b' && i > 0) // 处理退格键
			{
				cout << "\b \b";
				--i;
			}
			else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
			{
				charPassword[i++] = ch;
				cout << '*';
			}
		}
		charPassword[i] = '\0';		   // 字符串结束标志
		password = atoi(charPassword); // 将字符数组转换为整数
		cout << endl;
		cout << "\n";
		while (p != NULL)
		{
			if (p->account_num == account_num && p->password == password)
			{
				cout << "请输入存款金额:";
				long long m;
				cin >> m;
				p->money += m;
				cout << "存款成功!" << endl;
				return;
			}
			p = p->next;
		}
		cout << "密码错误!" << endl;
	}
	else
	{
		cout << "此账户不存在!" << endl;
	}
}

// 7、取款
void withdrawals(BankList &BL)
{
	string account_num; // 账户
	int password;		// 密码
	Banker *p = BL->next;
	cout << "请输入需要取款的账户:";
	cin >> account_num;
	if (account_num_exist(BL, account_num))
	{
		cout << "请输入需要取款的账户密码:";
		char charPassword[20]; // 用于存储密码字符数组
		int i = 0;
		char ch;
		while ((ch = _getch()) != '\r') // \r是回车键
		{
			if (ch == '\b' && i > 0) // 处理退格键
			{
				cout << "\b \b";
				--i;
			}
			else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
			{
				charPassword[i++] = ch;
				cout << '*';
			}
		}
		charPassword[i] = '\0';		   // 字符串结束标志
		password = atoi(charPassword); // 将字符数组转换为整数
		cout << endl;
		cout << "\n";
		while (p != NULL)
		{
			if (p->account_num == account_num && p->password == password)
			{
				cout << "请输入您的取款金额:";
				long long m;
				cin >> m;
				if (p->money >= m)
				{
					p->money -= m;

					cout << "取款成功!" << endl;
					cout << "当前账户信息如下:" << endl;
					cout << "账户\t\t姓名\t性别\t密码\t金额\t\t开户日期\t开户状态" << endl;
					cout << p->account_num << "\t" << p->name << "\t" << p->sex << "\t" << p->password
						 << "\t" << p->money << "\t" << p->open_time << "\t" << p->states << endl;
					return;
				}
				else
				{
					cout << "余额不足!" << endl;
					return;
				}
			}
			p = p->next;
		}
		cout << "密码错误!" << endl;
	}
	else
	{
		cout << "此账户不存在!" << endl;
	}
}
void Readfile2(BankList &, string);

void Save2(BankList &BL, string file);

// 8、转账
void transfer(BankList &BL)
{
	Banker *p1 = BL->next;

	BankList bk;
	InitList2(bk);

	string bank1, bank2, account_num; // 银行名,账户
	int password;					  // 密码
	cout << "请输入转账方用户类型:";
	cin >> bank1;
	bank1 += ".txt";
	cout << "请输入收款方用户类型:";
	cin >> bank2;
	bank2 += ".txt";
	Readfile2(bk, bank2);
	Banker *p2 = bk->next;
	cout << "请输入转账方账户:";
	cin >> account_num;
	if (account_num_exist(BL, account_num))
	{
		cout << "请输入密码:";
		char charPassword[20]; // 用于存储密码字符数组
		int i = 0;
		char ch;
		while ((ch = _getch()) != '\r') // \r是回车键
		{
			if (ch == '\b' && i > 0) // 处理退格键
			{
				cout << "\b \b";
				--i;
			}
			else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
			{
				charPassword[i++] = ch;
				cout << '*';
			}
		}
		charPassword[i] = '\0';		   // 字符串结束标志
		password = atoi(charPassword); // 将字符数组转换为整数
		cout << endl;
		cout << "\n";
		while (p1 != NULL)
		{
			if (p1->account_num == account_num && p1->password == password)
			{

				cout << "请输入收款方账户:";
				cin >> account_num;
				while (p2)
				{
					if (p2->account_num == account_num)
					{
						long long m;
						cout << "请输入转账金额:";
						cin >> m;
						if (bank1 == bank2)
						{
							if (p1->money >= m)
							{
								p1->money -= m;
								p2->money += m;
								cout << "转账成功!" << endl;
								cout << "当前账户信息如下:" << endl;
								cout << "账户\t\t姓名\t性别\t密码\t金额\t\t开户日期\t开户状态" << endl;
								cout << p1->account_num << "\t" << p1->name << "\t" << p1->sex
									 << "\t" << p1->password
									 << "\t" << p1->money << "\t" << p1->open_time << "\t"
									 << p1->states << endl;

								Save2(bk, bank2);
								return;
							}
							else
							{
								cout << "余额不足!" << endl;
								return;
							}
						}
						else
						{
							cout << "收取手续费:" << m * 0.01 << " 元!" << endl;
							if (p1->money >= m + m * 0.01)
							{
								p1->money -= m;
								p2->money += m;
								cout << "转账成功!" << endl;
								cout << "当前账户信息如下:" << endl;
								cout << "账户\t\t姓名\t性别\t密码\t金额\t\t开户日期\t开户状态" << endl;
								cout << p1->account_num << "\t" << p1->name << "\t" << p1->sex
									 << "\t" << p1->password
									 << "\t" << p1->money << "\t" << p1->open_time << "\t"
									 << p1->states << endl;

								Save2(bk, bank2);
								return;
							}
							else
							{
								cout << "余额不足!" << endl;
								return;
							}
						}
					}
					p2 = p2->next;
				}
				cout << "账户不存在" << endl;
			}
			p1 = p1->next;
		}
		cout << "密码错误!" << endl;
	}
	else
	{
		cout << "账户不存在!" << endl;
	}
}

double cal_year(int a, int b)
{
	int year1 = a / 10000;
	int year2 = b / 10000;
	int month1 = a / 100 % 100;
	int month2 = b / 100 % 100;
	int day1 = a % 100;
	int day2 = b % 100;
	double year = 0;
	if (year1 == year2)
		year = 0.5;
	else if (month2 == month1 && day1 == day2)
	{
		year = year2 - year1;
	}
	else if (month2 < month1 || month2 == month1 && day1 > day2)
	{
		year = year2 - year1 - 0.5;
	}
	else if (month2 > month1 || month2 == month1 && day1 < day2)
	{
		year = year2 - year1 + 0.5;
	}
	return year;
}

// 9、计算利息

/*
活期 每年 0.35% (0.0035)
不足一年按半年算,利率为活期年利率的一半,即 0.0035 * 0.5
定期 第一年 2.75%(0.0275)
第二年 3.35%(0.0335)
第三年 4%(0.04)
*/
void Calculation_interest(BankList &BL)
{
	string account_num; // 账户
	int password;		// 密码
	Banker *p = BL->next;
	cout << "请输入账户:";
	cin >> account_num;
	if (account_num_exist(BL, account_num))
	{
		char charPassword[20]; // 用于存储密码字符数组
		cout << "请输入密码:";
		int i = 0;
		char ch;
		while ((ch = _getch()) != '\r') // \r是回车键
		{
			if (ch == '\b' && i > 0) // 处理退格键
			{
				cout << "\b \b";
				--i;
			}
			else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
			{
				charPassword[i++] = ch;
				cout << '*';
			}
		}
		charPassword[i] = '\0';		   // 字符串结束标志
		password = atoi(charPassword); // 将字符数组转换为整数
		cout << endl;
		cout << "\n";
		cout << endl
			 << "你输入的密码是:" << password << endl;
		while (p != NULL)
		{
			if (p->account_num == account_num && p->password == password)
			{
				cout << "请输入存款到期时间:";
				int end_time;
				double rate = 0;
				cin >> end_time;
				double year = cal_year(p->open_time, end_time);
				int year2 = year; // 转化为整数年份
				if (p->states == "活期")
				{
					for (int i = 1; i <= year2; i++)
					{
						rate += (rate + p->money) * 0.0035;
					}
					if (year > year2 + 0.1)
						rate += (rate + p->money) * 0.0035 * 0.5;
				}
				else if (p->states == "定期")
				{
					for (int i = 1; i <= year; i++)
					{
						if (i == 1)
						{
							rate += (rate + p->money) * 0.0275;
						}
						else if (i == 2)
						{
							rate += (rate + p->money) * 0.0335;
						}
						else if (i >= 3)
						{
							rate += (rate + p->money) * 0.04;
						}
					}
					int year2 = year;
					if (fabs(year - 0.5) <= 1e-6)
						rate += (rate + p->money) * 0.0275 * 0.5;
					else if (fabs(year - 1.5) <= 1e-6)
						rate += (rate + p->money) * 0.0335 * 0.5;
					else if (fabs(year - 2.5) <= 1e-6)
						rate += (rate + p->money) * 0.04 * 0.5;
				}
				cout << "您获得的利息为:" << rate << endl;
				return;
			}
			p = p->next;
		}
		cout << "密码错误!" << endl;
	}
	else
	{
		cout << "账户不存在!" << endl;
	}
}

// 10、保存账户信息
void Save2(BankList &BL, string file)
{
	ofstream ofs;
	ofs.open(file.c_str());
	Banker *p = BL->next;
	while (p)
	{
		ofs << p->account_num << "\t" << p->name << "\t" << p->sex << "\t" << p->password
			<< "\t" << p->money << "\t" << p->open_time << "\t" << p->states << endl;
		p = p->next;
	}
	ofs.close();
	cout << "保存成功!" << endl;
}
// 11、显示所有账户信息
void Display2(BankList &BL)
{
	Banker *p = BL->next;
	cout << "账户\t\t姓名\t性别\t密码\t金额\t\t开户日期\t开户状态" << endl;
	while (p)
	{
		cout << p->account_num << "\t" << p->name << "\t" << p->sex << "\t" << p->password
			 << "\t" << p->money << "\t" << p->open_time << "\t" << p->states << endl;
		p = p->next;
	}
}

// 1、VIP放号
void releaseVIP()
{
	int x;
	cout << "请输入需要放号的个数:";
	cin >> x;
	for (int i = 0; i < x; i++)
		VIPQue.push(VIPNum++);
	cout << "VIP 放号成功,当前 VIP 号为:" << VIPQue.back() << endl;
}
// 2、Normal放号
void releaseNormal()
{
	int x;
	cout << "请输入需要放号的个数:";
	cin >> x;
	for (int i = 0; i < x; i++)
		normalQue.push(normalNum++);
	cout << "Normal 放号成功,当前 Normal 号为:" << normalQue.back() << endl;
}
// 打分
void Grade(Staff *&goal)
{
	int score;
	while (1)
	{
		cout << "请客户输入打分(1-5 分):";
		cin >> score;
		if (score < 1 || score > 5)
		{
			cout << "请在1~5之间打分 " << endl;
			system("pause");
			system("cls");
			Menu3(); // 菜单栏
			DisplayVIP();
			DisplayNormal();
		}
		else
			break;
	}
	// 这里假设当前登录的员工 goal 可以接收打分
	// 并更新其平均分和总接待人数
	goal->grade = (goal->grade * goal->n + score) / (goal->n + 1);
	goal->n++;
	cout << "打分成功!" << endl;
}
// 3、结束VIP服务
void endVIPServe(Staff *&goal)
{
	if (!VIPQue.empty())
	{
		cout << "VIP 服务结束" << endl;
		Grade(goal);
		cout << "当前服务号为:" << VIPQue.front() << endl;
		VIPQue.pop();
		cnt++;
		if (!VIPQue.empty())
		{
			cout << "下一个 VIP 号为:" << VIPQue.front() << endl;
		}
		else
		{
			cout << "目前没有 VIP 在排队。" << endl;
		}
	}
	else
	{
		cout << "没有 VIP 在排队等待服务。" << endl;
	}
}
// 4、结束Normal服务
void endNormalServe(Staff *&goal)
{
	if (!normalQue.empty())
	{
		cout << "Normal 服务结束" << endl;
		Grade(goal);
		cout << "当前服务号为:" << normalQue.front() << endl;
		normalQue.pop();
		cnt++;
		if (!normalQue.empty())
		{
			cout << "下一个 Normal 号为:" << normalQue.front() << endl;
		}
		else
		{
			cout << "目前没有 Normal 在排队。" << endl;
		}
	}
	else
	{
		cout << "没有 Normal 在排队等待服务。" << endl;
	}
}

// 展示VIP
void DisplayVIP()
{
	if (VIPQue.empty())
	{
		cout << "VIP 队列当前为空 " << endl;
	}
	else
	{
		cout << "VIP窗口    ";
		queue<int> tempQue = VIPQue;
		while (!tempQue.empty())
		{
			cout << tempQue.front();
			tempQue.pop();
			if (!tempQue.empty())
			{
				cout << "<-";
			}
		}
		cout << endl;
	}
}
// 展示Normal
void DisplayNormal()
{
	if (normalQue.empty())
	{
		cout << "Normal 队列当前为空" << endl;
	}
	else
	{
		cout << "Normal窗口 ";
		queue<int> tempQue = normalQue;
		while (!tempQue.empty())
		{
			cout << tempQue.front();
			tempQue.pop();
			if (!tempQue.empty())
			{
				cout << "<-";
			}
		}
		cout << endl;
	}
}
// 5、展示职员得分
void DisplayScore(Staff *&goal)
{
	cout << "已服务 " << cnt << " 位客户" << endl;
	cout << "客户为您打分的平均分为" << goal->grade << endl;
}

// (1) 对图初始化
MGraph initgraph()
{
	int i = 0, j = 0;
	MGraph c;

	c.vexnum = 28;				   // 顶点个数
	c.arcnum = 39;				   // 边的个数
	for (i = 0; i < c.vexnum; i++) // 依次设置顶点编号
		c.vexs[i].position = i;

	// 依次输入顶点信息
	strcpy(c.vexs[0].name, "南门");
	strcpy(c.vexs[0].introduction, "出门有美食街");
	strcpy(c.vexs[1].name, "西门");
	strcpy(c.vexs[1].introduction, "出门有BRT公交站");
	strcpy(c.vexs[2].name, "1号教学楼");
	strcpy(c.vexs[2].introduction, "导员办公室在1461");
	strcpy(c.vexs[3].name, "2号教学楼");
	strcpy(c.vexs[3].introduction, "最常上课的楼 最后一排有插座");
	strcpy(c.vexs[4].name, "3号实验楼");
	strcpy(c.vexs[4].introduction, "上机课就在这 电梯特别挤");
	strcpy(c.vexs[5].name, "4号教学楼");
	strcpy(c.vexs[5].introduction, "办公楼旁边");
	strcpy(c.vexs[6].name, "图书馆");
	strcpy(c.vexs[6].introduction, "离南门最近");
	strcpy(c.vexs[7].name, "逸夫楼");
	strcpy(c.vexs[7].introduction, "离图书馆近");
	strcpy(c.vexs[8].name, "气膜馆");
	strcpy(c.vexs[8].introduction, "可预约打羽毛球");
	strcpy(c.vexs[9].name, "篮球场");
	strcpy(c.vexs[9].introduction, "可随时打篮球");
	strcpy(c.vexs[10].name, "排球场");
	strcpy(c.vexs[10].introduction, "打排球");
	strcpy(c.vexs[11].name, "网球场");
	strcpy(c.vexs[11].introduction, "打网球");
	strcpy(c.vexs[12].name, "纳博士地下超市");
	strcpy(c.vexs[12].introduction, "超市+小吃");
	strcpy(c.vexs[13].name, "711");
	strcpy(c.vexs[13].introduction, "便利店");
	strcpy(c.vexs[14].name, "西苑餐厅");
	strcpy(c.vexs[14].introduction, "吃饭 上完课吃饭最近");
	strcpy(c.vexs[15].name, "东苑餐厅");
	strcpy(c.vexs[15].introduction, "吃饭 6,7号宿舍楼出来吃饭最近 旁边有民族餐厅");
	strcpy(c.vexs[16].name, "北苑餐厅");
	strcpy(c.vexs[16].introduction, "吃饭 近办公楼");
	strcpy(c.vexs[17].name, "校医院");
	strcpy(c.vexs[17].introduction, "看病");
	strcpy(c.vexs[18].name, "操场");
	strcpy(c.vexs[18].introduction, "体育课 跑步 晚上没灯");
	strcpy(c.vexs[19].name, "菜鸟驿站");
	strcpy(c.vexs[19].introduction, "取快递");
	strcpy(c.vexs[20].name, "海岱美术馆");
	strcpy(c.vexs[20].introduction, "美术馆 没去过");
	strcpy(c.vexs[21].name, "教工宿舍");
	strcpy(c.vexs[21].introduction, "教职工租住地");
	strcpy(c.vexs[22].name, "1,2号宿舍楼");
	strcpy(c.vexs[22].introduction, "离菜鸟驿站近");
	strcpy(c.vexs[23].name, "3,5号宿舍楼");
	strcpy(c.vexs[23].introduction, "离西苑 菜鸟驿站 2号楼都近");
	strcpy(c.vexs[24].name, "6,7,8宿舍楼");
	strcpy(c.vexs[24].introduction, "东苑餐厅附近");
	strcpy(c.vexs[25].name, "9,10,11宿舍楼");
	strcpy(c.vexs[25].introduction, "离东苑也近 在6,7号宿舍楼前面");
	strcpy(c.vexs[26].name, "学景大酒店");
	strcpy(c.vexs[26].introduction, "酒店 南门门口");
	strcpy(c.vexs[27].name, "办公楼");
	strcpy(c.vexs[27].introduction, "办公楼 离西门近 这个电梯不挤");

	// 依次输入边上的权值信息
	for (i = 0; i < c.vexnum; i++)
		for (j = 0; j < c.vexnum; j++)
			c.arcs[i][j].adj = Infinity; // 先初始化图的邻接矩阵

	// 部分弧长
	c.arcs[0][26].adj = 20;
	c.arcs[0][6].adj = 60;
	c.arcs[1][2].adj = 70;
	c.arcs[1][27].adj = 60;
	c.arcs[2][3].adj = 50;
	c.arcs[2][4].adj = 60;
	c.arcs[2][27].adj = 40;
	c.arcs[3][4].adj = 20;
	c.arcs[4][14].adj = 100;
	c.arcs[5][27].adj = 30;
	c.arcs[5][17].adj = 120;
	c.arcs[6][7].adj = 20;
	c.arcs[7][19].adj = 30;
	c.arcs[8][9].adj = 20;
	c.arcs[8][10].adj = 10;
	c.arcs[9][10].adj = 30;
	c.arcs[9][11].adj = 20;
	c.arcs[9][17].adj = 10;
	c.arcs[9][23].adj = 50;
	c.arcs[10][16].adj = 130;
	c.arcs[12][13].adj = 10;
	c.arcs[13][18].adj = 40;
	c.arcs[13][23].adj = 40;
	c.arcs[14][19].adj = 30;
	c.arcs[14][22].adj = 10;
	c.arcs[15][18].adj = 10;
	c.arcs[15][24].adj = 30;
	c.arcs[16][27].adj = 30;
	c.arcs[18][20].adj = 20;
	c.arcs[19][22].adj = 10;
	c.arcs[21][27].adj = 30;
	c.arcs[24][25].adj = 20;
	c.arcs[25][26].adj = 10;

	for (i = 0; i < c.vexnum; i++) // 邻接矩阵是对称矩阵,对称赋值
		for (j = 0; j < c.vexnum; j++)
			c.arcs[j][i].adj = c.arcs[i][j].adj;
	return c;
} // initgraph

// (2) 查找景点在图中的序号
int locatevex(MGraph c, int v)
{
	int i;
	for (i = 0; i < c.vexnum; i++)
		if (v == c.vexs[i].position)
			return i; // 找到,返回顶点序号i

	return -1; // 否则,返回-1
}

//(3) 、(4) 求两景点间的所有路径

// (3) 打印序号为m,n景点间的长度不超过12个景点的路径
void path(MGraph c, int m, int n, int k)
{
	int s, x = 0;
	int t = k + 1;			 // t 记载路径上下一个中间顶点在d[]数组中的下标
	if (d[k] == n && k < 12) // d[k]存储路径顶点。若d[k]是终点n且景点个数<=8,则输出该路径
	{						 // 递归出口,找到一条路径
		for (s = 0; s < k; s++)
			printf("%s--->", c.vexs[d[s]].name); // 输出该路径。s=0 时为起点m
		printf("%s", c.vexs[d[s]].name);		 // 输出最后一个景点名(即顶点n的名字,此时 s == k)
		printf("\n\n");
	}
	else
	{
		s = 0;
		while (s < c.vexnum) // 从第m个顶点,试探至所有顶点是否有路径
		{
			if ((c.arcs[d[k]][s].adj < Infinity) && (visited[s] == 0)) // 初态:顶点m到顶点s有边,且未被访问
			{
				visited[s] = 1;
				d[k + 1] = s;	  // 存储顶点编号s 至d[k + 1]中
				path(c, m, n, t); // 求从下标为t = k + 1的第d[t]个顶点开始的路径(递归调用),同时打印出一条m至n的路径
				visited[s] = 0;	  // 将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径
			}
			s++; // 试探从下一个顶点 s 开始是否有到终点的路径
		} // endwhile
	} // endelse

} // endpath

//(4) 打印两景点间的景点个数不超过12的所有路径。调用(3)
int allpath(MGraph c)
{
	int k, i, j, m, n;
	printf("\n\n请输入你要查询的两个景点编号:\n\n");
	scanf("%d%d", &i, &j);
	printf("\n\n");
	m = locatevex(c, i); // 调用(2),确定该顶点是否存在。若存在,返回该顶点编号
	n = locatevex(c, j);
	d[0] = m;					   // 存储路径起点m (int d[]数组是全局变量)
	for (k = 0; k < c.vexnum; k++) // 全部顶点访问标志初值设为0
		visited[k] = 0;
	visited[m] = 1;	  // 第m个顶点访问标志设置为1
	path(c, m, n, 0); // 调用(3)。k = 0,对应起点d[0] == m。k为d[]数组下标
	return 1;
}

// (5) 用迪杰斯特拉算法,求出一个景点到其他景点间的最短路径,并打印
void shortestpath_dij(MGraph c)
{
	// 迪杰斯特拉算法,求从顶点v0到其余顶点的最短路经及其带权长度d[v]
	// 若p[v][w]为1,则w是从v0到v的最短路经上的顶点
	// final[v]类型用于设置访问标志

	int v, w, i, min, t = 0, x, flag = 1, v0; // vo为起始景点的编号
	int final[35], d[35], p[35][35];
	printf("\n请输入一个起始景点的编号:");
	scanf("%d", &v0);
	printf("\n\n");
	while (v0 < 0 || v0 > c.vexnum)
	{
		printf("\n你所输入的景点编号不存在\n");
		printf("请重新输入:");
		scanf("%d", &v0);
	} // while
	for (v = 0; v < c.vexnum; v++)
	{
		final[v] = 0;				   // 初始化各顶点访问标志
		d[v] = c.arcs[v0][v].adj;	   // v0 到各顶点 v 的权值赋值给d[v]
		for (w = 0; w < c.vexnum; w++) // 初始化p[][]数组,各顶点间的程序段
			p[v][w] = 0;
		if (d[v] < Infinity) // v0 到v 有边相连,修改p[v][v0]的值为1
		{
			p[v][v0] = 1;
			p[v][v] = 1; // 各顶点自己到自己要连通
		}
	} // for
	d[v0] = 0;					   // 自己到自己的权值设为0
	final[v0] = 1;				   // v0的访问标志设为1,v 属于 s 集
	for (i = 1; i < c.vexnum; i++) // 对其余c.vexnum-1个顶点w,依次求 v 到 w 的最短路径
	{
		min = Infinity;
		for (w = 0; w < c.vexnum; w++) // 在未被访问的顶点中,查找与 v0 最近的顶点v
			if (!final[w])
				if (d[w] < min) // v0 到 w (有边)的权值<min
				{
					v = w;
					min = d[w];
				} // if
		final[v] = 1;										  // v 的访问标志设置为1,v 属于s集
		for (w = 0; w < c.vexnum; w++)						  // 修改v0 到其余各顶点w 的最短路径权值d[w]
			if (!final[w] && (min + c.arcs[v][w].adj < d[w])) // 若w 不属于s,且v 到w 有边相连
			{
				d[w] = min + c.arcs[v][w].adj; // 修改v0 到w 的权值d[w]
				for (x = 0; x < c.vexnum; x++) // 所有v0 到v 的最短路径上的顶点x,都是v0 到w 的最短路径上的顶点
					p[w][x] = p[v][x];
				p[w][w] = 1;
			} // if
	} // for
	for (v = 0; v < c.vexnum; v++) // 输出v0 到其它顶点v 的最短路径
	{
		if (v != v0)
			printf("%s", c.vexs[v0].name); // 输出景点v0 的景点名
		for (w = 0; w < c.vexnum; w++)	   // 对图中每个顶点w,试探w 是否是v0 到v 的最短路径上的顶点
		{
			if (p[v][w] && w != v0 && w != v) // 若w 是且w 不等于v0,则输出该景点
				printf("--->%s", c.vexs[w].name);
		}
		printf("---->%s", c.vexs[v].name);
		printf("\n总路线长为%d米\n\n", d[v]);
	} // for
} // shortestpath_dij

//(6)-(11)修改图的信息。包括建图、更新信息、删除、增加结点和边

//(6) 构造图的邻接矩阵
int creatgragh(MGraph *c) // 建图。以图的邻接矩阵存储图
{
	int i, j, m, n;
	int v0, v1;
	int distance;
	printf("请输入图的顶点数和边数: \n");
	scanf("%d %d", &c->vexnum, &c->arcnum);
	printf("下面请输入景点的信息:\n");
	for (i = 0; i < c->vexnum; i++) // 构造顶点向量(数组)
	{
		printf("请输入景点的编号:");
		scanf("%d", &c->vexs[i].position);
		printf("\n请输入景点的名称:");
		char name_[50];
		cin>>name_;
		strcpy(c->vexs[i].name,name_);
		printf("\n请输入景点的简介:");
		char introduction_[200];
		cin>>introduction_[200];
		strcpy(c->vexs[i].introduction,introduction_);
	}
	for (i = 0; i < c->arcnum; i++) // 初始化邻接矩阵
		for (j = 0; j < c->arcnum; j++)
			c->arcs[i][j].adj = Infinity;

	printf("下面请输入图的边的信息:\n");
	for (i = 1; i <= c->arcnum; i++) // 构造邻接矩阵
	{
		printf("\n第%d条边的起点 终点 长 度为:", i);
		scanf("%d %d %d", &v0, &v1, &distance);
		m = locatevex(*c, v0);
		n = locatevex(*c, v1);
		if (m >= 0 && n >= 0)
		{
			c->arcs[m][n].adj = distance;
			c->arcs[n][m].adj = c->arcs[m][n].adj;
		}
	}
	return 1;
} // creatgragh

// (7) 更新图的部分信息。返回值: 1
int newgraph(MGraph *c)
{
	int changenum; // 计数。用于记录要修改的对象的个数
	int i, m, n, t, distance, v0, v1;
	printf("\n下面请输入你要修改的景点的个数:\n");
	scanf("%d", &changenum);
	while (changenum < 0 || changenum > c->vexnum)
	{
		printf("\n输入错误!请重新输入");
		scanf("%d", &changenum);
	}

	for (i = 0; i < changenum; i++)
	{
		printf("\n请输入景点的编号:");
		scanf("%d", &m);
		t = locatevex(*c, m);
		printf("\n请输入景点的名称:");
		scanf("%s", &c->vexs[t].name);
		printf("\n请输入景点的简介:");
		scanf("%s", &c->vexs[t].introduction);
	}

	printf("\n下面请输入你要更新的边数");
	scanf("%d", &changenum);
	while (changenum < 0 || changenum > c->arcnum)
	{
		printf("\n输入错误!请重新输入");
		scanf("%d", &changenum);
	}

	printf("\n下面请输入更新边的信息:\n");
	for (i = 1; i <= changenum; i++)
	{
		printf("\n修改的第%d条边的起点 终点 长 度为:", i);
		scanf("%d", &v0, &v1, &distance);
		m = locatevex(*c, v0);
		n = locatevex(*c, v1);
		if (m >= 0 && n >= 0)
		{
			c->arcs[m][n].adj = distance;
			c->arcs[n][m].adj = c->arcs[m][n].adj;
		}
	}
	return 1;
} // newgraph

// (8) 增加一条边。返回值:1
int enarc(MGraph *c)
{
	int m, n, distance;
	printf("\n请输入边的起点和终点编号,权值:");
	scanf("%d %d %d", &m, &n, &distance);
	while (m < 0 || m > c->vexnum || n < 0 || n > c->vexnum)
	{
		printf("输入错误,请重新输入:");
		scanf("%d", &m, &n);
	}
	if (locatevex(*c, m) < 0)
	{
		printf("此结点%d已删除", m);
		return 1;
	}
	if (locatevex(*c, n) < 0)
	{
		printf("此结点%d已被删除:", n);
		return 1;
	}
	c->arcs[m][n].adj = distance;
	c->arcs[n][m].adj = c->arcs[m][n].adj; // 对称赋值
	return 1;
} // enarc

int envex(MGraph* c)
{
	int i;
	printf("请输入你要增加结点的信息:");
	printf("\n编号:");
	cin >> c->vexs[c->vexnum].position;
	printf(" 名称:");
	cin >> c->vexs[c->vexnum].name;
	printf("简介:");
	cin >> c->vexs[c->vexnum].introduction;
	c->vexnum++;
	for (i = 0; i < c->vexnum; i++)
	{
		c->arcs[c->vexnum - 1][i].adj = Infinity; 
		c->arcs[i][c->vexnum - 1].adj = Infinity; 
	}
	return 1;
} 

// (10) 删除图的一个顶点。返回值:1
int delvex(MGraph *c)
{
	int i = 0, j;
	int m;
	int v;
	if (c->vexnum <= 0)
	{
		printf("图中已无顶点");
		return 1;
	}
	printf("\n下面请输入你要删除的景点编号:");
	scanf("%d", &v);
	while (v < 0 || v > c->vexnum)
	{
		printf("\n输入错误!请重新输入");
		scanf("%d", &v);
	}
	m = locatevex(*c, v);
	if (m < 0)
	{
		printf("此顶点 %d 已删除", v);
		return 1;
	}
	for (i = m; i < c->vexnum - 1; i++) // 对顶点信息所在顺序表进行删除m 点的操作
	{
		strcpy(c->vexs[i].name, c->vexs[i + 1].name);
		strcpy(c->vexs[i].introduction, c->vexs[i + 1].introduction);
	}
	// 对原邻接矩阵,删除该顶点到其余顶点的邻接关系。分别删除相应的行和列
	for (i = m; i < c->vexnum - 1; i++)		   // 行
		for (j = 0; j < c->vexnum; j++)		   // 列
			c->arcs[i][j] = c->arcs[i + 1][j]; // 二维数组,从第m + 1行开始依次往前移一行。即删除第m 行
	for (i = m; i < c->vexnum - 1; i++)
		for (j = 0; j < c->vexnum; j++)
			c->arcs[j][i] = c->arcs[j][i + 1]; // 二维数组,从第m + 1列开始依次往前移一列。即删除第m 列
	c->vexnum--;
	return 1;
} // delvex

//(11) 删除图的一条边。返回值:1
int delarc(MGraph *c)
{
	int m, n;
	int v0, v1;
	if (c->arcnum <= 0)
	{
		printf("图中已无边,无法删除。");
		return 1;
	}
	printf("\n下面请输入你要删除的边的起点和终点编号:");
	scanf("%d %d", &v0, &v1);
	m = locatevex(*c, v0);
	if (m < 0)
	{
		printf("此 %d 顶点已删除", v0);
		return 1;
	}
	n = locatevex(*c, v1);
	if (n < 0)
		return 1;
	c->arcs[m][n].adj = Infinity; // 修改邻接矩阵对应的权值
	c->arcs[n][m].adj = Infinity;
	c->arcnum--;
	return 1;
} // delarc

// (12) 输出图的邻接矩阵的值
void printmatrix(MGraph c)
{
	int i, j, k = 0; // k 用于计数,控制换行

	for (i = 0; i < c.vexnum; i++)
		for (j = 0; j < c.vexnum; j++)
		{
			if (c.arcs[i][j].adj == Infinity)
				printf("----");
			else
				printf("%4d", c.arcs[i][j].adj);
			k++;
			if (k % c.vexnum == 0)
				printf("\n");
		}
} // printpath

//(13)图操作的主调函数。返回值:1
int changegraph(MGraph *c)
{

	while (1)
	{
		system("cls");
		int yourchoice;

		system("cls");
		system("color 0E");
		cout << "******************************" << endl;
		cout << "|    欢迎使用网点更改系统    |" << endl;
		cout << "******************************" << 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;
		scanf("%d", &yourchoice);
		printf("\n\n");
		while (!(yourchoice == 1 || yourchoice == 2 || yourchoice == 3 || yourchoice == 4 || yourchoice == 5 || yourchoice == 6 || yourchoice == 7))
		{
			printf("输入选择不明确,请重输\n");
			scanf("%d", &yourchoice);
		}
		switch (yourchoice)
		{
		case 1:
			creatgragh(c);
			break;
		case 2:
			delvex(c);
			break;
		case 3:
			delarc(c);
			break;
		case 4:
			envex(c);
			break;
		case 5:
			enarc(c);
			break;
		case 6:
			newgraph(c);
			break;
		case 7:
			return 1;
		}
		system("pause");
	} // endwhile(1)

	return 1;
} // changegraph

// (14) 查询两景点间的最短路径
void shortestpath_floyd(MGraph c)
{
	// 用floyd算法求各对顶点v和w间的最短路经及其带权长度的d[v][w]。
	// 若p[v][w][u]==1;则u是v到w的当前求得的最短路经上的顶点

	int i, j, k, d[35][35], p[35][35][35];
	int v, u, w;
	for (v = 0; v < c.vexnum; v++) // 初始化各对顶点 v,w 之间的起始距离 d[v][w] 及 路径 p[v][w][] 数组
	{
		for (w = 0; w < c.vexnum; w++)
		{
			d[v][w] = c.arcs[v][w].adj;	   // d[v][w] 中存放 v 至 w 间初始权值
			for (u = 0; u < c.vexnum; u++) // 初始化最短路径 p[v][w][] 数组,第 3 个分量全部清0
				p[v][w][u] = 0;
			if (d[v][w] < Infinity) // 如果 v 至 w 间有边相连
			{
				p[v][w][v] = 1; // v 是 v 至 w  最短路径上的顶点
				p[v][w][w] = 1; // w 是 v 至 w  最短路径上的顶点
			} // if
		} // for
	} // endfor

	for (u = 0; u < c.vexnum; u++) // 求v至w的最短路径及距离。对任意顶点u,试探其是否为v至w最短路径上的顶点
	{
		for (v = 0; v < c.vexnum; v++)
			for (w = 0; w < c.vexnum; w++)
				if (d[v][u] + d[u][w] < d[v][w]) // 从 v 经 u 到 w 的一条路径更短
				{
					d[v][w] = d[v][u] + d[u][w];			   // 修改 v 至 w 的最短路径长度
					for (i = 0; i < c.vexnum; i++)			   // 修改 v 至 w 的最短路径数组。 若i是v至u的最短路径上的顶点,
						p[v][w][i] = p[v][u][i] || p[u][w][i]; // 或i是u至w的最短路径上的顶点, 则i是v至w的最短路径上的顶点
				}
	} // endfor

	printf("\n请输入出发点和目的地编号:");
	scanf("%d%d", &k, &j);
	printf("\n\n");
	while (k < 0 || k > c.vexnum || j < 0 || j > c.vexnum)
	{
		printf("\n你所输入的景点编号不存在!");
		printf("\n请重新输入出发点和目的地编号:\n\n");
		scanf("%d%d", &k, &j);
		printf("\n\n");
	}
	printf("%s", c.vexs[k].name); // 输出出发景点名称
	for (u = 0; u < c.vexnum; u++)
		if (p[k][j][u] && k != u && j != u) // 输出最短路径上中间景点名称
			printf("--->%s", c.vexs[u].name);
	printf("--->%s", c.vexs[j].name); // 输出目的地景点名称

	printf("\n\n\n总长为%d米\n\n\n", d[k][j]);

} // shortestpath_floyd

// (15) 查询景点的信息
void seeabout(MGraph c)
{
	int k;
	printf("\n请输入要查询的景点编号:");
	scanf("%d", &k);
	while (k < 0 || k > c.vexnum)
	{
		printf("\n你所输入的景点编号不存在!");
		printf("\n请重新输入:");
		scanf("%d", &k);
	}
	printf("\n\n编号:%4d\n", c.vexs[k].position);
	printf("\n\n景点名称:%10s\n", c.vexs[k].name);
	printf("\n\n介绍:%80s\n\n", c.vexs[k].introduction);

} // seeabout

// (16) 显示所有景点信息
void browsecompus(MGraph c)
{
	int i;
	printf(" \n\n编号      景点名称                  简介\n");
	printf("___________________________________________________________________________________________________________\n");

	for (i = 0; i < c.vexnum; i++)
		printf("%-10d%-25s%-80s\n", c.vexs[i].position, c.vexs[i].name, c.vexs[i].introduction);
	printf("___________________________________________________________________________________________________________\n\n");

} // browsecompus

void Readfile1(StaffList &SL, string file)
{
	ifstream ifs;
	Staff *p = SL;
	ifs.open(file.c_str());
	if (!ifs)
		return;
	while (!ifs.eof())
	{
		Staff *pt = new Staff;
		pt->next = NULL;
		ifs >> pt->Number >> pt->name >> pt->sex >> pt->age >> pt->password;
		if (ifs.eof())
			break;
		p->next = pt;
		p = pt;
	}
	ifs.close();
}

void Readfile2(BankList &BL, string file)
{
	ifstream ifs;
	Banker *p = BL;
	ifs.open(file.c_str());
	if (!ifs)
		return;
	while (!ifs.eof())
	{
		Banker *pt = new Banker;
		pt->next = NULL;
		ifs >> pt->account_num >> pt->name >> pt->sex >> pt->password >> pt->money >> pt->open_time >> pt->states;
		if (ifs.eof())
			break;
		p->next = pt;
		p = pt;
	}
	ifs.close();
}

void Menu() // 待选择系统菜单界面
{
	system("cls");
	system("color B0");
	cout << "******************************" << endl;
	cout << "|    请选择您要进入的系统    |" << endl;
	cout << "******************************" << endl;
	cout << "|1、职员管理系统             |" << endl;
	cout << "|2、客户管理系统             |" << endl;
	cout << "|3、排队管理系统             |" << endl;
	cout << "|4、网点查询系统             |" << endl;
	cout << "|0、退出系统                 |" << endl;
	cout << "******************************" << endl;
}

void Menu1() // 职员系统菜单界面
{
	system("cls");
	system("color 0E");
	cout << "******************************" << endl;
	cout << "|      银行职员管理系统      |" << endl;
	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;
}

void Menu2() // 客户系统菜单界面
{
	system("cls");
	system("color 0E");
	cout << "******************************" << endl;
	cout << "|      银行账户管理系统      |" << endl;
	cout << "******************************" << endl;
	cout << "|1、查询账户信息             |" << endl;
	cout << "|2、开户                     |" << endl;
	cout << "|3、销户                     |" << endl;
	cout << "|4、修改账户密码             |" << endl;
	cout << "|5、账户排序                 |" << endl;
	cout << "|6、存款                     |" << endl;
	cout << "|7、取款                     |" << endl;
	cout << "|8、转账                     |" << endl;
	cout << "|9、计算利息                 |" << endl;
	cout << "|10、保存账户信息            |" << endl;
	cout << "|11、显示所有账户信息        |" << endl;
	cout << "|0、退出系统                 |" << endl;
	cout << "******************************" << endl;
}

void Menu3() // 排队管理系统菜单界面
{
	system("cls");
	system("color 0E");
	cout << "******************************" << endl;
	cout << "|        排队管理系统        |" << endl;
	cout << "******************************" << endl;
	cout << "|1、VIP放号                  |" << endl;
	cout << "|2、Normal放号               |" << endl;
	cout << "|3、VIP队首完成服务          |" << endl;
	cout << "|4、Normal队首完成服务       |" << endl;
	cout << "|5、展示目前您的得分情况     |" << endl;
	cout << "|0、退出系统                 |" << endl;
	cout << "******************************" << endl;
	cout << "请选择你的操作" << endl;
}

void Menu3_2(Staff *&goal, string &realFileName) // 排队系统员工登录界面
{
	system("cls");
	system("color FD");
	string number;
	int password;	  // 输入的
	int realPassword; // 实际的
	cout << "欢迎使用排队管理系统!" << endl;
	cout << "请输入您的员工工号和密码进行登录" << endl;
	cout << "工号: ";
	cin >> number;
	StaffList SL;
	InitList1(SL);
	string fileNames[] = {"GroupA.txt", "GroupB.txt", "GroupC.txt"};
	bool found = false;
	for (const string &fileName : fileNames)
	{
		Readfile1(SL, fileName);
		Staff *p = SL->next;
		while (p)
		{
			if (p->Number == number)
			{
				found = true;
				realPassword = p->password;
				realFileName = fileName;
				goal = p;
				break;
			}
			p = p->next;
		}
		if (found)
			break;
	}
	if (!found)
	{
		cout << "工号不存在,请重新输入 " << endl;
		system("pause");
		Menu3_2(goal, realFileName);
		return;
	}

	cout << "密码: ";
	char charPassword[20]; // 用于存储密码字符数组
	int i = 0;
	char ch;
	while ((ch = _getch()) != '\r') // \r是回车键
	{
		if (ch == '\b' && i > 0) // 处理退格键
		{
			cout << "\b \b";
			--i;
		}
		else if (ch >= '0' && ch <= '9') // 只接受数字(0 - 9)
		{
			charPassword[i++] = ch;
			cout << '*';
		}
	}
	charPassword[i] = '\0';		   // 字符串结束标志
	password = atoi(charPassword); // 将字符数组转换为整数
	cout << endl;
	cout << "\n";
	if (password != realPassword)
	{
		cout << "密码不正确,请重新输入 " << endl;
		system("pause");
		Menu3_2(goal, realFileName);
		return;
	}
	cout << "登录成功!" << endl;
	cout << "正在进入 请稍后";
	Wait();
	cout << endl;
	system("cls");
}

void Menu4() // 银行网点查询系统菜单界面
{

	system("cls");
	system("color 0E");
	cout << "******************************" << endl;
	cout << "|   山财大银行网点查询系统   |" << endl;
	cout << "******************************" << endl;
	cout << "|1、学校网点介绍             |" << endl;
	cout << "|2、游览网点路线             |" << endl;
	cout << "|3、查询网点间最短路径       |" << endl;
	cout << "|4、查询网点信息             |" << endl;
	cout << "|5、更改图的信息             |" << endl;
	cout << "|6、查询景点间可行路径       |" << endl;
	cout << "|7、打印邻接矩阵             |" << endl;
	cout << "|0、退出系统                 |" << endl;
	cout << "******************************" << endl;
	cout << "请选择操作" << endl;
}

void Wait()
{
	cout << ".";
	Sleep(80);
	cout << ".";
	Sleep(80);
	cout << ".";
	Sleep(80);
	cout << " ";
	cout << ".";
	Sleep(80);
	cout << ".";
	Sleep(80);
	cout << ".";
	Sleep(80);
}
// 选择需要操作的文件
void Choice_a_file(BankList &BL, string &FileName)
{
	system("cls");
	int ch;
	system("color F0");
	cout << "1:VIP1.txt" << endl;
	cout << "2:VIP2.txt" << endl;
	cout << "3:Normal1.txt" << endl;
	cout << "4:Normal2.txt" << endl;
	cout << "5:Normal3.txt" << endl;
	cout << "0:退出" << endl;
	while (1)
	{
		cout << "请选择需要操作的文件:" << endl;
		cin >> ch;
		if (ch == 1)
		{
			FileName = "VIP1.txt";
			cout << "OK 正在进入 VIP1.txt";
			Wait();
			Readfile2(BL, "VIP1.txt");
			break;
		}
		else if (ch == 2)
		{
			FileName = "VIP2.txt";
			cout << "OK 正在进入 VIP2.txt";
			Wait();
			Readfile2(BL, "VIP2.txt");
			break;
		}
		else if (ch == 3)
		{
			FileName = "Normal1.txt";
			cout << "OK 正在进入 Normal1.txt";
			Wait();
			Readfile2(BL, "Normal1.txt");
			break;
		}
		else if (ch == 4)
		{
			FileName = "Normal2.txt";
			cout << "OK 正在进入 Normal2.txt";
			Wait();
			Readfile2(BL, "Normal2.txt");
			break;
		}
		else if (ch == 5)
		{
			FileName = "Normal3.txt";
			cout << "OK 正在进入 Normal3.txt";
			Wait();
			Readfile2(BL, "Normal3.txt");
			break;
		}
		else if (ch == 0)
		{
			cout << "好的 正在退出 请稍后";
			Wait();
			system("cls");
			cout << "已成功退出!" << endl;
			exit(0);
		}
		else
		{
			cout << "您的输入有误!\n请重新输入! " << endl;
			Sleep(1000);
			system("cls");
			system("color F0");
			cout << "1:VIP1.txt" << endl;
			cout << "2:VIP2.txt" << endl;
			cout << "3:Normal1.txt" << endl;
			cout << "4:Normal2.txt" << endl;
			cout << "5:Normal3.txt" << endl;
			cout << "0:退出" << endl;
		}
	}
}

// 选择需要操作的文件
void Choice_a_person(StaffList &SL, string &FileName)
{
	system("cls");
	int ch;
	system("color F0");
	cout << "1:GroupA.txt" << endl;
	cout << "2:GroupB.txt" << endl;
	cout << "3:GroupC.txt" << endl;
	cout << "0:退出" << endl;
	while (1)
	{
		cout << "请选择需要操作的文件:" << endl;
		cin >> ch;
		if (ch == 1)
		{
			FileName = "GroupA.txt";
			cout << "OK 正在进入 GroupA.txt";
			Wait();
			Readfile1(SL, "GroupA.txt");
			break;
		}
		else if (ch == 2)
		{
			FileName = "GroupB.txt";
			cout << "OK 正在进入 GroupB.txt";
			Wait();
			Readfile1(SL, "GroupB.txt");
			break;
		}
		else if (ch == 3)
		{
			FileName = "GroupC.txt";
			cout << "OK 正在进入 GroupC.txt";
			Wait();
			Readfile1(SL, "GroupC.txt");
			break;
		}

		else if (ch == 0)
		{
			cout << "好的 正在退出 请稍后";
			Wait();
			system("cls");
			cout << "已成功退出!" << endl;
			exit(0);
		}
		else
		{
			cout << "您的输入有误!\n请重新输入! " << endl;
			Sleep(1000);
			system("cls");
			system("color F0");
			cout << "1:GroupA.txt" << endl;
			cout << "2:GroupB.txt" << endl;
			cout << "3:GroupC.txt" << endl;
			cout << "0:退出" << endl;
		}
	}
}

void mainwork1()
{
	string FileName;
	StaffList SL;
	InitList1(SL);
	Choice_a_person(SL, FileName);
	int choice1; // 职员系统choice1
	while (1)
	{
		// 菜单调用
		Menu1();
		cout << "请选择您要进行的操作" << endl;
		cout << "(每一步操作后记得 6、保存职员信息)" << endl;
		cin >> choice1;
		switch (choice1)
		{
		case 1: // 1、查询职员信息
			SelectStaff(SL);
			break;
		case 2: // 2、入职
			AddStaff(SL);
			break;
		case 3: // 3、离职
			DeleteStaff(SL);
			break;
		case 4: // 4、修改职员信息
			Revise(SL);
			break;
		case 5: // 5、显示所有职员信息
			Display1(SL);
			break;
		case 6: // 6、保存职员信息
			Save1(SL, FileName);
			break;
		case 0: // 0、退出系统
			cout << "欢迎下次使用" << endl;
			system("pause");
			exit(0);
			break;
		default:
			break;
		}
		system("pause");
	}
}

void mainwork2()
{
	BankList BL;
	InitList2(BL);
	int choice2; // 客户系统choice2
	string FileName;
	Choice_a_file(BL, FileName); // 选择待操作文件
	while (1)
	{
		// 菜单调用
		Menu2();
		cout << "请选择您要进行的操作";
		cout << "(每一步操作后记得 10、保存账户信息)" << endl;

		cin >> choice2;
		switch (choice2)
		{
		case 1: // 1、查询账户信息
			SelectAccount(BL);
			break;
		case 2: // 2、开户
			Open_an_ccount(BL);
			break;
		case 3: // 3、销户
			Pin_households(BL);
			break;
		case 4: // 4、修改账户密码
			Modify_account_password(BL);
			break;
		case 5: // 5、账户排序
			Sort_accountInfo(BL);
			break;
		case 6: // 6、存款
			deposit(BL);
			break;
		case 7: // 7、取款
			withdrawals(BL);
			break;
		case 8: // 8、转账
			transfer(BL);
			break;
		case 9: // 9、计算利息
			Calculation_interest(BL);
			break;
		case 10: // 10、保存账户信息
			Save2(BL, FileName);
			break;
		case 11: // 11、显示所有账户信息
			Display2(BL);
			break;
		case 0: // 0、退出系统
			cout << "欢迎下次使用" << endl;
			system("pause");
			exit(0);
			break;
		default:
			break;
		}
		system("pause");
	}
}

void mainwork3()
{
	Staff *goal = new Staff; // 所登陆的账号
	string fileName;
	Menu3_2(goal, fileName); // 登录页面
	while (1)
	{
		Menu3(); // 菜单栏
		DisplayVIP();
		DisplayNormal();
		int choice3;
		cin >> choice3;
		switch (choice3)
		{
		case 1: // 1、VIP放号
			releaseVIP();
			break;
		case 2: // 2、Normal放号
			releaseNormal();
			break;
		case 3: // 3、VIP队首结束服务
			endVIPServe(goal);
			break;
		case 4: // 4、Normal队首结束服务
			endNormalServe(goal);
			break;
		case 5: // 5、展示当前分数
			DisplayScore(goal);
			break;
		case 0: // 0、退出
			cout << "欢迎下次使用" << endl;
			system("pause");
			exit(0);
		default:
			cout << "无效选择,请重新输入  " << endl;
		}
		system("pause");
	}
}

// 主要工作函数 操作区用户界面
void mainwork4()
{
	int yourchoice;
	MGraph campus = initgraph();
	while (1)
	{
		system("cls");
		Menu4();
		printf("请输入你的选择:");
		scanf("%d", &yourchoice);
		while (!(yourchoice == 1 || yourchoice == 2 || yourchoice == 3 || yourchoice == 4 || yourchoice == 5 || yourchoice == 6 || yourchoice == 7 || yourchoice == 0))
		{
			printf("输入选择不明确,请重输\n");
			scanf("%d", &yourchoice);
		}
		switch (yourchoice)
		{
		case 1:
			system("cls");
			browsecompus(campus);
			break;
		case 2:
			system("cls");
			shortestpath_dij(campus);
			break;
		case 3:
			system("cls");
			shortestpath_floyd(campus);
			break;
		case 4:
			system("cls");
			seeabout(campus);
			break;
		case 5:
			system("cls");
			changegraph(&campus);
			break;
		case 6:
			system("cls");
			allpath(campus);
			break;
		case 7:
			system("cls");
			printmatrix(campus);
			break;
		case 0:
			system("cls");
			exit(0);
			break;
		default:
			break;
		}
		system("pause");
	}
}

void MainWork()
{
	int choice_root; // 选择不同系统
	Menu();
	cin >> choice_root;
	cout << "正在进入 请稍后";
	Wait();
	switch (choice_root)
	{
	case 1: // 职员管理
		mainwork1();
		break;

	case 2: // 客户管理
		mainwork2();
		break;

	case 3: // 3、叫号系统
		mainwork3();
		break;

	case 4: // 4、网点查询系统
		mainwork4();
		break;

	case 0: // 0、退出系统
		cout << "欢迎下次使用" << endl;
		system("pause");
		break;
	default:
		break;
	}
}

int main()
{
	MainWork();
	return 0;
}
C++银行管理系统源代码 相关文章推荐: 1、C语言学生成绩管理系统源代码★★★★★ 2、C语言学籍管理系统源代码★★ 3、C语言学生成绩管理系统设计 《C语言程序设计》实训报告★★★ 4、C语言学生信息管理系统源代码★★★★ 每天都会为大家分享之前学习过程中收藏的代码,由于时间有些久了,具体作者是哪位已经记不清,如有不妥请联系删除,在此谢谢原作者的分享,帮到了很多同学。 C++银行管理系统源代码: #include<iostream> #include<fstream> #inc... 阅读详情

相关推荐

简单的纯java银行管理系统

本人写下这篇文章时也是初学者,初入贵圈,很是激动,写下此文,希望能给和我一样的初学者一些帮助,如有帮助,那就点个关注再走吧!(粘上就能跑!!重要的事情说一遍!!) 这个银行管理系统是在我刚学完面向对象的时候写的,具体功能如下: 1、开户 2、登录 3、取款 4、存款 5、查询余额 6、修改密码 7、转账 8、注销 9、销户 0、退出 /...

凯楠的博客 3万+

银行业务管理系统

1.设备:属性至少3个以上,包括并不限于设备类型、设备名称、初始状态……2.添加设备3.删除设备4.更新设备5.查找设备(名字),显示查询结果。6.分页查询7.排序在写代码地时候记得看仔细,看方法有没有被调用,我中间就出现过这样的错误,导致一直没运行成功。

m0_70156573的博客 643

C语言实现银行管理系统

C语言编写的银行管理系统关键代码 #include <stdio.h> #include <conio.h> #include <windows.h> #include <time.h> #include <string.h> #include <stdlib.h> struct bank{ char name[20]; int num; char pswd[100]; int money; }; struct bank

Strict Flora的博客 2万+

JAVA小项目-银行管理系统(图形化界面)2-开户与挂失

先上 流程图 这次编写开户界面和登录界面 其实 也没什么需要说的 制作 ,姓名,身份证号, 账户名, 密码 开户金额等信息 需要注意的是 身份证号为18位, 并且开户金额必须大于0元所以我们在事件监听时 要注意 由于 开户操作需要 进行 写入信息的处理, 我们们会验证Check 该账户是否合法或存在, 然后写入UserMessage, 在代码中调用的new Check().check2

知足常乐的博客 1万+

java小项目-银行管理系统

java小项目 银行管理系统 使用数组,面向对象 for循环 **1.银行管理系统共有四个功能 分别是:1.开户 2.存钱 3.取钱 4.退出 ** 详细运行截图 ,1,开户 账号不存在时 3.存钱 4.取钱 5.退出 下面就是银行管理系统源代码 创建AllException类 package gdgcom; public class AllException extends Exception{ private static final long serialVersionUID

weixin_50919504的博客 1278

银行系统的部分代码

银行系统代码,难得,嘿嘿,欢迎下载!

银行管理系统1.1

*后续更新,只是用作笔记,若有英雄所见略同勿喷*/用单例模式实现ManagerImpl对象的创建*/

桃李不言,下自成蹊 221

银行管理系统完整版

编写一个银行新用户现金业务办理程序,使其模拟新用户到银行办理现金存取业务时的场景。要求此场景中,要模拟出银行对用户到来的欢迎动作、对用户离开的提醒动作,以及用户的开户、存款和取款动作,在完成开户、存款和取款操作后,要提示用户的账户余额。

python实现简单银行管理系统

首先,银行管理系统通过账户来实现用户在银行中的一系列操作,而账户则分为用户个人信息User类和银行卡信息Card类 class Card: def __init__(self,cardId,passwd,balance): self.cardId = cardId self.passwd = passwd self.balance = balance self.card_lock = False class User:

qq_64875725的博客 1万+

银行管理系统代码

C#语言银行管理系统,给大家参考下,虽然写的不是很好

python 银行管理系统 实验报告及源码

使用pycharm完成银行管理系统。实现功能有存钱、取钱、注册、注销等。实验报告也是用心完成的。适合学生,一杯奶茶钱,买不了吃亏~~虽然不算最优秀,但是很适合期末作业,没有华丽的代码,但是仍然可以是85的良好!

简易银行管理系统(C语言)

简易银行管理系统(C语言)

plaaaa博客 1万+

UG/NX二次开发实战:用Python脚本批量更新100个零件参数,解放你的双手

本文详细介绍了如何利用NXOpen Python API进行UG/NX二次开发,实现批量更新100个零件参数的自动化流程。通过环境配置、框架设计、核心代码实现及性能优化,帮助工程师高效完成参数化设计任务,显著提升工作效率。

weixin_28694169的博客 276

用java实现简单的银行管理系统

用java实现简单的银行管理系统页面代码之一:mvc设计模式,分包分包图片简单效果演示:登陆主页面注册页面登录:功能页面!存款转账查看近期流水账单! 页面代码之一: package org.vector.view; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List;

Burial_DH的博客 1万+

如何理解反步法设计控制器?

假设以二阶系统为例,被控对象的系统状态方程为: 基于反步控制的具体方法如下: 1.1步骤一 定义期望状态为xd,状态误差e1,为: e1=x1-xd; 则e1的导数为: 1.2步骤二 定义虚拟控制量为: e2定义为: 1.3步骤三 定义Lyapunov能量函数为: 1.4步骤四 定义总Lyapunov能量函数为: 因此设计的控制律为: 设计c>0,则: 满足Lyapunov的稳定性判定条件...

weixin_42736130的博客 2万+

Prokka实战:10分钟搞定细菌基因组注释(附详细参数解析)

本文深入解析Prokka细菌基因组注释工具的核心参数与实战策略。通过拆解其集成化工作流程,详细解读物种分类、功能注释、输出控制等关键参数,并提供快速初筛、高质量发表、质粒注释及批量处理四种典型场景的高效参数组合方案,帮助用户精准掌控注释过程,将原始序列转化为有价值的生物学见解。

weixin_29271053的博客 442

C++银行管理系统

C++银行管理系统C++银行管理系统账户内部设置代码总结 C++银行管理系统 本文没有完整代码,想找作业的就别在这浪费时间了 最近实在是闲来无事,想着重新温习一下之前c++的一个大作业:银行管理系统,C++当时学的十分痛苦,毕竟是从面向过程到面向对象转变的过程,十分不理解为什么非要封装起来,为什么要写那么多函数来回调用,但是现在明白回来,真正在学习的痛苦的时候,那正是长知识的最快的时候。 账户内部设置 将每一个用户账户封装为对象,其中包括账号、密码、余额等,还有获得密码设置密码账户等的方法,后续还可以拓展更

braylon_zhang的博客 6479

NU1680无线充电接收器在TWS耳机中的应用实战:I2C调压与QI协议适配

本文详细解析了NU1680无线充电接收器在TWS耳机充电仓设计中的应用实战。重点阐述了其无固件设计、I2C接口动态调压功能如何解决不同QI协议发射器的兼容性难题,并分享了硬件设计、PCB布局、与发射端联调及安全测试等关键环节的实践经验,助力开发者快速实现稳定高效的无线充电方案。

weixin_28432777的博客 231
上一篇: B树的性质和插入过程
下一篇: 常见的排序算法过程和比较分析
ByteMaster_
博客等级 码龄3年 328粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值