程式设计入门.docx

上传人:b****5 文档编号:7655733 上传时间:2023-01-25 格式:DOCX 页数:70 大小:197.71KB
下载 相关 举报
程式设计入门.docx_第1页
第1页 / 共70页
程式设计入门.docx_第2页
第2页 / 共70页
程式设计入门.docx_第3页
第3页 / 共70页
程式设计入门.docx_第4页
第4页 / 共70页
程式设计入门.docx_第5页
第5页 / 共70页
点击查看更多>>
下载资源
资源描述

程式设计入门.docx

《程式设计入门.docx》由会员分享,可在线阅读,更多相关《程式设计入门.docx(70页珍藏版)》请在冰豆网上搜索。

程式设计入门.docx

程式设计入门

程式設計入門

專題報告

題目:

輻射劑量估算系統

組別:

第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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1