版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
专业设计报告课程名称:C语言程序设计课题名称:医院信息管理系统专业班别:12本计算机科学与技术二班姓名:学号:指导教师:设计日期:2023-5-25教师评语:等级项目优良中及格差专业设计目的设计基本规定算法分析源程序代码源程序代码测试设计总结成绩评估:指导教师署名:日期:2023年月日课程设计题目医院信息管理程序作者姓名:同组成员:摘要运用结构体存储每个病人的信息和每种药品的信息,并使用链表存储所有病人的信息;能完毕对医院内所有病人信息的注册、查询、删除和修改等操作,同时又能对药房内库存的药品进行查询;可以将链表中的病人信息保存在文献中,并且可以对文献中的病人信息进行读取与显示1.专业设计目的1、掌握链表的操作,涉及链表节点的创建、释放尚有链表的遍历2、掌握对二进制文献的创建、增添等基本操作。3、熟悉C语言函数的使用方法,学会模块化解决问题以及多个源文献的解决方式2.设计基本规定(1、使用结构体来存储病人的信息,结构体中涉及病的id号码、姓名、病历以及消费信息,并用链表将所有病人信息整合。2、用文献来存储链表的信息以便下次再使用该程序时载入病人信息3、可以实现病人信息的注册、病人信息的查询、病人消费记录、保存链表信息、载入链表信息、查询库存等几项功能。4、规定用四个源文献main.c、link.c、find.c、save_load.c5、系统完毕后应实现类似下面所示界面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把四个源文献连接起来,四个文献中所包含的函数说明如表所示。源文献函数原型功能说明Main.cvoidtest()检测有无存储病人的二进制文献voidinit(structstorage*temp)初始化库存中的药品,参数为指向structstorage类型的指针voidprintmenu()打印提醒菜单Voidliststock(structstoragetemp)列出库存中的药品structpatient*enroll()注册新病人信息voidfreeall(structpatient*temp)清除链表内容,参数为指向structpatient类型的指针Find.cvoidsearch(structpatient*temp)查询单个病人的信息,参数为指向structpatient类型的指针voidlistall(structpatient*temp)列出所有病人的信息,参数为指向structpatient类型的指针Link.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)载入链表信息是一方面定义一个文献指针,然后以只读方式打开文献。若失败则输出提醒信息返回,成功后调用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<stdlib.h>#include<stdio.h>#include<string.h>structpatient{ //存储一个病人的信息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类型的指针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){ //定义search函数,查询单个病人的信息 chart[10]; //定义字符数组 intsum; //定义整型变量sum printf("请输入病人的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); } 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*/#include"head.h"structpatient*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){ //修改病人病历 chart[10],d[200]; //定义字符组 chara[4],b[2],c[2]; //定义字符组 printf("请输入病人的id\n"); gets(t); //输入病人的id while(temp&&strcmp(temp->id,t)){ //自动查找病人的id temp=temp->next; } if(temp){ printf("原有病历: %s\n",temp->casehist); printf("输入当前日期年份"); gets(a); //输入年份 printf("输入当前月份"); gets(b); //输入月份 printf("输入当前日子"); gets(c); //输入日期 strcat(temp->casehist,a); //把字符串a接到temp->casehist后面 strcat(temp->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->casehist后面 printf("请输入新病历的内容\n"); gets(d); //输入新病历内容 strcat(temp->casehist,d); //把字符串d接到temp->casehist后面 strcat(temp->casehist,"\n"); //把字符"\n"接到temp->casehist后面 } else{ printf("无此病人信息!\n"); }}voidbuy(structpatient*temp,structstorage*s){ //病人消费解决 chart[10]; inta,b,c,d,e; intflag1; printf("请输入病人的id\n"); gets(t); //输入病人的id while(temp&&strcmp(temp->id,t)){ //自动查找病人的id temp=temp->next; } if(temp){ flag1=0; do{ printf("请输入买入巴米尔的个数:\n"); scanf("%d",&a); flag1=0; if(a>s->amount[0]){ //若输入的值大于库存的值,则提醒"库存局限性" printf("库存局限性!\n"); flag1=1; } }while(flag1); //flag1=1时,执行循环体 flag1=0; do{ printf("请输入买入感冒灵的个数:\n"); scanf("%d",&b); flag1=0; if(b>s->amount[1]){ //若输入的值大于库存的值,则提醒"库存局限性" printf("库存局限性!\n"); flag1=1; } }while(flag1); //flag1=1时,执行循环体 flag1=0; do{ printf("请输入买入病毒唑的个数:\n"); scanf("%d",&c); flag1=0; if(c>s->amount[2]){ //若输入的值大于库存的值,则提醒"库存局限性" printf("库存局限性!\n"); flag1=1; } }while(flag1); //flag1=1时,执行循环体 temp->cost[0]+=a; //temp->cost[0]和a的值相加后赋给temp->cost[0] temp->cost[1]+=b; //temp->cost[1]和b的值相加后赋给temp->cost[1] temp->cost[2]+=c; //temp->cost[2]和c的值相加后赋给temp->cost[2] printf("请输入输液费\n"); scanf("%d",&d); temp->transfusion+=d; //temp->transfusion和d的值相加后赋给temp->transfusion printf("请输入手术费\n"); scanf("%d",&e); temp->surgery+=e; //temp->surgery和e的值相加后赋给temp->surgery s->amount[0]-=a; //s->amount[0]减去a的值后赋给s->amount[0] s->amount[1]-=b; //s->amount[1]减去b的值后赋给s->amount[1] s->amount[2]-=c; //s->amount[2]减去c的值后赋给s->amount[2] printf("\n购买成功!\n"); } else{ printf("无此病人信息!\n"); }}/*main.h*/#include"head.h"voidtest(); //检测有无存储病人的二进制文献voidinit(structstorage*temp); //初始化库存中的药品,参数为指向structstorage类型的指针voidprintmenu(); //打印提醒菜单voidliststock(structstoragetemp); //列出库存中的药品structpatient*enroll(); //注册新病人信息voidfreeall(structpatient*temp); //清除链表内容,参数为指向structpatient类型的指针voidmain(){ structpatient*head=0,*rear; structstoragestock; charch; printf("欢迎使用医院管理系统\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"); } else{ printf("您没有载入信息不能注册!\n"); } break; case'2': if(flag){ //检查是否有可用的链表 search(head); //查询病人信息 } else{ printf("您没有载入信息不能进行查询!\n"); } break; case'3': if(flag){ //检查是否有可用的链表 modify(head); //修改病人病历 } else{ printf("您没有载入信息不能修改病历!\n"); } break; case'4': if(flag){ //检查是否有可用的链表 buy(head,&stock); //病人的消费 } else{ printf("您没有载入信息不能进行消费!\n"); } 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; default: printf("输入有误!\n"); break; } }}voidprintmenu(){ //打印提醒菜单 printf("\n"); printf("******************************\n"); printf("1.注册新病人信息\n"); printf("2.查询单个病人信息\n"); printf("3.写病历\n"); printf("4.病人消费\n"); printf("5.列出所有病人的信息\n"); printf("6.载入所有病人信息\n"); printf("7.保存现有信息\n"); printf("8.查询库存\n"); printf("9.退出\n"); printf("******************************\n");}voidtest(){ //检测病人有无存储病人的二进制文献 FILE*fp; if((fp=fopen("data","r"))==0){ printf("这是您第一次使用该系统,在退出时不要忘了保存信息\n"); fp=fopen("data","w"); //打开外部文献 flag=1; fclose(fp); //文献执行后返回fp }}voidinit(structstorage*temp){ //初始化库存中的药品,参数为指向structstorage类型的指针 temp->amount[0]=20; //初始化库存令巴米尔数量为20 temp->amount[1]=20; //初始化库存令感冒灵数量为20 temp->amount[2]=10; //初始化库存令病毒唑数量为10 temp->price[0]=5; //初始化库存令巴米尔价格为5 temp->price[1]=9; //初始化库存令感冒灵价格为9 temp->price[2]=16; //初始化库存令感冒灵价格为16}voidliststock(structstoragetemp){ //列出库存中的药品 inti; printf("药品名数量单价\n"); //输出库存中各药品的数量、价格 for(i=0;i<3;i++){ switch(i){case0: printf("巴米尔%d%d\n",temp.amount[i],temp.price[i]); //输出巴米尔的数量、单价 break; case1: printf("感冒灵%d%d\n",temp.amount[i],temp.price[i]); //输出感冒灵的数量、单价 break; case2: printf("病毒唑%d%d\n",temp.amount[i],temp.price[i]); //输出病毒唑的数量、单价 break;} }}structpatient*enroll(){ //注册新病人信息 structpatient*rear; rear=(structpatient*)malloc(sizeof(structpatient)); printf("请输入病人id:\n"); scanf("%s",rear->id); //获得病人id号码 printf("请输入病人姓名\n"); scanf("%s",rear->name); //获得病人姓名 strcpy(rear->casehist,""); //将注册信息存储进病历 rear->cost[0]=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中培训部对家长的总结
- 中考数学二轮复习专项1~17题对点提分训练(二)课件
- 数控车削加工技术 课件 项目一 数控车削工艺基础
- 1.2 太阳对地球的影响(分层练习)高一地理同步高效课堂(人教版2019必修第一册)
- 广东省惠州市博罗县华侨中学2024-2025学年高二上学期同步检测生物学试题(含答案)
- 2024-2025学年九年级上学期期中考试历史试题 - 副本
- 2024年山东省淄博市中考化学试题卷(含答案解析)
- 审计基础理论知识单选题100道及答案解析
- 2024年反洗钱基础知识答题(试题及答案)
- 高中物理第四章电磁感应6互感和自感课件新人教版选修3-
- 苗木供货服务计划方案
- 泌尿外科常见疾病的诊治思路
- 三年级上册美术课件-5.14 奇特的热带植物丨岭南版 (共16张PPT)
- 幼儿园故事绘本:《昆虫运动会》 课件
- 幼儿园大班语言故事:《傻小熊种萝卜》 课件
- 2022年北京市西城区社区工作者招聘笔试题库及答案解析
- 农村寄宿制学校建设和管理经验资料
- 皮炎湿疹诊断治疗课件
- 固定资产卡片(台账)样本
- 空运提单格式
- 卡通学生班干部竞选自我介绍
评论
0/150
提交评论