1专业设计报告课程名称:C语言程序设计课题名称:医院信息管理系统专业班别:11本计算机科学与技术二班姓名:学号:指导教师:设计日期:2012-5-252教师评语:等级项目优良中及格差专业设计目的设计基本要求算法分析源程序代码源程序代码测试设计总结成绩评定:指导教师签名:日期:2012年月日3课程设计题目医院信息管理程序作者姓名:同组成员:摘要利用结构体存储每个病人的信息和每种药品的信息,并使用链表存储全部病人的信息;能完成对医院内所有病人信息的注册、查询、删除和修改等操作,同时又能对药房内库存的药品进行查询;可以将链表中的病人信息保存在文件中,并且可以对文件中的病人信息进行读取与显示1.专业设计目的1、掌握链表的操作,包括链表节点的创建、释放还有链表的遍历2、掌握对二进制文件的创建、增添等基本操作。3、熟悉C语言函数的使用方法,学会模块化处理问题以及多个源文件的处理方式2.设计基本要求(1、使用结构体来存储病人的信息,结构体中包括病的id号码、姓名、病历以及消费信息,并用链表将所有病人信息整合。2、用文件来存储链表的信息以便下次再使用该程序时载入病人信息3、能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、查询库存等几项功能。4、要求用四个源文件main.c、link.c、find.c、save_load.c5、系统完成后应实现类似下面所示界面43、算法分析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把四个源文件连接起来,四个文件中所包含的函数说明如表所示。源文件函数原型功能说明Main.cvoidtest()检测有无存储病人的二进制文件voidinit(structstorage*temp)初始化库存中的药品,参数为指向structstorage类型的指针voidprintmenu()打印提示菜单Voidliststock(structstoragetemp)列出库存中的药品structpatient*enroll()注册新病人信息voidfreeall(structpatient*temp)清除链表内容,参数为指向structpatient类型的指针Find.cvoidsearch(structpatient*temp)查询单个病人的信息,参数为指向structpatient类型的指针voidlistall(structpatient*temp)列出所有病人的信息,参数为指向structpatient类型的指针5Link.cstructpatient*insert(structpatient*head,structpatient*rea加入新节点,参数为指向structpatient类型的指针voidmodify(structpatient*temp)修改病人病历,参数为指向structpatient类型的指针voidbuy(structpatient*temp,structstorage*s)/用于病人的消费处理,参数为指向structpatient类型的指针与指向structstorage的指针Save_load.cvoidsave(structpatient*head)将链表信息保存到文件中,参数为指向structpatient类型的指针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)载入链表信息是首先定义一个文件指针,然后以只读方式打开文件。若失败则输出提示信息返6回,成功后调用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#includestdlib.h#includestdio.h#includestring.hstructpatient{//存储一个病人的信息charid[10];//id数组存储病人号码charname[10];//name数组存储病人姓名charcasehist[200];//casehist存储病历内容intcost[3];//cost数组存储病人买药的个数(总共三种)inttransfusion;//transfusion存储病人输液的花费intsurgery;//surgery存储手术的花费structpatient*next;//structpatient*next用来指向下一个病人结构体的起始地址从而形成一个链表};structstorage{//存储库存中当前的药品情况intamount[3];intprice[3];};intflag;voidsearch(structpatient*temp);//查询单个病人的信息,参数为指向structpatient类型的指针voidlistall(structpatient*temp);//列出所有病人的信息,参数为指向structpatient类型的指7针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*/#includehead.hvoidsearch(structpatient*temp){//定义search函数,查询单个病人的信息chart[10];//定义字符数组intsum;//定义整型变量sumprintf(请输入病人的id\n);gets(t);/输入字符串while(temp&&strcmp(temp-id,t)){//比较字符串temp-id和t,其值和temp逻辑与运算,结果为非0时,执行循环体temp=temp-next;}if(temp){//temp的值为非0时,执行下列步骤printf(id:%s\n,temp-id);printf(\n姓名:%s,temp-name);printf(\n病历:\n%s,temp-casehist);printf(\n消费记录:\n);if(temp-cost[0]){printf(巴米尔%d个\n,temp-cost[0]);}if(temp-cost[1]){printf(感冒灵%d个\n,temp-cost[1]);}if(temp-cost[2]){printf(病毒唑%d个\n,temp-cost[2]);}if(temp-transfusion){printf(输液费%d\n,temp-transfusion);}if(temp-surgery){printf(手术费%d\n,temp-surgery);8}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*/#includehead.hstructpatient*insert(structpatient*head,structpatient*rear){/*!!!!!!可以出现重复id*/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;}voidmodify(structpatient*temp){//