You are on page 1of 13

1.

有下列函數 func1
A[i],A[0]
11 void func1 (void) { 互換
12 int Fvalue, i;
13 for (i=1; i < 6; i++)
14 if (A[i] > A[0]) { 某程序將陣列 A 初始化如下,
15 Fvalue = A[0]; 接著執行 func1 。
16 A[0] = A[i];
17 A[i] = Fvalue; A[0] A[1] A[2] A[3] A[4] A[5]
18 } 4 2 12 7 19 2
19 }

(i) 當 i=1 ,完成在行號 14 至 18 A[0] A[1] A[2] A[3] A[4] A[5]


(a)
內 if 語句後,陣列 A 的內容是什麼 4 2 12 7 19 2
?
(ii) 當 i=2 ,完成在行號 14 至 18 A[0] A[1] A[2] A[3] A[4] A[5]
內 if 語句後,陣列 A 的內容是什麼
? 12 2 4 7 19 2

(iii) 當 func1 完成後,陣列 A A[0] A[1] A[2] A[3] A[4] A[5]


的內容是什麼 ? 19 2 4 7 12 2
CIT 2005 1
A[0] A[1] A[2] A[3] A[4] A[5]
4 2 12 7 19 2
(b) 在行號 15 、 16 和 17 三句賦值語句的功能是什
麼?
15 Fvalue = A[0]; 將 A[0]( 首個元素 )
16 A[0] = A[i]; 與 A[i]( 索引 i 的元素 ) 對換
17 A[i] = Fvalue;
2
(c) 究竟執行了在行號 15 的語句多少次 ?
if (A[i] > A[0]) 11 void func1 (void) {
互換 (A[i],A[0]) 12 int Fvalue, i;
(d)(i) func1 的功能是什麼 ? 13 for (i=1; i < 6; i++)
14 if (A[i] > A[0]) {
15 Fvalue = A[0];
找出整數列中的最大值
16 A[0] = A[i];
將它置於 A[0] 。 17 A[i] = Fvalue;
(ii) 試舉出 func1 的一個應用例子 18 }
。 19 }
找出考試最高分
排序
CIT 2005 2
2. 小明欲編寫一「選取英文字」程序,將一個文字檔內的英文字選取出來,
並存貯於陣列 wordarray 內,再次出現的英文字不用存貯。
下列例子展示所用的文字檔及相應的結果。

文字檔 wordarray[]
NO PAIN 選取英文字 0 NO
NO GAIN 1 PAIN
2 GAIN

重複

CIT 2005 3
函數的首一行 描述
void extract 從文字檔選取一個英文字,貯存於 inpword 內,
(char inpword[]) 若再沒有英文字可選,貯存空字符串於 inpword 內。
int searchword 在 wordarray 內搜尋 inpword 。
(char inpword[]) 送回一布爾值 (0,1) ,說明這次搜尋是否成功。
void insertentry 把 inpword 的內容
(char inpword[]) 加入為 wordarray 的一個元素。
int printarray (void) 列印陣列。

(a) 試利用這些函數, main(){ strlen(eword)>0


為小明完成主程序。 char eword[];
int found;
extract (eword);
eword[0] != '\0'
while(_________________){
found=searchword(eword);
_____________________
文字檔 wordarray if (!(found))
[] insertentry (eword)
__________________
NO PAIN 選取 0 NO ; (eword);
extract
____________
NO GAIN 英文 1 PAIN }
字 2 GAIN
printarray();
CIT 2005 } 4
(b) 假設在該文字檔內有不多於 30 個不同的英文字,
並將陣列 wordarray[] 定義為全程變量如下 : p wordarray[p]
FILE *fp; 0 NO
char wordarray[30][30]; 1 PAIN
int p=0; 2 GAIN
完成下列 searchword() 。 PAIN

#include<string.h>
int searchword (char inword[]){ // 搜尋文字
int i;

for (i=0;i<p;i++)
if ( strcmp(inpword,wordarray[i]==0 )
return 1;
return 0;
}

PAIN
void insertEntry(char s[]){
strcpy(wordArray[p++], s);
}
CIT 2005 5
// extract 抽出文字 one word at a time from text file
void extract(char s[]){
char c;
int i=0;
c=fgetc(fp); // 讀入 1 字符

while(!feof(fp) && c!=' ' && c!='\t' && c!='\n'){


s[i++]=c;
c=fgetc(fp); // 讀入 1 字符
}
s[i]='\0';
}

void printArray(){
int i;
for (i=0; i<p; i++)
printf("%02d: %s\n", i, wordArray[i]);
}

CIT 2005 6
3. 潤年 (leap year) 是一年份,可被 4 整除,
但不包括可被 100 整除而不能被 400 整除的年份。
例如, 2000 便是潤年,而 1800 和 1900 並不是閏年。

1 yy % 400 == 0
2 yy % 4 ==0 && yy % 100 !=0

小強須完成一份電腦功課,
計算 1800 後的一段時期內有多少閏年,首尾兩年包括在內。
他編寫了一函數 countLeap ,其變元 fy 和 ly ,
分別為一段時期的開始 (first year) 和結尾 (last year) 。
下列為 countLeap 的三個樣本輸出

函數 輸出
countLeap(2001,2003) 2001–2003 閏年 =0
countLeap(1997,2000) 1997–2000 閏年 =1
countLeap(1900,1910) 1900–1910 閏年 =2

CIT 2005 7
1800 2001,2003
11 void countLeap (int fy, int ly){ // first, last year
13 int i, counter;
14
15 counter = 0;

16 for (i = ly; i>=1800; i--){ // 1800  fy  ly


18 if (i%4==0) year
19 counter ++;
20 if (i%100==0 && i%400!=0) 400 count++
21 counter --; 1000
22 } 2012 count++
23 for (i = fy-1; i>=1800; i--){// 1800  fy-1
25 if (i%4==0)
26 counter --;
27 if (i%100==0 && i%400!=0)
28 counter ++;
29 }
30 printf("%d–%d, 閏年 =%d\n.", fy, ly, counter);
31 }

CIT 2005 8
(a) 行號 16 至 22 的功能是什麼 ? for (i = ly ; i>=1800; i--) …

計算 1800 年至時期結尾 ( 年份 ly) 期間,共有多少個閏年

(b) 行號 23 至 29 的功能是什麼 ? for (i = fy-1; i>=1800; i--) …

計算 1800 年至時期開始 ( 年份 fy-1) 期間,共有多少個閏年

(c) 重寫行號 16 至 29 ,將兩個 for 循環合併為一個 for 循環



for (i=fy; i<=ly; i++) …

(d) 重寫行號 18 至 21 ,將兩句 if 語句合併為一句 if 語句。


if ( (i%400==0) || (i%4==0 && i%100!=0) ) counter++;

(e) 除了 C 和 Pascal 外,試建議一種程序編寫語言,


可讓小強完成功課,並簡略說明這種語言的一項特色。
Java ( 物件導向、跨平台 ), Javascript ( 互動 ), VB (GUI), …

CIT 2005 9
4. 有兩項堆疊的操作,其描述如下 :

POP 移除堆疊頂部的一個元素。
PUSH Y 在堆疊的頂部加上 Y 。

(a) 下圖展示一個堆疊,其大小為 4 ,並存貯了兩個元素 15 和 -20



(ii) 為何未能以 (i) 的結
(i) 試寫出執行下列操作後
果 成功地執行下列操作
該堆疊的內容。
?
POP
-20 POP
PUSH 6
15 POP
POP
不能在空的堆疊上進行 POP

-20 6
15 15

CIT 2005 10
D 是一數據結構,以兩個堆疊 S1 和 S2 建立,每個堆疊的大小為 4 。 D 有下列操作 :

INSERT N 用 PUSH 把 N 加入 S1 。
EXTRACT 1. 若 S2 是空的 empty ,則
當 S1 仍然不是空的,
POP S1 ,並用 PUSH 把得出來的元素加入 S2
2.POP S2

連續執行兩項 EXTRACT 操作。


執行每項操作後,寫出 S1 和 S2 的內容。
(b) 假設 S1 和 S2 的內容如 1. 執行第一項 EX 2. 執行第二項 EX
下: TRACT 操作後 TRACT 操作後
S1 S2 S1 S2 S1 S2

3 3 3 14
-20 -20 -20 -20
14 7 14 7 14 3
CIT 2005 11
(c) 假設 S1 和 S2 最初是空的。
(i) 執行下列四項 INSERT 操作後,寫出 S1 和 S2 的內容。

INSERT 3 S1 S2 S1 S2
INSERT 4
INSERT 10 17
INSERT 17 10
4
3

(ii) 以 (c)(i) 的結果執行下列三項 EXTRACT 操作


後,寫出 Sl 和 S2 的內容。

EXTRACT S1 S2 S1 S2
EXTRACT 17 3
EXTRACT
10 4
4 10
3 17

CIT 2005 12
(iii) 從 (c)(i) 和 (c)(ii) 的結果可知,數據結構 D 的輸入序列是 3 、 4 、 10 、 17 。
在 D 內將被移除的元素的序列是什麼 ? 3 、 4 、 10 、 17

(iv) 試舉出一個擁有與 D 相似的特質,及常見的數據結構。 隊列 queue

(d) D 包含兩個堆疊,每個堆疊的大小為 4 。
通過 INSERT 和 EXTRACT 的操作, D 最多可存貯多少個元素呢 ? 7

S1 S2 INSERT 1
8 1 INSERT 2
INSERT 3
7 2 INSERT 4
6 3 EXTRACT (… POP S2 )
5 4 INSERT 5
INSERT 6
INSERT 7
INSERT 8

CIT 2005 13

You might also like