课程设计医院门诊候诊队列管理系统.docx
《课程设计医院门诊候诊队列管理系统.docx》由会员分享,可在线阅读,更多相关《课程设计医院门诊候诊队列管理系统.docx(31页珍藏版)》请在冰豆网上搜索。
课程设计医院门诊候诊队列管理系统
结构化程序课程设计报告
设计名称医院门诊候诊队列管理系统
指导教师_____
班 级__
学生姓名完成日期一
系统(问题)定义与需求分析……………………………3
模块算法设计………………………………………………4
流程图设计…………………………………………………5
详细设计……………………………………………………8
系统实现与测试……………………………………………11
课程总结……………………………………………………18
组员及其任务分配…………………………………………19
源程序代码…………………………………………………20
一、系统(问题)定义与需求分析
题目:
医院门诊候诊队列管理系统
要求采用先来先就诊的排队方式(就诊顺序与挂号单编号无关),假设挂号时编码是连续的,但由于同一个门诊科目有三个诊室,其中35(含35)岁以上的在第一诊室,35岁以下的男患者进第二诊室,其它的进第三诊室,程序启动后显示下列菜单:
系统功能的基本要求:
(1)********************************挂号**********************************
(2)********************************叫号**********************************
(3)*******************************分诊室*********************************
(4)*************************显示各诊室队列信息****************************
(5)***统计当天就诊的患者情况(要求按性别进行统计和按任意年龄区段进行统计)***
(6)******************************结束程序********************************
选1时,提示用户在一行内输入姓名及挂号单编号;
选2时,显示排在队列中第一位患者姓名、挂号单编号,并将其从挂号序列中删除
选3时,进行诊室分配
选4时,按队列顺序显示各个诊室排队人的姓名、挂号单编号及所在诊室
选5时,进行两种统计方法的选择,并进行必要的统计计算
选6时,退出程序的运行
要求1~5中每一个步骤完成后都能重新显示此选择菜单
系统功能分析:
1.能实现挂号功能,提示用户在一行内输入姓名及挂号单编号,并储存;
2.能实现叫号功能,显示排在队列中第一位患者姓名、挂号单编号,并将其从挂号序列中删除;
3.根据病人的性别与年龄,能实现诊室的分配;
4.能按队列顺序显示各个诊室排队人的姓名、挂号单编号及所在诊室。
5.按性别进行统计和按任意年龄区段进行统计,并打印输出;
6.完成每个步骤之后都能重新显示此选择菜单。
二、模块算法设计
模块二:
挂号系统voidguahao(structhospitalhos[])
模块图:
三、流程图设计
模块一,主界面函数的详细流程图:
选
择
主界面模块,通过主界面面板中的选择项,输入相应的数字即可进入对应的功能模块。
但是,在运行模块二、模块三和模块四三个功能模块时,需要先将模块二、模块三依次运行,直至两者显示“叫号完毕!
”,“诊室已分配完毕!
”,这时方可进行模块四的运行。
模块二,挂号系统的详细流程图:
系统分配
选择1
选择0
挂号模块,是通过数组记录患者的信息。
其中患者的编号是预先制定好的,从1000开始,依次增加。
并且,每个患者的信息输入完成之后,还可选择“1”继续输入、“2”停止输入并返回主菜单,以此来控制数据的采集。
模块运行完毕时,回车即可返回主界面。
模块三,叫号系统的详细流程图:
叫号模块,能实现显示排在队列中第一位患者姓名、挂号单编号,然后,通过清屏形式将其从挂号序列中删除的功能。
通过分诊步骤之后,再操作此模块将显示下一位患者的信息,即实现了题目中“从挂号序列中删除”的要求。
模块运行完毕时,回车即可返回主界面。
模块四,分诊模块的详细流程图:
是
否是
否
按照年龄及性别进行分诊模块,能实现对患者进行分诊功能,先通过判断年龄进行第一诊室的分配,然后再将剩余的患者进行性别判断进行第二、第三诊室的分配。
即年龄在35岁(含35岁)以上的患者分在第一诊室,35岁以下的男性患者分在第二诊室,剩余患者的分在第三诊室。
此步骤需要和叫号步骤交替运行,方可将挂号患者所在的诊室分配完全。
模块运行完毕时,回车即可返回主界面。
模块五,显示功能详细流程图:
显示各患者队列及诊室信息模块,可以实现将当前所有患者的所在诊室以及其详细信息展示出来的功能,所显示的信息分为三个部分展示。
而且模块运行完毕时,回车即可返回主界面。
模块六,统计模块的详细流程图:
是
否
统计模块,分为性别统计和按任意年龄统计。
按任意年龄统计,通过输入的年龄界限X与年龄数组中的数据进行判断比较,输出相应的人数,并且输入的年龄界限必须是可行的实际值,否则无意义;按性别统计,直接打印数据即可。
模块运行完毕时,回车即可返回主界面。
模块七,系统日志功能详细流程图:
记录挂号、叫号
分诊室等操作
系统日志模块,是对用户的操作进行记录的函数。
本程序中只对患者挂号操作、叫号操作以及分诊室操作三方面进行记录,在患者诊室划分完毕之后生成系统日志。
模块运行完毕时,回车即可返回主界面。
四、详细设计
1.头文件及全局变量的定义
在头文件“hospital.h”中定义的全局变量有:
intcount=0;//全局变量,挂号总人数;
intS1=0;//全局变量,第一诊室人数;
intS2=0;//全局变量,第二诊室人数;
intS3=0;//全局变量,第三诊室人数;
intj=10000;//全局变量,初始挂号编号;
intm=0;//全局变量,已叫号人数;
intl=0;//全局变量,判定患者是否分配完毕;
inth[10000];//全局变量,日志功能中记录操作痕迹;
inta=0;//全局变量,日志功能中操作痕迹总量;
time_tnow[10000];//全局变量,日志功能中显示时间;
d=0;//全局变量,日志功能中时间顺序的下标;
还有统一定义的变量,如结构体数组“structhospitalhos[]”中的姓名name、年龄age、性别sex以及诊室room等。
2.各模块的函数定义及相关变量的使用
模块一、主界面:
函数原型:
voidintroduce()
参数:
无
返回值:
void
模块的具体实现:
直接采用printf函数将主界面打印出来。
模块二、挂号函数:
函数原型:
voidguahao(structhospitalhos[])
参数:
hos[]用来存入挂号者的信息
返回值:
void
函数的具体设计:
定义变量i,用do—while循环输入每个挂号病人的信息(编号已经预先制定),再将病人编号信息定为J(10000)每循环一次全局变量count自加一次,在循环的结尾提示病人编号为J且给出选择0或1(将其赋给i,若i=0结束输入;若i=1继续输入),这样在输完病人的信息后,系统会自动分配编号给病人。
当i=0时,停止采集数据,并清屏、暂停以及引用introduce()函数返回主界面。
模块三、叫号函数:
函数原型:
voidjiaohao(structhospitalhos[])
参数:
hos[]输出存入的病人信息
返回值:
void
函数的具体设计:
先清屏,再定义局部变量i(用于循环控制),利用结构体数组输出被叫号病人的各项信息,同时m++(m表示被叫号的人数);if:
m==count则显示叫号完毕,else:
显示剩余挂号人数(count-m),然后利用for循环(i=0;i模块四、分诊室函数:
函数原型:
voidfenzhen(structhospitalhos[])
参数:
hos[]利用结构数组存入的病人信息将其分类
返回值:
void
函数的具体设计:
先清屏,定义局部变量k=m-l,先用if函数判断m=0?
(若是,则显示“还未进行叫号!
”;若否,则执行下一步),使用if–else函数连续两次判断年龄age与35岁的关系,以及是否为man,再根据题意分配到各个诊室,分配到的诊室,对应的变量(S1、S2、S3)自加;然后显示此病人(被叫号之后的患者)的所有信息(包括所分配的诊室)。
最后清屏、暂停,并引用introduce()函数返回主界面。
模块五、显示函数:
函数原型:
voidxianshi(structhospitalhos[])
参数:
hos[]将已叫号的病人信息显示出来,并显示各分诊室的病患信息
返回值:
void
函数的具体设计:
定义局部i,利用for函数,for(i=0;i最后清屏、暂停,并引用introduce()函数返回主界面。
模块六、统计函数:
函数原型:
voidtongji(structhospitalhos[])
参数:
hos[]利用存入的数据进行统计,分性别统计和按任意年龄统计
返回值:
void
函数具体设计:
先定义局部变量man、woman、X(任意年龄)、up(高于此年龄的人数)、down(低于此年龄的人数)、n(循环控制)。
先在for(n=0;n将就诊人数m以及man、woman、up、down的相关数据打印输出,最后清屏、暂停,并引用introduce()函数返回主界面。
模块七、系统日志功能:
函数原型:
voidrizhi()
参数:
无
返回值:
void
函数具体实现:
引用记录数组h[],在需要记录的函数里进行记录,每记录一次,数组h[]的下标自加;再用同样方法用数组now[]记录每次操作对应的时间。
然后,将相关记录按顺序打印输出。
最后清屏、暂停,并引用introduce()函数返回主界面。
一、
二、
三、
四、
五、系统实现与测试
1.开发平台和工具选择及软件编码参考规范
程序风格:
1)本程序使用vc6.0进行编译的,并采用TAB键进行缩进控制;
2)左右花括号位置采用GNU的风格,使左括号与右括号都在同一列左对起;
3)程序采用了分文件形式,每个文件对应各自相应的模块;
4)每个分程序代码段的前端添加了多行注释和说明;
5)新增的功能(如:
暂停、清屏功能)和简短代码后面进行了单行注释;
6)关键字if,while,for与其后的条件判断的表达式之间,插入一个空格分隔;
7)程序中的全局变量和相关变量的定义和取值等进行了细致的注释;
8)各个模块的函数标识符是使用汉语拼音进行命名的,通俗易懂。
2.系统测试
各模块展示:
模块一、主界面voidintroduce()函数:
模块二、挂号voidguahao(structhospitalhos【】)函数:
模块三、叫号voidjiaohao(structhospitalhos【】)函数:
模块四、分诊室voidfenzhen(structhospitalhos【】)函数:
模块五、显示voidxianshi(structhospitalhos【】)函数:
模块六、统计voidtongji(structhospitalhos【】)函数:
模块七:
系统日志功能voidrizhi()
五、
六、课程总结
1.心得体会
一个人常会被自己的习惯思维所局限,交流与合作通过思维碰撞和知识互补可以拓宽自己的思路,拓展自己的知识面,一个人因为自己的习惯思维,常会对自己犯的错误视为不见,而通过别人的帮助检测能够帮助较快的找到错误所在。
因此,我们需要从团队合作中发现自己的不足和差距。
这一次的课程设计真的让我们获益匪浅,不仅让我们体会到编程的魅力,也更让我们明白如何团结合作。
编程真的需要细心以及耐心,我们常常会遇到问题,这个时候我们就要冷静,耐心的去面对,还有就是平时要有好的编程习惯,这一点真的很重要。
另外我们在编程的时候也要注重与别人的交流和合作,毕竟我们在团队合作中所得到的经验比个人实践摸索得到的更加丰富、更加完善,而且在合作中我们会收获成功,还能收获友谊,总之团队合作对我们来说是至关重要的!
2.设计的独特之处
1)功能选择栏可以在每个模块运行之后再次出现;
2)新增了程序日志功能,记录当前操作和时间;
3)通过使用特殊字符、TAP键、空格等,使运行界面更加美观。
3.课题完成情况
本程序已将题目的要求实现出来,程序能够正常运行,且在较为极端的操作下仍能工作(即各步骤的重复操作以及不按步骤进行操作)。
但是程序中的日志功能效果不佳,在添加使用日志功能时,刚开始显示的是静态时间,即每一步操作的时间记录都相同;最后,经过更改,虽然时间与电脑同步,但运行时有警告。
另外,程序中多次使用了for语句,使程序的可读性和易理解性降低。
3.
4.设想
在程序运行的第一项——挂号系统中,若是可以在患者信息输入错误的情况下能进行及时的修改或删除的话,程序的实用性将大大提高;若是可以将主界面通过做成消息框进行显示的话,程序运行效果会更好。
组员及其任务分配
源程序代码(分文件展示):
1.主函数(Main.c)
#include
#include
#include
#include
#defineMax1000
#include"Head.h"
#include"introduce.h"
#include"guahao.h"
#include"jiaohao.h"
#include"fenzhen.h"
#include"xianshi.h"
#include"tongji.h"
#include"rizhi.h"
intmain(void)
{
intchoice;
introduce();
do
{printf("Enteryourchoice:
");
scanf("%d",&choice);
system("cls");//清屏
switch(choice)
{
case1:
guahao(hos);break;
case2:
jiaohao(hos);break;
case3:
fenzhen(hos);break;
case4:
xianshi(hos);break;
case5:
tongji(hos);break;
case7:
exit(0);break;
case6:
rizhi();break;
default:
system("cls");
introduce();
}
}while(choice!
=7);
return0;
}
2.头文件(Head.h):
intcount=0;//全局变量,挂号总人数;
intS1=0;//全局变量,第一诊室人数;
intS2=0;//全局变量,第二诊室人数;
intS3=0;//全局变量,第三诊室人数;
intj=10000;//全局变量,初始挂号编号;
intm=0;//全局变量,已叫号人数;
intl=0;
inth[10000];
inta=0;
time_tnow[10000];
d=0;
structhospital
{
charname[10];
intnum;
intage;
introom;
charsex[5];
}hos[Max];
3.主界面——功能选择(introduce.h):
voidintroduce()
{
printf("---------------------------------------------------------\n");
printf("|*******************************************************|\n");
printf("|**|\n");
printf("|**|\n");
printf("|*医院门诊候诊管理系统*|\n");
printf("|**|\n");
printf("|**|\n");
printf("|**|\n");
printf("|**|\n");
printf("|*功能选择:
*|\n");
printf("|*1.挂号*|\n");
printf("|*2.叫号*|\n");
printf("|*3分诊室*|\n");
printf("|*4.各诊室信息*|\n");
printf("|*5.当前人数统计*|\n");
printf("|*6.系统日志*|\n");
printf("|*7.退出程序*|\n");
printf("|**|\n");
printf("|**|\n");
printf("|**|\n");
printf("|*请按数字键进行选择*|\n");
printf("|*******************************************************|\n");
printf("---------------------------------------------------------\n");
}
4.挂号(guahao.h):
/*
实现挂号功能,提示用户在一行内输入姓名、性别等信息并储存;
*/
voidguahao(structhospitalhos[])
{
inti;
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>医院门诊候诊管理系统<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
printf("\n");
printf("\n");
printf("\n");
do
{
printf("请输入姓名:
");
scanf("%s",hos[count].name);
printf("请输入年龄:
");
scanf("%d",&hos[count].age);
printf("请输入性别(manorwoman):
");
scanf("%s",hos[count].sex);
hos[count].num=j;
printf("该患者编号为%d.\n",j);
count++;
h[a]=1;
time(&now[d]);
d++;
a++;
j++;
printf("请选择(1:
继续0:
返回):
");
scanf("%d",&i);
printf("\n");
}while(i!
=0);
if(i==0)
{
system("cls");
introduce();
}
}
5.叫号(jiaohao.h):
/*
实现叫号功能,显示排在队列中第一位患者姓名、挂号单编号等信息;
*/
voidjiaohao(structhospitalhos[])
{
inti;
system("cls");
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>医院门诊候诊管理系统<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
printf("\n");
printf("\n");
printf("\n");
if(m!
=l)
{
printf("请分配诊室后再叫号!
\n");
}
else{
if(m==count)
{
printf("叫号已完毕!
\n");
}
else{
printf("被叫号人信息如下:
\n");
printf("\n");
printf("姓名:
%s\n年龄:
%d\n编号:
%d\n",hos[m].name,hos[m].age,hos[m].num);
m++;
h[a]=2;
time(&now[d]);
d++;
a++;
if(m==count)
{
printf("叫号已完毕!
\n");
}
else
{
printf("此时剩余挂号人数为:
%d\n",count-m);
printf("\n");
for(i=m;i{
printf("姓名:
%s\n年龄:
%d\n编号:
%d\n性别:
%s",hos[i].name,hos[i].age,hos[i].num,hos[i].sex);
printf("\n");
printf("\n");
}
}
}
}
system("pause");//暂停
system("cls");//清屏
introduce();
}
6.按照性别及年龄分诊室(fenzhen.h)
/*
根据病人的性别与年龄,实现诊室的分配;
*/
voidfenzhen(structhospitalhos[])
{