论文部分内容阅读
摘要:通过对医院信息系统的需求分析,我们得出了相应的算法,并对在医院信息系统开发中所涉及到的算法进行了详细的描述。
关键字:医院系统,设计,算法
算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。
一、算法的主要功能
医院信息系统中排队叫号系统用到的数据结构是队列结构,根据各科室共享信息的原理,我们选择链队。
由于就诊患者的数量具有不确定性,所以不适合采用静态数组,应该选择具有动态性的链表。而根据患者就诊原则——“先到先诊,后到后诊”,采用具有“先进先出,后进后出”特点的队列可以满足;但由于一位患者可能有多项检查检验,则排队过程中会存在多科室同时候诊,患者可以在等候时间最短的科室得以检查,同时为了避免漏诊,所以要将跳号的仍然保留在队列中继续处于候诊状态,所以采用链式结构能合理地解决这一问题。
候诊链队的基本操作主要存在每日上班科室初始化候诊队列操作、下班前队列判空操作以及销毁队列操作、挂号室患者入队操作、诊断时患者取对头元素以及出队操作操作。
1、链队结构描述如下:
Typedefstructnode
{ datatypedata;
structnode *next;
} QNode; /*链队结点的类型*/
Typedefstruct
{ QNnode *front,*rear;
}LQueue; /*将头尾指针封装在一起的链队*/
其示意图如图所示。
链队示意图
候诊循环链队中,结点主要有两种类型:队首结点和记录就诊患者挂号信息的结点。其中,通过队首结点的front指针和rear可以判断候诊队列中是否还有候诊患者;通过向元素入队操作实现候诊患者的排队候诊;通过对队列元素的出对操作实现候诊患者就诊。
2、用到的基本操作
(1)功能:初始化一新队列
入口参数:无
返回值:新顺序队列指针,null表示失败
LQueueInit_SeqQueue( )
{ LQueueQ;
Q=( PSeqQueue )malloc(sizeof(SeqQueue));
if (Q)
{ Q->front=0;
Q->rear=0;
printf("置空队列成功!");
}
return Q;
}
(2)功能:判断队列是否为空
入口参数:顺序队列
返回值:1表示为空,0表示非空
intEmpty_LQueue(LQueue Q)
{if (Q && Q->front==Q->rear)
return (1);
else
return (0);
}
(3)功能:入队操作
入口参数:顺序队列和待入队元素x
返回值:1表示成功,-1表示队满溢出
int In_LQueue (LQueue Q , DataTypex)
{ if ((Q->rear+1)%MAXSIZE==Q->front)
{ printf("队满");
return -1; /*队满不能入队*/
}
else
{ Q->rear=(Q->rear+1) % MAXSIZE;
Q->data[Q->rear]=x;
return 1;/*入队完成*/
}
}
二、主要算法描述
(1)用户登录验证算法:
【定义】在多用户的大型数据库系统,用户对数据库操作权限会有区别,因此,我们需要设计系统用户登录窗口,来完成用户的确认与权限控制。通常我们都是在数据库中添加一张人员表,保存人员信息、登录用户名以及口令,但这种方法安全性并不是很高。其它,我们可以使用该方法登录窗口时,需要采用动态生成数据库连接代码,然后连接数据库,如果用户存在,并且录入的口令正确,则数据库连接成功,这样便可以打开系统主窗口了。
【输出】响应前台的用户验证请求。
【算法流程】设计“确定”按钮Clicked事件的代码如下:
w_login.visible = false//暂时隐藏登录窗口Open(w_welcome)//打开欢迎或者数据库连接等待窗口
SetPointer(HOURGLASS!) //将光标变成沙漏型string ls_user,ls_pass //读取用户录入的用户名与口令ls_user = sle_username.text
ls_pass = sle_password.text
//从注册表中读取所有数据库信息并存储在“sqlca”中,其中gs_key是你的软件注册位置
RegistryGet(gs_hkey, "DBMS", RegString!, sqlca.DBMS)
RegistryGet(gs_hkey, "Database", RegString!, sqlca.Database)
//生成数据库连接参数,除了用户名与口令外,其他由系统的需要而定。
SQLCA.DBParm+= ;UID="+ls_user+";PWD="+ls_pass+&&"',PBUseProcOwner='Yes',
ConnectOption='SQL_DRIVER_CONNECT,SQL_DRIVER_NOPROMPT'"CONNECT using sqlca;
if sqlca.sqlcode<>0 then
//数据库连接失败,说明用戶录入口令不正确,或者不存在该用户
close(w_welcome)messagebox("登录","数据库连接失败!")
le_password.text=""
sle_password.setfocus()
success=false
w_login.visible=true
elsesuccess=true
open(w_main)//进入主窗口
close(w_parent)end if
(2)门诊挂号算法:
【定义】在窗体w_mzgh1的OPEN事件中,先设置单个控件的状态,然后从数据库取得收费类型、挂号类型、科室资料、医生资料等信息添加到相应的下拉列表框中。
【输出】患者的就诊科室以及就诊号。
【算法流程】
string ls_temp //设置单个控件的状态
sle_xm.displayonly = true
ddlb_xb.enabled = false
sle_nl.displayonly = true
ddlb_mz.enabled = false
ddlb_fylx.enabled = false
ddlb_ghks.enabled = false
ddlb_ghlx.enabled = false//添加下拉列表框的值
//收费类型
DECLARE lc_sflx CURSOR FOR
SELECT DISTINCT(门诊收费项目.名称)
FROM 门诊收费项目 ;
OPEN lc_sflx ;
do while sqlca.sqlcode = 0
fetch lc_sflx into :ls_temp ;
if sqlca.sqlcode = 0 then
ddlb_fylx.additem(ls_temp)
end if
loopclose lc_sflx ;
//挂号类型
DECLARE lc_ghlx CURSOR FOR
SELECT DISTINCT(门诊挂号类型.挂号类型)
FROM 门诊挂号类型 ;
OPEN lc_ghlx ;
do while sqlca.sqlcode = 0
fetch lc_ghlx into :ls_temp ;
if sqlca.sqlcode = 0 then
ddlb_ghlx.additem(ls_temp)
end if
loopclose lc_ghlx ;//科室资料
DECLARE lc_ghks CURSOR FOR
SELECT DISTINCT(科室资料.名称)
FROM 科室资料 ;
OPEN lc_ghks ;
do while sqlca.sqlcode = 0
fetch lc_ghks into :ls_temp ;
if sqlca.sqlcode = 0 then
ddlb_ghks.additem(ls_temp)
end if
loopclose lc_ghks ;
//医生资料
DECLARE lc_ghys CURSOR FOR
SELECT DISTINCT(医生资料.姓名)
FROM 医生资料 ;
OPEN lc_ghys ;
do while sqlca.sqlcode = 0
fetch lc_ghys into :ls_temp ;
if sqlca.sqlcode = 0 then
ddlb_ys.additem(ls_temp)
end if
loopclose lc_ghys ;
//赋值日期
em_2.text = string(today(),'yyyy-mm-dd')
//在按钮cb_add的CLICKED事件中加入以下代码,重新设置各控件的状态,方便继续增加新的挂号
sle_xm.text = ''
sle_nl.text = ''
ddlb_ys.enabled = true
//在按钮pb_save的CLICKED事件中加入以下代码,保存输入的门诊挂号的信息,并将输入的病人信息添加到病人信息库表中。
string ls_xm,ls_xb,ls_mz,ls_fylx,ls_bh,ls_brbh
string ls_ghlx,ls_ghks,ls_ys
decimal ld_ghfy
date ld_ghsj
integer li_nl
//姓名不能为空
if isnull(ls_xm) or ls_xm = '' then
messagebox("提示","姓名不能为空!")
sle_xm.setfocus()
return
end if
//费用类型不能为空
if isnull(ls_fylx) or ls_fylx = '' then
messagebox("提示","费用类型不能为空!")
ddlb_fylx.setfocus()
return
end if
//挂号科室不能为空
if isnull(ls_ghks) or ls_ghks = '' then
messagebox("提示","挂号科室不能为空!")
ddlb_ghks.setfocus()return
end if//医生不能为空!
if isnull(ls_ys) or ls_ys = '' then
messagebox("提示","医生不能为空!")
ddlb_ys.setfocus() return
end if//得到病人信息库的编号
select max(编号)
into:ls_brbh
from 病人信息库;//生产编号
if isnull(ls_brbh) then
ls_brbh = "BR0000001"
else
ls_brbh = "BR" + string(long(right(ls_brbh,7) ) + 1,'0000000')
end if
//插入数据到病人信息库
INSERT INTO 病人信息库
( 编号, 姓名, 性别, 年龄, 民族, 费用类型)
VALUES ( :ls_brbh, :ls_xm, :ls_xb, :li_nl, :ls_mz, :ls_fylx ) ;
//插入失敗则回滚数据并返回
if sqlca.sqlcode <> 0 then
messagebox("提示","插入病人信息失败!")
rollback ;return
end if//得到门诊挂号的编号
select max(编号)
into:ls_bhfrom 门诊挂号;
//生成门诊挂号编号
if isnull(ls_bh) then
ls_bh = "GH0000001"else
ls_bh = "GH" + string(long(right(ls_bh,7) ) + 1,'0000000')
end if//插入数据到门诊挂号表
INSERT INTO 门诊挂号 ( 编号, 病人编号, 姓名, 性别, 挂号科室, 费用类型, 挂号类型, 挂号费用, 医生, 时间, 是否已划价 )
VALUES ( :ls_bh, :ls_brbh, :ls_xm, :ls_xb, :ls_ghks, :ls_fylx, :ls_ghlx, :ld_ghfy, :ls_ys, :ld_ghsj , '否') ;//插入失败则返回
if sqlca.sqlcode <> 0 thenmessagebox("提示","插入挂号信息失败!")
rollback ; return
end if //提交数据 commit ;
messagebox("提示","挂号成功!")
//在按钮cb_cancel的CLICKED事件中加入以下代码,回滚数据。
rollback; //回滚数据
//在按钮cb_exit的CLICKED事件中加入以下代码,关闭窗口。
close(parent)
(3)患者基本信息查询算法:
【定义】建立一个合适的数据源,建立一个的数据窗口(里面含一个数据窗口控件和sle_1控件,sle_2控件……,cb_1按钮), 通过在sle_1输入name属性的一个值, 在sle_2输入sex属性的一个值,在sle_3输入bir属性的一个值进行查询,最后在数据窗口控件里面显示出该相关的组信息。
【输出】响应患者基本信息查询。
【算法流程】设计“确定”按钮Clicked事件的代码如下:
//OPEN事件:
dw_1.settransobject(sqlca)
dw_1.retrieve('%')
//"检索"按钮: string ls_name
//获取输入的患者姓名
ls_name=trim(sle_1.text)
//获取输入患者的性别信息
ls_sex=trim(sle_2.text)
//获取输入患者的出生日期信息
ls_bir=trim(sle_3.text)
//查找患者存在,则显示相关信息
if not ls_name=”****”and ls_sex= “”andls_bir=”” then
dw_1.retrieve(ls_name)
else //查找信息不存在,重新输入
MessageBox("数据不全!","请输入要查询的姓名!") end if
参考文献
[1]毛国君.数据挖掘原理与算法[M].北京:清华大学出版社,2007.
[2] 陈卓.基于 Windows DNA 的门诊挂号系统的研究与应用[D].长春:吉林大学,2004.
[3] 王安平,李燕燕,陈季妍.《医院信息系统投资分析》,山西财政税务专科学校报,2001,17(5),51-52.
[4] 顾海.现代医院管理学.北京,中国医药科技出版社,2004.
[5] 杨善发,王德斌,沈敏祥等.卫生信息化中的几个关键问题[J].中国卫生事业管理,001(6): 382-383.
注:文章内所有公式及图表请用PDF形式查看。
关键字:医院系统,设计,算法
算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。
一、算法的主要功能
医院信息系统中排队叫号系统用到的数据结构是队列结构,根据各科室共享信息的原理,我们选择链队。
由于就诊患者的数量具有不确定性,所以不适合采用静态数组,应该选择具有动态性的链表。而根据患者就诊原则——“先到先诊,后到后诊”,采用具有“先进先出,后进后出”特点的队列可以满足;但由于一位患者可能有多项检查检验,则排队过程中会存在多科室同时候诊,患者可以在等候时间最短的科室得以检查,同时为了避免漏诊,所以要将跳号的仍然保留在队列中继续处于候诊状态,所以采用链式结构能合理地解决这一问题。
候诊链队的基本操作主要存在每日上班科室初始化候诊队列操作、下班前队列判空操作以及销毁队列操作、挂号室患者入队操作、诊断时患者取对头元素以及出队操作操作。
1、链队结构描述如下:
Typedefstructnode
{ datatypedata;
structnode *next;
} QNode; /*链队结点的类型*/
Typedefstruct
{ QNnode *front,*rear;
}LQueue; /*将头尾指针封装在一起的链队*/
其示意图如图所示。
链队示意图
候诊循环链队中,结点主要有两种类型:队首结点和记录就诊患者挂号信息的结点。其中,通过队首结点的front指针和rear可以判断候诊队列中是否还有候诊患者;通过向元素入队操作实现候诊患者的排队候诊;通过对队列元素的出对操作实现候诊患者就诊。
2、用到的基本操作
(1)功能:初始化一新队列
入口参数:无
返回值:新顺序队列指针,null表示失败
LQueueInit_SeqQueue( )
{ LQueueQ;
Q=( PSeqQueue )malloc(sizeof(SeqQueue));
if (Q)
{ Q->front=0;
Q->rear=0;
printf("置空队列成功!");
}
return Q;
}
(2)功能:判断队列是否为空
入口参数:顺序队列
返回值:1表示为空,0表示非空
intEmpty_LQueue(LQueue Q)
{if (Q && Q->front==Q->rear)
return (1);
else
return (0);
}
(3)功能:入队操作
入口参数:顺序队列和待入队元素x
返回值:1表示成功,-1表示队满溢出
int In_LQueue (LQueue Q , DataTypex)
{ if ((Q->rear+1)%MAXSIZE==Q->front)
{ printf("队满");
return -1; /*队满不能入队*/
}
else
{ Q->rear=(Q->rear+1) % MAXSIZE;
Q->data[Q->rear]=x;
return 1;/*入队完成*/
}
}
二、主要算法描述
(1)用户登录验证算法:
【定义】在多用户的大型数据库系统,用户对数据库操作权限会有区别,因此,我们需要设计系统用户登录窗口,来完成用户的确认与权限控制。通常我们都是在数据库中添加一张人员表,保存人员信息、登录用户名以及口令,但这种方法安全性并不是很高。其它,我们可以使用该方法登录窗口时,需要采用动态生成数据库连接代码,然后连接数据库,如果用户存在,并且录入的口令正确,则数据库连接成功,这样便可以打开系统主窗口了。
【输出】响应前台的用户验证请求。
【算法流程】设计“确定”按钮Clicked事件的代码如下:
w_login.visible = false//暂时隐藏登录窗口Open(w_welcome)//打开欢迎或者数据库连接等待窗口
SetPointer(HOURGLASS!) //将光标变成沙漏型string ls_user,ls_pass //读取用户录入的用户名与口令ls_user = sle_username.text
ls_pass = sle_password.text
//从注册表中读取所有数据库信息并存储在“sqlca”中,其中gs_key是你的软件注册位置
RegistryGet(gs_hkey, "DBMS", RegString!, sqlca.DBMS)
RegistryGet(gs_hkey, "Database", RegString!, sqlca.Database)
//生成数据库连接参数,除了用户名与口令外,其他由系统的需要而定。
SQLCA.DBParm+= ;UID="+ls_user+";PWD="+ls_pass+&&"',PBUseProcOwner='Yes',
ConnectOption='SQL_DRIVER_CONNECT,SQL_DRIVER_NOPROMPT'"CONNECT using sqlca;
if sqlca.sqlcode<>0 then
//数据库连接失败,说明用戶录入口令不正确,或者不存在该用户
close(w_welcome)messagebox("登录","数据库连接失败!")
le_password.text=""
sle_password.setfocus()
success=false
w_login.visible=true
elsesuccess=true
open(w_main)//进入主窗口
close(w_parent)end if
(2)门诊挂号算法:
【定义】在窗体w_mzgh1的OPEN事件中,先设置单个控件的状态,然后从数据库取得收费类型、挂号类型、科室资料、医生资料等信息添加到相应的下拉列表框中。
【输出】患者的就诊科室以及就诊号。
【算法流程】
string ls_temp //设置单个控件的状态
sle_xm.displayonly = true
ddlb_xb.enabled = false
sle_nl.displayonly = true
ddlb_mz.enabled = false
ddlb_fylx.enabled = false
ddlb_ghks.enabled = false
ddlb_ghlx.enabled = false//添加下拉列表框的值
//收费类型
DECLARE lc_sflx CURSOR FOR
SELECT DISTINCT(门诊收费项目.名称)
FROM 门诊收费项目 ;
OPEN lc_sflx ;
do while sqlca.sqlcode = 0
fetch lc_sflx into :ls_temp ;
if sqlca.sqlcode = 0 then
ddlb_fylx.additem(ls_temp)
end if
loopclose lc_sflx ;
//挂号类型
DECLARE lc_ghlx CURSOR FOR
SELECT DISTINCT(门诊挂号类型.挂号类型)
FROM 门诊挂号类型 ;
OPEN lc_ghlx ;
do while sqlca.sqlcode = 0
fetch lc_ghlx into :ls_temp ;
if sqlca.sqlcode = 0 then
ddlb_ghlx.additem(ls_temp)
end if
loopclose lc_ghlx ;//科室资料
DECLARE lc_ghks CURSOR FOR
SELECT DISTINCT(科室资料.名称)
FROM 科室资料 ;
OPEN lc_ghks ;
do while sqlca.sqlcode = 0
fetch lc_ghks into :ls_temp ;
if sqlca.sqlcode = 0 then
ddlb_ghks.additem(ls_temp)
end if
loopclose lc_ghks ;
//医生资料
DECLARE lc_ghys CURSOR FOR
SELECT DISTINCT(医生资料.姓名)
FROM 医生资料 ;
OPEN lc_ghys ;
do while sqlca.sqlcode = 0
fetch lc_ghys into :ls_temp ;
if sqlca.sqlcode = 0 then
ddlb_ys.additem(ls_temp)
end if
loopclose lc_ghys ;
//赋值日期
em_2.text = string(today(),'yyyy-mm-dd')
//在按钮cb_add的CLICKED事件中加入以下代码,重新设置各控件的状态,方便继续增加新的挂号
sle_xm.text = ''
sle_nl.text = ''
ddlb_ys.enabled = true
//在按钮pb_save的CLICKED事件中加入以下代码,保存输入的门诊挂号的信息,并将输入的病人信息添加到病人信息库表中。
string ls_xm,ls_xb,ls_mz,ls_fylx,ls_bh,ls_brbh
string ls_ghlx,ls_ghks,ls_ys
decimal ld_ghfy
date ld_ghsj
integer li_nl
//姓名不能为空
if isnull(ls_xm) or ls_xm = '' then
messagebox("提示","姓名不能为空!")
sle_xm.setfocus()
return
end if
//费用类型不能为空
if isnull(ls_fylx) or ls_fylx = '' then
messagebox("提示","费用类型不能为空!")
ddlb_fylx.setfocus()
return
end if
//挂号科室不能为空
if isnull(ls_ghks) or ls_ghks = '' then
messagebox("提示","挂号科室不能为空!")
ddlb_ghks.setfocus()return
end if//医生不能为空!
if isnull(ls_ys) or ls_ys = '' then
messagebox("提示","医生不能为空!")
ddlb_ys.setfocus() return
end if//得到病人信息库的编号
select max(编号)
into:ls_brbh
from 病人信息库;//生产编号
if isnull(ls_brbh) then
ls_brbh = "BR0000001"
else
ls_brbh = "BR" + string(long(right(ls_brbh,7) ) + 1,'0000000')
end if
//插入数据到病人信息库
INSERT INTO 病人信息库
( 编号, 姓名, 性别, 年龄, 民族, 费用类型)
VALUES ( :ls_brbh, :ls_xm, :ls_xb, :li_nl, :ls_mz, :ls_fylx ) ;
//插入失敗则回滚数据并返回
if sqlca.sqlcode <> 0 then
messagebox("提示","插入病人信息失败!")
rollback ;return
end if//得到门诊挂号的编号
select max(编号)
into:ls_bhfrom 门诊挂号;
//生成门诊挂号编号
if isnull(ls_bh) then
ls_bh = "GH0000001"else
ls_bh = "GH" + string(long(right(ls_bh,7) ) + 1,'0000000')
end if//插入数据到门诊挂号表
INSERT INTO 门诊挂号 ( 编号, 病人编号, 姓名, 性别, 挂号科室, 费用类型, 挂号类型, 挂号费用, 医生, 时间, 是否已划价 )
VALUES ( :ls_bh, :ls_brbh, :ls_xm, :ls_xb, :ls_ghks, :ls_fylx, :ls_ghlx, :ld_ghfy, :ls_ys, :ld_ghsj , '否') ;//插入失败则返回
if sqlca.sqlcode <> 0 thenmessagebox("提示","插入挂号信息失败!")
rollback ; return
end if //提交数据 commit ;
messagebox("提示","挂号成功!")
//在按钮cb_cancel的CLICKED事件中加入以下代码,回滚数据。
rollback; //回滚数据
//在按钮cb_exit的CLICKED事件中加入以下代码,关闭窗口。
close(parent)
(3)患者基本信息查询算法:
【定义】建立一个合适的数据源,建立一个的数据窗口(里面含一个数据窗口控件和sle_1控件,sle_2控件……,cb_1按钮), 通过在sle_1输入name属性的一个值, 在sle_2输入sex属性的一个值,在sle_3输入bir属性的一个值进行查询,最后在数据窗口控件里面显示出该相关的组信息。
【输出】响应患者基本信息查询。
【算法流程】设计“确定”按钮Clicked事件的代码如下:
//OPEN事件:
dw_1.settransobject(sqlca)
dw_1.retrieve('%')
//"检索"按钮: string ls_name
//获取输入的患者姓名
ls_name=trim(sle_1.text)
//获取输入患者的性别信息
ls_sex=trim(sle_2.text)
//获取输入患者的出生日期信息
ls_bir=trim(sle_3.text)
//查找患者存在,则显示相关信息
if not ls_name=”****”and ls_sex= “”andls_bir=”” then
dw_1.retrieve(ls_name)
else //查找信息不存在,重新输入
MessageBox("数据不全!","请输入要查询的姓名!") end if
参考文献
[1]毛国君.数据挖掘原理与算法[M].北京:清华大学出版社,2007.
[2] 陈卓.基于 Windows DNA 的门诊挂号系统的研究与应用[D].长春:吉林大学,2004.
[3] 王安平,李燕燕,陈季妍.《医院信息系统投资分析》,山西财政税务专科学校报,2001,17(5),51-52.
[4] 顾海.现代医院管理学.北京,中国医药科技出版社,2004.
[5] 杨善发,王德斌,沈敏祥等.卫生信息化中的几个关键问题[J].中国卫生事业管理,001(6): 382-383.
注:文章内所有公式及图表请用PDF形式查看。