1 / 13

1. 小麗是某 主題公園 的經理, 她希望分析 N 日內 每天 遊客數目 ( 以 1000 作單位 ) ,並將數據儲存在 陣列 NA 中。

1. 小麗是某 主題公園 的經理, 她希望分析 N 日內 每天 遊客數目 ( 以 1000 作單位 ) ,並將數據儲存在 陣列 NA 中。 她設計子程式 FindMAX 的算法,找出 NA 內的 最大值 ,如下所示。. int N=5; int FindMAX(){ m =  1 ; // max i = 1; while(i<=N){ if(NA[i]>m) swap (&m,&NA[i]); i++; } return m; }. FindMAX m   1 i  1 當 i <= N 若 NA[i] > m

lovey
Download Presentation

1. 小麗是某 主題公園 的經理, 她希望分析 N 日內 每天 遊客數目 ( 以 1000 作單位 ) ,並將數據儲存在 陣列 NA 中。

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 1. 小麗是某主題公園的經理, 她希望分析N日內每天遊客數目(以1000作單位),並將數據儲存在陣列NA中。 她設計子程式FindMAX的算法,找出NA 內的最大值,如下所示。 int N=5; int FindMAX(){ m = 1; // max i = 1; while(i<=N){ if(NA[i]>m)swap(&m,&NA[i]); i++; } return m; } FindMAX m 1 i  1 當i <= N 若NA[i] > m 則交換m 及NA[i] 的內容 i  i+1 返回 m 假設N=5 及NA 的初始內容是: 遊客數目 m = 1 (ii) 根據NA的初始內容,空運行FindMAX 兩次後,寫出NA 的內容。 (a) (i) 空運行FindMAX 一次後,寫出NA的內容及交換m及NA[i]的內容總次數。 -1 20 25 30 35 m = 25 m = 30 m = 40 m = 35

  2. 小麗編寫子程式 mySORT 的算法, 以遞降序排列NA的內容,並將結果儲存在陣列NB內。 NA[] NB[] m = FindMAX NB[j] = m m = FindMAX NB[N-j+1] = m (d) 主題公園必須每月繳交電費,小麗希望利用FindMAX,來找出過去五個月內,最大一筆的電費支出。起始時,五筆電費支出是以負整數儲存在NA內。 例如 int NA[5]={25,20,30,40,35}; m=1 (i) 空運行FindMAX一次。m 的最終數值是什麼? 哪種類別的錯誤會因FindMAX的算法而產生? 邏輯錯誤 (∵max並非1) (ii) 應如何修改FindMAX的算法,才可找出最大一筆的電費? 把 if(NA[i]>m)改為 if(NA[i]<m)

  3. 2. 志明在一所學校的保健中心工作,他編寫了一個程式,包括下列子程式的, 分析學生的體重。N 是全程(global)整數常數,而A 是全程整數陣列。 5/2 1 5 2 4 (a) (i) 在for 循環中,temp 的用途是什麼? 它在互換進程中作為暫存器。 (ii) 假設N=5 及A 的初始內容是 寫出剛執行 RV 後A 的內容。 // reverse

  4. 假設有100 名學生,即N=100。 (b) 子程式initA 將A 內每個元素賦予0值。試在下方完成initA。 for (i=1;i<=N;i++) A[i]=0; 子程式ADDW 將一個整數儲存在A 內。 // insert w into A[] (由大至小) // 找尋插入點 // 向右移 shift right // 插入insert w into A[]

  5. (c) 順序執行以下子程式: initA(); ADDW(36); ADDW(30); ADDW(40); // {36,0,0,0} // {36,30,0,0} // {40,36,30,0} A 的內容是什麼? 填寫以下A 的首尾各四個元素的內容。 (d) 假設有另一個包含元素B[1]至B[100]的全程整數陣列B,儲存了學生的體重。 志明希望編寫子程式ASORT,將B內的數值以遞升序排列,並儲存在A內。 試利用RV、initA及ADDW,為志明完成以下的ASORT。 B[i]A[i] initA(); for (i=1; i<=100; i++) ADDW(B[i]); RV(); // A[]={0,0,0,0,…} // 插入insert B[i] into A[] // 反序reverse A[]

  6. 3. 李先生建立一個鏈表來表示社交網絡的群組成員。此鏈表儲存在下列表格中。 假設鏈表(linked list)以PETER 開始。 (a) 追蹤「下一ID的指示標」(NEXT ID pointer),並填上以下鏈表中的下兩個節點。 (head)首標 PETER MARY GIGI JANE …

  7. (b) 試為以下操作填寫「下一ID的指示標」的內容。 (i) JANE 已經不再屬於此社交網絡,將它從鏈表中刪除。 03 01 04 (ii) AMY 加入群組中,其ID=03,並置於鏈表中PETER及MARY之間。 i.e. 首標PETERAMYMARY (c) 李先生認為,一個人可在此社交網絡,加入多於一個群組。 現有的鏈表,能否實現這樣安排嗎? 試簡略說明。 否。每一項只有一個連結,代表一個關係

  8. (d) 李先生使用堆疊stack,在下列表格入群組成員。 他重覆地從以下的堆疊中輸出元素, 並透過建構「下一ID的指示標」,將元素順序地附加在鏈表Linked list中。 [順序:按堆疊內POP次序,並非以姓名排序] (ii) 假設鏈表的最後一個指示標儲存1。 填寫以上表格內「下一ID的指示標」的內容 堆疊頂部top (i) 鏈表中的首標head指向哪一ID? 02 (e)李先生依照以下算法建構(d)的鏈表 (ii) 試相應地重寫一句語句, 以改善這個算法 設 i 由1至4 從堆疊中輸出元素 (POP) 將這個元素附加在鏈表中 當(while)堆疊不是空的, 從堆疊中輸出元素 (POP) 將這個元素附加在鏈表中 (i) 這個算法的潛在問題是什麼? 堆疊內只可儲存四個元素 for(i=1;i<=4;i++)…

  9. 4. 志偉設計個電腦程式,處理某中學120名中三學生的(選科)科目組別的意願。 有120行展示學生意願的數據(下列表格內灰色部分),儲存在數據檔df.txt內, 每行數據必須包含1、2 和 3 P[1][2] data file df.txt內容 3 1 2 1 3 2 ... 2 1 3 P[2][3] 志偉編寫下列子程式sub1,讀取df.txt內學生的意願 P 是二維的全程整數陣列,儲存科目組別的意願。SN是全程整數變量

  10. fscanf (inf, "%d%d%d", &P[SN+1][1], &P[SN+1][2], &P[SN+1][3]);

  11. (a)假設全部120名學生的意願,均正確無誤地儲存在P[][]內。(a)假設全部120名學生的意願,均正確無誤地儲存在P[][]內。 志偉在下列子程式sub2中,採用了三個全程整數變量 N1、N2、N3 void sub2(void){ int i; N1 = N2 = N3 = 0; for(i=1; i<=120; i++){ if(P[i][1]==1) N1++; if(P[i][2]==1) N2++; if(P[i][3]==1) N3++; } } (i) 若P[i][1]儲存了1。 這代表什麼? 第i個學生選擇A為第一意願。 選擇A 選擇B 選擇C (ii) N3的最終值代表什麼? 選擇C為第一意願 的學生總人數。 (iii) 志偉編寫子程式sub3, 根據sub2 所計算的N1、N2及N3, 顯示最受歡迎的科目組別, 試為志偉完成以下的sub3 void sub3(void){ if(________&&________) printf("A"); else if(________&&________) printf("B"); else printf("C"); } N1>=N2 && N1>=N3 N2>=N1 && N2>=N3 (iv) sub3 曾因某些N1, N2, N3 的值而產生不完整的結果。試描述這個問題 同分/雙冠軍, sub3的只能顯示其中一個。

  12. (b) 科目組別的數量每年均有所變更,例如在來年提供多於三項科目組別。 試描述兩項應為sub2 作出的修訂,讓學校可靈活地處理學生的意願。 1.以常數變量儲存科目組別的總數。 #define MAX 10 2.使用陣列代替N1、N2和N3。 int count[MAX]={0}; 3.利用循環語句代替for 循環內三句語句 if(P[i][1]==1)…。 for(i=0;i<120;i++) for(j=0;j<MAX;j++) if(P[i][j]==1) count[j]++; (c) 假設儲存在df.txt 內的所有數據均是1、2和3。 試描述數據中一個可能的錯誤。 相同數字 1 1 1 轉錄錯誤 SN=0; while (SN<120){ fscanf… SN++; } (d) 假設儲存在df.txt 內的數據總行數是未知的。 (i) 執行子程式sub1 將出現運行run-time錯誤, 這個錯誤將如何發生? 如果只有少於120 筆記錄, 子程式會繼續讀取數據檔案, 並產生錯誤。

  13. (ii) 修改行號80 的語句以解決(d)(i) 的問題。 && !feof(inf) (iii) 若以dowhile 作比較,在行號80上使用while循環(較dowhile)為佳。 為什麼? 若數據庫是空的,這種做法並不適當。

More Related