C银行叫系统课程设计方案.docx
- 文档编号:9014643
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:31
- 大小:254.87KB
C银行叫系统课程设计方案.docx
《C银行叫系统课程设计方案.docx》由会员分享,可在线阅读,更多相关《C银行叫系统课程设计方案.docx(31页珍藏版)》请在冰点文库上搜索。
C银行叫系统课程设计方案
课程设计任务书
一、设计内容与要求
1、设计内容
1)、设计窗口,服务窗口;
2)、编写代码,实现各种算法,完成排队叫号问题;
二、设计说明
2.1问题描述与功能设计
1、问题描述
目前,在以银行营业大厅为代表的窗口业务,大量客户的拥挤排队已成为了这些企事业单位改善服务品质、提升企业形象的主要障碍。
排队叫号系统的使用将成为改变这种情况的有力手段。
排队系统完全模拟了人群排队的全过程,通过取票进队。
排队等待、叫号服务等功能,很好的解决了客户在服务机构办理业务是所遇到的各种排队、拥挤和混乱现象,代替了人们站队的辛苦,把顾客等待的烦恼变成了一段难得的休闲时光,使客户拥有了一个自由的空间和一份美好的心情。
排队叫号软件的具体操作流程为:
2、功能设计
1)使用数组以及C#接口和范型技术实现通用的队列功能;
2)编写算法,利用队列模拟银行排队系统;
3)利用多窗口分别模拟顾客取服务号、银行窗口服务顾客。
2.2算法与数据结构
在银行排队叫号软件中,首先要找到一种数据结构来存放顾客所得到的服务号,这些服务号表示客户的请求服务的先后顺序,也表示客户被服务的先后顺序。
先来的客户被服务:
在这个程序中,主要运用了队列这种结构:
1、队列是一种特殊的线性表,是一种只允许在表的一端插入操作而在另一端进行删除操作的线性表。
进行插入操作的表尾称为队尾(Rear),进行删除操作的头部称为对头(Front)。
当队列中没有数据元素时称为空队列(EmptyQueue)。
队列通常记为Q=(a1,a2,…,an),a1为对头元素,an为队尾元素。
这n个元素是按照a1,a2,…an的次序依次入队的,出队的顺序与入队顺序相同,a1第一个出队,an最后一个出队。
队列的结构示意图如下:
出队a1a2…an入队
2、队列的特征:
队列的操作是按照“先进先出”或“后进后出”的原则进行的。
3、队列的基本操作:
(1)入队列操作:
EnQueue(Telem);
(2)出队列操作:
DeQueue();
(3)取队头元素:
GetFront();
(4)求队列的长度;GetLength();
(5)判断队列是否为空:
IsEmpty();
(6)清空操作:
Clear();
(7)判断是否为满:
IsFull();
在这个程序中用循环顺序队列。
当队尾指示器rear到达数组上限时,如果还有数据元素入队并且数组的第0个空间空闲时,队尾指示器rear指向数组的0端。
队尾指示器rear的值不一定大于队头Front的值,并且队满和队空的条件是相同的,为rear==front;
2.3类定义(函数定义)
在这个程序中,定义了一下及几种类:
接口IQueue类:
将队列的基本操作定义在接口IQueue中,如左图所示:
Clear:
清空操作,是队列为空;
DeQueue:
出队列操作,将队头元素从队列中取出;
EnQueue:
入队列操作,将值为elem的新数据元素添加到队尾;
GetFront:
取队头元素,返回队头元素的值;
GetLength:
求队列的长度,返回队列中数据元素的个数;
IsEmpty:
判断队列是否为空,如果对列为控,返回true,否则返回false;
IsFull:
判断是否为满,如果对列为满返回true,否则返回false;
接口IBankQueue类:
将银行队列的所有操作定义在里面:
GetCallnumber:
获取服务号;
泛型类CSeqQueue
(1)、字段
字段maxsize:
表示循环队列的最大容量;
字段front:
表示对头,范围是0~maxsize-1。
字段rear:
表示队尾,范围也是0~maxsize-1;
字段data:
表示数组用于存储循环顺序队列中的数据元素;
(2)、属性
在类中并设置了队头属性(front)、队尾属性(rear)、容量属性(maxsize)、索引器属性(this);
(3)、方法
在这个类中有接口IQueue中的一切方法;
银行叫号顺序队列类CSeqBankQueue类:
该类实现IBankQueue接口中定义的全部行为,通过继承CSeqQueue
Form1类:
Form1继承了系统中的Form类;
在Form1中使用了button、label、textBox等控件;
使用了button_Click方法实现取号行为;
Form2类:
Form2也继承了系统中的Form类;
在Form2中也使用了button、label、textBox等控件;
使用了button_Click方法实现叫号行为;
Form3类:
Form3也继承了系统中的Form类;
在Form2中也使用了button、label、textBox等控件;
使用了button_Click方法实现叫号行为;
Form4类:
Form4也继承了系统中的Form类;
在Form2中也使用了button、label、textBox等控件;
使用了button_Click方法实现叫号行为;
服务窗口ServiceWindow类:
服务队列的属性BankQ;
作为线程的方法Service();
主程序Main()方法;
2.4界面设计
在这个程序中,总共设计了四个界面,一个取号界面,三个服务窗口界面:
如图所示:
1、取号窗口:
在取号窗口中,有了三个label控件,设置了“中国银行”、“欢迎你”、“请点击取号”字样,使用button控件设置了取号按钮,用了textBox控件用于显示所取到的排队号码。
2、服务窗口
一号服务窗口
二号服务窗口
三号服务窗口
在服务窗口中用了两个label控件设置了“中国银行”、“X号服务窗口”字样,用了button控件设置了“下一个”按钮,用textBox显示“请X号到X号服务窗口”;
2.5编码
namespace银行排队叫号系统
{
publicpartialclassForm1:
Form
{
IBankQueuebankQueue=newCSeqBankQueue(100)。
//新建一个队列;
CSeqQueue
intCallnumber。
//号码;
publicForm1()
{
InitializeComponent()。
Form2f1=newForm2(this.q1)。
//实例话Form;
Form3f2=newForm3(this.q1)。
Form4f3=newForm4(this.q1)。
f1.Show()。
//使几个窗口同时显示;
f2.Show()。
f3.Show()。
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(!
bankQueue.IsFull())
{
Callnumber=bankQueue.GetCallnumber()。
textBox1.Text="你的号码是:
"+Callnumber+"号,"+"你前面还有"+bankQueue.GetLength()+"位,请耐心等待!
"。
bankQueue.EnQueue(Callnumber)。
//所取得的号码进队;
q1.EnQueue(Callnumber)。
}
else
Console.WriteLine("现在业务繁忙,请稍后再来!
")。
Console.WriteLine()。
}
}
}
namespace银行排队叫号系统
{
publicpartialclassForm3:
Form
{
CSeqQueue
publicForm3(CSeqQueue
{
InitializeComponent()。
this._q1=q1。
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(!
_q1.IsEmpty())
{
textBox1.Text=("请"+_q1.DeQueue()+"号到二号窗口!
")。
}
else
{
MessageBox.Show("现在没有客人!
")。
}
}
2.6测试
代码编写完成后,执行调试-开始执行,看是否能成功生成,若能的话,点击取号看服务窗口是否按要求运作;若不能的话,根据所提供的错误提示,一步步的调试,直到成功生成为止。
下图为取到八号,且六号正在被服务时各显示器上的显示:
三、总结
在整个过程中,应该注意以下几点:
1.要求利用面向对象的方法以及队列数据结构来完成系统的设计;
2.在设计的过程中,建立清晰的类层次;
3.在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;
4.要运用面向对象的机制来实现系统功能。
通过对完成这次课程设计,加深了对队列这种数据结构的理解,掌握了队列数据结构极其算法;此外也能够更加熟练的使用button。
Label。
textBox等控件。
参考文献
雷军环、邓文达、刘震编著《数据结构(C#语言版)》
钱哨、李挥剑、李继哲编著《C#WinForm实践开发教程》
郑宇军编著《C#面向对象程序设计》
附录:
源代码
IQueue接口代码:
usingSystem。
namespaceQueueDs
{
interfaceIQueue
{
voidEnQueue(Telem)。
//入队列操作
TDeQueue()。
//出队列操作
TGetFront()。
//取对头元素
intGetLength()。
//求队列的长度
boolIsEmpty()。
//判断队列是否为空
voidClear()。
//清空队列
boolIsFull()。
//判断是否为满,在顺序队列中实现该算法,在链式队列中代码实现为空
}
}
IBankQueue接口代码:
usingSystem。
namespaceQueueDs
{
interfaceIBankQueue:
IQueue
{
intGetCallnumber()。
//获得服务号码
}
}
顺序队列代码:
usingSystem。
namespaceQueueDs
{
publicclassCSeqQueue
IQueue
{
privateintmaxsize。
//循环顺序队列的容量
privateT[]data。
//数组,用于存储循环顺序队列中的数据元素
privateintfront。
//指示最近一个己经离开队列的元素所占的位置
privateintrear。
//指示最近一个进行入队列的元素的位置
//索引器
publicTthis[intindex]
{
get
{
returndata[index]。
}
set
{
data[index]=value。
}
}
//容量属性
publicintMaxsize
{
get
{
returnmaxsize。
}
set
{
maxsize=value。
}
}
//队头指示器属性
publicintFront
{
get
{
returnfront。
}
set
{
front=value。
}
}
//队尾指示器属性
publicintRear
{
get
{
returnrear。
}
set
{
rear=value。
}
}
//初始化队列
publicCSeqQueue(){}
publicCSeqQueue(intsize)
{
data=newT[size]。
maxsize=size。
front=rear=-1。
}
//入队操作
publicvoidEnQueue(Telem)
{
if(IsFull())
{
Console.WriteLine("Queueisfull")。
return。
}
rear=(rear+1)%maxsize。
。
data[rear]=elem。
}
//出队操作
publicTDeQueue()
{
if(IsEmpty())
{
Console.WriteLine("Queueisempty")。
returndefault(T)。
}
front=(front+1)%maxsize。
returndata[front]。
}
//获取队头数据元素
publicTGetFront()
{
if(IsEmpty())
{
Console.WriteLine("Queueisempty!
")。
returndefault(T)。
}
returndata[(front+1)%maxsize]。
}
//求循环顺序队列的长度
publicintGetLength()
{
return(rear-front+maxsize)%maxsize。
}
//判断循环顺序队列是否为满
publicboolIsFull()
{
if((front==-1&&rear==maxsize-1)||(rear+1)%maxsize==front)
{
returntrue。
}
else
{
returnfalse。
}
}
//清空循环顺序队列
publicvoidClear()
{
front=rear=-1。
}
//判断循环顺序队列是否为空
publicboolIsEmpty()
{
if(front==rear)
{
returntrue。
}
else
{
returnfalse。
}
}
}
}
银行顺序队列代码:
usingSystem。
usingSystem.Threading。
namespaceQueueDs
{
//银行叫号顺序队列类
classCSeqBankQueue:
CSeqQueue
{
privateintcallnumber。
//记录系统自动产生的新来顾客的服务号
//叫号属性
publicintCallnumber
{
get
{
returncallnumber。
}
set
{
callnumber=value。
}
}
publicCSeqBankQueue(){}
publicCSeqBankQueue(intsize):
base(size){}
//获得服务号码
publicintGetCallnumber()
{
if((IsEmpty())&&callnumber==0)
callnumber=1。
else
callnumber++。
returncallnumber。
}
}
//服务窗口类
classServiceWindow
{
IBankQueuebankQ。
publicIBankQueueBankQ
{
get
{
returnbankQ。
}
set
{
bankQ=value。
}
}
publicvoidService()
{
while(true)
{
Thread.Sleep(10000)。
if(!
bankQ.IsEmpty())
{
Console.WriteLine()。
lock(bankQ)
{
Console.WriteLine("请{0}号到{1}号窗口!
",bankQ.DeQueue(),Thread.CurrentThread.Name)。
}
}
}
}
}
}
Form1代码
usingSystem。
usingSystem.Collections.Generic。
usingSystem.ComponentModel。
usingSystem.Data。
usingSystem.Drawing。
usingSystem.Linq。
usingSystem.Text。
usingSystem.Windows.Forms。
usingQueueDs。
namespace银行排队叫号系统
{
publicpartialclassForm1:
Form
{
IBankQueuebankQueue=newCSeqBankQueue(100)。
CSeqQueue
intCallnumber。
publicForm1()
{
InitializeComponent()。
Form2f1=newForm2(this.q1)。
Form3f2=newForm3(this.q1)。
Form4f3=newForm4(this.q1)。
f1.Show()。
f2.Show()。
f3.Show()。
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(!
bankQueue.IsFull())
{
Callnumber=bankQueue.GetCallnumber()。
textBox1.Text="你的号码是:
"+Callnumber+"号,"+"你前面还有"+bankQueue.GetLength()+"位,请耐心等待!
"。
bankQueue.EnQueue(Callnumber)。
q1.EnQueue(Callnumber)。
}
else
Console.WriteLine("现在业务繁忙,请稍后再来!
")。
Console.WriteLine()。
}
privatevoidForm1_Load(objectsender,EventArgse)
{
}
}
}
Form2的代码:
usingSystem。
usingSystem.Collections.Generic。
usingSystem.ComponentModel。
usingSystem.Data。
usingSystem.Drawing。
usingSystem.Linq。
usingSystem.Text。
usingSystem.Windows.Forms。
usingQueueDs。
namespace银行排队叫号系统
{
publicpartialclassForm2:
Form
{
CSeqQueue
publicForm2(CSeqQueue
{
InitializeComponent()。
this._q1=q1。
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(!
_q1.IsEmpty())
{
textBox1.Text="请"+_q1.DeQueue()+"号到一号窗口"。
}
else
MessageBox.Show("现在没有客人!
")。
}
privatevoidForm2_Load(objectsender,EventArgse)
{
}
}
}
Form3代码:
usingSystem。
usingSystem.Collections.Generic。
usingSystem.ComponentModel。
usingSystem.Data。
usingSystem.Drawing。
usingSystem.Linq。
usingSystem.Text。
usingSystem.Windows.Forms。
usingQueueDs。
namespace银行排队叫号系统
{
publicpartialclassForm3:
Form
{
CSeqQueue
publicForm3(CSeqQueue
{
InitializeComponent()。
this._q1=q1。
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(!
_q1.IsEmpty())
{
textBox1.Text=("请"+_q1.DeQueue()+"号到二号窗口!
")。
}
else
{
MessageBox.Show("现在没有客人!
")。
}
}
privatevoidForm3_Load(objectsender,EventArgse)
{
}
}
}
Form4代码:
usingSystem。
usingSystem.Collections.Generic。
usingSystem.ComponentModel。
usingSystem.Data。
usingSystem.Drawing。
usingSystem.Linq。
usingSystem.Text。
usingSystem.Windows.Forms。
usingQueueDs。
namespace银行排队叫号系统
{
publicpartialclassForm4:
Form
{
CSeqQueue
publicForm4(CSeqQueue
{
InitializeComponent()。
this._q1=q1。
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(!
_q1.Is
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行 系统 课程设计 方案