当前位置首页 > 建筑/施工 > 施工组织
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

排队叫号系统(带源程序)

文档格式:DOC| 14 页|大小 226.30KB|积分 10|2022-11-28 发布|文档ID:171775316
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 14
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 一、 课程设计的主要内容题目描述:利用队列模拟一个排队叫号系统功能要求及说明:(1) 系统采用菜单方式操作,要求实现如下功能:(2) 叫号排队:用户叫号时将该用户信息(用户名)入队,并打印用户排队序号、等待人数3) 业务处理:工作人员处理完前一业务后,从队列头中获取一个用户出队并呼叫该用户(终端打印输出)4) 队列信息浏览:工作人员可随时查看队列中目前未处理的所有业务信息5) 采用模块化设计 二、 概要设计1、本程序包含两个模块(1) 主函数模块:main(){定义及初始化;让用户控制程序,实现排队叫号功能.}(2) 排队叫号系统单元模块:主函数调用排队叫号系统单元模块.2、排队叫号的抽象数据类型定义:void QueueInitiate(LQueue * Q)Q为结构体指针;操作结果:使队列初始化.int QueueNotEmpty(LQueue Q)判断队列是否为空;操作结果:若队列为空,返回0;不为空,则返回1.int QueueAppend(LQueue * Q,int x)Q为结构体指针,x传输用户的序号;操作结果:用户叫号时,使用户序号按顺序入队.int QueueDelete(LQueue * Q,int * d)*d传输队头元素;操作结果:处理对头元素,并释放头结点.void Destroy(LQueue Q)操作结果:用户用完程序退出时,摧毁队列,释放内存.四 详细设计1、实现菜单函数void menu(){ printf ("****************************************************\n"); printf ("****************1.排队叫号**************************\n"); printf ("****************2.业务处理**************************\n"); printf ("****************3.队列信息浏览**********************\n"); printf ("****************4.退出******************************\n"); printf ("****************************************************\n");}2、队列初始化函数void QueueInitiate(LQueue * Q) /*队列初始化*/{ Q->rear=NULL; /*尾指针为空*/ Q->front=NULL; /*头指针为空*/}3、判断队列是否为空函数int QueueNotEmpty(LQueue Q) /*队列不能为空*/{ if(NULL==Q.front) /*如果头指针为空,则返回0*/ { return 0; } else { return 1; }}4、实现排队叫号函数int QueueAppend(LQueue * Q,int x) /*元素入队*/{ LQNode * p; /*p指针指向入队元素*/ if((p=(LQNode *)malloc(sizeof(LQNode)))==NULL) /*申请入队元素空间*/ { return 0; } p->data=x; p->next=NULL; if(Q->rear!=NULL) /*队尾不为空则将入队元素插至队尾后*/ { Q->rear->next=p; } Q->rear=p; /*队尾为空则队尾指向入队元素*/ if(Q->front==NULL) { Q->front=p; /*队头指向入队元素*/ } return 1;}5、实现业务处理函数int QueueDelete(LQueue * Q,int * d) /*业务处理*/{ LQNode *p; if(Q->front==NULL) { return 0; } else { *d=Q->front->data; /*读取队头元素*/ p=Q->front; Q->front=Q->front->next; /*头结点向后移动一个节点*/ if(Q->front==NULL) { Q->rear=NULL; } free(p); /*释放头结点*/ return 1; }}6、释放队列函数void Destroy(LQueue Q) /*摧毁队列*/{ LQNode *p,*p1; p=Q.front; /*p指针指向头结点*/ while(p!=NULL) { p1=p; p=p->next; free(p1); /*逐个释放队列的节点*/ }整个程序的流程图如下:五 调试分析1、该程序的关键就是弄清楚队列及链表的操作方法和原理。

    首先保证没有句法错误,其次要保证写的函数没有错误,能正常完成要求所需的功能,然后尽量完善各功能,使用户用起来更方便2、叫号时,输入不同的用户名,随时进行业务处理和队列信息浏览,查看相应功能是否正确3、本实习作业采用循序渐进的策略,首先分别写好三个相应功能的函数,然后再加入主函数中,以保证整个程序的正确性,也便于随时调整,改正各种错误调试程序很耗时间,比较的麻烦,往往改动一个地方能影响到很多位置六 测试结果1、通过写该程序,充分理解队列及链表的操作原理,熟悉队列的操作2、主函数调用子函数时,涉及到参数的传递,要注意到程序里面还有局部变量与全局变量的区别,要时刻注意变量的值,循环调用就要注意到各个子函数的返回值3、该程序完整地实现了排队叫号系统的功能,程序简洁、明了,用户使用起来方便七 用户使用说明1、本程序在VC下能正常运行2、程序运行后,出现主菜单,用户首先选择排队叫号功能,输入账号,回车结束,程序会显示用户的序号以及前面排队的人数;3、叫号多次,再选择业务处理功能,程序会打印第一个用户的序号,并叫其来办理业务;4、业务处理完后,返回主菜单,选择队列信息浏览功能,程序会打印出当前未办理业务的人数、用户队列序号和相应用户的账号;5、做完后,退出程序。

    源程序:# include # include typedef char DataType;# include "CallSystem.h"int main(void){ int i=0,countx=0,j=0; int a; char username[20][20]; LQueue lqueue; DataType rturn; QueueInitiate(&lqueue); QueueNotEmpty(lqueue); while(1) { system("cls"); menu(); printf("请选择相应功能:"); scanf("%d",&a); fflush(stdin); switch(a) { case 1: /*排队叫号*/ { 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; case 2: /*业务处理*/ { int temp=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; case 3: /*队列信息浏览*/ { LQNode * p; int temp; 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; case 4: /*退出*/ { Destroy(lqueue); return; } break; default: break; } }}封装的头文件:typedef struct qnode{ int data; struct qnode * next;}LQNode;typedef struct { LQNode * front; LQNode * rear;}LQueue;void menu(){ printf ("****************************************************\n"); printf ("****************1.排队叫号**************************\n"); printf ("****************2.业务处理**************************\n"); printf ("****************3.队列信息浏览**********************\n"); printf ("****************4.退出******************************\n"); printf ("****************************************************\n");}void QueueInitiate(LQueue * Q){ Q->rear=NULL; Q->front=NULL;}int QueueNotEmpty(LQueue Q){ if(NULL==Q.front) { return 0; } else { return 1; }}int QueueAppend(LQueue * Q,int x){ LQNode * p; if((p=(LQNode *)malloc(sizeof(LQNode)))==NULL) { return 0; } p->data=x; p->next=NULL; if(Q->rear!=NULL) { Q->rear->next=p; } Q->rear=p; if(Q->front==NULL) { Q->front=p; } return 1;}int QueueDelete(LQueue * Q,int * d){ LQNode *p; if(Q->front==NULL) { return 0; } else { *d=Q->front->data; p=Q->front; Q->front=Q->front->next; if(Q->front==NULL) { Q->rear=NULL; } free(p); return 1; }}void Destroy(LQueue Q){ LQNode *p,*p1; p=Q.front; while(p!=NULL) { p1=p; p=p->next; free(p1); }} 。

    点击阅读更多内容
    卖家[上传人]:仙人指路
    资质:实名认证