c++医院挂号系统设计.docx
《c++医院挂号系统设计.docx》由会员分享,可在线阅读,更多相关《c++医院挂号系统设计.docx(61页珍藏版)》请在冰豆网上搜索。
c++医院挂号系统设计
课程设计
医院挂号系统
一:
系统功能、输入数据、与输出数据:
医院挂号系统是一个可以让病人在线挂号并查询挂号纪录的系统,为了简化系统的复杂度,我们做了以下的假设:
1.诊别数据是给定的,不可新增;诊别数据只包含两样信息:
诊别编号与诊别名字。
2.医生资料是给定的,不可新增;医生数据只包含两样信息:
医生编号与医生名字。
3.药物资料是给定的,不可新增;药物数据只包含两样信息:
药物编号与药物名字。
4.可新增病人资料;病人数据只包含两样信息:
病人编号与病人名字。
5.可新增挂号数据;挂号数据包含几样信息:
挂号编号、病人编号、病人名字、诊别编号、诊别名字、医生编号、医生名字、药物编号、药物名字与挂号日期;挂号时,一旦某病人选择了某诊别与某医生,则系统将根据该诊别与该医生自动配置对应的药物。
有了以上的假设,我们应该要有以下这些档案:
诊别档:
用来提供诊别信息,档案的每一行应包含两个字段:
诊别编号与诊别名字。
subjects.log:
1骨科
2眼科
3SARS专科
医生檔:
用来提供医生信息,档案的每一行应包含两个字段:
医生编号与医生名字。
doctors.log:
1林庄杰
2许家荣
3萧博文
4林芳伶
5陈明江
6卢瑞鹏
药物檔:
用来提供药物信息,档案的每一行应包含两个字段:
药物编号与药物名字。
medicines.log:
1铁牛运功散
2十八铜人行气散
3福禄寿健儿宝
4爱之味麦仔茶
5统一埔里矿泉水
6黑松沙士
7东北三宝-人参,貂皮,乌拉草
8天山雪莲
9含笑半步癫
比对檔:
用来提供比对信息,所谓的比对信息就是哪科诊别配上哪位医生则开哪种药物,档案的每一行应包含四个字段:
比对编号、诊别编号、医生编号与药物编号。
matches.log:
1111
2122
3133
4144
5225
6236
7247
8258
9339
10341
11352
12363
病人檔:
用来提供病人信息,档案的每一行应包含两个字段:
病人编号与病人名字。
patients.log:
12吴柏宏
15黄俊育
19石凌霖
挂号檔:
用来提供挂号信息,档案的每一行应包含几个字段:
挂号编号、病人编号、病人名字、诊别编号、诊别名字、医生编号、医生名字、药物编号、药物名字与挂号日期。
reports.log:
1
12
吴柏宏
1
骨科
2
许家荣
2
十八铜人行气散
2003/01/01
2
15
黄俊育
2
眼科
4
林芳伶
7
东北三宝-人参,貂皮,乌拉草
2003/02/02
3
19
石凌霖
3
SARS专科
6
卢瑞鹏
3
福禄寿健儿宝
2003/03/03
二:
应用层面说明:
医院挂号系统不仅可用在医院挂号上,也可用在其它具比对性质的系统上。
三:
数据结构说明:
为了处理这些复杂的数据,我们定义了六种数据结构来处理数据与数据之间复杂的关系:
1.储存诊别数据的数据结构(SUBJECT):
SUBJECT
字段意义
字段名称
诊别编号
intid
诊别名称
charname[80]
2.储存医生数据的数据结构(DOCTOR):
DOCTOR
字段意义
字段名称
医生编号
intid
医生名称
charname[80]
3.储存药物数据的数据结构(MEDICINE):
MEDICINE
字段意义
字段名称
药物编号
intid
药物名称
charname[80]
4.储存比对数据的数据结构(MATCH):
MATCH
字段意义
字段名称
比对编号
intid
诊别编号
intsubject_id
医生编号
intdoctor_id
药物编号
intmedicine_id
5.储存病人数据的数据结构(PATIENT):
PATIENT
字段意义
字段名称
病人编号
intid
病人名称
charname[80]
6.储存挂号数据的数据结构(REPORT):
REPORT
字段意义
字段名称
挂号编号
intid
病人编号
intpatient_id
病人名称
chatpatient_name[80]
诊别编号
intsubject_id
诊别名称
charsubject_name[80]
医生编号
intdoctor_id
医生名称
chardoctor_name[80]
药物编号
intmedicine_id
药物名称
charmedicine_name[80]
挂号日期
chardate[80]
四:
主程序与子程序剖析:
1.主程序main():
功能:
允许使用者输入选项(1.新增病人资料,2.挂号,3.查询某病人的就诊纪录,4.查询某医生的看诊纪录,或5.结束程序),并执行该选项的功能。
流程图:
其中挂号功能比较复杂,因为我们必须判断1.某病人编号是否存在2.某病人所挂号的某医生是否有看某诊别3.某医生看某诊别时所开的药物的编号。
流程图:
程序代码:
main()
{
FILE*fp_subjects;//诊别档
FILE*fp_doctors;//医生档
FILE*fp_medicines;//药物档
FILE*fp_matches;//比对档
FILE*fp_patients;//病人檔
FILE*fp_reports;//挂号档
structSUBJECTsubjects[SUBJECTS_NUM+1],sub;//诊别资料
structDOCTORdoctors[DOCTORS_NUM+1],doc;//医生资料
structMEDICINEmedicines[MEDICINES_NUM+1],med;//药物资料
structMATCHmatches[MATCHES_NUM+1],mat;//比对数据
structPATIENTpatients[PATIENTS_NUM+1],pat;//病人资料
structREPORTreports[REPORTS_NUM+1],rep;//挂号数据
intpos_sub;//诊别数据位置
intpos_doc;//医生数据位置
intpos_med;//药物数据位置
intpos_mat;//比对数据位置
intpos_pat;//病人数据位置
intpos_rep;//挂号数据位置
intchoice,result;//选项与选项执行结果
if(!
(fp_subjects=fopen(SUBJECTS_FILE,"r")))//开启诊别档
{
printf("无法开启诊别文件,程序终止!
");
printf("\n");
exit
(1);
}
if(!
(fp_doctors=fopen(DOCTORS_FILE,"r")))//开启医生档
{
printf("无法开启医生文件,程序终止!
");
printf("\n");
exit
(1);
}
if(!
(fp_medicines=fopen(MEDICINES_FILE,"r")))//开启药物档
{
printf("无法开启药物文件,程序终止!
");
printf("\n");
exit
(1);
}
if(!
(fp_matches=fopen(MATCHES_FILE,"r")))//开启比对档
{
printf("无法开启比对文件,程序终止!
");
printf("\n");
exit
(1);
}
if(!
(fp_patients=fopen(PATIENTS_FILE,"r")))//开启病人档
{
fp_patients=fopen(PATIENTS_FILE,"w");
}
if(!
(fp_reports=fopen(REPORTS_FILE,"r")))//开启挂号档
{
fp_reports=fopen(REPORTS_FILE,"w");
}
initSubjects(subjects);//初始化诊别资料
initDoctors(doctors);//初始化医生资料
initMedicines(medicines);//初始化药物资料
initMatches(matches);//初始化比对数据
initPatients(patients);//初始化病人资料
initReports(reports);//初始化挂号数据
loadSubjects(subjects,fp_subjects);//加载诊别数据
loadDoctors(doctors,fp_doctors);//加载医生数据
loadMedicines(medicines,fp_medicines);//加载药物数据
loadMatches(matches,fp_matches);//加载比对数据
loadPatients(patients,fp_patients);//加载病人数据
loadReports(reports,fp_reports);//加载挂号数据
fclose(fp_subjects);
fclose(fp_doctors);
fclose(fp_medicines);
fclose(fp_matches);
fclose(fp_patients);
fclose(fp_reports);
while
(1)
{
printf("*****************主选单*****************");
printf("\n");
printf("****************************************");
printf("\n");
printf("1.新增病人资料");
printf("\n");
printf("2.挂号");
printf("\n");
printf("3.查询某病人的就诊纪录");
printf("\n");
printf("4.查询某医生的看诊纪录");
printf("\n");
printf("5.结束");
printf("\n");
printf("****************************************");
printf("\n");
printf("请选择>");
scanf("%d",&choice);//输入选项
switch(choice)
{
case1:
//新增病人资料
printf("请输入病人编号>");
scanf("%d",&pat.id);
printf("请输入病人名字>");
scanf("%s",&pat.name);
if(searchPatient(patients,pat.id)>0)
{
printf("病人数据重复!
");
printf("\n");
}
else
{
if(addPatient(patients,pat)>0)
{
printf("新增病人资料成功\!
");
printf("\n");
}
else
{
printf("病人资料已满!
");
printf("\n");
}
}
break;
case2:
//挂号
printf("请输入病人编号>");
scanf("%d",&rep.patient_id);//输入病人编号
pos_pat=searchPatient(patients,rep.patient_id);
if(pos_pat>0)//如果有此病人编号
{
printf("请输入挂号日期(ex.2002/04/20)>");
scanf("%s",&rep.date);//输入挂号日期
showSubjects(subjects);
printf("请输入诊别编号>");
scanf("%d",&rep.subject_id);//输入诊别编号
showDoctors(doctors);
printf("请输入医生编号>");
scanf("%d",&rep.doctor_id);//输入医生编号
pos_mat=searchMatch(matches,rep.subject_id,rep.doctor_id);
if(pos_mat>0)//如果此医生有看此诊别
{
//找出此诊别在诊别数据中的位置
pos_sub=searchSubject(subjects,matches[pos_mat].subject_id);
//找出此医生在医生数据中的位置
pos_doc=searchDoctor(doctors,matches[pos_mat].doctor_id);
//找出此医生看此诊别时所开的药物在药物数据中的位置
pos_med=searchMedicine(medicines,matches[pos_mat].medicine_id);
//找出此病人名字
strcpy(rep.patient_name,patients[pos_pat].name);
//找出此诊别名字
strcpy(rep.subject_name,subjects[pos_sub].name);
//找出此医生名字
strcpy(rep.doctor_name,doctors[pos_doc].name);
//找出此药物编号
rep.medicine_id=medicines[pos_med].id;
//找出此药物名字
strcpy(rep.medicine_name,medicines[pos_med].name);
//挂号
if(addReport(reports,rep)>0)
{
printf("新增挂号资料成功\!
");
printf("\n");
}
else
{
printf("挂号数据已满!
");
printf("\n");
}
}
else//如果此医生不看此诊别
{
printf("此医生不看此诊别!
");
printf("\n");
}
}
else//如果无此病人编号
{
printf("无此病人编号!
");
printf("\n");
}
break;
case3:
//查询某病人的就诊纪录
printf("请输入病人编号>");
scanf("%d",&pat.id);
if(searchPatient(patients,pat.id)>0)
{
queryByPatient(reports,pat.id);
}
else
{
printf("无此病人编号!
");
printf("\n");
}
break;
case4:
//查询某医生的看诊纪录
showDoctors(doctors);
printf("请输入医生编号>");
scanf("%d",&doc.id);
if(searchDoctor(doctors,doc.id)>0)
{
queryByDoctor(reports,doc.id);
}
else
{
printf("无此医生编号!
");
printf("\n");
}
break;
case5:
//结束程序
fp_patients=fopen(PATIENTS_FILE,"w");
fp_reports=fopen(REPORTS_FILE,"w");
savePatients(patients,fp_patients);
saveReports(reports,fp_reports);
fclose(fp_patients);
fclose(fp_reports);
exit
(1);
break;
default:
//无效的选项
printf("无效的选项!
");
printf("\n");
break;
}
}
}
2.子程序initSubjects(),initDoctors(),initMedicines(),initMatches(),initPatients(),initReports():
功能:
初始化资料,在此仅举initSubjects()与initDoctors()两个例子,其它例子与这两个例子相似。
流程图:
程序代码:
//初始化诊别资料
voidinitSubjects(structSUBJECTsubjects[])
{
inti;
for(i=1;i<=SUBJECTS_NUM;i++)
{
subjects[i].id=-1;
}
}
//初始化医生资料
voidinitDoctors(structDOCTORdoctors[])
{
inti;
for(i=1;i<=DOCTORS_NUM;i++)
{
doctors[i].id=-1;
}
}
3.子程序loadSubjects(),loadDoctors(),loadMedicines(),loadMatches(),loadPatients(),loadReports():
功能:
加载数据,在此仅举loadSubjects()与loadDoctors()两个例子,其它例子与这两个例子相似。
流程图:
程序代码:
//加载诊别数据,回传加载数据笔数
intloadSubjects(structSUBJECTsubjects[],FILE*fp)
{
intcount;
count=0;
while(!
feof(fp))
{
count=count+1;
fscanf(fp,"%d\t%s\n",&subjects[count].id,&subjects[count].name);
}
returncount;
}
//加载医生数据,回传加载数据笔数
intloadDoctors(structDOCTORdoctors[],FILE*fp)
{
intcount;
count=0;
while(!
feof(fp))
{
count=count+1;
fscanf(fp,"%d\t%s\n",&doctors[count].id,&doctors[count].name);
}
returncount;
}
4.子程序searchSubject(),searchDoctor(),searchMedicine(),searchPatient():
功能:
搜寻诊别数据,搜寻医生数据,搜寻药物数据,与搜寻病人数据;搜寻的条件为搜寻符合的编号的数据;如搜寻诊别数据为搜寻符合的诊别编号的数据。
流程图:
程序代码:
//搜寻诊别数据,回传诊别数据位置
intsearchSubject(structSUBJECTsubjects[],intid)
{
intindex;
for(index=1;index<=SUBJECTS_NUM&&subjects[index].id!
=-1;index++)
{
if(subjects[index].id==id)
{
returnindex;
}
}
return-1;
}
//搜寻医生数据,回传医生数据位置
intsearchDoctor(structDOCTORdoctors[],intid)
{
intindex;
for(index=1;index<=DOCTORS_NUM&&doctors[index].id!
=-1;index++)
{
if(doctors[index].id==id)
{
returnindex;
}
}
return