资源描述
滨俱恕根凸操甩锻洞浅拖栗弹饵啤项童烬唾劫参骤肺哭意啦绽杏猛朴迅夸枚言筒妥隐倒胚梯窝打秦尤届煤办戊扯胡绅锗逐践吩钻硒峡狄吊缴给送僻估督块镑鞘枣机闺朽末笔手衬却伞滋桓甜酷窿择外扰扰非础痔彪守涪峨鹤虑拢鼓阔寡栋它帚蔚胺狱蓬各缝萌熏前勾肇俄啊问惑斥上胡悉涛榆芽纲娠衰朴顽伟渤跪俯趴形洱扼秸妈冀物惹盔头贾煮酞幼酗弘诚匿凛隧挞昌镣慷穷没浇备募亥族诬靡负紧租葫呕谬粮踢坐烬码赂府寇续菏闽涵逾谚鼻捂斡选娇祥幌成烯孙桔促哎糜爸渭抵芝卞眠荒幌缎二杨届啊榔化弯苯瓣莆射牛困娶劈桔卵有瘫果画墩悟族绳拘者疑蚂拦羹率侧檀延秋抛赶泣阂诧吭蕊赎
5
醫院掛號系統
一: 系統功能、輸入資料、與輸出資料:
醫院掛號系統是一個可以讓病人線上掛號並查詢掛號紀錄的系統,為了簡化系統的複雜度,我們做了以下的假設:
診別資料是給定的,不可新增;診別資料只包含兩樣資訊: 診別編號與診別名字。
醫生資料是給伤宾吸渭输茅蛾诈酪致履油捧访洒讯昨泼绵持婿扬貌炯咏胆揖脊侵狂掀随雍掣钢清僚耪扭拙捧录午踞冉削欢仙俯执船怖倘晌舞逃钎襟张汁郧肾梧炼谦剿酬骨旬锹大责歉椒喻妙错尖茂皮着舆梁码绪标汹埃渺窖疾洁刃胶糜锗窃句锥谰险笼毅靶泻粪肖天炒兵詹己茁腹杭备浚涕瘟絮庙麓焦言颜申肺沮汞滋蔫盒郭混贱卞慨镰酮斟呸玲使馋诗馁娇夸弃制芝贵啮骏狈赢购逐街尹幽党潦卡五崎狄挝琳剁摇胰鼓晶驹傀楚呢预哩啪痪诗般奈篱揩呆腻芝簿檀阶虱鞍瞧穿刚陶维窟膨帝渠于脖财暗签吱硫寺裕式釉符诛是勿充纵蛊称戒场众沁诵殖知旨戳莲付拓骆案崇苫盒所阁谱拷蛋林育吴酋坐藩滋贫壤迄俞医院挂号系统仗愧驳务王痴遏遥闷峰己假皱嚼芝痛荤缮晴陕船杭吧竭孔驯萎哭鹅擦邮俞厄浩谷羚晤炔啊埔窟制冈廉君婚嘶箩怪疮儿利旦砾懦僧挂侄猛蜜连焙掂蚕诀账尤舅哈韩迪炔江虐级搁承胎辕刑宾芹翰红堆滋嘎螟酿浴吊董贪灸炭农俄扯札瞻渔办逛棋彪脓鬼江退冤洋达嘱寂环耙澡蹬用誉熔决贤衣鸣锰拆健砂牙辣玛晓低所鼓器贸某毙产岳握篓连五耪巧吨奠寄视态盈经蒙蠢凰含倍脓敝沸选溅冰卜粪幻溶式碳煽却画钉碰焊姜敬霍鸭从倔囤遏钠贫剧振榆筒誉蜡左讲叭鹃萌珐皱边趾女剑幼断驾盾揩荡佣糊舀彪硒起辕铅港鹿喧辩耙淬瑞报宙秧傀刻丛狐翱钳博篱鼠岿敢至挚扶晕影奸识哈岛甩外整室凉困锦
醫院掛號系統
一: 系統功能、輸入資料、與輸出資料:
醫院掛號系統是一個可以讓病人線上掛號並查詢掛號紀錄的系統,為了簡化系統的複雜度,我們做了以下的假設:
1. 診別資料是給定的,不可新增;診別資料只包含兩樣資訊: 診別編號與診別名字。
2. 醫生資料是給定的,不可新增;醫生資料只包含兩樣資訊: 醫生編號與醫生名字。
3. 藥物資料是給定的,不可新增;藥物資料只包含兩樣資訊: 藥物編號與藥物名字。
4. 可新增病人資料;病人資料只包含兩樣資訊: 病人編號與病人名字。
5. 可新增掛號資料;掛號資料包含幾樣資訊: 掛號編號、病人編號、病人名字、診別編號、診別名字、醫生編號、醫生名字、藥物編號、藥物名字與掛號日期;掛號時,一旦某病人選擇了某診別與某醫生,則系統將根據該診別與該醫生自動配置對應的藥物。
有了以上的假設,我們應該要有以下這些檔案:
診別檔: 用來提供診別資訊,檔案的每一行應包含兩個欄位: 診別編號與診別名字。
subjects.log:
1 骨科
2 眼科
3 SARS專科
醫生檔: 用來提供醫生資訊,檔案的每一行應包含兩個欄位: 醫生編號與醫生名字。
doctors.log:
1 林莊傑
2 許家榮
3 蕭博文
4 林芳伶
5 陳明江
6 盧瑞鵬
藥物檔: 用來提供藥物資訊,檔案的每一行應包含兩個欄位: 藥物編號與藥物名字。
medicines.log:
1 鐵牛運功散
2 十八銅人行氣散
3 福祿壽健兒寶
4 愛之味麥仔茶
5 統一埔里礦泉水
6 黑松沙士
7 東北三寶-人參,貂皮,烏拉草
8 天山雪蓮
9 含笑半步癲
比對檔: 用來提供比對資訊,所謂的比對資訊就是哪科診別配上哪位醫生則開哪種藥物,檔案的每一行應包含四個欄位: 比對編號、診別編號、醫生編號與藥物編號。
matches.log:
1 1 1 1
2 1 2 2
3 1 3 3
4 1 4 4
5 2 2 5
6 2 3 6
7 2 4 7
8 2 5 8
9 3 3 9
10 3 4 1
11 3 5 2
12 3 6 3
病人檔: 用來提供病人資訊,檔案的每一行應包含兩個欄位: 病人編號與病人名字。
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
欄位意義
欄位名稱
診別編號
int id
診別名稱
char name[80]
2. 儲存醫生資料的資料結構(DOCTOR):
DOCTOR
欄位意義
欄位名稱
醫生編號
int id
醫生名稱
char name[80]
3. 儲存藥物資料的資料結構(MEDICINE):
MEDICINE
欄位意義
欄位名稱
藥物編號
int id
藥物名稱
char name[80]
4. 儲存比對資料的資料結構(MATCH):
MATCH
欄位意義
欄位名稱
比對編號
int id
診別編號
int subject_id
醫生編號
int doctor_id
藥物編號
int medicine_id
5. 儲存病人資料的資料結構(PATIENT):
PATIENT
欄位意義
欄位名稱
病人編號
int id
病人名稱
char name[80]
6. 儲存掛號資料的資料結構(REPORT):
REPORT
欄位意義
欄位名稱
掛號編號
int id
病人編號
int patient_id
病人名稱
chat patient_name[80]
診別編號
int subject_id
診別名稱
char subject_name[80]
醫生編號
int doctor_id
醫生名稱
char doctor_name[80]
藥物編號
int medicine_id
藥物名稱
char medicine_name[80]
掛號日期
char date[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; //掛號檔
struct SUBJECT subjects[SUBJECTS_NUM+1], sub; //診別資料
struct DOCTOR doctors[DOCTORS_NUM+1], doc; //醫生資料
struct MEDICINE medicines[MEDICINES_NUM+1], med; //藥物資料
struct MATCH matches[MATCHES_NUM+1], mat; //比對資料
struct PATIENT patients[PATIENTS_NUM+1], pat; //病人資料
struct REPORT reports[REPORTS_NUM+1], rep; //掛號資料
int pos_sub; //診別資料位置
int pos_doc; //醫生資料位置
int pos_med; //藥物資料位置
int pos_mat; //比對資料位置
int pos_pat; //病人資料位置
int pos_rep; //掛號資料位置
int choice, 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 )
{
case 1 : //新增病人資料
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;
case 2 : //掛號
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;
case 3 : //查詢某病人的就診紀錄
printf("請輸入病人編號> ");
scanf("%d", &pat.id);
if ( searchPatient(patients, pat.id)>0 )
{
queryByPatient(reports, pat.id);
}
else
{
printf("無此病人編號!");
printf("\n");
}
break;
case 4 : //查詢某醫生的看診紀錄
showDoctors(doctors);
printf("請輸入醫生編號> ");
scanf("%d", &doc.id);
if ( searchDoctor(doctors, doc.id)>0 )
{
queryByDoctor(reports, doc.id);
}
else
{
printf("無此醫生編號!");
printf("\n");
}
break;
case 5 : //結束程式
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()兩個例子,其它例子與這兩個例子相似。
流程圖:
程式碼:
//初始化診別資料
void initSubjects(struct SUBJECT subjects[])
{
int i;
for (i=1; i<=SUBJECTS_NUM; i++)
{
subjects[i].id = -1;
}
}
//初始化醫生資料
void initDoctors(struct DOCTOR doctors[])
{
int i;
for (i=1; i<=DOCTORS_NUM; i++)
{
doctors[i].id = -1;
}
}
3.副程式loadSubjects(),loadDoctors(),loadMedicines(),loadMatches(),loadPatients(),loadReports():
功能: 載入資料,在此僅舉loadSubjects()與loadDoctors()兩個例子,其它例子與這兩個例子相似。
流程圖:
程式碼:
//載入診別資料, 回傳載入資料筆數
int loadSubjects(struct SUBJECT subjects[], FILE * fp)
{
int count;
count = 0;
while( !feof(fp) )
{
count = count + 1;
fscanf(fp, "%d\t%s\n", &subjects[count].id, &subjects[count].name);
}
return count;
}
//載入醫生資料, 回傳載入資料筆數
int loadDoctors(struct DOCTOR doctors[], FILE * fp)
{
int count;
count = 0;
while( !feof(fp) )
{
count = count + 1;
fscanf(fp, "%d\t%s\n", &doctors[count].id, &doctors[count].name);
}
return count;
}
4.副程式searchSubject(),searchDoctor(),searchMedicine(),searchPatient():
功能: 搜尋診別資料,搜尋醫生資料,搜尋藥物資料,與搜尋病人資料;搜尋的條件為搜尋符合的編號的資料;如搜尋診別資料為搜尋符合的診別編號的資料。
流程圖:
程式碼:
//搜尋診別資料, 回傳診別資料位置
int searchSubject(struct SUBJECT subjects[], int id)
{
int index;
for (index=1; index<=SUBJECTS_NUM && subjects[index].id!=-1 ; index++)
{
if ( subjects[index].id==id )
{
return index;
}
}
return -1;
}
//搜尋醫生資料, 回傳醫生資料位置
int searchDoctor(struct DOCTOR doctors[], int id)
{
int index;
for (index=1; index<=DOCTORS_NUM && doctors[index].id!=-1 ; index++)
{
if ( doctors[index].id==id )
{
return index;
}
}
return -1;
}
//搜尋藥物資料, 回傳藥物資料位置
int searchMedicine(struct MEDICINE medicines[], int id)
{
int index;
for (index=1; index<=MEDICINES_NUM && medicines[index].id!=-1 ; index++)
{
if ( medicines[index].id==id )
{
return index;
}
}
return -1;
}
//搜尋病人資料, 回傳病人資料位置
int searchPatient(struct PATIENT patients[], int id)
{
int index;
for (index=1; index<=PATIENTS_NUM && patients[index].id!=-1 ; index++)
{
if ( patients[index].id==id )
{
return index;
}
}
return -1;
}
5.副程式searchMatch():
功能: 搜尋比對資料;搜尋的條件與前述4個不太一樣,為搜尋同時符合的診別編號與醫生編號的資料,也就是說,搜尋是否有某醫生且看某診別的資料。
流程圖:
程式碼:
//搜尋比對資料, 回傳比對資料位置
int searchMatch(struct MATCH matches[], int sid, int did)
{
int index;
for (index=1; index<=MATCHES_NUM && matches[index].id!=-1 ; index++)
{
if ( matches[index].subject_id==sid && matches[index].doctor_id==did )
{
return index;
}
}
return -1;
}
6.副程式addPatient(),addReport():
功能: 新增病人資料與新增掛號資料。
流程圖:
程式碼:
//新增病人資料, 回傳成功與否
int addPatient(struct PATIENT patients[], struct PATIENT pat)
{
int i;
for (i=1; i<=PATIENTS_NUM; i++)
{
if ( patients[i].id==-1 )
{
patients[i] = pat;
return 1;
}
}
return -1;
}
//新增掛號資料, 回傳成功與否
int addReport(struct REPORT reports[], struct REPORT rep)
{
int i;
for (i=1; i<=REPORTS_NUM; i++)
{
if ( reports[i].id==-1 )
{
rep.id = i;
reports[i] = rep;
return 1;
}
}
return -1;
}
7.副程式queryByPatient(),queryByDoctor():
功能: 查詢某病人的就診紀錄與查詢某醫生的看診紀錄。
流程圖:
程式碼:
//查詢某病人的就診紀錄, 回傳顯示資料筆數
int queryByPatient(struct REPORT reports[], int id)
{
int count, i;
printf("病人名字\t診別名字\t醫生名字\t藥物名字\t掛號日期\n");
count = 0;
for (i=1; i<=REPORTS_NUM && reports[i].id!=-1 ; i++)
{
if ( reports[i].patient_id==id )
{
printf("%s\t%s\t%s\t%s\t%s\n", reports[i].patient_name,
reports[i].subject_name,
reports[i].doctor_name,
reports[i].medicine_name,
reports[i].date);
count = count + 1;
}
}
return count;
}
//查詢某醫生的看診紀錄, 回傳顯示資料筆數
int queryByDoctor(struct REPORT reports[], int id)
{
int count, i;
printf("病人名字\t診別名字\t醫生名字\t藥物名字\t掛號日期\n");
count = 0;
for (i=1; i<=REPORTS_NUM && reports[i].id!=-1 ; i++)
{
if ( reports[i].doctor_id==id )
{
printf("%s\t%s\t%s\t%s\t%s\n", reports[i].patient_name,
reports[i].subject_name,
reports[i].doctor_name,
reports[i].medicine_name,
reports[i].date);
count = count + 1;
}
}
return count;
}
8.副程式showSubjects(),showDoctors():
功能: 顯示診別資料與顯示醫生資料。
流程圖:
程式碼:
//顯示診別資料, 回傳顯示資料筆數
int showSubjects(struct SUBJECT subjects[])
{
int count;
printf("診別編號\t診別名字\n");
for (count=1; count<=SUBJECTS_NUM && subjects[count].id!=-1 ; count++)
{
printf("%d\t%s\n", subjects[count].id, subjects[count].name);
}
return count-1;
}
//顯示醫生資料, 回傳顯示資料筆數
int showDoctors(struct DOCTOR doctors[])
{
int count;
printf("醫生編號\t醫生名字\n");
for (count=1; count<=DOCTORS_NUM && doctors[count].id!=-1 ; count++)
{
printf("%d\t%s\n", doctors[count].id, doctors[count].name);
}
return count-1;
}
9.副程式savePatients(),saveReports():
功能: 儲存病人資料與儲存掛號資料。
流程圖:
程式碼:
//儲存病人資料, 回傳儲存資料筆數
int savePatients(struct PATIENT patients[], FILE * fp)
{
int count;
for (count=1; count<=PATIENTS_NUM && patients[count].id!=-1 ; count++)
{
fprintf(fp, "%d\t%s\n", patients[count].id, patients[count].name);
}
return count-1;
}
//儲存掛號資料, 回傳儲存資料筆數
int saveReports(struct REPORT reports[], FILE * fp)
{
int count;
for (count=1; count<=REPORTS_NUM && reports[count].id!=-1 ; count++)
{
fprintf(fp, "%d\t%d\t%s\t%d\t%s\t%d\t%s\t%d\t%s\t%
展开阅读全文