C语言程序设计医院信息管理系统附源代码.docx

上传人:b****8 文档编号:9896560 上传时间:2023-02-07 格式:DOCX 页数:25 大小:30.96KB
下载 相关 举报
C语言程序设计医院信息管理系统附源代码.docx_第1页
第1页 / 共25页
C语言程序设计医院信息管理系统附源代码.docx_第2页
第2页 / 共25页
C语言程序设计医院信息管理系统附源代码.docx_第3页
第3页 / 共25页
C语言程序设计医院信息管理系统附源代码.docx_第4页
第4页 / 共25页
C语言程序设计医院信息管理系统附源代码.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

C语言程序设计医院信息管理系统附源代码.docx

《C语言程序设计医院信息管理系统附源代码.docx》由会员分享,可在线阅读,更多相关《C语言程序设计医院信息管理系统附源代码.docx(25页珍藏版)》请在冰豆网上搜索。

C语言程序设计医院信息管理系统附源代码.docx

C语言程序设计医院信息管理系统附源代码

专业设计报告

课程名称:

C语言程序设计

课题名称:

医院信息管理系统

专业班别:

12本计算机科学与技术二班

姓名:

学号:

指导教师:

设计日期:

2012-5-25

教师评语:

等级

项目

及格

专业设计目的

设计基本要求

算法分析

源程序代码

源程序代码测试

设计总结

成绩评定:

指导教师签名:

日期:

2012年月

课程设计题目医院信息管理程序

作者姓名:

同组成员:

摘要利用结构体存储每个病人的信息和每种药品的信息,并使用链表存储全部病人的信息;能完成对医院内所有病人信息的注册、查询、删除和修改等操作,同时又能对药房内库存的药品进行查询;可以将链表中的病人信息保存在文件中,并且可以对文件中的病人信息进行读取与显示

1.专业设计目的

1、掌握链表的操作,包括链表节点的创建、释放还有链表的遍历

2、掌握对二进制文件的创建、增添等基本操作。

3、熟悉C语言函数的使用方法,学会模块化处理问题以及多个源文件的处理方式

2.设计基本要求(

1、使用结构体来存储病人的信息,结构体中包括病的id号码、姓名、病历以及消费信息,并用链表将所有病人信息整合。

2、用文件来存储链表的信息以便下次再使用该程序时载入病人信息

3、能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、查询库存等几项功能。

4、要求用四个源文件main.c、link.c、find.c、save_load.c

5、系统完成后应实现类似下面所示界面

“右讥程序设计雇院信島管理系统webu讥医院信息管理系统.《:

&H3口

欧迎使用医院管理系统

息自心«息自1.的低值人人人息病个费碁有存書历现库删询病人出入存询出:

W写病列载保查退一12345旨780乎

3、算法分析

1、数据结构

设计链表中的一个节点存储一个病人的信息,使用下面的结构体类型定义:

structpatient{

charid[10];

charname[10];

charcasehist[200];

intcost[3];

inttransfusion;

intsurgery;structpatient*next;

};

其中cost数组用来存储病人卖药的的个数(总共三种药),casehist存储病历内容,transfusion用来存

储病人输液的花费,surgery存储手术的花费。

Structpatient*next用来指向下一个病人结构体的起始地址从而形成一个链表。

此外还要用到一个结构体来存储库存中当前的药品情况。

structstorage{

intamount[3];intprice[3];

};

2、函数定义

程序代码有main.c、link.c、find.c、save_load.c四个源文件组成,使用头文件head.h把四个源文件连

接起来,四个文件中所包含的函数说明如表所示。

源文件

函数原型

功能说明

voidtest()

检测有无存储病人的一进制文件

voidinit(structstorage*temp)

初始化库存中的药品,参数为指向storage类型的指针

struct

voidprintmenu()

打印提示菜单

Main.c

Voidliststock(structstoragetemp)

列出库存中的药品

structpatient*enroll()

注册新病人信息

voidfreeall(structpatient

*temp)

清除链表内容,参数为指向structpatient类

型的指针

Find.c

voidsearch(structpatient*temp)

查询单个病人的信息,参数为指向

patient类型的指针

struct

voidlistall(structpatient*temp)

列出所有病人的信息,参数为指向

patient类型的指针

struct

Link.c

structpatient*insert(structpatient*head,structpatient*rea

加入新节点,参数为指向structpatient类型

的指针

voidmodify(structpatient*temp)

修改病人病历,参数为指向structpatient类

型的指针

voidbuy(structpatient*temp,structstorage*s)

/用于病人的消费处理,参数为指向struct

patient类型的指针与指向structstorage的指

Save_load.c

voidsave(structpatient

*head)

将链表信息保存到文件中,参数为指向struct

patient类型的指针

structpatient*load(structpatient*head)

将文件信息与入到链表中,参数为指向structpatient类型的指针

3、处理过程

(1)检查存储病人信息的文件是否存在,若不存在则创建一个新文件并设置flag值为1,以标记现在可以对链表进行操作。

(2)初始化库存令巴米尔、感冒灵、病毒唑3种药的数量分别为20、20、10,价格分别为5、9、16。

(3)输出提示菜单让用户悬着要操作的项目.

1)写病历前先检查是否有可用的链表(此标记为flag的值,若为1则代表可以修改病历,否则要求

用户重新做出选择)。

确认有可用链表之后进入modify函数。

要求用户输入病人的id号码,然后在链表中

寻找该病所对应的节点,若无此病人的id则直接输出提示信息后返回:

若找到后,先输出原来的病历内容,然后提示用户输入当前日期和新添加的病历内容,调用strcmp函数将新内容追加到原来的casehist字符串

数组中。

printf(”原有病历:

%s\n",temp->casehist);

printf("输入当前日期年份");

gets(a);

printf(”输入当前月份");

gets(b);

printf("输入当前日子");

gets(c);

strcat(temp->casehist,a);strcat(temp->casehist,"/");

strcat(temp->casehist,b);strcat(temp->casehist,"/");

strcat(temp->casehist,c);strcat(temp->casehist,":

");printf(”请输入新病历的内容\n");

gets(d);

strcat(temp->casehist,d);

2)载入链表信息是首先定义一个文件指针,然后以只读方式打开文件。

若失败则输出提示信息返

回,成功后调用malloc函数来申请一块内存,用read函数将文件内容写入到节点中,随后调用insert函

数将节点加入链表,如此循环下去直到fread函数返回0值,即文件已经读到了末尾时,再将链表的头指

针返回给主函数即可。

Flag值置为1,用来代表已有可用链表。

if((fp=fopen("data","r"))==0){

printf(”文件不存在!

");returnhead;

}

while

(1){

rear=(structpatient*)malloc(sizeof(structpatient));

if(fread(rear,sizeof(structpatient),1,fp))

head=insert(head,rear);

}else{free(rear);flag=1;break;

}

}

4、源程序代码

/*head.h*/

#ifndefFIRST

#include

#include

#includestructpatient{charid[10];charname[10];

charcasehist[200];

intcost[3];

inttransfusion;

intsurgery;structpatient*next;

//structpatient*next};

structstorage{

intamount[3];intprice[3];

};

intflag;

voidsearch(structpatient*temp);

//存储一个病人的信息

//id数组存储病人号码

//name数组存储病人姓名

//casehist存储病历内容

//cost数组存储病人买药的个数(总共三种)

//transfusion存储病人输液的花费

//surgery存储手术的花费

用来指向下一个病人结构体的起始地址从而形成一个链表

//存储库存中当前的药品情况

//查询单个病人的信息,参数为指向

structpatient类型的指

voidlistall(structpatient*temp);

//列出所有病人的信息,参数为指向structpatient类型的指

structpatient*insert(structpatient*head,structpatient*rear);

//加入新节点,参数为指向structpatient类型的指针

voidmodify(structpatient*temp);〃修改病人病历,参数为指向structpatient类型的指针

voidbuy(structpatient*temp,structstorage*s);

〃用于病人的消费处理,参数为指向structpatient类型的指针与指向structstorage的指针

structpatient*load(structpatient*head);

〃将文件信息写入到链表中,参数为指向structpatient类型的指针

voidsave(structpatient*head);

〃将链表信息保存到文件中,参数为指向structpatient类型的指针

#defineFIRST

#endif

/*find.c*/

#include"head.h"

voidsearch(structpatient*temp){

chart[10];

intsum;

printf("请输入病人的id\n");gets(t);

while(temp&&strcmp(temp->id,t)){

//定义search函数,查询单个病人的信息

//定义字符数组

//定义整型变量sum

/输入字符串

//比较字符串temp->id和t,其值和temp逻辑与运算,结果为非0时,执行循环体

temp=temp->next;

}if(temp){

printf("id:

%s\n",temp->id);

printf("\n

printf("\n

//temp的值为非0时,执行下列步骤

printf("\n消费记录

if(temp->cost[0]){printf("巴米尔

}

if(temp->cost[1]){printf("感冒灵

}

if(temp->cost[2]){printf("病毒唑

}

if(temp->transfusion){printf("输液费

}if(temp->surgery){printf("手术费

姓名:

%s",temp->name);病历:

\n%s",temp->casehist);

:

\n");

%d个\n”,temp->cost[0]);

%d个\n",temp->cost[1]);

%d个\n”,temp->cost[2]);

%d\n”,temp->transfusion);

%d\n“,temp_>surgery);

}

sum=temp->cost[0]*5+temp->cost[1]*9+temp->cost[2]*16+temp->transfusion+temp->surgery;

//计算sum的值printf("总费用%d元”,sum);

}

else{

printf(”无该病人的信息!

\n");

}

}

voidlistall(structpatient*temp){//定义listall函数,列出所有病人的信息

printf("id姓名\n");

while(temp){

printf("%s%s\n",temp->id,temp->name);

temp=temp->next;

}

}

/*link.c*/

/*!

!

!

!

!

!

可以出现重复id*/

#include"head.h"

structpatient*insert(structpatient*head,structpatient*rear){structpatient*temp;

if(head){

temp=head;

while(temp->next){

temp=temp->next;

}

temp->next=rear;

rear->next=0;

}

else{

head=rear;

rear->next=0;

}

returnhead;

}

//修改病人病历

〃定义字符组

〃定义字符组

〃输入病人的id

voidmodify(structpatient*temp){chart[10],d[200];

chara[4],b[2],c[2];

printf("请输入病人的id\n");gets(t);

while(temp&&strcmp(temp->id,t)){

temp=temp->next;

}if(temp){

printf(”原有病历:

%s\n",temp->casehist);printf("输入当前日期年份");

gets(a);

printf("输入当前月份");gets(b);

printf("输入当前日子");gets(c);

strcat(temp->casehist,a);strcat(temp->casehist,"/");strcat(temp->casehist,b);strcat(temp->casehist,"/");strcat(temp->casehist,c);strcat(temp->casehist,":

");printf("请输入新病历的内容\n");gets(d);

strcat(temp->casehist,d);strcat(temp->casehist,"\n");

}else{printf("无此病人信息!

\n”);

}

}

voidbuy(structpatient*temp,structstorage*s){

chart[10];

inta,b,c,d,e;

intflag1;

printf("请输入病人的id\n");gets(t);

while(temp&&strcmp(temp->id,t)){

temp=temp->next;

}if(temp){flag1=0;do{

printf("请输入买入巴米尔的个数:

scanf("%d",&a);

flag仁0;

if(a>s->amount[0]){

〃自动查找病人的id

〃输入年份

〃输入月份

〃输入日期

〃把字符串a接到temp->casehist后面//把字符“/”接到temp->casehist后面〃把字符串b接到temp->casehist后面//把字符“/”接到temp->casehist后面〃把字符串c接到temp->casehist后面//把字符":

”接到temp->casehist后面

〃输入新病历内容

〃把字符串d接到temp->casehist后面//把字符"\n"接到temp->casehist后面

〃病人消费处理

〃输入病人的id

〃自动查找病人的id

\n");

〃若输入的值大于库存的值,则提示”库存不足”

printf("库存不足!

\n”);

flag仁1;

}}while(flag1);flag1=0;do{

printf("请输入买入感冒灵的个数:

scanf("%d",&b);

flag仁0;if(b>s->amount[1]){printf("库存不足!

\n”);flag仁1;

}}while(flag1);flag1=0;do{

printf("请输入买入病毒唑的个数:

scanf("%d",&c);

flag仁0;if(c>s->amount[2]){printf("库存不足!

\n”);flag仁1;

}}while(flag1);temp_>cost[0]+=a;

temp->cost[0]

temp->cost[1]+=b;

temp->cost[1]temp->cost[2]+=c;

temp->cost[2]

printf("请输入输液费scanf("%d",&d);temp->transfusion+=d;printf("请输入手术费scanf("%d",&e);temp->surgery+=e;s->amount[0]-=a;s->amount[1]-=b;s->amount[2]-=c;printf("\n购买成功!

}else{

//flag仁1时,执行循环体

\n");

\n");

\n");

\n");

〃若输入的值大于库存的值,则提示

//flag仁1时,执行循环体

\n");

〃若输入的值大于库存的值,则提示

//flag仁1时,执行循环体

〃temp->cost[0]

〃temp->cost[1]

〃temp->cost[2]

〃temp->transfusion和d的值相加后赋给

//temp->surgery和e的值相加后赋给

a的值后赋给

b的值后赋给

c的值后赋给

〃s->amount[O]〃s->amount[1]〃s->amount[2]

减去

减去

减去

"库存不足"

"库存不足"

temp->transfusion

temp->surgerys->amount[0]s->amount[1]s->amount[2]

printf(”无此病人信息!

\n");

 

/*main.h*/

〃检测有无存储病人的二进制文件

structstorage类型的指针

//打印提示菜单

〃列出库存中的药品

//注册新病人信息

〃清除链表内容,参数为指向structpatient

#inelude"head.h"

voidtest();

voidinit(structstorage*temp);

〃初始化库存中的药品,参数为指向

voidprintmenu();

voidliststock(structstoragetemp);

structpatient*enroll();

voidfreeall(structpatient*temp);

类型的指针

voidmain(){

structpatient*head=O,*rear;

structstoragestock;charch;printf("欢迎使用医院管理系统\n");

test();

//检查是否有可用的链表

//调用insert函数将节点加入链表

!

\n");

init(&stock);while

(1){printmenu();fflush(stdin);ch=getchar();fflush(stdin);switch(ch){case'1':

if(flag){

rear=enroll();

head=insert(head,rear);printf("注册成功!

\n");

}

else{

printf("您没有载入信息不能注册

}break;

//检查是否有可用的链表

//查询病人信息

case2:

if(flag){

search(head);

}

!

\n");

else{

printf("您没有载入信息不能进行查询

}

break;

case3:

if(flag){

modify(head);

}

else{

printf(”

}break;

case4:

if(flag){

}else{

printf("

}break;

case'5':

if(flag){

listall(head);

}

else{

printf("您没有载入信息!

\n”);}break;

case'6':

freeall(head);head=0;

head=load(head);break;

case'7':

if(flag){

save(head);

}

else{

printf("您没有载入信息!

\n”);}break;

case'8':

liststock(stock);break;

case9:

printf("谢谢使用!

\n");

exit(0);

break;

您没有载入信息不能修改病历

buy(head,&stock);

您没有载入信息不能进行消费

default:

//检查是否有可用的链表

//修改病人病历

!

\n");

//检查是否有可用的链表

//病人的消费

!

\n");

//检查是否有可用的链表

〃列出所有病人信息

〃清除链表内容

//文件信息写入到链表

//检查是否有可用的链表

〃链表信息保存到病历中

//库存中药品列表

 

printf(”输入有误!

\n");break;

}

}

}

II打印提示采单

voidprintmenu(){

printf("\n");

printf("

*****************************

printf("1.注册新病人信息\n”);

printf("2.查询单个病人信息\n");

printf("3.写病历\n");

printf("4.病人消费

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1