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