




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計(jì)信息與計(jì)算機(jī)學(xué)院Email:yixuan0820@163.com第7章函數(shù)本章主要內(nèi)容:函數(shù)的定義函數(shù)的調(diào)用函數(shù)的參數(shù)和函數(shù)返回值遞歸函數(shù)變量的作用域和存儲類別7.1函數(shù)的定義C函數(shù)的概念函數(shù):一段可以重復(fù)調(diào)用的、功能相對獨(dú)立完整的程序段。1)庫函數(shù):由C語言系統(tǒng)提供,用戶無須定義,可直接使用。2)用戶自定義函數(shù):由用戶按需要編寫的函數(shù)函數(shù)的定義函數(shù)定義的一般形式為:類型標(biāo)識符函數(shù)名(類型形式參數(shù),類型形式參數(shù),…){
聲明部分執(zhí)行部分}說明:類型標(biāo)識符用來定義函數(shù)類型,即指定函數(shù)返回值的類型。函數(shù)類型應(yīng)根據(jù)具體函數(shù)的功能確定。默認(rèn)類型標(biāo)識符為int類型。函數(shù)值通過return語句返回。函數(shù)執(zhí)行時(shí)一旦遇到return語句,則結(jié)束當(dāng)前函數(shù)的執(zhí)行,返回到主調(diào)函數(shù)的調(diào)用點(diǎn)。
如果函數(shù)執(zhí)行后沒有返回值,則函數(shù)類型標(biāo)識符用“void”,稱為“空類型”或“無類型”。
函數(shù)名必須符合標(biāo)識符的命名規(guī)則。在函數(shù)定義時(shí),函數(shù)體中不能再出現(xiàn)與函數(shù)名同名的其他對象名(如變量名、數(shù)組名等)。函數(shù)首部括號內(nèi)的參數(shù)稱為形式參數(shù)(簡稱形參),形參的值來自函數(shù)調(diào)用時(shí)所提供的參數(shù)(稱為實(shí)參)值。形參也稱形參變量?!纠?.4】求一個(gè)數(shù)的立方。#include<stdio.h>longcub(int
x)/*函數(shù)定義*/
{longy;/*函數(shù)體中的聲明部分*/
y=x*x*x;/*函數(shù)體中的執(zhí)行部分*/
returny;}voidmain(){intnum;longcub_num;
printf("請輸入一個(gè)整數(shù):\n");
scanf("%d",&num);
cub_num=cub(num);/*函數(shù)調(diào)用*/
printf("%d的立方值是%1d",num,cub_num);}函數(shù)調(diào)用的過程:①創(chuàng)建形參變量,為每個(gè)形參變量建立相應(yīng)的存儲空間。②值傳遞,即將實(shí)參的值復(fù)制到對應(yīng)的形參變量中。③執(zhí)行函數(shù)體,執(zhí)行函數(shù)體中的語句。④返回(帶回函數(shù)值、返回調(diào)用點(diǎn)、撤消形參變量)。實(shí)參形參7.2函數(shù)參數(shù)和返回值形式參數(shù)和實(shí)際參數(shù)
形參:在定義函數(shù)時(shí)函數(shù)名后面括號中變量名稱為形式參數(shù),簡稱形參。實(shí)參:在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號中的參數(shù)稱為實(shí)際參數(shù),簡稱實(shí)參。實(shí)參形參(1)傳遞數(shù)值(值傳遞方式)(2)傳遞地址(地址傳遞方式)函數(shù)關(guān)于參數(shù)的幾點(diǎn)說明:⑷實(shí)參可以是常量、變量或表達(dá)式,并且必須有確定的值;⑶對每個(gè)形參必須指明其名字和數(shù)據(jù)類型;⑸實(shí)參個(gè)數(shù)、類型必須與對應(yīng)的形參一致;⑵形參是函數(shù)的內(nèi)部變量,只在函數(shù)內(nèi)部才有意義;⑹實(shí)參對形參的數(shù)據(jù)傳遞是值傳遞,即單向傳遞,只由實(shí)參傳遞給形參,反之不可。調(diào)用結(jié)束后,只有形參單元被釋放,實(shí)參單元中原來的值不變。⑴形參調(diào)用前不占內(nèi)存單元,調(diào)用時(shí)占用,調(diào)用后釋放;1、用函數(shù)調(diào)用完成求一個(gè)數(shù)組{12,3,2,4,5,8,9,12,2,40}中的最小(大、平均值、總和)元素值
要求:通過函數(shù)調(diào)用實(shí)現(xiàn)(計(jì)算方法在子函數(shù)中,通過主函數(shù)調(diào)用實(shí)現(xiàn))
2、求一個(gè)數(shù)的平方(立方);
3、求兩個(gè)數(shù)的平方和(平方差);
4、用函數(shù)調(diào)用完成求一個(gè)3×3數(shù)組主對角線上所有元素的最大值。(注:主對角線是左上角到右下角的對角線)【例7.5】分析以下程序的運(yùn)行結(jié)果。(值傳遞方式)#include<stdio.h>voidswap(float
x,floaty)/*定義交換變量x,y值的函數(shù)*/{floattemp;temp=x;x=y;y=temp;
printf("x=%.2fy=%.2f\n",x,y);}voidmain(){floatx=8.5,y=3.7;swap(x,y);/*調(diào)用swap函數(shù)*/
printf("x=%.2fy=%.2f\n",x,y);}結(jié)論:由于形參與實(shí)參各自占用不同的存儲空間,因此,在函數(shù)體執(zhí)行中,對形參變量的任何改變都不會改變實(shí)參的值。地址傳遞方式:
函數(shù)調(diào)用時(shí),將實(shí)參數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參。其特點(diǎn)是:形參與實(shí)參占用同樣的內(nèi)存單元,函數(shù)中對形參值的改變也會改變實(shí)參的值。因此函數(shù)參數(shù)的地址傳遞方式可實(shí)現(xiàn)調(diào)用函數(shù)與被調(diào)函數(shù)之間的雙向數(shù)據(jù)傳遞。比較典型的地址傳遞方式就是用數(shù)組名作為函數(shù)的參數(shù),在用數(shù)組名作函數(shù)參數(shù)時(shí),不是進(jìn)行值的傳送,因?yàn)閷?shí)際上形參數(shù)組并不存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。實(shí)際上是形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有同一段內(nèi)存空間。【例7.6】一個(gè)一維數(shù)組score內(nèi)放10個(gè)學(xué)生成績,用一個(gè)函數(shù)求平均成績。(地址傳遞方式)#include<stdio.h>floataverage(float
array[10]){inti;floataver,sum=array[0];
for(i=1;i<10;i++)sum=sum+array[i];aver=sum/10;
return(aver);voidmain(){floatscore[10],aver;
inti;
printf("請輸入10個(gè)學(xué)生的成績:\n");
for(i=0;i<10;i++)
scanf("%f",&score[i]);
printf("\n");aver=average(score);
printf("平均成績是%5.2f\n",aver);}
程序說明:①用數(shù)組名作函數(shù)參數(shù),應(yīng)在主調(diào)函數(shù)和被調(diào)用函數(shù)分別定義數(shù)組,其中score是實(shí)參數(shù)組名,array是形參數(shù)組名。②在被調(diào)用函數(shù)average中聲明了形參數(shù)組的大小是10,其實(shí)指定其大小不起作用,形參數(shù)組可以不指定大小,在定義數(shù)組時(shí)可以只在數(shù)組名后跟一個(gè)空的方括號。因?yàn)镃語言編譯系統(tǒng)對形參數(shù)組大小不做檢查,只是將實(shí)參數(shù)組的首地址傳給形參數(shù)組,因此形參數(shù)組名獲得了實(shí)參數(shù)組的首元素的地址。7.2.2函數(shù)的返回值return語句的一般形式:①return;②return表達(dá)式;或return(表達(dá)式);例如:下面是3個(gè)函數(shù)的首行:intmax(floata,floatb)/*函數(shù)值為整型*/charletter(charc1,charc2)/*函數(shù)值為字符型*/doublemin(inty,inty)/*函數(shù)值為雙精度型*/【例7.8】調(diào)用函數(shù)返回兩個(gè)數(shù)中的較大者。#include<stdio.h>intmax(floatx,floaty){floatz;
z=x>y?x:y;
return(z);
}voidmain()
{floata,b;
intc;
scanf("%f,%f",&a,&b);
c=max(a,b);
printf("較大的是%d\n”,c);
}7.3函數(shù)的調(diào)用調(diào)用有參函數(shù)的一般形式:
函數(shù)名(實(shí)參表列)
如果是調(diào)用無參函數(shù),則沒有實(shí)參表列,但括號不能省略。形式如下:
函數(shù)名()
函數(shù)調(diào)用可以有三種方式。①表達(dá)式方式:c=2*max(a,b);②參數(shù)方式:d=max(a,max(b,c))③語句方式:不要求函數(shù)帶回返回值的情況下。7.3.2函數(shù)聲明函數(shù)聲明的目的是通知編譯系統(tǒng)有關(guān)被調(diào)用函數(shù)的一些特性,便于在函數(shù)調(diào)用時(shí),檢查調(diào)用是否正確。
函數(shù)聲明的一般形式如下:
類型標(biāo)識符函數(shù)名(類型參數(shù)名,類型參數(shù)名,…);或
類型標(biāo)識符函數(shù)名(類型,類型,…);
說明:如果被調(diào)函數(shù)定義的位置在主調(diào)函數(shù)之前,主調(diào)函數(shù)中可以省略對被調(diào)函數(shù)的聲明。int
max(int
x,inty){ruturn((x>y)?x:y);}voidmain(){…c=max(a,b);…}voidmain(){…
intmax(intx,inty);c=max(a,b);…}
int
max(int
x,inty){ruturn((x>y)?x:y);}函數(shù)聲明一、嵌套調(diào)用:在調(diào)用一個(gè)函數(shù)的過程中又調(diào)用另一個(gè)函數(shù)。
例如:int
fb(){……}int
fa(){…fb(“…”);…}voidmain(){……x=fa();……}調(diào)用fb函數(shù)調(diào)用fa函數(shù)7.4.1函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用執(zhí)行過程main函數(shù)調(diào)用fa函數(shù)結(jié)束fa函數(shù)調(diào)用fb函數(shù)fb函數(shù)fa函數(shù)結(jié)束fb函數(shù)結(jié)束遞歸調(diào)用:一個(gè)函數(shù)直接或間接地調(diào)用此函數(shù)本身。
7.4.2函數(shù)的遞歸調(diào)用用遞歸求解問題的過程分為兩個(gè)階段:1.遞推階段:將原問題不斷地轉(zhuǎn)化成子問題。逐漸從未知向已知推進(jìn),最終到達(dá)已知解的問題,遞推階段結(jié)束。2.回歸階段:從已知解的問題出發(fā),按照遞推的逆過程,逐一求值回歸,最后到達(dá)遞歸的開始處,結(jié)束回歸階段,獲得問題的解。遞歸調(diào)用對應(yīng)的一般算法:f(x)=終了公式遞歸公式遞歸調(diào)用函數(shù)的一般形式為:類型標(biāo)識符
函數(shù)名(形參列表){……
if(遞歸調(diào)用的終止條件)語句1;
else
語句2;……return返回值}【例7.11】用遞歸方法計(jì)算n!longjc(intn){longt;if(n<0)
printf(“n<0,輸入數(shù)據(jù)錯(cuò)!”);elseif(n==0||n==1)return1;elsereturnn*jc(n-1);}計(jì)算n階乘的數(shù)學(xué)遞歸定義式:#include<stdio.h>voidmain(){longjc(intn);
intn;
printf("請輸入n:\n");
scanf("%d",&n);
printf("%d!=%ld\n",n,jc(n));}longjc(intn){longt;if(n<0)
printf(“n<0,輸入數(shù)據(jù)錯(cuò)!”);elseif(n==0||n==1)t=1;elset=n*jc(n-1);returnt;}對jc函數(shù)的聲明調(diào)用jc函數(shù)程序執(zhí)行順序圖例(假設(shè)n=3)main函數(shù)調(diào)用jc(3)結(jié)束jc(3)函數(shù)3*jc(2)jc(3)結(jié)束jc(2)函數(shù)2*jc(1)jc(2)結(jié)束jc(1)函數(shù)返回1jc(1)結(jié)束遞推遞推遞推回歸回歸回歸返回值1返回值2返回值6例:有5個(gè)人做在一起,問第5個(gè)人多大歲數(shù)?他說比第4個(gè)人大3歲。問第4個(gè)人多大歲數(shù)?他說比第3個(gè)人大3歲。問第3個(gè)人多大歲數(shù)?他說比第2個(gè)人大3歲。問第2個(gè)人多大歲數(shù)?他說比第1個(gè)人大3歲。最后問第1個(gè)人,他說自已是20歲。請問第5個(gè)人多大?age(x)=20x=1age(x-1)+3x>1#include<stdio.h>int
age(intx){
if(x==1)retunr20;elsereturnage(x-1)+3;}voidmain(){
intz;z=age(5);
printf(“第5個(gè)人是:%d歲”,z;);}使用遞歸調(diào)用,最關(guān)鍵的是要確定以下兩點(diǎn):1)確定遞歸的終止條件;2)確定遞歸的形式---即求解的規(guī)律;7.5變量的作用域變量定義的位置不同,使得其作用范圍也不同。全局變量:在函數(shù)外面定義的變量,其作用域從變量定義的位置開始到文件結(jié)束。局部變量::在函數(shù)內(nèi)部定義的變量,其作用域是所定義的函數(shù)。變量inta;
/*定義全局變量,可在main和fun函數(shù)中引用*/voidmain()
{
intfun(intz);函數(shù)聲明;int
x,y;
/*x、y為局部變量,只能在main函數(shù)中引用*/
…}intb;
/*b為全局變量,可在fun中引用*/fun(intz)
/*形參z為局部變量,可在fun函數(shù)中引用*/{
intc;
/*c為局部變量,可在fun函數(shù)中引用*/…}變量的作用域a變量的作用域b【例7.13】編寫一個(gè)函數(shù),求兩個(gè)數(shù)的和與差。#include<stdio.h>
floatadd,diff;
/*全局變量*/voidfun(float
x,floaty){add=x+y;diff=x-y;}voidmain(){floata,b;
scanf("%f%f",&a,&b);
fun(a,b);printf("%.2f%.2f\n",add,diff);}注意:因?yàn)楹瘮?shù)值只能有一個(gè),所以當(dāng)需要通過函數(shù)得到兩個(gè)或多個(gè)值時(shí),就要定義全局變量。voidnum()
{extern
int
x,y;
inta=7,b=5;
x=a-b;
y=a+b;
}int
x,y;void
main()
{
inta=7,b=5;x=a-b;y=a+b;num();}x,y的原作用域
x,y新的作用域如果在全局變量定義位置之前或其他文件中的函數(shù)要引用該全局變量,應(yīng)該在引用之前用關(guān)鍵字extern對該變量做聲明,表示該變量是一個(gè)已經(jīng)定義的全局變量。當(dāng)全局變量與局部變量同名時(shí),在局部變量的作用范圍內(nèi)全局變量不起作用?!纠?.15】全局變量與局部變量同名#include<stdio.h>floatadd=1,diff=1;/*全局變量*/voidfun(float
x,floaty){floatadd,diff;/*局部變量*/add=x+y;diff=x-y;}voidmain(){floata,b;scanf("%f%f",&a,&b);fun(a,b);printf("%.2f%.2f\n",add,diff);}7.6變量的存儲類別程序存儲區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)用戶存儲空間分配示意圖存儲程序代碼全局變量函數(shù)的形參,auto變量,函數(shù)調(diào)用時(shí)的現(xiàn)場保護(hù)和返回地址等1.靜態(tài)存儲方式:在程序運(yùn)行期間由系統(tǒng)分配固定的存儲空間的方式,在靜態(tài)存儲區(qū)分配內(nèi)存的變量,直到整個(gè)程序運(yùn)行結(jié)束時(shí)才釋放內(nèi)存。
2.動態(tài)存儲方式:指在程序運(yùn)行期間根據(jù)需要由系統(tǒng)動態(tài)分配存儲空間的方式,在動態(tài)存儲區(qū)分配內(nèi)存的變量,當(dāng)函數(shù)調(diào)用結(jié)束或復(fù)合語句結(jié)束時(shí),立即釋放內(nèi)存空間。
變量的存儲類別:變量的存儲類別有:auto自動型:(缺省的都是auto型)
static靜態(tài)型register寄存器型extern外部型:一、auto變量(自動變量)分配內(nèi)存位置:動態(tài)存儲區(qū)生存期:需要時(shí)分配空間,不需要時(shí)被撤銷;二、static變量(靜態(tài)變量)靜態(tài)型變量可分為靜態(tài)局部變量和靜態(tài)全局變量
靜態(tài)局部變量:分配內(nèi)存位置:靜態(tài)存儲區(qū);生存期:在程序運(yùn)行期間一直存在,直到程序結(jié)束被撤消。初始化:對靜態(tài)局部變量在編譯時(shí)賦初值,若沒有賦初值,則系統(tǒng)自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)。使用:只初始化一次,以后每次調(diào)用函數(shù)時(shí)不再重新賦初值,都是保留上一次函數(shù)調(diào)用結(jié)束時(shí)的值。例7.16】考察static(靜態(tài))局部變量與auto(自動)變量的區(qū)別。
#include"stdio.h"intfunc1(){staticints=5;/*靜態(tài)局部變量*/s+=1;return(s);}intfunc2(){ints=5;/*局部變量*/s+=1;return(s);}voidmain(){
inti;
for(i=0;i<3;i++)printf("%3d",func1());
printf("\n");
for(i=0;i<3;i++)printf("%3d",func2());}
靜態(tài)全局變量:如果在程序設(shè)計(jì)時(shí)希望某些全局變量只限于被本文件中的函數(shù)引用,而不能被其他文件中的函數(shù)引用,就可以在定義全局變量時(shí)加上static進(jìn)行聲明。3.register寄存器型在CPU的寄存器中分配存儲空間,訪問速度快,并不是在內(nèi)存中分配存儲空間。4.extern外部型用于擴(kuò)展全局變量的作用域。課后練習(xí)和習(xí)題課后習(xí)題:函數(shù)調(diào)用的例子#include<stdio.h>voidmain(){voidprintstar();/*對printstar函數(shù)進(jìn)行聲明*/voidprint_message();/*對print_message函數(shù)進(jìn)行聲明*/
printstar();/*調(diào)用printstar函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC 14496-15:2024/Amd 1:2025 EN Information technology - Coding of audio-visual objects - Part 15: Carriage of network abstraction layer (NAL) unit structured video in t
- 2025年度新能源汽車充電樁安裝承包合同
- 2025年度生物制藥工藝保密協(xié)議
- 2025年血液灌流吸附器項(xiàng)目建議書
- 2025年度海上石油鉆井平臺運(yùn)輸與維護(hù)服務(wù)合同
- 品牌創(chuàng)新過程中的團(tuán)隊(duì)協(xié)作計(jì)劃
- 倉庫退貨管理的改進(jìn)方案計(jì)劃
- 主管工作總結(jié)的績效任務(wù)安排計(jì)劃
- 志愿者活動中的個(gè)人成長計(jì)劃
- 市場營銷活動的經(jīng)驗(yàn)與教訓(xùn)計(jì)劃
- 中國肥胖及代謝疾病外科治療指南(2024版)
- 二年級上冊100以內(nèi)進(jìn)位加法豎式計(jì)算題100道及答案
- 高三英語語法填空專項(xiàng)訓(xùn)練100(附答案)及解析
- 2024年湖南省長沙市中考數(shù)學(xué)試題(含解析)
- 井控培訓(xùn)考試題及答案
- 幼兒園 中班心理健康《我會傾訴》
- 貴州省遵義市數(shù)學(xué)小升初試卷及解答參考(2024-2025學(xué)年)
- 【課件】2024-2025學(xué)年高一上學(xué)期英語開學(xué)第一課課件
- 微積分試卷及規(guī)范標(biāo)準(zhǔn)答案6套
- 專題04 地質(zhì)地貌-備戰(zhàn)2025年高考地理真題題源解密(新高考用)(解析版)
- 【鄉(xiāng)村振興背景下農(nóng)村基層治理問題探究開題報(bào)告(含提綱)3000字】
評論
0/150
提交評論