星期一, 5月 07, 2007

delegate

delegate 是 C# 中宣告函式形態的機制。也就是說,我們可以自訂一種型態,用來儲存一個函式。這樣一來,我們就能把函式當成參數,在 function﹝method﹞ 之間傳遞。


在 C++ 中,是以 pointer to function 實踐,而函式引數稱之為 function object ﹝functor﹞。就這方面來說,C++ 比起 C# 要來的複雜些,但在概念上大同小異。

至於 delegate 的功用,主要在實踐 function 多樣性的同時,仍維護住 encapsulation。也就是說,不論外部有何更動,都不影響到這些 function 的運作﹝function 內容仍維持不變﹞。

思考以下狀況:沒有函式引數之前,要以一個 sort function 針對不同比對規則排序,該如何做?一個可行的方法是這樣的:先定義好許多 compare function,並給每個 compare function 相對應的代號(字元或整數)。而在使用此 sort function 時,多傳遞一作為代號的參數,而 sorting 時就根據此代號判斷要用哪個 compare function 來 sorting。如此一來,就能達到目的 - 一個 sort function 能針對不同比對規則做排序。

然而,這樣的方式有個重大的缺點:當我們創造出一新的比對方式時(也就是增加了一個代號),我們必須更改原函式(例:增加一個 if),讓它能識別此代號,並使用對應的 compare function 做排序。這樣一來,一旦有新的比對方式產生,不僅原程式需要更改,連 sort function 內部也必須更動,而這大大增加了 maintain 的難度。

因此,我們希望能有一種方法,不論增加了多少比對方式,原 sort function 都能維持不變,而 delegate 正回應了此要求。

delegate 的語法如下:

delegate return_type function_type_name ( parameter );


定義完 function_type 之後,就能以此 function_type 宣告 function 變數。只要某 function return type及 parameter 與 function_type 中的一致,此 function 就能被儲存在此變數中。因此,以 sort function 排序時,只要傳遞此 function_type 的變數,不必經由 if 判斷,就能得知要以哪個 compare function 來 sorting。

舉個例子,假設有個 sort function 要對字串排序,則我們的 compare function_type 應該如下:

delegate bool strcmp (string s1, string s2);


又假設我們有以下幾種 compare function:

bool ascii_cmp (string s1, string s2) { //... }
bool size_cmp (string s1, string s2) { //... }
bool other_cmp (string s1, string s2) { //... }


由於 ascii_cmp、size_cmp、other_cmp 的 return_type 及 parameter 都與 strcmp 一致,它們都可以被儲存在由 strcmp 宣告出的變數之中,如:

strcmp cmp1 = new strcmp (ascii_cmp);
strcmp cmp2 = new strcmp (size_cmp);
strcmp cmp3 = new strcmp (other_cmp);


接著,我們只要讓 sort function 能接收一 strcmp type 的變數,就能達成我們要的比對規則,如下(以簡單的 bubble sort為例):

void string_sort (string[] array, strcmp cmp) {
for (int i = 0 ; i < array.Length ; ++i) {
for (int j = 0 ; j < array.Length - i - 1 ; ++j) {
if (cmp (array[j], array[j + 1]))
swap (ref array[j], ref array[j + 1])
}
}
}


從以上可知,使用 function_type 宣告出的變數就如同使用一般 function。

星期四, 5月 03, 2007

感慨

沒跑資工營,少了許多負擔,也因此我才能在大家忙不過來之時,還大喇喇地玩遊戲。25學分的確不少,但對我而言,還不至於沉重。也許別人修的課不比我多,但資工營加上雜七雜八的活動,時間要來得緊湊。


有時候在心裡想,明知自己應付不過來,為什麼還要跑這麼多活動呢?雖然這麼想,多少還是會羨慕的。

從活動學到的東西,經常多過於從課業上學得的!

最近看同學三不五時就要開會,還有不少作業要做,心裡鬆了一口氣。但回過頭看看自己,是不是過得太悠哉了呢?

早上出門,總是要八九點才能回寢室好好休息,但從八點到十二點,時間還是很多的。加上假日很少回家,充分利用的話,不用擔心事情做不完。而打工,網管平常沒什麼事做;計中系統組事情雖然多了點,但還不至於忙不過來。開學時的顧慮,是多餘的。

該說我善於管理時間嗎?從某方面來說,我的確很會利用時間。也因此在我習慣這生活節奏時,時間又多了!

如果不找點事做的話,會怠惰的!

「悠閒時總是想多找點事做,但一旦忙碌又抱怨事情太多」

人,就是這麼矛盾阿!

星期三, 4月 25, 2007

微積分

歷經兩小時的戰鬥後,一股清涼湧上心頭,彷彿在炎炎夏日至小溪裡玩耍,多麼舒坦,多麼暢快阿!


幾分鐘前,我正為了完整的證明狂飆,為了算不出的積分發愁。那緊張感,不容一絲的分神,不容一毫的猶豫。果斷,才有勝機!

現在,只留下那淡淡的灰、那淺淺的白。其餘的,被一股旋風襲捲而去,發散至無窮。

一切,煙消雲散。

微積?維基?危機?

哭了 ><"

sec3次方的積分...

有種莫名的悔恨阿!


「早知如此,何必當初?」


---------------------------

老實說,若無計算錯誤的話,基本上會有八十分,而另外兩題做到一半,積分做不出來的,老師也會部分給分。也就是說,在理想狀況下,九十分是有可能的!

如果作業都有親自做且弄懂的話,恭喜你,你已經及格了!

計算上也許麻煩了點,但整體上,題目並不難。

最後一題只要懂數學歸納法,再證出遞增且有上界就 KO了。

星期二, 4月 24, 2007

ACM 10428

今天碰到三明治學長,就順道問 10428 The Roots 怎麼解比較好。
再聽過他的說明後,我決定採用牛頓的逼近法。

剛好計概課老師失蹤(出國去了吧..),助教要我們去電腦教室自行練習,就趁機寫了 10428。

牛頓法不同於先前嘗試過的勘根定理,Coding上漂亮很多。一開始根的判斷方式是小於10的-10次方,但結果卻是 TLE。後來改成 10的-8次方後,出現令人難以至信的 Accept ^^

哈~

星期一, 4月 23, 2007

一些想法 - 朋友篇

一個值得談心的朋友,是我夢寐以求的。

我不善於應對,因此我人際不廣,朋友不多;我珍惜每一位朋友,卻換不到同等的重視;我想過得充實,卻找不到相同坐息、相同態度的朋友伴隨。

所以,我獨孤。

我總是因朋友而喜,卻又經常因朋友而悲。一點小改變,就足以翻騰我的內心。

「越是在意,越會受傷」,不得不認同這句話。

但,還是快樂,因為生活上總是有那麼多趣事!

一些想法 - 學習篇

大學的確很悠閒,宿舍生活總是讓人玩得忘了時間。一旦考試來臨,生活重心頓時傾向讀書。

我很不喜歡這樣,卻又難以百分之百做到。當考試將臨之際,誰不埋首書堆呢?

大學不單單是讀書的環境,他更是一個小型社會,在人與人的互動中,學習人際關係、友情、以及愛情。系上、社團大大小小的活動,提供了學習參與策劃,擔任工作人員的機會。而打工也是另一種學習的管道。

大學相當自由,且多元化。對大學生而言,讀書是本位,卻不是唯一的重心。

我讀書重視融會貫通,而不是反覆練習;當周遭的人忙著演練習題時,我卻如平常般悠閒;我不那麼善於考試,但概念上總能駕輕就熟。

這就是我讀書的調調。