C语言程序设计(医院信息管理系统)附源代码_第1页
C语言程序设计(医院信息管理系统)附源代码_第2页
C语言程序设计(医院信息管理系统)附源代码_第3页
C语言程序设计(医院信息管理系统)附源代码_第4页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、专业设计报告课程名称:C语言程序设计课题名称:医院信息管理系统专业班别:12 本计算机科学与技术二班姓名:学号:指导教师:设计日期:2012-5-25教师评语:等级优良中及格差项目专业设计目的设计基本要求算法分析源程序代码源程序代码测试设计总结成绩评定:指导教师签名:日期:2012年月日课程设计题目医院信息管理程序作者姓名 :同组成员 :摘要 利用结构体存储每个病人的信息和每种药品的信息,并使用链表存储全部病人的信息;能完成对医院内所有病人信息的注册、查询、删除和修改等操作,同时又能对药房内库存的药品进行查询;可以将链表中的病人信息保存在文件中,并且可以对文件中的病人信息进行读取与显示1专业设

2、计目的1、掌握链表的操作,包括链表节点的创建、释放还有链表的遍历2、掌握对二进制文件的创建、增添等基本操作。3、熟悉 C 语言函数的使用方法,学会模块化处理问题以及多个源文件的处理方式2设计基本要求 (1、使用结构体来存储病人的信息,结构体中包括病的id 号码、姓名、病历以及消费信息,并用链表将所有病人信息整合。2、用文件来存储链表的信息以便下次再使用该程序时载入病人信息3、能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、查询库存等几项功能。4、要求用四个源文件main.c 、 link.c 、 find.c 、 save_load.c5、系统完成后应实现类似

3、下面所示界面3、算法分析1、数据结构设计链表中的一个节点存储一个病人的信息,使用下面的结构体类型定义:struct patientchar id10;char name10;char casehist200;int cost3;int transfusion;int surgery;struct patient *next;其中 cost 数组用来存储病人卖药的的个数(总共三种药),casehist 存储病历内容,transfusion用来存储病人输液的花费,surgery 存储手术的花费。Struct patient *next用来指向下一个病人结构体的起始地址从而形成一个链表。此外还要用到

4、一个结构体来存储库存中当前的药品情况。struct storageint amount3;int price3;2、函数定义程序代码有 main.c 、link.c 、find.c 、save_load.c 四个源文件组成,使用头文件 head.h 把四个源文件连接起来,四个文件中所包含的函数说明如表所示。源文件函数原型功能说明void test()检测有无存储病人的二进制文件void init(struct storage *temp)初始化库存中的药品,参数为指向structstorage 类型的指针void printmenu()打印提示菜单Main.cVoidliststock(str

5、uctstorage列出库存中的药品temp)struct patient *enroll()注册新病人信息voidfreeall(structpatient清除链表内容,参数为指向struct patient类*temp)型的指针void search(struct patient查询单个病人的信息,参数为指向struct*temp)patient 类型的指针Find.cstructvoid listall(struct patient列出所有病人的信息,参数为指向*temp)patient 类型的指针加入新节点,参数为指向struct patient 类型struct patient *i

6、nsert(struct的指针patient *head,struct patient*reaLink.cvoid modify(struct patient修改病人病历,参数为指向struct patient 类*temp)型的指针void buy(struct patient/用于病人的消费处理,参数为指向struct*temp,struct storage *s)patient 类型的指针与指向struct storage 的指针voidsave(structpatient将链表信息保存到文件中,参数为指向 structSave_load.c*head)patient 类型的指针stru

7、ctpatient *load(struct将文件信息写入到链表中,参数为指向 structpatient *head)patient 类型的指针3、 处理过程( 1)检查存储病人信息的文件是否存在,若不存在则创建一个新文件并设置flag 值为 1,以标记现在可以对链表进行操作。( 2)初始化库存令巴米尔、感冒灵、病毒唑3 种药的数量分别为20、 20、10,价格分别为5、9、16。( 3)输出提示菜单让用户悬着要操作的项目.1)写病历前先检查是否有可用的链表(此标记为 flag 的值,若为 1 则代表可以修改病历,否则要求用户重新做出选择) 。确认有可用链表之后进入 modify 函数。要求

8、用户输入病人的 id 号码,然后在链表中寻找该病所对应的节点, 若无此病人的 id 则直接输出提示信息后返回: 若找到后, 先输出原来的病历内容,然后提示用户输入当前日期和新添加的病历内容, 调用 strcmp 函数将新内容追加到原来的 casehist 字符串数组中。printf("原有病历 :%sn",temp->casehist);printf("输入当前日期年份 ");gets(a);printf("输入当前月份");gets(b);printf("输入当前日子");gets(c);strcat(te

9、mp->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);······&#

10、183;·2)载入链表信息是首先定义一个文件指针,然后以只读方式打开文件。若失败则输出提示信息返回,成功后调用 malloc 函数来申请一块内存,用 read 函数将文件内容写入到节点中,随后调用 insert 数将节点加入链表,如此循环下去直到 fread 函数返回 0 值,即文件已经读到了末尾时,再将链表的头指针返回给主函数即可。 Flag 值置为 1,用来代表已有可用链表。函if(fp=fopen("data","r")=0)printf("文件不存在!");return head;while(1)rear=(stru

11、ct patient *)malloc(sizeof(struct patient);if(fread(rear,sizeof(struct patient),1,fp)head=insert(head,rear);elsefree(rear);flag=1;break;4、源程序代码/*head.h*/#ifndef FIRST#include<stdlib.h>#include<stdio.h>#include<string.h>struct patient/存储一个病人的信息char id10;char name10;char casehist200;

12、/id数组存储病人号码/name 数组存储病人姓名/casehist 存储病历内容int cost3;int transfusion;/cost 数组存储病人买药的个数(总共三种)/transfusion存储病人输液的花费int surgery;/surgery存储手术的花费struct patient *next;/struct patient *next用来指向下一个病人结构体的起始地址从而形成一个链表;struct storageint amount3;int price3;/存储库存中当前的药品情况;int flag;void search(struct patient *temp);

13、/查询单个病人的信息,参数为指向structpatient 类型的指针void listall(struct patient *temp);/列出所有病人的信息,参数为指向structpatient 类型的指针struct patient *insert(struct patient *head,struct patient *rear);void modify(struct patient *temp);/加入新节点,参数为指向/修改病人病历,参数为指向struct patient类型的指针struct patient类型的指针void buy(struct patient *temp,st

14、ruct storage *s);/用于病人的消费处理,参数为指向struct patient类型的指针与指向struct storage的指针struct patient *load(struct patient *head);/将文件信息写入到链表中,参数为指向struct patient类型的指针void save(struct patient *head);/将链表信息保存到文件中,参数为指向struct patient类型的指针#define FIRST#endif/*find.c*/#include "head.h"void search(struct pati

15、ent *temp)char t10;int sum;printf("请输入病人的idn");gets(t);while(temp&&strcmp(temp->id,t)/比较字符串temp->id和 t ,其值和/定义 search 函数 ,查询单个病人的信息/定义字符数组/定义整型变量sum/输入字符串temp 逻辑与运算,结果为非0 时,执行循环体temp=temp->next;if(temp)/temp的值为非0 时,执行下列步骤printf("id: %sn",temp->id);printf("

16、;n姓名 : %s",temp->name);printf("n病历 : n%s",temp->casehist);printf("n消费记录 :n");if(temp->cost0)printf("巴米尔%d 个 n",temp->cost0);if(temp->cost1)printf("感冒灵%d 个 n",temp->cost1);if(temp->cost2)printf("病毒唑%d 个 n",temp->cost2);if(

17、temp->transfusion)printf("输液费%dn",temp->transfusion);if(temp->surgery)printf("手术费%dn",temp->surgery);sum=temp->cost0*5+temp->cost1*9+temp->cost2*16+temp->transfusion+temp->surgery;/ 计算 sum 的值printf("总费用%d 元 ",sum);elseprintf("无该病人的信息!n&qu

18、ot;);void listall(struct patient *temp)printf("id姓名 n");while(temp)/ 定义listall函数,列出所有病人的信息printf("%s%sn",temp->id,temp->name);temp=temp->next;/*link.c*/#include "head.h"struct patient *insert(struct patient *head,struct patient *rear) /*! 可以出现重复 id*/ struct pat

19、ient *temp;if(head)temp=head;while(temp->next)temp=temp->next;temp->next=rear;rear->next=0;elsehead=rear;rear->next=0;return head;void modify(struct patient *temp)char t10,d200;char a4,b2,c2;printf("请输入病人的idn");gets(t);/修改病人病历/定义字符组/定义字符组/输入病人的idwhile(temp&&strcmp(te

20、mp->id,t)/自动查找病人的 idtemp=temp->next;if(temp)printf("原有病历 : %sn",temp->casehist);printf("输入当前日期 年份 ");gets(a);/输入年份printf("输入当前月份 ");gets(b);/输入月份printf("输入当前日子 ");gets(c);/输入日期strcat(temp->casehist,a);/把字符串 a 接到 temp->casehist 后面strcat(temp->

21、casehist,"/");/把字符“ /”接到 temp->casehist 后面strcat(temp->casehist,b);/把字符串 b 接到 temp->casehist 后面strcat(temp->casehist,"/");/把字符“ /”接到 temp->casehist 后面strcat(temp->casehist,c);/把字符串 c 接到 temp->casehist 后面strcat(temp->casehist,":");/把字符“ : ”接到 temp

22、->casehist 后面printf("请输入新病历的内容n");gets(d);/输入新病历内容strcat(temp->casehist,d);/把字符串 d 接到 temp->casehist 后面strcat(temp->casehist,"n");/把字符 "n" 接到 temp->casehist 后面elseprintf("无此病人信息! n");void buy(struct patient *temp,struct storage *s)char t10;int a

23、,b,c,d,e;int flag1;printf("请输入病人的idn");gets(t);while(temp&&strcmp(temp->id,t)temp=temp->next;/病人消费处理/ 输入病人的id/ 自动查找病人的idif(temp)flag1=0;doprintf("请输入买入巴米尔的个数:n");scanf("%d",&a);flag1=0;if(a>s->amount0)/若输入的值大于库存的值,则提示" 库存不足 "printf(&quo

24、t;库存不足! n");flag1=1;while(flag1);/flag1=1 时,执行循环体flag1=0;doprintf("请输入买入感冒灵的个数:n");scanf("%d",&b);flag1=0;if(b>s->amount1)/若输入的值大于库存的值,则提示" 库存不足 "printf("库存不足! n");flag1=1;while(flag1);/flag1=1 时,执行循环体flag1=0;doprintf("请输入买入病毒唑的个数:n");

25、scanf("%d",&c);flag1=0;if(c>s->amount2)/若输入的值大于库存的值,则提示" 库存不足"printf("库存不足!n");flag1=1;while(flag1);temp->cost0+=a;/flag1=1 时,执行循环体/temp->cost0和a的 值 相 加 后 赋 给temp->cost0temp->cost1+=b;/temp->cost1和b的值相加后赋给temp->cost1temp->cost2+=c;/temp-&g

26、t;cost2和c的值相加后赋 给temp->cost2printf("请输入输液费scanf("%d",&d);temp->transfusion+=d;printf("请输入手术费scanf("%d",&e);temp->surgery+=e;s->amount0-=a;s->amount1-=b;s->amount2-=c;printf("n购买成功!n"); n"); n");/temp->transfusion和 d 的值相加后

27、赋给/temp->surgery和 e 的值相加后赋给/s->amount0 减去 a 的值后赋给/s->amount1 减去 b 的值后赋给/s->amount2 减去 c 的值后赋给temp->transfusion temp->surgery s->amount0 s->amount1 s->amount2elseprintf("无此病人信息!n");/*main.h*/#include "head.h"void test();/检测有无存储病人的二进制文件void init(struct st

28、orage *temp);/初始化库存中的药品,参数为指向struct storage类型的指针void printmenu();/打印提示菜单void liststock(struct storage temp);struct patient *enroll();void freeall(struct patient *temp);/ 列出库存中的药品/ 注册新病人信息/清除链表内容, 参数为指向struct patient类型的指针void main()struct patient *head=0,*rear;struct storage stock;char ch;printf(&quo

29、t;欢迎使用医院管理系统n");test();init(&stock);while(1)printmenu();fflush(stdin);ch=getchar();fflush(stdin);switch(ch)case '1':if(flag)rear=enroll();head=insert(head,rear);/ 检查是否有可用的链表/ 调用 insert 函数将节点加入链表printf("注册成功!n");elseprintf("您没有载入信息不能注册!n");break;case '2':i

30、f(flag)search(head);/ 检查是否有可用的链表/ 查询病人信息elseprintf("您没有载入信息不能进行查询!n");break;case '3':if(flag)modify(head);/ 检查是否有可用的链表/修改病人病历elseprintf("您没有载入信息不能修改病历!n");break;case '4':if(flag)buy(head,&stock);/ 检查是否有可用的链表/ 病人的消费else printf("您没有载入信息不能进行消费!n");break

31、;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);/ 检查是否有可用的链表/链表信息保存到病历中elseprintf("您没有载入信息!n");break;case '8':li

32、ststock(stock);break;case '9':printf("谢谢使用exit(0);break;default:!n");/ 库存中药品列表printf("输入有误 !n");break;void printmenu()/ 打印提示菜单printf("n");printf("*n");printf("1.注册新病人信息 n");printf("2.查询单个病人信息 n");printf("3.写病历 n");printf(&

33、quot;4.病人消费 n");printf("5.列出所有病人的信息n");printf("6.载入所有病人信息 n");printf("7.保存现有信息 n");printf("8.查询库存 n");printf("9.退出 n");printf("*n");void test()/ 检测病人有无存储病人的二进制文件FILE *fp;if(fp=fopen("data","r")=0)printf(" 这是您第一

34、次使用该系统,在退出时不要忘了保存信息n");fp=fopen("data","w");/ 打开外部文件flag=1;fclose(fp);/文件执行后返回 fpvoid init(struct storage *temp)/初始化库存中的药品,参数为指向struct storage类型的指针temp->amount0=20;/初始化库存令巴米尔数量为20temp->amount1=20;/初始化库存令感冒灵数量为20temp->amount2=10;/初始化库存令病毒唑数量为10temp->price0=5;/ 初始化

35、库存令巴米尔价格为5temp->price1=9;/ 初始化库存令感冒灵价格为9temp->price2=16;/初始化库存令感冒灵价格为16void liststock(struct storage temp)/列出库存中的药品int i;printf("药品名数量单价 n");/ 输出库存中各药品的数量、价格for(i=0;i<3;i+)switch(i) case 0:printf("巴米尔%d%dn",temp.amounti,temp.pricei);/ 输出巴米尔的数量、单价break;case 1:printf("

36、;感冒灵%d%dn",temp.amounti,temp.pricei);/ 输出感冒灵的数量、单价break;case 2:printf("病毒唑%d%dn",temp.amounti,temp.pricei);/ 输出病毒唑的数量、单价break;struct patient *enroll()/ 注册新病人信息struct patient *rear;rear=(struct patient *)malloc(sizeof(struct patient);printf(" 请输入病人 id:n");scanf("%s",rear->id);/ 获得病人 id 号码printf(" 请输入病人姓名 n");scanf("%s",rear->name);/获得病人姓名strcpy(rear->casehist,"");/ 将注册信息存储进病历rear->cost0=0;/ 初始化令购买巴米尔的花费为0rear->cost1=0;/ 初始化令购买感冒灵的花

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论