程式设计入门.docx
《程式设计入门.docx》由会员分享,可在线阅读,更多相关《程式设计入门.docx(70页珍藏版)》请在冰豆网上搜索。
程式设计入门
程式設計入門
專題報告
題目:
輻射劑量估算系統
組別:
第22組
9512814林慕涵
9613515趙祥萍
9631131賀安麗
一、系統功能,輸入及輸出資料
從事放射性相關的工作人員身上會佩帶一個配章,內部可以記錄人在工作場所所受到的輻射量。
此配章可同時紀錄「深部劑量」,表示體內器官接受之劑量;「淺部劑量」,表示體表皮膚所接受到之劑量,「水晶體劑量」,表示水晶體所接受之劑量,以及「背景值」,表示該場所輻射背景值。
為了人員的健康安全,政府針對上述三種部位的劑量分別有其年度劑量限度的規定,若在該年度內員工身上的累積輻射量值經報告分析後超過法定量,必須一段時間不能接觸放射性的工作場所,或採取必須之醫療行動。
此劑量配章在每月初發放至各單位,並在每月底送回相關劑量分析機構進行計讀及劑量估算,並檢查每位人員是否已接受超出法規劑量限度。
本程式即模擬該劑量分析機構之工作,將回收讀出之人員劑量讀值轉換為絕對劑量,並分別輸出單位人員劑量資料給各工作單位,以及檢查、列出劑量超出法規規定之人員名單給政府機關存查。
1.輸入的資料:
A當月人員劑量讀值檔(import_idreading.txt)
包含下列欄位:
◎公司代碼
◎人員代碼
◎姓名
◎深部讀值
◎淺部讀值
◎水晶體讀值
◎背景讀值
例:
含有12筆當月劑量的讀入數據檔
0019702張比利1010105
0019703蔡輸飯73290175
002001洪志紅251902710
0019710林夢蔥30400305
00301陳艾梅25100177
0019705趙小強2519065
002002楊精華254502720
00401方大同970296
002003游佩結25100177
0019701李小其0000
00302徐米鹿25100177
0019715許大戶10555
B累積劑量資料庫檔(import_database.txt)
包含下列欄位:
◎公司代碼
◎人員代碼
◎姓名
◎深部累積劑量
◎淺部累積劑量
◎水晶體累積劑量
◎紀錄是否超出劑量
例:
含有9筆累積劑量的資料庫:
0019702張比利7020030
0019703蔡輸飯7329017
0019705趙小強251906
0019710林夢蔥3040030
002001洪志紅2519027
002002楊精華2545027
002003游佩結2510017
00301陳艾梅2510017
00302徐米鹿2510017
C公司部門資料檔(import_dep_id.txt)
有四個機構,分別以001到004編號排序。
包含以下欄位:
◎公司代碼
◎公司名稱
例:
含有4筆機構資料的機構資料檔
001青樺大學
002長羹醫院
003大千醫院
004同步輻射中心
2.輸出的資料
1.儲存新的人員累積劑量資料庫
2.各單位人員累積劑量名單,並以星號(*)註記各人員超出劑量限度的項目
3.呈報政府機關劑量超出法規的所有人員名單
二、應用層面說明
本程式應用結構陣列資料搜尋/處理以及各式排序法、字串處理以及各式迴圈判斷,這樣的系統除了用在人員輻射劑量佩章管理之外,也可應用財經報表、客戶名單管理、圖書資料管理…等等,甚至是研究、實驗數據資料處理亦可應用結構陣列整合參數、實驗敘述以及所得之數據結果。
三、全域常數及資料結構說明
程式最上方定義了全域常數
A.最大陣列限制:
MAX_ARRAY_SIZE500
B.不同部位之輻射轉換、法規定義之劑量限度設定為全域常數。
如下:
名稱
深部
淺部
水晶體
輻射轉換因子(ex.cf_deep)
1.5
2
1
法規標準(ex.Criteria_deep)
50
500
150
在程式當中,我們建構並使用了三種資料結構
A.人員當月劑量讀值資料結構(person),用來儲存個人員的資料,包含下列欄位:
◎公司代碼(intdepid)
◎人員代碼(intpid)
◎姓名(charname[20])(最多20字元)
◎深部讀值(floatrdeep)
◎淺部讀值(floatrshallow)
◎水晶體讀值(floatreye)
◎背景讀值(floatbg)
圖示概念如下:
人員當月劑量讀值(person)
欄位意義
欄位名稱
公司代碼
intdepid
人員代碼
intpid
姓名
charname[20]
深部讀值
floatrdeep
淺部讀值
floatrshallow
水晶體讀值
floatreye
背景讀值
floatbg
B.累積劑量資料庫結構(database),用來儲存人員之前的各項資料紀錄,包含下列欄位:
◎公司代碼(intdepid)
◎人員代碼(intpid)
◎姓名(charname[20])
◎深部累積劑量(floatyrdeep)
◎淺部累積劑量(floatyrshallow)
◎水晶體累積劑量(floatyreye)
◎紀錄是否超出劑量(intreference)
圖示概念如下:
累積劑量資料庫(database)
欄位意義
欄位名稱
公司代碼
intdepid
人員代碼
intpid
姓名
charname[20]
深部累積劑量
floatyrdeep
淺部累積劑量
floatyrshallow
水晶體累積劑量
floatyreye
用來紀錄是否超出劑量
intreference
C.公司部門資料結構(department),儲存公司名稱及編號,包含下列欄位:
◎公司代碼(intdepid)
◎公司名稱(chardepname[20])
圖示概念如下:
公司部門資料結構(department)
欄位意義
欄位名稱
公司代碼
intdepid
公司名稱
chardepname[20]
再以三個一维陣列personpdata[num_person]、databaseydata[num_database]及departmentddata[num_depart],分別儲存所有資料。
每一筆personpdata[i](0
num_person、num_database及num_depart分別指出最多有幾個人員的資料、最多有幾筆累積資料、以及最多有幾間公司部門。
圖示概念如下:
儲存所有人員當月劑量讀值的一维陣列(personpdata[num_person])
陣列索引
公司代碼
人員代碼
姓名
深部讀值
淺部讀值
水晶體讀值
背景讀值
[1]
第一所公司的代碼
第一所公司第一位人員代碼
第一所公司第一位人員姓名
第一所公司第一位人員深部讀值
第一所公司第一位人員淺部讀值
第一所公司第一位人員水晶體讀值
第一所公司第一位人員背景讀值
[2]
第一所公司的代碼
第一所公司第二位人員代碼
第一所公司第二位人員姓名
第一所公司第二位人員深部讀值
第一所公司第二位人員淺部讀值
第一所公司第二位人員水晶體讀值
第一所公司第二位人員背景讀值
[3]
第二所公司的代碼
第二所公司第一位人員代碼
第二所公司第一位人員姓名
第二所公司第一位人員深部讀值
第二所公司第一位人員淺部讀值
第二所公司第一位人員水晶體讀值
第二所公司第一位人員背景讀值
…
…
…
…
…
…
…
…
儲存所有人員累積劑量資料庫的一维陣列(databaseddata[num_database])
陣列索引
公司代碼
人員代碼
姓名
深部累積劑量
淺部累積劑量
水晶體累積劑量
紀錄是否超出劑量
[1]
第一所公司的代碼
第一所公司第一位人員代碼
第一所公司第一位人員姓名
第一所公司第一位人員累積深部劑量
第一所公司第一位人員累積淺部劑量
第一所公司第一位人員累積水晶體劑量
[2]
第一所公司的代碼
第一所公司第二位人員代碼
第一所公司第二位人員姓名
第一所公司第二位人員累積深部劑量
第一所公司第二位人員累積淺部劑量
第一所公司第二位人員累積水晶體劑量
[3]
第二所公司的代碼
第二所公司第一位人員代碼
第二所公司第一位人員姓名
第二所公司第一位人員累積深部劑量
第二所公司第一位人員累積淺部劑量
第二所公司第一位人員累積水晶體劑量
…
…
…
…
…
…
…
例:
假設一開始人員當月劑量讀值陣列儲存的內容如下:
陣列索引
公司代碼
人員代碼
姓名
深部讀值
淺部讀值
水晶體讀值
背景讀值
[1]
001
9702
張比利
10
10
10
5
[2]
001
9703
蔡輸飯
73
290
17
5
[3]
002
001
洪志紅
25
190
27
10
[4]
001
9710
林夢蔥
30
400
30
5
[5]
003
01
陳艾梅
25
100
17
7
[6]
001
9705
趙小強
25
190
6
5
[7]
002
002
楊精華
25
450
27
20
[8]
004
01
方大同
9
70
29
6
[9]
002
003
游佩結
25
100
17
7
[10]
001
9701
李小其
0
0
0
0
[11]
003
02
徐米鹿
25
100
17
7
[12]
001
9715
許大戶
10
5
5
5
一開始,人員累積劑量資料庫陣列如下:
陣列索引
公司代碼
人員代碼
姓名
深部累積劑量
淺部累積劑量
水晶體累積劑量
紀錄是否超出劑量
[1]
001
9702
張比利
70
200
30
0
[2]
001
9703
蔡輸飯
73
290
17
0
[3]
001
9705
趙小強
25
190
6
0
[4]
001
9710
林夢蔥
30
400
30
0
[5]
002
001
洪志紅
25
190
27
0
[6]
002
002
楊精華
25
450
27
0
[7]
002
003
游佩結
25
100
17
0
[8]
003
01
陳艾梅
25
100
17
0
[9]
003
02
徐米鹿
25
100
17
0
假設經過程式執行後,新的資料庫內容如下所示:
陣列索引
公司代碼
人員代碼
姓名
深部累積劑量
淺部累積劑量
水晶體累積劑量
紀錄是否超出劑量
[11]
001
9701
李小其
0
0
0
0
[1]
001
9702
張比利
77.5
210
35
3
[2]
001
9703
蔡輸飯
175
860
29
4
[3]
001
9705
趙小強
55
560
7
5
[4]
001
9710
林夢蔥
67.5
1190
55
7
[12]
001
9715
許大戶
7.5
0
0
0
[5]
002
001
洪志紅
47.5
550
44
8
[6]
002
002
楊精華
32.5
1310
34
9
[7]
002
003
游佩結
52
286
27
10
[8]
003
01
陳艾梅
52
286
27
11
[9]
003
02
徐米鹿
52
286
27
0
[10]
004
01
方大同
4.5
128
23
0
上圖中有陰影的位置表示曾於程式執行過程中修改過。
詳細說明請參閱執行範例。
四、程式說明
1.主程式main()
◎說明:
根據所讀取的當月劑量與累計劑量加總後運算出數值,並檢查是否超過法定標準,印出劑量超出法規的所有人員名單,以及以各機構為單位的人員所有讀值,若超過標準則在旁另有標註。
◎輸入參數:
無
◎回傳值:
無
◎流程圖:
(見下頁)
◎程式碼:
main()
{
/*人員劑量參數*/
FILE*person_data_fp;
structpersonpdata[MAX_ARRAY_SIZE];
intnum_person;
/*累積劑量資料庫參數*/
FILE*database_data_fp;
structdatabaseydata[MAX_ARRAY_SIZE];
intnum_database;
/*公司部門參數*/
FILE*depart_data_fp;
structdepartmentddata[MAX_ARRAY_SIZE];
intnum_depart;
/*串連超出劑量名單之參數*/
intheadindex;
/*輸出檔案相關參數*/
FILE*database_data2_fp;/*database*/
database_data2_fp=fopen(OUTPUT_NEWDATABASE_FILENAME,"a");
FILE*to_department_fp;/*各公司部門的記錄檔*/
to_department_fp=fopen(OUTPUT_DEP_FILENAME,"a");
FILE*to_government_fp;/*超出劑量記錄檔*/
to_government_fp=fopen(OUTPUT_GOV_FILENAME,"a");
/*檢查檔案是否存在*/
if(!
(person_data_fp=fopen(PERSON_READING_FILENAME,"r")))
{
printf("personaldosefileisnotexist\n");
}
if(!
(database_data_fp=fopen(PERSON_DOSE_DATABASE_FILENAME,"r")))
{
printf("databasefileisnotexist\n");
}
if(!
(depart_data_fp=fopen(DEPARTMENT_FILENAME,"r")))
{
printf("company/departmentfileisnotexist\n");
}
/*將人員劑量讀值由檔案讀入矩陣*/
num_person=read_person(pdata,person_data_fp);/*人員劑量讀值*/
fclose(person_data_fp);
num_database=read_database(ydata,database_data_fp);/*累積劑量資料庫*/
fclose(database_data_fp);
num_depart=read_department(ddata,depart_data_fp);/*公司部門*/
fclose(depart_data_fp);
/*轉換劑量*/
dose_convert(pdata,num_person);
/*將本月劑量累積加入資料庫併且將新加入的人員插入資料庫*/
num_database=cumulate_dose(pdata,ydata,num_person,num_database);
/*利用氣泡排序法將各公司人員依照編號排序*/
sort_personid(ydata,ddata,num_depart,num_database);
/*串連超出劑量限度的名單*/
headindex=link_overdose(ydata,num_database);
/*將新的資料庫存起來*/
write_database(ydata,num_database,database_data2_fp);
/*顯示並儲存各公司部門人員之劑量*/
display_write_department(ydata,ddata,num_depart,num_database,to_department_fp);
/*顯示並儲存劑量超出法規之人員名單*/
display_write_gov(ydata,ddata,num_depart,headindex,to_government_fp);
getch();
}
2.副程式
2.1read_person()
◎說明:
讀取檔案內容
◎輸入參數:
人員當月劑量結構矩陣
◎回傳值:
該矩陣資料筆數至主程式
◎流程圖:
◎程式碼:
intread_person(structpersonptemp[MAX_ARRAY_SIZE],FILE*fp)
{
inti;
i=0;
/*資料比數筆數,第i筆,是否小於MAX_ARRAY_SIZE規定*/
while(i{
/*若是,則將檔案讀入ptemp資料結構陣列中*/
fscanf(fp,"%d%d%s%f%f%f%f",&ptemp[i+1].depid,&ptemp[i+1].pid,
&ptemp[i+1].name,&ptemp[i+1].rdeep,&ptemp[i+1].rshallow,
&ptemp[i+1].reye,&ptemp[i+1].bg);
if(!
feof(fp))/*是否讀到檔案最末端*/
{
i++;/*若非最末端則i加1繼續讀取下一筆*/
}
else
{
returni;/*若為最末端則將i回傳至主程式*/
}
}
}
2.2read_database()
◎說明:
讀取檔案後,將資料讀入人員累積劑量資料庫
◎輸入參數:
人員累積劑量結構矩陣
◎回傳值:
該矩陣資料筆數至主程式
◎流程圖:
與2.1read_person()同一模式。
◎程式碼:
intread_database(structdatabaseytemp[MAX_ARRAY_SIZE],FILE*fp)
{
inti;
i=0;
while(i{
fscanf(fp,"%d%d%s%f%f%f",&ytemp[i+1].depid,&ytemp[i+1].pid,
&ytemp[i+1].name,&ytemp[i+1].yrdeep,&ytemp[i+1].yrshallow,
&ytemp[i+1].yreye);
if(!
feof(fp))
{
i++;
}
else
{
returni;
}
}
}
2.3read_department()
◎說明:
將資料讀入部門資料結構陣列
◎輸入參數:
公司部門結構矩陣
◎回傳值:
該矩陣資料筆數至主程式
◎流程圖:
與2.1read_person()同一模式。
◎程式碼:
intread_department(structdepartmentdtemp[MAX_ARRAY_SIZE],FILE*fp)
{
inti;
i=0;
while(i{
fscanf(fp,"%d%s",&dtemp[i+1].depid,&dtemp[i+1].depname);
if(!
feof(fp))
{
i++;
}
else
{
returni;
}
}
}
2.4dose_convert()
◎說明:
將人員當月劑量讀值減去背景值並乘上劑量轉換因子,轉換為絕對劑量
◎輸入參數:
人員當月劑量讀值資料結構、人員當月劑量資料筆數
◎回傳值:
無
◎流程圖:
◎程式碼:
voiddose_convert(structpersonptemp[MAX_ARRAY_SIZE],intnum_p)
{
inti;
for(i=1;i<=num_p;i++)
{
/*依序對深部、淺部、水晶體劑量讀值做轉換*/
ptemp[i].rdeep=((ptemp[i].rdeep)-(ptemp[i].bg))*cf_deep;
ptemp[i].rshallow=((ptemp[i].rshallow)-(ptemp[i].bg))*cf_shallow;
ptemp[i].reye=((ptemp[i].reye)-(ptemp[i].bg))*cf_eye;
}
}
2.5cumulate_dose()
◎說明:
將每筆人員當月劑量資料讀出,依著人員累積劑量資料庫做比對。
呼叫check副程式,若部門編號及員工編號相符(回傳值>0),則將當月劑量加入累積劑量中,若無部門編號及員工編號相符者(回傳值=0),則將該筆資料新增至累積劑量資料庫。
每新增一筆則在計數器add中加1;呼叫副程式sort_department將新的人員累積劑量資料庫依照公司編號排序。
最後,將原有人員累積劑量資料庫筆數(num_d)加上add,回傳新的人員累積劑量資料庫筆數(num_d)
◎輸入參數:
人員當月劑量結構矩陣、人員當月劑量資料筆數、人員累積劑量結構矩陣、人員累積劑量資料筆數
◎回傳值:
人員累積劑量資料筆數
◎流程圖:
◎程式碼:
intcumulate_dose(structpersonptemp[MAX_ARRAY_SIZE],structdatabaseyt