版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章函數(shù)
本章導(dǎo)讀掌握C語言中常見的內(nèi)置函數(shù)理解函數(shù)原型和函數(shù)的返回值熟練掌握自定義函數(shù)的定義和調(diào)用理解變量的作用域理解變量的存儲(chǔ)類型理解參數(shù)傳遞的方式:傳值預(yù)處理指令宏定義條件編譯函數(shù)的優(yōu)點(diǎn)voidmain(){::::::if(x>y)max1=x;elsemax1=y;
if(a>b)max2=a;elsemax2=b:::::}重復(fù)多次的同一計(jì)算類型voidmain(){::::::max1=max(x,y);max2=max(a,b);:::::}intmax(inta,intb){intres;res=a>b?a:b;returnres;}函數(shù)主程序ans函數(shù)可以把相對(duì)獨(dú)立的某個(gè)功能抽象出來,使之成為程序中的一個(gè)獨(dú)立實(shí)體。可以在同一個(gè)程序或其他程序中多次重復(fù)使用函數(shù)的優(yōu)點(diǎn)(1)使程序變得更簡短而清晰;(2)提高了代碼的重用性;(3)有利于程序維護(hù);(4)可以提高程序開發(fā)的效率。常見內(nèi)置函數(shù)內(nèi)置函數(shù)頭文件用途doublesqrt(doublex)math.h計(jì)算x的平方根doublepow(doublex,doubley)計(jì)算x的y次冪doubleceil(doublex)求不小于x的最小整數(shù),并以double形式顯示doublefloor(doublex)求不大于x的最大整數(shù),并以double形式顯示inttoupper(intx)ctype.h如果x為小寫字母,則返回對(duì)應(yīng)的大寫字母inttolower(intx)如果x為大寫字母,則返回對(duì)應(yīng)的小寫字母intrand(void)stdlib.h產(chǎn)生一個(gè)隨機(jī)數(shù)voidexit(intretval)終止程序
函數(shù)的定義與調(diào)用一、定義函數(shù)的定義與調(diào)用二、函數(shù)的調(diào)用調(diào)用形式:函數(shù)名(實(shí)參表)例1intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}main(){inti=2,p;p=f(i,i++);printf("%d",p);}函數(shù)的定義與調(diào)用三、函數(shù)的參數(shù)及傳遞方式形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名。實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式。說明:實(shí)參必須有確定的值,形參必須指定類型,形參與實(shí)參類型一致,個(gè)數(shù)相同,若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換——函數(shù)調(diào)用轉(zhuǎn)換,形參在函數(shù)被調(diào)用前不占內(nèi)存,函數(shù)調(diào)用時(shí)為形參分配內(nèi)存,調(diào)用結(jié)束時(shí)內(nèi)存釋放。函數(shù)的定義與調(diào)用函數(shù)參數(shù)的傳遞方式傳值調(diào)用例2參數(shù)傳遞示例#include<stdio.h>swap(inta,intb){inttemp;temp=a;a=b;b=temp;printf(“inswapfunction\n”);printf("a=%d,\tb=%d\n",a,b);}main(){intx=7,y=11;printf(“inmainfunction,beforeswapped\n”);printf("x=%d,\ty=%d\n",x,y);swap(x,y);printf(“inmainfunction,afterswapped\n”);
printf("x=%d,\ty=%d\n",x,y);}運(yùn)行結(jié)果:inmainfunction,beforeswappedx=7,y=11inswapfunctiona=11,b=7inmainfunction,afterswappedx=7,y=11…內(nèi)存空間mainswapxyab711711本例參數(shù)的傳遞采用了傳遞值調(diào)用的方式。子函數(shù)swap的作用是交換a、b的值,但在調(diào)用函數(shù)main中,x、y的值依然保持不變。這是因?yàn)閭髦嫡{(diào)用僅僅將實(shí)參x、y的值拷貝到swap的形參a、b中,在swap中交換的是形參a、b的值,并未影響到main中相應(yīng)實(shí)參的值。如果希望swap中形參的操作能夠影響到main中實(shí)參的值,可以使用傳地址調(diào)用(見后續(xù)章節(jié))。
函數(shù)的形參與實(shí)參有如下特點(diǎn):(1)形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量;(2)實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值;(3)實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生類型不匹配的錯(cuò)誤;(4)函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。
返回語句:形式:return(表達(dá)式);或return表達(dá)式;或return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù)。說明:(1)函數(shù)至多可以返回一個(gè)值,不能返回多個(gè)值;(2)返回值的數(shù)據(jù)類型必須與函數(shù)原型中返回值的數(shù)據(jù)類型匹配;(3)當(dāng)遇到return語句時(shí),函數(shù)執(zhí)行將終止。程序控制流將立即返回調(diào)用函數(shù)。函數(shù)的返回值函數(shù)的原型對(duì)使用被調(diào)用函數(shù)的要求:(1)必須是已存在的函數(shù);(2)庫函數(shù):#include<*.h>;(3)用戶自定義函數(shù):函數(shù)類型原型說明。函數(shù)原型說明在形式上與函數(shù)頭部類似,最后加一個(gè)分號(hào)。原型說明中參數(shù)表里的參數(shù)名可以不寫(只寫參數(shù)類型)。函數(shù)聲明一般形式:
函數(shù)類型函數(shù)名(形參類型[形參名],…..);或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)。注意:函數(shù)定義與函數(shù)聲明不同。定義是指對(duì)函數(shù)功能的確立,從無到有對(duì)函數(shù)進(jìn)行規(guī)劃,而聲明是對(duì)已經(jīng)存在的函數(shù)進(jìn)行說明并通知給編譯系統(tǒng),便于編譯工作順利完成。例3函數(shù)原型main(){floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}函數(shù)定義與函數(shù)聲明不同。定義是指對(duì)函數(shù)功能的確立,從無到有對(duì)函數(shù)進(jìn)行規(guī)劃,而聲明是對(duì)已經(jīng)存在的函數(shù)進(jìn)行說明并通知給編譯系統(tǒng),便于編譯工作順利完成。
函數(shù)的調(diào)用函數(shù)的調(diào)用方式:嵌套調(diào)用遞歸調(diào)用嵌套調(diào)用從一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)稱為函數(shù)的嵌套調(diào)用
遞歸調(diào)用函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用。遞歸調(diào)用C編譯系統(tǒng)對(duì)遞歸函數(shù)的自調(diào)用次數(shù)沒有限制;每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息。實(shí)際中不是所有的問題都可以采用遞歸調(diào)用的方法。只有滿足下列要求的問題才可使用遞歸調(diào)用方法來解決:能夠?qū)⒃械膯栴}化為一個(gè)新的問題,而新的問題的解決辦法與原有問題的解決辦法相同,按這一原則依次地化分下去,最終化分出來的新的問題可以解決。
遞歸調(diào)用例4求n的階乘。#include<stdio.h>longfac(intn){longf;if(n<0)printf("n<0,dataerror!");elseif(n==0)f=1;elsef=fac(n-1)*n;return(f);}main(){intn;longy;printf("Inputaintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%ld",n,y);}遞歸調(diào)用5!=5*4!?4!=4*3!?3!=3*2!?2!=2*1!!1!=112624120遞推結(jié)束開始回歸遞歸調(diào)用遞歸調(diào)用的過程可分為如下兩個(gè)階段:第一階段稱為“遞推”階段:將原問題不斷化為新問題,逐漸從未知的向已知的方向推測,最終達(dá)到已知的條件,即遞歸結(jié)束條件。第二階段稱為“回歸”階段:該階段是從已知條件出發(fā)。按“遞推”的逆過程,逐一求值回歸,最后到遞推的開始之處,完成遞歸調(diào)用??梢姡盎貧w”的過程是“遞推”的逆過程。遞歸調(diào)用(1)當(dāng)函數(shù)調(diào)用自己時(shí),在內(nèi)存棧中為新的局部變量和參數(shù)分配內(nèi)存,函數(shù)的程序用這些變量和參數(shù)重新運(yùn)行;(2)遞歸調(diào)用的層次越多,同名變量的占用的存儲(chǔ)單元也就越多。一定要記住,每次函數(shù)的調(diào)用,系統(tǒng)都會(huì)為該函數(shù)的變量開辟新的內(nèi)存空間;(3)當(dāng)本次調(diào)用的函數(shù)運(yùn)行結(jié)束時(shí),系統(tǒng)將釋放本次調(diào)用時(shí)所占用的內(nèi)存空間。程序的流程返回到上一層的調(diào)用點(diǎn),同時(shí)取得當(dāng)初進(jìn)入該層時(shí),函數(shù)中的變量和形參所占用的內(nèi)存空間的數(shù)據(jù);(4)所有遞歸問題都可以用非遞歸的方法來解決,但對(duì)于一些比較復(fù)雜的遞歸問題用非遞歸的方法往往使程序變得十分復(fù)雜難以讀懂,而函數(shù)的遞歸調(diào)用在解決這類問題時(shí)能使程序簡潔明了有較好的可讀性;但由于遞歸調(diào)用過程中,系統(tǒng)要為每一層調(diào)用中的變量開辟內(nèi)存空間、要記住每一層調(diào)用后的返回點(diǎn)、要增加許多額外的開銷,因此函數(shù)的遞歸調(diào)用通常會(huì)降低程序的運(yùn)行效率。對(duì)函數(shù)的多次遞歸調(diào)用可能造成堆棧的溢出,不過溢出的可能性不大。遞歸調(diào)用例5打印十進(jìn)制整數(shù)對(duì)應(yīng)的二進(jìn)制碼。方案#1:從最高位開始打印缺點(diǎn):不知道位數(shù)的情況下難以操作方案#2:從最低位開始打印缺點(diǎn):在不緩存中間結(jié)果的情況下打印的順序與實(shí)際順序相反思路:應(yīng)該結(jié)合兩種方案,從最低位開始獲得每一位數(shù)字,利用遞歸機(jī)制中的棧緩存每一位數(shù)字,直到數(shù)字的最高位被獲得,然后從最高位開始順序打印即可。示例:打印a=10的二進(jìn)制碼最低位是:a%2=0將數(shù)右移一位:a=a/2=5最低位是:a%2=1將數(shù)右移一位:a=a/2=2最低位是:a%2=0將數(shù)右移一位:a=a/2=1最低位是:a%2=1將數(shù)右移一位:a=a/2=0a=0時(shí)表示所有的位都已獲得,然后將獲得最低位逆向打印,即得到結(jié)果是1010由此可知,打印一個(gè)整數(shù)的二進(jìn)制可遞歸表示為:P(a)=先執(zhí)行P(a/2),然后執(zhí)行P(a%2)P(a)表示打印整數(shù)a的二進(jìn)制碼用遞歸函數(shù)實(shí)現(xiàn)如下:voidp(intn){if(n>1){p(n/2);p(n%2);}else{printf(“%d”,n);
}}變量的作用域與存儲(chǔ)類型變量的作用域變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象,必須先定義后使用,定義后其作用范圍是受約束的。變量的有效使用范圍就是作用域,其規(guī)則是:每個(gè)變量僅在定義它的語句塊(包含下級(jí)語句塊)內(nèi)有效
變量的作用域與存儲(chǔ)類型變量的作用域與存儲(chǔ)類型變量的屬性包括:操作屬性:變量所持有的數(shù)據(jù)的性質(zhì),又稱數(shù)據(jù)類型;存儲(chǔ)屬性:數(shù)據(jù)在內(nèi)存中的存儲(chǔ)方式,又稱存儲(chǔ)類型。變量定義格式:[存儲(chǔ)類型]數(shù)據(jù)類型變量表;變量除作用范圍受約束外,變量值存在的時(shí)間也受約束,變量不一定在程序執(zhí)行過程中始終存在,即變量有生存期,變量值按(生存期)來分類,變量可分為靜態(tài)存儲(chǔ)變量和動(dòng)態(tài)存儲(chǔ)變量。所謂靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。變量的作用域與存儲(chǔ)類型存儲(chǔ)類型
名稱說明auto自動(dòng)變量局部變量在缺省存儲(chǔ)類型的情況下歸為自動(dòng)變量。register寄存器變量存放在CPU的寄存器中。對(duì)于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量。
static靜態(tài)變量在程序執(zhí)行時(shí)存在,并且只要整個(gè)程序在運(yùn)行,就可以繼續(xù)訪問該變量。extern外部變量作用域是整個(gè)程序,包含該程序的各個(gè)文件。生存期非常長,它在該程序運(yùn)行結(jié)束后,才釋放內(nèi)存。例6靜態(tài)變量使用示例voiddisplay(){ staticintm=0;m++;if(m%5==0)printf(“\n”);elseprintf(“”);}voidmain(){ inti;for(i=0;i<20;i++){printf("%d",i);display();}}輸出:012345678910111213141516171819在display中定義了一個(gè)靜態(tài)的局部變量m用于換行控制,由于靜態(tài)局部變量在整個(gè)程序運(yùn)行期有效,存放于其中的數(shù)據(jù)并不會(huì)因?yàn)閐isplay調(diào)用結(jié)束而釋放,而是一直存在于m中,這是與動(dòng)態(tài)變量不同的地方。
預(yù)處理指令C語言預(yù)處理器是C編譯程序的一部分,它負(fù)責(zé)分析處理幾種特殊的指令,這些指令被稱為預(yù)處理指令。宏定義宏定義語句是將一個(gè)標(biāo)識(shí)符定義為一個(gè)字符串,在程序中出現(xiàn)的標(biāo)識(shí)符在編譯之前被替換為該字符串,這個(gè)過程叫“宏替換”(或宏展開)。宏定義帶參數(shù)的宏定義的展開過程:在程序中如果有帶實(shí)參的宏,則按#define命令行中指定的字符串從左到右進(jìn)行置換。如果串中包含有宏中的形參,則將程序語句中相應(yīng)的實(shí)參(可以是常量、變量或表達(dá)式)代替形參,如果宏定義中的字符串中的字符不是參數(shù)字符,則保留。宏定義(1)對(duì)帶參數(shù)的宏的展開只是將語句中的宏名后面括號(hào)內(nèi)的實(shí)參字符串代替#define命令行中的形參。特別要注意多參數(shù)的情況;(2)在宏定義時(shí),在宏名與帶參數(shù)的括弧之間不應(yīng)加空格,否則將空格以后的字符都作為替代字符串的一部分。宏定義例7宏展開示例#definePI3.1415926#defineS(r)PI*(r)*(r)main(){floata,b,area;a=1;b=2;area=S(a+b);printf(“area
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子制造行業(yè)辦公oa系統(tǒng)解決方案
- 單級(jí)離心泵操作規(guī)程
- 時(shí)尚活動(dòng)主持人聘請(qǐng)合同
- 塑料倉庫租賃協(xié)議
- 地鐵隧道地錨施工合同
- 家電賣場加盟店租賃合同
- 水利水電解約協(xié)議書
- 機(jī)場建設(shè)項(xiàng)目施工合同
- 劇院外墻真石漆施工合同
- 家具店水電路施工合同
- 小學(xué)生書法展覽活動(dòng)方案
- 24春國家開放大學(xué)《金融基礎(chǔ)》形考任務(wù)題庫參考答案
- 鄉(xiāng)鎮(zhèn)平安建設(shè)培訓(xùn)課件
- 外國新聞傳播史 課件 第十八章 埃及的新聞傳播事業(yè)
- 廣東省珠海市2024年春季高考模擬考試數(shù)學(xué)試卷含答案
- 四川航空介紹
- 從銷售到營銷的轉(zhuǎn)變與發(fā)展
- 機(jī)關(guān)食堂食品安全
- 車間監(jiān)控方案
- 家庭教育指導(dǎo)站制度
- 機(jī)務(wù)指導(dǎo)司機(jī)競聘報(bào)告
評(píng)論
0/150
提交評(píng)論