c++ 语言下的 银行排队系统问题
银行叫号系统Visual C ++程序源代码
主函数:#include "stdafx.h"#include "Queue.h"#include "stdio.h"int main(int argc, char* argv[]){Queue s;s.q[0] = 0; // 让入队的第一个数取数值1int a=1, b=0 ,d=1 ,e=0;char c;while(a) // 运用switch实现选择{printf("顾客要号请输入A \n要提示下一位下一位顾客的号码请输入B \n 要显示等待的人数请输入C\n结束循环请输入D \n ");c= getchar();while(getchar()!='\n') continue ;switch(c){case 'A':;case 'a':// 顾客要号之后让元素入队s.addQ();b = s.getQ();printf("顾客要的号码为:%d\n", b);break;case 'B ': ;case'b':// 删除队首元素即显示要来办理业务的顾客d = s.delQ();printf("请%d号客户前来柜台办理业务\n", d);case 'C ':;case 'c':// 显示等待的人数e = s.number();printf("等待的总人数为:%d\n", e);break;case 'D' :;case 'd':// 结束循环c=0;break;default:printf("输入错误!\n");}}printf("Hello World!\n");return 0;}队列的建立:(类)Queue.h#if !defined(AFX_QUEUE_H__BA389AF8_C207_4C3E_8A7F_99499FBBA143__I NCLUDED_)#defineAFX_QUEUE_H__BA389AF8_C207_4C3E_8A7F_99499FBBA143__INCLUDED _#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define M 1000class Queue // 定义队列名{public:Queue();void initialQ();int emptyQ (); // 定义队空int getQ(); // 取队首元素int addQ(); // 入队int delQ(); // 出队int number(); // 统计队列元素数目int q[M]; // 定义数组qint front; //定义队首元素int rear ; //定义队尾元素virtual ~Queue();};#endif// !defined(AFX_QUEUE_H__BA389AF8_C207_4C3E_8A7F_99499FBBA143__I NCLUDED_)Queue.cpp:// Queue.cpp: implementation of the Queue class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "Queue.h"#define M 1000//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////Queue::Queue(){front = 0;rear = 0;}int Queue::emptyQ() //初始化队列{return front == rear;}int Queue::getQ() // 取队首元素{if(rear+1==front)return 0;else{int item;item=q[rear];return item;}}int Queue::addQ() // 入队{if((rear+1)%M==front)return 0;else{q[rear+1] = q[rear] + 1 ; // 每次入队依次使入队元素的值加1,即表示顾客叫号依次递增rear ++; //实现循环return 1;}}int Queue::delQ() //删除队首元素{if((front ==rear))return 0;else{int item;front=(front+1)%M;item=q[front];return item;}}int Queue:: number() // 统计队列元素的数目{int item;item = q[rear] - q[front];return item;}Queue::~Queue(){}。
C语言课程设计:银行排队系统
#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <conio.h>#include <time.h>#define n 3int vip1=0;int y,z;float sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;float i1=0,i2=0,i3=0,i4=0,i5=0;float ave1=0,ave2=0,ave3=0,ave4=0,ave5=0;struct List{int A[n+1]; //顾客用来办理业务的N个窗口int len; //表示数组中的元素个数}L;struct Lnode{ //链表结点类型int data;Lnode *next;};struct Linkqueue{ //链式存储的等候队列的类型定义Lnode *front;Lnode *rear;}Q;void Initshuzu() //初始化线性的算法{for(int i=1;i<=n;i++)L.A[i]=0; //元素值为0,表示编号为I的窗口当前状态为空L.len=0;}void Initqueue() //初始化队列的算法{Q.front=Q.rear=(Lnode *)malloc(sizeof(Lnode));Q.front->next=NULL; //k1}void Enqueue(Linkqueue *Q,int elem) //进队算法{Lnode *s;s=(Lnode *)malloc(sizeof(Lnode));s->data=elem; //k2s->next=NULL; //k3Q->rear->next=s; //k4Q->rear=s; //k5}int Dlqueue(Linkqueue *Q) //出队算法{Lnode *t;int x;if(Q->front==Q->rear){printf("队列为空!\n");exit(1);}else{t=Q->front->next;Q->front->next=t->next; //k6x=1; //k7free(t); //k8return x;}}void printl() //输出数组算法{int i;printf("正在办理业务的顾客编号为:一号柜台二号柜台三号柜台\n");printf(" ");for( i=1;i<=L.len;i++){printf("%d号客户",L.A[i]);}printf("\n");}void print2() //输出队列算法{ int i=0;printf("正在等候办理业务的顾客编号为:");Lnode *s=Q.front->next;while(s!=NULL){printf("%d ",s->data);s=s->next; //k9i++;}printf("\n您的前面一共有%d人在排队,请您稍候!",i);printf("\n");void daoda(int x) //解决顾客到达事件算法{int i=L.len+1;if (L.len<n) //{ L.A[i]=x;i++;L.len++;}elseEnqueue(&Q,x);}void likai(int x) //解决顾客离开事件算法{int i=0;do{if(x>L.len){printf("输入有误!\n请重新输入:");scanf("%d",&x);}elsefor(i=0;i<=L.len;i++){if(i==x){printf("尊敬的%d号顾客您好!\n",x);L.A[i]=0;L.len--;if(Q.front!=Q.rear){int y=Dlqueue(&Q);L.A[i]=y;L.len++;}}}}while(i==0);}int guitai( ) //判断输入的柜台号是否正确int y=0;printf("请输入你所办理业务的柜台号(1-3):\n");scanf("%d",&y);if(y<1||y>5){printf("你输入的柜台号有误,请重新输入!\n");printf("请输入你所办理业务的柜台号(1-3):\n");scanf("%d",&y);}elseprintf(" 你所办理业务的柜台为%d.\n",y);return y;}int pingfeng( ) //判断输入的分数是否正确{int y=0;printf("请输入你评分(1-5):\n 1分…………非常不满意;\n 2分…………比较不满意;\n 3分…………一般满意;\n 4分…………比较满意;\n 5分…………非常满意。
优先级队列银行排队问题c语言编写
优先级队列银行排队问题c语言编写下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!优先级队列银行排队问题C语言编写1. 引言在银行等服务行业,客户经常需要排队等待服务。
银行预约排队系统(数据结构问题)
数据类型定义: 1、数组的结构体定义: struct List{ int A[n+1]; //顾客用来办理业务的N个窗口 int len; //表示数组中的元素个数 }L; 2、链表节点的结构体定义: struct Lnode{ //链表结点类型 int data; Lnode *next; }; 3、链式存储的的结构体定义 struct Linkqueue{ //链式存储的等候队列的类型定义 Lnode *front; Lnode *rear; }Q;
在本设计中,设计的主要工作 围绕着事件表进行,按照一定的规 则把事件加入事件表或从事件表中 取出事件,并根据事件的类型、事 件发生的时间来调度程序的运行. 作业在进行排队时,也需要队列表 来保持作业的属性。 为便于事件表和队列的实现, 本设计中使用的数据结构主要是循 环队列,并采用带有头尾标志的数 组来实现循环队列。
预约排队系统
第三小组: 孙鹏飞——问题分析 朱思敏——结构算法 周华毅——代码实现
问题分析:(孙鹏飞)
排队系统的背景: 预约排队问题在我们的现实生活中广泛存在,大到如银行排队叫号 系统、医院门诊挂号系统、火车票预售订购系统等,小到餐饮消费、交 通出行、购物付款等。 也许你会想这些问题十分简单,不就是排队吗?按照先来后到的秩 序就OK了呗,有什么好讨论的。可事实却并非如此!试想如果考虑到银 行客户的VIP身份、医院就诊患者的病况、订票人员是否为老人军人或残 疾人等特殊情况,先来后到的秩序还适用吗? 再者,传统的排队观念都是一个队伍排成“长龙”,当人数过多时, 考虑到效率问题,就要改变排成多只队伍,那多只队伍同时开工又该如 何处理呢?可见预约排队问题并非想象中那么简单,研究它也具有一定 的 现实意义! 鉴于实际情况,我们小组本次讨论课就选取银行排队叫号系统作为 讨论主题,来研究预约排队系统。其它预约排队问题则大同小异,基本 处理方法可以效仿解决之。
银行业务系统等待队列
目录一、实验问题描述-------------------------2二、实验需求分析-------------------------3三、软件概要设计-------------------------4四、软件详细设计-------------------------5五、编码与调试分析----------------------14六、程序运行操作说明--------------------15七、测试结果----------------------------16八、课程设计心得体会--------------------18九、自主学习参考文献--------------------19一、实验问题描述:本课程设计的目的就是要达到能够灵活运用程序设计基础所讲授内容,能够针对一个需求比较明确的小型软件,设计合理的解决方案,并能够用编程语言转化为可执行程序,以解决实际问题。
进一步掌握开发一个小型实用软件系统的基本步骤和方法、进一步培养良好的编程习惯、提升学习能力,熟练掌握数据结构中所学知识,并加以运用到实际软件开发中去,掌握调试代码的基本方法,通过调试找出BUG出现的地方以及原因,并运用正确的方法进行DEBUG。
设银行有四个服务窗口,一个等待队列, 每个窗口均可以办理存款、取款、挂失、还贷业务,每种业务所需的服务时间不同,客户到达银行后,先到打号机上打号,号票上包括到达时间、编号和需要办理的业务,然后在银行内等候, 当任一服务窗口空闲时,处理等候客户中排在最前面的客户的业务。
写一个上述银行业务的模拟系统,通过模拟方法求出客户在银行内逗留的平均时间和每个窗口办理的客户数及办理的每种业务数。
基本要求:每个客户到达银行的时间和需要办理的业务随机产生,输出一天客户在银行的平均逗留时间和每个窗口每天办理的客户数和每种业务数。
提高要求:设计图形用户界面,模拟中国银行真实的打号机操作界面,当用户选择一种业务后,要提示用户排在前面的人数。
队列解决银行叫号问题
用队列解决银行排队叫号软件的编程一.实验目的掌握队列的逻辑结构及顺序存储结构和链式存储结构。
熟练运用C语言实现队列的基础操作。
灵活运用队列解决实际问题。
二.实验内容用队列解决银行排队叫号软件的编程,主要要求如下:程序运行后,当看到“请点击触摸屏获取号码:”的提示时,只要按任意键,即可显示“您的号码是:xxx,你的前面有YYY位”的提示,其中xxx是所获得的服务号码,YYY是在xxx之前来的正在等待服务的人数。
用多线程技术模拟服务窗口(可模拟多个),具有服务员工呼叫顾客的行为,假设每个顾客服务的时间是10000ms,时间到后,显示“请xxx号到ZZZ号窗口!”的提示。
其中ZZZ是即将为客户服务的窗口号。
三.实验代码IQueue接口代码:using System;namespace QueueDs{interface IQueue<T>{void EnQueue(T elem); //入队列操作T DeQueue(); //出队列操作T GetFront(); //取对头元素int GetLength(); //求队列的长度bool IsEmpty(); //判断队列是否为空void Clear(); //清空队列bool IsFull();//判断是否为满,在顺序队列中实现该算法,在链式队列中代码实现为空}}IBankQueue接口代码:using System;namespace QueueDs{interface IBankQueue:IQueue<int>{int GetCallnumber();//获得服务号码}}顺序队列代码:using System;namespace QueueDs{publicclass CSeqQueue<T>:IQueue<T>{privateint maxsize; //循环顺序队列的容量private T[] data; //数组,用于存储循环顺序队列中的数据元素privateint front; //指示最近一个己经离开队列的元素所占的位置privateint rear; //指示最近一个进行入队列的元素的位置//索引器public T this[int index]{get{return data[index];}set{data[index] = value;}}//容量属性publicint Maxsize{get{return maxsize;}set{maxsize = value;}}//队头指示器属性publicint Front{get{return front;}set{front = value;}}//队尾指示器属性publicint Rear{get{return rear;}set{rear = value;}}//初始化队列public CSeqQueue() { }public CSeqQueue(int size){data = new T[size];maxsize = size;front = rear = -1;}//入队操作publicvoid EnQueue(T elem){if (IsFull()){Console.WriteLine("Queue is full"); return;}rear=(rear + 1) % maxsize; ; data[rear] = elem;}//出队操作public T DeQueue(){if (IsEmpty()){Console.WriteLine("Queue is empty"); returndefault(T);}front = (front + 1) % maxsize;return data[front];}//获取队头数据元素public T GetFront(){if (IsEmpty()){Console.WriteLine("Queue is empty!");returndefault(T);}return data[(front+1)%maxsize];}//求循环顺序队列的长度publicint GetLength(){return (rear - front + maxsize) % maxsize;}//判断循环顺序队列是否为满publicbool IsFull(){if((front == -1 && rear == maxsize - 1) || (rear + 1) % maxsize == front) {returntrue;}else{returnfalse;}}//清空循环顺序队列publicvoid Clear(){front = rear = -1;}//判断循环顺序队列是否为空publicbool IsEmpty(){if (front == rear){returntrue;}elsereturnfalse;}}}}银行顺序队列代码:using System;using System.Threading;namespace QueueDs{//银行叫号顺序队列类class CSeqBankQueue:CSeqQueue<int>,IBankQueue{privateint callnumber;//记录系统自动产生的新来顾客的服务号//叫号属性publicint Callnumber{get{return callnumber;}set{callnumber = value;}}public CSeqBankQueue (){}public CSeqBankQueue(int size):base(size){}//获得服务号码publicint GetCallnumber(){if ((IsEmpty()) && callnumber == 0)callnumber = 1;elsecallnumber++;return callnumber;}}//服务窗口类class ServiceWindow{IBankQueue bankQ;public IBankQueue BankQget{return bankQ;}set{bankQ = value;}}publicvoid Service(){while (true){Thread.Sleep(10000);if (!bankQ.IsEmpty()){Console.WriteLine();lock (bankQ){Console.WriteLine("请{0}号到{1}号窗口!", bankQ.DeQueue(), );}}}}}}编写银行排队叫号软件主程序class BankQueueApp{publicstaticvoid Main(){IBankQueue bankQueue=null;Console.Write("请选择存储结构的类型:1.顺序队列 2.链队列:"); char seleflag = Convert.ToChar(Console.ReadLine());switch (seleflag){/*初始化顺序队列*/case'1':int count;//接受循环顺序队列的容量Console.Write("请输入队列可容纳人数:");count = Convert.ToInt32(Console.ReadLine());bankQueue = new CSeqBankQueue(count);break;/*初始化链队列*/case'2':bankQueue = new LinkBankQueue();break;}int windowcount =3;//设置银行柜台的服务窗口数。
使用C++实现银行排队叫号系统
使⽤C++实现银⾏排队叫号系统模拟20秒的输出结果--------模拟开始--------初始化⽤户:普通客户进⼊排队,编号:1000VIP客户进⼊排队, 编号:1001普通客户进⼊排队,编号:1002普通客户进⼊排队,编号:1003VIP客户进⼊排队, 编号:1004VIP客户进⼊排队, 编号:1005VIP客户进⼊排队, 编号:1006对公客户进⼊排队, 编号:1007普通客户进⼊排队,编号:1008VIP客户进⼊排队, 编号:1009普通客户编号为: 1000 请进⼊0号普通窗⼝服务普通客户编号为: 1002 请进⼊1号普通窗⼝服务普通客户编号为: 1003 请进⼊2号普通窗⼝服务VIP客户编号为: 1001 请进⼊3号VIP窗⼝服务对公客户编号为: 1007 请进⼊4号对公窗⼝服务-当前模拟时间:0s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007-当前模拟时间:1s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007-当前模拟时间:2s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007VIP客户进⼊排队, 编号:1010-当前模拟时间:3s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007对公客户进⼊排队, 编号:1011-当前模拟时间:4s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007对公客户进⼊排队, 编号:1012-当前模拟时间:5s -窗⼝号:0 -等待服务-窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007普通客户编号为: 1008 请进⼊0号普通窗⼝服务普通客户进⼊排队,编号:1013-当前模拟时间:6s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1008窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007普通客户编号为: 1013 请进⼊1号普通窗⼝服务普通客户进⼊排队,编号:1014-当前模拟时间:7s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1008窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1013窗⼝号:2 -等待服务-窗⼝号:3 -等待服务-窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007普通客户编号为: 1014 请进⼊2号普通窗⼝服务VIP客户编号为: 1004 请进⼊3号VIP窗⼝服务普通客户进⼊排队,编号:1015-当前模拟时间:8s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1008窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1013窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1014窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007VIP客户进⼊排队, 编号:1016-当前模拟时间:9s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1008窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1013窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1014窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -等待服务-对公客户编号为: 1011 请进⼊4号对公窗⼝服务VIP客户进⼊排队, 编号:1017-当前模拟时间:10s -窗⼝号:0 -等待服务-窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1013窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1014窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户编号为: 1015 请进⼊0号普通窗⼝服务普通客户进⼊排队,编号:1018-当前模拟时间:11s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1015窗⼝号:1 -等待服务-窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1014窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户编号为: 1018 请进⼊1号普通窗⼝服务VIP客户进⼊排队, 编号:1019-当前模拟时间:12s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1015窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1018窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户进⼊排队,编号:1020-当前模拟时间:13s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1015窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1018窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户编号为: 1020 请进⼊2号普通窗⼝服务普通客户进⼊排队,编号:1021-当前模拟时间:14s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1015窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1018窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1020窗⼝号:3 -等待服务-窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011 VIP客户编号为: 1005 请进⼊3号VIP窗⼝服务对公客户进⼊排队, 编号:1022-当前模拟时间:15s -窗⼝号:0 -等待服务-窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1018窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1020窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户编号为: 1021 请进⼊0号普通窗⼝服务对公客户进⼊排队, 编号:1023-当前模拟时间:16s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1021窗⼝号:1 -等待服务-窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1020窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011 VIP客户进⼊排队, 编号:1024-当前模拟时间:17s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1021窗⼝号:1 -等待服务-窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1020窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011对公客户进⼊排队, 编号:1025-当前模拟时间:18s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1021窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -等待服务-对公客户编号为: 1012 请进⼊4号对公窗⼝服务对公客户进⼊排队, 编号:1026-当前模拟时间:19s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1021窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1012 VIP客户进⼊排队, 编号:1027-当前模拟时间:20s -窗⼝号:0 -等待服务-窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1012普通客户进⼊排队,编号:1028源代码#include<iostream>#include<stdlib.h>#include<time.h>#include<queue>#include<Windows.h>using namespace std;class User{public:int userID;int type;//0为普通⽤户,1为VIP⽤户,2为对公⽤户.User() { type = 0; userID = 1000; }User(int t, int id) { userID = id, type = t; }};class BankWindow{public:int id;//0,1,2,为普通窗⼝,3为VIP窗⼝,4为对公窗⼝.bool isBusy;User client;int serviceStartTime=0;BankWindow() { isBusy = false; }BankWindow(int i) { id = i; isBusy = false; }};class Simulater{private:int serviceTime[3] = {4,6,8};int initID = 1000;BankWindow bankWindow0;BankWindow bankWindow1;BankWindow bankWindow2;BankWindow bankWindow3;BankWindow bankWindow4;queue<User> NormalUserQueue, VIPUserQueue, OfficialUserQueue;public:Simulater(){bankWindow0.id = 0;bankWindow1.id = 1;bankWindow2.id = 2;bankWindow3.id = 3;bankWindow4.id = 4;srand(unsigned(time(0)));}void enterQueue(User user){if (user.type == 0){cout << "普通客户进⼊排队,编号:" <<erID<< endl;NormalUserQueue.push(user);}else if(user.type==1){cout << "VIP客户进⼊排队, 编号:"<<erID<<endl;VIPUserQueue.push(user);}else if (user.type == 2){cout << "对公客户进⼊排队, 编号:" <<erID<< endl;OfficialUserQueue.push(user);}else{cout << "⽤户类型出错!";}}void output(User user){if (user.type == 0){cout << "普通客户 " << "编号为: " << erID;}else if (user.type == 1){cout << "VIP客户 " << " 编号为: " << erID;}else if (user.type == 2){cout << "对公客户 " << "编号为: " << erID;}else{cout << "⽤户类型错误!" << endl;}}void output2(User user){if (user.type == 0){cout << " 客户类型: " << "普通 "<< "客户编号: " << erID;}else if (user.type == 1){cout << " 客户类型: " << "VIP " << "客户编号: " << erID; }else if (user.type == 2){cout << " 客户类型: " << "对公 " << "客户编号: " << erID; }else{cout << " ⽤户类型错误!" << endl;}}void enterWindow(int time){if (bankWindow0.isBusy == false && !NormalUserQueue.empty()) {bankWindow0.client = NormalUserQueue.front();output(bankWindow0.client);cout<<" 请进⼊0号普通窗⼝服务" << endl;bankWindow0.isBusy = true;bankWindow0.serviceStartTime = time; NormalUserQueue.pop();}if (bankWindow1.isBusy == false && !NormalUserQueue.empty()) {bankWindow1.client = NormalUserQueue.front();output(bankWindow1.client);cout << " 请进⼊1号普通窗⼝服务" << endl;bankWindow1.isBusy = true;bankWindow1.serviceStartTime = time; NormalUserQueue.pop();}if (bankWindow2.isBusy == false && !NormalUserQueue.empty()) {bankWindow2.client = NormalUserQueue.front();output(bankWindow2.client);cout << " 请进⼊2号普通窗⼝服务" << endl;bankWindow2.isBusy = true;bankWindow2.serviceStartTime = time; NormalUserQueue.pop();}if (bankWindow3.isBusy == false){if (!VIPUserQueue.empty()){bankWindow3.client = VIPUserQueue.front();bankWindow3.isBusy = true;bankWindow3.serviceStartTime = time;VIPUserQueue.pop();}else if (!NormalUserQueue.empty()){bankWindow3.client = NormalUserQueue.front(); bankWindow3.isBusy = true;bankWindow3.serviceStartTime = time; NormalUserQueue.pop();}else{}output(bankWindow3.client);cout << " 请进⼊3号VIP窗⼝服务" << endl;}if (bankWindow4.isBusy == false){if (!OfficialUserQueue.empty()){bankWindow4.client = OfficialUserQueue.front(); bankWindow4.isBusy = true;bankWindow4.serviceStartTime = time; OfficialUserQueue.pop();}else if (!NormalUserQueue.empty()){bankWindow4.client = NormalUserQueue.front(); bankWindow4.isBusy = true;bankWindow4.serviceStartTime = time; NormalUserQueue.pop();}else {}output(bankWindow4.client);cout << " 请进⼊4号对公窗⼝服务" << endl;}}void display(int time){cout << "-当前模拟时间:" << time << "s -" << endl;windowCondition(bankWindow0);windowCondition(bankWindow1);windowCondition(bankWindow2);windowCondition(bankWindow3);windowCondition(bankWindow4);}void customerEnter(){int type = rand() % 12;//不同概率⽣成⽤户.if (type >= 0 && type <= 5){User u(0, initID);enterQueue(u);}if (type >= 6 && type <= 9){User u(1, initID);enterQueue(u);}if (type >= 10 && type <= 11){User u(2, initID);enterQueue(u);}initID++;}void windowCondition(BankWindow bankWindow){cout << "窗⼝号:" << bankWindow.id<<" ";if (bankWindow.isBusy == true){cout << "-正在服务-";output2(bankWindow.client);}else{cout << "-等待服务-";}cout << endl;}void isBusy(int time)//扫描⼀遍窗⼝,检测服务是否结束{if (bankWindow0.isBusy == true){if (time - bankWindow0.serviceStartTime >= serviceTime[bankWindow0.client.type]) {bankWindow0.isBusy = false;}}if (bankWindow1.isBusy == true){if (time - bankWindow1.serviceStartTime >= serviceTime[bankWindow1.client.type]) {bankWindow1.isBusy = false;}}if (bankWindow2.isBusy == true){if (time - bankWindow2.serviceStartTime >= serviceTime[bankWindow2.client.type]) {bankWindow2.isBusy = false;}}if (bankWindow3.isBusy == true){if (time - bankWindow3.serviceStartTime >= serviceTime[bankWindow3.client.type]) {bankWindow3.isBusy = false;}}if (bankWindow4.isBusy == true){if (time - bankWindow4.serviceStartTime >= serviceTime[bankWindow4.client.type]) {bankWindow4.isBusy = false;}}}void simulate(){int time = 0;cout << "--------模拟开始--------" << endl;cout << "初始化⽤户:" << endl;for (int i = 0; i < 10; i++){customerEnter();}enterWindow(time);while (1){display(time);enterWindow(time);isBusy(time);if (time/2 != 0){customerEnter();//没间隔两秒进⼊⼀位客户. }Sleep(1000);time++;if (time == 21){getchar();}}}};int main(){Simulater simulater;simulater.simulate();}。
c课课程设计银行排队系统
c课课程设计银行排队系统一、教学目标本节课的教学目标是让学生了解并掌握银行排队系统的原理和实现方法,培养学生的编程能力和问题解决能力。
具体来说,知识目标包括了解银行排队系统的原理和组成,掌握相关编程语言和工具的使用;技能目标包括能够独立设计和实现一个简单的银行排队系统,提高学生的编程能力和问题解决能力;情感态度价值观目标包括培养学生的团队合作意识和积极进取精神,激发学生对计算机科学和软件工程的兴趣。
二、教学内容本节课的教学内容主要包括银行排队系统的原理、组成和相关编程语言和工具的使用。
具体来说,首先介绍银行排队系统的原理和组成,让学生了解银行排队系统的基本概念和作用;然后讲解相关编程语言和工具的使用,如Java和Python,让学生掌握实现银行排队系统的基本方法;最后通过案例分析和实践操作,让学生独立设计和实现一个简单的银行排队系统。
三、教学方法为了达到本节课的教学目标,采用多种教学方法相结合的方式进行教学。
首先,采用讲授法向学生讲解银行排队系统的原理和组成,让学生掌握基本概念和作用;其次,采用讨论法引导学生进行问题讨论和解决方案的设计,培养学生的问题解决能力和团队合作意识;然后,采用案例分析法让学生分析实际案例,了解银行排队系统的应用场景和实现方法;最后,采用实验法让学生独立设计和实现一个简单的银行排队系统,提高学生的编程能力和实践能力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,准备了一系列的教学资源。
教材方面,选择《计算机科学导论》和《软件工程导论》等教材,为学生提供理论知识的支持;参考书方面,推荐《Java编程思想》和《Python编程:从入门到实践》等书籍,为学生提供实践指导;多媒体资料方面,制作了相关的PPT和教学视频,为学生提供直观的学习资源;实验设备方面,准备了计算机和网络设备,为学生提供实践操作的平台。
通过这些教学资源的准备,丰富学生的学习体验,提高学生的学习效果。
五、教学评估为了全面、客观地评估学生的学习成果,本节课采用多种评估方式相结合。
数据结构_银行排队问题
数据结构_银行排队问题数据结构_银行排队问题一、问题描述银行每天都会出现很多客户需要办理业务,在银行大厅中排队等待。
为了提高客户的满意度和效率,需要设计一个自动化的排队系统,以使客户能够更加顺利地办理业务。
二、问题分析1·客户需要按照业务类型进行排队,例如存款、取款、办理贷款等。
2·客户进入排队系统后,应该按照先来先服务原则进行排队。
3·银行可能会有多个窗口同时服务客户,客户应该优先选择空闲窗口进行办理。
4·当窗口完成一个客户的业务后,需要从排队队列中选择下一个客户进行服务。
在这个过程中,需要考虑客户的优先级和业务类型。
三、算法设计1·银行窗口的模拟●使用一个数组来表示银行的窗口,每个窗口有一个状态表示该窗口是否空闲。
●使用一个队列来表示客户的排队队列。
●客户进入排队系统时,根据业务类型选择一个空闲窗口,并将客户加入队列。
●当窗口完成一个客户的业务后,从队列中选择下一个客户进行服务。
2·优先级调度算法●每个客户会有一个优先级,表示其重要程度或特殊需求。
●在选择下一个客户时,优先考虑优先级高的客户。
●如果有多个优先级相同的客户,则按照先来先服务原则选择。
四、代码实现以下是一个示例的伪代码实现:```// 定义客户结构体struct Customer {int id。
// 客户IDstring type。
// 业务类型int priority。
// 优先级}。
// 定义银行窗口数组和客户队列Window[] windows。
Queue<Customer> customerQueue。
// 初始化银行窗口和客户队列void init() {// 初始化窗口for (int i = 0。
i < NUM_WINDOWS。
i++) { windows[i]·status = FREE。
}}// 客户进入队列void enqueueCustomer(Customer c) {customerQueue·push(c)。
数据结构——银行排队系统模拟(C语言)
数据结构——银⾏排队系统模拟(C语⾔)程序最终⽬的:获得所有客户在银⾏营业期间停留的平均时间程序初始值:默认第⼀个⽤户到达的时间为(0,0)#include <stdio.h>#include <stdlib.h>#include <time.h>/**使⽤队列模拟银⾏排队系统,并计算客户在银⾏停留的平均时间*问题1:银⾏已到达关闭时间,但是还有客户正在窗⼝处理问题(涉及到客户离开事件)*问题2:功能还未完全测试。
*问题3:代码未优化*version1:随机数版本(使⽤随机数产⽣客户数据)*待完成版本:数组版本(version);⽂件版本(version)*/#define USE_TIME 30 //客户在银⾏停留的最⼤时间#define NEXT_TIme 5 //下⼀个客户到达的最⼤间隔时间typedef struct E_list //有序表结点{int cur_time; /*记录当前时间*/int E_type; /*记录事件类型*/struct E_list* next; /*指针域*/} E_List,*EvenList;typedef struct Q_node //队列结点{int arrive_time; /*记录客户达到时间*/int dur_time; /*记录客户在银⾏停留时间*/struct Q_node* next; /*指针域*/} Q_Node,*QueueNode;typedef struct E_queue //队列操作结构{QueueNode front; /*指向队⾸元素*/QueueNode rear; /*指向队尾元素*/int length; /*记录队列长度*/} E_queue,*Win_Queue;int totalTime; /*记录总时间*/int allcustomer; /*记录客户数量*/int closetime; /*设置关闭时间*/E_List ev; //有序表头节点E_queue e_q[4]; //窗⼝队列操作结构void enter_List(EvenList new_E) //进⼊有序表{EvenList agent = ev.next; //代理指针指向第⼀个元素EvenList pre_E =&ev; //代理指针指向头结点while(agent!=NULL && (new_E->cur_time > agent->cur_time)) //找到元素的插⼊位置{pre_E = agent;agent = agent->next;}if(agent == NULL) /*插⼊到表尾*/{pre_E->next = new_E;}else /*插⼊到⾮表尾位置*/{new_E->next = agent;pre_E->next = new_E;}agent = ev.next;while(agent!=NULL) /*进⾏表的遍历*/{printf("(%d,%d)\n",agent->cur_time,agent->E_type);agent = agent->next;}printf("\n\n");}void out_List(EvenList Event) //出有序表{/*记录待删除结点的数据后,释放该结点*/EvenList temp = ev.next;Event->cur_time = temp->cur_time;Event->E_type = temp->E_type;Event->next = NULL;ev.next = temp->next; //出有序表节点printf("%p\n",temp->next); //测试语句printf("待处理客户:(%d , %d)\n",temp->cur_time,temp->E_type); /*测试语句*/free(temp); /*释放待删除结点*/}void en_Queue(Win_Queue q, QueueNode new_node) //进⼊指定队列{/*将元素加⼊到队列末尾,并增加队列长度*/q->rear->next = new_node;q->rear = new_node;q->length++;}void DeQueue(Win_Queue q,QueueNode node) //出队列{/*记录待出队列结点的数据,释放该结点后,队列长度减⼀*/QueueNode temp = q->front->next;q->front->next = temp->next;q->length--; /*队列长度减⼀*//*存储待删除结点的数据*/node->arrive_time = temp->arrive_time;node->dur_time = temp->dur_time;node->next = NULL;}void openforday() //初始化数据{int i;EvenList temp;QueueNode temp_q;totalTime = 0; /*初始化时间记录器*/allcustomer = 0; /*初始化顾客记录器*/closetime = 5; /*初始化银⾏关闭时间*/temp = (EvenList)malloc(sizeof(E_List));if(temp == NULL){printf("memory is failure!\n");exit(1);}temp->cur_time = 0;temp->E_type = 0;temp->next = NULL;ev.next = temp; /*将第⼀个客户数据(0,0,)加⼊到事件表*/for(i=0; i<4; i++) //为每⼀个窗⼝队列设置头节点{temp_q = (QueueNode)malloc(sizeof(Q_Node));if(temp_q == NULL){printf("memory allocate is failure!\n");exit(1);}temp_q->next = NULL;e_q[i].front = temp_q;e_q[i].rear = temp_q;e_q[i].length = 0; /*初始化队列长度*/}}void Even_head(EvenList E) //得到有序表的第⼀个客户{/*获得事件表第⼀个元素的副本*/E->cur_time = ev.next->cur_time;E->E_type = ev.next->E_type;E->next = NULL;}void arrive_Event() //处理客户到达事件{/***系统产⽣两个随机数(x,y),x表⽰当前窗⼝type = 0的⽤户在银⾏的停留时间*y表⽰下⼀个客户与上⼀个客户的间隔时间。
银行排队系统c课程设计
银行排队系统c课程设计一、课程目标知识目标:1. 学生能理解银行排队系统的基本概念,掌握其工作原理和关键功能。
2. 学生能运用C语言实现银行排队系统的基本功能,包括顾客入队、出队、查询排队人数等。
3. 学生了解并掌握结构体、链表等C语言知识点在银行排队系统中的应用。
技能目标:1. 学生能够运用所学知识,独立设计并编写银行排队系统的C语言程序。
2. 学生通过课程学习,提高编程能力,培养解决问题的策略和技巧。
3. 学生能够运用调试工具,对银行排队系统程序进行调试和优化。
情感态度价值观目标:1. 学生在课程学习过程中,培养对编程的兴趣和热情,形成积极的学习态度。
2. 学生通过小组合作完成课程设计,增强团队协作意识和沟通能力。
3. 学生通过解决实际问题,体验编程带来的成就感,培养自信心和创新能力。
课程性质:本课程设计为实践性课程,强调理论联系实际,培养学生动手能力和编程思维。
学生特点:学生已具备C语言基础知识,具有一定的编程能力,但对复杂问题的解决策略尚需引导。
教学要求:教师需引导学生运用所学知识解决实际问题,关注学生在课程学习中的个体差异,提高学生的编程能力和综合素质。
在教学过程中,将课程目标分解为具体的学习成果,便于后续教学设计和评估。
二、教学内容1. 理论知识:- 银行排队系统基本原理及流程- C语言结构体和链表相关知识- 函数调用、指针运用及模块化编程2. 实践操作:- 编写顾客入队、出队等基本功能模块- 设计链表数据结构,实现排队系统的数据存储和操作- 编程实现银行排队系统主程序,整合各功能模块3. 教学大纲:- 第一周:银行排队系统基本原理学习,回顾C语言结构体和链表知识- 第二周:编写顾客入队、出队等基本功能模块,学习模块化编程方法- 第三周:设计链表数据结构,实现数据存储和操作,编写系统主程序- 第四周:调试、优化银行排队系统程序,进行课程总结和评价4. 教材章节:- 《C语言程序设计》第十章:结构体与共用体- 《C语言程序设计》第十二章:链表- 《C语言程序设计》第八章:函数与模块化编程教学内容确保与课程目标紧密结合,注重理论与实践相结合,培养学生的动手能力和编程思维。
c++版模拟银行窗口排队叫号系统
c++版模拟银行窗口排队叫号系统c++版模拟银行窗口排队叫号系统看了两位LZ的银行排队系统blog,感觉不错,就也产生了用C++写个排号系统,原因有二,1、对Java不太熟悉,没有看太懂。
2、练练手。
3、提高一下C++的人气。
进入主题:对于这一块的业务系统需求没有做过多的分析,只在两位LZ的基础做了小小的改动,然后用C++实现。
题目:模拟实现银行业务调度系统逻辑,具体需求如下:银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP 窗口。
有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
异步随机生成各种类型的客户,生成各类型用户的概率比例为:VIP客户:普通客户:快速客户= 1 :6 :3。
客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
各类型客户在其对应窗口按顺序依次办理业务。
当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
修改:1、在这里为了简化程序的设计(只省了只行代码),FAST和VIP窗口只办理对应的客户,不办普通客户的业务。
2、由于对于客户的到来,也采用1S来一个的做法,但因为在console程序对于时间不太好控制,在这里只是设定了客户数,即每个1秒来一个客户,根据来的客户数控制时间。
开发环境:Linux代码:文件constances.h该文件中定义了一些常量,其中MAX_WAITING_CLIENT_NUM指的是,最多正在等待的客户数,如果客户数到达最大,后来的客户将会离开。
银行排队系统
银行排队系统1、编程实现一个“银行排队模拟系统” 思想:程序等待标准输入,若检测到有标准输入,则创建对应的进程。
如果目前等待态的进程个数等于座位数,在门外等待(即放入消息队列等待创建);若目前阻塞的进程个数小于座位数则进程阻塞。
与此同时,检测等待态的进程个数小于座位数,消息队列中存在消息,则从消息队列中取出一条消息,同时创建一个新进程。
本程序使用信号量进行进程间通信,使用消息队列存储从stdin输入的消息。
设置一信号量,标示大厅中座位。
设置一消息队列,标示在门外等待。
本程序,没有实现,老师所说的,“窗口进程”。
只是在主控进程中,对S3,S4进行了操作来实现与子进程的通信。
相当于,主控进程作为一个窗口进程,来处理各个客户进程。
由于,想要做到,在同一时间,主控进程最多只有两个子进程(客户进程)在执行,其他的都在阻塞状态,因此,本程序,将S3的初始值设置为21) 该程序模拟客户到银行取号-排队-被叫号-被服务的过程; 2) 程序执行流程如下:Step1: 客户到达银行,并从取号机取号;Step2: 如果大厅中有空闲座位,则座下等待,否则,在大厅外等待;Step3: 银行职员如果发现有客户等待,则依次叫号服务,否则休息;Step4: step1-step4重复执行 3) 大厅中座椅数量为20个; 4) 服务窗口为2个;5) “客户到来”通过命令行输入客户名字模拟;6) 为了模拟实际情况,每个客户服务时间不小于20秒,可随机确定;7) 程序顺序列出不同窗口服务客户的:名称,窗口号,服务时间 2、提示1) 需一个主控进程,随时监控客户到来,并为之创建进程; 2) 取号机应视为互斥型临界资源 3) 座椅应视为临界资源4) 客户等待及被叫号应视为进程间同步过程主控进程(serve.c)执行流程图:客户端进程(client.c)执行流程图:需求分析:本系统,没有实现,窗口进程,最初目的在于,保证在同一时间,父进程即主控进程最多具有2个子进程在执行。
习题8.2银行排队问题之单队列多窗口加VIP服务(30分)--C语言
习题8.2银⾏排队问题之单队列多窗⼝加VIP服务(30分)--C语⾔解题思路:1、普通客户到来:从编号最⼩的窗⼝开始查看是否有空闲窗⼝1)如果有空闲窗⼝,若此时空闲窗⼝刚好是VIP窗⼝,则看⼀下队列⾥⾯是否有已经到来的VIP客户,如有,则让该VIP插队2)如果没有空闲窗⼝,则寻找最先完成的窗⼝,若最先完成的窗⼝也是VIP,同理也要看⼀下队列⾥是否有VIP已经到来,如有,则让VIP 插队2、VIP客户到来:⾸先查看VIP窗⼝是否空闲,如空闲,则直接办理,若不空闲,则寻找最快完成窗⼝(这⾥要注意的是:VIP窗⼝的优先级排在普通窗⼝之前)#include <stdio.h>#include <string.h>typedef struct {int t,p,flag;} Queue;Queue Q[1010];void ChkVip(int start,int end,int sum) {int i,pos;for(i=start; i<end; i++) {if(Q[i].flag==1&&Q[i].t<sum) {//查看是否有VIP客户已经在等待pos=i;break;}}if(i<end) {//VIP客户插队Queue tmp=Q[pos];for(i=pos-1; i>=start; i--) {Q[i+1]=Q[i];}Q[start]=tmp;}}int main() {int n,i,min;scanf("%d",&n);int front=0,rear=0;for(i=0; i<n; i++) {scanf("%d %d %d",&Q[rear].t,&Q[rear].p,&Q[rear].flag);if(Q[rear].p>60)Q[rear].p=60;rear++;}int k,c;scanf("%d %d",&k,&c);int sum[k],winnum[k];memset(sum,0,sizeof(sum));memset(winnum,0,sizeof(winnum));int SWT=0,WT=0,LWT=0;while(front<rear) {if(Q[front].flag==0) {//队头是普通客户min=0;for(i=0; i<k; i++) {//查找空闲窗⼝if(Q[front].t>=sum[i]) {//此时⽆需等待if(i==c)//当前空闲窗⼝是VIP窗⼝,则查找此时是否有Vip客户已经到时来,若vip已经到来,则将vip插队上来ChkVip(front,n,sum[i]);sum[i]=Q[front].t+Q[front].p;front++;winnum[i]++;break;}if(sum[i]<sum[min])min=i;}if(i==k) {//已经到来在等待if(min==c)//当前空闲窗⼝是VIP窗⼝,则查找此时是否有Vip客户已经到时来,若vip已经到来,则将vip插队上来ChkVip(front,n,sum[min]);WT=sum[min]-Q[front].t;if(WT>LWT)LWT=WT;SWT+=WT;sum[min]+=Q[front].p;front++;winnum[min]++;}} else {//队头是VIP客户if(Q[front].t>=sum[c]) {//查找此时是否有VIP窗⼝空闲 sum[c]=Q[front].t+Q[front].p;winnum[c]++;front++;} else {min=c;for(i=0; i<k; i++) {//查找最快完成窗⼝if(sum[i]<sum[min])min=i;}if(Q[front].t>=sum[min])//⽆需等待sum[min]=Q[front].t+Q[front].p;else {//需等待WT=sum[min]-Q[front].t;if(WT>LWT)LWT=WT;SWT+=WT;sum[min]+=Q[front].p;}front++;winnum[min]++;}}}int LFT=0;for(i=0; i<k; i++) {if(sum[i]>sum[LFT])LFT=i;}printf("%.1lf %d %d\n",(double)SWT/n,LWT,sum[LFT]); for(i=0; i<k; i++) {if(i>0)printf("");printf("%d",winnum[i]);}return0;}。
C语言编写 银行取票排队系统
【程序要求】:1、银行有多个客服窗口。
2、程序能记录客户到达银行的顺序。
当一位客户取票时,能提示该客户前面有几位客户等待。
3、当为客户服务时,提示客户要到哪个窗口。
4、优先为VIP客户服务,服务完VIP客户才为普通客户服务。
当有多位VIP客户时,按照他们的取票顺序进行服务。
5、提供每一位客户的等待时间和服务时间。
除了按要求完成了老师的要求外,我还增加加了一些其他功能。
程序源代码有详细的注释(不敢确定没有错误哦,大家参考一下),所以就做详细介绍了,大家自己看吧。
【源代码】:#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>#include<time.h>#include<windows.h>//可调用beep()函数,发声#define minqueuesize(5)//定义队列的最小容量#define allwin(5)//宏定义窗口数目前是5#define n(100)//宏定义队列容量目前为100#define t(100)//指定time_t类型数组的大小如果取票人数超过100程序就会出错暂时没找到解决办法/****************************************/struct queuerecord;typedef struct queuerecord*queue;//宏定义用queue定义的变量是?typedef int elementtype;typedef char idtype;//定义客户卡号的数据类型采用字符型/***************************************/queue createqueue(int maxelements);//函数声明int isempty(queue q);int isfull(queue q);void makeempty(queue q);void enqueue(queue q);void hugemenu();//getvip()需调用此函数所以在这里声明一下不容易出错void servicelogin();//密码登陆客服系统void service();//无密码登陆客服系统void call();//客服呼叫客户客服要输入值班窗口号void callfree(int mywin);//窗口为空闲时呼叫客户客服不用再输入值班窗口号elementtype dequeue(queue q);/****************************************/int num=0;//客户编号变量全局变量queue vip,nor;//定义2个队列一个存普通客户,一个存vip客户int win[allwin+1]={0};//用数组下标表示窗口号,元素值表示窗口状态,值为0表示空闲,值1表示忙碌。
银行排队叫号系统C++
#include <iostream>#include <queue>#include <stdlib.h>#include <stdio.h>#include <time.h>#include <ctime>#include "windows.h"using namespace std;int AverageTime;//平均时间void DisplayWindows(int presenttime,int seringtime, int unittime){cout<<"************模拟银行叫号系统*************"<<endl;cout<<"***********银行服务时间0--"<<seringtime<<"************"<<endl;cout<<"**该叫号系统每隔"<<unittime<<"单位时间显示窗口信息****"<<endl;cout<<"当前时间为"<<presenttime<<""<<endl;}class Customer/*顾客信息*/{public:Customer(){SerTime=0;enterTime=0;startTime=0;cID=0;endTime=0;}void Reset(){SerTime=0;enterTime=0;startTime=0;cID=0;endTime=0;}Customer(const Customer& anthercustomer)//复制构造函数{enterTime=anthercustomer.enterTime;startTime=anthercustomer.startTime;servDurance=anthercustomer.servDurance;SerTime=anthercustomer.SerTime;cID=anthercustomer.cID;endTime=anthercustomer.endTime; }void SetSevTime(int serT){SerTime=serT;}int GetID(){return cID;}int GetEndTime(){return endTime;}int GetStartTime(){return startTime;}int GetSerDurance()//顾客等待时间{return (startTime-enterTime);}int GetSerTime(){return SerTime;}void SetEnterTime(int enterT){enterTime=enterT;}void SetEndTime(int endT){endTime=endT;}void SetID(int ID){cID=ID;}void SetSartTime(int startT){startTime=startT;}int enterTime,startTime,SerTime,servDurance,cID,endTime;};class Bank{public:void ResetBank(){while(!servingcustomer.empty())servingcustomer.pop();while(!waitingcustomer.empty())waitingcustomer.pop();}bool Assign(Customer customer)//判断服务窗口有没有完成服务{if(customer.GetEndTime()-customer.GetStartTime()==customer.GetSerTime())return true;elsereturn false;}void DisplayWaitingTime(queue<Customer> quecus){AverageTime=0;cout<<"顾客及等待时间:"<<endl;while(!quecus.empty()){cout<<"顾客"<<quecus.front().GetID()<<": "<<quecus.front().GetSerDurance()<<" ";AverageTime+=quecus.front().GetSerDurance();quecus.pop();}cout<<endl;}queue<Customer> GetCustomerQueue(queue<Customer> queuec){queue<Customer> temp;while(!queuec.empty()){temp.push(queuec.front());queuec.pop();}return temp;queue<Customer> servingcustomer;queue<Customer> waitingcustomer;};int main(){Bank Bank1;Bank1.ResetBank();queue<Customer> CustomerTrack;queue<Customer> CustomerTrack2;Customer ser1,ser2,ser3,ser4,ser5;int num[5]={0};srand((unsigned) time(0));//播种子const int TimeSlot=100;//假设服务时间段为0-100const int UnitTime=10;//单位时间为10const int ServTime=7;//服务时间为1-7const int UnitTimePeo=10;//单位时间进来的人数为0-9const int StopEnterTime=80;//为了保证所有顾客能完成服务,顾客进入的时间为0-80 int PresentTime=0;//初始化当前时间为0int PerTime=5;//每隔5秒显示一次窗口信息int NumberOfCustomer=0;int TimeOfServing=0;int IDtrack=0;while(PresentTime<TimeSlot){Customer tempCustomer;NumberOfCustomer=rand()%UnitTimePeo;for(int j=0; j<NumberOfCustomer;j++){tempCustomer.SetID(++IDtrack);TimeOfServing=1+rand()%ServTime;tempCustomer.SetSevTime(TimeOfServing);tempCustomer.SetEnterTime(PresentTime);Bank1.waitingcustomer.push(tempCustomer);}int nnn=0;for(int t=0;t<UnitTime+nnn;t++){if(Bank1.Assign(ser1))//窗口1完成{if(ser1.GetID()!=0)CustomerTrack.push(ser1);ser1.Reset();if(!Bank1.waitingcustomer.empty()){ser1=Bank1.waitingcustomer.front();ser1.SetSartTime(PresentTime);ser1.SetEndTime(PresentTime);Bank1.waitingcustomer.pop();Bank1.servingcustomer.push(ser1);num[0]++;}}else{ser1.SetEndTime(PresentTime);}if(Bank1.Assign(ser2))//窗口2完成{if(ser2.GetID()!=0)CustomerTrack.push(ser2);ser2.Reset();if(!Bank1.waitingcustomer.empty()){ser2=Bank1.waitingcustomer.front();ser2.SetSartTime(PresentTime);ser2.SetEndTime(PresentTime);Bank1.waitingcustomer.pop();Bank1.servingcustomer.push(ser2);num[1]++;}}else{ser2.SetEndTime(PresentTime);}if(Bank1.Assign(ser3))//窗口3完成{if(ser3.GetID()!=0)CustomerTrack.push(ser3);ser3.Reset();if(!Bank1.waitingcustomer.empty()){ser3=Bank1.waitingcustomer.front();ser3.SetSartTime(PresentTime);ser3.SetEndTime(PresentTime);Bank1.waitingcustomer.pop();Bank1.servingcustomer.push(ser3);num[2]++;}}else{ser3.SetEndTime(PresentTime);}if(Bank1.Assign(ser4))//窗口4完成{if(ser4.GetID()!=0)CustomerTrack.push(ser4);ser4.Reset();if(!Bank1.waitingcustomer.empty()){ser4=Bank1.waitingcustomer.front();ser4.SetSartTime(PresentTime);ser4.SetEndTime(PresentTime);Bank1.waitingcustomer.pop();Bank1.servingcustomer.push(ser4);num[3]++;}}else{ser4.SetEndTime(PresentTime);}if(Bank1.Assign(ser5))//窗口5完成{if(ser5.GetID()!=0)CustomerTrack.push(ser5);ser5.Reset();if(!Bank1.waitingcustomer.empty()){ser5=Bank1.waitingcustomer.front();ser5.SetSartTime(PresentTime);ser5.SetEndTime(PresentTime);Bank1.waitingcustomer.pop();Bank1.servingcustomer.push(ser5);num[4]++;}}else{ser5.SetEndTime(PresentTime);}if(PresentTime%PerTime==0){CustomerTrack2=Bank1.GetCustomerQueue(Bank1.servingcustomer);system("cls");DisplayWindows(PresentTime,TimeSlot,PerTime);/*显示窗口1-5的服务ID*/cout<<endl;cout<<"**当前时间窗口服务的顾客的ID,0为没有顾客**"<<endl;cout<<"窗口1的ID:"<<ser1.GetID()<<" ";cout<<"窗口2的ID:"<<ser2.GetID()<<" ";cout<<"窗口3的ID:"<<ser3.GetID()<<" ";cout<<"窗口4的ID:"<<ser4.GetID()<<" ";cout<<"窗口5的ID:"<<ser5.GetID()<<endl;/*显示正在等待的顾客的数量*/cout<<"正在等待的顾客的数量:"<<Bank1.waitingcustomer.size()<<endl;cout<<endl;Bank1.DisplayWaitingTime(CustomerTrack2);Sleep(2000);}PresentTime++;if(PresentTime==80)nnn=20;}}int TotalNum=0;for(int rr=0;rr<5;rr++){cout<<"窗口"<<rr+1<<"服务顾客数量:"<<num[rr]<<endl;TotalNum+=num[rr];}cout<<"顾客平均等待时间为:"<<static_cast<double>(AverageTime)/static_cast<double>(TotalNum)<<endl;system("pause");return 0;}。
数据结构_银行排队问题
/*某银行营业厅共有6个营业窗口,设有排队系统广播叫号,该银行的业务分为公积金、银行卡、理财卡等三种。
公积金业务指定1号窗口,银行卡业务指定2、3、4号窗口,理财卡业务指定5、6号窗口。
但如果5、6号窗口全忙,而2、3、4号窗口有空闲时,理财卡业务也可以在空闲的2、3、4号窗口之一办理。
客户领号、业务完成可以作为输入信息,要求可以随时显示6个营业窗口的状态。
*/1.源程序#include<stdio.h>#include<stdlib.h>#define MAXSIZE 10;typedef struct Peo{struct Peo *next;}PeoNode;typedef struct{PeoNode *head;PeoNode *rear;int length;}LQueueBank;LQueueBank InitQueue(LQueueBank *W){W->length = 0;W->head = (PeoNode *)malloc(sizeof(PeoNode));if(W->head!=NULL){W->head->next=NULL;W->rear=W->head;}return *W;}void InLCK(LQueueBank *A, LQueueBank *B,LQueueBank *C){if(B->length < 2){B->length++;printf("办理中\n");}else if(C->length < 3){C->length++;printf("办理中\n");}else{printf("请等待\n");A->length++;A->rear = A->rear->next;}}void InGJJ(LQueueBank *A, LQueueBank *B){if(B->length < 1){B->length++;printf("办理中\n");}else{printf("请等待\n");A->length++;A->rear = A->rear->next;}}void InYHK(LQueueBank *A, LQueueBank *B){if(B->length < 3){B->length++;printf("办理中\n");}else{printf("请等待\n");A->length++;A->rear = A->rear->next;}}void Leave(LQueueBank *A, LQueueBank *B,LQueueBank *C,LQueueBank *D,LQueueBank *E,LQueueBank *F){printf("请输入离开用户所在窗口\n");int yw;scanf("%d",&yw);switch(yw){case 1:{A->rear = A->head;A->length--;if(D->length > 0) {printf("请等待办理公积金的第一位用户来窗口1办理\n");InGJJ(D,A);}break;}case 2:case 3:case 4:{B->rear = B->head->next->next;B->length--;if(E->length > 0){printf("请等待办理银行卡的第一位用户来窗口%d办理\n",yw);InYHK(E,B);}else if (F->length > 0) {printf("请等待办理理财卡的第一位用户来窗口%d办理\n",yw);InLCK(F,C,B);}break;}case 5: case 6:{C->length--; C->rear = C->head->next;if(F->length > 0) InLCK(F,C,B);printf("请等待办理理财卡的第一位用户来窗口%d办理\n",yw);break;}default: printf("输入有误,请重试!\n");}}void PRINT(LQueueBank *A, LQueueBank *B,LQueueBank *C){if(A->length == 0) printf("1号窗口空闲中\n");else printf("1号窗口忙碌中\n");if(B->length == 0) printf("2号窗口空闲中\n3号窗口空闲中\n4号窗口空闲中\n");else if(B->length == 1) printf("2号窗口忙碌中\n3号窗口空闲中\n4号窗口空闲中\n");else if(B->length == 2) printf("2号窗口忙碌中\n3号窗口忙碌中\n4号窗口空闲中\n");else if(B->length == 3) printf("2号窗口忙碌中\n3号窗口忙碌中\n4号窗口忙碌中\n");if(C->length == 0) printf("5号窗口空闲中\n6号窗口空闲中\n");else if(C->length == 1) printf("5号窗口忙碌中\n6号窗口空闲中\n");else if(C->length == 2) printf("5号窗口忙碌中\n6号窗口忙碌中\n");}void main(){LQueueBank Wait1,Wait2,Wait3,Busy1,Busy2,Busy3; //1:公积金2:银行卡3:理财卡Wait1 = InitQueue(&Wait1);Wait2 = InitQueue(&Wait2);Wait3 = InitQueue(&Wait3);Busy1 = InitQueue(&Busy1);Busy2 = InitQueue(&Busy2);Busy3 = InitQueue(&Busy3);int ch = 0;while(1){printf("----------------------------------\n");printf("1. 办理业务");printf("2. 完成离开");printf("3. 退出");printf("0. 打印当前窗口状态\n");while(1){scanf("%d",&ch);if(ch>=0&&ch<=3) break;elseprintf("\n输入有误,请重试!");}switch(ch){case 0:{PRINT(&Busy1,&Busy2,&Busy3);break;}case 1:{printf("请输入业务种类1/2/3\n");printf("1. 公积金2. 银行卡3. 理财卡\n");int yw1;scanf("%d",&yw1);switch(yw1){case 1: {InGJJ(&Wait1,&Busy1);break;}case 2: {InYHK(&Wait2,&Busy2);break;}case 3: {InLCK(&Wait3,&Busy3,&Busy2);break;}default: printf("输入有误,请重试!\n");}break;}case 2:{Leave(&Busy1,&Busy2,&Busy3,&Wait1,&Wait2,&Wait3);break;}case 3:exit(0);default: break;}}}2.运行窗口截图:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
/*计算等待时间*/
void getwait()
{
wait=(time3*60+time4)-(f.time1*60+f.time2);
}
};
/*判断用户应该到那个窗口办理业务*/
int min(window p1,window p2)
{
if((p1.time3*60+p1.time4)<=(p2.time3*60+p2.time4))
}
/*确定窗口下次业务工作时间*/
win[j].time3=win[j].time3+(win[j].f.time+win[j].time4)/60;
win[j].time4=(win[j].f.time+win[j].time4)%60;
}
win0<<"办理的客户数目为:"<<win[0].count<<endl;
{
count=save=fetch=loss=repay=time3=time4=0;
}
/*累计各种业务办理的数目*/
void add()
{
switch(*f.oper)
{
case 's':save++;break;
case 'f':fetch++;break;
case 'l':loss++;break;
case 'r':repay++;break;
}
}
void worktime()
{
if((time3*60+time4)<=(f.time1*60+f.time2))
{
time3=f.time1;
time4=f.time2;
win1<<"办理的客户数目为:"<<win[1].count<<endl;
win1<<"取款业务数目:"<<win[1].fetch<<endl;
win1<<"挂失业务数目:"<<win[1].loss<<endl;
win1<<"还贷业务数目:"<<win[1].repay<<endl;
}
};
/*建立银行窗口类,记录票据所有内容以及业务办理时间,同时计算办理类型总数*/
class window
{
public:
fare f;
int time3,time4;
int count,save,fetch,loss,repay;
int wait;
window()
cout<<" 办理业务:"<<oper<<" 所需时间:"<<time<<endl;
}
/*赋值函数*/
void get(fare p)
{
num=p.num;
oper=p.oper;
time=p.time;
time1=p.time1;
time2=p.time2;
◆ 4——还贷 20分钟
办理业务过程分析
有窗口空闲时,顾客进入空闲窗口中号数较小的一个。
有顾客等待时,客户进入某个窗口的方式为队列。哪一个窗口的业务先办理完,他进入那个队列。
#include<stdlib.h>
#include<iostream.h>
#include<time.h>
基本要求:每个客户到达银行的时间和需要办理的业务随机产生,输出一天客户在银行的平均逗留时间和每个窗口每天办理的客户数和每种业务数。
测试数据:营业时间为8小时,其他模拟量自行设定。
要用到的知识点至少包括 数据结构中的队列问题
以下是本人初步的分析,可以更改但不要偏差太多。
客户 类:
◆ 按照顺序生成客户编号,在以后的程序调用之中保持不变。输出客户编号(customer_code)
c++ 语言下的 银行排队系统问题
银行业务模拟
问题描述:设银行有四个服务窗口,每个窗口均可以办理存款、取款、挂失、还贷业务,每种业务所需的服务时间不同,客户到达银行后,先到打号机上打号,号票上包括到达时间、编号和需要办理的业务,然后在银行内等候。每个窗口办理完一个客户的业务后,办理等候客户中排在最前面的客户的业务。写一个上述银行业务的模拟系统,通过模拟方法求出客户在银行内逗留的平均时间和每个窗口办理的客户数及办理的每种业务数。
case 1:win1<<setw(3)<<win[1].f.num<<setw(6)<<win[1].f.time1<<":"<<win[1].f.time2<<setw(12)<<win[1].f.oper<<setw(8)<<win[1].time3<<":"<<win[1].time4<<endl;break;
fstream win2("win2.txt",ios::out|ios::app);
fstream win3("win3.txt",ios::out|ios::app);
win0<<"号码"<<" 到达时间"<<" 办理业务"<<" 办理时间"<<endl;
win1<<"号码"<<" 到达时间"<<" 办理业务"<<" 办理时间"<<endl;
case 1:oper="fetch";time=5;break;
case 2:oper="loss";time=10;break;
case 3:oper="repay";time=20;break;
}
}
/*显示票据内容*/
void display()
{
cout<<"号码"<<num<<" 到达时间:"<<time1<<":"<<time2;
case 3:win3<<setw(3)<<win[3].f.num<<setw(6)<<win[3].f.time1<<":"<<win[3].f.time2<<setw(12)<<win[3].f.oper<<setw(8)<<win[3].time3<<":"<<win[3].time4<<endl;break;
{
int n;
cout<<"请输入到银行办理业务的人数:";
cin>>n; /*n取200左右,且小于234(跟随机序列有关)*/
/*建立一天内用户流量的文件*/
fstream file("data.txt",ios::out|ios::app);
fare *a;
file<<"号码"<<" 到达时间:"<<" 办理业务:"<<" 所需时间:"<<endl;
◆ 随机生成客户到达银行的时间(arrival_time)
★ 使用随机数函数,假设每五分钟来一位顾客
★ 顾客到来的时间超过480(营业八小时,8*60=480)分钟之外,系统运行结束。
★ 输出到达时间
◆ 随机生成客户要办理的业务(item)
◆ 输出办理业务的窗口号(window)
窗口统计 类:
file<<setw(12)<<a[i].oper<<setw(8)<<a[i].time<<endl;
}
window win[4];
fstream win0("win0.txt",ios::out|ios::app);
fstream win1("win1.txt",ios::out|ios::app);
win0<<"取款业务数目:"<<win[0].fetch<<endl;
win0<<"挂失业务数目:"<<win[0].loss<<endl;
win0<<"还贷业务数目:"<<win[0].repay<<endl;
win0<<"存款业务数目:"<<win[0].save<<endl;