1、C语言程序设计医院信息管理系统附源代码专业设计报告课程名称: C语言程序设计课题名称: 医院信息管理系统专业班别: 12本计算机科学与技术二班姓 名: 学 号: 指导教师: 设计日期: 2012-5-25教师评语:等级项目优良中及格差专业设计目的设计基本要求算法分析源程序代码源程序代码测试设计总结成绩评定: 指导教师签名:日期:2012年 月课程设计题目医院信息管理程序作者姓名:同组成员:摘要 利用结构体存储每个病人的信息和每种药品的信息,并使用链表存储全部病人的信息;能完成 对医院内所有病人信息的注册、查询、删除和修改等操作,同时又能对药房内库存的药品进行查询;可以 将链表中的病人信息保存在
2、文件中,并且可以对文件中的病人信息进行读取与显示1.专业设计目的1、 掌握链表的操作,包括链表节点的创建、释放还有链表的遍历2、 掌握对二进制文件的创建、增添等基本操作。3、 熟悉C语言函数的使用方法,学会模块化处理问题以及多个源文件的处理方式2 .设计基本要求(1、 使用结构体来存储病人的信息,结构体中包括病的 id号码、姓名、病历以及消费信息,并用链 表将所有病人信息整合。2、 用文件来存储链表的信息以便下次再使用该程序时载入病人信息3、 能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、 查询库存等几项功能。4、 要求用四个源文件 ma in .c、li
3、nk.c、fin d.c、save_load.c5、 系统完成后应实现类似下面所示界面“右讥程序设计雇院信島管理系统webu讥医院信息管理系统.:& H3口欧迎使用医院管理系统息 自心息 自1.的低 值人 人人息 病个费碁有存 書历现库 删询病人出入存询出 :W写病列载保查退 一 12345旨 780 乎3、算法分析1、 数据结构设计链表中的一个节点存储一个病人的信息,使用下面的结构体类型定义:struct patie ntchar id10;char n ame10;char casehist200;int cost3;int tran sfusi on;int surgery; struc
4、t patie nt *n ext;其中cost数组用来存储病人卖药的的个数(总共三种药) ,casehist存储病历内容,transfusion用来存储病人输液的花费,surgery存储手术的花费。Struct patient *next用来指向下一个病人结构体的起始地址 从而形成一个链表。此外还要用到一个结构体来存储库存中当前的药品情况。struct storageint amoun t3; int price3;2、 函数定义程序代码有 main.c、link.c、find.c、save_load.c四个源文件组成,使用头文件 head.h把四个源文件连接起来,四个文件中所包含的函数说明
5、如表所示。源文件函数原型功能说明void test()检测有无存储病人的一进制文件void in it(struct storage *temp)初始化库存中的药品,参数为指向 storage类型的指针structvoid prin tme nu()打印提示菜单Main .cVoid liststock(struct storage temp)列出库存中的药品struct patie nt *en roll()注册新病人信息void freeall(struct patie nt*temp)清除链表内容,参数为指向 struct patie nt类型的指针Fin d.cvoid search(
6、struct patie nt *temp)查询单个病人的信息,参数为指向patient类型的指针structvoid listall(struct patie nt *temp)列出所有病人的信息,参数为指向patient类型的指针structLi nk.cstruct patie nt *in sert(struct patie nt *head,struct patie nt *rea加入新节点,参数为指向 struct patie nt类型的指针void modify(struct patie nt *temp)修改病人病历,参数为指向 struct patie nt类型的指针void
7、 buy(struct patie nt *temp,struct storage *s)/用于病人的消费处理,参数为指向 structpatient类型的指针与指向 struct storage的指针Save_load.cvoid save(struct patie nt*head)将链表信息保存到文件中, 参数为指向structpatient类型的指针struct patie nt *load(struct patie nt *head)将文件信息与入到链表中,参数为指向struct patient类型的指针3、处理过程(1) 检查存储病人信息的文件是否存在,若不存在则创建一个新文件并设置
8、 flag值为1,以标记现在 可以对链表进行操作。(2) 初始化库存令巴米尔、感冒灵、病毒唑 3种药的数量分别为 20、20、10,价格分别为5、9、16。(3) 输出提示菜单让用户悬着要操作的项目 .1)写病历前先检查是否有可用的链表(此标记为 flag的值,若为1则代表可以修改病历,否则要求用户重新做出选择)。确认有可用链表之后进入 modify函数。要求用户输入病人的 id号码,然后在链表中寻找该病所对应的节点,若无此病人的id则直接输出提示信息后返回:若找到后,先输出原来的病历内容, 然后提示用户输入当前日期和新添加的病历内容, 调用strcmp函数将新内容追加到原来的 casehis
9、t字符串数组中。printf(” 原有病历:%sn,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(te
10、mp-casehist,d);2)载入链表信息是首先定义一个文件指针,然后以只读方式打开文件。若失败则输出提示信息返回,成功后调用 malloc函数来申请一块内存,用 read函数将文件内容写入到节点中,随后调用 insert函数将节点加入链表,如此循环下去直到 fread函数返回0值,即文件已经读到了末尾时,再将链表的头指针返回给主函数即可。 Flag值置为1,用来代表已有可用链表。if(fp=fope n(data,r)=0)printf(”文件不存在!); retur n head;while(1)rear=(struct patie nt *)malloc(sizeof(struct
11、patie nt);if(fread(rear,sizeof(struct patie nt),1,fp)head=in sert(head,rear); else free(rear); flag=1; break;4、源程序代码/*head.h*/#ifndef FIRST#in clude#in clude#in clude struct patie nt char id10; char n ame10;char casehist200;int cost3;int tran sfusi on;int surgery; struct patie nt *n ext;/struct pati
12、e nt *n ext ;struct storageint amoun t3; int price3;int flag;void search(struct patie nt *temp);针/存储一个病人的信息/id数组存储病人号码/name数组存储病人姓名/casehist存储病历内容/cost数组存储病人买药的个数(总共三种)/transfusion存储病人输液的花费/surgery存储手术的花费用来指向下一个病人结构体的起始地址从而形成一个链表/存储库存中当前的药品情况/查询单个病人的信息,参数为指向struct patient 类型的指void listall(struct pat
13、ie nt *temp);/列出所有病人的信息,参数为指向 struct patient类型的指struct patient *insert(struct patient *head,struct patient *rear);/加入新节点,参数为指向 struct patie nt类型的指针void modify(struct patie nt *temp); 修改病人病历,参数为指向 struct patie nt 类型的指针void buy(struct patie nt *temp,struct storage *s);用于病人的消费处理,参数为指向 struct patient类型的
14、指针与指向 struct storage的指针struct patient *load(struct patient *head);将文件信息写入到链表中,参数为指向 struct patie nt类型的指针void save(struct patie nt *head);将链表信息保存到文件中,参数为指向 struct patie nt类型的指针#defi ne FIRST#en dif/*fin d.c*/#in clude head.hvoid search(struct patie nt *temp)char t10;int sum;printf(请输入病人的idn); gets(t)
15、;while(temp&strcmp(temp-id,t)/定义search函数,查询单个病人的信息/定义字符数组/定义整型变量sum/输入字符串/比较字符串temp-id和t,其值和temp逻辑与运算,结果为非 0时,执行循环体temp=temp-n ext; if(temp)prin tf(id: %sn,temp-id);prin tf(nprin tf(n/temp的值为非0时,执行下列步骤prin tf(n 消费记录if(temp-cost0) printf(巴米尔if(temp-cost1) printf(感冒灵if(temp-cost2) printf(病毒唑if(temp-tr
16、a nsfusio n) printf(输液费 if(temp-surgery) printf(手术费姓名:%s,temp-name); 病历:n%s,temp-casehist);:n);%d 个n”,temp-cost0);%d 个n,temp-cost1);%d 个n”,temp-cost2);%dn ”,temp-tra nsfusi on);%dn “,temp_surgery);sum=temp-cost0*5+temp-cost1*9+temp-cost2*16+temp-tra nsfusi on+temp-surgery;/计算sum的值 printf(总费用 d 元 ”,s
17、um);elseprintf(”无该病人的信息! n);void listall(struct patient *temp) /定义 listall 函数,列出所有病人的信息printf(id 姓名 n);while(temp)prin tf(%s %sn ,temp-id,temp-n ame);temp=temp-n ext;/*li nk.c*/*!可以出现重复id*/#in clude head.hstruct patie nt *in sert(struct patie nt *head,struct patie nt *rear) struct patie nt *temp;if(
18、head)temp=head;while(temp-n ext)temp=temp-n ext;temp-n ext=rear;rear-n ext=0;elsehead=rear;rear-n ext=0;retur n head;/修改病人病历定义字符组定义字符组输入病人的idvoid modify(struct patie nt *temp) char t10,d200;char a4,b2,c2;printf(请输入病人的idn); gets(t);while(temp&strcmp(temp-id,t)temp=temp-n ext; if(temp)printf(” 原有病历:%s
19、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); strc
20、at(temp-casehist,n); else printf(无此病人信息! n”);void buy(struct patie nt *temp,struct storage *s)char t10;int a,b,c,d,e;int flag1;printf(请输入病人的idn); gets(t);while(temp&strcmp(temp-id,t)temp=temp-n ext; if(temp) flag 1=0; doprintf(请输入买入巴米尔的个数:sca nf(%d,&a);flag 仁0;if(as-am oun t0)自动查找病人的id输入年份输入月份输入日期把字
21、符串a接到temp-casehist后面 /把字符“ /”接到temp-casehist后面 把字符串b接到temp-casehist后面 /把字符“ /”接到temp-casehist后面 把字符串c接到temp-casehist后面 /把字符:”接到temp-casehist后面输入新病历内容把字符串d接到temp-casehist后面 /把字符n接到temp-casehist后面病人消费处理输入病人的id自动查找病人的idn);若输入的值大于库存的值,则提示”库存不足”printf(库存不足! n”);flag仁1; while(flag1); flag 1=0; doprintf(请输
22、入买入感冒灵的个数: sca nf(%d,&b);flag 仁0; if(bs-amou nt1) printf(库存不足! n”); flag仁1; while(flag1); flag 1=0; doprintf(请输入买入病毒唑的个数: sca nf(%d,&c);flag 仁0; if(cs-amou nt2) printf(库存不足! n”); flag仁1; while(flag1); temp_cost0+=a;temp-cost0temp-cost1+=b;temp-cost1 temp-cost2+=c;temp-cost2printf(请输入输液费 sca nf(%d, &
23、d); temp-tra nsfusi on+=d; printf(请输入手术费 sca nf(%d, &e); temp-surgery+=e; s-am oun t0-=a; s-am oun t1-=b; s-am oun t2-=c; prin tf(n 购买成功! else/flag仁1时,执行循环体n);n);n);n);若输入的值大于库存的值,则提示/flag仁1时,执行循环体n);若输入的值大于库存的值,则提示/flag仁1时,执行循环体的temp-cost0temp-cost1temp-cost2temp-transfusion 和d的值相加后赋给/temp-surgery和
24、e的值相加后赋给a的值后赋给b的值后赋给c的值后赋给s-amou ntO s-am oun t1 s-amou nt2减去减去减去库存不足库存不足temp-tra nsfusi ontemp-surgery s-am oun t0 s-am oun t1 s-am oun t2printf(”无此病人信息! n);/*ma in .h*/检测有无存储病人的二进制文件struct storage类型的指针/打印提示菜单列出库存中的药品/注册新病人信息清除链表内容,参数为指向struct patient#in elude head.hvoid test();void in it(struct st
25、orage *temp);初始化库存中的药品,参数为指向void prin tme nu();void liststock(struct storage temp);struct patie nt *en roll();void freeall(struct patie nt *temp);类型的指针void mai n()struct patie nt *head=O,*rear;struct storage stock; char ch; printf(欢迎使用医院管理系统n);test();/检查是否有可用的链表/调用insert函数将节点加入链表!n);in it(&stock); w
26、hile(1) prin tme nu(); fflush(stdi n); ch=getchar(); fflush(stdi n); switch(ch) case 1:if(flag)rear=e nroll();head=in sert(head,rear); printf(注册成功!n);else printf(您没有载入信息不能注册 break;/检查是否有可用的链表/查询病人信息case 2:if(flag)search(head);!n);else printf(您没有载入信息不能进行查询break;case 3:if(flag)modify(head);else printf
27、(” break;case 4: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;case 9:printf(谢谢使用!n);exit(0);break;您没有载入信息不能修改病历buy(head, &stock);您没有载入信息不能进行消费default:/检查是否有可用的链表/修改病人病历!n);/检查是否有可用的链表/病人的消费!n);/检查是否有可用的链表列出所有病人信息清除链表内容/文件信息写入到链表/检查是否有可用的链表链表信息保存到病历中/库存中药品列表printf(” 输入有误!n); break;II打印提示采单void prin tme nu()prin tf(n);printf(*printf(1.注册新病人信息n”);printf(2.查询单个病人信息n);printf(3.写病历 n);printf(4.病人消费
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1