130 likes | 236 Vues
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
E N D
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
小麗編寫子程式 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)
2. 志明在一所學校的保健中心工作,他編寫了一個程式,包括下列子程式的, 分析學生的體重。N 是全程(global)整數常數,而A 是全程整數陣列。 5/2 1 5 2 4 (a) (i) 在for 循環中,temp 的用途是什麼? 它在互換進程中作為暫存器。 (ii) 假設N=5 及A 的初始內容是 寫出剛執行 RV 後A 的內容。 // reverse
假設有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[]
(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[]
3. 李先生建立一個鏈表來表示社交網絡的群組成員。此鏈表儲存在下列表格中。 假設鏈表(linked list)以PETER 開始。 (a) 追蹤「下一ID的指示標」(NEXT ID pointer),並填上以下鏈表中的下兩個節點。 (head)首標 PETER MARY GIGI JANE …
(b) 試為以下操作填寫「下一ID的指示標」的內容。 (i) JANE 已經不再屬於此社交網絡,將它從鏈表中刪除。 03 01 04 (ii) AMY 加入群組中,其ID=03,並置於鏈表中PETER及MARY之間。 i.e. 首標PETERAMYMARY (c) 李先生認為,一個人可在此社交網絡,加入多於一個群組。 現有的鏈表,能否實現這樣安排嗎? 試簡略說明。 否。每一項只有一個連結,代表一個關係
(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++)…
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是全程整數變量
fscanf (inf, "%d%d%d", &P[SN+1][1], &P[SN+1][2], &P[SN+1][3]);
(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的只能顯示其中一個。
(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 筆記錄, 子程式會繼續讀取數據檔案, 並產生錯誤。
(ii) 修改行號80 的語句以解決(d)(i) 的問題。 && !feof(inf) (iii) 若以dowhile 作比較,在行號80上使用while循環(較dowhile)為佳。 為什麼? 若數據庫是空的,這種做法並不適當。