查看全部128種考試
軟件水平考試
 考試動態(tài) 報考指南 歷年真題 模擬試題 復(fù)習(xí)資料 心得技巧 專業(yè)英語 技術(shù)文章 軟考論壇 考試用書
 程序員 軟件設(shè)計師 網(wǎng)絡(luò)管理員 網(wǎng)絡(luò)工程師 系統(tǒng)分析師 數(shù)據(jù)庫系統(tǒng)工程師
1
2
3
4
5
6
7
8
9
10
Exam8.com  
【字體: 程序員考試補課筆記-第七天
程序員考試補課筆記-第七天
spks.exam8.com 來源:考試吧(Exam8.com) 更新:2004-12-27 13:28:00 軟件水平考試 考試論壇
今天終于都講到C語言比較后的范圍了,"函數(shù)"說是C語言的一切真的沒錯(可能有吧,我不知道)。很多書上都說著函數(shù)是C語言根本,就是說函數(shù)是構(gòu)成C語言的?匆韵逻@個程序:

main()

{

  printf("Hello World");

}

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

int abc(int n)

{

  int s;

  if(n >1) s= n*abc(n-1);

  else s=1;

  return (s);

}

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

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

#include <stdio.h> 

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); 

  } 

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'); 

/*運行情況如下: 

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

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]分別傳入形參里,這里要說的一點就是和其它高級語言不同的,C語言的函數(shù)調(diào)用都是單向傳遞的。限實參傳了給形參之后并不會返回到傳進來的實參的,所以我們務(wù)必記住這點。又如下面一題: 

int abc(int a[])

{

  int i,j; 

  /* 排序 */

}

main()

{

  int x[5]={3,5,1,2,4}

  abc(x);

/* 輸出 */

}

  這條源程序可為什么會改變實參的數(shù)值呢?老潭的書里說的很明白,說是因為這是地址傳遞,但是我們老師不太認同這點,他說這個也應(yīng)該是值傳遞,只不過這個值是比較特殊的一個值,是地址,所以傳到形參時可以通過調(diào)用這個地址指向的元素而已。如果按老潭的這樣說以下這條程序都叫地址傳遞啦?

int abc(int *p)

{

  *p=10;

}

main()

{

  int a=20,*w;

  w=&a;

  abc(w); /*abc(&a)*/

  printf("%d",a);

}

  指針P也只是一個值而已,這個值是地址。如果說這是地址傳遞,那不是應(yīng)該w的地址傳給形參嗎?剩下來的大家自己想想吧。(這里也不能夠說誰對誰錯)

  接下來說說變量的存儲類別,其實這個知識點也挺容易理解的,不過可能給C語言太多的這樣的關(guān)系弄的糊涂了。C語言里有變量的類型,變量的存儲類別,變量的全局性還是局部性,是靜態(tài)的還是動態(tài)的呢。一切都是C語言變量的東西,我們這回也該好好的結(jié)束了它。(我們大家一齊看書吧)

  很對不起大家,因為今天我的眼有點問題(可能看電腦看太久了)。所以不要再繼續(xù)和大家進一步講講存儲類別,這里有一條源程序大家看看吧,我不行了,我要好好休息一下才行了。

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);

}

轉(zhuǎn)帖于:軟件水平考試_考試吧
文章搜索  
看了本文的網(wǎng)友還看了:
·程序員考試補課筆記-第九天  (2004-12-29 23:59:00)
·程序員考試補課筆記-第八天  (2004-12-27 13:29:00)
·程序員考試補課筆記-第六天  (2004-12-27 13:27:00)
·程序員考試補課筆記-第四天  (2004-12-27 13:26:00)
·程序員考試補課筆記-第三天  (2004-12-26 13:21:00)
·程序員考試補課筆記-第二天  (2004-12-26 13:20:00)
網(wǎng)友評論
昵 稱: *  評 分: 1分 2分 3分 4分 5分
標題:   匿名發(fā)表    (共有條評論)查看全部評論>>
版權(quán)聲明 -------------------------------------------------------------------------------------
  如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系,我們將會及時處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請注明出處。
關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  付款方式  站內(nèi)導(dǎo)航  客服中心  友情鏈接  考試論壇  網(wǎng)站地圖
Copyright © 2004-2008 考試吧軟件水平考試網(wǎng) All Rights Reserved    
中國科學(xué)院研究生院權(quán)威支持(北京) 電 話:010-62168566 傳 真:010-62192699
百度大聯(lián)盟黃金認證  十佳網(wǎng)絡(luò)教育機構(gòu)  經(jīng)營許可證號:京ICP060677