您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 设计及方案 > 排队叫号系统(带源程序)
一、课程设计的主要内容题目描述:利用队列模拟一个排队叫号系统。功能要求及说明:(1)系统采用菜单方式操作,要求实现如下功能:(2)叫号排队:用户叫号时将该用户信息(用户名)入队,并打印用户排队序号、等待人数。(3)业务处理:工作人员处理完前一业务后,从队列头中获取一个用户出队并呼叫该用户(终端打印输出)。(4)队列信息浏览:工作人员可随时查看队列中目前未处理的所有业务信息。(5)采用模块化设计。二、概要设计1、本程序包含两个模块(1)主函数模块:main(){定义及初始化;让用户控制程序,实现排队叫号功能.}(2)排队叫号系统单元模块:主函数调用排队叫号系统单元模块.2、排队叫号的抽象数据类型定义:voidQueueInitiate(LQueue*Q)Q为结构体指针;操作结果:使队列初始化.intQueueNotEmpty(LQueueQ)判断队列是否为空;操作结果:若队列为空,返回0;不为空,则返回1.intQueueAppend(LQueue*Q,intx)Q为结构体指针,x传输用户的序号;操作结果:用户叫号时,使用户序号按顺序入队.intQueueDelete(LQueue*Q,int*d)*d传输队头元素;操作结果:处理对头元素,并释放头结点.voidDestroy(LQueueQ)操作结果:用户用完程序退出时,摧毁队列,释放内存.四详细设计1、实现菜单函数voidmenu(){printf(****************************************************\n);printf(****************1.排队叫号**************************\n);printf(****************2.业务处理**************************\n);printf(****************3.队列信息浏览**********************\n);printf(****************4.退出******************************\n);printf(****************************************************\n);}2、队列初始化函数voidQueueInitiate(LQueue*Q)/*队列初始化*/{Q-rear=NULL;/*尾指针为空*/Q-front=NULL;/*头指针为空*/}3、判断队列是否为空函数intQueueNotEmpty(LQueueQ)/*队列不能为空*/{if(NULL==Q.front)/*如果头指针为空,则返回0*/{return0;}else{return1;}}4、实现排队叫号函数intQueueAppend(LQueue*Q,intx)/*元素入队*/{LQNode*p;/*p指针指向入队元素*/if((p=(LQNode*)malloc(sizeof(LQNode)))==NULL)/*申请入队元素空间*/{return0;}p-data=x;p-next=NULL;if(Q-rear!=NULL)/*队尾不为空则将入队元素插至队尾后*/{Q-rear-next=p;}Q-rear=p;/*队尾为空则队尾指向入队元素*/if(Q-front==NULL){Q-front=p;/*队头指向入队元素*/}return1;}5、实现业务处理函数intQueueDelete(LQueue*Q,int*d)/*业务处理*/{LQNode*p;if(Q-front==NULL){return0;}else{*d=Q-front-data;/*读取队头元素*/p=Q-front;Q-front=Q-front-next;/*头结点向后移动一个节点*/if(Q-front==NULL){Q-rear=NULL;}free(p);/*释放头结点*/return1;}}6、释放队列函数voidDestroy(LQueueQ)/*摧毁队列*/{LQNode*p,*p1;p=Q.front;/*p指针指向头结点*/while(p!=NULL){p1=p;p=p-next;free(p1);/*逐个释放队列的节点*/}整个程序的流程图如下:进入菜单判断用户的选择排队叫号将用户的序号入队列选择1业务处理选择2内存是否不足内存足够输出报错信息退出程序返回菜单队列是否为空输出报错信息队列为空队头元素出队列队列不为空返回菜单队列信息浏览选择3遍历队列中的元素选择4五调试分析1、该程序的关键就是弄清楚队列及链表的操作方法和原理。首先保证没有句法错误,其次要保证写的函数没有错误,能正常完成要求所需的功能,然后尽量完善各功能,使用户用起来更方便。2、叫号时,输入不同的用户名,随时进行业务处理和队列信息浏览,查看相应功能是否正确。3、本实习作业采用循序渐进的策略,首先分别写好三个相应功能的函数,然后再加入主函数中,以保证整个程序的正确性,也便于随时调整,改正各种错误。调试程序很耗时间,比较的麻烦,往往改动一个地方能影响到很多位置。六测试结果1、通过写该程序,充分理解队列及链表的操作原理,熟悉队列的操作。2、主函数调用子函数时,涉及到参数的传递,要注意到程序里面还有局部变量与全局变量的区别,要时刻注意变量的值,循环调用就要注意到各个子函数的返回值。3、该程序完整地实现了排队叫号系统的功能,程序简洁、明了,用户使用起来方便。七用户使用说明1、本程序在VC下能正常运行。2、程序运行后,出现主菜单,用户首先选择排队叫号功能,输入账号,回车结束,程序会显示用户的序号以及前面排队的人数;3、叫号多次,再选择业务处理功能,程序会打印第一个用户的序号,并叫其来办理业务;4、业务处理完后,返回主菜单,选择队列信息浏览功能,程序会打印出当前未办理业务的人数、用户队列序号和相应用户的账号;5、做完后,退出程序。源程序:#includestdio.h#includestdlib.htypedefcharDataType;#includeCallSystem.hintmain(void){inti=0,countx=0,j=0;inta;charusername[20][20];LQueuelqueue;DataTyperturn;QueueInitiate(&lqueue);QueueNotEmpty(lqueue);while(1){system(cls);menu();printf(请选择相应功能:);scanf(%d,&a);fflush(stdin);switch(a){case1:/*排队叫号*/{printf(请输入您的账号:);scanf(%s,username[i]);i++;countx++;if(0==QueueAppend(&lqueue,i)){printf(内存不足,警告!\n);return;}printf(您的序号是%03d您前面有%d个人\n,i,countx-1);fflush(stdin);printf(\n操作完成,是否继续(N退出,任意键继续)\n);scanf(%c,&rturn);if(rturn=='N')return;}break;case2:/*业务处理*/{inttemp=0;if(0==countx){printf(无人排队,警告!\n);return;}QueueDelete(&lqueue,&temp);printf(请%03d号用户来前台办理业务\n,temp);countx--;fflush(stdin);printf(\n操作完成,是否继续(N退出,任意键继续)\n);scanf(%c,&rturn);if(rturn=='N')return;}break;case3:/*队列信息浏览*/{LQNode*p;inttemp;p=lqueue.front;printf(还有%d个人的业务未处理:\n,countx);while(p!=NULL){temp=p-data;printf(%03d:,temp);p=p-next;printf(%s\n,username[j]);j++;}fflush(stdin);printf(\n操作完成,是否继续(N退出,任意键继续)\n);scanf(%c,&rturn);if(rturn=='N')return;}break;case4:/*退出*/{Destroy(lqueue);return;}break;default:break;}}}封装的头文件:typedefstructqnode{intdata;structqnode*next;}LQNode;typedefstruct{LQNode*front;LQNode*rear;}LQueue;voidmenu(){printf(****************************************************\n);printf(****************1.排队叫号**************************\n);printf(****************2.业务处理**************************\n);printf(****************3.队列信息浏览**********************\n);printf(****************4.退出******************************\n);printf(****************************************************\n);}voidQueueInitiate(LQueue*Q){Q-rear=NULL;Q-front=NULL;}intQueueNotEmpty(LQueueQ){if(NULL==Q.front){return0;}else{return1;}}intQueueAppend(LQueue*Q,intx){LQNode*p;if((p=(LQNode*)malloc(sizeof(LQNode)))==NULL){return0;}p-data=x;p-next=NULL;if(Q-rear!=NULL){Q-rear-next=p;}Q-rear=p;if(Q-front==NULL){Q-front=p;}return1;}intQueueDelete(LQueue*Q,int*d){LQNode*p;if(Q-front==NULL){return0;}else{*d=Q-front-data;p=Q-front;Q-front=Q-front-next;if(Q-front==NULL){Q-rear=NULL;}free(p);return1;}}voidDestroy(LQueueQ){LQNode*p,*p1;p=Q.front;while(p!=NULL){p1=p;p=p-next;free(p1);}}
本文标题:排队叫号系统(带源程序)
链接地址:https://www.777doc.com/doc-7025949 .html