170 likes | 242 Views
Explore optimal data structures & algorithms for manipulating number sequences efficiently. Enhance code for summing & rearranging values with reduced operations.
E N D
1 3 5 7 9 head 本試卷全部試題均須回答。 作答各題時,考生不得加入新的變量,否則不獲給分。 2堆疊 1.(a) 現欲儲存一數字序列。 在(1)隊列、(2)堆疊、及(3)鏈表當中, 選出最合適的數據結構。以完成下列任務。 (i) 移除序列中最後一個數字:(____) (ii) 在序列中間插入一個數字:(____) (iii) 以相反次序列印數字序列:(____) (3分) 2 3 2 1隊列 3鏈表 nil
1.(b) 假設已有一組數字儲存於 S 內,而 X、Y 和 N 是變量。參考以下算法。 POP (X) 當 S 不是空時, POP (Y) N X + Y PUSH (N) POP (X) PUSH (X) X=9 (i) 上述算法有什麼目的? Y=5 找出這些數字的總和。 以其總和取替所有數字。 X= 14 Y= 14 14 (ii) 以不使用 N 和用上更少的 PUSH 及 POP 操作為原則, 改寫上述算法,以改善其效率。 POP (X) 當 S 不是空時, POP (Y) X X + Y PUSH (X) CIT 2010 2
設 N >= 2,參考下列算法,而 N、I 和 X 是變量。 PUSH (N) I 2 當 I < N , POP (X) 若 X 可被 I 整除, PUSH (I) PUSH (X / I) 否則 若 X > 1, PUSH (X) I I + 1 否則 I N 5 (c) (i) 假設 S 的初始內容是空的。 試就下列每個情況, 寫出空運行上述算法後 S 的最終內容。 2 5 X%I==0 5 3 5 I=3,4,5
設 N >= 2,參考下列算法,而 N、I 和 X 是變量。 X%I==0 PUSH (N) I 2 當 I < N , POP (X) 若 X 可被 I 整除, PUSH (I) PUSH (X / I) 否則 若 X > 1, PUSH (X) I I + 1 否則 I N 72 (c) (i) 假設 S 的初始內容是空的。 試就下列每個情況, 寫出空運行上述算法後 S 的最終內容。 2 72 36 18 9 2 36 18 9 9 18 2 9 36 2 3 72 2 (ii) s 的最終內容與 N 有什麼關係? 7分 S 是 N的質因數 N 是 S所有數值的連乘積
#include <stdio.h> int score[6], rank[6]; main(){ } 2. 某收費電視台提供五個頻道供顧客訂購。 其資訊科技部門將編寫一個程式, 以便處理顧客給予各頻道的評級。 所有評級均不可相同。 假設 score 及 rank 為全程整數陣列。 void SubA(void){ int i; printf ("There are 5 channels." "Please enter scores for them.\n"); for (i=1; i<=5; i++){ printf ("Channel %d:", i); scanf ("%d", &score[i]); } } 輸入5個數字 不會重覆 (a)為確保 SubA 內輸入的數字不會重覆,在子程式 SubB 採用下列算法。 當於 SubA 內輸人的五個數字出現重覆,SubA 便會不斷地在 SubB 內運行。
開始 執行 SubA 5 個輸入數字 沒有重覆? 否 是 結束 (a)為確保 SubA 內輸入的數字不會重覆,在子程式 SubB 採用下列算法。 當於 SubA 內輸人的五個數字出現重覆,SubA 便會不斷地在 SubB 內運行。 試完成下列SubB void SubB(void){ int unique, i, j; // 獨一無二 } do{ SubA(); unique = 1; if (score[i]==score[j]) unique = 0; }while( ); for (i=1; i<=4; i++) for (j=i+1; j<=5; j++) 每個數字 跟後數比較 ! unique score[i] i=1 j=2..5
已輸入分數 (score) (b) SubB 已被執行, 而顧客的評級已儲存於score內。 假設以下的子程式SubC 會以下列score和rank的 初始內容運行。 排名次 (rank) void SubC(void){ int i, j, temp; for(i=1; i<=4; i++) for(j=1; j<=5-i; j++) if (score[j] < score[j+1]){ } } // Bubble-Sort 由大至小排列? 由小至大排列? temp = score[j+1]; score[j+1] = score[j]; score[j] = temp; temp = rank[j+1]; rank[j+1] = rank[j]; rank[j] = temp;
j=1,2,3,4 (i)試於外循環的第一輪運作之後, 亦即僅在 i=2之前, 寫出score 和 rank 的內容。 for(i=1; i<=4; i++) for(j=1; j<=5-i; j++) if(score[j]<score[j+1]) (ii)試寫出 score 和 rank 的最終內容。 (iii) rank 的索引代表 score 內容的序列,rank 的內容又代表什麼? 8分 頻道號數 / score 最初的索引 輸入先後次序
TEU=貨櫃 = P = 2Q = 4R 3. 一個 TEU是貨櫃的容量單位。 家強於船務公司工作, 他需要處理三類貨物,如下所示 N和st是兩個全程變量。 家強編寫以下子程式 InputCargo 來找出貨物數量 N 及運送貨物的次序 st。 int N; char ch, st[50]; (a) (i) InputCargo內的 N 應該於運用前被初始化。 試寫出其初始化的語句及相關行號。 輸入:PRQRPXRQ scanf("%c", &ch); while (ch!='X') { st[N] = ch; N++; scanf("%c", &ch); } N = 0; 135N = 0;
輸入:P R Q R P X R Q scanf("%c", &ch); N=0; while (ch!='X') { st[N] = ch; N++; scanf("%c", &ch); } 3a(ii)假設 InputCargo 已恰當地 處理(a)(i)的初始化, 當執行InputCargo 時, 家強想依下列次序輸入貨物: P,R,Q,R,P,X,R,Q。 這樣 N 的最終內容 和 st 首N項的最終內容是什麼? 5 (1) N = (2) st = P R Q R P (4分) TEU=貨櫃 = P = 2Q = 4R 以下例子展示出某一天首五個貨櫃內貨物的次序。 一個TEU ¼,¼,½, 1, 1, ¼,½,¼, ¼,¼,½, 1, ½,¼,¼, (b)考慮下列貨物的次序 根據上述貨物的次序, 在第四個貨櫃內, 貨物的次序是什麼? 2分 R Q R
TEU=貨櫃 = P = 2Q = 4R st 假設 N 和 st分別儲存了某一天的 貨物總數量及貨櫃內貨物的次序。 家強編寫子程式 BCheck 去檢查是否所有貨櫃都完全裝滿, 最後一個貨櫃除外。例如, int BCheck(void){ const int capacity=4; // 容量=4R int k, i, flag; // ok=0 k = capacity; flag = 0; for (i=0; i<N; i++){ // N=5 } return flag; } (c) (i) X和Y的內容 是什麼? switch (st[i]){ case 'P' :; break; case 'Q' :; break; case 'R' :k--; break; } if (k==0) k = capacity; if (k<0) flag = 1; 4 k-=X 2 k-=Y
3(c) (i) 方格 X 和方格 Y 的內容是什麼? (ii) 舉出兩個支持使用常數 capacity 的原因。 X:4 (capacity) Y:2 (capacity/2) 此數值會在函數內不變。/ 只需改變此常數的數字一次,便可修改所有有關的數值 (容易修改)/ 它是一個有意思的數值(易讀)。 (iii) BCheck 的返回值(return flag)代表什麼? 6分 若返回值是1/TRUE, 表示貨櫃未完全裝滿 int BCheck(void){ const int capacity=4; // 容量=4R int k, i, flag; // ok=0 k = capacity; flag = 0; for (i=0; i<N; i++){ // N=5 } return flag; }
3(d) 假設貨物 P、Q 和 R的數量已分別儲存於全程變量 NP、NQ和NR內。 試為家強完成下列子程式 FindNC,以傳回所要求貨櫃數量的最小值。 e.g. NP=4 NQ=3 NR=5 NC=4+1+1 1 2 可以混合 NQ%2>0 NR%4>0
4. 小明打算編寫一個程式,將儲存在檔案內的一句子, 以英文字為單位,以相反次序調換。例如, 原本的句子:IT IS SIMPLE 調換後的句子:SIMPLE IS IT int N; char st1[100], st2[100]; 假設該句子只包含英文字母及空格,而每個英文字後均有一個空格。在程式中,N是全程整數變量,而st1和st2 均是全程字符陣列。小明編寫子程式 init 來讀取一個檔案內的句子。 (a)試指出 init 內的三個問題,並作出相應的更正。 6分 fopen ("f.txt", "r"); != fclose(fp);
N=12 (b)小明亦編寫了另一子程式conv1來處理 st1。假設執行 init 後,st1 儲存了以下句子。 void conv1 (int a, int b){ int i; for (i=a; i<=b; i++) st2[a+b-i] = st1[i]; } 1 N st2[12] =st1[1]; 如果執行 conv1 (1,N), st2會儲存了什麼內容? ELPMIS SI TI Reverse 反轉一句 st1 st2
(c) 小明亦編寫了另一附有 conv1 的子程式 conv2,用來處理st1。 假設執行 init 後,st1 儲存了以下句子。 N=12 j=1 i=3 void conv2 (void){ int i, j; j = 1; for(i=1; i<=N; i++) } (i)如果執行 conv2 , st2 會儲存了什麼內容? TI SI ELPMIS if (st1[i]==' '){ conv1(j,i-1); st2[i] = ' '; j=i+1; } (ii)若果 st1 內有兩個連續的空格字符, 這樣會不會有問題呢?試簡略說明。 4分 沒有問題。 此程式能處理額外的空格字符, conv1(j,i-1)不會對第一個空格字符 往後的空格作任何修定 反轉 1個字 conv1(1,2) conv1(4,5) conv1(7,12)
(d) conv1 和 conv2 都不能將 st1內的句子,以英文字為單位,以相反次序調換。例如, 原本的句子:IT IS SIMPLE 調換後的句子:SIMPLE IS IT strncpy(st1,st2,N); 小明已編寫了一個子程式MyCopy(st2, st1, 1 , N), 可將st2 內首N 個字符複製到st1 的對應位置。 試運用 conv1、conv2 和 MyCopy, 編寫一個子程式 conv3, 幫助小明完成上述調換。 4分 conv1: 反轉一句st1 st2 ELPMIS SI TI conv2: 反轉一字st1 st2 TI SI ELPMIS void conv3(void){ } conv2(); MyCopy(st2,st1,1,N); conv1(1,N); conv1(1,N); MyCopy(st2,st1,1,N); conv2();