版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計信息與計算機學(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)用的、功能相對獨立完整的程序段。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í)行時一旦遇到return語句,則結(jié)束當(dāng)前函數(shù)的執(zhí)行,返回到主調(diào)函數(shù)的調(diào)用點。
如果函數(shù)執(zhí)行后沒有返回值,則函數(shù)類型標(biāo)識符用“void”,稱為“空類型”或“無類型”。
函數(shù)名必須符合標(biāo)識符的命名規(guī)則。在函數(shù)定義時,函數(shù)體中不能再出現(xiàn)與函數(shù)名同名的其他對象名(如變量名、數(shù)組名等)。函數(shù)首部括號內(nèi)的參數(shù)稱為形式參數(shù)(簡稱形參),形參的值來自函數(shù)調(diào)用時所提供的參數(shù)(稱為實參)值。形參也稱形參變量?!纠?.4】求一個數(shù)的立方。#include<stdio.h>longcub(int
x)/*函數(shù)定義*/
{longy;/*函數(shù)體中的聲明部分*/
y=x*x*x;/*函數(shù)體中的執(zhí)行部分*/
returny;}voidmain(){intnum;longcub_num;
printf("請輸入一個整數(shù):\n");
scanf("%d",&num);
cub_num=cub(num);/*函數(shù)調(diào)用*/
printf("%d的立方值是%1d",num,cub_num);}函數(shù)調(diào)用的過程:①創(chuàng)建形參變量,為每個形參變量建立相應(yīng)的存儲空間。②值傳遞,即將實參的值復(fù)制到對應(yīng)的形參變量中。③執(zhí)行函數(shù)體,執(zhí)行函數(shù)體中的語句。④返回(帶回函數(shù)值、返回調(diào)用點、撤消形參變量)。實參形參7.2函數(shù)參數(shù)和返回值形式參數(shù)和實際參數(shù)
形參:在定義函數(shù)時函數(shù)名后面括號中變量名稱為形式參數(shù),簡稱形參。實參:在主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面括號中的參數(shù)稱為實際參數(shù),簡稱實參。實參形參(1)傳遞數(shù)值(值傳遞方式)(2)傳遞地址(地址傳遞方式)函數(shù)關(guān)于參數(shù)的幾點說明:⑷實參可以是常量、變量或表達(dá)式,并且必須有確定的值;⑶對每個形參必須指明其名字和數(shù)據(jù)類型;⑸實參個數(shù)、類型必須與對應(yīng)的形參一致;⑵形參是函數(shù)的內(nèi)部變量,只在函數(shù)內(nèi)部才有意義;⑹實參對形參的數(shù)據(jù)傳遞是值傳遞,即單向傳遞,只由實參傳遞給形參,反之不可。調(diào)用結(jié)束后,只有形參單元被釋放,實參單元中原來的值不變。⑴形參調(diào)用前不占內(nèi)存單元,調(diào)用時占用,調(diào)用后釋放;1、用函數(shù)調(diào)用完成求一個數(shù)組{12,3,2,4,5,8,9,12,2,40}中的最?。ù?、平均值、總和)元素值
要求:通過函數(shù)調(diào)用實現(xiàn)(計算方法在子函數(shù)中,通過主函數(shù)調(diào)用實現(xiàn))
2、求一個數(shù)的平方(立方);
3、求兩個數(shù)的平方和(平方差);
4、用函數(shù)調(diào)用完成求一個3×3數(shù)組主對角線上所有元素的最大值。(注:主對角線是左上角到右下角的對角線)【例7.5】分析以下程序的運行結(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ù)體執(zhí)行中,對形參變量的任何改變都不會改變實參的值。地址傳遞方式:
函數(shù)調(diào)用時,將實參數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參。其特點是:形參與實參占用同樣的內(nèi)存單元,函數(shù)中對形參值的改變也會改變實參的值。因此函數(shù)參數(shù)的地址傳遞方式可實現(xiàn)調(diào)用函數(shù)與被調(diào)函數(shù)之間的雙向數(shù)據(jù)傳遞。比較典型的地址傳遞方式就是用數(shù)組名作為函數(shù)的參數(shù),在用數(shù)組名作函數(shù)參數(shù)時,不是進(jìn)行值的傳送,因為實際上形參數(shù)組并不存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。實際上是形參數(shù)組和實參數(shù)組為同一數(shù)組,共同擁有同一段內(nèi)存空間?!纠?.6】一個一維數(shù)組score內(nèi)放10個學(xué)生成績,用一個函數(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個學(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ù)組名,array是形參數(shù)組名。②在被調(diào)用函數(shù)average中聲明了形參數(shù)組的大小是10,其實指定其大小不起作用,形參數(shù)組可以不指定大小,在定義數(shù)組時可以只在數(shù)組名后跟一個空的方括號。因為C語言編譯系統(tǒng)對形參數(shù)組大小不做檢查,只是將實參數(shù)組的首地址傳給形參數(shù)組,因此形參數(shù)組名獲得了實參數(shù)組的首元素的地址。7.2.2函數(shù)的返回值return語句的一般形式:①return;②return表達(dá)式;或return(表達(dá)式);例如:下面是3個函數(shù)的首行:intmax(floata,floatb)/*函數(shù)值為整型*/charletter(charc1,charc2)/*函數(shù)值為字符型*/doublemin(inty,inty)/*函數(shù)值為雙精度型*/【例7.8】調(diào)用函數(shù)返回兩個數(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ù)名(實參表列)
如果是調(diào)用無參函數(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)用時,檢查調(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)用一個函數(shù)的過程中又調(diào)用另一個函數(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)用:一個函數(shù)直接或間接地調(diào)用此函數(shù)本身。
7.4.2函數(shù)的遞歸調(diào)用用遞歸求解問題的過程分為兩個階段: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】用遞歸方法計算n!longjc(intn){longt;if(n<0)
printf(“n<0,輸入數(shù)據(jù)錯!”);elseif(n==0||n==1)return1;elsereturnn*jc(n-1);}計算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ù)錯!”);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個人做在一起,問第5個人多大歲數(shù)?他說比第4個人大3歲。問第4個人多大歲數(shù)?他說比第3個人大3歲。問第3個人多大歲數(shù)?他說比第2個人大3歲。問第2個人多大歲數(shù)?他說比第1個人大3歲。最后問第1個人,他說自已是20歲。請問第5個人多大?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個人是:%d歲”,z;);}使用遞歸調(diào)用,最關(guā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】編寫一個函數(shù),求兩個數(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);}注意:因為函數(shù)值只能有一個,所以當(dāng)需要通過函數(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對該變量做聲明,表示該變量是一個已經(jīng)定義的全局變量。當(dāng)全局變量與局部變量同名時,在局部變量的作用范圍內(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)用時的現(xiàn)場保護(hù)和返回地址等1.靜態(tài)存儲方式:在程序運行期間由系統(tǒng)分配固定的存儲空間的方式,在靜態(tài)存儲區(qū)分配內(nèi)存的變量,直到整個程序運行結(jié)束時才釋放內(nèi)存。
2.動態(tài)存儲方式:指在程序運行期間根據(jù)需要由系統(tǒng)動態(tài)分配存儲空間的方式,在動態(tài)存儲區(qū)分配內(nèi)存的變量,當(dāng)函數(shù)調(diào)用結(jié)束或復(fù)合語句結(jié)束時,立即釋放內(nèi)存空間。
變量的存儲類別:變量的存儲類別有:auto自動型:(缺省的都是auto型)
static靜態(tài)型register寄存器型extern外部型:一、auto變量(自動變量)分配內(nèi)存位置:動態(tài)存儲區(qū)生存期:需要時分配空間,不需要時被撤銷;二、static變量(靜態(tài)變量)靜態(tài)型變量可分為靜態(tài)局部變量和靜態(tài)全局變量
靜態(tài)局部變量:分配內(nèi)存位置:靜態(tài)存儲區(qū);生存期:在程序運行期間一直存在,直到程序結(jié)束被撤消。初始化:對靜態(tài)局部變量在編譯時賦初值,若沒有賦初值,則系統(tǒng)自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)。使用:只初始化一次,以后每次調(diào)用函數(shù)時不再重新賦初值,都是保留上一次函數(shù)調(diào)用結(jié)束時的值。例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è)計時希望某些全局變量只限于被本文件中的函數(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大米批量訂購協(xié)議規(guī)范(2024年度)
- 齊魯工業(yè)大學(xué)《Java高級程序設(shè)計》2023-2024學(xué)年期末試卷
- 墊資服務(wù)居間協(xié)議2024年
- 福建省福州三牧中學(xué)2024-2025 學(xué)年八年級上學(xué)期期中考試物理學(xué)科試卷(無答案)
- 員工心理健康與企業(yè)績效關(guān)系探討考核試卷
- 2024-2025年茶藝師、茶文化(品鑒及制作)等技能知識考試題庫與答案
- 危機管理與企業(yè)戰(zhàn)略的一致性探討考核試卷
- 2024年福建省安全員A證主要負(fù)責(zé)人證考試題庫
- 合成材料在機械設(shè)備制造中的應(yīng)用考核試卷
- 汽車電動車電池火災(zāi)應(yīng)對考核試卷
- 民用無人機操控員執(zhí)照(CAAC)考試復(fù)習(xí)重點題庫500題(含答案)
- 高中英語外研版 單詞表 選擇性必修4
- 2024年醫(yī)療機構(gòu)醫(yī)療廢物管理規(guī)范考試試題及答案
- 兩彈一星精神(教學(xué)設(shè)計)-2023-2024學(xué)年小學(xué)科學(xué)課后服務(wù)科普課程
- 部編人教版六年級上冊道德與法治全冊知識點考點+典型考題【每課】
- 《第3課 數(shù)據(jù)的價值》參考課件5
- 農(nóng)小蜂-2024年中國花卉產(chǎn)業(yè)數(shù)據(jù)分析簡報
- 智能控制技術(shù)專業(yè)教學(xué)標(biāo)準(zhǔn)調(diào)研報告
- 塑料制品碳足跡核算通則
- 2022年高標(biāo)準(zhǔn)農(nóng)田建設(shè)項目施工組織設(shè)計
- 幼兒園施工組織設(shè)計施工方案
評論
0/150
提交評論