面向对象程序设计 第16题 简单的银行叫号系统

一个简单的银行叫号系统:c++面向对象程序设计实习课的第三类题目第十六题。

原本的题目要求如下(在原本的题目上些许改动)

某银行因为业务量太大,需要开发一个实用的银行叫号系统,该系统能够实现银行叫号排队的功能,凡是取号、排队,被叫号的才能进行相关的业务处理,该系统能够实现以下基本功能:
(1)定义一个号码类,该类别至少包含序号、业务类型等信息成员,并包含取号、排队、叫号等相应的功能。
(2)能够生成一个排队的序列号,并能告知当前用户,还有多少能在等待
(3)能够统计出当天一共有多少人排队
(4)能够在任意时刻输出当前队列当前的排队情况
(5)能够按照先后关系,将队列中队头的序列号输出,即相当于处理该业务,也就是出队
(6)其他功能可根据需要自行扩充,并请在课程设计报告中详细说明!
在这题里面我用了vector容器来放vip和非vip的序号。

也尝试过用结构体,和纯类去做,感觉结构体是最简单的,但是用vector自己感觉是最好理解的。
顺便说一下自己在写这个用到有关vector的知识吧。

vector是向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

2.动态数组 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。

3.能够感知内存分配器的(Allocator-aware) 容器使用一个内存分配器对象来动态地处理它的存储需求。

1.vector < int > v1:创建一个空vector
2.push_back 在数组的最后添加一个数据
3.pop_back 去掉数组的最后一个数据
4.at 得到编号位置的数据
5.begin 得到数组头的指针
6.end 得到数组的最后一个单元+1的指针
7.empty 判断vector是否为空

8.迭代器的定义vector< int >::iterator iter;

#include <iostream>
#include <string>
#include <vector> //用容器来区分vip和非vip的序号
#include <sstream>//用来连接字符串
#include <algorithm>//查找vector容器里的元素 用于showN()
using namespace std;
int ment;

static vector <string> v1; //vip序号容器
static vector <string> v2;//非vip序号容器


class No						 //序号类
{
public:
	void get();	  //取号
	void show();//显示排队
	void call();  //叫号
	void showN();//个人之前还有多少人
private:
	static int number;   //序号
	static int kind;    //业务类型	
};

//初始化 number和业务类型
int No::number = 0;
int No::kind=0;

//取号功能(产生序号,排队,显示序号)
void No::get()
{
L1:  {                  //设置返回点
	string flag1;
	string s1,s="-VIP",sk[4]={"-00","-01","-10","-11"}; //定义vip和业务类型
	
	ostringstream oss;
	number++;
	ment++;
	
	cout<<"\t\t\t\t您的号码马上就会产生,在那之前"<<endl;
	cout<<"\t\t\t\t请问您是J.Bank的VIP客户吗?\n\t\t\t\t○1.是的\n\t\t\t\t○2.不是\n\t\t\t\t○3.取消取号,返回菜单\n\t\t\t\t";//判断是否是VIP
	cin>>flag1;
	if(flag1=="1"||flag1=="2")
	{
		cout<<"\t\t\t\t好的,请问您要办理什么业务呢?"<<endl;//判断办理的业务种类
		cout<<"\t\t\t\t○1.个人金融业务"<<endl;
		cout<<"\t\t\t\t○2.公司企业金融业务"<<endl;
		cout<<"\t\t\t\t○3.房地产金融业务"<<endl;
		cout<<"\t\t\t\t○4.个国际金融业务"<<endl;
		cout<<"\t\t\t\t○5.返回上一选项"<<endl;
		cout<<"\t\t\t\t○6.返回主菜单\n\t\t\t\t";
	
		cin>>kind;
		if(kind>=1&&kind<=4)
		{
			cout<<"\t\t\t\t您好,你的号码是";
			oss<<number<<sk[kind-1];	//将序号和业务种类号连接并显示起来
			cout<<oss.str();
	
			if(flag1=="1")	//vip 连接,存放并显示vip序号
			{
				oss<<s;	
				v1.push_back(oss.str());
				cout<<s<<endl;
				cout<<"\t\t\t\t您前方还有"<<v1.size()-1<<"位在等待";
				cout<<",拿好您的序号,等待叫号~~"<<endl;
				cout<<"******************************************************************************************************"<<endl;
			}
			if(flag1=="2")	//非vip 存放非vip序号
			{
				v2.push_back(oss.str());
				cout<<"\n\t\t\t\t您前方还有"<<v1.size()+v2.size()-1<<"位在等待";
				cout<<",拿好您的序号,等待叫号~~"<<endl;
				cout<<"******************************************************************************************************"<<endl;
			}
		}
		else if(kind==5)//返回选择vip选项
		{
			number--;
			ment--;
			goto L1;
		}
		else if(kind==6)//业务种类选项中的 返回主菜单
		{
			cout<<"******************************************************************************************************"<<endl;
			cout<<"\t\t\t\t*****Welcome to J.Bank*****\n"<<endl;
			cout<<"\t\t\t\t● 1> 办理业务"<<endl;
			cout<<"\t\t\t\t● 2> 查询排队详情"<<endl;
			cout<<"\t\t\t\t● 3> 叫号功能"<<endl;
			cout<<"\t\t\t\t● 4> 今日排队总数"<<endl;
			number--;
			ment--;
		}
		else//办理业务选择输入不符合规则
		{
			cout<<"\t\t\t\t您输入的不是我想要的哦~"<<endl;
			number--;
			ment--;
		}
	}
	else if(flag1=="3")//vip选项里的 返回主菜单
	{
		number--;
		ment--;
		cout<<"******************************************************************************************************"<<endl;
		cout<<"\t\t\t\t*****Welcome to J.Bank*****\n"<<endl;
				cout<<"\t\t\t\t● 1> 办理业务"<<endl;
				cout<<"\t\t\t\t● 2> 查询排队详情"<<endl;
				cout<<"\t\t\t\t● 3> 叫号功能"<<endl;
				cout<<"\t\t\t\t● 4> 今日排队总数"<<endl;
				cout<<"\t\t\t\t● 5> 查询目前排名"<<endl;
				cout<<"\t\t\t\t● 6> 关闭取号、叫号机"<<endl;
	}
	else//VIP选项里 输入不符合规则
	{
		cout<<"\t\t\t\t你输入的不是我想要的哦~"<<endl;
		cout<<"\t\t\t\t您现在想要?\n\t\t\t\t○1.返回选择 \n\t\t\t\t○2.返回主菜单\n\t\t\t\t";
			cin>>flag1;
			if(flag1=="1")
			{
				number--;
				ment--;
				goto L1;
			}
			else
			{
				cout<<"\t\t\t\t*****Welcome to J.Bank*****\n"<<endl;
				cout<<"\t\t\t\t● 1> 办理业务"<<endl;
				cout<<"\t\t\t\t● 2> 查询排队详情"<<endl;
				cout<<"\t\t\t\t● 3> 叫号功能"<<endl;
				cout<<"\t\t\t\t● 4> 今日排队总数"<<endl;
				number--;
				ment--;
			}
	}}
}
//叫号
void No::call()
{
	vector<string>::iterator iter1=v1.begin();//设置迭代器iteri指向各自的容器第一元素
	vector<string>::iterator iter2=v2.begin();
	if(!v1.empty())//因为vip的优先级,所以先检测vip容器内是否为空
		{
			cout<<"\t\t\t\t请"<<*iter1<<"到前台办理业务!"<<endl;
			iter1=v1.erase(iter1);//删除指向元素
		}
	else if(!v2.empty())
		{
			cout<<"\t\t\t\t请"<<*iter2<<"到前台办理业务!"<<endl;
			v2.erase(iter2);
		}
	else if(v1.empty()||v2.empty())
		cout<<"\t\t\t\t当前没有等待客户哦~~"<<endl;
	cout<<"******************************************************************************************************"<<endl;

}

//显示当前排队功能
void No::show()
{
	unsigned int flag=0,i;
	if(v1.size()+v2.size()==0)//无人等待
	{
		cout<<"\t\t\t\t当前没有客户在等待"<<endl;
	}
	else
	{
		cout<<"\t\t\t\t当前排队的情况是:"<<endl;
		if(v1.size()==0)
		{
			cout<<"\t\t\t\tVIP客户:\n\t\t\t\t无"<<endl;//因为VIP客户的优先级所以先显示VIP客户
		}
		else{
			cout<<"\t\t\t\tVIP客户:"<<endl;
			for( i=0;i<v1.size();i++)
			{
				cout <<"\t\t\t\t○"<< v1[i] <<endl;
			}
		}
		if(v2.size()==0)
		{
			cout<<"\t\t\t\t普通客户:\n\t\t\t\t无"<<endl;//显示普通客户排队情况
		}
		else{
			cout<<"\t\t\t\t普通客户:"<<endl;
			for(i=0;i<v2.size();i++)
			{
				cout<<"\t\t\t\t○" <<v2[i]<<endl;
			}
		}}
	cout<<"******************************************************************************************************"<<endl;
}

void No::showN()//查看当前自己的排名
{
	int n;
	string s1="VIP",s2,flag;
	ostringstream oss;

L:	cout<<"\t\t\t\t请问您是J.Bank的VIP客户吗?\n\t\t\t\t○1.是的\n\t\t\t\t○2.不是\n\t\t\t\t○3.取消查看,返回菜单\n\t\t\t\t";//设置一个查找不到的返回点
	cin>>flag;
	if(flag=="1")//vip 用户查找
	{
		cout<<"\t\t\t\t请问您的序号上的第一组数据是:\n\t\t\t\t";
		cin>>n;
		cout<<"\t\t\t\t请问您的序号上的第二组数据是:\n\t\t\t\t";
		cin>>s2;
		oss<<n<<"-"<<s2<<"-"<<s1;//明确要寻找的序号
		vector<string>::iterator iter1=find(v1.begin(),v1.end(),oss.str());//查找到目标元素,用iter指向记录
		if(iter1!=v1.end())
		{
		int i=distance(v1.begin(),iter1);//得到元素位置
		cout<<"\t\t\t\t亲爱的VIP客户,您前方还有"<<i<<"个人在等待"<<endl;
		cout<<"******************************************************************************************************"<<endl;
		}
		else
		{
			cout<<"\t\t\t\t亲爱的VIP客户,您可能输错了哦,我找不到呢"<<endl;
		cout<<"******************************************************************************************************"<<endl;
		}
	}
	else if(flag=="2")//非VIP用户查找
		{
			cout<<"\t\t\t\t请问您的序号上的第一组数据是:\n\t\t\t\t";
			cin>>n;
			cout<<"\t\t\t\t请问您的序号上的第二组数据是:\n\t\t\t\t";
			cin>>s2;
			oss<<n<<"-"<<s2;//明确要寻找的序号
			vector<string>::iterator iter2=find(v2.begin(),v2.end(),oss.str());//查找到目标元素,用iter指向记录
		if(iter2!=v2.end())
		{
		int i=distance(v2.begin(),iter2);//得到元素位置
		cout<<"\t\t\t\t亲爱的VIP客户,您前方还有"<<i+v1.size()<<"个人在等待"<<endl;
		cout<<"******************************************************************************************************"<<endl;
		}
		else
		{
			cout<<"\t\t\t\t亲爱的VIP客户,您可能输错了哦,我找不到呢"<<endl;
		cout<<"******************************************************************************************************"<<endl;
		}
	}
		else if(flag=="3")//vip选项选择回主菜单
		{
				cout<<"******************************************************************************************************"<<endl;
				cout<<"\t\t\t\t*****Welcome to J.Bank*****\n"<<endl;
				cout<<"\t\t\t\t● 1> 办理业务"<<endl;
				cout<<"\t\t\t\t● 2> 查询排队详情"<<endl;
				cout<<"\t\t\t\t● 3> 叫号功能"<<endl;
				cout<<"\t\t\t\t● 4> 今日排队总数"<<endl;
				cout<<"\t\t\t\t● 5> 查询目前排名"<<endl;
				cout<<"\t\t\t\t● 6> 关闭取号、叫号机"<<endl;
		}
		else//VIP选择不符合条件
		{
			cout<<"\t\t\t\t亲爱的客户,您选择错误,再选择一遍吧"<<endl;
			goto L;
		}
}


void rule()//叫号器的功能使用说明
{
	cout<<"\t\t\t\t*****Welcome to J.Bank*****\n"<<endl;
	cout<<"\t\t\t\t● 1> 办理业务"<<endl;
	cout<<"\t\t\t\t● 2> 查询排队详情"<<endl;
	cout<<"\t\t\t\t● 3> 叫号功能"<<endl;
	cout<<"\t\t\t\t● 4> 今日排队总数"<<endl;
	cout<<"\t\t\t\t● 5> 查询目前排名"<<endl;
	cout<<"\t\t\t\t● 6> 关闭取号、叫号机"<<endl;
}
int main()
{
	rule();
	while(1)
	{
		No no;
		cout<<"\t\t\t\t您需要本行什么服务?(按0召唤J.Bank菜单)\n\t\t\t\t";
		string n;
		cin>>n;
		if(n>="0"&&n<="5")
		{
			if(n=="1")
			{
				no.get();
				n="7";
			}
			if(n=="2")
			{
				no.show();
				n="7";
			}
			if(n=="3")
			{
				no.call();
				n="7";
			}
			if(n=="0")
			{
				rule();
				n="7";
			}
			if(n=="4")
			{
				cout<<"\t\t\t\t今天来J.Bank排队的有"<<ment<<"个"<<endl;
			cout<<"******************************************************************************************************"<<endl;
				n="7";
			}
			if(n=="5")
			{
				no.showN();
				n="7";
			}
		}
		else if(n=="6")	//关机密码
		{
			cout<<"\t\t\t\t请输入关机密码\n\t\t\t\t";
			cin>>n;
			if(n=="888888")
				return 0;
			else
			{
				cout<<"\t\t\t\t只有正确的密码才能让我休息哦"<<endl;
				cout<<"******************************************************************************************************"<<endl;
			}
		}
		else
		{
			cout<<"\t\t\t\t你输入的不是我想要的哦~"<<endl;
			cout<<"******************************************************************************************************"<<endl;
		}
	}
}



猜你喜欢

转载自blog.csdn.net/qq_43349548/article/details/105800703