顯示具有 程式設計 新手 教學 標籤的文章。 顯示所有文章
顯示具有 程式設計 新手 教學 標籤的文章。 顯示所有文章

2008年5月3日 星期六

程式設計完全新手教學


最近到了這種時候,總覺得有點閒到爆的感覺,該考的考試也都考完了,剩下的就等成績而已。最近有一些學弟來跟我問關於程式設計的事情,像是OO是什麼阿,完全不會程式設計要怎麼學阿,等等之類的。雖然說我比較想就看看能不能暑假搞一個小團體大家一起來快樂學習,不過老實說在實行上總有一些現實上的問題,像是教室的借用,人數的多寡,程度上的差異等等,因為就算把想要學的人通通都擠在一班,有的人只差在OO不懂,基礎還是OK的,而有些人是根本就還停留在複製貼上的境界,沒辦法這麼做。

於是在某天的妄想下,終於爆出另一種奇異的點子,要不然來寫書好了XXD。這個想法很有趣,雖然對它的完成我並不保持希望,但是嘗試一下有何不妨。

在一開始我想先架構一下最基本的程式流程,用一些比較具體的事物來帶出一整個設計模式。最基本的有 if else if, while, for,一般的程式語言就降了。瞭解了流程設計之後,再來討論所謂的基本資料型態與比較運算子的操作(在這邊基本的資料型態只介紹整數以及字串)。配合著流程設計,我們可以嘗試寫出較有技巧一點的程式碼。接下來則是介紹矩陣的應用。像這樣一步一步把寫程式的必要工具得手,抽像程度逐層提高,配合上大量舉例與實作,以及由真實事物所引申出來的例子,也許能夠真的有辦法也說不定...

在這邊困難度比較高的地方有兩個,一個是舉例,我也曾經用譬喻法來教學過,不過那時候老實說用的真的不怎麼好,沒有達到什麼效果。好的例子不但要能貼近實際生活,還要能引起讀者個共鳴與興趣,這是我不知道目前能不能辦到的。第二個則是簡化的藝術,要讓一個還算會寫程式的人去想像不會寫程式的人的困難點在哪哩, 這是非常有挑戰性的!!有時候因為想要通通教給學的人,反而會不得其所,教的人很累,聽的人一個頭兩個大還是不知道台上在講啥。重點的捨取超重要,一個好的重點可以承先啟後,令人印象深刻。

所以~~~一起來期待吧!!!

(以上有可能是空想....XD)

2008年4月27日 星期日

Ruby初試心得

最近沒事開始玩一些東西,其中一樣就是ACM,一種練習寫程式的好地方,裡面有上萬筆題目可以讓人來打發時間。其中第124題,看了之後覺得可以動手於是開始想要用哪種語言來寫。用C語言的話,我對其字串處理不熟,所以不知道該如何下手好;如果用JAVA應該還不錯,最近也看了一些軟體工程的書,說不定可以派上用場,也許可以用一些高階的資料結構來解這題。不過當我真的要開始下手的時候,遇到了一個我忘記的嚴重問題,我已經忘了java要如何從鍵盤(標準input裝置)去得到輸入的字串。只記得是用串流...然後就忘記了,結果是冏在哪邊。接下來我想VB也是可以OO,字串處理我也OK,標準輸入輸出也很簡單,只是剛開始要我碰真的有很多困難點,很多同義的語法,但是要用一些很奇怪的表示法,讓人難以適應。不過這都還算是小事,最讓我頭痛的是互相參考的類別編譯不能過...阿~~我承認在設計上是有這樣的瑕疵,但是不給過也太過份了,所以就跳槽到最近才開始碰的ruby。

Ruby是全OO的語言,我想應該沒啥問題吧...不過還是有很多問題XXD。一開始遇到的是Ruby沒有介面(Interface)!!很好...這樣設計模式第一條,針對介面而寫程式我就冏了。沒關係,那我就想像有一個介面在那邊,程式碼一樣寫,只不過是少了一個實作介面的步驟。在初步構想下,我是先將題目的概念轉化成一種節點與節點之間的關係,第一行輸入會讓程式將所有元素宣告成一種基礎節點(basenode),然後再經由第二條的條件式,去真的new出節點。而在這裡會產生的實例(Instance)會有兩種:一種是跟順序無關的節點(freenode);一種是被條件限制住的節點(limitnode)。經由程式去判讀條件式,並分別將基礎節點實際產生出節點實例。

基於上述想法,我就開始寫了下述錯誤的程式碼(邏輯上的錯誤)。不過讓我有fu的其實是其中雜湊所帶來的震撼,雜湊很有趣,很方便,可以給程式碼帶來更多的便利性以及高度的抽象化。但是當我正爽的時候,卻發現我要用for each取出其中的元素的時候,資料型態居然不是我當初所放進去的freenode/limitnode,而是array,使得下面的程式碼完全沒辦法跑,因為會有找不到方法的錯誤(因為is_bigger是節點的方法,而array本身沒有),最後才發現原來是雜湊在被call for each的時候會像是先利用call to_a轉換成陣列型態之後再被丟出裡面的元素,而其元素則是包含鍵與其值,也就是[key, value],所以丟出來的東西是array沒錯...當然沒辦法取得我所定義的方法。

我這邊的解法很簡單,取出第二個值就結束了XXD。不過剛剛看了一下hash的方法,應該還有其他的方法可以解,等等試試看^^~這邊就放錯誤的程式碼上來,以便可以觀察錯誤的地方。
以知有錯的地方有:is_bigger的邏輯(含limitnode的實作)、判斷free/limit node的程式區段
錯誤的程式碼