C语⾔课程设计:医院管理系统
⽂末附有源码。
实验说明:
《程序设计基础课程设计》
1、编写⼀个C语⾔程序,实现⼀个医院的诊疗管理系统,能够管理⾄少30位患者,每位患者⾄多30条诊疗记录。其中:
1)每条诊疗记录包括患者信息、医⽣信息、诊疗情况三部分。请⾃⾏组织相关信息的存储⽅式(冗余信息可不存储)和显⽰格式。
2)患者信息包括:姓名、年龄、挂号;挂号唯⼀。
3)医⽣信息包括:姓名、级别、科室、⼯号、出诊时间;⼯号唯⼀;每位医⽣只在规定时间出诊(如每周⼀、周三,默认出诊即全天出诊)。
4)诊疗情况分为3类信息:检查、开药、住院。对于检查,仅记录每种检查费⽤,以及所有检查的总费
⽤;对于开药,仅记录每种药品名称、单价、数量,以及所有药品的总价;对于住院,仅记录住院开始⽇期、预计出院⽇期、住院押⾦。
轻阴5)住院费⽤按实际天数计算。在办理住院时(即开始⽇期)需要交纳住院押⾦,住院押⾦要求为100元的整数倍,且不低于200*N(N为拟住院天数)元。特殊约定:在00:00-08:00之间办理出院不收取当天的住院费。对于拟继续住院的患者则系统会⾃动在08:00从患者的住院押⾦中扣除当天的住院费⽤,患者住院期间需随时保证住院押⾦⼀直不低于1000元。
为了简化,特做如下约定:
1)如涉及时间,仅包括⽉、⽇、时、分(默认为当年)。
2)患者最多100位,医⽣最多30位;药品最多30种,药品充⾜;患者每次开药最多100盒(或其它合适的数量单位)。
3)医⽣的级别限定为:主任医师、副主任医师、主治医师、住院医师1,尽可能符合实际情况。医⽣仅⾪属于某个科室。提醒:医⽣之间、患者之间、医⽣患者之间均可能重名。
4)每天,医院可最多受理500个号,每位医⽣可最多受理20个号,每位患者可最多挂5个号、同⼀科室最多挂1个号;需⾃⾏设计挂号的编码规则,可隐含挂号⽇期、挂号当天的顺序号、对应的医⽣等
信息,保证每条诊疗记录的挂号唯⼀。
5)⾦额要精确到元、⾓、分,不允许有误差,最⾼额度不超过10万;最⼤数量不超过int允许最⼤整数。
具体功能要求如下:
大使命0)开始时,管理系统默认医院的运营资⾦为0元。
1)【增加】能够从⽂件中录⼊多条诊疗记录,也能够随时录⼊1条诊疗记录。注意:需要考虑各种类型的不规范、不合理或错误数据,如:数据位数不对、格式不对等。【重点考察】
2)【修改】能够随时修改1条诊疗记录。按照财务规范,如需修改错误的诊疗记录,应将当前错误的诊疗记录予以撤销后,再补充添加正确的诊疗记录。【重点考察】
3)【删除】能够随时删除1条诊疗记录。
1 住院医师只是医⽣的⼀种级别,并不表⽰诊疗情况中的住院只能与住院医师对应。
4)【查询】能够按照合理顺序打印某个科室的诊疗信息(按照科室检索)。
5)【查询】能够按照合理顺序打印某位医⽣的诊疗信息(按照医⽣的⼯号检索)。
6)【查询】能够按照合理顺序打印某位患者的历史诊疗信息(按照患者的相关信息检索)。
7)【统计】能够统计医院⽬前的营业额(检查费⽤+药品费⽤+住院费⽤,不含住院押⾦);能够⽣成⽬前的住院患者报表。【重点考察】8)【统计】能够统计每位医⽣的出诊情况和⼯作繁忙程度。
9)【某段时间范围】能够打印某段时间范围内的所有诊疗信息。【重点考察】
10)【存储】能够将当前系统中的所有信息保存到⽂件中。
11)其它你认为有⽤的附加功能,可酌情添加。
源码
注:该源码脱离资源⽂件不能运⾏,运⾏请下载附件中的⼯程⽂件
//⽂件basic.h
#ifndef OPEN_H_INCLUDED
#define OPEN_H_INCLUDED
struct Doctor{
int number;//⼯号
char name[20];//姓名
char name[20];//姓名
人格测评int level;//级别
安布闭壳龟int department;//科室
int workingHours[7];//⼯作时间。索引值0~6对应周⽇~周六,存储值为1则为上班,0则为不上班
struct Doctor *next;
int registed;//今⽇挂号量统计
int w_registed;//周挂号量统计
};
struct ExaminationFee{
char name[20];
int cost;
struct ExaminationFee *next;
};
struct Medicine{
int number;
char name[20];
int price;
struct Medicine *next;
};
struct Hospitalization{
int zhuyuanyajin;//住院押⾦
int ruyuanshijian;//⼊院时间:⽉、⽇、时、分
固定资产抵扣int chuyuanshijian;//出院时间:⽉、⽇、时、分
};
struct Treatment{
int total;
int totalExaminationFee;//总检查费
struct ExaminationFee exminationFee;
int totalMedicineCharge;//总药费
struct Medicine medicine;
struct Hospitalization hospitalization;
};
/*数据类*/
struct Data{
int number;//挂号序列需是唯⼀值
醉驾的量刑标准
int ID;//患者ID,对于每位患者来说是唯⼀值
char name[20];//患者姓名
int age;//患者年龄
struct Doctor doctor;//医⽣
struct Treatment treatment;//治疗⽅法
struct Data *next;//链
};
int clearMedList();//回收药品链表内存
int clearDoctorList();//回收医⽣链表
int clearExamList();//回收诊疗项⽬链表内存
void saveData(char*location);//在location路径下将dataHead链表的所有数据存储到⽂件中
int registe();//挂号模块
void inputMedData();//从⽂件中读取并加载药品仓库数据
void buildDoctorList();//加载医⽣值班数据
int compStr(char*s1,int len1,char*s2,int len2);//字符串⽐对函数,⽤于检索
void buyMedicine(struct Data* newnode);//购药函数
int printDeparList(int n);//输出某个科室的情况
void hospitalize(struct Data* newNode);//住院模块
void lectExaminations(struct Data * newnode);//选择检查项⽬
void menu();//主菜单
int viewData();//浏览数据模块
void inputExamData();//加载所有的检查项⽬
void clearList1(struct Medicine *ba);//回收ba链表内存
void clearList2(struct ExaminationFee * ba);//回收ba链表内存
int findExamStart(int left,int right, FILE *pf_exam,int target);//⼆分查找,在⽂件中寻找对应的购药数据
int findMedStart(int left,int right, FILE *pf_med,int target);//⼆分查找,在⽂件中寻找对应的检查项⽬数据
int buildMedList(struct Medicine *ba, FILE *pf_med,int start,int end);//建⽴诊疗记录中的购药单链表
int buildExamList(struct ExaminationFee *ba, FILE *pf_exam,int start,int end);//建⽴诊疗记录中的检查项⽬链表
int buildExamList(struct ExaminationFee *ba, FILE *pf_exam,int start,int end);//建⽴诊疗记录中的检查项⽬链表
void clearList(struct Data *ba);//回收ba链表内存
struct Data*input(const char*dir);//建⽴链表的主函数,⽂件路径为dir,返回值为哨兵节点
void openUTDfile();//打开最新的数据⽂件
int preDay(char*ori);//输⼊为"data/1009/"型字符串,输出为前⼀天的字符串,如“data/1008/”
int nextDay(char*ori);//输⼊为"data/1009/"型字符串,输出为后⼀天的字符串,如“data/1010/”
int scanInt(int*num,int length);//输⼊整型变量,回车键结束输⼊,⾮法字符会被忽略,输⼊过长返回-2,⽆输⼊返回-1;
int scanStrNum(char*num,int length);//输⼊数字的字符串,回车键结束输出,⾮法字符会被忽略,若
⽆符合要求的输⼊则返回1,长度过长返回-2. int scanName(char*s,int length);//输⼊姓名,返回-2为输⼊过长
void loadHospitalizeData();//加载住院数据
void saveHosData();//存储主链表数据
int inputDate(int*month,int*day);//输⼊⽇期的函数
struct Data*reInput(const char* dir);//从路径为dir的⽂件中倒序建⽴链表
int viewUTDdata(int n);//浏览最新的n条数据
int showDepartStatus();//显⽰挂号情况模块
void showDocRegisted(struct Doctor *head);//显⽰科室中所有医⽣的情况
int leaveHospital(struct Data *p);//出院模块
int timeSpan(int start,int end);//⽇期不合法返回0
int printfMoneyStatus();//打印医院的营业额
void w_countAllDoc();//统计所有医⽣近⼀周的挂号量
int scanStr(char*s,int length);//安全读取字符串的函数
int dataChangeMenu();//数据修改菜单
int changeDataMenu();//修改数据的主界⾯
int tPassWord();//加密函数
char*deCode();//解密函数
int dataViewMenu();//数据浏览模块
int inpatientDapart();//住院部模块
int patientAdminMenu();//住院病⼈管理菜单
int delayTime(struct Data *p);//延期出院模块
601601股票
int printMargin(int n);//⽤于排版
void loading();//加载动效
int printSingleData(struct Data *p);//打印单条数据
int saveMedData();
int reSeek(FILE *pf);
#endif// OPEN_H_INCLUDED
//⽂件basic.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<io.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<windows.h>
#include"basic.h"
#include"view.h"
#include"change.h"
/*
设定:每个医⽣⼀天最多挂10个号
每个科室最多挂20个号
*/
const char DoctorLevel[5][12]={"","住院医师","主治医师","副主任医师","主任医师"};
struct Medicine * mediStorage;//医院药品仓库
struct ExaminationFee * examlists;//医院所有可检查的项⽬
struct Data* dataHead;//链表头结点.有哨兵
struct Data* dataRear;//链表尾结点
struct Data* inHospital;//所有正在住院的病⼈,⽆哨兵
struct Data* inHospitalRear;
struct Doctor doctor_departments[5];//设置5个科室,每个科室都是⼀个医⽣链表,有哨兵结点
char departments[7][20]={"内科","外科","⼉科","五官科","传染病科"};
int countDepartment[7];//记录每个科室挂了多少号
int quence =1;//挂号序列
/*考虑:⼏种模式的浏览:*/
int viewData()
{
system("cls");
printf("\n\n\n\n\n");
printMargin(40);
printf("1、浏览最新数据\n\n");
printMargin(40);
printf("2、浏览历史数据\n\n");
printMargin(40);
printf("0、返回上⼀层\n\n\n\n\n");
printf("请选择:");
int command;
for(;;)
{
scanInt(&command,3);
if((command <0)||(command >3))
{
printf("输⼊⾮法!\n请重新输⼊:");
}
el
break;
}
if(!command)
return0;
if(command ==1)
{
printf("请输⼊要查看多少条数据(最多100条):");
for(;;)
{
scanInt(&command,4);
if((command <0)||(command >100))
{
printf("输⼊⾮法\n请重新输⼊:");
}
el
break;
}
viewUTDdata(command);
}
el
viewDataSpan();
教育叙事初中return0;
}
struct Data*input(const char* dir)//打开以路径“dir”为参数的所有⽂件,路径格式:“data/1001/”{
FILE *pf,*pf_med,*pf_exam;
char position[40];
strcpy(position,dir);
strcpy(position+10,"");
quence =0;
struct Data * ba =(struct Data*)malloc(sizeof(struct Data));
ba->next =NULL;
if(pf =fopen(position,"r"),pf==NULL)
{
dataRear = ba;
dataHead = ba;
return ba;
}
strcpy(position+10,"");
strcpy(position+10,"");
pf_exam =fopen(position,"r");
strcpy(position+10,"");
pf_med =fopen(position,"r");
struct Data *p1,*p2 =NULL;
p1 = ba;
struct Data *ptmp =NULL;
while(!feof(pf))
{
p2 =(struct Data *)malloc(sizeof(struct Data));
p2->next =NULL;
p1->next = p2;
fscanf(pf,"%d%d%s%d%d%s",&(p2->number),&(p2->ID),p2->name,&(p2->age),&(p2->doctor.number),p2->doctor.name); fscanf(pf,"%d%d",&p2->doctor.level,&p2->doctor.department);
int i;
for(i =0; i <7;++i)
fscanf(pf,"%d",&(p2->doctor.workingHours[i]));
fscanf(pf,"%d",&(p2-&al));
int med_start,med_end,exam_start,exam_end;
fscanf(pf,"%d%d%d%d",&med_start,&med_end,&exam_start,&exam_end);
fscanf(pf,"%d%d",&(p2->treatment.hospitalization.ruyuanshijian),&(p2->treatment.hospitalization.chuyuanshijian));
p2-& =NULL;
fgetc(pf);
p2-&alMedicineCharge =buildMedList(&(p2-&dicine),pf_med,med_start,med_end);
p2-&alExaminationFee =buildExamList(&(p2-&inationFee), pf_exam,exam_start,exam_end); ptmp = p1;
quence =(ptmp->number)%10000;
p1 = p2;
}
dataRear = ptmp;
ptmp->next =NULL;
free(p2);
fclo(pf);
fclo(pf_exam);
fclo(pf_med);
return ba;
}
/*建⽴购药单链表*/
int buildMedList(struct Medicine *ba, FILE *pf_med,int start,int end)//建⽴药品链表(需要读取购药单所在的⽂件)
{
ba->next =NULL;
if(start > end)
return0;
if(!start)
return0;
int totalcost =0;
int right;
fek(pf_med,-38,SEEK_END);//共有right条数据
fscanf(pf_med,"%d",&right);
--right;
struct Medicine *p1,*p2;
p1 =(struct Medicine *)malloc(sizeof(struct Medicine));//⽂件尾记录了总共有多少条数据,8字节
ba->next = p1;
p1->next =NULL;
int s;
s =findMedStart(0, right, pf_med,start);//⼆分查找开始的记录
fek(pf_med,s *38,SEEK_SET);
int tmp;
fscanf(pf_med,"%d%s%d%d",&(tmp),p1->name,&(p1->price),&(p1->number));
totalcost +=((p1->price)*(p1->number));