版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
函數(shù)調(diào)用概述函數(shù)的定義函數(shù)參數(shù)和函數(shù)值函數(shù)的調(diào)用局部變量和全局變量問題引入:
假設(shè)一個年級有20個班,每個班10位同學(xué),要求編寫一個程序完成計算每個班的平均分和最高分。1、編寫函數(shù)專門完成計算10位同學(xué)的平均分和最高分;2、調(diào)用20次該函數(shù)即可完成這20個班的平均分和最高分。#include<stdio.h>intmax(intx,inty){intz;z=x>y?x∶y;
return(z);}intmain(){inta,b,c;
scanf(”%d,%d”,&a,&b);
c=max(a,b);
printf(“Maxis%d”,c);}main函數(shù)23abcmax函數(shù)xyz2333c=max(a,b);概述1、一個C程序可以分為若干個函數(shù);2、每個程序有且只能有一個主函數(shù)(main),其他函數(shù)都是子函數(shù);3、子函數(shù)可以互相調(diào)用,但主函數(shù)不能被調(diào)用;4、一個C源程序由一個或多個文件構(gòu)成,一個源程序文件是一個編譯單位。說明:1、C程序的執(zhí)行從main函數(shù)開始,調(diào)用其他函數(shù)后仍回到main函數(shù),程序在main函數(shù)結(jié)束時結(jié)束;2、所有子函數(shù)都是平行的,任何子函數(shù)都不屬于其他函數(shù);3、從用戶的角度看,函數(shù)可分為標(biāo)準(zhǔn)函數(shù)和自定義函數(shù);4、從函數(shù)形式看,可分為無參數(shù)函數(shù)和有參數(shù)函數(shù)。#include<stdio.h>intprintstar(){printf("*******\n");}intprint_message(){printf("Howdoyoudo!\n");}intmain(){printstar();
print_message();
printstar();
}函數(shù)定義的一般形式函數(shù)定義的一般形式:
類型說明函數(shù)名([形式參數(shù)說明]){
函數(shù)體
}形式參數(shù)說明方法:
類型說明變量名[,類型說明變量名]…#include<stdio.h>intmax(intx,inty)
{intz;z=x>y?x∶y;
return(z);}intmain(){inta,b,c;
scanf(”%d,%d”,&a,&b);
c=max(a,b);
printf(“Maxis%d”,c);}2,3Maxis31)無參函數(shù)的定義形式
類型說明函數(shù)名()
{函數(shù)體}2)有參函數(shù)的定義形式
類型說明函數(shù)名(形式參數(shù)說明)
{函數(shù)體}3)空函數(shù)的定義形式
類型說明函數(shù)名([形式參數(shù)說明])
{}說明:1)一般情況下,函數(shù)體由兩部分組成:
{[局部變量說明]
語句
}intmax(intx,inty)
{intz;z=x>y?x∶y;
return(z);}說明:2)局部變量:函數(shù)體內(nèi)定義的變量。其有效范圍僅限于所在的函數(shù)內(nèi)部,離開函數(shù)體則無意義。intmax(intx,inty)
{intz;z=x>y?x∶y;
return(z);}函數(shù)參數(shù)和函數(shù)的值#include<stdio.h>intmax(intx,inty){intz;z=x>y?x∶y;
return(z);}intmain(){inta,b,c;
scanf(”%d,%d”,&a,&b);c=max(a,b);
printf(“Maxis%d”,c);}
各函數(shù)間的信息的往來是由參數(shù)傳遞和返回語句實(shí)現(xiàn)。一、形式參數(shù)和實(shí)際參數(shù)函數(shù)參數(shù):用于函數(shù)間數(shù)據(jù)的傳遞形式參數(shù):定義函數(shù)時使用的參數(shù)實(shí)際參數(shù):引用函數(shù)時使用的參數(shù)函數(shù)max有兩個形式參數(shù)x和y,形參x和y只在函數(shù)max中使用。a和b是主函數(shù)中定義的變量,main函數(shù)調(diào)用函數(shù)max,a和b為函數(shù)max的實(shí)參。說明:1)定義函數(shù)時,必須說明形參的類型,形參只能是變量或數(shù)組;2)函數(shù)被調(diào)用前,形參不占用內(nèi)存;函數(shù)調(diào)用結(jié)束后,形參所占用的內(nèi)存也將被回收;intmax(intx,inty)
{intz;z=x>y?x:y;
return(z);}說明:3)實(shí)參可以是常量、變量或表達(dá)式;4)實(shí)參與形參的類型應(yīng)相同或賦值兼容。字符型和整型可以互相匹配;5)C語言中實(shí)參對形參的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞。它僅由參數(shù)的對應(yīng)位置確定,與名字無關(guān)。intmain(){inta,b,c;
scanf(”%d,%d”,&a,&b);
c=max(a,b);
printf(“Maxis%d”,c);}intmax(intx,inty){intz;z=x>y?x:y;
return(z);}#include<stdio.h>intmax(intb,inta)
{intc;
c=b>a?b∶a;
return(c);}intmain(){inta,b,c;
scanf(”%d,%d”,&a,&b);
c=max(a,b);
printf(“Maxis%d”,c);}main函數(shù)23abcmax函數(shù)bac2333例:讀程序,寫出運(yùn)行結(jié)果#include<stdio.h>intsum(inta,intb){a=a+b;b=a+b;returna;}intmain(){inta=1,b=3,c;c=sum(a,b);printf(“Sumof%d,%dis%d\n”,a,b,c);}Sumof1,3is4main函數(shù)13abcsum函數(shù)ab13447二、函數(shù)的返回值1)返回函數(shù)值的方法函數(shù)的返回值也就是函數(shù)值,是一個確定的值。如果一個函數(shù)有返回值,就必須使用return語句;一個函數(shù)中可以有一個以上的return語句,但不論執(zhí)行哪個return都將結(jié)束函數(shù)的調(diào)用返回主調(diào)函數(shù)。return語句中的括號可以省略;return后面的值可以是一個表達(dá)式。#include<stdio.h>intmax(intx,inty)
{if(x>y)returnx;
returny;}intmain(){inta,b,c;
scanf(”%d,%d”,&a,&b);
c=max(a,b);
printf(“Maxis%d”,c);}return(x>y?x:y);2)函數(shù)值的類型函數(shù)的類型即函數(shù)值的類型。如函數(shù)max是int型的也就是函數(shù)值是int型的;intmax(intx,inty)
{intz;z=x>y?x∶y;
return(z);}2)函數(shù)值的類型省略了類型說明的函數(shù)是int型的;max(intx,inty)
{intz;z=x>y?x∶y;
return(z);}2)函數(shù)值的類型return語句中表達(dá)式的值一般應(yīng)與函數(shù)類型一致;如果不一致,則需要進(jìn)行類型轉(zhuǎn)換,只有數(shù)值型數(shù)據(jù)可以進(jìn)行自動類型轉(zhuǎn)換,以函數(shù)類型為準(zhǔn)。floatmax(intx,inty)
{intz;z=x>y?x∶y;
return(z);}3)不需要返回值的函數(shù)如果函數(shù)中沒有使用return語句,函數(shù)返回的是一個不確定的數(shù)值;如果一個函數(shù)不需要返回值(表示一個過程),可以用int做類型說明;如果一個函數(shù)被聲明為int類型,就不允許再引用它的返回值#include<stdio.h>intprintstar(){printf("*******\n");}intprint_message(){printf("Howdoyoudo!\n");}intmain(){printstar();
print_message();
printstar();
}函數(shù)的調(diào)用一、函數(shù)調(diào)用的一般形式函數(shù)名(實(shí)參表列)說明:如果調(diào)用無參函數(shù),實(shí)參表列可以忽略,但括號不能省;實(shí)參的個數(shù)和形參一般相等;實(shí)參與形參的類型一一對應(yīng),必要時使用類型轉(zhuǎn)換。c=max(a,b);#include<stdio.h>intmax(intx,inty)
{intz;z=x>y?x∶y;
return(z);}intmain(){inta,b,c;
scanf(”%d,%d”,&a,&b);
c=max(a,b);
printf(“Maxis%d”,c);}floatmax(floatx,floaty)
{floatz;z=x>y?x∶y;
return(z);}二、函數(shù)調(diào)用的方式1)函數(shù)語句形式為:函數(shù)名(實(shí)參表列);如:printmessage();printf(“%d”,p);說明:這種方式不要求函數(shù)帶回返回值,函數(shù)僅完成一定的操作。2)函數(shù)表達(dá)式函數(shù)的返回值參與運(yùn)算。如:m=max(a,b);m=3*max(a,b);三、函數(shù)調(diào)用的執(zhí)行過程1)按從右向左的順序,計算實(shí)參中各表達(dá)式的值;2)按照位置,將實(shí)參的值一一對應(yīng)地傳送給形參;3)執(zhí)行被調(diào)用函數(shù);4)當(dāng)遇到return(表達(dá)式)語句時,計算表達(dá)式的值,并返回主調(diào)函數(shù)。x=-1.200000,iabs(x)=2.000000四、函數(shù)的原形說明在程序中調(diào)用函數(shù)需滿足以下條件:1)被調(diào)函數(shù)必須存在,且遵循“先定義后使用”的原則;2)如果被調(diào)函數(shù)的定義在主調(diào)函數(shù)之后(位置),可以先給出原形說明。原形說明的形式為:類型說明函數(shù)名(參數(shù)類型,參數(shù)類型,…);#include<stdio.h>floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;/*函數(shù)體*/z=x+y;
return(z);}intmain(){
floata,b,c;
scanf("%f,%f",&a,&b);
c=add(a,b);printf("sumis%f\n",c);}#include<stdio.h>intmain(){floatadd(floatx,floaty);/*函數(shù)聲明*/
floata,b,c;
scanf("%f,%f",&a,&b);
c=add(a,b);printf("sumis%f\n",c);}floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;/*函數(shù)體*/z=x+y;
return(z);}floatfac(intk)
{floatt=1;inti;for(i=1;i<=k;i++)t=t*i;returnt;}intmain(){floatc;intm,n;m=3;n=2;c=fac(m)*fac(n);printf(“c=%f\n”,c);}函數(shù)的嵌套調(diào)用嵌套調(diào)用是指在一個函數(shù)的函數(shù)體中又調(diào)用了其他函數(shù)。例:編寫求的程序。分析:重復(fù)三次求階乘運(yùn)算,只是每次的值不同。將求階乘的過程編成一個函數(shù)fac,以不同的參數(shù)值k來調(diào)用函數(shù)。inputm,n:588!/(5!*(8-5)!)=56數(shù)組作為函數(shù)的參數(shù)一、數(shù)組元素做函數(shù)實(shí)參與變量做實(shí)參一樣,數(shù)組元素做實(shí)參是“值傳遞”。例:求10個任意整數(shù)中的最大數(shù)。9085ma[1]m=a[0];9092ma[2]9295ma[3]…….9598ma[9]m=max(m,a[1]);m=max(m,a[2]);m=max(m,a[3]);m=max(m,a[9]);#include<stdio.h>intmax(intx,inty){return(x>y?x:y);}intmain(){inta[10],i,m;printf(“Enter10integer:\n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);
m=a[0];for(i=1;i<10;i++)m=max(m,a[i]);printf(“Maxis%d”,m);}二、一維數(shù)組與函數(shù)參數(shù)
若函數(shù)的形參是數(shù)組,對應(yīng)的實(shí)參必須是數(shù)組名。例:求10個任意整數(shù)中的最大數(shù)。#include<stdio.h>intmax(intx[10]){inti,m;m=x[0];for(i=1;i<10;i++)if(m<x[i])m=x[i];returnm;}intmain(){inta[10],i,c;printf(“Enter10integer:\n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);c=max(a);printf(“Maxis%d”,c);}x[0]x[1]x[2]x[3]...x[9]86927752...94a[0]a[1]a[2]a[3]...a[9]首地址說明:1)實(shí)參數(shù)組與形參數(shù)組的類型必須一致。2)用數(shù)組名做參數(shù)時,傳遞的是數(shù)組的首地址,因此形參數(shù)組也可以不指定大小,但需另設(shè)一個參數(shù),傳遞數(shù)組元素的個數(shù)。3)數(shù)組做函數(shù)參數(shù)時,形參數(shù)組和實(shí)參數(shù)組共享同一內(nèi)存單元。
如果形參數(shù)組的元素的值被修改,實(shí)參數(shù)組的元素的值也就被改變了。#include<stdio.h>intmax(intx[],intn){inti,m;m=x[0];for(i=1;i<n;i++)if(m<x[i])m=x[i];returnm;}intmain(){inta[10],i,c;printf(“Enter10integer:\n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);c=max(a,10);
printf(“Maxis%d”,c);}三、多維數(shù)組與函數(shù)參數(shù)1)多維數(shù)組可以作為函數(shù)的參數(shù);2)如果形參是多維數(shù)組,可以省略第一維的大小,但不能省略其他維的大小。判斷以下形式哪些是正確的:intmax(intx[3][5])intmax(intx[][5])intmax(intx[3][])intmax(intx[][])例:有一個3×4的矩陣,求最大元素的值。#include<stdio.h>intmax(intx[][4]){inti,j,m;m=x[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(m<x[i][j])m=x[i][j];returnm;}intmain(){inta[3][4]={{1,3,5,7},{2,4,6,8},{15,13,17,5}};printf(“Maxis%d”,max(a));}局部變量與全局變量一、局部變量在一個函數(shù)內(nèi)部定義的變量1)函數(shù)的形式參數(shù)2)在某個復(fù)合語句中定義的變量說明:局部變量只在自己的范圍內(nèi)有效。一、局部變量存儲類別:自動變量auto:調(diào)用該函數(shù)時,系統(tǒng)會給這些變量分配存儲空間,在函數(shù)調(diào)用結(jié)束時就自動釋放這些存儲空間。靜態(tài)局部變量static:這些局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即占用的存儲單元不釋放,在下一次該函數(shù)調(diào)用時,該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時的值。(對static變量來說,若定義時不賦初值,則數(shù)值型自動賦初值為0)#include<stdio.h>intfun(){staticinta;a+=2;printf(“%d”,a);}intmain(){intcc;for(cc=1;cc<=4;cc++)fun();printf(“\n”);}例:請分析以下問題的輸出結(jié)果cc=1a=0a=2cc=2a=2a=4cc=3a=4a=6cc=4a=6a=8二、全局變量在函數(shù)之外定義的變量(外部變量)是全局變量。全局變量的有效范圍是:從定義變量的位置開始到源文件結(jié)束。在一個函數(shù)中,既可以使用本函數(shù)中的局部變量,也可以使用有效的全局變量。
說明:1、利用全局變量可以在函數(shù)間傳遞數(shù)據(jù)。2、應(yīng)盡量少使用全局變量。3、如果全局變量與局部變量同名,則局部變量優(yōu)先。例:全局變量與局部變量inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;returnc;}intmain(){inta=8;printf(“%d\n”,max(a,b));}8程序舉例例:編寫一個函數(shù)swap用于交換兩個整數(shù)的值。設(shè)a=3,b=4,調(diào)用函數(shù)swap后,得a=4,b=3方法1:#include<stdio.h>intswap(intx,inty){intt;t=x;x=y;y=t;}main(){inta,b;scanf(“%d%d”,&a,&b);swap(a,b);printf(“%d%d”,a,b);}方法2:#include<stdio.h>intx,y;intswap(){intt;t=x;x=y;y=t;}main(){scanf(“%d%d”,&x,&y);swap();printf(“%d%d”,x,y);}函數(shù)的遞歸調(diào)用遞歸調(diào)用是指在調(diào)用一個函數(shù)時又直接或間接地調(diào)用了函數(shù)本身。1)直接遞歸調(diào)用2)間接遞歸調(diào)用注意:這兩種遞歸都無法結(jié)束。因此應(yīng)含有某條件控制遞歸調(diào)用結(jié)束。例:用遞歸法求n!(n>0)intmain(){ intf=1,n,i;scanf(“%d”,&n); if(n>1) {for(i=2;i<=n;i++)f*=i;} elsef=1; printf(“f=%d\n”,f);}#include<stdio.h>intfac(intn){intf;if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}intmain(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);
y=fac(n);printf("%d!=%15d",n,y);}#include<stdio.h>intfac(intn){intf;if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}intmain(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);
y=fac(n);printf("%d!=%15d",n,y);}如果n=5:fac(5)=fac(4)*5=(fac(3)*4)*5=((fac(2)*3)*4)*5=(((fac(1)*2)*3)*4)*5=(((1*2)*3)*4)*5=((2*3)*4)*5=(6*4)*5=24*5=120例:編寫函數(shù)求aN的值,在主函數(shù)中調(diào)用這個函數(shù),并將結(jié)果輸出。函數(shù)定義如下:intpow(inta,intN){……}#include<stdio.h>
intpow(inta,intN)
{if(N==0)return(1);
elsereturn(a*pow(a,N-1));
}intmain(){inta,N;scanf("%d%d",&a,&N);
printf("%d",pow(a,N));}
#include<stdio.h>intpow(inta,intN){intt=1,i;for(i=1;i<=N;i++)t=t*a;returnt;}intmain(){inta,N,s;scanf(“%d,%d”,&a,&N);s=pow(a,N);printf(“結(jié)果為%d”,s);}作業(yè)8:編程實(shí)現(xiàn):通過鍵盤輸入三個實(shí)數(shù)a、b、c,請編寫函數(shù)分別求三個數(shù)之和以及三個數(shù)的最大值。函數(shù)定義如下:floatadd(floatx,floaty,floatz){……}floatmax(floatx,floaty,floatz){……}#include<stdio.h>floatadd(floatx,floaty,floatz){floats;s=x+y+z;returns;}floatmax(floatx,floaty,floatz){floatm;m=x>y?x:y;m=m>z?m:z;returnm;}intmain(){floata,b,c,sum,m;scanf(“%f,%f,%f”,&a,&b,&c);sum=add(a,b,c);m=max(a,b,c);printf(“sum=%f,max=%f”,sum,m);}編寫函數(shù)求已知字符串“ahappyday”中空格的個數(shù),在主函數(shù)中調(diào)用這個函數(shù),并將結(jié)果輸出。函數(shù)定義如下:intfind(chars[],intn){……}#include<stdio.h>intfind(chars[],intn){inti,t=0;for(i=0;i<=n-1;i++)if(s[i]==‘
’)t++;returnt;}intmain(){charstr[12]=“ahappyday”;intnum;num=find(str,12);printf(“%d\n”,num);}1.下面敘述中正確的是
。A.對于用戶自己定義的函數(shù),在使用前必須加以說明B.函數(shù)可以返回一個值,也可以什么值也不返回C.說明函數(shù)時必須明確其參數(shù)類型和返回類型D.空函數(shù)不完成任何操作,所以在程序設(shè)計中沒有用處2.若函數(shù)的類型和return語句中表達(dá)式的類型不一致,則
。A.編譯時出錯B.運(yùn)行時出現(xiàn)不確定結(jié)果C.不會出錯,且返回值的類型以return語句中表達(dá)式的類型為準(zhǔn)D.不會出錯,且返回值的類型以函數(shù)的類型為準(zhǔn)1.以下程序運(yùn)行后,輸出結(jié)果是
。func(inta,intb){intm=0,i=2;i+=m+1;m=i+a+b;return(m);}main(){intk=4,m=1,p;p=func(k,m);printf("%d,",p);p=func(k,m);printf("%d\n",p);}
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 漳州科技職業(yè)學(xué)院《國家教師資格應(yīng)試輔導(dǎo)》2023-2024學(xué)年第一學(xué)期期末試卷
- 張家口學(xué)院《GMDSS綜合業(yè)務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 棗莊科技職業(yè)學(xué)院《新媒體藝術(shù)傳播》2023-2024學(xué)年第一學(xué)期期末試卷
- 云南藝術(shù)學(xué)院《新聞學(xué)概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 云南錫業(yè)職業(yè)技術(shù)學(xué)院《雜草學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 云南農(nóng)業(yè)大學(xué)《森林水文學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度智能家居門窗系統(tǒng)銷售與安裝一體化服務(wù)合同范本4篇
- 云南警官學(xué)院《道路工程和選線設(shè)計》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025版二零二五年度網(wǎng)絡(luò)安全服務(wù)采購合同范本4篇
- 水電工清工承包合同模板
- GB/T 12723-2024單位產(chǎn)品能源消耗限額編制通則
- 2024年廣東省深圳市中考英語試題含解析
- GB/T 16288-2024塑料制品的標(biāo)志
- 麻風(fēng)病防治知識課件
- 建筑工程施工圖設(shè)計文件審查辦法
- 干部職級晉升積分制管理辦法
- 培訓(xùn)機(jī)構(gòu)應(yīng)急預(yù)案6篇
- 北師大版數(shù)學(xué)五年級上冊口算專項練習(xí)
- 應(yīng)急物資智能調(diào)配系統(tǒng)解決方案
- 2025年公務(wù)員考試時政專項測驗100題及答案
- TSG ZF003-2011《爆破片裝置安全技術(shù)監(jiān)察規(guī)程》
評論
0/150
提交評論