網頁

2013年3月7日 星期四

因為沒效率,所以才要用迴圈

初學程式設計(其實不論初學什麼,都應如此),了解基本觀念之後,讓我們直接進入程式設計的初學核心觀念: 迴圈(loop)。

即使只學了 msgbox 這麼個簡單的指令,也可以專注在迴圈。

這些年來,我教過的程式設計初學者,包含小朋友在內,如果能成功的持續自己學習程式設計,一定都是把迴圈練習到可以寫出有用的程式。迴圈對程式初學者而言,如同換氣對游泳一樣。如果沒有學會迴圈,即使用最寬鬆的標準來看,都不算學會程式設計,是的,基本的程式設計都不算學會。

可以這麼說,迴圈是程式存在的意義,如果你的程式沒有迴圈,在 Excel VBA 裡,很可能表示它是用錄製巨集錄出來的,這種程式對需求變動的抵抗力非常弱、而且幾乎不能處理大量資料。

你寫程式的目的是什麼? 除了心靈快樂之外,不就是想實實在在的提升效率嗎? 如果今天你寫了一個程式,僅能處理一兩筆資料,那直接手動在 Excel 裡做就好了,又何必花時間學寫程式?

函數的內在與長相

函數是一種功能,功能是去做一件事,多數狀況下(不是全部狀況),做一件事要有基本資訊才能做,例如,如果我說,我想吃大餐,基本資訊可能有到哪裡吃、吃些什麼、哪天去吃、跟誰共餐、預算上限...等。這些參與了我吃大餐這件事的基本資訊,在程式語言裡,稱為參數(parameter),一個函數,可以沒有任何參數,也可以不只一個。

請注意這個翻譯,參數,在表達上的有限性,參不一定是數字,如上例,到哪裡吃是文字,吃些什麼是文字,哪天去吃是日期、跟誰共餐是文字、預算上限則是數字。

做一件事,沒有任何參數的狀況雖不多見,但也不是全然沒有。例如我說我很累,現在就想小睡一下,我可以不說在哪裡睡、要睡多久,我就是想立即小睡一下,因為我很累,所以立刻就睡著了,這件事就也做完了,不須任何參數也可以做完。

當我們自己寫 Sub 時,就是在自己定義函數(當然,函數較嚴謹的定義並非如此,但可以先忽略)、自己打造一些該語言沒有的功能。一個程式語言,會先提供它認為多數程式設計師都用得到的基礎建設、基本零件,但卻不可能假設自己知道,世界上所有程式設計師會想設計些什麼程式,因此,到目前為止,沒有一個語言,會先提供好一個叫做 "憤怒鳥" 的暢銷手機遊戲程式,你必須自己寫。

還記得左右括弧嗎? 與 Sub 相同,函數的長相就是這樣:

Function <自己取的函數名稱>(參數 1, 參數 2, 參數 3...)
    (你要寫的程式碼在這裡)
    <自己取的函數名稱> = <某個結果>
End Function

當然,也可以沒有參數(只是不多見),就如同我們之前寫的程式那樣。

與 Sub 的結構一模一樣,只是名稱變成了 Function。

當你使用 Excel VBA 的內建函數時,也是一樣的長相:

left("公分", 1) ==> left 就是函數名稱,"公分" 與 1 就是參數。函數與 Sub 最大的不同點,在於函數有個 "傳回值",例如上述這個 left("公分", 1),傳回值就是 "公"。

函數 = 功能 = 程式

先說,這種論述也許並不嚴謹,但沒關係,大致上是對的,至少對初學者而言是如此。初學者,要專注在幾個重要的基本觀念上,然後,快快樂樂的、持續的學習程式設計。

之前有講到一個什麼什麼的概念,例如取文字的某一碼取日期的所在的年等,這個,就是一種功能,在程式語言裡,稱為函數或函式(function),其實你看括弧裡的英文就很清楚,函數就是一種功能,也是該程式語言的開發者/團隊,先寫好的內建程式,讓使用這個語言的人,可以使用該功能,好比基礎建設、或基本零件一般,不必自己重新再設計一次。因為如果連這些基礎建設都要自己寫,那學習程式語言就會變成一件令人生畏且無趣之事了。