1课程设计任务书一、设计内容与要求1、设计内容1)、设计窗口,服务窗口;2)、编写代码,实现各种算法,完成排队叫号问题;二、设计说明2.1问题描述与功能设计1、问题描述目前,在以银行营业大厅为代表的窗口业务,大量客户的拥挤排队已成为了这些企事业单位改善服务品质、提升企业形象的主要障碍。排队叫号系统的使用将成为改变这种情况的有力手段。排队系统完全模拟了人群排队的全过程,通过取票进队。排队等待、叫号服务等功能,很好的解决了客户在服务机构办理业务是所遇到的各种排队、拥挤和混乱现象,代替了人们站队的辛苦,把顾客等待的烦恼变成了一段难得的休闲时光,使客户拥有了一个自由的空间和一份美好的心情。排队叫号软件的具体操作流程为:2、功能设计1)使用数组以及C#接口和范型技术实现通用的队列功能;2)编写算法,利用队列模拟银行排队系统;3)利用多窗口分别模拟顾客取服务号、银行窗口服务顾客。1、顾客取号需要办理业务的顾客到取票机前取号,并获得打印出的排队号票2、顾客休息等待取到排队号的顾客在休息区休息等待,注意大厅的提示信息4、顾客到窗口办理休息区的顾客听到呼叫就到响应窗口进行一对一服务。3、营业员按钮呼叫窗口操作员按“下一位”,当前窗口就显示顾客排队号并语音呼叫“请XX到X号窗口”22.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类定义(函数定义)在这个程序中,定义了一下及几种类:3接口IQueue类:将队列的基本操作定义在接口IQueue中,如左图所示:Clear:清空操作,是队列为空;DeQueue:出队列操作,将队头元素从队列中取出;EnQueue:入队列操作,将值为elem的新数据元素添加到队尾;GetFront:取队头元素,返回队头元素的值;GetLength:求队列的长度,返回队列中数据元素的个数;IsEmpty:判断队列是否为空,如果对列为控,返回true,否则返回false;IsFull:判断是否为满,如果对列为满返回true,否则返回false;接口IBankQueue类:将银行队列的所有操作定义在里面:GetCallnumber:获取服务号;泛型类CSeqQueueT表示顺序队列:(1)、字段字段maxsize:表示循环队列的最大容量;字段front:表示对头,范围是0~maxsize-1;字段rear:表示队尾,范围也是0~maxsize-1;字段data:表示数组用于存储循环顺序队列中的数据元素;(2)、属性在类中并设置了队头属性(front)、队尾属性(rear)、容量属性(maxsize)、索引器属性(this);(3)、方法在这个类中有接口IQueue中的一切方法;4银行叫号顺序队列类CSeqBankQueue类:该类实现IBankQueue接口中定义的全部行为,通过继承CSeqQueueT将已实现的全部行为继承过来;此外,设置了一个新来顾客的服务号属性Callnumber;通过方法GetCallnumber()获得服务号;Form1类:Form1继承了系统中的Form类;在Form1中使用了button、label、textBox等控件;使用了button_Click方法实现取号行为;Form2类:5Form2也继承了系统中的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方法实现叫号行为;6服务窗口ServiceWindow类:服务队列的属性BankQ;作为线程的方法Service();主程序Main()方法;2.4界面设计在这个程序中,总共设计了四个界面,一个取号界面,三个服务窗口界面:如图所示:1、取号窗口:在取号窗口中,有了三个label控件,设置了“中国银行”、“欢迎你”、“请点击取号”字样,使用button控件设置了取号按钮,用了textBox控件用于显示所取到的排队号码。2、服务窗口7一号服务窗口二号服务窗口三号服务窗口在服务窗口中用了两个label控件设置了“中国银行”、“X号服务窗口”字样,用了button控件设置了“下一个”按钮,用textBox显示“请X号到X号服务窗口”;82.5编码namespace银行排队叫号系统{publicpartialclassForm1:Form{IBankQueuebankQueue=newCSeqBankQueue(100);//新建一个队列;CSeqQueueintq1=newCSeqQueueint(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);}elseConsole.WriteLine(现在业务繁忙,请稍后再来!);Console.WriteLine();}}}namespace银行排队叫号系统{publicpartialclassForm3:Form{CSeqQueueint_q1=newCSeqQueueint(100);publicForm3(CSeqQueueintq1)//构造函数,应用Form1所建立的队列;9{InitializeComponent();this._q1=q1;}privatevoidbutton1_Click(objectsender,EventArgse){if(!_q1.IsEmpty()){textBox1.Text=(请+_q1.DeQueue()+号到二号窗口!);}else{MessageBox.Show(现在没有客人!);}}2.6测试代码编写完成后,执行调试-开始执行,看是否能成功生成,若能的话,点击取号看服务窗口是否按要求运作;若不能的话,根据所提供的错误提示,一步步的调试,直到成功生成为止。下图为取到八号,且六号正在被服务时各显示器上的显示:10三、总结在整个过程中,应该注意以下几点:1.要求利用面向对象的方法以及队列数据结构来完成系统的设计;2.在设计的过程中,建立清晰的类层次;3.在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;4.要运用面向对象的机制来实现系统功能。通过对完成这次课程设计,加深了对队列这种数据结构的理解,掌握了队列数据结构极其算法;此外也能够更加熟练的使用button。Label。textBox等控件。参考文献11雷军环、邓文达、刘震编著《数据结构(C#语言版)》钱哨、李挥剑、李继哲编著《C#WinForm实践开发教程》郑宇军编著《C#面向对象程序设计》附录:源代码IQueue接口代码:usingSystem;namespaceQueueDs{interfaceIQueueT{voidEnQueue(Telem);//入队列操作TDeQueue();//出队列操作TGetFront();//取对头元素intGetLength();//求队列的长度boolIsEmpty();//判断队列是否为空voidClear();//清空队列boolIsFull();//判断是否为满,在顺序队列中实现该算法,在链式队列中代码实现为空}}IBankQueue接口代码:usingSystem;namespaceQueueDs{interfaceIBankQueue:IQueueint{intGetCallnumber();//获得服务号码}}顺序队列代码:usingSystem;namespaceQueueDs{publicclassCSeqQueueT:IQueueT{privateintmaxsize;//循环顺序队列的容量privateT[]data;//数组,用于存储循环顺序队列中的数据元素privateintfront;//指示最近一个己经离开队列的元素所占的位置privateintrear;//指示最近一个进行入队列的元素的位置//索引器publicTthis[intindex]12{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;13}}//初始化队列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)%maxs