程式語言 申論題歷屆試題與參考架構
高考三級,民國 102~110 年共 9 份試卷、41 題,其中 39 題附參考答題架構。考這一科的類科:資訊處理。本頁列出歷年全部題目,參考架構只列開頭的「破題」,完整的答題架構、關鍵字與作答提醒請到站內查看。
110 年(考試時間 120 分鐘) 原卷 PDF
- 1
語意分析(Semantics Analysis)對於程式語言的正確執行非常重要。
(一)以下是 Java 和 C++程式,請說明程式編譯、執行結果與其原因,以及程式指令之意義或影響。(18 分)
⑴Java 程式static void test1(){ int n; int [] x = new int[n]; }
⑵Java 程式static void test2(){ int n=0; int [] x = new int[n]; }
⑶Java 程式static void test3(){ int n=0; int [] x = new int[n]; x[0]=0; }
⑷C++程式void test4(){ int n; int x[n]; }
⑸C++程式void test5(){ int n=0; int x[n]; x[0] =0; }
⑹C++程式void test6(){ int n=0; int *x = new int[n]; x[0] =0; }
(二)請說明 Java 與 C++語言在陣列宣告上的語意分析的方法,與其優缺點。(7 分)
(25 分)
參考架構・破題
本題考語意分析中「靜態檢查」與「執行期檢查」的分工:同一件事(陣列宣告與存取)在 Java 與 C++ 由不同階段、不同機制負責,作答重點是逐題判斷「編譯期錯誤」、「執行期例外」或「未定義行為」,並說明原因。
完整答題架構與關鍵字:到站內看全文
- 2
程式驗證的應用。
(一)請說明「測試驅動發展方法(Test Driven Development, TDD)」的概念及優點。(7 分)
(二)有一 MySort 類別的方法 int[] binarySort(int data[]),將陣列 data 內的資料由小到大排序後回傳,請依據 TDD 的概念設計測試案例。 (10 分)
(三)請以 Java/JUnit 語言完成以下測試程式(I)~(II)。(8 分)@Test public void testBinarySort(MySort (I) ){ int[] source = {2, 3, 5, 9, 12, 7}; int[] target = obj.binarySort(source); for(int i=0; i<source.length-1; i++){ assertTrue(target[i] < (II) ); } }
(25 分)
- 3
建構股票交易資料庫(Stock),請寫出 SQL 指令。客戶表格(Customer)客戶編號(cid) 客戶姓名(cname) 客戶帳戶餘額 客戶融資餘額[整數、主鍵] [少於 10 字元可變字串] (balance) (margin)[自動增加] [整數、非空值] [整數、非空值]證券交易表格(StockTrade)交易編號 證券編號 證券每股購入價格 證券購入股數 客戶編號(cid)(id) (sid) (price) (share) [整數、非空值] [整數、主鍵] [整數、非空值] [整數、非空值] [整數、非空值] [自動增加]
(一)造出 Customer, StockTrade 表格。(10 分)CREATE TABLE Customer ( _____________________ ); CREATE TABLE StockTrade ( _____________________ );
(二)查詢客戶姓名是"Tom"所有購買股票編號與購入總股數。(5 分)
(三)撰寫 Store Procedure,造出一個暫時的資料表 Report,含兩個整數資料欄位(證券編號 sid, 證券價格 price) ;加入 10 筆資料,再根據證券價格由小到大排序,查詢列出此 10 筆資料。(10 分)delimiter $$ CREATE PROCEDURE x() BEGIN DECLARE i INT DEFAULT 1; ____________________ END$$
(25 分)
本題含圖表或公式,請對照原卷 PDF。
- 4
程式例外處理的設計對於資訊系統的可靠性非常重要。
(一)請完成以下 C++程式(I)~(V)指令,處理兩數相除的例外狀況,使輸出為:(15 分)Exception:empty Exception:not a number Quotient:Exception:divided by zero Quotient:2.4 #include <iostream> #include <exception> #include <string.h> #define N 10 using namespace std; class EmptyException:public exception { public: virtual const char* what()const throw(){(I) ; } }; class NotNumberException:public exception { public: virtual const char* what()const throw(){ (II) ; } }; class DividedByZeroException:public exception { public: virtual const char* what()const throw(){ (III) ; } }; int valid(const char x[N]){ int result=0; if(strlen(x)==0)throw EmptyException(); for(int i=0; i<strlen(x); i++){ if(!isdigit(x[i])) throw NotNumberException(); result = (IV) ; } return result; } double quotient(int n1, int n2){ if( (V) ) throw DividedByZeroException(); return static_cast<double>(n1/n2); } void test(const char x1[N], const char x2[N]){ int n1, n2; try { n1=valid(x1); n2=valid(x2); cout<<"Quotient:"<<quotient(n1, n2); } catch(EmptyException &e){ cout<<"Exception:"<< e.what(); } catch(NotNumberException &e){ cout<<"Exception:"<< e.what(); } catch(DividedByZeroException &e){ cout<<"Exception:"<< e.what(); } cout<<endl; } int main(){ test("",""); test("a","12"); test("10","0"); test("12","5"); return 0; }
(二)請說明使用 try-catch 與 if-else,處理例外狀況的優缺點。(5 分)
(三)請說明 C++與 Java 在 try-catch 中 finally 設計的異同與其理由。(5 分)
(25 分)
參考架構・破題
本題以 C++ 例外處理為主軸:自訂例外類別繼承 exception、以 throw 丟出、以 catch 依型別接住,並比較例外機制與傳統錯誤檢查的差異。
完整答題架構與關鍵字:到站內看全文
109 年(考試時間 120 分鐘) 原卷 PDF
- 1
(一)請將下面程式改寫為尾遞迴(tail recursion)的形式。(15分)int recsum(int x){ if (x == 1) return(x); return(x + recsum(x - 1)); }
(二)請問尾遞迴形式的優點為何?(10分)
(25 分)
參考架構・破題
原函式在遞迴呼叫回來後還要做加法(x + recsum(x-1)),遞迴呼叫不是最後一個動作,所以不是尾遞迴。改寫的關鍵是加一個累加器參數,把「還沒做的加法」提前算進參數裡帶下去。
完整答題架構與關鍵字:到站內看全文
- 2
假設每個int變數占用4 bytes,每個指標變數也占用4 bytes。下面的C程式印出的結果為何?(25分)# include <stdio.h> typedef int T1[10][9]; int main(){ struct { T1 *a[10]; int (*b)[100]; } f[10][10][10]; printf("p1 = %d\n",(int)sizeof(f[1][5])); printf("p2 = %d\n",(int)sizeof(f[2][3][4].a)); printf("p3 = %d\n",(int)sizeof(f[3][2][6].b)); printf("p4 = %d\n",(int)(f - &f[5])); printf("p5 = %d\n",(int)(f[6][2] - f[3][3])); }
(25 分)
參考架構・破題
本題考 C 的 sizeof 與指標算術:陣列名稱在 sizeof 中不會退化為指標,但在減法中會退化成「指向第一個元素的指標」,相減結果以元素個數為單位。先算出結構大小,再逐一推導。
完整答題架構與關鍵字:到站內看全文
- 3
下面的C程式印出的結果為何?(作答必須解釋計算過程,只寫答案而未加解釋,只能得部分分數。)(25分)# include <stdio.h> int foo1(int p){ if (p >= 90) return(foo1(foo1(p-11))); return(p+10); } int foo2(int p){ if (p < 91) return(foo2(p+11)); return(p); } int foo(int p){ return(foo1(foo2(p))); } int main(int argc, char **argv){ int q; q = 65; printf("foo(%d)= %d.\n", q, foo(q)); q = 83; printf("foo(%d)= %d.\n", q, foo(q)); q = 95; printf("foo(%d)= %d.\n", q, foo(q)); q = 100; printf("foo(%d)= %d.\n", q, foo(q)); q = 142; printf("foo(%d)= %d.\n", q, foo(q)); return(0); }
(25 分)
參考架構・破題
foo2 把小於 91 的數每次加 11 推到 91 以上;foo1 是 McCarthy 91 函數的變形。先證明 foo1 對所有 p≥89 都回傳 99,再把每個輸入代入,五行輸出都是 99。題目要求解釋過程,推導比答案重要。
完整答題架構與關鍵字:到站內看全文
- 4
物件導向程式語言有繼承的觀念,請解釋單一繼承(single inheritance)與多重繼承(multiple inheritance)的意義、差別及實作方法。(25分)
(25 分)
參考架構・破題
繼承讓子類別重用並擴充父類別的屬性與方法。單一繼承只有一個直接父類別,結構為樹;多重繼承可有多個直接父類別,結構為有向無環圖,表達力較強但會帶來名稱衝突與菱形繼承問題。作答要涵蓋意義、差別、各語言的實作方式。
完整答題架構與關鍵字:到站內看全文
108 年(考試時間 120 分鐘) 原卷 PDF
- 1
閱讀以下 Java 程式,列出數學式以說明變數 e 在計算什麼?接著撰寫遞迴(recursive)程式 public static double etx(int accuracy, int x)來計算前述變數 e 的值,撰寫時必須使用 etx 規定的參數與資料型態。(25 分)import java.util.Scanner; public class EtoX { public static void main( String[] args ) { Scanner input = new Scanner( System.in ); int number = 1; int accuracy; int factorial = 1; int x; double e = 1.0; double exponent = 1.0; x = input.nextInt(); accuracy = input.nextInt(); while ( number < accuracy ) { exponent *= x; factorial *= number; e += exponent / factorial; number++; } // end while loop System.out.printf( "x: %d%ne: %f%n", x, e ); } // end main } // end class EtoX
(25 分)
參考架構・破題
迴圈每次累加 x^n/n!,e 是 e^x 的泰勒(Maclaurin)展開前 accuracy 項之和。遞迴版只要定義「前 k 項和=前 k−1 項和+第 k 項」,以 accuracy 遞減到 1 為終止條件即可。
完整答題架構與關鍵字:到站內看全文
- 2
下列為資料結構 List 的 Java 程式,而 ListTest 為測試類別(class),試回答以下問題:(35 分)
⑴ListTest 中”List<Integer> list = new List<>();”會先後呼叫那些methods?傳送那些參數值?結果新物件 list 的屬性值為何?
⑵執行 ListTest.java 後會列印出什麼?
⑶撰寫 public T removeFromBack() throws EmptyListException。class ListNode<T> { T data; ListNode<T> nextNode; ListNode(T object) { this(object, null); } ListNode(T object, ListNode<T> node) { data = object; nextNode = node; } T getData() ListNode<T> getNext() } // end class ListNode<T> public class List<T> { private ListNode<T> firstNode; private ListNode<T> lastNode; private String name; public List() { this("list"); } public List(String listName) { name = listName; firstNode = lastNode = null; } public void insertAtFront(T insertItem) public void insertAtBack(T insertItem) public T removeFromFront() throws EmptyListException public T removeFromBack() throws EmptyListException public boolean isEmpty() public void print() { if (isEmpty()) { System.out.printf("Empty %s%n", name); return; } System.out.printf("The %s is: ", name); ListNode<T> current = firstNode; while (current != null) { System.out.printf("%s ", current.data); current = current.nextNode; } System.out.println(); } } // end class List<T> public class EmptyListException extends RuntimeException { public EmptyListException() { this("List"); } public EmptyListException(String name) { super(name + " is empty"); } } // end class EmptyListException public class ListTest { public static void main(String[] args) { List<Integer> list = new List<>(); try { list.insertAtFront(-1); list.insertAtFront(99); list.print(); int removedItem = list.removeFromFront(); removedItem = list.removeFromFront(); list.print(); removedItem = list.removeFromFront(); list.print(); } catch (EmptyListException emptyListException) { emptyListException.printStackTrace(); } } } // end class ListTest
(35 分)
參考架構・破題
本題考 Java 建構子鏈結(this(...))、泛型鏈結串列的節點操作與例外處理。依序回答建構過程、執行輸出,再寫出 removeFromBack,重點在只剩一個節點與空串列兩個邊界狀況。
完整答題架構與關鍵字:到站內看全文
- 3
下列程式 Stack<T>繼承上題的 List<T>。試撰寫 Stack 中的建構子 Stack (),以及兩個主要 methods: push(…)與 pop()。(25 分)public class Stack<T> extends List<T> { public Stack() public void push(T object) public T pop() throws EmptyListException } // end class StackInheritance
(25 分)
參考架構・破題
Stack 是後進先出(LIFO),只要把串列的一端當堆疊頂端即可。繼承 List<T> 後直接重用 insertAtFront 與 removeFromFront,兩者都是 O(1),比用尾端更有效率。
完整答題架構與關鍵字:到站內看全文
- 4
下列 Python 程式的執行結果為何?(15 分)class Shape: def __init__(self, x, y): self.x = x self.y = y self.description = "unknown" def area(self): return self.x * self.y def perimeter(self): return 2 * self.x + 2 * self.y def describe(self, text): self.description = text class Square(Shape): def __init__(self, x): self.x = x self.y = x class DoubleSquare(Square): def __init__(self, y): self.x = 2 * y self.y = y def perimeter(self): return 2 * self.x + 3 * self.y rectangle = Shape(100, 45) print(rectangle.perimeter()) dictionary = {} dictionary["DoubleSquare"] = DoubleSquare(5) dictionary["Rectangle"] = Shape(600,45) dictionary["Square"] = Square(20) print(dictionary["Square"].area()) dictionary["DoubleSquare"].describe("Double square") print(dictionary["Rectangle"].description)
(15 分)
參考架構・破題
本題考 Python 類別繼承、建構子覆寫與屬性存取。三個 print 分別印矩形周長、正方形面積與 Rectangle 物件的 description,答案依序為 290、400、unknown。要說明每一步呼叫的是哪個類別的方法。
完整答題架構與關鍵字:到站內看全文
107 年(考試時間 120 分鐘) 原卷 PDF
- 1
以下二小題是完整的 C/C++程式碼,請回答執行的結果為何?(每小題 10 分,共 20 分)
(一)#include <stdio.h> #include <stdlib.h> int recFun(int); int main(void) { printf("%d\n", recFun(12345)); return 0; } int recFun(int n) { if (n<10) return n; else return recFun(n/10) + n%10; }(請接第二頁)全四頁第二頁
(二)#include <iostream> #include <cstdlib> #include <string> using namespace std; struct data { string name; int a, b; }; void fun1(struct data), fun2(struct data *), fun3(struct data); int main(void) { struct data man={"John", 11, 33}, lady={"Linda", 22, 44}; cout<< "After process..." <<endl; fun2(&man); fun3(lady); fun1(man); fun1(lady); return 0; } void fun1(struct data in) { cout<< "Name: " << in.name << endl; cout<< "a=" << in.a << ", "; cout<< "b=" << in.b <<endl; } void fun2(struct data *ptr) { int tmp; tmp = ptr->a; ptr->a = ptr->b; ptr->b = tmp; } void fun3(struct data in) { int tmp; tmp = in.a; in.a = in.b; in.b = tmp; }(請接第三頁)全四頁第三頁
(20 分)
參考架構・破題
第一小題是遞迴求各位數字和;第二小題考 C++ 結構的傳值(call by value)與傳指標(call by address)差異:fun2 透過指標改到原變數,fun3 只改到複本。
完整答題架構與關鍵字:到站內看全文
- 2
以下是完整的 Python 程式碼,請說明此程式的詳細功能為何?(10 分)import os.path file1 = input("Input a file name: ") file2 = input("Input the other file name: ") while not os.path.isfile(file1): print("The file does not exist!") file1 = input("Input a file name again: ") while os.path.isfile(file2): answer = input("The file existed, Overwrite it? y/n? ") if answer == 'n' or answer=='N': file2 = input("Input a file name again: ") else: break fileObject1 = open(file1, "r") fileObject2 = open(file2, "w") content = fileObject1.read() fileObject2.write(content) fileObject1.close() fileObject2.close()
(10 分)
參考架構・破題
這支程式是互動式的檔案複製工具:要求來源檔必須存在,目的檔若已存在則詢問是否覆寫,最後把來源檔的全部文字內容寫入目的檔。作答要依程式流程逐段說明,而不是只寫一句「複製檔案」。
完整答題架構與關鍵字:到站內看全文
- 3
請撰寫一支密碼產生模組程式,此模組的密碼組成為一個五位數字,最後一碼(個位數)為驗證碼。合法的密碼規則是除了驗證碼之外的所有數字相乘後取除以 10 的餘數當作驗證碼。例如:13575 即為合法的密碼,因為(1*3*5*7)%10=5。請撰寫一支完整 C/C++程式,包含 main()與 codeGen();codeGen()功能為輸入參數為密碼的前四碼,輸出為產生驗證碼之後的五位數字密碼。程式讓使用者輸入密碼的前四碼後,檢查使用者所輸入的數值是否為四位數,正確的話則呼叫 codeGen()將傳回之五位數字密碼從螢幕顯示出。main()需有迴圈功能詢問使用者是否要繼續輸入,直到使用者按下不是’Y’或’y’鍵時結束程式。(20 分)(請接第四頁)全四頁第四頁
(20 分)
參考架構・破題
本題要寫一支完整 C/C++ 程式:codeGen() 拆出四位數的各位數字相乘取個位數當驗證碼,再組成五位數;main() 負責輸入驗證與 Y/y 重複詢問迴圈。重點在拆位數、四位數範圍檢查與迴圈控制。
完整答題架構與關鍵字:到站內看全文
- 4
請撰寫一支完整的 C/C++程式,此程式包含一個一維陣列,陣列元素的個數由使用者輸入,陣列元素值由時間亂數產生,數值範圍介於在 1(含)至 99(含)間。此程式需包含下列函數:
(一) arrMean():將所傳入的一維陣列計算此陣列元素的平均值後傳回。 (10 分)
(二) arrBubble():將所傳入的一維陣列利用氣泡排序法將陣列元素由小至大排序。 (10 分)
(三)撰寫 main()以驗證 arrMean()與 arrBubble()的正確性。(5 分)
(25 分)
參考架構・破題
本題考動態陣列配置、亂數產生、函式傳遞陣列與氣泡排序。陣列長度由使用者決定,必須動態配置;亂數以時間為種子、映射到 1~99;兩個函式要能接收陣列與長度,main 印出排序前後與平均值作驗證。
完整答題架構與關鍵字:到站內看全文
- 5
使用 C++, Java 或 Python 程式語言設計機車里程數計算程式:
(一) motor:機車類別¾ brand:機車品牌的私有字串資料項目¾ fuel:機車油量(公升)的私有數值資料項目¾ speed:機車速度(公里/小時)的私有數值資料項目¾ km:機車可行駛公里數的私有數值資料項目¾ 建構函數可將新建立物件之機車品牌、油量、速度作初始化¾ calKM()公有方法計算里程數,依標準機車計算,平均每公升可跑 15 公里¾ show()公有方法從螢幕顯示出機車品牌、油量、速度、可行駛公里數資訊
(二) electricMotor:電動機車類別¾ 繼承機車(motor)類別¾ seat:電動機車座位數私有數值資料項目¾ 建構函數可將新建立物件初始化¾ calKM()公有方法計算電動機車可行駛公里數,不受速度影響,電動機車平均每公升可跑 20 公里¾ show()公有方法從螢幕顯示出電動機車品牌、油量、速度、可行駛公里數資訊
(三) raceMotor:競技機車類別¾ 繼承機車(motor)類別¾ type:競技機車型號之私有字串資料項目¾ 建構函數可將新建立物件初始化¾ calKM()公有方法計算競技機車可行駛公里數;競技機車若時速超過每小時 60 公里,則平均每公升可跑 10 公里;沒超過的話則平均每公升可跑 12 公里¾ show()公有方法從螢幕顯示出競技機車品牌、油量、速度、可行駛公里數資訊此題不需讓使用者輸入相關數值,只需在程式內建立電動機車與競技機車物件時給予相關的數值,但程式需執行 show()方法以驗證程式的正確性。 (25 分)
(25 分)
參考架構・破題
本題考物件導向三大特性中的封裝、繼承與多型:以父類別 motor 定義共同屬性與方法,兩個子類別覆寫(override)calKM() 與 show(),最後在主程式建立物件並呼叫 show() 驗證。
完整答題架構與關鍵字:到站內看全文
106 年(考試時間 120 分鐘) 原卷 PDF
- 1
請宣告一個 Add class,內容包含以下特性: (25 分)
A. Private member "A",型態為 integer,並透過 constructor 初始化為 0。
B. Private member "B",型態為 integer,並透過 constructor 初始化為 0。
C. Private method "print",將 member "A"、"B"相加後顯示在 console 中,且無回傳值。
D. Public method "add(int A, int B)",須達成以下行為:i. 將參數 A 的 value 儲存到 member "A"。ii. 將參數 B 的 value 儲存到 member "B"。iii. 呼叫 Private method "print",印出結果。iv. 無回傳值。public class Add { // code here }
(25 分)
參考架構・破題
本題考類別封裝的基本功:private 成員、建構子初始化、private 方法只能在類別內部被呼叫,以及 public 方法如何透過 this 區分同名參數與成員。
完整答題架構與關鍵字:到站內看全文
- 2
程式語言中,指標(Pointers)是一個非常強大有用的工具,但是也可能為程式帶來Dangling Pointer 和 Memory Leakage 問題。(25 分)
(一)請使用下列的 C 程式碼說明何謂 Dangling Pointer 和 Memory Leakage 問題,並解釋其發生原因。int *p1, *p2, *p3, *p4; p1 = (int*) malloc (sizeof(int)); p2 = p1; free p1; p3 = (int*) malloc (sizeof(int)); p4 = (int*) malloc (sizeof(int)); p3 = NULL;
(二)請從 Compiler 的角度,說明什麼方法可以解決這兩個問題?全一張(背面)
(25 分)
參考架構・破題
本題考指標的兩大風險:懸置指標(dangling pointer)是指標仍指向已釋放的記憶體;記憶體洩漏(memory leakage)是已配置的記憶體失去所有參考而無法回收。要逐行追蹤程式碼,再從語言與編譯器實作面提出解法。
完整答題架構與關鍵字:到站內看全文
- 3
下列是以 C,Java,Javascript,C++,PHP 及 JSP 六種語言撰寫存取陣列(array)的程式片斷,請問此程式片斷執行後,會產生什麼結果?如果有結果錯誤,錯誤訊息為何?各用什麼方法可避免錯誤?請寫出完整的程式來說明你的方法。(25 分)C: int a[] = {0, 1, 2, 3}; for(i=0; i<=sizeof(a); i++) printf("%d", a[i]); Java: int[] a = {0, 1, 2, 3}; for(i=0; i<=a.length; i++) System.out.print(a[i]); Javascript: var a = [0, 1, 2, 3]; for(i=0; i<=a.length; i++) document.write(a[i]); C++: int a[] = {0, 1, 2, 3}; for(i=0; i<=sizeof(a); i++) printf("%d", a[i]); PHP: $a = array(0,1,2,3); for($i=0; $i<=count($a); $i++) echo $a[$i]; JSP: int[] a = {0, 1, 2, 3}; for(i=0; i<=a.length; i++) out.print(a[i]);
(25 分)
參考架構・破題
六段程式都犯同一個錯:迴圈條件寫成 <=,造成差一錯誤(off-by-one)而存取陣列界外元素;C 與 C++ 還誤用 sizeof 取得元素個數。本題重點在比較各語言是否做邊界檢查、錯誤如何呈現,以及正確寫法。
完整答題架構與關鍵字:到站內看全文
- 4
下列為秀出 4 x 3 表格的 html 網頁,請以此網頁為基礎,用 Javascript 程式完成所需的兩個 js 檔案:data.js 及 function.js。其中 function.js 只包括函式 ShowTable(I,J)及data.js 只包括所需的二維陣列宣告。一定要用 Javascript 的 for 迴圈完成函式ShowTable(I,J)。(25 分)<HTML><HEAD><TITLE>4x3 Table Example</TITLE> <SCRIPT SRC=Data.js></SCRIPT> <SCRIPT SRC=Function.js></SCRIPT> </HEAD><BODY> <SCRIPT LANGUAGE=JavaScript> ShowTable(4,3); </Script> </BODY></HTML>
(25 分)
參考架構・破題
本題要把資料與邏輯分離:data.js 只放 4×3 的二維陣列宣告,function.js 只放 ShowTable(I,J),以巢狀 for 迴圈產生 HTML 表格字串並輸出。
完整答題架構與關鍵字:到站內看全文
105 年(考試時間 120 分鐘) 原卷 PDF
- 1
請問下列 Java 程式碼編譯後輸出結果為何?(20 分)class tree{ void message(){ System.out.println("1359"); } int tree(){ System.out.println("Tr"); return 3; } } class two extends tree{ void message(){ super.message(); System.out.println("4321"); } two(){ System.out.println("Tw"); } } public class one extends two{ void message(){ System.out.println("1234"); } one(){ System.out.println("On"); } public static void main(String[] args){ one Exam = new one(); Exam.message(); } }
(20 分)
- 2
請觀察以下程式碼:
(一)請問以下 C++程式碼輸出答案為何?(5 分)
(二)請問執行至 return 0 時,是否回收原分配給物件 p 之動態記憶體?(5 分)
(三)請說明此方法為解決何種問題?且程式概念為何?(10 分)class Smart{ public: explicit Smart(int *p = NULL) { sp = p; } ~Smart() { delete(sp); } int& operator*() { return *sp; } private: int *sp; }; int main(void){ Smart p(new int()); *p = 2016; cout << *p << endl; return 0; }全一張(背面)
(20 分)
參考架構・破題
本題是自製的智慧指標(smart pointer),核心概念為 RAII:把動態配置的資源交給區域物件管理,物件生命週期結束時由解構子自動釋放,藉此避免記憶體洩漏。
完整答題架構與關鍵字:到站內看全文
- 3
觀察以下 C 語言之程式,試問輸出為何?(20 分)int main(){ int a = 1, b = 2, c = 3, d = 4; printf( "%d\n%d\n%d\n%d\n", a+b+c+d, (b *= a), (a += d), (d++)); }
(20 分)
參考架構・破題
本題表面是計算題,實際考的是 C 語言函式引數的求值順序未指定,以及在同一運算式中修改變數又讀取它所造成的未定義行為。理想答案是先指出問題本質,再推導常見編譯器的結果。
完整答題架構與關鍵字:到站內看全文
- 4
請回答以下問題:
(一)請描述 C#程式語言中關鍵字 const 之功用。(10 分)
(二)請比較 C#程式語言中關鍵字 const 與 readonly 差異。(10 分)
(20 分)
參考架構・破題
本題考 C# 兩種「不可變」的宣告方式:const 是編譯時期常數,readonly 是執行時期才確定、之後不可改的欄位。要先說明 const 的功用,再從初始化時機、型態限制、靜態性與版本相依等面向比較。
完整答題架構與關鍵字:到站內看全文
- 5
請問下列 C 語言程式碼執行後輸出結果為何?(20 分)int main(){ double d[10][20][30][40]; printf("%d\n", (int) sizeof(d[1][5])); printf("%d\n", (int) sizeof(d[1][5][20])); printf("%d\n", (int) (d - &d[3])); printf("%d\n", (int) (d[3][4] - d[5][8])); }
(20 分)
參考架構・破題
本題考多維陣列的記憶體配置(列主序)、sizeof 對子陣列的計算,以及指標算術的單位是「所指型態的大小」。前提假設 double 為 8 bytes。
完整答題架構與關鍵字:到站內看全文
104 年(考試時間 120 分鐘) 原卷 PDF
- 1
請就解譯方式(組譯、直譯、編譯)、程式結構(程序導向、物件導向)、標記文字(是、否)等特性,分類說明程式語言 C, CSS, C#, HTML, Java, PHP, Python, SQL的特性。請繪製表格作答。(25 分)
(25 分)
參考架構・破題
本題要求以表格比較八種語言的翻譯方式、程式結構與是否為標記語言。重點在正確區分「程式語言、樣式表語言、標記語言、查詢語言」,並說明 Java、C# 這類先編譯成中間碼再執行的混合方式。
完整答題架構與關鍵字:到站內看全文
- 2
請使用如下的 BNF 語法規則(S 為起始符號):(20 分)S → NP VP | VP NP → ADJ NP | N VP → ADV VP | V NP | V N → 考 | 校 | 評鑑 | 成績V → 通過 | 獲得 | 成功 | 失敗Adj → 高 | 普 | 特 | 好 | 壞Adv → 一定 | 可能繪製⑴特校可能通過評鑑
⑵普考一定獲得好高成績相關推導過程的 Parse Tree。
(20 分)
- 3
假設現有如下兩張資料表用來存放考生個人訊息及其成績,考生個人訊息,包括代號(TesterID)、姓名(Name),成績(Grade)則有五種科目(1 中文、2 英文、3 數學、4 自然、5 社會)及成績的等級有三種(ABC 三種)。請使用 SQL 回應如下的問題。(每小題 5 分,共 20 分)Tester Grade TesterID TesterID (FK) SubjectID Name GradeData Subject
(一)請列出中文成績為 A 所有考生的代號及姓名。
(二)請列出各科不同成績等級的個數,個數使用別名 numCount 來表示,如中文 A5,中文 B2, …。
(三)加入資料 TesterID 6 名為 Oscar Lin 的考生資料及其成績(中文 A, 英文 A, 數學C, 自然 B, 社會 A)。
(四)修改 TesterID 5 考生的數學成績為 A。全一張(背面)
(20 分)
參考架構・破題
本題考 SQL 的 DML 四大基本操作:多表 JOIN 查詢、GROUP BY 彙總加別名、INSERT 多筆、UPDATE 加條件。先寫出三表結構與關聯,再逐小題寫 SQL,閱卷重點是 JOIN 條件、WHERE 條件與語法完整。
完整答題架構與關鍵字:到站內看全文
- 4
請使用物件導向程式語言(C#或 Java),設計一具門禁功能的智慧卡管理資訊系統。系統應依如下的 class diagram 建立相關的類別資訊。(35 分)SmartCard -cardID: String -issueDate: String -issueOrg: Organization #getCardID(): String #getIssueDate(): String #getIssueOrg(): Organization #setCardID(String): void #setIssueDate(String): void #setIssueOrg(Organization): void +nowDateToString(): String +toString():String Security SMsecurity -date: String -securityList: List -enterExit: EnterExit +SMsecurity() +Security() +SMsecurity(String, Organization) +Security(EnterExit) +getDate(): String +addInfo(EnterExit): void +getEnterExit(): EnterExit +addInfo(String, EnterExit):void +setData(EnterExit): void +addInfo(Security):void +setData(String, EnterExit): void +toString(): String +toString(): String z 所有的類別變數皆為 private,SMsecurity 類別繼承自抽象類別 SmartCard z 發卡單位 Organization、進出入狀況 EnterExit,請分別使用 enum 的格式來表示z 記錄進出入狀況,日期資料若未提供,則填入目前系統的日期時間z 一張智慧卡,會有多次的進出入記錄,資料值應存放於 List 線性資料結構中z 改寫系統的 toString()方法後,執行如下的測試動作SMsecurity sms = new SMsecurity("SM001", Organization.NewTaipeiMRT); sms.addInfo("2015/06/15 18:36:01", EnterExit.Enter); sms.addInfo("2015/06/15 20:16:01", EnterExit.Exit); sms.addInfo("2015/06/20 18:20:01", EnterExit.Enter); sms.addInfo(EnterExit.Exit); /* for Java */ System.out.println(sms.toString()); /* for C# */ Console.WriteLine(sms.ToString());應能產生類似如下的結果*****Smart card SM001 (6/21/2015 10:38:38 PM, NewTaipeiMRT) -----Enter and Exit information: (2015/06/15 18:36:01, Enter) (2015/06/15 20:16:01, Exit) (2015/06/20 18:20:01, Enter) (6/21/2015 10:38:38 PM, Exit)
(35 分)
參考架構・破題
本題是物件導向實作題,考抽象類別與繼承、封裝(private 欄位與存取方法)、enum、List 集合、多載建構子與方法、覆寫 toString。依類別圖逐一寫出類別,最後說明測試程式的輸出如何產生。
完整答題架構與關鍵字:到站內看全文
103 年(考試時間 120 分鐘) 原卷 PDF
- 1
請說明 early binding(如 C 語言)及 late binding(如 Perl 語言)之間最大的差異,並列出兩者主要的優點。(10 分)
(10 分)
參考架構・破題
本題考名稱(變數型別或函式呼叫)與屬性綁定的時機。核心差異在於綁定發生在編譯期(執行前)還是執行期,進而影響效率與彈性,答題時先定義再比較,最後各列優點。
完整答題架構與關鍵字:到站內看全文
- 2
參考下述 BNF grammar S S + S | S - S | S * S | S / S | ( S ) | a請回答總共有幾個不同的剖析樹(parse tree)可得到下列結果。本題不需畫出剖析樹,但請說明。(每小題 5 分,共 20 分)a + a * a a + a * a / a a + a + a + a (a + (a + a)) + a
(20 分)
- 3
參考右圖類 C 語言的程式,請依下列小題所述參數傳遞方式,寫出執行程式 B 後之輸出結果。(每小題 10 分,共 20 分) Program B () { Y is passed by value. Y is passed by reference. function A (X: integer) { X := X + 1; write(X, Y); } var Y : integer; Y := 1; A (Y); write (Y); }
(20 分)
參考架構・破題
本題考參數傳遞方式。關鍵在於傳值時形式參數 X 是 Y 的複本,修改不影響 Y;傳參考時 X 就是 Y 的別名,修改會直接反映在 Y。逐步追蹤變數值即可。
完整答題架構與關鍵字:到站內看全文
- 4
請用 Scheme 或 Lisp 等 Functional Programming Language 寫一個符合下述規範的遞迴函數 calculate。所寫的遞迴函數應該越簡潔越好。(20 分)(calculate A B C):A 是某函數(function),B 是一整數(integer),C 是任一數值(value),回傳滿足 N >= B 且(A N)= C 的最小整數 N。例如(calculate list 0 ‘(3))應回傳 3. (calculate (lambda (X) (> X 10)) 0 T) 應回傳 11. (calculate (lambda (X) (* X X)) 0 100) 應回傳 10.全一張(背面)
(20 分)
參考架構・破題
本題考函數式語言的遞迴與高階函數:A 是函數當參數傳入,從 B 開始逐一測試 (A N) 是否等於 C,相等就回傳 N,否則以 N+1 遞迴。重點是終止條件、遞迴呼叫與比較函數的選擇。
完整答題架構與關鍵字:到站內看全文
- 5
請參考以下的 Java classes,解釋下列各小題的語法是否正確,如不正確請說明原因。(每小題 5 分,共 15 分)class X { public void x( ) { … } } class Y extends X { public void y( ) { … } } class Z extends Y { public void z( ) { … } } int count(Set<Y> s) { … } … count(new TreeSet<Z>( )); int count(Set<? extends Y> s) { … } … count(new TreeSet<Z>()); int count(Set<? super Z> s) { for (X a : s) a.x( ); … };
(15 分)
參考架構・破題
本題考 Java 泛型的不變性(invariance)與萬用字元(wildcard)的上下界。核心觀念:Z 是 Y 的子類別,但 Set<Z> 不是 Set<Y> 的子型別;要接受子型別集合須用 ? extends,用 ? super 時取出的元素型別只能確定是 Object。
完整答題架構與關鍵字:到站內看全文
- 6
下述 Prolog 程式可推論圖形中 A 點到 B 點的可行性,但是無法知道路徑。請改寫該程式使其可以用 Prolog list 來記錄 A 點到 B 點的路徑。若 A 點到不了 B 點,則回應 fail(false)即可。(15 分)get_to (A, B) :- path (A, B). get_to (A, B) :- path (A, C), get_to (C, B).
(15 分)
參考架構・破題
本題考 Prolog 的遞迴規則與 list 建構。原程式只回答能否到達,要多加一個參數以 list 累積經過的節點,利用 [Head|Tail] 在遞迴回傳時組出路徑;到不了時規則全部失敗,Prolog 自然回應 false。
完整答題架構與關鍵字:到站內看全文
102 年(考試時間 120 分鐘) 原卷 PDF
- 1
請回答下列程式語言的問題:
(一)就程式語言來說,什麼是 Object-Oriented languages? Functional languages? Logic languages? Script languages?(12 分)
(二)從上述(一)的四種語言中,除 Logic languages 外,每種語言各舉兩個現存的語言。(6 分)
(三)最近語言的發展中,像 Functional languages 與 Script languages,都逐漸引進物件導向性質(OO),就這兩類語言,各舉一個近來發展出且具有 OO 性質的語言。(2 分)
(20 分)
- 2
考慮下述用類似 C 語言的語法寫出的程式:void swap(int a, int b) { int temp; temp = a; a = b; b = temp;} void main() { int value = 1, list[4] = {2, 3, 4, 5} //Array list is list[1..4] swap(value, list[1]); swap(list[1], list[2]); swap(value, list[value])}根據以下的參數傳遞(parameter passings)模式,逐一列出在程式執行完畢之後的value 與 list 值:
(一)Passed by value? (5 分)
(二)Passed by reference? (5 分)
(三)Passed by name?(5 分)
(15 分)
參考架構・破題
本題考三種參數傳遞方式的語意差異:傳值不影響實參;傳參考在呼叫當下綁定位址;傳名則是每次使用時重新計算實參運算式。差異會出現在第三次呼叫 swap(value, list[value]),因為索引會隨 value 改變。
完整答題架構與關鍵字:到站內看全文
- 3
根據每一個元素(element)包含 16 個英文字母的 circular queue,當用長度 m 的陣列(array)來實作使用 JAVA 語言寫出下列兩個方法的完整定義:
(一)Enqueue(10 分)
(二)Dequeue(10 分)全一張類 科: 資訊處理
(20 分)
參考架構・破題
本題考環狀佇列的陣列實作。要寫出 Java 類別的欄位、建構子,以及 Enqueue/Dequeue 的完整方法,關鍵是以餘數運算讓索引繞回,並正確判斷佇列滿與空。
完整答題架構與關鍵字:到站內看全文
- 4
對 C#與 JAVA 的 concurrency 而言:
(一)C#的 thread 可以是 actor thread 嗎?JAVA 的呢?(5 分)
(二)C#的 thread 可以被非同步呼叫嗎?JAVA 的呢?(5 分)
(三)C#的 sleep method 與 JAVA 的 sleep method 有何不同?(5 分)
(15 分)
參考架構・破題
本題出自程式語言教科書比較 C# 與 Java 並行機制的段落,考執行緒能否主動執行、能否非同步呼叫,以及 sleep 方法的差異。答題先定義 actor 與非同步呼叫,再分別對照兩種語言。
完整答題架構與關鍵字:到站內看全文
- 5
考慮下述 Prolog 程式:ancestor (x, x). ancestor(x, y) :- ancestor(z, y), parent(x, z) parent(Allen, John).用 一 個 subgoal 的 搜 尋 樹 ( search tree ) , 描 述 此 Prolog 程 式 在 執 行 查 詢 :ancestor(Allen, X)時的執行步驟。(10 分)六、考慮下述的 Scheme 程式:(define A (lambda () (let* ((x 2) (C (lambda (P) (let ((x 4)) (P)))) ( D (lambda () x)) (B (lambda () (let ((x3)) (C D))))) (B))))
(一)這程式列印什麼東西?(10 分)
(二)如果 Scheme 使用 dynamic scoping 和 shallow binding,它會印出什麼?(10 分)
(30 分)
參考架構・破題
本題含兩部分:Prolog 搜尋樹與 Scheme 範圍規則。前者考深度優先、由左至右的求解與左遞迴造成的無窮迴圈;後者考靜態範圍與動態範圍(shallow binding)下自由變數 x 的值。
完整答題架構與關鍵字:到站內看全文
其他等別的「程式語言」
- 程式語言(地方特考三等)(41 題)
題目來源:考選部考畢試題查詢平臺(政府資訊公開資料);參考架構為本站自撰,僅供準備方向參考,非官方標準答案。最後更新:。