站內搜尋

2008/7/30

簡單的程式初級教學-Function

今天在藍色小舖上回了一位兄台的問題
結果他就加我 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! 說:實作不是為了別人,是為了讓自己發現自己那裡不會

>某位網路上的仁兄 說:嗯恩~跟數學一樣~^^

3 則留言:

  1. 原作者: 潼恩
    張貼時間: 2008-07-29T08:38:43.000-08:00
    哦哦,教的很棒耶... 哪時候要開課... 教我這個MIS叛逃生(炸)

    回覆刪除
  2. 原來是這樣,下次我也要上課啦><

    回覆刪除
  3. =.=+
    你也來開課吧,你說的比較像人話。

    有來就留個言唄~

    回覆刪除

熱門文章