C银行叫号系统课程设计Word格式.docx
《C银行叫号系统课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《C银行叫号系统课程设计Word格式.docx(31页珍藏版)》请在冰点文库上搜索。
(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<
T>
表示顺序队列:
(1)、字段
字段maxsize:
表示循环队列的最大容量;
字段front:
表示对头,范围是0~maxsize-1;
字段rear:
表示队尾,范围也是0~maxsize-1;
字段data:
表示数组用于存储循环顺序队列中的数据元素;
(2)、属性
在类中并设置了队头属性(front)、队尾属性(rear)、容量属性(maxsize)、索引器属性(this);
(3)、方法
在这个类中有接口IQueue中的一切方法;
银行叫号顺序队列类CSeqBankQueue类:
该类实现IBankQueue接口中定义的全部行为,通过继承CSeqQueue<
将已实现的全部行为继承过来;
此外,设置了一个新来顾客的服务号属性Callnumber;
通过方法GetCallnumber()获得服务号;
Form1类:
Form1继承了系统中的Form类;
在Form1中使用了button、label、textBox等控件;
使用了button_Click方法实现取号行为;
Form2类:
Form2也继承了系统中的Form类;
在Form2中也使用了button、label、textBox等控件;
使用了button_Click方法实现叫号行为;
Form3类:
Form3也继承了系统中的Form类;
Form4类:
Form4也继承了系统中的Form类;
服务窗口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<
int>
q1=newCSeqQueue<
(100);
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();
}
publicpartialclassForm3:
_q1=newCSeqQueue<
publicForm3(CSeqQueue<
q1)//构造函数,应用Form1所建立的队列;
this._q1=q1;
_q1.IsEmpty())
textBox1.Text=("
请"
+_q1.DeQueue()+"
号到二号窗口!
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接口代码:
interfaceIBankQueue:
IQueue<
intGetCallnumber();
//获得服务号码
顺序队列代码:
publicclassCSeqQueue<
:
privateintmaxsize;
//循环顺序队列的容量
privateT[]data;
//数组,用于存储循环顺序队列中的数据元素
privateintfront;
//指示最近一个己经离开队列的元素所占的位置
privateintrear;
//指示最近一个进行入队列的元素的位置
//索引器
publicTthis[intindex]
get
returndata[index];
set
data[index]=value;
//容量属性
publicintMaxsize
returnmaxsize;
maxsize=value;
//队头指示器属性
publicintFront
returnfront;
front=value;
//队尾指示器属性
publicintRear
returnrear;
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())
Queueisempty"
returndefault(T);
front=(front+1)%maxsize;
returndata[front];
//获取队头数据元素
publicTGetFront()
Queueisempty!
returndata[(front+1)%maxsize];
//求循环顺序队列的长度
publicintGetLength()
return(rear-front+maxsize)%maxsize;
//判断循环顺序队列是否为满
publicboolIsFull()
if((front==-1&
&
rear==maxsize-1)||(rear+1)%maxsize==front)
returntrue;
returnfalse;
//清空循环顺序队列
publicvoidClear()
//判断循环顺序队列是否为空
publicboolIsEmpty()
if(front==rear)
银行顺序队列代码:
usingSystem.Threading;
//银行叫号顺序队列类
classCSeqBankQueue:
CSeqQueue<
IBankQueue
privateintcallnumber;
//记录系统自动产生的新来顾客的服务号
//叫号属性
publicintCallnumber
returncallnumber;
callnumber=value;
publicCSeqBankQueue(){}
publicCSeqBankQueue(intsize):
base(size){}
//获得服务号码
publicintGetCallnumber()
if((IsEmpty())&
callnumber==0)
callnumber=1;
callnumber++;
//服务窗口类
classServiceWindow
IBankQueuebankQ;
publicIBankQueueBankQ
returnbankQ;
bankQ=value;
publicvoidService()
while(true)
Thread.Sleep(10000);
bankQ.IsEmpty())
Console.WriteLine();
lock(bankQ)
请{0}号到{1}号窗口!
bankQ.DeQueue(),Thread.CurrentThread.Name);
Form1代码
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingQueueDs;
privatevoidForm1_Load(objectsender,EventArgse)
Form2的代码:
publicpartialclassForm2:
publicForm2(CSeqQueue<
q1)
this._q1=q1;
_q1.IsEmpty())
+_q1.DeQueue()+"
号到一号窗口"
现在没有客人!
privatevoidForm2_Load(objectsender,EventArgse)
Form3代码:
privatevoidForm3_Load(objectsender,EventArgse)
Form4代码:
usingQue