一个简单的银行叫号系统: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;
}
}
}