c 银行排队叫号系统课程报告设计书.doc
河北联合大学2011-2012第2学期 软件设计基础-C#课程设计报告设计名称: 银行排队叫号系统姓 名: 赵杰 学 号 201114210114 专业班级: 11级工业工程一班 学 院: 机械工程学院 设计时间: 2012.5,26 设计地点: 河北联合大学主校区 成绩:指导教师评语: 指导教师签字: 年 月 日目 录1.课程设计目的32.课程设计任务与要求33.课程设计说明书44.课程设计成果95.程序调试过程116.设计问题的不足和改进方案117.课程设计心得128.附录139.参考文献221课程设计目的软件设计基础-C#课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C#的知识点,又接近工程实际需要。目的是通过课程设计的综合训练,培养学生实际分析问题、解决问题的能力,以及编程和动手能力,最终目标是通过课程设计这种形式,帮助学生系统掌握C#这门课程的主要内容,养成良好的编程习惯,更好的完成教学任务。2课程设计任务与要求:要求:本次课程设计利用软件设计基础-C#课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。要求:1、对系统进行功能需求分析2、设计合理的数据结构和系统框架3、界面设计美观、清楚、合理4、编程简练,程序功能齐全,能正确运行5、具有一定的创新性6、说明书、流程图要清楚7、课题完成后必须按要求提交课程设计报告任务:通过这次课程设计,要求在数据结构的逻辑特性和物理表示、数据结构 的选择应用算法的及其实现等方面加深课程基本内容的理解。同时,在程 设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练3课程设计说明书功能描述1,顾客取号,需要办理业务的顾客到取票机前取号,并获得打印出的排队号。2、顾客休息等待,取到排队号的顾客在休息区休息等待,注意大厅的提示信息。3、营业员按钮呼叫,窗口操作员按“下一位”,当前窗口就显示顾客排队号并语音呼叫“请 XX 到 X 号窗口”4、顾客到窗口办理,休息区的顾客到呼叫就到响应窗口进行一 对一服务。排队叫号软件的具体操作流程为:1、顾客取号需要办理业务的顾客到取票机前取号,并获得打印出的2、顾客休息等待 取到排队号的顾客在休息区休息等待,注意大厅的提示信息3、营业员按钮呼叫 窗口操作员按“下一位”,当前窗口就显示顾客排队号并语音呼叫“请XX到X号窗口”4、顾客到窗口办理 休息区的顾客听到呼叫就到响应窗口进行一对一服务代码实现详细说明各功能模块的实现过程,所用到的算法、技巧等。1、 在这个程序中,主要运用了队列这种结构:队列是一种特殊的线性表,是一种只允许在表的一端插入操作而在另一端进行删除操作的线性表。进行插入操作的表尾称为队尾(Rear),进行删除操作的头部称为对(Front)。当队列中没有数据元素时称为空队列(Empty Queue)。队列通常记为Q=(a1,a2,an),a1为对头元素,an为队尾元素。这n个元素是按照a1,a2,an的次序依次入队的,出队的顺序与入队顺序相同,a1第一个出队,an最后一个出队。队列的结构示意图如下: 出队 a1 a2 an 入队2、队列的特征: 队列的操作是按照“先进先出”或“后进后出” 的原则进行的。3、 队列的基本操作:(1) 入队列操作:EnQueue(T elem);(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:表示对头,范围是0maxsize-1;字段rear:表示队尾,范围也是0maxsize-1;字段data:表示数组用于存储循环顺序队列中的数据 元素;(2)、属性在类中并设置了队头属性(front)、队尾属性(rear)、容量属性(maxsize)、索引器属性(this);(3)、方法在这个类中有接口IQueue中的一切方法;银行叫号顺序队列类CSeqBankQueue类:该类实现IBankQueue接口中定义的全部行为,通过继承CSeqQueue<T>将已实现的全部行为继承过来;此外,设置了一个新来顾客的服务号属性Callnumber;通过方法GetCallnumber()获得服务号;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()方法;4课程设计成果:5.程序调试过程:按下F5进行调试,出现错误.有时把”.”写成“,”,忘记“;”,或少写“”,最后调试成功。6.设计问题的不足和改进方案由于时间紧,设计不是很合理,触屏取号应该更方便。7.课程设计心得:我们认为,在这学期的实验中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。 在整个过程中,应该注意以下几点:要求利用面向对象的方法以及队列数据结构来完成系统的设计;. 在设计的过程中,建立清晰的类层次;在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法; 要运用面向对象的机制来实现系统功能。通过对完成这次课程设计,加深了对队列这种数据结构的理解,掌握了队列数据结构极其算法;此外也能够更加熟练的使用button。Label。textBox等控件8.附录源代码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 public class CSeqQueue<T>:IQueue<T> private int maxsize; /循环顺序队列的容量 private T data; /数组,用于存储循环顺序队列中的数据元素 private int front; /指示最近一个己经离开队列的元素所占的位置 private int rear; /指示最近一个进行入队列的元素的位置 /索引器 public T thisint index get return dataindex; set dataindex = value; /容量属性 public int Maxsize get return maxsize; set maxsize = value; /队头指示器属性 public int Front get return front; set front = value; /队尾指示器属性 public int Rear get return rear; set rear = value; /初始化队列 public CSeqQueue() public CSeqQueue(int size) data = new Tsize; maxsize = size; front = rear = -1; /入队操作 public void EnQueue(T elem) if (IsFull() Console.WriteLine("Queue is full"); return; rear=(rear + 1) % maxsize; ; datarear = elem; /出队操作 public T DeQueue() if (IsEmpty() Console.WriteLine("Queue is empty"); return default(T); front = (front + 1) % maxsize; return datafront; /获取队头数据元素 public T GetFront() if (IsEmpty() Console.WriteLine("Queue is empty!"); return default(T); return data(front+1)%maxsize; /求循环顺序队列的长度 public int GetLength() return (rear - front + maxsize) % maxsize; /判断循环顺序队列是否为满 public bool IsFull() if (front = -1 && rear = maxsize - 1) | (rear + 1) % maxsize = front) return true; else return false; /清空循环顺序队列 public void Clear() front = rear = -1; /判断循环顺序队列是否为空 public bool IsEmpty() if (front = rear) return true; else return false; 银行顺序队列代码:using System;using System.Threading;namespace QueueDs /银行叫号顺序队列类 class CSeqBankQueue:CSeqQueue<int>,IBankQueue private int callnumber;/记录系统自动产生的新来顾客的服务号 /叫号属性 public int Callnumber get return callnumber; set callnumber = value; public CSeqBankQueue () public CSeqBankQueue(int size):base(size) /获得服务号码 public int GetCallnumber() if (IsEmpty() && callnumber = 0) callnumber = 1; else callnumber+; return callnumber; /服务窗口类 class ServiceWindow IBankQueue bankQ; public IBankQueue BankQ get return bankQ; set bankQ = value; public void Service() while (true) Thread.Sleep(10000); if (!bankQ.IsEmpty() Console.WriteLine(); lock (bankQ) Console.WriteLine("请0号到1号窗口!", bankQ.DeQueue(), Thread.CurrentThread.Name); Form1代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using QueueDs;namespace 银行排队叫号系统 public partial class Form1 : Form IBankQueue bankQueue=new CSeqBankQueue(100); CSeqQueue<int> q1 = new CSeqQueue<int>(100); int Callnumber; public Form1() InitializeComponent(); Form2 f1 = new Form2(this.q1); Form3 f2 = new Form3(this.q1); Form4 f3 = new Form4(this.q1); f1.Show(); f2.Show(); f3.Show(); private void button1_Click(object sender, EventArgs e) if (!bankQueue.IsFull() Callnumber = bankQueue.GetCallnumber(); textBox1.Text = "你的号码是:" + Callnumber + "号," + "你前面还有" + bankQueue.GetLength() + "位,请耐心等待!" bankQueue .EnQueue(Callnumber ); q1.EnQueue(Callnumber); else Console .WriteLine ("现在业务繁忙,请稍后再来!"); Console .WriteLine (); private void Form1_Load(object sender, EventArgs e) Form2的代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using QueueDs;namespace 银行排队叫号系统 public partial class Form2 : Form CSeqQueue<int> _q1 = new CSeqQueue<int>(100); public Form2(CSeqQueue<int> q1) InitializeComponent(); this._q1=q1; private void button1_Click(object sender, EventArgs e) if (!_q1.IsEmpty () textBox1.Text = "请" +_q1.DeQueue()+ "号到一号窗口" else MessageBox.Show("现在没有客人!"); private void Form2_Load(object sender, EventArgs e) Form3代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using QueueDs;namespace 银行排队叫号系统 public partial class Form3 : Form CSeqQueue<int> _q1 = new CSeqQueue<int>(100); public Form3(CSeqQueue<int> q1) InitializeComponent(); this._q1 = q1; private void button1_Click(object sender, EventArgs e) if (!_q1.IsEmpty() textBox1.Text = ("请" + _q1.DeQueue() + "号到二号窗口!"); else MessageBox.Show("现在没有客人!"); private void Form3_Load(object sender, EventArgs e) Form4代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using QueueDs;namespace 银行排队叫号系统 public partial class Form4 : Form CSeqQueue<int> _q1=new CSeqQueue<int>(100); public Form4(CSeqQueue<int> q1 ) InitializeComponent(); this._q1 =q1; private void button1_Click(object sender, EventArgs e) if(!_q1 .IsEmpty () textBox1 .Text =("请"+_q1 .DeQueue ()+"号到三号窗口!"); else MessageBox .Show ("现在没有客人!"); private void Form4_Load(object sender, EventArgs e) 主程序代码:using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;namespace 银行排队叫号系统 static class Program / <summary> / 应用程序的主入口点。 / </summary> STAThread static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(); 9.参考文献雷军环、邓文达、刘震编著 数据结构(C#语言版)钱哨、李挥剑、李继哲编著 C#WinForm实践开发教程郑宇军编著 C#面向对象程序设计,Visual c#.NET 程序设计