医院排队叫号系统.docx
《医院排队叫号系统.docx》由会员分享,可在线阅读,更多相关《医院排队叫号系统.docx(18页珍藏版)》请在冰豆网上搜索。
![医院排队叫号系统.docx](https://file1.bdocx.com/fileroot1/2022-11/28/d93f1f1c-81ca-4cf0-a337-d79ff3fbb15b/d93f1f1c-81ca-4cf0-a337-d79ff3fbb15b1.gif)
医院排队叫号系统
医院排队叫号系统
无锡太湖学院C++课程设计报告
课程:
C++课程设计
系别:
信机系
班级:
计算机科学与技术(软件)113班学号:
1121073、1121082、1121085、1121088
袁震宇、葛嘉明、罗炜烨、季军(排名不分先姓名:
后)
选题名称:
医院排队叫号系统的设计与实现选题难易级别:
A级/B级/C
起止时间:
2012年1月
指导教师:
詹重咏
一(课程设计的目的及要求...................................................3
1.1目的................................................................................3
1.2需求的分析....................................................................3二(课程设计的具体实现.......................................................3
2.1以下为主要的功能列表................................................3
2.2基本框架........................................................................4
2.3流程图:
........................................................................5
2.4详细设计........................................................................6三.结束语..................................................................................7四(源代码...............................................................................8
五(参考文献.........................................................................17
一(课程设计的目的及要求
1.1目的:
近年来,随着医疗事业的发展,医院的规模不断扩大,科室门类划分的也越来越细,随之而来的是病人排队挂号和看病变的繁琐,等待时间变长,为此,需要制定一种良好的排队策略,减少病人的等待时间,提高医院的服务质量。
1.2需求的分析:
(1)、为了真实实现分诊的功能,在程序里面加入了功能列表菜单和一些选择提示。
(2)、该程序主要运用到链表和队列。
这个程序主要体现在链表的表头和表尾进行操作。
(3)、规定一个固定容量的候诊区进入策略一模拟功能,候诊区里的排队操作采用存储链表的头指针和尾指针。
可以按规定的规则进行模拟排队。
二(课程设计的具体实现
2.1以下为主要的功能列表:
(1)、进入医生窗口创建功能
开始前,医院必须先创建医生窗口来确定现在有多少普通医生和专家医生在就诊,以方便是否满足病人的要求,可安排好是否有足够医生,以方便就诊。
(2)、进入策略一病人挂号功能
病人选择该功能时,按照策略一,系统会记录为你挂号的号牌,并且会记录你的挂号的就诊级别。
当病人挂号完毕后,可以进入下一个功能,去选择你所需的医生就诊号,并且记录下医生就诊号(区分专家号和普通号)。
(3)、进入策略一模拟功能
病人挂号和选择就诊号完毕后,进入候诊区进行等待,开始模拟策略一的就诊,记录
每个病人的诊断时间,此时为保证对病人的透明度,可提前通知病人还需要等待的时间,时间为更加切合实际,采用每个病人单独随机产生。
根据在之前选择的就诊级别,医生会给此类病人就诊两次,以保证病人在现实用的健康保证。
(4)、进入策略二病人挂号功能
病人选择该功能时,按照策略二,系统会记录为你挂号的号牌,并且会记录你的挂号的就诊级别。
当病人挂号完毕后,可以进入下一个功能,去选择你所需的医生就诊号,并且记录下医生就诊号(区分专家号和普通号)。
(5)、进入策略二模拟功能
病人挂号后,病人挂号和选择就诊号完毕后,进入候诊区进行等待,规定一个固定容量的诊区候诊区和不限制容量的候诊区开始模拟策略二的就诊,记录每个病人的诊断时间,此时为保证对病人的透明度,可提前通知病人还需要等待的时间,时间为更加切合实际,采用每个病人单独随机产生。
根据在之前选择的就诊级别,医生会给此类病人就诊两次,以保证病人在现实用的健康保证。
(6)、进入策略一医生检查窗口
选择该功能后,按照策略一的模拟记录的诊断信息,医生可查询是否还有病人还需就诊。
(7)、进入策略二医生检查窗口
选择该功能后,按照策略二的模拟记录的诊断信息,医生可查询是否还有病人还需就诊和就诊区和候诊区是否有病人等待。
(8)、退出系统
完成所有功能后,选择该功能可以退出该系统。
2.2基本框架:
1.我们假设医院实行八小时工作制,一天工作八小时,即480分钟。
2.医院门诊分为普通号和专家号,普通号一个科室有数位医生,专家号一个科室仅有一个医生,并且将普通好和专家号相互独立,以方便模拟。
3.我们将病人分为A类和B类,对于A类病人,我们仅进行一次诊断,即用户挂号后进入队列,在进行一次诊断后即完成诊治。
B类病人需要进行两次诊断和一次检查,在完成一次诊断后,医生开出检查意见,病人进行检查,完成后病人需返回科室进行第二次诊断,在第二次完成后即完成诊治。
4.虽然实际中在一定时间内病人的产生应该按照泊松分布,由于参数设定的困难,我们将病人的产生使用一般的随机数生成,同理,病人的诊治时间也使用确定的时间。
5.实际中,每位医生每天接诊的人数是有一定限制的,尤其是专家门诊。
但考虑病人来源的数据无论自实际数据库,还是来自根据实际情况的随机模拟数据,各类病人的数量都对应了实际的各科室接诊病人的限制。
6.对于由于到达时间过晚,部分病人将无法完成诊断,我们将忽略这部分病人。
两种策略的制定:
一级分诊队列模式:
每个诊室队列只对应一个诊区候诊队列,我们将之记作Q,一般排队规则是:
?
刚完成挂号的病人,添加在Q的末尾;?
按医嘱完成体检的病人,直接插入在Q
的首部。
这种排队规则广泛应用于中小医院。
二级分诊队列模式:
每个诊室队列对应一个诊区候诊队列和一个候诊厅候诊队列,我们将前者记作Q1,后者记作Q2。
一般情况下,因为诊区空间限制,Q1的人数限制在2、3人左右;而候诊厅空间较大,所以对Q2的人数不作限制。
一般排队规则是:
?
刚完成挂号的病人,添加在Q2的末尾;?
按医嘱完成体检的病人,直接插入在Q2的首部;?
医师始终对Q1中的首位病人诊治,每位病人诊治结束时,若Q2不空,则Q2的首位病人脱离Q2,进入Q1的尾部。
这种排队规则广泛应用于大中型医院。
2.3流程图:
进入医生窗口创建
进入策略一病人挂号
进入策略一模拟
Main()进入策略二病人挂号
进入策略二模拟
进入策略一医生检查窗口
进入策略一医生检查窗口
退出系统
2.4详细设计
病人的就诊操作主要做到挂号号码和医生就诊号码选择不会出现重复占用,合理安排就诊时间以及租到尽可能快的操作。
提高效率完成功能。
医生主要设立排队规则,例如,一个候诊区具有规定的候诊数量,不能太大,也不能太小医生对每个病人的诊断时间采用随机产生(程序对数据的需要,现实中看具体的诊断需要)
医院主要是做病人和医生之间的就诊连接那一块,使得通过就诊号和挂号之间做到合理的对口,当然,主要是病人去选择自己所需的医生,对症就诊。
link类:
定义链表类,函数中定义病人的挂号类型,挂号序列,和医生类型
Queue类:
定义队列的头尾指针;
定义队列的初始队列函数;
定义队列的出队,入队函数;
定义取对头函数和判断队列是否为空和输出的函数;
定义友元类custom;
Custom类:
定义病人的随机产生和等待队列
Doctor类:
定义医生的创建窗口函数;
定义医生的普通医生和专家的类型;定义医生检查窗口;
Manage类:
定义策略一和策略二的模拟信息函数;定义策略一和策略二的医生检查窗口函数;
三.结束语
通过将近一周的课程设计,感受颇深。
课程设计的一个重要功能,在于运用学习成果,检
验学习成果。
运用学习成果,把课堂上学到的系统化的理论知识,尝试性地应用于实际设计工作,并从理论的高度对设计工作的现代化提出一些有针对性的建议和设想。
检验学习成果,看一看课堂学习与实际工作到底有多大距离,并通过综合分析,找出学习中存在的不足,以便为完善学习计划,改变学习内容与方法提供实践依据。
对我们计算机专业的本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。
通过课程设计,让我们找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识
这次我的题目是基于医院分诊系统的排队策略,众所周知,医院排队在日常生活中处处可见,所以这次的课程设计很有实际价值,利用理论知识,运用到实际生活中。
通过一周的努力,不仅仅让我对学过的知识加深了印象,并认识到了理论必须联系实际来解决问题,分析问题。
四(源代码
#include
#include
#include
#include
#include
usingnamespacestd;
constintm=100;
charstick[m];
classlink{
public:
stringdata;
charstickxing;
charxinghao;
link*next;
};
classqueue
{
public:
link*front,*rear;
voidiniqueue(queue&s);
voidenqueue(queue&s,charx);
voidenqueue(queue&s,stringx,chary);
voidenqueue1(queue&s,stringx,chary);
voiddlqueue(queue&s);
stringgethead1(queue&s);
chargethead2(queue&s);
chargethead3(queue&s);
intempty(queue&s);
voidprint(queue&s);
friendclasscustom;};
voidqueue:
:
iniqueue(queue&s){
link*p;
p=newlink;
p->next=NULL;
s.front=p;
s.rear=p;
}
voidqueue:
:
enqueue(queue&s,charx)
{link*p;
stringnum;
stringnum1;
p=newlink;
if(x=='1'||x=='2')
p->xinghao=x;
else
{cout<<"请输入病人挂号序号:
num"<cin>>num;
p->data=num;
p->stickxing=x;
cout<<"病人要挂普通号还是专家号:
a(表示普通号)b(表示专家号)"<cin>>p->xinghao;}
p->next=s.rear->next;
s.rear->next=p;
s.rear=p;
}
voidqueue:
:
enqueue(queue&s,stringx,chary)
{link*p;
stringnum;
stringnum1;
p=newlink;
if(y=='c'){
p->data=x;
p->stickxing=y;
p->next=s.rear->next;
s.rear->next=p;
s.rear=p;}
elseif(y=='a')
{
p->data=x;
p->stickxing=y;
p->next=s.front->next;
s.front->next=p;
}
}
voidqueue:
:
enqueue1(queue&s,stringx,chary)
{link*p;
stringnum;
stringnum1;
p=newlink;
p->data=x;
p->stickxing=y;
p->next=s.rear->next;
s.rear->next=p;
s.rear=p;
}
stringqueue:
:
gethead1(queue&s)
{
if(s.front==s.rear)
returnNULL;
else
returns.front->next->data;
}
charqueue:
:
gethead2(queue&s)
{
if(s.front==s.rear)
returnNULL;
else
returns.front->next->stickxing;
}
charqueue:
:
gethead3(queue&s)
{
if(s.front==s.rear)
returnNULL;
else
returns.front->next->xinghao;
}
voidqueue:
:
dlqueue(queue&s)
{
link*p;
p=s.front->next;
if(p->next==NULL)
{
s.front->next=NULL;
s.front=s.rear;
}
elses.front->next=p->next;
deletep;
}
intqueue:
:
empty(queue&s)
{
if(s.front==s.rear)
return1;
else
return0;
}
classcustom{
public:
voidproductstick(intn);
voidmakewaitlist(queue&custom1,intn);
voidmakewaitlist1(queue&custom2,queue&Q,intn);
};
voidcustom:
:
productstick(intn)
{
charstickclass;
intx;
srand(time(NULL));
for(inti=1;i<=n;i++)
{x=int(rand())%2;
if(x)
stickclass='a';
elsestickclass='b';
stick[i]=stickclass;
}
}
voidcustom:
:
makewaitlist(queue&custom1,intn)
{
custom1.iniqueue(custom1);
for(inti=1;i<=n;i++)
custom1.enqueue(custom1,stick[i]);
}
voidcustom:
:
makewaitlist1(queue&Q1,queue&Q2,intn)
{
Q1.iniqueue(Q1);
Q2.iniqueue(Q2);
for(inti=1;i<=n;i++)
{if(i<=2)
Q1.enqueue(Q1,stick[i]);
else
Q2.enqueue(Q2,stick[i]);
}
}
classdoctor
{
public:
voidproctordoctor(queue&doctoren);
voidservestick(queue&doctoren,queue&customque);
voidsrvestickfinish(queue&doctoren,queue&customque);
charjibei;
};
voiddoctor:
:
proctordoctor(queue&doctoren)
{charx;
intn;
doctoren.iniqueue(doctoren);
cout<<"请输入普通医生和一个专家人数:
n"<cin>>n;
for(inti=1;i<=n;i++)
{cout<<"请输入1表示普通医生,2表示一个专家"<cin>>x;
jibei=x;
doctoren.enqueue(doctoren,jibei);}
}
voiddoctor:
:
servestick(queue&doctoren,queue&customque)
{queuestorage;inty;
charch;
if(doctoren.empty(doctoren))
cout<<"没有空闲医生可服务请等待:
"<else
{stringx2=customque.gethead1(customque);
ch=doctoren.gethead3(doctoren);
doctoren.dlqueue(doctoren);
storage.iniqueue(storage);
storage.enqueue(storage,ch);
cout<请耐心等待!
:
"<srand(time(NULL));
y=int(rand());
Sleep(3000+y);
}
}
voiddoctor:
:
srvestickfinish(queue&doctoren,queue&customque)
{stringx;
x=customque.gethead1(customque);
cout<customque.dlqueue(customque);
doctoren.enqueue(doctoren,jibei);
}
classmanage{
public:
void
strategy1(queue&customque,queue&doctorque,custom&customren,doctor&doctorman,queue&ch
eckstick);
void
strategy2(queue&customque,queue&Q,queue&doctorque,custom&customren,doctor&doctorman,
queue&checkstick);
voiddoctorcheck(queue&checkstick,queue&customque);
voiddoctorcheck1(queue&checkstick,queue&cQ2);
intcouttime();
};
intmanage:
:
couttime()
{intx;
time_tnow_time;
now_time=time(NULL);
structtmnow=*localtime(&now_time);
x=now.tm_sec;
returnx;}
void
manage:
:
strategy1(queue&customque,queue&doctorque,custom&customren,doctor&doctorman,q
ueue&checkstick)
{stringx;
staticintcount1=0;
inttime1,time2;
if(!
customque.empty(customque))
{x=customque.gethead1(customque);
time1=0;
if(customque.gethead2(customque)=='a'||customque.gethead2(customque)=='c')
{
doctorman.servestick(doctorque,customque);
doctorman.srvestickfinish(doctorque,customque);
time2=couttime();
cout<<"诊断花费"<count1=count1+(time2-time1);
}
else{
doctorman.servestick(doctorque,customque);
checkstick.enqueue(checkstick,x,'c');
doctorman.srvestickfinish(doctorque,customque);
time2=couttime();
cout<<"诊断花费"<count1=count1+(time2-time1);}
}
else
{cout<<"策略一的花费总的时间为"<cout<<"诊室区没有病人等待!
"<}
void
manage:
:
strategy2(queue&Q1,queue&Q2,queue&doctorque,custom&customren1,doctor&doctor
man,queue&checkstick)
{stringx,num1;charyy;staticintcount2=0;inttime1,time2;
if(!
Q1.empty(Q1))
{x=Q1.gethead1(Q1);
time1=0;
if(Q1.gethead2(Q1)=='a'||Q1.gethead2(Q1)=='c')
{
doctorman.servestick(doctorque,Q1);
doctorman.srvestickfinish(doctorque,Q1);
time2=couttime();
cout<<"诊断花费"<count2=count2+(time2-