今天在藍色小舖上回了一位兄台的問題
結果他就加我 msn 了.. =.=b
然後..就開始了一段漫漫的初級程式教學課程...
下面是 msn 上直接剪下來的,有興趣的就請看吧。
某位網路上的仁兄 說:我覺得function很難,可是老師已經教到這裡了
>Lak-Fat on the Beach! 說:function 超簡單,簡單到你想死
安的啦
>某位網路上的仁兄 說:阿....我現在還在迷惘的途中...
>Lak-Fat on the Beach! 說:找不到網頁教,我自己教好了...
實在應該去做家教的我.. =.=b
首先..
有沒有學過數學
>某位網路上的仁兄 說:有
>Lak-Fat on the Beach! 說:f( x )= 2x + 5
f(4) = ?
回答我
>某位網路上的仁兄 說:13
>Lak-Fat on the Beach! 說:ya .. 這個就是函式
f( x ) 是函數的”宣告式”
我問你,用 f 這個函數,你要給他什麼?
>某位網路上的仁兄 說:痾...不太懂
>Lak-Fat on the Beach! 說:
沒關係,我先跟你說我教人的原則,我要求你回答我的問題,不管對不對,但我要求你要有想法。
ok ?
我們繼續...
>某位網路上的仁兄 說:嗯
是X嗎?
>Lak-Fat on the Beach! 說:答對了
>某位網路上的仁兄 說:◎___◎
>Lak-Fat on the Beach! 說:所以你會用 f( n ) 來使用這個函數
再問你
那如果剛才那個函數我用 f( "xxx" ) 會怎樣?
>某位網路上的仁兄 說:會給他XXX吧
>Lak-Fat on the Beach! 說:蛤?
f("xxx") = ?
很迷惑對吧?
>某位網路上的仁兄 說:n
嗯....
>Lak-Fat on the Beach! 說:因為你認為你看的是數學,所以你會很直覺得覺得
f( x )= 2x+5 是很當然的
>某位網路上的仁兄 說:對阿!
>Lak-Fat on the Beach! 說:但,你卻沒想到,其實你在寫這行的時後,你也限制了 x 只能是一個數字
不是嗎?
而程式設計裡面,一個函數,不一定是拿來處理一個數學式而以
>某位網路上的仁兄 說:嗯
>Lak-Fat on the Beach! 說:所以,你要很”正確””詳細”的定義這個函數的”長相”
所以,用剛才的那個式子,你可以定義它成為
f ( int x ) = 2x + 5
告訴要用的人.. x 只能是 int 喔!
>某位網路上的仁兄 說:嗯
>Lak-Fat on the Beach! 說:所以 f (int x) 是宣告式,宣告說我有一個函式,它長這樣
而 f( int x) = 2 x + 5 則是定義式。它定義了這個函數在”做什麼”
>某位網路上的仁兄 說:喔~
>Lak-Fat on the Beach! 說:那我問你.. f ( int x, int y) = 2 x + 5
你覺得這樣對嗎?
>某位網路上的仁兄 說:對吧
>Lak-Fat on the Beach! 說:看仔細一點喔
應該說「不會錯,但怪怪的」.. 為什麼呢?因為你雖然宣告了有 x 跟 y ,, 但是你沒用到 y 對不對?
>某位網路上的仁兄 說:嗯恩
>Lak-Fat on the Beach! 說:那為什麼要定義成這樣?
>某位網路上的仁兄 說:嗯...以後會用到
>Lak-Fat on the Beach! 說:是嗎?
這可以算是一個解,但在你還沒有程式的規畫之前,並不需要想太多...
其實這只是一個誤寫罷了,它不會錯,但卻不需要
再回頭看一下你的程式
>某位網路上的仁兄 說:喔~
嗯
>Lak-Fat on the Beach! 說:int add(int x,int y) // Implementation
{
c=num1+num2;
return ;
}
有沒有覺得那裡怪怪的
>某位網路上的仁兄 說:
int x&int y完全沒有用
>Lak-Fat on the Beach! 說:good job
還有其它的問題,再想想
給你個提示
>某位網路上的仁兄 說:嗯
>Lak-Fat on the Beach! 說:f ( x ) = 2 y + z 這個數學式能用嗎?
>某位網路上的仁兄 說:不能
>Lak-Fat on the Beach! 說:你上面的程式其實同理
不用想太多,初學程式設計的人往往把程式想的很難,很神奇,其實他很簡單
它就是一個邏輯,用你的腦子跑跟用電腦跑的差別而以
>某位網路上的仁兄 說:1num1&num2要放進去(中)
>Lak-Fat on the Beach! 說:可以這麼說,但正確的說法是
我這個函數裡面沒有定義 num1 跟 num2
對吧?
>某位網路上的仁兄 說:嗯恩~
>Lak-Fat on the Beach! 說:所以你這個程式其實應該寫成怎樣?寫出來看看
>某位網路上的仁兄 說:int add(num1,num2) // Implementation
{
c=num1+num2;
return ;
}
等等
int add(num1,num2) // Implementation
{
int num1,num2;
c=num1+num2;
return c ;
}
這樣嗎?
>Lak-Fat on the Beach! 說:good job
再來看看你寫的程式裡,你有沒有覺得有個東西沒有定義?
>某位網路上的仁兄 說:
int c;
>Lak-Fat on the Beach! 說:
good job
你觀念上算是正確的,不過語法上不對
你看看你的程式
>某位網路上的仁兄 說:嗯.......
>Lak-Fat on the Beach! 說:告訴我,你是「宣告式」是長怎樣
>某位網路上的仁兄 說:
add(int num1,int num2)
>Lak-Fat on the Beach! 說:good job ..
這就是對的,所以,重寫你的程式吧
>某位網路上的仁兄 說:我還有一個疑問
>Lak-Fat on the Beach! 說:?
>某位網路上的仁兄 說:我記得老師好像有教說呼叫與宣告的()裡的變數可以不一樣,因為只需要傳遞
學校的老師
>Lak-Fat on the Beach! 說:哈哈,這是使用上的問題,我等下再教到這裡,你先把正確的函數宣告跟定義寫出來
你這個問題三十秒就會解決了,等下再說
>某位網路上的仁兄 說:嗯
>某位網路上的仁兄 說:可是我用static int還需要再自己定億的函數裡再設變數嗎?
>Lak-Fat on the Beach! 說:不用,這是我等下才要講到的
>某位網路上的仁兄 說:喔
>Lak-Fat on the Beach! 說:我們先一步一步來,你先把我現在教的跟你寫的那一整個程式切開
>某位網路上的仁兄 說:int add(num1,num2) // Implementation
{
int num1,num2,c;
c=num1+num2;
return c ;
}
>Lak-Fat on the Beach! 說:先讓自己能夠正確的寫出一個定義跟宣告,跳著學對你不是好事,只會造成你剛才自己宣了 int x int y 卻用不到的結果
錯囉
應該是
>某位網路上的仁兄 說:阿..
>Lak-Fat on the Beach! 說:int add(int num1,num2) // Implementation
{
int c;
c=num1+num2;
return c ;
}
其實這是宣告和定義合一,所以你的宣告式怎麼能跟你的定義長的不一樣呢?
>某位網路上的仁兄 說:喔
>Lak-Fat on the Beach! 說:好,再來談談使用
>某位網路上的仁兄 說:那不需要int num2嗎?
>Lak-Fat on the Beach! 說:要
我少打了
>某位網路上的仁兄 說:喔~
>Lak-Fat on the Beach! 說:good job.. 你出師了..hoho
現在你會宣告了
>某位網路上的仁兄 說:ㄏㄏ
嗯
>Lak-Fat on the Beach! 說:我們來聊使用上面的,我們回到數學的面
f ( x ) = 2 x + 5
c = 8
f ( c )
= ?
>某位網路上的仁兄 說:
21
>Lak-Fat on the Beach! 說:這就是你的老師所謂的”我記得老師好像有教說呼叫與宣告的()裡的變數可以不一樣,因為只需要傳遞”
是你搞錯他的意思,而你也沒有馬上舉手問
這是台灣教育的錯...
你看你用 f ( c ) 就不會覺得怪
>某位網路上的仁兄 說:
不會~
>Lak-Fat on the Beach! 說:可是你宣告的是 f ( x ) 呀?
回到程式上也一樣
>某位網路上的仁兄 說:
喔~
>Lak-Fat on the Beach! 說:你在數學上就知道 x 是指 f 這個函數內使用的
和外面的東西沒關係
但你在寫程式的時後就自然的覺得「喔!這是程式,這應該有什麼特別的意思。」
其實沒有,它就是這麼自然,這麼簡單
所以你在使用 add 的時後
>某位網路上的仁兄 說:
嗯
>Lak-Fat on the Beach! 說:
你要 add( c ) 還是 add( 8 ) 有差別嗎?
只要 c 在前面有先定義好,那就可以很自然的使用它
>某位網路上的仁兄 說:
嗯~
>Lak-Fat on the Beach! 說:所謂的定義,就是 int c = 8
>某位網路上的仁兄 說:嗯恩
>Lak-Fat on the Beach! 說:ok 再回頭看你的程式,你應該發現很多問題了吧?
^^
>某位網路上的仁兄 說:嗯恩~非常多
>Lak-Fat on the Beach! 說:good job
好了,再來談談靜態變數
>某位網路上的仁兄 說:嗯
>Lak-Fat on the Beach! 說:先跟你說一件事,在沒有必要的情況下,不用太常宣告靜態變數
另外的就是...
你大概搞錯全域變數和靜態變數
>某位網路上的仁兄 說:喔~其實我對靜態常數的感覺就是可以廣泛使用
嗯?
>Lak-Fat on the Beach! 說:在這個例子裡你在全域宣告靜態變數,是一個沒有意義的做法
靜態變數就是告訴大家這個變數是一個在這支檔案全域都能找得到的變數
那你已經把它放在全域了,就不用再宣他為靜態了,除非你這支程式有超過二個以上的檔案
>某位網路上的仁兄 說:喔
>Lak-Fat on the Beach! 說:^^
今天先講到這裡吧,給你個功課
>某位網路上的仁兄 說:嗯
>Lak-Fat on the Beach! 說:把你的整支程式改成不用全域變數跟靜態變數
>某位網路上的仁兄 說:阿阿
>Lak-Fat on the Beach! 說:試試看,你會發現不難,而且你的程式其實接近完成了
>某位網路上的仁兄 說:嗯
>Lak-Fat on the Beach! 說:相信我,聽我講跟你自己寫是二回事
>某位網路上的仁兄 說:嗯恩~
>Lak-Fat on the Beach! 說:你不嘗試寫,你會覺得,「疑,聽起來我好像都懂了喔!」
>某位網路上的仁兄 說:嗯恩~
>Lak-Fat on the Beach! 說:但只有實作才能讓自己發現那裡是自己不懂的。
這才是找問題的方法
>某位網路上的仁兄 說:嗯~~多謝
>Lak-Fat on the Beach! 說:實作不是為了別人,是為了讓自己發現自己那裡不會
>某位網路上的仁兄 說:嗯恩~跟數學一樣~^^
站內搜尋
2008/7/30
訂閱:
張貼留言 (Atom)
熱門文章
-
真的只能說,偷懶,的的確確是人類進步的原動力。 上一篇 我們討論到有關於 Handler 和 UI thread 的關係, 這一次,我們介紹更簡單方便的小工具,讓你來更新你的 UI。
-
剛接觸 Android 程式開發的人,往往容易寫出會讓整個程式停下來的 Code, 而大多數的原因其實都很單純,就只是因為你放了loading太重的程式碼在 Main thread 中, 我們可以用很簡單的方法來解決這個問題。
-
由於 C/C++ 語言的特性,許多 API 是必需要利用 Callback function 才能完成作用 在 C 的時代這是很合理也很直覺化的設計,但若將場景拉到 C++ 呢.... 此篇除了介紹 How 之外,也將對 Why 進行簡單的介紹,希望能夠令不知其所以然的人有所...
-
雖然在 Android 裡開 Thread 的機會因為一些其他方便的機制而相對的變少了些, 但依然改變不了它是一個非常重要的 class 的事實。 最近在看的一個和 Android default Gallery3D 有關的 bug 就發現了一個有趣的問題。
-
大約十年前,在台中勤益就讀的時後,修了 8051 的組合語言。 這也是我那時 Implement 的作業之一,雖然沒有什麼特別了不起的功能, 但沒想到當時為了讓同學看得懂,寫了不少的註解,現在看到真是有一種懷念的感覺。
-
今天跟大家分享一下小弟的一個自製軟體 - 忍者相機 。 Market 的網址: https://market.android.com/details?id=com.lak.android.ninja&feature=search_result 主要的特色/包括以下: ...
-
雖然這個功能還沒正式上架 (10/29),但這個功能已經在測試中了! 舒服呀!!
-
因為一些原因,我必需要寫一個動態的 Preference Screen,裡面的某幾個 Preference 需要依 Device 支援的程度,來顯示選項及預設值。 我本來以為這是一個簡單的工作…
-
最近在修改一些前人寫的 Code,越改越是沒力。 看到了一段很爛的計時器寫法,我終於受不了而抓狂了....... 下面分享我個人改寫的版本,適用於 Android, 但經過小修改,應該任何 Java 程式都可以用。
-
最新的 ADT 22 出了,還強制要求 Eclipse 的使用者更新.. 但,我想很多人一更新完,就完全不能 Build code 了吧...真是一場災難。
原作者: 潼恩
回覆刪除張貼時間: 2008-07-29T08:38:43.000-08:00
哦哦,教的很棒耶... 哪時候要開課... 教我這個MIS叛逃生(炸)
原來是這樣,下次我也要上課啦><
回覆刪除=.=+
回覆刪除你也來開課吧,你說的比較像人話。
有來就留個言唄~