跟siki老師學C 第八天

2021-07-09 15:11:55 字數 4229 閱讀 9754

上一次我們學到方法的到時候說到乙個引數可以是陣列的情況

static

void getarray(int array)

這裡是陣列作為乙個方法的引數,所以叫做陣列引數,還有乙個東西叫做引數陣列:

在陣列引數中,我們在用這個方法的時候需要把我們自己構造的這個陣列傳過去作為引數,而引數陣列則不,它是在呼叫的時候把一組資料放在後面的括號裡,傳遞過去之後,會自動地把這一組資料構造成陣列並使用:

static

void array(int array) //普通陣列引數的方法

static

void array1(params

int array) //運用引數陣列的方法

那麼在使用的時候兩種形式有什麼不同呢?

array(new

int[5] ); //普通陣列引數方法的使用,需要自己構造陣列;

array1(0, 1, 2, 3, 4); //引數陣列方法的使用,不需要自己構造方法,只要填入相應型別的值就可以自動構造出陣列

我們在之前介紹複雜型別的時候說了列舉型別、陣列和結構體,我們說的結構體就是只提到了在結構體中定義不同屬性,那麼既然結構體可以定義屬性,那麼它也可以定義方法,在結構體中定義的方法叫做結構方法,也叫做結構函式。

還是一樣,我們為什麼要使用結構函式呢?

我們為什麼要使用結構體?因為使用結構體的話我們可以在結構體中定義若干個變數,宣告乙個結構體的時候,這若干個變數也都宣告好了,不用我們乙個乙個宣告了。那麼這些變數需要操作,每一次操作我都要寫一遍演算法,那我為什麼不把演算法語句寫在結構體中,直接呼叫結構體中的這個方法呢?

其實這就相當於另外寫乙個方法,對結構體中的變數進行操作,然後返回結果,只不過現在我們這個方法寫在了結構體中而已。

我們來試試:(求直角三角形的斜邊長)

struct getbevel     //計算斜邊的結構體

}static

void main(string args)

上面就是結構方法的用法,其實我們結構體用的相當少,結構體定義在某個命名空間下,只能這個命名空間裡面的程式能用,我們一般用公共類來代替結構體,而結構方法我們也寫在相應的類中,所以直接呼叫就好了。

接下來我們要學習的就是函式的過載。

什麼叫方法或函式的過載呢?

我們知道在定義變數的時候變數名不能相同,否則編譯器無法從多個同名變數中分辨出你要用的是哪個,但是方法可以,方法可以有相同的方法名,那麼編譯器如何去區分方法呢?

那就是方法引數,比如乙個方法傳遞的引數是int型別的,而另乙個同名函式傳遞的引數是double型別的,那麼編譯器就會根據呼叫時傳遞的引數型別去分辨到底呼叫的是哪個方法。

比如:

可以看到,我在上面寫了兩個getbevel()方法,下面在呼叫的時候就顯示「(共2個)」,這表示該方法共有兩個過載。

static void main(string args)

我們看看執行結果:

分別呼叫了兩個方法,這就是過載,同乙個方法名帶上不同的引數,就會呼叫不同的方法,這就是過載。

接下來說的這個東西有些扯淡,至少我看完兩遍沒懂它是什麼意思,有什麼作用。

那就是委託。

委託其實說的是一種型別,與int、string、char都一樣,但是又很特殊,因為其他型別一般都是指向變數,但是委託卻是指向方法。

比如:

int

value=3;

int型別也就這樣用了,暫時還玩不出什麼新花樣,但是委託,呵呵!

mydelegate delegates;   //mydelegate是自己定義的委託型別  delegates是委託變數

delegates = add; //add是乙個方法

你敢信?變數可以等於方法,可以等於方法。。我們之前頂多遇到過變數等於方法。。。的返回值,但是這裡直接等於方法啊!!

別的型別的變數不可以,委託的就沒問題。。真是醉了。

委託型別的變數等於乙個方法後,這個變數就成了乙個方法,我們可以用這個變數去直接呼叫這個方法,因為這個變數已經指向這個方法了,這就是委託的作用:把乙個委託型別的變數指向乙個方法。

說了委託的作用,那麼委託型別是怎麼定義的呢?

看個例項吧:

namespace csharp學習第七課

static

void main(string args)}}

我還是雲裡霧裡的,反正先知道有委託這個東西就好了,以後能用到的話我們再通過實際應用來加深理解!

接下來我們說的就很常見了,而且上次我們遇到乙個問題沒有解決,現在也可以解決了,那就是函式的遞迴呼叫。

遞迴是相對於函式來說的,脫離了函式,遞迴也就無從談起,因為函式實在返回值返回的地方做手腳的。

一般帶有返回值的函式,我們最終返回的是結果,但是用了遞迴的話,返回值就不是最終結果的值了,而是返回該函式參與的運算,因為該運算寫在方法裡,所以出現了在方法裡呼叫該方法的情況。這就叫函式的遞迴呼叫。

比如乙個函式計算的是乙個等於前兩個數字之和:

static int function

(int num)

返回值裡面又出現了該方法。

既然返回值呼叫了自身,那麼這個遞迴迴圈什麼時候才能終止呢?如果不給它條件的話,這就乙個死迴圈,所以要給它終止條件。

static int function

(int num)

if(num==1)

return

function

(num - 1) + function

(num - 2);

}

在主函式中我呼叫這個方法:

function

(40);

這個語句會將function(40)的結果分解為許多function(0)+function(1)的形式相加,最終將2和3代入最終算式算出結果。

以現在cpu的運算速度,這個function(40),還要花費一定的時間才能得到結果,因此遞迴的呼叫在運算時還是比較占用cpu的。

既然現在我們學習了遞迴呼叫了,那麼我們來做一做之前的練習題吧:

兔子繁殖問題。設有一對新生的兔子,從第三個月開始他們每個月都生一對兔子,新生的兔子從第三個月開始又每個月生一對兔子。按此規律,並假定兔子沒有死亡,20個月後共有多少對兔子?要求編寫為控制台程式。

既然我們知道這裡需要用遞迴來實現,那麼我們就要想想演算法,實際上演算法不是很容易想的,像這裡,至少我這麻瓜腦袋想了一天沒想出來。

既然是用到遞迴,那麼不可避免的是要用到公式的。所以我們想不出演算法就去推導遞迴的公式。

第乙個月:f(1)=1;

第二個月:f(2)=1;

第三個月:f(3)=2;

第四個月:f(4)=3;

第五個月:f(5)=5;

第六個月:f(6)=8;

可以推導出f(n)=f(n-1)+f(n-2)。

同樣的,我們的遞迴必須有乙個終止條件,既然是月份,那麼計算肯定是從第乙個月和第二個月開始,而公式的分解最終也就是需要f(1)和f(2)。

這樣一來就很簡單了:

namespace csharp學習第八課

return getrabbit(month-1)+getrabbit(month-2);

}static

void main(string args)}}

因此我們可以總結:遞迴演算法中公式是相當重要的!總結:

1.引數陣列的概念,用法以及與陣列引數的區別;

2.什麼叫結構函式以及結構函式的用法;

3.什麼是函式的過載;

4.什麼叫委託;

5.遞迴的用法以及遞迴最重要的關鍵點(公式);

6.用遞迴解決一般問題的思路;

C 學習第八天

介面 inte ce c 中介面定義的規則 1 介面本身的預設訪問級別為internal,即程式集本身訪問級別 2 介面中方法不能使用任何訪問修飾符 例如 public private internal protected 等修飾。系統自動為其設定為public 3 不能使用virtual修飾 4 ...

開課第八天

開課第八天,今天因為遲到問題被老師訓了,呵呵,說實話是真的感覺前一周有點懶散鬆懈,今天被訓之後又感覺到了緊迫感,嗯,堅持就是勝利,加油。上午講題,下午講新知識,以下就是本寶寶吸收的新養料 方法 可以被稱作函式,也可以被稱作功能。1 main 是我們學習的第乙個簡單的方法,public static ...

彙編第八天

彙編形式目標 main proc push ebp mov ebp,esp 建立堆疊框架 push offset msg 匯入引數位址 call printf 呼叫函式 xor eax,eax 返回0 pop epb 扯掉框架 ret 0 返回主程式 main endp 結束 1.條件語句 cmp ...