[轉載] 中級 LPC 語言能力測試

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間15年前 (2010/07/08 23:34), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
大家可以參考一下,我覺得有幾題對 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
文章代碼(AID): #1CDU_rwm (mud_sanc)
文章代碼(AID): #1CDU_rwm (mud_sanc)