




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章函數(shù)教學(xué)目標(biāo)掌握自定義函數(shù)的一般結(jié)構(gòu)及函數(shù)的定義方法;掌握函數(shù)聲明、函數(shù)調(diào)用的一般方法;掌握形參、實(shí)參、函數(shù)原型等重要概念;熟悉數(shù)組作函數(shù)的參數(shù)時(shí)函數(shù)的定義和調(diào)用方法;熟悉函數(shù)嵌套、函數(shù)遞歸的概念;能定義和使用嵌套函數(shù)、遞歸函數(shù);了解局部變量、全局變量和變量的存儲(chǔ)類型的概念;熟悉auto型和static型局部變量的特點(diǎn)和用法。1第7章函數(shù)教學(xué)目標(biāo)1第7章函數(shù)知識(shí)點(diǎn)函數(shù)的定義與調(diào)用;函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞方法;數(shù)組作為函數(shù)參數(shù);函數(shù)的嵌套調(diào)用和遞歸調(diào)用;局部變量與全局變量的作用域;動(dòng)態(tài)存儲(chǔ)變量和靜態(tài)存儲(chǔ)變量的生存期。重點(diǎn):函數(shù)的定義與調(diào)用;函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞方法。難點(diǎn):函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞方法;遞歸函數(shù)的設(shè)計(jì);變量的作用域和生存期。2第7章函數(shù)知識(shí)點(diǎn)27.1函數(shù)概述函數(shù)是構(gòu)成C程序的基本構(gòu)件。C語言的程序是由一個(gè)主函數(shù)或若干個(gè)函數(shù)組成的。但編譯單位是源程序文件,而不是函數(shù)。C程序執(zhí)行是從main函數(shù)(主函數(shù))開始,在main函數(shù)中結(jié)束,不管main函數(shù)的位置如何。所有的函數(shù)獨(dú)立定義,main()函數(shù)可以調(diào)用任意其它函數(shù),其它函數(shù)之間可以相互調(diào)用,但任何函數(shù)都不能調(diào)用main()函數(shù)。37.1函數(shù)概述函數(shù)是構(gòu)成C程序的基本構(gòu)件。C語言的程序是函數(shù)的分類標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供,如printf()自定義函數(shù):由用戶自己定義,解決特定的問題有參函數(shù):主調(diào)函數(shù)與被調(diào)函數(shù)之間有參數(shù)傳遞如printf()無參函數(shù):主調(diào)函數(shù)與被調(diào)函數(shù)之間無參數(shù)傳遞如getchar()有返回值函數(shù):被調(diào)函數(shù)返回一個(gè)值給主調(diào)函數(shù)如getchar()無返回值函數(shù):被調(diào)函數(shù)不帶回值給主調(diào)函數(shù)如printf()4函數(shù)的分類標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供,如printf7.2函數(shù)定義與函數(shù)調(diào)用函數(shù)定義:
函數(shù)調(diào)用:
函數(shù)定義時(shí)函數(shù)名后的括號(hào)中的變量叫形式參數(shù),簡(jiǎn)稱形參
兩個(gè)實(shí)際參數(shù)函數(shù)調(diào)用時(shí)函數(shù)名后的括號(hào)中的參數(shù)叫實(shí)際參數(shù),簡(jiǎn)稱實(shí)參
函數(shù)值兩個(gè)形式參數(shù)57.2函數(shù)定義與函數(shù)調(diào)用函數(shù)定義:函數(shù)調(diào)用:函數(shù)定義一、函數(shù)定義與函數(shù)調(diào)用函數(shù)定義的格式:[函數(shù)類型]函數(shù)名([形參及形參聲明表列]){內(nèi)部變量定義和聲明部分執(zhí)行語句}函數(shù)定義后,并不被執(zhí)行,只有當(dāng)調(diào)用函數(shù)時(shí),程序才轉(zhuǎn)到函數(shù)去執(zhí)行。函數(shù)調(diào)用的格式:函數(shù)名([實(shí)參表列])6一、函數(shù)定義與函數(shù)調(diào)用函數(shù)定義的格式:61.無參無返回值函數(shù)的定義與調(diào)用#include<stdio.h>voidpstar(){ printf("****************\n");}voidmain(){inti;for(i=1;i<=10;i++)pstar();}函數(shù)類型void(“空類型”)表示無返回值
函數(shù)名無參數(shù)函數(shù)定義以語句方式調(diào)用無返回值函數(shù)函數(shù)定義71.無參無返回值函數(shù)的定義與調(diào)用#include<s2.有參無返回值函數(shù)的定義與調(diào)用#include<stdio.h>voidpstar(intn){intk;/*形參在函數(shù)體內(nèi)不能再定義*/for(k=1;k<=n;k++)printf("*");printf("\n");}voidmain(){inti;for(i=1;i<=10;i++)pstar(20);
}形參k
被聲明為int型
函數(shù)定義實(shí)參2082.有參無返回值函數(shù)的定義與調(diào)用#include<s3.有返回值函數(shù)的定義與調(diào)用#include<stdio.h>intmax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);/*將函數(shù)的返回值賦給變量c*/
printf("Maxis%d\n",c);
}int型函數(shù)(int可缺省),表示函數(shù)返回值為整型
函數(shù)定義return后的括號(hào)可以不要
注意:程序可直接寫為:return(x>y?x:y);93.有返回值函數(shù)的定義與調(diào)用#include<std有返回值函數(shù)的定義與調(diào)用上題程序可修改為:#include<stdio.h>intmax(intx,inty){return(x>y?x:y);}voidmain(){inta,b,c;scanf("%d%d",&a,&b);
printf(“Maxis%d\n”,max(a,b));
}將max函數(shù)的返回值作為printf函數(shù)的參數(shù)函數(shù)定義10有返回值函數(shù)的定義與調(diào)用上題程序可修改為:將max函數(shù)的返回二、函數(shù)的參數(shù)一、形式參數(shù)與實(shí)際參數(shù)對(duì)無參函數(shù),形參表列與實(shí)參表列均為空,但括號(hào)不能省略,如fun()。對(duì)有參函數(shù),實(shí)參與形參應(yīng)個(gè)數(shù)相等,順序?qū)?yīng),類型一致或賦值相容。定義函數(shù)時(shí)形參不占用存儲(chǔ)單元,只有在調(diào)用函數(shù)期間才給形參分配存儲(chǔ)單元,并將實(shí)參的值傳遞給形參。函數(shù)調(diào)用結(jié)束,形參所占用存儲(chǔ)單元也被釋放。11二、函數(shù)的參數(shù)一、形式參數(shù)與實(shí)際參數(shù)11函數(shù)的參數(shù)若形參是變量名,實(shí)參可以是常量、變量或表達(dá)式,如函數(shù)調(diào)用max(3,a+b);若形參是數(shù)組名,實(shí)參是數(shù)組名,或者數(shù)組指針。注:實(shí)參對(duì)形參的數(shù)據(jù)傳遞是“單向值傳遞”:實(shí)參的值傳遞給形參,而形參的值不會(huì)傳回給實(shí)參。12函數(shù)的參數(shù)若形參是變量名,實(shí)參可以是常量、變量或表達(dá)式,如函三、函數(shù)的返回值函數(shù)返回值的獲得:由return語句獲得。函數(shù)返回值的類型:取決于函數(shù)的類型。例:floatmax(intx,inty){return(x>y?x:y);}問:函數(shù)返回值是int還是float型?答:float將無返回值的函數(shù)類型定義為void。13三、函數(shù)的返回值函數(shù)返回值的獲得:由return語句獲得四、函數(shù)的調(diào)用方式函數(shù)調(diào)用的格式:函數(shù)名([實(shí)參表列])函數(shù)調(diào)用的三種方式:函數(shù)語句:把函數(shù)調(diào)用作為一個(gè)語句,這種調(diào)用方式不使用函數(shù)的返回值,是無返回值函數(shù)的調(diào)用方式。
如,pstar(20);14四、函數(shù)的調(diào)用方式函數(shù)調(diào)用的格式:函數(shù)名([實(shí)參表列])函數(shù)的調(diào)用方式函數(shù)表達(dá)式:把函數(shù)調(diào)用作為表達(dá)式的一部分,這種調(diào)用方式使用函數(shù)返回的函數(shù)值,是有返回值函數(shù)的調(diào)用方式。
如,c=max(a,b);函數(shù)參數(shù):把函數(shù)調(diào)用作為一個(gè)實(shí)參進(jìn)行函數(shù)調(diào)用,這種調(diào)用方式也要使用函數(shù)的返回函數(shù)值,也是有返回值函數(shù)的調(diào)用方式。
如,printf("Maxis%d\n",max(a,b));15函數(shù)的調(diào)用方式函數(shù)表達(dá)式:把函數(shù)調(diào)用作為表達(dá)式的一部分,這舉例判斷素?cái)?shù)函數(shù)1
(無返回值函數(shù))#include<stdio.h>#include<math.h>voidprime(intm){intj,k;k=sqrt(m);for(j=2;j<=k;j++)if(m%j==0)break;if(j>k)printf("%disaprimenumber\n",m);elseprintf("%disnotaprimenumber\n",m);}main(){intn;scanf("%d",&n);prime(n)}為了明確表示無返回值用void定義函數(shù)類型
16舉例判斷素?cái)?shù)函數(shù)1
(無返回值函數(shù))#include舉例判斷素?cái)?shù)函數(shù)2
(有返回值函數(shù))#include<stdio.h>#include<math.h>prime(intm){intj,k,f;k=sqrt(m);for(j=2;j<=k;j++)if(m%j==0)break;if(j>k)f=1;/*返回1表示m是素?cái)?shù)*/elsef=0;/*返回0表示m不是素?cái)?shù)*/return(f);}voidmain(){intn;scanf("%d",&n);if(prime(n)==1)printf(“%disaprimenumber\n",n);elseprintf("%disnotaprimenumber\n",n);}prime(n)17舉例判斷素?cái)?shù)函數(shù)2
(有返回值函數(shù))#include五、函數(shù)調(diào)用的條件1、被調(diào)函數(shù)是庫函數(shù)或已經(jīng)存在的自定義函數(shù);2、若被調(diào)函數(shù)是庫函數(shù),一般需在文件開頭將其頭文件#include到本文件;3、若被調(diào)函數(shù)是自定義函數(shù),一般應(yīng)在調(diào)用前進(jìn)行函數(shù)原型聲明,聲明的格式是:函數(shù)類型函數(shù)名(形參類型表列);或者:函數(shù)類型函數(shù)名(形參名及其類型表列);舉例:intmax(int,int);
或:intmax(intx,inty);一個(gè)例外:若被調(diào)函數(shù)定義在前、調(diào)用在后,則可不加函數(shù)原型聲明。
18五、函數(shù)調(diào)用的條件1、被調(diào)函數(shù)是庫函數(shù)或已經(jīng)存在的自定義函函數(shù)原型聲明方式1、在主調(diào)函數(shù)內(nèi)部聲明;2、在函數(shù)的外部聲明,一般放在所有函數(shù)定義之前,即文件開頭。19函數(shù)原型聲明方式1、在主調(diào)函數(shù)內(nèi)部聲明;19函數(shù)原型聲明舉例#include<stdio.h>voidmain(){inta,b;floatz;
scanf("%d%d",&a,&b);z=average(a,b);printf("a=%d,b=%d,c=%.2f\n",a,b,z);}floataverage(inta,intb)inta,b;{floatc;c=(a+b)/2.0;return(c);}函數(shù)調(diào)用在前
在主調(diào)函數(shù)內(nèi)部聲明floataverage(int,int);函數(shù)定義在后
20函數(shù)原型聲明舉例#include<stdio.h>函數(shù)調(diào)函數(shù)原型聲明舉例#include<stdio.h>
voidmain(){inta,b;floatz;scanf("%d%d",&a,&b);z=average(a,b);printf("a=%d,b=%d,c=%.2f\n",a,b,z);}floataverage(inta,intb)inta,b;{floatc;c=(a+b)/2.0;return(c);}函數(shù)調(diào)用在前
文件開頭,外部聲明floataverage(int,int);函數(shù)定義在后
21函數(shù)原型聲明舉例#include<stdio.h>函數(shù)調(diào)函數(shù)原型聲明舉例#include<stdio.h>
floataverage(inta,intb){floatc;c=(a+b)/2.0;return(c);}voidmain(){inta,b;floatz;scanf("%d%d",&a,&b);z=average(a,b);printf("a=%d,b=%d,c=%.2f\n",a,b,z);}函數(shù)定義在前函數(shù)定義在前,函數(shù)調(diào)用在后;無需聲明函數(shù)調(diào)用在后
22函數(shù)原型聲明舉例#include<stdio.h>函數(shù)定7.3函數(shù)調(diào)用中的參數(shù)傳遞簡(jiǎn)單變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)237.3函數(shù)調(diào)用中的參數(shù)傳遞簡(jiǎn)單變量作為函數(shù)參數(shù)231、簡(jiǎn)單變量作為函數(shù)參數(shù)若形參是變量名,實(shí)參可以是常量、變量或表達(dá)式。實(shí)參對(duì)形參變量的傳遞是“單向數(shù)值傳遞”:實(shí)參的值傳遞給形參,而形參的值不會(huì)傳回給實(shí)參。改變形參的值不會(huì)使實(shí)參的值發(fā)生變化實(shí)參形參值241、簡(jiǎn)單變量作為函數(shù)參數(shù)若形參是變量名,實(shí)參可以是常量、變量舉例對(duì)兩個(gè)數(shù)按降序排列(1)例:以下程序能實(shí)現(xiàn)a和b兩個(gè)變量的交換嗎?voidswap(intx,inty){intt;t=x;x=y;y=t;}#include<stdio.h>voidmain(){inta,b;scanf(”%d,%d”,&a,&b);if(a<b)swap(a,b);printf(”%d,%d\n”,a,b);}這樣的程序無法實(shí)現(xiàn)a和b兩個(gè)變量的交換!
35abxyt3535325舉例對(duì)兩個(gè)數(shù)按降序排列(1)例:以下程序能實(shí)現(xiàn)a和b兩2、指針變量作為函數(shù)參數(shù)指針作為函數(shù)參數(shù):
形參指針也指向?qū)崊⒅羔標(biāo)傅膯卧?,于是改變形參指針?biāo)竼卧闹?,也就是改變?shí)參指針?biāo)竼卧闹怠V羔橆愋蛯?shí)參指針類型形參地址值262、指針變量作為函數(shù)參數(shù)指針作為函數(shù)參數(shù):指針類型實(shí)參指針舉例對(duì)兩個(gè)數(shù)按降序排列(2)swap(int*p1,int*p2){intt;t=*p1;*p1=*p2;*p2=t;}#include<stdio.h>voidmain(){inta,b;int*pointer1,*pointer2;scanf(”%d,%d”,&a,&b);pointer1=&a;pointer2=&b;if(a<b)swap(pointer1,pointer2);printf(”%d,%d\n”,a,b);}若改變的是形參指針的值而不是形參指針?biāo)竼卧闹?,還能實(shí)現(xiàn)a和b兩個(gè)變量的交換嗎?
35……abp1p2t2000pointer1pointer22000200220022000200253327舉例對(duì)兩個(gè)數(shù)按降序排列(2)swap(int*p1,舉例對(duì)兩個(gè)數(shù)按降序排列(3)swap(int*p1,int*p2){int*t;t=p1;p1=p2;p2=t;}#include<stdio.h>voidmain(){inta,b;int*pointer1,*pointer2;scanf(”%d,%d”,&a,&b);
pointer1=&a;pointer2=&b;
if(a<b)swap(pointer1,pointer2);printf(”%d,%d\n”,a,b);}改變形參指針的值無法實(shí)現(xiàn)a和b兩個(gè)變量的交換!
35……abp1p2t2000pointer1pointer22000200220022000200220022000200028舉例對(duì)兩個(gè)數(shù)按降序排列(3)swap(int*p1,普通變量的指針作函數(shù)參數(shù)小結(jié)欲通過函數(shù)調(diào)用得到n個(gè)要改變的值,主調(diào)函數(shù):設(shè)置n個(gè)普通變量(a1,a2,……)存放n個(gè)要改變的值,并用n個(gè)指針變量(pa1,pa2,……)指向它們;被調(diào)函數(shù):設(shè)置n個(gè)指針變量(p1,p2,……)作為形參,函數(shù)體改變*p1,*p2,……的值;函數(shù)調(diào)用:主調(diào)函數(shù)以pa1,pa2,……為實(shí)參,將a1,a2,……的地址傳給形參p1,p2,……,于是,被調(diào)函數(shù)改變*p1,*p2,……的值實(shí)際上就是改變a1,a2,……的值。因此,函數(shù)調(diào)用結(jié)束,主調(diào)函數(shù)得到改變了的值。29普通變量的指針作函數(shù)參數(shù)小結(jié)欲通過函數(shù)調(diào)用得到n個(gè)要改變3、數(shù)組作為函數(shù)參數(shù)
數(shù)組元素作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)303、數(shù)組作為函數(shù)參數(shù)數(shù)組元素作為函數(shù)參數(shù)30數(shù)組元素作為函數(shù)參數(shù)例7.15:對(duì)應(yīng)元素比較,如果數(shù)組a中的元素比數(shù)組b中元素大的次數(shù)多,則數(shù)組a大于數(shù)組b,反之?dāng)?shù)組b大于數(shù)組a,如果兩數(shù)組元素大于對(duì)方的元素次數(shù)相等,則兩數(shù)組相等。通過調(diào)用large函數(shù)實(shí)現(xiàn):large(intx,inty){intflag;if(x>y)flag=1;elseif(x==y)flag=0;elseflag=-1;return(flag);}31數(shù)組元素作為函數(shù)參數(shù)例7.15:對(duì)應(yīng)元素比較,如果數(shù)舉例判斷兩個(gè)數(shù)值型數(shù)組的大小#include<stdio.h>voidmain(){inta[10],b[10],i,n=0,k=0;for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<10;i++)scanf("%d",&b[i]);for(i=0;i<10;i++)
if(large(a[i],b[i])==1)n++;
elseif(large(a[i],b[i])==-1)k++;if(n>k)printf("aislargerthanb\n");
elseif(n<k)printf("bislargerthana\n");
elseprintf("aisequaltob\n");}數(shù)組元素a[i]、b[i]作實(shí)參
32舉例判斷兩個(gè)數(shù)值型數(shù)組的大小#include<stdi一維數(shù)組名作為函數(shù)參數(shù)形參接收實(shí)參傳遞的數(shù)組首地址,實(shí)際上,C編譯是將形參數(shù)組名作為指針變量來處理的。參數(shù)傳遞:地址值實(shí)參數(shù)組指針形參數(shù)組名或指針變量效果:函數(shù)調(diào)用期間,形參數(shù)組就是實(shí)參數(shù)組。一維數(shù)組名
一維數(shù)組名
一維數(shù)組指針一維數(shù)組指針變量實(shí)參
形參33一維數(shù)組名作為函數(shù)參數(shù)形參接收實(shí)參傳遞的數(shù)組首地址,實(shí)際上,一維數(shù)組名作參數(shù)使用說明實(shí)參數(shù)組與形參數(shù)組類型要一致。實(shí)參數(shù)組和形參數(shù)組大小可以不一致,也可以不指定形參數(shù)組第一維的大小,因?yàn)镃編譯對(duì)形參數(shù)組第一維大小不做檢查,函數(shù)調(diào)用時(shí)不是把實(shí)參數(shù)組的值傳遞給形參數(shù)組,而是把實(shí)參數(shù)組的首地址傳遞給形參數(shù)組,于是形參數(shù)組結(jié)合到實(shí)參數(shù)組所占用的存儲(chǔ)空間。為方便編程,通常另設(shè)一參數(shù)用于傳遞數(shù)組元素的個(gè)數(shù)。
34一維數(shù)組名作參數(shù)使用說明實(shí)參數(shù)組與形參數(shù)組類型要一致。3例7.17編寫函數(shù)統(tǒng)計(jì)一個(gè)一維數(shù)組(10個(gè)元素)中非0元素的個(gè)數(shù)。#include<stdio.h>intsolve(intb[10])/*一維數(shù)組名b作形參*/{intsum=0,i;for(i=0;i<10;i++)if(b[i]!=0)sum++;return(sum);} voidmain(){inta[10],num,i;for(i=0;i<10;i++)scanf("%d",&a[i]);num=solve(a);/*一維數(shù)組名a作實(shí)參*/printf("num=%d\n",num);}35例7.17編寫函數(shù)統(tǒng)計(jì)一個(gè)一維數(shù)組(10個(gè)元素)中非0元例7.17編寫函數(shù)統(tǒng)計(jì)一個(gè)一維數(shù)組(10個(gè)元素)中非0元素的個(gè)數(shù)。#include<stdio.h>intsolve(intb[],intn)/*一維數(shù)組名b作形參*/{intsum=0,i;for(i=0;i<n;i++)if(b[i]!=0)sum++;return(sum);} voidmain(){inta[10],num,i;for(i=0;i<10;i++)scanf("%d",&a[i]);num=solve(a,10);/*一維數(shù)組名a作實(shí)參*/printf("num=%d\n",num);}一維形參數(shù)組的大小通常不指定,另設(shè)一參數(shù)用于傳遞數(shù)組元素的個(gè)數(shù)。
36例7.17編寫函數(shù)統(tǒng)計(jì)一個(gè)一維數(shù)組(10個(gè)元素)中非0元例:編寫函數(shù)將數(shù)組中n個(gè)元素按相反順序存放(1)voidinv(intx[],intn){intt,i,j,m=(n-1)/2;for(i=0;i<=m;i++){j=n-i-1;t=x[i];x[i]=x[j];x[j]=t;}}#include<stdio.h>voidmain(){inti,a[10]={3,7,9,11,0,6,7,5,4,2};printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");
inv(a,10);
printf("Thearrayhasbeeninverted:\n");for(i=0;i<10;i++)printf("%d,",a[i]);}形參和實(shí)參均為一維數(shù)組
37例:編寫函數(shù)將數(shù)組中n個(gè)元素按相反順序存放(1)void方法(2)形參為指針變量,實(shí)參為一維數(shù)組voidinv(int*x,intn)
{intt,*i,*j,m=(n-1)/2;for(i=x,j=x+n-1;i<=x+m;i++,j--){t=*i;*i=*j;*j=t;}}#include<stdio.h>voidmain(){inti,a[10]={3,7,9,11,0,6,7,5,4,2};printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");
inv(a,10);
printf("Thearrayhasbeeninverted:\n");for(i=0;i<10;i++)printf("%d,",a[i]);}38方法(2)形參為指針變量,實(shí)參為一維數(shù)組voidinv(方法(3)形參,實(shí)參均為指針變量
voidinv(int*x,intn)
{intt,*i,*j,m=(n-1)/2;for(i=x,j=x+n-1;i<=x+m;i++,j--){t=*i;*i=*j;*j=t;}}#include<stdio.h>voidmain(){inti,a[10]={3,7,9,11,0,6,7,5,4,2},*p;printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");
p=a;inv(p,10);printf("Thearrayhasbeeninverted:\n");for(i=0;i<10;i++)printf("%d,",a[i]);}39方法(3)形參,實(shí)參均為指針變量voidinv(int方法(4)形參為一維數(shù)組,實(shí)參為指針變量voidinv(intx[],intn){intt,i,j,m=(n-1)/2;for(i=0;i<=m;i++){j=n-i-1;t=x[i];x[i]=x[j];x[j]=t;}}#include<stdio.h>voidmain(){inti,a[10]={3,7,9,11,0,6,7,5,4,2},*p;printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");
p=a;inv(p,10);printf("Thearrayhasbeeninverted:\n");for(i=0;i<10;i++)printf("%d,",a[i]);}40方法(4)形參為一維數(shù)組,實(shí)參為指針變量voidinv(折半(二分)查找折半查找法只能對(duì)有序數(shù)列進(jìn)行查找,方法如下:假設(shè)n個(gè)數(shù)按由小到大的順序存放在數(shù)組a中,兩個(gè)位置指針top、bot分別指向查找范圍的頂部、底部。取查找范圍的中間位置mid=(top+mid)/2,將待查找的數(shù)x與a(mid)進(jìn)行比較,將按以下三種結(jié)果分別處理:(1)x=a(mid):已找到,退出查找;41折半(二分)查找折半查找法只能對(duì)有序數(shù)列進(jìn)行查找,方法如下:折半(二分)查找(2)x<a[mid]:x只可能落在top和mid-1范圍之內(nèi),將查找范圍的底部改為bot=mid-1,頂部top不變;(3)x>a[mid]:x只可能落在mid+1和bot范圍之內(nèi),將查找范圍的頂部改為top=mid+1,底部bot不變。確定新的查找范圍后,重復(fù)以上比較,直到找到或者top>bot,退出循環(huán)。top>bot表明嘗試過所有可能的范圍,但沒找到。42折半(二分)查找(2)x<a[mid]:x只可能落在top和折半(二分)查找
x=65的查找過程下標(biāo)數(shù)組元素第一次第二次第三次010←top123235341456←mid565←top←top←mid673←bot785←mid8979102←bot←bot43折半(二分)查找
x=65的查找過程下標(biāo)數(shù)組元素第一次第二次折半(二分)查找(數(shù)組從小到大)核心部分算法:top=0;bottom=n-1;result=-1;while((top<=bottom)&&(result==-1)){mid=(top+bottom)/2;/*取中間元素*/
if(a[mid]==x)/*所查找的數(shù)據(jù)是否是中間元素*/ result=mid;/*找到的位置*/
elseif(a[mid]<x) top=mid+1;elsebottom=mid-1;}44折半(二分)查找(數(shù)組從小到大)核心部分算法:44折半查找函數(shù)的定義
(數(shù)組從大到?。﹊ntBinarySearch(inta[],intn,intkey)/*key表示要找的數(shù)*/{inttop,bottom,mid;if(key>a[0]||key<a[n-1])return-1;/*返回-1表示沒找到*/else{top=0;bottom=n-1;while(top<=bottom){mid=(top+bottom)/2; /*取中間元素*/if(a[mid]==key)/*所查找的數(shù)據(jù)是否是中間元素*/ returnmid; /*返回找到的位置*/elseif(a[mid]>key) top=mid+1;elsebottom=mid-1;}return-1;}/*返回-1表示沒找到*/}45折半查找函數(shù)的定義
(數(shù)組從大到?。﹊ntBinarySe例7.24編寫一個(gè)字符串復(fù)制函數(shù)。#include<stdio.h>voidstringcopy(chars[],char*t){inti=0;while(*t!='\0'){s[i]=*t;i++;t++;}s[i]='\0';}voidmain(){charstr1[]="IloveBeijing!";char*str2="IloveChina!";stringcopy(str1,str2);printf("str1=%s\nstr2=%s\n",str1,str2);}46例7.24編寫一個(gè)字符串復(fù)制函數(shù)。#include<s例7.25改用兩個(gè)字符指針變量作stringcopy函數(shù)的形參#include<stdio.h>voidstringcopy(char*p,char*q){while((*p++=*q++)!='\0');}voidmain(){charstr1[]="IloveBeijing!";char*str2="IloveChina!";stringcopy(str1,str2);printf("str1=%s\nstr2=%s\n",str1,str2);}47例7.25改用兩個(gè)字符指針變量作stringcopy函數(shù)例7.26編寫一個(gè)求字符串長(zhǎng)度函數(shù)#include<stdio.h>#include<string.h>intstringlen(chars[]){inti=0,len=0;while(s[i]!='\0'){len++;i++;}returnlen;}voidmain(){char*str;printf("Pleaseinputastring:");gets(str);printf("\nThestringlenthis%4d\n",stringlenth(str));}48例7.26編寫一個(gè)求字符串長(zhǎng)度函數(shù)#include<s多維數(shù)組名作函數(shù)參數(shù)例如:floatmax(intarray[3][10])形參多維數(shù)組的第一維大小可以不指定floatmax(intarray[][10])正確但是形參多維數(shù)組的第二維及其它高維的大小不能省略floatmax(intarray[3][])錯(cuò)誤floatmax(intarray[][])錯(cuò)誤49多維數(shù)組名作函數(shù)參數(shù)例如:49舉例求二維數(shù)組最大值函數(shù)的定義與調(diào)用例7.23#include<stdio.h>max_value(inta[][4]){inti,j,max;max=a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[i][j]>max)max=a[i][j];return(max);}voidmain(){inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf("max=%d\n",max_value(a));}/*形參二維數(shù)組的第一維大小可以不指定*/50舉例求二維數(shù)組最大值函數(shù)的定義與調(diào)用例7.23/*形7.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用從什么地方調(diào)用函數(shù),就返回到什么地方...調(diào)用函數(shù)fun1...調(diào)用函數(shù)fun2main()函數(shù)fun2()函數(shù)fun1()函數(shù)①②⑤⑥⑦⑧⑨④③517.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用從什么地方調(diào)用函數(shù),就返回函數(shù)的嵌套調(diào)用舉例—求cnmvoidmain(){intm,n,t;longc(int,int);scanf("%d%d",&m,&n);if(n>m){t=m;m=n;n=t;}printf("%ld\n",c(m,n));}longc(intm,intn){longf;longfac(int);f=fac(m)/(fac(n)*fac(m-n));return(f);}longfac(intt){inti;longs=1;for(i=1;i<=t;i++)s*=i;return(s);}在main函數(shù)中調(diào)用c函數(shù)在c函數(shù)中三次調(diào)用fac函數(shù)
返回main函數(shù)返回c函數(shù)函數(shù)C:求cnm
函數(shù)fac:求t!
52函數(shù)的嵌套調(diào)用舉例—求cnmvoidmain()在m函數(shù)的遞歸調(diào)用inta(intn){intd,c;…d=a(c); …}遞歸函數(shù)兩要素:1.遞歸調(diào)用2.使遞歸結(jié)束的條件函數(shù)的遞歸調(diào)用:在定義一個(gè)函數(shù)的過程中又直接或間接地調(diào)用函數(shù)本身
53函數(shù)的遞歸調(diào)用inta(intn)函數(shù)的遞歸調(diào)用:函數(shù)的遞歸調(diào)用f函數(shù)調(diào)用f函數(shù)f2函數(shù)調(diào)用f1函數(shù)f1函數(shù)調(diào)用f2函數(shù)直接遞歸調(diào)用間接遞歸調(diào)用54函數(shù)的遞歸調(diào)用f函數(shù)調(diào)用f函數(shù)f2函數(shù)調(diào)用遞歸函數(shù)舉例1—求階乘例7.31分析:1(n=0,1)fac(n)=n*fac(n-1)(n>1)floatfac(intn)/*求階乘函數(shù)*/{floatf;if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}#include<stdio.h>voidmain(){intn;scanf("%d",&n);if(n<0)printf("n<0,dataerror!");elseprintf("%d!=%15.0f\n",n,fac(n));}遞歸調(diào)用遞歸結(jié)束條件55遞歸函數(shù)舉例1—求階乘例7.31分析:1遞歸函數(shù)舉例1—年齡問題例7.32分析:age(n-1)+2(n>1)age(n)=10(n=1)#include<stdio.h>age(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}voidmain(){printf("%d\n",age(5));}遞歸調(diào)用遞歸結(jié)束條件遞歸調(diào)用遞歸調(diào)用遞歸結(jié)束條件遞歸調(diào)用遞歸結(jié)束條件遞歸結(jié)束條件遞歸調(diào)用遞歸結(jié)束條件56遞歸函數(shù)舉例1—年齡問題例7.32分析:遞歸函數(shù)舉例3#include<stdio.h>voidtry(){charc;if((c=getchar())!=’#’){try();putchar(c);}}voidmain(){try();}輸入apple#后的結(jié)果是:
------------elppa57遞歸函數(shù)舉例3#include<stdio.h>輸入7.5函數(shù)的返回值為指針一個(gè)函數(shù)可以返回整型、字符型、實(shí)型函數(shù)值,也可以返回一個(gè)指針值,即將地址作為函數(shù)值返回到主調(diào)函數(shù)中。返回指針的函數(shù)的定義:類型名*函數(shù)名(參數(shù)表){函數(shù)體語句組}587.5函數(shù)的返回值為指針一個(gè)函數(shù)可以返回整型、字符型、實(shí)型例7.34編寫一函數(shù),實(shí)現(xiàn)兩個(gè)字符串的連接,返回值為連接后字符串的首地址。#include<stdio.h>char*strcat(char*s1,char*s2)/*定義返回值是指針的函數(shù)*/{char*p=s1;while(*p!='\0')p++;while((*p++=*s2++)!='\0');*p='\0';returns1;}voidmain(){charstr1[30]="Ilearn",*str2="Clanguage.";char*s;s=strcat(str1,str2);/*strcat函數(shù)的返回值是指針*/printf("%s\n",s);}59例7.34編寫一函數(shù),實(shí)現(xiàn)兩個(gè)字符串的連接,返回值為連接例7.29編寫程序,使能從輸入的若干個(gè)字符串中找出最小的串,并將其輸出。#include<stdio.h>#include<string.h>intgetstring(charc[][81]){charlin[81],linnum=0;printf("Enterstringaspacestringtoend!\n");gets(lin);while(!strcmp(lin,"#")==0){strcpy(c[linnum],lin);linnum++;gets(lin);}returnlinnum;}/*返回字符串行數(shù)*/60例7.29編寫程序,使能從輸入的若干個(gè)字符串中找出最小的接上頁char*findminstr(char(*s)[81],intnum)/*s是指向一維數(shù)組的指針*/{char*strq;inti;strq=s[0];for(i=1;i<num;i++)if(strcmp(s[i],strq)<0)/*尋找最小串*/ strq=s[i];returnstrq;}/*返回最小串的地址*/61接上頁char*findminstr(char(*s)[接上頁voidmain(){charstr[50][81],*strp;intn,i;n=getstring(str);strp=findminstr(str,n);puts(strp);}62接上頁voidmain()62例7.29編寫程序,使能從輸入的若干個(gè)字符串中找出最小的串,并將其輸出。#include<stdio.h>#include<string.h>intgetstring(charc[][81]){charlin[81],linnum=0;printf("Enterstringaspacestringtoend!\n");gets(lin);while(!strcmp(lin,“#”)==0)/*輸入遇#號(hào)結(jié)束*/{strcpy(c[linnum],lin);linnum++;gets(lin);}returnlinnum;}/*返回字符串行數(shù)*/63例7.29編寫程序,使能從輸入的若干個(gè)字符串中找出最小的接上頁char*findminstr(char(*s)[81],intnum)/*s是指向一維數(shù)組的指針*/{char*strq;inti;strq=s[0];for(i=1;i<num;i++)if(strcmp(s[i],strq)<0)/*尋找最小串*/ strq=s[i];returnstrq;}/*返回最小串的地址*/S[][81]64接上頁char*findminstr(char(*s)[接上頁voidmain(){charstr[50][81],*strp;intn,i;n=getstring(str);strp=findminstr(str,n);puts(strp);}65接上頁voidmain()657.6變量的作用域和存儲(chǔ)類別函數(shù)間數(shù)據(jù)傳遞的渠道:主調(diào)函數(shù)(普通變量參數(shù))被調(diào)函數(shù)主調(diào)函數(shù)(函數(shù)返回值)被調(diào)函數(shù)主調(diào)函數(shù)(數(shù)組參數(shù)/指針變量參數(shù))被調(diào)函數(shù)主調(diào)函數(shù)(全局變量)被調(diào)函數(shù)667.6變量的作用域和存儲(chǔ)類別函數(shù)間數(shù)據(jù)傳遞的渠道:6局部變量#include<stdio.h>voidsub(int,int);voidmain(){inta=1,b=2;sub(a,b);printf("mainprogram%d%d\n",a,b);}voidsub(inta,intb){a=a+10;b=b+20;printf("subprogram%d%d\n",a,b);}程序結(jié)果:subprogram1122mainprogram1267局部變量#include<stdio.h>程序結(jié)果:67局部變量和全局變量變量按照其作用范圍分為局部變量和全局變量(外部變量)。
類別作用域
(有效范圍)局
部
變
量函數(shù)形參本函數(shù)在函數(shù)體首部定義的變量/數(shù)組本函數(shù)在復(fù)合語句首部定義的變量/數(shù)組本復(fù)合語句全局
變量在函數(shù)之外定義的變量/數(shù)組定義起至文件結(jié)束68局部變量和全局變量變量按照其作用范圍分為局部變量和全局變量(局部變量和全局變量?jī)牲c(diǎn)說明:①不同函數(shù)中的局部變量可以同名,全局變量與局部變量也可以同名,但它們代表不同的變量,在內(nèi)存中占有不同的存儲(chǔ)空間。②局部變量起作用時(shí),同名全局變量不起作用。69局部變量和全局變量?jī)牲c(diǎn)說明:69局部變量和全局變量例7.41#include<stdio.h>inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}voidmain()
{inta=8;
printf("%d\n",max(a,b));}max()的局部變量a、bmax()的局部變量c實(shí)參a是main()的局部變量(8),實(shí)參b是全局變量(5)程序運(yùn)行結(jié)果:8
使用max()的局部變量a、b
main()的局部變量a
全局變量a、b
70局部變量和全局變量例7.41#include<stdio全局變量intP1=1,P2=2;floatf1(inta){……}charc1,c2;floatf2(intb){……}voidmain(){……}全局變量P1,P2作用范圍全局變量c1,c2作用范圍一個(gè)不成文的約定:全局變量名的第一個(gè)字母大寫。71全局變量intP1=1,P2=2;全局變量P1,P2作全局變量應(yīng)用舉例例7.40有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生的成績(jī),寫一個(gè)函數(shù),求出平均分、最高分和最低分。#include<stdio.h>floatMax,Min;floataverage(floatarray[],intn){inti;floataver,sum=array[0];Max=Min=array[0];for(i=1;i<n;i++){if(array[i]>Max)Max=array[i];elseif(array[i]<Min)Min=array[i];
sum=sum+array[i];}aver=sum/n;return(aver);}全局變量能在定義之后的所有函數(shù)中使用72全局變量應(yīng)用舉例例7.40有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生全局變量應(yīng)用舉例voidmain(){floatave;floatscore[10],i;for(i=0;i<10;i++)scanf("%f",&score[i]);ave=average(score,10);printf("max=%6.2f\n",Max);printf("min=%6.2f\n",Min);printf("average=%6.2f\n",ave);}73全局變量應(yīng)用舉例voidmain()73變量的存儲(chǔ)類型局部變量按其生存的時(shí)間(生存期)劃分為動(dòng)態(tài)存儲(chǔ)變量、靜態(tài)存儲(chǔ)變量和寄存器變量。變量定義完整格式:[存儲(chǔ)類別]數(shù)據(jù)類型變量表列;存儲(chǔ)類別缺省為auto(自動(dòng)型)74變量的存儲(chǔ)類型局部變量按其生存的時(shí)間(生存期)劃分為動(dòng)態(tài)存內(nèi)存中用戶區(qū)存儲(chǔ)空間的分配內(nèi)存
系統(tǒng)區(qū)用戶區(qū)(存放用戶數(shù)據(jù)與程序)存放系統(tǒng)程序程序區(qū):程序靜態(tài)存儲(chǔ)區(qū):全局變量靜態(tài)局部變量動(dòng)態(tài)存儲(chǔ)區(qū):自動(dòng)局部變量形式參數(shù)函數(shù)調(diào)用時(shí)現(xiàn)場(chǎng)保護(hù)和返回值75內(nèi)存中用戶區(qū)存儲(chǔ)空間的分配內(nèi)存變量的存儲(chǔ)類型動(dòng)態(tài)變量靜態(tài)變量類別
存儲(chǔ)類別為auto(通常缺省)的局部變量存儲(chǔ)類別為static的
局部變量存儲(chǔ)類別為register的局部變量所有類別的全局變量存儲(chǔ)
位置動(dòng)態(tài)存儲(chǔ)區(qū)靜態(tài)存儲(chǔ)區(qū)寄存器生存期函數(shù)運(yùn)行期間程序運(yùn)行期間賦初值每調(diào)用函數(shù)一次,賦初值一次只在編譯時(shí)賦初值一次(數(shù)值型默認(rèn)初值為0)(字符型默認(rèn)初值為空字符)76變量的存儲(chǔ)類型動(dòng)態(tài)變量靜態(tài)變量類別
存儲(chǔ)類別為auto局部靜態(tài)變量應(yīng)用舉例1#include<stdio.h>f(inta){autointb=0;staticintc=3;b=b+1;c=c+1;return(a+b+c);}voidmain(){inta=2,i;for(i=0;i<3;i++)printf("%d",f(a));}動(dòng)態(tài)變量b,每次調(diào)用時(shí)都賦初值0
靜態(tài)變量c,只在編譯時(shí)賦初值3,每次調(diào)用結(jié)束后保留其值
程序運(yùn)行結(jié)果:789
77局部靜態(tài)變量應(yīng)用舉例1#include<stdio.h>局部靜態(tài)變量應(yīng)用舉例2#include<stdio.h>voidfun(){inta=2;staticintb=4;a=a+2;b+=2;printf("a=%db=%d\n",a,b);}voidmain(){fun();fun();fun();}程序運(yùn)行結(jié)果:a=4b=6a=4b=8a=4b=1078局部靜態(tài)變量應(yīng)用舉例2#include<stdio.h>局部靜態(tài)變量應(yīng)用舉例3例:利用靜態(tài)局部變量求階乘#include<stdio.h>intfac(intn){staticintf=1;f=f*n;return(f);}voidmain(){inti;for(i=1;i<=5;i++)printf("%5d\n",fac(i));}程序運(yùn)行結(jié)果:1
2
6
24
12079局部靜態(tài)變量應(yīng)用舉例3例:利用靜態(tài)局部變量求階乘程序運(yùn)行register變量C語言允許將一些使用頻繁的局部自動(dòng)變量或形式參數(shù)放在CPU的寄存器中,以提高執(zhí)行效率。寄存器變量用register聲明。建議:一般不用register變量。注意:寄存器變量沒有地址,所以不能使用“&”取地址運(yùn)算符。80register變量C語言允許將一些使用頻繁的局部自動(dòng)變量變量的分類按生存期靜態(tài)存儲(chǔ)變量
動(dòng)態(tài)存儲(chǔ)變量
按作用域局部變量(內(nèi)部變量)
全局變量(外部變量)
浮點(diǎn)型變量
單精度型變量
雙精度型變量
整型變量
長(zhǎng)整型變量
基本整型變量
無符號(hào)整型變量
按數(shù)據(jù)類型數(shù)值型變量
字符型變量
81變量的分類按生存期靜態(tài)存儲(chǔ)變量動(dòng)態(tài)存儲(chǔ)變量按作用域局部7.7內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù):只能被本文件中函數(shù)調(diào)用的函數(shù)外部函數(shù):允許被其它文件調(diào)用的函數(shù)一、用static定義內(nèi)部函數(shù)staticintf(){}二、用extern定義外部函數(shù)(也可省略)externintg(){
}三、用extern聲明其它文件中定義的外部函數(shù)例externintg();827.7內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù):只能被本文件中函數(shù)調(diào)用牛頓迭代法求一元方程在1附近的根x=1x0=xf=((a*x0+b)*x0+c)*x0+df1=(3*a*x0+2*b)*x0+cx=x0-f/f1當(dāng)|x-x0|>=1e-6
輸出方程的根x83用牛頓迭代法求一元方程在1附近的根x=1x0=xf=(寫一個(gè)函數(shù),輸入一個(gè)十六進(jìn)制整數(shù),輸出相應(yīng)的十進(jìn)制數(shù)。#include“stdio.h”unsignedlongchange(charstr[]){unsignedlongs=0;inti;for(i=0;i<7&&str[i];i++){if(str[i]>='0'&&str[i]<='9')s=s*16+str[i]-'0‘;elseif(str[i]>='a'&&str[i]<=‘f')s=s*16+str[i]-’a’+10;elseif(str[i]>='A'&&str[i]<=‘F')s=s*16+str[i]-’A’+10;}return(s);}84寫一個(gè)函數(shù),輸入一個(gè)十六進(jìn)制整數(shù),輸出相應(yīng)的十進(jìn)制數(shù)。#主程序voidmain(){charstr[8];printf(“請(qǐng)輸入一個(gè)無符號(hào)十六進(jìn)制數(shù):\n");scanf(“%s”,str);printf(“%s(16)=",str);printf(“%lu(10)",change(str));}85主程序voidmain()85上機(jī)任務(wù)十三1)編寫一個(gè)函數(shù)實(shí)現(xiàn)將一個(gè)字符串s1中的數(shù)字字符復(fù)制到另一字符串s2中:nc(char*s1,char*s2)2)編寫一個(gè)函數(shù)實(shí)現(xiàn)用“折半”查找一個(gè)數(shù)是否在一個(gè)有序的數(shù)組中,若在數(shù)組中,則輸出該數(shù)在數(shù)組中的位置,若不在則輸出“notfound”3)課本P234頁,例7.33用遞歸方法實(shí)現(xiàn)輸出斐波那契數(shù)列前20項(xiàng)。4)編寫一個(gè)函數(shù)實(shí)現(xiàn)用牛頓迭代法求一元方程ax3+bx2+cx+d=0的在1附近根:floats(floata,floatb,floatc,floatd)86上機(jī)任務(wù)十三1)編寫一個(gè)函數(shù)實(shí)現(xiàn)將一個(gè)字符串s1中的數(shù)字字符第7章函數(shù)教學(xué)目標(biāo)掌握自定義函數(shù)的一般結(jié)構(gòu)及函數(shù)的定義方法;掌握函數(shù)聲明、函數(shù)調(diào)用的一般方法;掌握形參、實(shí)參、函數(shù)原型等重要概念;熟悉數(shù)組作函數(shù)的參數(shù)時(shí)函數(shù)的定義和調(diào)用方法;熟悉函數(shù)嵌套、函數(shù)遞歸的概念;能定義和使用嵌套函數(shù)、遞歸函數(shù);了解局部變量、全局變量和變量的存儲(chǔ)類型的概念;熟悉auto型和static型局部變量的特點(diǎn)和用法。87第7章函數(shù)教學(xué)目標(biāo)1第7章函數(shù)知識(shí)點(diǎn)函數(shù)的定義與調(diào)用;函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞方法;數(shù)組作為函數(shù)參數(shù);函數(shù)的嵌套調(diào)用和遞歸調(diào)用;局部變量與全局變量的作用域;動(dòng)態(tài)存儲(chǔ)變量和靜態(tài)存儲(chǔ)變量的生存期。重點(diǎn):函數(shù)的定義與調(diào)用;函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞方法。難點(diǎn):函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞方法;遞歸函數(shù)的設(shè)計(jì);變量的作用域和生存期。88第7章函數(shù)知識(shí)點(diǎn)27.1函數(shù)概述函數(shù)是構(gòu)成C程序的基本構(gòu)件。C語言的程序是由一個(gè)主函數(shù)或若干個(gè)函數(shù)組成的。但編譯單位是源程序文件,而不是函數(shù)。C程序執(zhí)行是從main函數(shù)(主函數(shù))開始,在main函數(shù)中結(jié)束,不管main函數(shù)的位置如何。所有的函數(shù)獨(dú)立定義,main()函數(shù)可以調(diào)用任意其它函數(shù),其它函數(shù)之間可以相互調(diào)用,但任何函數(shù)都不能調(diào)用main()函數(shù)。897.1函數(shù)概述函數(shù)是構(gòu)成C程序的基本構(gòu)件。C語言的程序是函數(shù)的分類標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供,如printf()自定義函數(shù):由用戶自己定義,解決特定的問題有參函數(shù):主調(diào)函數(shù)與被調(diào)函數(shù)之間有參數(shù)傳遞如printf()無參函數(shù):主調(diào)函數(shù)與被調(diào)函數(shù)之間無參數(shù)傳遞如getchar()有返回值函數(shù):被調(diào)函數(shù)返回一個(gè)值給主調(diào)函數(shù)如getchar()無返回值函數(shù):被調(diào)函數(shù)不帶回值給主調(diào)函數(shù)如printf()90函數(shù)的分類標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供,如printf7.2函數(shù)定義與函數(shù)調(diào)用函數(shù)定義:
函數(shù)調(diào)用:
函數(shù)定義時(shí)函數(shù)名后的括號(hào)中的變量叫形式參數(shù),簡(jiǎn)稱形參
兩個(gè)實(shí)際參數(shù)函數(shù)調(diào)用時(shí)函數(shù)名后的括號(hào)中的參數(shù)叫實(shí)際參數(shù),簡(jiǎn)稱實(shí)參
函數(shù)值兩個(gè)形式參數(shù)917.2函數(shù)定義與函數(shù)調(diào)用函數(shù)定義:函數(shù)調(diào)用:函數(shù)定義一、函數(shù)定義與函數(shù)調(diào)用函數(shù)定義的格式:[函數(shù)類型]函數(shù)名([形參及形參聲明表列]){內(nèi)部變量定義和聲明部分執(zhí)行語句}函數(shù)定義后,并不被執(zhí)行,只有當(dāng)調(diào)用函數(shù)時(shí),程序才轉(zhuǎn)到函數(shù)去執(zhí)行。函數(shù)調(diào)用的格式:函數(shù)名([實(shí)參表列])92一、函數(shù)定義與函數(shù)調(diào)用函數(shù)定義的格式:61.無參無返回值函數(shù)的定義與調(diào)用#include<stdio.h>voidpstar(){ printf("****************\n");}voidmain(){inti;for(i=1;i<=10;i++)pstar();}函數(shù)類型void(“空類型”)表示無返回值
函數(shù)名無參數(shù)函數(shù)定義以語句方式調(diào)用無返回值函數(shù)函數(shù)定義931.無參無返回值函數(shù)的定義與調(diào)用#include<s2.有參無返回值函數(shù)的定義與調(diào)用#include<stdio.h>voidpstar(intn){intk;/*形參在函數(shù)體內(nèi)不能再定義*/for(k=1;k<=n;k++)printf("*");printf("\n");}voidmain(){inti;for(i=1;i<=10;i++)pstar(20);
}形參k
被聲明為int型
函數(shù)定義實(shí)參20942.有參無返回值函數(shù)的定義與調(diào)用#include<s3.有返回值函數(shù)的定義與調(diào)用#include<stdio.h>intmax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);/*將函數(shù)的返回值賦給變量c*/
printf("Maxis%d\n",c);
}int型函數(shù)(int可缺省),表示函數(shù)返回值為整型
函數(shù)定義return后的括號(hào)可以不要
注意:程序可直接寫為:return(x>y?x:y);953.有返回值函數(shù)的定義與調(diào)用#include<std有返回值函數(shù)的定義與調(diào)用上題程序可修改為:#include<stdio.h>intmax(intx,inty){return(x>y?x:y);}voidmain(){inta,b,c;scanf("%d%d",&a,&b);
printf(“Maxis%d\n”,max(a,b));
}將max函數(shù)的返回值作為printf函數(shù)的參數(shù)函數(shù)定義96有返回值函數(shù)的定義與調(diào)用上題程序可修改為:將max函數(shù)的返回二、函數(shù)的參數(shù)一、形式參數(shù)與實(shí)際參數(shù)對(duì)無參函數(shù),形參表列與實(shí)參表列均為空,但括號(hào)不能省略,如fun()。對(duì)有參函數(shù),實(shí)參與形參應(yīng)個(gè)數(shù)相等,順序?qū)?yīng),類型一致或賦值相容。定義函數(shù)時(shí)形參不占用存儲(chǔ)單元,只有在調(diào)用函數(shù)期間才給形參分配存儲(chǔ)單元,并將實(shí)參的值傳遞給形參。函數(shù)調(diào)用結(jié)束,形參所占用存儲(chǔ)單元也被釋放。97二、函數(shù)的參數(shù)一、形式參數(shù)與實(shí)際參數(shù)11函數(shù)的參數(shù)若形參是變量名,實(shí)參可以是常量、變量或表達(dá)式,如函數(shù)調(diào)用max(3,a+b);若形參是數(shù)組名,實(shí)參
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)燃機(jī)基礎(chǔ)知識(shí)培訓(xùn)課件
- 教育培訓(xùn)機(jī)構(gòu)課程退費(fèi)須知
- 小紅帽故事征文
- 信息技術(shù)在農(nóng)業(yè)領(lǐng)域的應(yīng)用開發(fā)合同
- 江西省南昌市2024-2025學(xué)年高二上學(xué)期期末生物學(xué)試題(含答案)
- 福建省三明市2024-2025學(xué)年高二上學(xué)期期末考試生物學(xué)試題(含答案)
- 城市交通智能調(diào)度系統(tǒng)開發(fā)合同
- 農(nóng)民土地承包經(jīng)營(yíng)權(quán)優(yōu)化項(xiàng)目協(xié)議
- 企業(yè)級(jí)自動(dòng)化測(cè)試工具開發(fā)合作協(xié)議
- 廚房瓷磚知識(shí)培訓(xùn)課件
- 2025年天翼云解決方案架構(gòu)師認(rèn)證考試指導(dǎo)題庫-上(單選題)
- 2025年廣東省深圳市高考語文一模試卷
- 2025年春人教版英語八年級(jí)下冊(cè)同步課件 Unit 7 Whats the highest mountain in the world課件 Section A 1a-2d
- 2025年哈爾濱鐵道職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫必考題
- 行為規(guī)范教育中學(xué)校長(zhǎng)在國(guó)旗下講話:嚴(yán)格要求自己規(guī)范自己的行為
- 2025年福建省高職單招職業(yè)適應(yīng)性測(cè)試題庫及答案解析
- 七下綜合世界真奇妙-共享“地球村”
- 2025年信陽職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 2025-2030年中國(guó)eva熱熔膠行業(yè)運(yùn)營(yíng)狀況與發(fā)展?jié)摿Ψ治鰣?bào)告
- 2024年廣東職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 印刷服務(wù)投標(biāo)方案(技術(shù)方案)
評(píng)論
0/150
提交評(píng)論