[轉載] 中級 LPC 語言能力測試
大家可以參考一下,我覺得有幾題對 wiz 們還不錯用,
我會以回文的方式挑出這些題目。
http://www.mudbuilder.com/simple/?t212.html
longly
中級 LPC 程式基本能力測驗
今天聽hcifml說rw的abcd出了一個考卷,所以上去找了下,下面就是這份考卷
中級 LPC 程式基本能力測驗
本試題 共有 25 大題,每大題 4 分,測驗時間為 24 小時,准許翻閱任何資料,
詢問他人,無論任意方式達成作答目的者均被允許,但切忌不知所云 的胡亂複製
不相關的程式作答,或是隨便剪下一段參考資料內容貼上來作答,違者該題不予計分。
此試題並不牽涉於「效率」、「進階流程控制」 以及「演算法」的考慮和設計階段,
僅測驗對於 MudOS 所提供之 LPC 語言的熟練度和相關知識,以及與 LPC 相關的一些
MudOS 本身之動作和行為,另外,可能會測驗一些程式寫作上被要求的一些基本習慣。
此試題適合系統架構者(system architect - arch)之中級以上之巫師作答,
滿分 100 分,及格分數為 60 分。
--------------------------------------------------------------------------------
1. (1) LPC 中的條件敍述結果為非零值時代表的意義為何? (1%)
(2) 如何取出一個字串中第 2 到第 7 個字之間的字串(含第 2 及第 7 個字元)? (1%)
(3) 觀察以下程式碼:
mapping m;
void create()
{
m["id"] = 10;
}
試問此程式碼何處有誤?應如何修改? (1%)
(4) 如果不希望物件中某個全域變數被 save_object 這個 efun 所儲存,該如
何宣告變數? (1%)
--------------------------------------------------------------------------------
2. [題組] LPC 提供物件儲存資料內容的功能,則:
(1) 試列出 LPC 支援之資料型別名稱。 (1%)
(2) 哪些資料型別可被 MudOS 內建之 efun 所儲存? (1%)
(3) 哪些資料型別無法被 MudOS 內建之 efun 所儲存? (1%)
(4) 承上題,試說明這些資料型別無法被儲存之可能原因。 (1%)
--------------------------------------------------------------------------------
3. [題組] LPC 之函示呼叫提供 call by reference 的方式,試問:
(1) 哪些資料型態在呼叫時預設為 call by reference? (1%)
(2) 如何使這些資料型別之變數在傳遞時模擬 call by value? (1%)
(3) 自動 call by reference 之變數在其所呼叫的目的函式中,有可能經由
assignment operator 消除其 reference 的關係,試舉出一個例子。 (1%)
(4) 試撰寫一個 swap_value 函式,以 call by reference 的方式交換傳入之兩
引數內容值,該函式傳回型別為 void。 (1%)
--------------------------------------------------------------------------------
4. MudOS 為物件為基本元素所組成之系統,試問:
(1) load_object 與 new 這兩個 efun 所傳回之物件有何不同? (1%)
(2) 物件名稱是否一定與程式檔案名稱有關?試說明原因。 (1%)
(3) 當一個物件 A 被 shadow 到物件 B,且兩者均有一名稱為 func 之函式時,
在何種情況下仍能使用 call_other 方式呼叫 B 中被遮蔽之函式? (1%)
(4) 一個物件中的程式碼如果將自己摧毀,是否會立即停止程式執行?有什麼該
注意的地方? (1%)
--------------------------------------------------------------------------------
5. [題組] LPC 中支援 function pointer 的資料型別,試問
(1) 每個 function pointer 指向一個函式後,會自動被指定一個 owner,請問
該如何強制變更其 owner? (1%)
(2) 試利用上題的方式,於物件 A 中撰寫一段程式碼,以 fetch_variable 這個
efun 取得物件 B 中的全域變數內容值。 (1%)
(3) function pointer 的操作可以使用 (: func(ob, $1) :) 的語法來指定執行
此 function pointer 時的引數傳遞方式,試說明 $1 的作用。 (1%)
(4) 承上題,如果 ob 為 local variable,會因為程式執行離開其有效範圍後消
失,因此 MudOS compiler 會在編譯時段產生錯誤訊息,試修改上題之語法
使其能夠正常運作。 (1%)
(5) 一個 function pointer 的 owner 被摧毀後,執行此 function pointer 將
會發生執行期錯誤,試問該如何避免此錯誤發生?
--------------------------------------------------------------------------------
6. [題組] LPC 提供物件繼承的功能,試問:
(1) 假設 A 繼承 B,兩者中均有同名函式 func 時,A 該如何呼叫 B 中的 func?
(1%)
(2) 承上題,如果希望 B 中函式 func,不能被繼承 B 的物件所覆蓋,或是不希望
被其他物件以 shadow 覆蓋,應如何宣告此函式? (1%)
(3) 試說明修飾字 private 及 protected 在繼承上的影響性。 (1%)
(4) 若 A 繼承 B,且 A 繼承 C,但 B 與 C 並無繼承關係,僅同時被 A 所繼承,
如果 C 中有一 private function 名稱為 func,該如何於 B 中撰寫程式碼以
呼叫 C 中的 func? (1%)
--------------------------------------------------------------------------------
7. MudOS 中提供了一些 driver apply functions,試問:
(1) 哪個 interactive apply function 負責處理使用者的一般性輸入? (1%)
(2) 哪個 master apply function 負責處理使用者由外面連線進入時,使該連線
與某個物件連結使其成為 interactive object? (1%)
(3) 哪些 valid_ 系列的 master apply function 在不定義時自動視為允許? (1%)
(4) 哪個 interactive apply function 負責處理由 message 這個 efun 所傳送
之訊息? (1%)
--------------------------------------------------------------------------------
8. MudOS 中有一防止程式掉入無窮回圈,而有一個 evaluation cost 值,其值在每
次 LPC 程式執行到結束期間,每執行一個指令碼就會減一,每次執行結束後將被
重設為最大值,當其歸零時發生一個 Too long evaluation 的錯誤以終止程式執
行,然而有些時候需要執行指令量特別高的程式,請寫出三種於這種特殊情形下
仍能使此種程式正常運作的方式。 (4%)
--------------------------------------------------------------------------------
9. LPC 中對 type 3 grammar 以 regular expression 的方式支援,其中 regexp
這個 efun 提供字串及字串陣列的比對搜尋,而 sscanf 中也支援它以便於輔助
拆解一個字串,試回答下列問題:
(1) 試用 regexp 撰寫一段程式碼,於一個字串陣列中取出小寫 t 開頭的所有
elements。 (2%)
(2) 試用 sscanf 配合 regular expression 消除一字串開頭的空白。 (2%)
--------------------------------------------------------------------------------
10. MudOS 中有一部份是提供編譯 LPC 程式碼,將物件載入記憶體及釋放的功能,
試問:
(1) MudOS 編譯 LPC 程式碼的時機為何? (1%)
(2) 一個物件的程式檔案開頭有一行 #pragma save_binary 對於物件載入的動
作有何影響? (1%)
(3) 當一個物件被載入後,其非複製物件(即廣義上物件名稱無 # 號的物件)稱
為原始物件,其在記憶體中佔有資料區塊和程式區塊,複製物件則無程式
區塊,程式部分參考著原始物件的程式區塊。請問當原始物件被摧毀並重
新被載入後,原先的複製物件使用的是新的程式區塊還是舊的程式區塊?
(1%)
(4) 試寫一段程式碼,摧毀一個原始物件以及其所有的複製物件。 (1%)
--------------------------------------------------------------------------------
11. [題組] LPC 中的 present efun 提供尋找物件的功能,試問:
(1) 使用 present 在許多物件中尋找一個物件時,會逐一呼叫每個物件中的那
個 apply function? (1%)
(2) 承上題,如果這些物件中有三個物件符合搜尋條件,那麼該如何取得第二
個相符的物件? (1%)
(3) 請用一些文字敍述假設一些物件的環境,並撰寫一些程式碼,說明 present
的動作。 (1%)
--------------------------------------------------------------------------------
12. [題組] MudOS 提供了各種錯誤的處理和記錄功能,試問:
(1) 哪個 master apply function 在 compilation error 發生時會自動被呼叫?
(1%)
(2) 哪個 master apply function 在 runtime error 發生時會自動被呼叫? (1%)
(3) 承上題,當此 apply function 在執行時也發生錯誤時,MudOS 會如何處理?
(1%)
(4) 承上題,當 runtime error 發生時,如果該 error 發生于 catch 區塊中,
此 apply function 是否仍會被呼叫? (1%)
--------------------------------------------------------------------------------
13. MudOS 會遵循一些設定而週期性的呼叫一些物件的 apply functions,請列出這些
apply functions,並說明如何使其開始被 MudOS 週期性呼叫,以及停止方式(沒有
的請注明無)。 (4%)
--------------------------------------------------------------------------------
14. MudOS 所創造出來的世界之基本元素為物件,而這些物件在被產生、消滅及彼此間
的互相關係上也有許多支援,試問:
(1) 一個物件被創造出來時,哪個 function 會被 MudOS 自動呼叫? (1%)
(2) 一個物件被摧毀時,被摧毀的物件上有什麼 function 會被 MudOS 自動呼叫?
(1%)
(3) 一個物件的 environment object 被摧毀時,該物件身上哪個 function 會自
動被 MudOS 呼叫? (1%)
(4) 如果希望 /obj 路徑下的所有物件檔案均不能被載入,且物件中任一行程式碼均
沒有機會被執行,應該如何作此限制? (1%)
--------------------------------------------------------------------------------
15. MudOS 的世界裏物件與物件之間,有著空間上的相對關係,試問:
(1) 如果玩家物件 A 為某一房間物件的內容物(即 A 位於此房間中),應該透過什麼
efun 取得此房間物件? (1%)
(2) 如果玩家物件 A 的內容物裏有許多道具(即 A 身上有許多道具),我們該透過什
麼 efun 一次取得這些道具的集合(即物件陣列)? (1%)
(3) 試用一些文字敍述假設幾個物件環境,以及一些程式碼,來說明如何移動一個物
件。 (1%)
(4) 當一個物件被移動到一個物件中之後,該物件是否還能 shadow 到另一個物件身
上? (1%)
--------------------------------------------------------------------------------
16. 試以目前所學的技術,設計一個物件程式碼,其中有全域變數 basic_data、abilities
以及 magics,其型態均為 mapping,建立一些資料,並以 save_object 儲存其內容至
一個檔案。並設計一個指定變數回存的功能,也就是撰寫一個函式,傳入變數名稱,該
變數之值即會被回存至上次存檔時的內容。 (4%)
---------------------------------------------------------------------------------
17. 試撰寫一個簡易 mudlib 的幾個基本物件程式碼,使這個 mudlib 能夠提供基本連線,
在連線成功後,可用 edit <filename> 的指令格式編輯檔案,以 update <filename>
來將 filename 所產生的原始物件摧毀,並重新載入,以 quit 指令離線,並且能使用
shutdown 指令關閉 mud (請記得標明檔名,以及這些檔案在 runtime configuration
file 中的定義)。 (4%)
--------------------------------------------------------------------------------
18. 目前有一個函式,其傳入值代表整數型態,代表輸入模式,並以 switch case 述句來
判斷其值,以執行相關程式碼,其值為 1 時代表進行單行輸入,為 2 時代表多行輸入
,為 3 時代表不處理輸入(即攔截),其它情形則發生錯誤,此函式內容如下:
void start_input(int mode)
{
switch(mode) {
case 1:
// some codes for single line input...
return;
case 2:
// some codes for multi line input...
return;
case 3:
return;
default:
error("No handler for this input mode.\n");
}
}
很明顯的此程式碼可讀性不佳,尤其在使用上,呼叫部分使用 start_input(1)、
start_input(2)等等的方式容易使人無法立即理解,且容易誤傳其它無效的值進
入,試修改及增加一些程式碼,使其更容易閱讀,且在使用上較不容易傳入無意
義值。 (4%)
--------------------------------------------------------------------------------
19. 有一未經縮排處理的程式碼如下:
void do_something()
{
int a, b, c, d, e, f, g, h;
if(!a) a = 10;
b = 5;
if(b)
if(!c)
c = 3;
else
b = 10;
else
b = 20;
h = 16;
for(d=0;d<5;d++)
for(e=0;e<5;e++)
f = 100;
g += f;
}
試將此程式碼作正確的縮排處理,使其層次正確以便於區分 if、else、for 述句之
影響範圍。 (4%)
--------------------------------------------------------------------------------
20. [題組] LPC 的 function pointer 提供指向 anonymous function 的功能,則:
(1) 試撰寫一段程式碼,將一個 function pointer 變數指向一個 anonymous
function,該 anonymous function 接受 2 個整數值輸入,回傳結果為兩傳
入變數之和 (2%)
(2) 將此 function pointer 的 owner 設定給 this_player()。 (1%)
(3) 最後再撰寫一行執行此 function pointer 的範例程式碼。 (1%)
--------------------------------------------------------------------------------
21. [題組] LPC 中的 0 分為兩種,一種是常數零值 (constant zero),一種是未定義之
常數零值(constant zero & undefined),試問:
(1) LPC 中的變數,分別在什麼情況下會有這兩種不同的 0 值? (1%)
(2) 我們該如何測試該變數目前是哪種 0 值? (1%)
(3) 此二種 0 值在 if、while 等條件述句中代表的意義為何? (1%)
(4) 試撰寫一個程式碼,使一個已被指定值的 mapping 變數值,回到未定義之常數
零值。 (1%)
--------------------------------------------------------------------------------
22. 假設我們有一個房間物件,其中有一個整數 status 儲存著房間的狀態旗號,我們假設
status 最右邊的位元(第一位元)被設定為 1 時,無法使用戰鬥指令。第二位元則是燈
光開關的狀態,1 為點亮,0 為關閉,當我們每次按下開關時,0 與 1 會相互切換
,請設計以下幾個函式:
戰鬥限制部分: (2%)
set_flag - 用來將 status 的某個位元設定為 1
clear_flag - 用來將 status 的某個位元設定為 0
燈光部分: (2%)
inverse_flag - 用來將 status 的某個位元由 1 轉為 0,或由 0 轉為 1
push_button - 按下燈光開關時會被呼叫
--------------------------------------------------------------------------------
23. (1) 請按照以下規格及功能要求設計出 simul_efun:
prototype: mixed *keys(mapping m);
當 m 為 0 值時不發生錯誤,傳回空陣列。 (2%)
(2) 設法防止 efun::keys(m); 在 simulated external function object 之外的地
方被執行成功。 (2%)
--------------------------------------------------------------------------------
24. LPC 提供了對於 socket 的支援,試依照下列要求撰寫 LPC 程式碼:
(1) 建立一個 LPC 物件,並監聽 port 60000,有連線產生即接受其連線,當使用者
傳送訊息為「quit」時,中斷此名使用者的連線,當訊息為「shutdown」時,與
此使用者終止連線,並停止監聽 port 60000。 (2%)
(2) 承上題,試撰寫另一物件,使其能藉由呼叫前一物件之函式,取得正在監聽 port
60000 之 socket 所有權,並能持續提供相同的連線與指令處理功能。 (2%)
--------------------------------------------------------------------------------
25. LPC 提供 virtual object 的支援,帶給許多便利性,如大規模的製造房間,構成整
塊大陸,可由此功能完成,請作答以下問題:
(1) 試列出並撰寫相關函式,以產生任一物件名稱為「/domain/test/17,15」之
virtual object,此物件並不需具備任何功能,請記得標明哪個函式屬於哪
些物件程式檔案裏。 (2%)
(2) 承上題,在此物件中宣告一字串變數,並指定其值後以 save_object 存入資料
檔中,試設計一簡單的自動讀取程式,使此物件下次被 load_object 載入完畢
並被傳回後,該字串變數已經回復到上次儲存的狀態。 (2%)
--------------[End]---------------
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.225.160.140
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
36
58
6
13