自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

程序員考試筆記七:C語言的函數(shù)

企業(yè)動(dòng)態(tài)
程序員考試筆記(連載中)

今天終于都講到C語言比較后的范圍了,"函數(shù)"說是C語言的一切真的沒錯(cuò)(可能有吧,我不知道)。很多書上都說著函數(shù)是C語言根本,就是說函數(shù)是構(gòu)成C語言的??匆韵逻@個(gè)程序:

main()
{
  printf("Hello World";
}

  main()就是C語言里最特殊的一個(gè)函數(shù),是構(gòu)成整個(gè)程序的關(guān)鍵。在C編譯器里首先就是要找出這個(gè)主函數(shù)才開始執(zhí)行編譯,好了,說了一些書上原來的東西?,F(xiàn)在我們就來看看C語言里的函數(shù)究竟是怎么的,如果我們從基礎(chǔ)的說起也沒有什么意思。那么我們就從函數(shù)的另一個(gè)特點(diǎn)說起,"遞歸函數(shù)"相信很多人都知道這個(gè)吧,看過老潭的教程應(yīng)該都知道他經(jīng)典的第一個(gè)遞歸程序吧:

int abc(int n)
{
  int s;
  if(n >1) s= n*abc(n-1);
  else s=1;
  return (s);
}

  從這個(gè)源程序很容易就看出有一個(gè)同自己名字的函數(shù)在里面,所以以后我們看到一個(gè)函數(shù)里面調(diào)用自己就是遞歸函數(shù)了。而且我們看一個(gè)遞歸函數(shù)就主要就是看它是否一個(gè)返回的條件,就好像一條又黑又深的山洞,我們前去探險(xiǎn)如果往到底就一定要回頭,就算是更深的也要返回??!所以我們判定一個(gè)遞歸函數(shù)是否成立也常常是看它的返回條件。至于上面的那個(gè)源程序我也不想多說了,應(yīng)該大家也看得明白。

這里就看看另一個(gè)利用遞歸函數(shù)做的題目吧,就是諾漢塔(老潭的書上也是有的)。

#include
void move(char x,char y)
{
  printf("%c-->%c\n",x,y);
}

void hanoi (int n,char one ,char two,char three)
{
  if(n==1) move (one ,three);
  else
  {
    hanoi (n-1,one,three,two);
    move(one,three);
    hanoi(n-1,two,one,three);
  }
} #p#

main()
{
  int m;
  printf("input the number of diskes:";
  scanf("%d",&m);
  printf("the step to moving %3d diskes:\n",m);
  hanoi(m,'A','B','C');
}
/*運(yùn)行情況如下:
input the number of diskes:3 回車
the step to moving 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C

書上說hanoi(n-1,one,three,two);是把"one"上的n-1個(gè)往"two"上移,接著move(one,three);然后是hanoi(n-1,two,one,three)即把"two"上的n-1個(gè)往"three"上移;
|h(2,1,3,2)|h(1,1,2,3)=>move(1,3) <-----1------
|      | move(1,2) <-----2------
|      |h(1,3,1,2)=>move(3,2) <-----3------
|move(1,3) <-----4------
|
h(3,1,2,3) | |h(1,2,3,1)=>move(2,1) <-----5------
|       h(2,2,1,3)|move(2,3) <-----6-------
|       |h(1,1,2,3)=>move(1,3) <-----7------
|
*/
  注意以上是網(wǎng)上一個(gè)網(wǎng)友寫的,并不是我寫的。諾漢塔最不同的就是它多次調(diào)用自己,所以看起來也比較復(fù)雜一點(diǎn)。當(dāng)時(shí)我在看這條程序的時(shí)候也是看了老半天也看不懂,最好我在網(wǎng)上看到一位朋友說他自己是真的拿了一些碟子自己試著移來看看,后來我也自己試著看,效果真的挺好(我當(dāng)然沒有笨那這么大的碟子啦,用我的光盤寫上大、中、?。?,大家不訪也試試看。加上看了上面這個(gè)圖我也比較清晰了,我要感謝那位網(wǎng)友才行,你們說是嗎?這個(gè)程序一定要自己慢慢去理解它,祝大家早日理解它吧。遞歸函數(shù)部份我因?yàn)椴惶膊荒苷f些什么了,現(xiàn)在來看看函數(shù)的另一個(gè)內(nèi)容吧,就是函數(shù)的參數(shù)調(diào)用。我這里先給出一個(gè)程序先吧:
int abc(int a,int b)
{
  a=a=b; return( a+b );
}

main()
{
  int xy[]={3,5};
  int s;
  s=abc(xy[0],xy[1]);
}
  這里的將xy[0]和xy[1]分別傳入形參里,這里要說的一點(diǎn)就是和其它高級(jí)語言不同的,C語言的函數(shù)調(diào)用都是單向傳遞的。限實(shí)參傳了給形參之后并不會(huì)返回到傳進(jìn)來的實(shí)參的,所以我們務(wù)必記住這點(diǎn)。又如下面一題:
int abc(int a[])
{
  int i,j; 
  /* 排序 */
}
main()
{
  int x[5]={3,5,1,2,4}
  abc(x);
/* 輸出 */
}
  這條源程序可為什么會(huì)改變實(shí)參的數(shù)值呢?老潭的書里說的很明白,說是因?yàn)檫@是地址傳遞,但是我們老師不太認(rèn)同這點(diǎn),他說這個(gè)也應(yīng)該是值傳遞,只不過這個(gè)值是比較特殊的一個(gè)值,是地址,所以傳到形參時(shí)可以通過調(diào)用這個(gè)地址指向的元素而已。如果按老潭的這樣說以下這條程序都叫地址傳遞啦?
int abc(int *p)
{
  *p=10;
}

main()
{
  int a=20,*w;
  w=&a;
  abc(w); /*abc(&a)*/
  printf("%d",a);
}
  指針P也只是一個(gè)值而已,這個(gè)值是地址。如果說這是地址傳遞,那不是應(yīng)該w的地址傳給形參嗎?剩下來的大家自己想想吧。(這里也不能夠說誰對(duì)誰錯(cuò))
  接下來說說變量的存儲(chǔ)類別,其實(shí)這個(gè)知識(shí)點(diǎn)也挺容易理解的,不過可能給C語言太多的這樣的關(guān)系弄的糊涂了。C語言里有變量的類型,變量的存儲(chǔ)類別,變量的全局性還是局部性,是靜態(tài)的還是動(dòng)態(tài)的呢。一切都是C語言變量的東西,我們這回也該好好的結(jié)束了它。(我們大家一齊看書吧)
  很對(duì)不起大家,因?yàn)榻裉煳业难塾悬c(diǎn)問題(可能看電腦看太久了)。所以不要再繼續(xù)和大家進(jìn)一步講講存儲(chǔ)類別,這里有一條源程序大家看看吧,我不行了,我要好好休息一下才行了。
int abc(int a)
{
int i,j;
scanf("%d%d",&i,&j);
if(i>j)
{
int k=1,i=2,j=3;
pirntf("%d\n",i*3);
printf("%d\n",j*10);
}
printf("%d",k);
}

責(zé)任編輯:丁小雨 來源: 51CTO
相關(guān)推薦

2009-01-16 19:49:49

程序員考試數(shù)組指針

2009-01-07 21:03:53

程序員循環(huán)語句

2009-01-05 15:56:00

軟考程序員

2009-01-07 21:00:05

2009-01-19 19:18:44

程序員考試筆記

2009-01-10 23:38:16

程序員考試筆記

2009-01-08 21:21:45

程序員筆記

2014-02-18 15:53:04

2010-01-14 18:07:30

C++語言

2011-05-24 17:20:57

程序員

2010-01-14 13:24:49

CC++語言

2012-11-08 09:49:30

C++Java程序員

2013-12-13 13:38:32

C程序員

2013-04-28 11:03:41

編程語言程序員私有云

2013-04-10 09:44:59

2011-05-19 08:19:50

Lisp

2013-08-20 09:33:59

程序員

2009-03-02 09:40:13

程序員程序語言開發(fā)

2010-12-23 15:45:31

程序員編程

2018-08-10 14:35:42

程序員技術(shù)代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)