2010西华大学课程设计说明书

数学与计算机学院

课程设计说明书

【此页单独打印】

课 程 名 称: 面向对象程序设计-课程设计

课 程 代 码: 8404101

题 目: 医生诊疗处方信息管理系统 学 生 姓 名: 王晶

开 始 时 间: 2010 年 12 月 24 日

完 成 时 间: 2011 年 01 月 6 日

课程设计成绩:

年级/专业/班: 2009级软件工程4班 学 号: [**************]

指导教师签名: 年 月 日

西华大学数计学院课程设计说明书

目 录

1 引 言 ................................................................. 1

1.1 问题的提出 .......................................................... 1

1.2国内外研究的现状 .................................................... 1

1.3任务与分析 ......................................................... 22

2 程序的主要功能 ......................................................... 3

2.1添加功能 ............................................................ 3

2.2删除功能 ............................................................ 3

2.3 删除全部职员信息 ................................... 错误!未定义书签。

2.4显示功能 ............................................................ 3

2.5查找功能 ............................................................ 4

2.6修改功能 ............................................................ 4

3 程序运行平台 ........................................................... 5

4 总体设计 ............................................................... 6

5 程序类的说明(可用类图表示,正式说明书中请删除()中内容) ............... 7

6 模块分析//此部分应详细介绍设计思想、流程及关键代码等,下面没详细介绍 .. 10

6.1 添加模块 ........................................................... 10

6.2 显示模块 ........................................................... 12

6.3 修改模块 ........................................................... 12

6.4 查找模块 ........................................................... 14

6.5 删除模块 ........................................................... 17

6.6 清空模块 ........................................... 错误!未定义书签。

7 系统测试 .............................................................. 18

8 结论 .................................................................. 24 参考文献 ................................................ 错误!未定义书签。

I

1 引 言

1.1 问题的提出

随着各种信息的日益膨胀和医患人员信息服务需求的不断增强,医生诊疗处方信息系统急待有一个面向日常工作的信息服务功能,如医生基本资料资料、医生技术专长、处方等信息的存储、管理、共享、使用与交流等。这在每所医院都有各自不同的管理方式,其共有的特点多数仍处在手工阶段。存在信息资料管理分散、安全性差、利用率低等缺陷,再者,这类信息本身存在着它的不规范性,单纯使用特定的软件进行管理也有一定难度,而且很难适应此类信息管理模式的变化比计划还快的特点。对此,基于网络技术的网络管理模式体现出强大的生命力,有人誉为是将改变用户网络管理方式的革命性网络管理解决方案。

医生诊疗处方信息管理系统就应运而生了,它的广泛运用,使得大量的工作变得简单,方便了广大医生和患者。

1.2国内外研究的现状

自从社会和科学技术的发展,国内外医学界许多有识之士试图将医疗信息与医生的基本信息相结合起来,对此他们开展了诸多有益的探索与研究。主要体现在以下几个方面:

(1)医院采用多样化的管理模式管理医生的基本信息

(2)将医生专长记录对应于医生ID。

(3)医生为患者开出的处方对应保存于医生信息中。

(4)通过多元化的信息查询来查询医生的信息。

已有研究,部分值得我们借鉴,在实践中进一步改进。但我们也认为其中的研究也存在不足。

1

1.3任务与分析

1.3.1 设计任务

本次课程设计的题目是“医生诊疗处方信息系统”,通过此系统方便医院管理员对医生信息的管理。医院诊疗管理系统中的医生诊疗信息管理子系统包括三个子模块:医生基本信息管理;医生技术专长信息管理;诊疗处方信息管理。

1.3.2 设计要求

1)根据功能需求,定义医生信息结构,并采用数组结构对数据进行存储。 2)提供菜单界面,方便管理人员操作。 3)主要要求实现的功能有:对信息的录入,删除,修改,查询。 4)对输入医生信息中的编号、姓名、性别、出生年月、学历、职务、联系电话、家庭地址、工资、专长和处方不能超过50个字节,录入信息时,当输入0时结束录入信息。

1.3.3 需求分析

在医生诊疗信息管理系统中,要为每位用户建立一个帐户,帐户中存储着每个用户的相关信息。对于医生信息的记录,则由系统管理员进行。在记录处方时,医生首先登陆系统,系统对得到的帐户进行检索,如果有该医生并且权限足够,该医生就可以根据对应的项目提示记录数据。医生查询自己的处方时,只需要输入医院分配的ID,就可以查到自己所开出的处方。

2

2. 程序的主要功能

2.1录入功能

录入一个医生的基本信息,包括编号、姓名、性别、出生年月、学历、职务、联系电话、家庭地址、工资、专长和处方。

录入信息如下:

01 小王 男 19610224 院长 [1**********] 四川 管理

02 小黄 女 19780304 副院长 [1**********] 四川 心脏科

03 小赵 男 19670517 主任 [1**********] 四川 内科

04 小强 男 19800309 医生 [1**********]4 四川 药剂师

2.2显示功能

显示医生的主要信息包括编号、姓名、性别、出生年月、学历、职务、联系电话、家庭地址、工资、专长和处方。

对应信息显示:

01 小王 男 19610224 院长 [1**********] 四川 管理

02 小黄 女 19780304 副院长 [1**********] 四川 心脏科

03 小赵 男 19670517 主任 [1**********] 四川 内科

04 小强 男 19800309 医生 [1**********]4 四川 药剂师

2.3删除功能

能够对一个医生的信息进行删除,按编号进行删除。

键入需要删除的医生编号:01

3

2.4查询功能

根据你键入的医生编号,显示其详细信息!

1. 根据医生编号查询:

键入需要查询的医生编号:02

2. 根据医生专长查询:

键入需要查询的医生专长:内科

3. 根据医生处方查询:

键入需要查询的医生处方:感冒类

2.5修改功能

键入你需要修改的医生编号,对相应的医生信息进行修改。

键入需要修改的医生编号:03

4

3 程序运行平台

医生诊疗信息管理系统的开发和运行环境如下:

1.操作系统:医生诊疗处方信息管理系统可以运行在windows系列桌面操作系统之上。

2.支撑软件:本系统选用Microsoft Visual C++集成环境作为开发工具。

3.具体操作如下:新建一个新工程,命名为“课程设计.dsw”,添加相应的源文件到该工程目录下,编写代码,再编译,链接,执行等。

5

4 总体设计

图4.1 系统总体框架图

6

程序类的说明

 链表结点类型的声明

struct Doctor

{

long num;//编号 char name[20];//姓名 char sex[10];//性别 char birth[8]; //出生年月 char degr[5];//学历 char duty[7];//职务 char tel[13];//电话 char addr[30];//地址 char price[20];//工资 char skill[5][10];//1个技能 struct recipel //医生的处方 {

long id;

char recipel[10][10]; }; };

typedef struct Doctor Type;  结点数据类型的声明

void printNode(Type data) { int i;

printf("%8ld",data.num); printf("%20s",data.name); printf("%10s",data.sex); printf("%8ld",data.birth); printf("%5s",data.degr); printf("%7s",data.duty); printf("%13ld",data.tel); printf("%30s",data.addr); printf("%20ld",data.price);

//输出结点的所有数据域的值7

5

for(i=0;i

单链表操作的声明 struct node *CreateBackward(); struct node *CreateForward(); struct node *CreateInsert();

struct node *printList(struct node *head);

struct node *searchNode(struct node *head,Type data,int condition);

struct node *InsertAfter(struct node *head,Type data);

struct node *InsertOrder(struct node *head,Type data,int condition);

struct node *Delete(struct node *head,Type data); struct node *Reverse(struct node *head); struct node *printList(struct node *head)  {

Type data; FILE *fp;

if((fp=fopen("f:\\doctor.dat","wb"))==NULL) { }

printf(" 输入一个医生信息并以0结束: \n"); readNode(&data); while(!endWith(data)) { }

fwrite(&data,sizeDoc,1,fp); readNode(&data);

printf(" 不能打开文件! \n"); exit(0);

文件保存的声明 void createFile()

printf("%6d",data.num); //printf("%20s",data.recipel);

8

fclose(fp);

}

struct node *readFile(struct node *head) {

Type data; FILE *fp; head=NULL;

if((fp=fopen("f:\\doctor.dat","rb"))==NULL)

{ printf(" 文件不存在,请创建一个文件:

return(0); }

fread(&data,sizeDoc,1,fp); while(!feof(fp))

{ head=InsertOrder(head,data,1);

fread(&data,sizeDoc,1,fp); } fclose(fp); return head; }

void saveFile(struct node *head) {

struct node *p=head; FILE *fp;

if((fp=fopen("f:\\doctor.dat","wb"))==NULL) { printf(" 不存在文件 ! \n");

exit(0); } if(head==NULL)

{ printf("\n无数据记录\n");

return; } while(p)

{ fwrite(&p->data,sizeDoc,1,fp); p=p->next; } fclose(fp);

}

\n"); 9

6 模块分析//此部分应详细介绍设计思想、流程及关键代码等,下面没详细介绍

6.1 添加模块

系统将提示用户输入新添加的医生的信息,插入在链表中。 设计思想:

流程图如下:

关键代码:

void readNode(Type *pdata) { int i;

10

printf("请输入一个医生的信息\n"); printf("医生编号: "); scanf("%ld",&pdata->num); if(pdata->num==0)

return ;

printf("姓名: ");

scanf("%s",pdata->name); printf("性别: "); scanf("%s",pdata->sex); printf("出生年月:"); scanf("%s",pdata->birth); printf("职务:");

scanf("%s",pdata->duty); printf("联系电话:"); scanf("%s",pdata->tel); printf("家庭住址:"); scanf("%s",pdata->addr); printf("技能:以0结束"); for(i=0;i

{ scanf("%s",pdata->skill[i]); if(strcmp(pdata->skill[i],"0")==0)

break; }

}

11

显示模块将输出所有职员的主要资料 。 流程 图如下:

关键代码:

void printNode(Type data) //输出结点的所有数据域的值 { int i;

printf("%-8ld",data.num); printf("%-20s",data.name); printf("%-10s",data.sex); printf("%-8s",data.birth); printf("%-7s",data.duty); printf("%-13s",data.tel); printf("%-30s",data.addr);

for(i=0;i

printf("%-6s",data.skill[i]);

12

首先由用户输入要修改的职员的姓名,然后系统用修改函数查找,显示该名职员的资料,然后系统提示用户输入需要修改的项目和新的资料。

设计思想:

流程图如下:

关键代码

do //用do-while语句可多次选择二级菜单 {

menuSkill(); // 调用二级菜单显示函数

13

printf("输入选择项:");

scanf("%d",&choice); //输入选择项 switch(choice) {

case 1: skillNode(&data); //首先读入带插入的医生记录,在插入

p=SearchNode(head,data,1);

for(i=0;i

strcpy(p->data.skill[i],data.skill[i]);

if(strcmp(data.skill[i],"0")==0)

break;

}

break;

case 2: printf("输入需要删除的医生编号:");

scanf("%ld",&data.num); //读入编号,根据编号进行删除 head=Delete(head,data);

break;

case 3: skillNode(&data); //修改指定的医生的专长

p=SearchNode(head,data,1); break;

case 0: break; }

}while(choice); 6.4 查找模块

首先由用户输入要查找的医生的编号或姓名或者处方信息,然后系统用查找函数查

14

找,然后系统就调用输出函数,输出所查找的职员资料。

设计思想:

流程图如下:

详细代码: do {

menuSearch();

15

printf("输入选择项:"); scanf("%d",&choice); switch(choice)

{ case 1: printf("输入需查询的医生编号:");

scanf("%ld",&data.num); //输入编号,查询 break;

case 2: printf("输入需查询的医生名字:");

scanf("%s",&data.name);

break; //输入特长,查询

case 3: printf("输入需查询的医生特长:");

scanf("%s",&data.skill); break;

case 0: break; }

if(choice>=1&&choice

if(p=SearchNode(head,data,choice)) // 如果找到匹配的记录 { }

else //如果没有找到

printf("不存在你所查询的信息"); //输出提示信息 printHead(); //输出表头 printNode(p->data); //输出记录

}while(choice); //重回二级菜单允许再次选择二级功能 return head; // 返回头指针 }

16

6.5 删除模块

首先由用户输入要删除的单个医生编号,然后调用删除函数,删除该名职员的资料。 设计思想:类似于查询功能 流程图如下:

关键代码:

void skillNode(Type *pdata) { int i;

printf("请输入要删除的医生的编号:\n"); scanf("%ld",&pdata->num); printf("请输入医生姓名:"); for(i=0;i

{ scanf("%s",pdata->skill[i]); if(strcmp(pdata->skill[i],"0")==0)

break; }

}

17

7 系统测试

首先进入VC++6.0,打开工程课程设计.dsw,然后进入源程序,接着选择Build下的课程设计.exe即可,也可以不打开工程,直接双击课程设计文件夹下的debug或release子文件夹下的课程设计.exe文件即可运行程序。 1、 第一次使用插入医生记录: 图1.插入医生记录

2.进入管理界面

图2 进入医生诊疗处方信息管理界面

3.显示已有的基本信息

18

图3.按要求显示信息

4. 新增医生基本信息 图4.新增信息

19

5. 删除已有医生信息 图5 删除

6. 修改医生基本信息 图6 修改信息

7. 录入医生特长 图7 医生特长录入

20

8. 医生专长修改 图8.修改前专长

图9.修改后专长

9. 处方管理

图10.进入处方管理界面

图 11. 录入对应医生编号的处方

21

图 12.删除对应医生的处方

图 13.修改对应医生的处方

10.

查询管理

图 14 进入查询界面

图 15 根据编号查询

22

图16 根据姓名查询

图17.根据特长查询

23

8 结论

总结:此次课程设计是针对医生诊疗信息管理而提出的,针对一些的功能需求,是VC++平台上简单的做了这个信息管理系统。实现的功能有对信息的录入,显示,删除,查询,修改。在课程设计的最初存在着很多的问题,对用单链表各种运用操作的时候,函数写出来不能按照想的正常的运行。如:在进行输入前,不能正确的运用malloc函数,不能正确定义指向指针变量的指针,所以在这里就浪费了很多的时间。在修改模块中,函数的编译也出现了很多的问题。

心得体会: 通过本次课程设计,实在是受益匪浅。本来这门课的知识学的就不够扎实,当刚开始要设计的时候,还真不知道从哪里下手。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,例如编写的程序在计算机上识别的是没有错误的,但是运行的结果确实不对的,总是两个字符串一起输出,怎么看我的源程序都没有错误,后来经过老师的指导才知道字符串输出是以回车键识别结束语句的,解决的办法是在输出语句中间加一个输入字符语句;后来在我的努力下,一一攻破了困难,最后把一个完整的程序设计完成,感觉特别有成就感的。虽然课程设计只有短短的几天,但是我发现我学到的知识比整整一个学期学到的都多。理论和实践的相结合是学习最有效的方法。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。

回顾起此次课程设计,至今我仍感慨颇多,的确,从从拿到题目到完成整个编程,从理论到实践,在整整两个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

24

附 录

附录1 源程序清单

#include /*标准输入输出函数库*/ #include /*标准函数库*/ #include /*字符串函数库*/ #include /*屏幕操作函数库*/ #include"file.h"

void printHead()/*打印表头函数*/ {

printf("%-10s","医生编号"); printf("%-8s","姓名"); printf("%-10s","性别"); printf("%-5s","出生年月"); printf("%-10s","职务"); printf("%-13s","工作时间"); printf("%-10s","电话"); printf("%-10s","地址"); printf("\n"); }

struct node *baseManage(struct node *head) /*基本信息管理模块的实现*/ {

int choice; Type data; struct node *p;

do //用do -while语句可多次选择二级菜单 {

menuBase(); /*调用二级菜单显示函数*/ printf("输入选择项:");

scanf("%d",&choice); //输入选择项 switch(choice) {

case 1: readNode(&data); //首先读入带插入的医生记录,在插入 head=InsertOrder(head,data,1); break;

case 2: printf("输入需要删除的编号:");

scanf("%d",&data.num); //读入编号,根据编号进行删除 head=Delete(head,data); break;

case 3: readNode(&data); //读入下一条医生记录

p=SearchNode(head,data,1); //查找该编号的医生是否存在 if(p)

p->data=data; //若该编号医生存在,则修改其信息

25

else printf("此医生不存在!"); //否则显示此人不存在 break;

// case 4:printf("插入查询函数");break; case 0: break; }

}while(choice); //还是回到二级菜单允许再次选择二级功能 return head; }

struct node *skillManage(struct node *head) //医生技术专长信息管理 {

int choice,i; Type data; struct node *p;

do //用do-while语句可多次选择二级菜单 {

menuSkill(); // 调用二级菜单显示函数 printf("输入选择项:");

scanf("%d",&choice); //输入选择项 switch(choice) {

case 1: skillNode(&data); //首先读入带插入的医生记录,在插入 p=SearchNode(head,data,1); for(i=0;i

{ strcpy(p->data.skill[i],data.skill[i]); if(strcmp(data.skill[i],"0")==0) break; }

break;

case 2: printf("输入需要删除的医生编号:");

scanf("%ld",&data.num); //读入编号,根据编号进行删除 head=Delete(head,data); break;

case 3: skillNode(&data); //修改指定的医生的专长

p=SearchNode(head,data,1); ////////////////////////////////////要的是修改功能

break;

/*case 4: SearchNode(head,data,1); printf("输入需查询的信息:"); scanf("%d",&data.skill);

head=SearchNode(head,data,1); break;*/

26

case 0: break;

}

}while(choice); //还是回到二级菜单允许再次选择二级功能 return head;

}

struct node *C_recipelManage(struct node *head) //医生诊疗处方信息管理 {

int choice;

Type data;

struct node *p;

do

{

menuRecipel(); //调用二级菜单

printf("输入选择项:");

scanf("%d",&choice);

switch(choice) //输入选择项

{

case 1: recipelNode(&data); //首先读入带插入的医生处方,在插入 //head=InsertOrder(head,data,1);

p=SearchNode(head,data,1);

p->data.recip=data.recip;

break;

case 2: recipelNode(&data); //读入编号,根据编号进行删除 p=SearchNode(head,data,1);///////////////////////////////////////////////////////////还需要函数

break;

case 3: readNode(&data); //读入下一条医生记录

p=SearchNode(head,data,1); //查找该编号的医生是否存在 if(p)

p->data=data; //若该编号医生存在,则修改其信息 else printf("此医生不存在!"); //否则显示此人不存在

break;

case 4: //SearchNode(head,data,1);

printf("输入需查询的处方编号:");

scanf("%d",&data.recip.recipel[0]);

head=SearchNode(head,data,1);

break;

case 0: break;

}

}while(choice); //还是回到二级菜单允许再次选择二级功能 return head;

}

27

struct node *searchManage(struct node *head) //根据条件查询模块的实现 {

int choice;

Type data;

struct node *p;

do

{

menuSearch();

printf("输入选择项:");

scanf("%d",&choice);

switch(choice)

{

case 1: printf("输入需查询的医生编号:");

scanf("%ld",&data.num); //输入编号,查询

break;

case 2: printf("输入需查询的医生名字:");

scanf("%s",&data.name);

break; //输入特长,查询

case 3: printf("输入需查询的医生特长:");

scanf("%s",&data.skill);

break;

case 0: break;

}

if(choice>=1&&choice

if(p=SearchNode(head,data,choice)) // 如果找到匹配的记录 {

printHead(); //输出表头

printNode(p->data); //输出记录

}

else //如果没有找到 printf("不存在你所查询的信息"); //输出提示信息

}while(choice); //重回二级菜单允许再次选择二级功能

return head; // 返回头指针 }

struct node* runMain(struct node *head,int choice) //该函数收main调用,根据选择项

{

switch(choice)

28

{ case 1: printHead(); //选择1,先输出表头

head=printList(head); // 调用函数完成显示基本信息的功能 break;

case 2: head=baseManage(head); // 选择2,调用函数完成基本信息管理功能

break;

case 3: head=skillManage(head); //选择3,调用函数完成医生特长信息管理功能

break;

case 4: head=C_recipelManage(head); // 选择4,调用函数完成医生诊疗处方信息管理功能

break;

case 5: head=searchManage(head); //选择5,调用函数完成根据条件查询的功能

break;

case 0: break;}

return head; // 返回头指针

}

int main()

{

struct node *head=NULL; //定义头文件

int choice; //用于输入一级菜单的选项

head=readFile(head); //首先执行文件打开操作 if(!head) //如果原始文件不存在

{

createFile(); //则首先调用函数创建文件

head=readFile(head); //再从文件读记录入链表,按编号从小到大 }

do

{

menu(); //调用一级菜单显示函数 printf("输入选择项:");

scanf("%d",&choice); //输入一级菜单选项

if(choice>=0&&choice

printf("错误输入,请再次输入选择项!");

}while(choice); //重回一级菜单允许再次选择二级功能

saveFile(head); //每次在结束之前保存文件,以便下次访问

return 0; //记录写入文件,以便下次访问 }

29

数学与计算机学院

课程设计说明书

【此页单独打印】

课 程 名 称: 面向对象程序设计-课程设计

课 程 代 码: 8404101

题 目: 医生诊疗处方信息管理系统 学 生 姓 名: 王晶

开 始 时 间: 2010 年 12 月 24 日

完 成 时 间: 2011 年 01 月 6 日

课程设计成绩:

年级/专业/班: 2009级软件工程4班 学 号: [**************]

指导教师签名: 年 月 日

西华大学数计学院课程设计说明书

目 录

1 引 言 ................................................................. 1

1.1 问题的提出 .......................................................... 1

1.2国内外研究的现状 .................................................... 1

1.3任务与分析 ......................................................... 22

2 程序的主要功能 ......................................................... 3

2.1添加功能 ............................................................ 3

2.2删除功能 ............................................................ 3

2.3 删除全部职员信息 ................................... 错误!未定义书签。

2.4显示功能 ............................................................ 3

2.5查找功能 ............................................................ 4

2.6修改功能 ............................................................ 4

3 程序运行平台 ........................................................... 5

4 总体设计 ............................................................... 6

5 程序类的说明(可用类图表示,正式说明书中请删除()中内容) ............... 7

6 模块分析//此部分应详细介绍设计思想、流程及关键代码等,下面没详细介绍 .. 10

6.1 添加模块 ........................................................... 10

6.2 显示模块 ........................................................... 12

6.3 修改模块 ........................................................... 12

6.4 查找模块 ........................................................... 14

6.5 删除模块 ........................................................... 17

6.6 清空模块 ........................................... 错误!未定义书签。

7 系统测试 .............................................................. 18

8 结论 .................................................................. 24 参考文献 ................................................ 错误!未定义书签。

I

1 引 言

1.1 问题的提出

随着各种信息的日益膨胀和医患人员信息服务需求的不断增强,医生诊疗处方信息系统急待有一个面向日常工作的信息服务功能,如医生基本资料资料、医生技术专长、处方等信息的存储、管理、共享、使用与交流等。这在每所医院都有各自不同的管理方式,其共有的特点多数仍处在手工阶段。存在信息资料管理分散、安全性差、利用率低等缺陷,再者,这类信息本身存在着它的不规范性,单纯使用特定的软件进行管理也有一定难度,而且很难适应此类信息管理模式的变化比计划还快的特点。对此,基于网络技术的网络管理模式体现出强大的生命力,有人誉为是将改变用户网络管理方式的革命性网络管理解决方案。

医生诊疗处方信息管理系统就应运而生了,它的广泛运用,使得大量的工作变得简单,方便了广大医生和患者。

1.2国内外研究的现状

自从社会和科学技术的发展,国内外医学界许多有识之士试图将医疗信息与医生的基本信息相结合起来,对此他们开展了诸多有益的探索与研究。主要体现在以下几个方面:

(1)医院采用多样化的管理模式管理医生的基本信息

(2)将医生专长记录对应于医生ID。

(3)医生为患者开出的处方对应保存于医生信息中。

(4)通过多元化的信息查询来查询医生的信息。

已有研究,部分值得我们借鉴,在实践中进一步改进。但我们也认为其中的研究也存在不足。

1

1.3任务与分析

1.3.1 设计任务

本次课程设计的题目是“医生诊疗处方信息系统”,通过此系统方便医院管理员对医生信息的管理。医院诊疗管理系统中的医生诊疗信息管理子系统包括三个子模块:医生基本信息管理;医生技术专长信息管理;诊疗处方信息管理。

1.3.2 设计要求

1)根据功能需求,定义医生信息结构,并采用数组结构对数据进行存储。 2)提供菜单界面,方便管理人员操作。 3)主要要求实现的功能有:对信息的录入,删除,修改,查询。 4)对输入医生信息中的编号、姓名、性别、出生年月、学历、职务、联系电话、家庭地址、工资、专长和处方不能超过50个字节,录入信息时,当输入0时结束录入信息。

1.3.3 需求分析

在医生诊疗信息管理系统中,要为每位用户建立一个帐户,帐户中存储着每个用户的相关信息。对于医生信息的记录,则由系统管理员进行。在记录处方时,医生首先登陆系统,系统对得到的帐户进行检索,如果有该医生并且权限足够,该医生就可以根据对应的项目提示记录数据。医生查询自己的处方时,只需要输入医院分配的ID,就可以查到自己所开出的处方。

2

2. 程序的主要功能

2.1录入功能

录入一个医生的基本信息,包括编号、姓名、性别、出生年月、学历、职务、联系电话、家庭地址、工资、专长和处方。

录入信息如下:

01 小王 男 19610224 院长 [1**********] 四川 管理

02 小黄 女 19780304 副院长 [1**********] 四川 心脏科

03 小赵 男 19670517 主任 [1**********] 四川 内科

04 小强 男 19800309 医生 [1**********]4 四川 药剂师

2.2显示功能

显示医生的主要信息包括编号、姓名、性别、出生年月、学历、职务、联系电话、家庭地址、工资、专长和处方。

对应信息显示:

01 小王 男 19610224 院长 [1**********] 四川 管理

02 小黄 女 19780304 副院长 [1**********] 四川 心脏科

03 小赵 男 19670517 主任 [1**********] 四川 内科

04 小强 男 19800309 医生 [1**********]4 四川 药剂师

2.3删除功能

能够对一个医生的信息进行删除,按编号进行删除。

键入需要删除的医生编号:01

3

2.4查询功能

根据你键入的医生编号,显示其详细信息!

1. 根据医生编号查询:

键入需要查询的医生编号:02

2. 根据医生专长查询:

键入需要查询的医生专长:内科

3. 根据医生处方查询:

键入需要查询的医生处方:感冒类

2.5修改功能

键入你需要修改的医生编号,对相应的医生信息进行修改。

键入需要修改的医生编号:03

4

3 程序运行平台

医生诊疗信息管理系统的开发和运行环境如下:

1.操作系统:医生诊疗处方信息管理系统可以运行在windows系列桌面操作系统之上。

2.支撑软件:本系统选用Microsoft Visual C++集成环境作为开发工具。

3.具体操作如下:新建一个新工程,命名为“课程设计.dsw”,添加相应的源文件到该工程目录下,编写代码,再编译,链接,执行等。

5

4 总体设计

图4.1 系统总体框架图

6

程序类的说明

 链表结点类型的声明

struct Doctor

{

long num;//编号 char name[20];//姓名 char sex[10];//性别 char birth[8]; //出生年月 char degr[5];//学历 char duty[7];//职务 char tel[13];//电话 char addr[30];//地址 char price[20];//工资 char skill[5][10];//1个技能 struct recipel //医生的处方 {

long id;

char recipel[10][10]; }; };

typedef struct Doctor Type;  结点数据类型的声明

void printNode(Type data) { int i;

printf("%8ld",data.num); printf("%20s",data.name); printf("%10s",data.sex); printf("%8ld",data.birth); printf("%5s",data.degr); printf("%7s",data.duty); printf("%13ld",data.tel); printf("%30s",data.addr); printf("%20ld",data.price);

//输出结点的所有数据域的值7

5

for(i=0;i

单链表操作的声明 struct node *CreateBackward(); struct node *CreateForward(); struct node *CreateInsert();

struct node *printList(struct node *head);

struct node *searchNode(struct node *head,Type data,int condition);

struct node *InsertAfter(struct node *head,Type data);

struct node *InsertOrder(struct node *head,Type data,int condition);

struct node *Delete(struct node *head,Type data); struct node *Reverse(struct node *head); struct node *printList(struct node *head)  {

Type data; FILE *fp;

if((fp=fopen("f:\\doctor.dat","wb"))==NULL) { }

printf(" 输入一个医生信息并以0结束: \n"); readNode(&data); while(!endWith(data)) { }

fwrite(&data,sizeDoc,1,fp); readNode(&data);

printf(" 不能打开文件! \n"); exit(0);

文件保存的声明 void createFile()

printf("%6d",data.num); //printf("%20s",data.recipel);

8

fclose(fp);

}

struct node *readFile(struct node *head) {

Type data; FILE *fp; head=NULL;

if((fp=fopen("f:\\doctor.dat","rb"))==NULL)

{ printf(" 文件不存在,请创建一个文件:

return(0); }

fread(&data,sizeDoc,1,fp); while(!feof(fp))

{ head=InsertOrder(head,data,1);

fread(&data,sizeDoc,1,fp); } fclose(fp); return head; }

void saveFile(struct node *head) {

struct node *p=head; FILE *fp;

if((fp=fopen("f:\\doctor.dat","wb"))==NULL) { printf(" 不存在文件 ! \n");

exit(0); } if(head==NULL)

{ printf("\n无数据记录\n");

return; } while(p)

{ fwrite(&p->data,sizeDoc,1,fp); p=p->next; } fclose(fp);

}

\n"); 9

6 模块分析//此部分应详细介绍设计思想、流程及关键代码等,下面没详细介绍

6.1 添加模块

系统将提示用户输入新添加的医生的信息,插入在链表中。 设计思想:

流程图如下:

关键代码:

void readNode(Type *pdata) { int i;

10

printf("请输入一个医生的信息\n"); printf("医生编号: "); scanf("%ld",&pdata->num); if(pdata->num==0)

return ;

printf("姓名: ");

scanf("%s",pdata->name); printf("性别: "); scanf("%s",pdata->sex); printf("出生年月:"); scanf("%s",pdata->birth); printf("职务:");

scanf("%s",pdata->duty); printf("联系电话:"); scanf("%s",pdata->tel); printf("家庭住址:"); scanf("%s",pdata->addr); printf("技能:以0结束"); for(i=0;i

{ scanf("%s",pdata->skill[i]); if(strcmp(pdata->skill[i],"0")==0)

break; }

}

11

显示模块将输出所有职员的主要资料 。 流程 图如下:

关键代码:

void printNode(Type data) //输出结点的所有数据域的值 { int i;

printf("%-8ld",data.num); printf("%-20s",data.name); printf("%-10s",data.sex); printf("%-8s",data.birth); printf("%-7s",data.duty); printf("%-13s",data.tel); printf("%-30s",data.addr);

for(i=0;i

printf("%-6s",data.skill[i]);

12

首先由用户输入要修改的职员的姓名,然后系统用修改函数查找,显示该名职员的资料,然后系统提示用户输入需要修改的项目和新的资料。

设计思想:

流程图如下:

关键代码

do //用do-while语句可多次选择二级菜单 {

menuSkill(); // 调用二级菜单显示函数

13

printf("输入选择项:");

scanf("%d",&choice); //输入选择项 switch(choice) {

case 1: skillNode(&data); //首先读入带插入的医生记录,在插入

p=SearchNode(head,data,1);

for(i=0;i

strcpy(p->data.skill[i],data.skill[i]);

if(strcmp(data.skill[i],"0")==0)

break;

}

break;

case 2: printf("输入需要删除的医生编号:");

scanf("%ld",&data.num); //读入编号,根据编号进行删除 head=Delete(head,data);

break;

case 3: skillNode(&data); //修改指定的医生的专长

p=SearchNode(head,data,1); break;

case 0: break; }

}while(choice); 6.4 查找模块

首先由用户输入要查找的医生的编号或姓名或者处方信息,然后系统用查找函数查

14

找,然后系统就调用输出函数,输出所查找的职员资料。

设计思想:

流程图如下:

详细代码: do {

menuSearch();

15

printf("输入选择项:"); scanf("%d",&choice); switch(choice)

{ case 1: printf("输入需查询的医生编号:");

scanf("%ld",&data.num); //输入编号,查询 break;

case 2: printf("输入需查询的医生名字:");

scanf("%s",&data.name);

break; //输入特长,查询

case 3: printf("输入需查询的医生特长:");

scanf("%s",&data.skill); break;

case 0: break; }

if(choice>=1&&choice

if(p=SearchNode(head,data,choice)) // 如果找到匹配的记录 { }

else //如果没有找到

printf("不存在你所查询的信息"); //输出提示信息 printHead(); //输出表头 printNode(p->data); //输出记录

}while(choice); //重回二级菜单允许再次选择二级功能 return head; // 返回头指针 }

16

6.5 删除模块

首先由用户输入要删除的单个医生编号,然后调用删除函数,删除该名职员的资料。 设计思想:类似于查询功能 流程图如下:

关键代码:

void skillNode(Type *pdata) { int i;

printf("请输入要删除的医生的编号:\n"); scanf("%ld",&pdata->num); printf("请输入医生姓名:"); for(i=0;i

{ scanf("%s",pdata->skill[i]); if(strcmp(pdata->skill[i],"0")==0)

break; }

}

17

7 系统测试

首先进入VC++6.0,打开工程课程设计.dsw,然后进入源程序,接着选择Build下的课程设计.exe即可,也可以不打开工程,直接双击课程设计文件夹下的debug或release子文件夹下的课程设计.exe文件即可运行程序。 1、 第一次使用插入医生记录: 图1.插入医生记录

2.进入管理界面

图2 进入医生诊疗处方信息管理界面

3.显示已有的基本信息

18

图3.按要求显示信息

4. 新增医生基本信息 图4.新增信息

19

5. 删除已有医生信息 图5 删除

6. 修改医生基本信息 图6 修改信息

7. 录入医生特长 图7 医生特长录入

20

8. 医生专长修改 图8.修改前专长

图9.修改后专长

9. 处方管理

图10.进入处方管理界面

图 11. 录入对应医生编号的处方

21

图 12.删除对应医生的处方

图 13.修改对应医生的处方

10.

查询管理

图 14 进入查询界面

图 15 根据编号查询

22

图16 根据姓名查询

图17.根据特长查询

23

8 结论

总结:此次课程设计是针对医生诊疗信息管理而提出的,针对一些的功能需求,是VC++平台上简单的做了这个信息管理系统。实现的功能有对信息的录入,显示,删除,查询,修改。在课程设计的最初存在着很多的问题,对用单链表各种运用操作的时候,函数写出来不能按照想的正常的运行。如:在进行输入前,不能正确的运用malloc函数,不能正确定义指向指针变量的指针,所以在这里就浪费了很多的时间。在修改模块中,函数的编译也出现了很多的问题。

心得体会: 通过本次课程设计,实在是受益匪浅。本来这门课的知识学的就不够扎实,当刚开始要设计的时候,还真不知道从哪里下手。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,例如编写的程序在计算机上识别的是没有错误的,但是运行的结果确实不对的,总是两个字符串一起输出,怎么看我的源程序都没有错误,后来经过老师的指导才知道字符串输出是以回车键识别结束语句的,解决的办法是在输出语句中间加一个输入字符语句;后来在我的努力下,一一攻破了困难,最后把一个完整的程序设计完成,感觉特别有成就感的。虽然课程设计只有短短的几天,但是我发现我学到的知识比整整一个学期学到的都多。理论和实践的相结合是学习最有效的方法。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。

回顾起此次课程设计,至今我仍感慨颇多,的确,从从拿到题目到完成整个编程,从理论到实践,在整整两个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

24

附 录

附录1 源程序清单

#include /*标准输入输出函数库*/ #include /*标准函数库*/ #include /*字符串函数库*/ #include /*屏幕操作函数库*/ #include"file.h"

void printHead()/*打印表头函数*/ {

printf("%-10s","医生编号"); printf("%-8s","姓名"); printf("%-10s","性别"); printf("%-5s","出生年月"); printf("%-10s","职务"); printf("%-13s","工作时间"); printf("%-10s","电话"); printf("%-10s","地址"); printf("\n"); }

struct node *baseManage(struct node *head) /*基本信息管理模块的实现*/ {

int choice; Type data; struct node *p;

do //用do -while语句可多次选择二级菜单 {

menuBase(); /*调用二级菜单显示函数*/ printf("输入选择项:");

scanf("%d",&choice); //输入选择项 switch(choice) {

case 1: readNode(&data); //首先读入带插入的医生记录,在插入 head=InsertOrder(head,data,1); break;

case 2: printf("输入需要删除的编号:");

scanf("%d",&data.num); //读入编号,根据编号进行删除 head=Delete(head,data); break;

case 3: readNode(&data); //读入下一条医生记录

p=SearchNode(head,data,1); //查找该编号的医生是否存在 if(p)

p->data=data; //若该编号医生存在,则修改其信息

25

else printf("此医生不存在!"); //否则显示此人不存在 break;

// case 4:printf("插入查询函数");break; case 0: break; }

}while(choice); //还是回到二级菜单允许再次选择二级功能 return head; }

struct node *skillManage(struct node *head) //医生技术专长信息管理 {

int choice,i; Type data; struct node *p;

do //用do-while语句可多次选择二级菜单 {

menuSkill(); // 调用二级菜单显示函数 printf("输入选择项:");

scanf("%d",&choice); //输入选择项 switch(choice) {

case 1: skillNode(&data); //首先读入带插入的医生记录,在插入 p=SearchNode(head,data,1); for(i=0;i

{ strcpy(p->data.skill[i],data.skill[i]); if(strcmp(data.skill[i],"0")==0) break; }

break;

case 2: printf("输入需要删除的医生编号:");

scanf("%ld",&data.num); //读入编号,根据编号进行删除 head=Delete(head,data); break;

case 3: skillNode(&data); //修改指定的医生的专长

p=SearchNode(head,data,1); ////////////////////////////////////要的是修改功能

break;

/*case 4: SearchNode(head,data,1); printf("输入需查询的信息:"); scanf("%d",&data.skill);

head=SearchNode(head,data,1); break;*/

26

case 0: break;

}

}while(choice); //还是回到二级菜单允许再次选择二级功能 return head;

}

struct node *C_recipelManage(struct node *head) //医生诊疗处方信息管理 {

int choice;

Type data;

struct node *p;

do

{

menuRecipel(); //调用二级菜单

printf("输入选择项:");

scanf("%d",&choice);

switch(choice) //输入选择项

{

case 1: recipelNode(&data); //首先读入带插入的医生处方,在插入 //head=InsertOrder(head,data,1);

p=SearchNode(head,data,1);

p->data.recip=data.recip;

break;

case 2: recipelNode(&data); //读入编号,根据编号进行删除 p=SearchNode(head,data,1);///////////////////////////////////////////////////////////还需要函数

break;

case 3: readNode(&data); //读入下一条医生记录

p=SearchNode(head,data,1); //查找该编号的医生是否存在 if(p)

p->data=data; //若该编号医生存在,则修改其信息 else printf("此医生不存在!"); //否则显示此人不存在

break;

case 4: //SearchNode(head,data,1);

printf("输入需查询的处方编号:");

scanf("%d",&data.recip.recipel[0]);

head=SearchNode(head,data,1);

break;

case 0: break;

}

}while(choice); //还是回到二级菜单允许再次选择二级功能 return head;

}

27

struct node *searchManage(struct node *head) //根据条件查询模块的实现 {

int choice;

Type data;

struct node *p;

do

{

menuSearch();

printf("输入选择项:");

scanf("%d",&choice);

switch(choice)

{

case 1: printf("输入需查询的医生编号:");

scanf("%ld",&data.num); //输入编号,查询

break;

case 2: printf("输入需查询的医生名字:");

scanf("%s",&data.name);

break; //输入特长,查询

case 3: printf("输入需查询的医生特长:");

scanf("%s",&data.skill);

break;

case 0: break;

}

if(choice>=1&&choice

if(p=SearchNode(head,data,choice)) // 如果找到匹配的记录 {

printHead(); //输出表头

printNode(p->data); //输出记录

}

else //如果没有找到 printf("不存在你所查询的信息"); //输出提示信息

}while(choice); //重回二级菜单允许再次选择二级功能

return head; // 返回头指针 }

struct node* runMain(struct node *head,int choice) //该函数收main调用,根据选择项

{

switch(choice)

28

{ case 1: printHead(); //选择1,先输出表头

head=printList(head); // 调用函数完成显示基本信息的功能 break;

case 2: head=baseManage(head); // 选择2,调用函数完成基本信息管理功能

break;

case 3: head=skillManage(head); //选择3,调用函数完成医生特长信息管理功能

break;

case 4: head=C_recipelManage(head); // 选择4,调用函数完成医生诊疗处方信息管理功能

break;

case 5: head=searchManage(head); //选择5,调用函数完成根据条件查询的功能

break;

case 0: break;}

return head; // 返回头指针

}

int main()

{

struct node *head=NULL; //定义头文件

int choice; //用于输入一级菜单的选项

head=readFile(head); //首先执行文件打开操作 if(!head) //如果原始文件不存在

{

createFile(); //则首先调用函数创建文件

head=readFile(head); //再从文件读记录入链表,按编号从小到大 }

do

{

menu(); //调用一级菜单显示函数 printf("输入选择项:");

scanf("%d",&choice); //输入一级菜单选项

if(choice>=0&&choice

printf("错误输入,请再次输入选择项!");

}while(choice); //重回一级菜单允许再次选择二级功能

saveFile(head); //每次在结束之前保存文件,以便下次访问

return 0; //记录写入文件,以便下次访问 }

29


相关文章

  • 16通讯录的制作
  • 中 北 大 学 课程设计任务书 学 专 院: 业: 软件学院 学 生 姓 名: 设 计 题 目: 学 号: 通讯录的制作 起 迄 日 期 : 2010 年 12 月 27 日 ~ 2011 年 1 月 7 日 设 计 地 点 : 指 导 教 ...查看


  • 液压油缸课程设计说明书
  • 课程设计说明书 (液压油缸的压力和速度控制) 班级:机自07-1班 姓名:卢锋 学号:10074789 日期:2010.1 目录 1.设计课题 1.1设计目的 1.2设计要求 1.3设计参数 1.4设计方案 · ·············· ...查看


  • 浙江万里学院基础学院
  • 浙江万里学院基础学院 2009-2010学年第二学期(回龙校区)课表说明 各学院.教学部及学生办: 2009-2010学年第二学期课表已安排(详见附表),课表说明如下: 1.教学周次根据(浙江万里学院2009-2010学年校历)安排执行,特 ...查看


  • 安徽自考本科类专业及课程详情
  • B082208计算机信息管理(独立本科段)考试计划 中国科学技术大学 .................... 1 C050201英语(本科段)考试计划 安徽大学 . .................................... ...查看


  • 网上订餐系统3
  • 天津职业技术师范大学 Tianjin University of Technology and Education <软件工程>课程设计 网上订餐系统的设计与实现 学 院:信息技术工程学院 专 业: 计算机科学技术 班级学号: ...查看


  • 浮阀塔设计计算说明书
  • 山东大学 课程设计(说明书) 设计(论文) 题目: 乙醇-水连续精馏浮阀塔设计说明书 . 姓名 学院机械工程学院 专业过程装备与控制工程 年级 2009级过控班 指导教师唐委校宋清华 2013年1月15日 山东大学课程设计(论文)成绩评定表 ...查看


  • 服装专业课程与职业相关性初探
  • 2010年8月第25卷第4期纺织教育T ex til e Educati on A ug. , 2010V o. l 25N o. 4 服装专业课程与职业相关性初探 姜 蕾, 徐秀云, 郭瑞良, 史丽敏, 赵欲晓 (北京服装学院服装艺术与工 ...查看


  • 毕业设计信息管理系统任务书
  • 信息与计算科学本科专业 数据库课程设计任务书 (2011级) 题目: 毕业设计管理系统 学生姓名: 班级: 学号: 题目类型: 软件开发 指导教师: 一. 设计的目的和意义 该设计要求学生以毕业设计管理业务为背景,设计.开发一套" ...查看


  • 宁波大学本科教学培养方案指导性意见 2
  • 宁 波 大 学 文 件 宁大政„2010‟101号 宁波大学本科教学培养方案指导性意见 为了进一步深化教育教学改革.适应构建创新人才培养体系与建设服务型教育教学体系的需要,学校决定启动新一轮本科教学培养方案修订工作,现提出如下指导性意见. ...查看


热门内容