![C語(yǔ)言函數(shù)課件_第1頁(yè)](http://file4.renrendoc.com/view/cb9f44cb3bf04db493429d88bb09a944/cb9f44cb3bf04db493429d88bb09a9441.gif)
![C語(yǔ)言函數(shù)課件_第2頁(yè)](http://file4.renrendoc.com/view/cb9f44cb3bf04db493429d88bb09a944/cb9f44cb3bf04db493429d88bb09a9442.gif)
![C語(yǔ)言函數(shù)課件_第3頁(yè)](http://file4.renrendoc.com/view/cb9f44cb3bf04db493429d88bb09a944/cb9f44cb3bf04db493429d88bb09a9443.gif)
![C語(yǔ)言函數(shù)課件_第4頁(yè)](http://file4.renrendoc.com/view/cb9f44cb3bf04db493429d88bb09a944/cb9f44cb3bf04db493429d88bb09a9444.gif)
![C語(yǔ)言函數(shù)課件_第5頁(yè)](http://file4.renrendoc.com/view/cb9f44cb3bf04db493429d88bb09a944/cb9f44cb3bf04db493429d88bb09a9445.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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ǔ)類(lèi)型的概念;熟悉auto型和static型局部變量的特點(diǎn)和用法。
Page1
第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ì);變量的作用域和生存期。
Page2
7.1函數(shù)概述函數(shù)是構(gòu)成C程序的基本構(gòu)件。C語(yǔ)言的程序是由一個(gè)主函數(shù)或若干個(gè)函數(shù)組成的。但編譯單位是源程序文件,而不是函數(shù)。C程序執(zhí)行是從main函數(shù)(主函數(shù))開(kāi)始,在main函數(shù)中結(jié)束,不管main函數(shù)的位置如何。所有的函數(shù)獨(dú)立定義,main()函數(shù)可以調(diào)用任意其它函數(shù),其它函數(shù)之間可以相互調(diào)用,但任何函數(shù)都不能調(diào)用main()函數(shù)。
Page3
函數(shù)的分類(lèi)標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供,如printf()自定義函數(shù):由用戶(hù)自己定義,解決特定的問(wèn)題有參函數(shù):主調(diào)函數(shù)與被調(diào)函數(shù)之間有參數(shù)傳遞如printf()無(wú)參函數(shù):主調(diào)函數(shù)與被調(diào)函數(shù)之間無(wú)參數(shù)傳遞如getchar()有返回值函數(shù):被調(diào)函數(shù)返回一個(gè)值給主調(diào)函數(shù)如getchar()無(wú)返回值函數(shù):被調(diào)函數(shù)不帶回值給主調(diào)函數(shù)如printf()
Page4
7.2函數(shù)定義與函數(shù)調(diào)用函數(shù)定義:
函數(shù)調(diào)用:
函數(shù)定義時(shí)函數(shù)名后的括號(hào)中的變量叫形式參數(shù),簡(jiǎn)稱(chēng)形參
兩個(gè)實(shí)際參數(shù)函數(shù)調(diào)用時(shí)函數(shù)名后的括號(hào)中的參數(shù)叫實(shí)際參數(shù),簡(jiǎn)稱(chēng)實(shí)參
函數(shù)值兩個(gè)形式參數(shù)
Page5
一、函數(shù)定義與函數(shù)調(diào)用函數(shù)定義的格式:
[函數(shù)類(lèi)型]函數(shù)名([形參及形參聲明表列]){內(nèi)部變量定義和聲明部分執(zhí)行語(yǔ)句
}函數(shù)定義后,并不被執(zhí)行,只有當(dāng)調(diào)用函數(shù)時(shí),程序才轉(zhuǎn)到函數(shù)去執(zhí)行。函數(shù)調(diào)用的格式:函數(shù)名([實(shí)參表列])
Page6
1.無(wú)參無(wú)返回值函數(shù)的定義與調(diào)用#include<stdio.h>voidpstar(){ printf("****************\n");}voidmain(){inti;for(i=1;i<=10;i++)pstar();}函數(shù)類(lèi)型void(“空類(lèi)型”)表示無(wú)返回值
函數(shù)名無(wú)參數(shù)函數(shù)定義以語(yǔ)句方式調(diào)用無(wú)返回值函數(shù)函數(shù)定義
Page7
2.有參無(wú)返回值函數(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í)參20
Page8
3.有返回值函數(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)可以不要
注意:程序可直接寫(xiě)為:return(x>y?x:y);
Page9
有返回值函數(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ù)定義
Page10
二、函數(shù)的參數(shù)一、形式參數(shù)與實(shí)際參數(shù)對(duì)無(wú)參函數(shù),形參表列與實(shí)參表列均為空,但括號(hào)不能省略,如fun()。對(duì)有參函數(shù),實(shí)參與形參應(yīng)個(gè)數(shù)相等,順序?qū)?yīng),類(lèi)型一致或賦值相容。定義函數(shù)時(shí)形參不占用存儲(chǔ)單元,只有在調(diào)用函數(shù)期間才給形參分配存儲(chǔ)單元,并將實(shí)參的值傳遞給形參。函數(shù)調(diào)用結(jié)束,形參所占用存儲(chǔ)單元也被釋放。
Page11
函數(shù)的參數(shù)若形參是變量名,實(shí)參可以是常量、變量或表達(dá)式,如函數(shù)調(diào)用max(3,a+b);若形參是數(shù)組名,實(shí)參是數(shù)組名,或者數(shù)組指針。注:實(shí)參對(duì)形參的數(shù)據(jù)傳遞是“單向值傳遞”:實(shí)參的值傳遞給形參,而形參的值不會(huì)傳回給實(shí)參。
Page12
三、函數(shù)的返回值函數(shù)返回值的獲得:由return語(yǔ)句獲得。函數(shù)返回值的類(lèi)型:取決于函數(shù)的類(lèi)型。例:
floatmax(intx,inty){return(x>y?x:y);}
問(wèn):函數(shù)返回值是int還是float型?答:float將無(wú)返回值的函數(shù)類(lèi)型定義為void。
Page13
四、函數(shù)的調(diào)用方式函數(shù)調(diào)用的格式:函數(shù)名([實(shí)參表列])函數(shù)調(diào)用的三種方式:函數(shù)語(yǔ)句:把函數(shù)調(diào)用作為一個(gè)語(yǔ)句,這種調(diào)用方式不使用函數(shù)的返回值,是無(wú)返回值函數(shù)的調(diào)用方式。
如,pstar(20);
Page14
函數(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));
Page15
舉例判斷素?cái)?shù)函數(shù)1
(無(wú)返回值函數(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)}為了明確表示無(wú)返回值用void定義函數(shù)類(lèi)型
Page16
舉例判斷素?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)
Page17
五、函數(shù)調(diào)用的條件1、被調(diào)函數(shù)是庫(kù)函數(shù)或已經(jīng)存在的自定義函數(shù);2、若被調(diào)函數(shù)是庫(kù)函數(shù),一般需在文件開(kāi)頭將其頭文件#include到本文件;
3、若被調(diào)函數(shù)是自定義函數(shù),一般應(yīng)在調(diào)用前進(jìn)行函數(shù)原型聲明,聲明的格式是:函數(shù)類(lèi)型函數(shù)名(形參類(lèi)型表列);或者:函數(shù)類(lèi)型函數(shù)名(形參名及其類(lèi)型表列);舉例:intmax(int,int);
或:intmax(intx,inty);
一個(gè)例外:若被調(diào)函數(shù)定義在前、調(diào)用在后,則可不加函數(shù)原型聲明。
Page18
函數(shù)原型聲明方式1、在主調(diào)函數(shù)內(nèi)部聲明;2、在函數(shù)的外部聲明,一般放在所有函數(shù)定義之前,即文件開(kāi)頭。
Page19
函數(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(a,b)inta,b;{floatc;c=(a+b)/2.0;return(c);}函數(shù)調(diào)用在前
在主調(diào)函數(shù)內(nèi)部聲明floataverage(int,int);函數(shù)定義在后
Page20
函數(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(a,b)inta,b;{floatc;c=(a+b)/2.0;return(c);}函數(shù)調(diào)用在前
文件開(kāi)頭,外部聲明floataverage(int,int);函數(shù)定義在后
Page21
函數(shù)原型聲明舉例#include<stdio.h>
floataverage(a,b)inta,b;{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)用在后;無(wú)需聲明函數(shù)調(diào)用在后
Page22
7.3函數(shù)調(diào)用中的參數(shù)傳遞簡(jiǎn)單變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)
Page23
1、簡(jiǎn)單變量作為函數(shù)參數(shù)若形參是變量名,實(shí)參可以是常量、變量或表達(dá)式。實(shí)參對(duì)形參變量的傳遞是“單向數(shù)值傳遞”:實(shí)參的值傳遞給形參,而形參的值不會(huì)傳回給實(shí)參。改變形參的值不會(huì)使實(shí)參的值發(fā)生變化實(shí)參形參值
Page24
舉例對(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);}這樣的程序無(wú)法實(shí)現(xiàn)a和b兩個(gè)變量的交換!
35abxyt35353
Page25
2、指針變量作為函數(shù)參數(shù)指針作為函數(shù)參數(shù):
形參指針也指向?qū)崊⒅羔標(biāo)傅膯卧?,于是改變形參指針?biāo)竼卧闹?,也就是改變?shí)參指針?biāo)竼卧闹?。指針?lèi)型實(shí)參指針類(lèi)型形參地址值
Page26
舉例對(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……abp1p2t2000pointer1pointer220002002200220002002533
Page27
舉例對(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);}改變形參指針的值無(wú)法實(shí)現(xiàn)a和b兩個(gè)變量的交換!
35……abp1p2t2000pointer1pointer220002002200220002002200220002000
Page28
普通變量的指針作函數(shù)參數(shù)小結(jié)欲通過(guò)函數(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ù)得到改變了的值。
Page29
3、數(shù)組作為函數(shù)參數(shù)
數(shù)組元素作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)
Page30
數(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ù)組相等。通過(guò)調(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);}
Page31
舉例判斷兩個(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í)參
Page32
一維數(shù)組名作為函數(shù)參數(shù)形參接收實(shí)參傳遞的數(shù)組首地址,實(shí)際上,C編譯是將形參數(shù)組名作為指針變量來(lái)處理的。參數(shù)傳遞:地址值實(shí)參數(shù)組指針形參數(shù)組名或指針變量效果:函數(shù)調(diào)用期間,形參數(shù)組就是實(shí)參數(shù)組。一維數(shù)組名
一維數(shù)組名
一維數(shù)組指針一維數(shù)組指針變量實(shí)參
形參
Page33
一維數(shù)組名作參數(shù)使用說(shuō)明實(shí)參數(shù)組與形參數(shù)組類(lèi)型要一致。實(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ù)。
Page34
例7.17編寫(xiě)函數(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);}
Page35
例7.17編寫(xiě)函數(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ù)。
Page36
例:編寫(xiě)函數(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ù)組
Page37
方法(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]);}
Page38
方法(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]);}
Page39
方法(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]);}
Page40
折半(二分)查找折半查找法只能對(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):已找到,退出查找;
Page41
折半(二分)查找(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表明嘗試過(guò)所有可能的范圍,但沒(méi)找到。
Page42
折半(二分)查找
x=65的查找過(guò)程下標(biāo)數(shù)組元素第一次第二次第三次010←top123235341456←mid565←top←top←mid673←bot785←mid8979102←bot←bot
Page43
折半(二分)查找(數(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;}
Page44
折半查找函數(shù)的定義
(數(shù)組從大到小)intBinarySearch(inta[],intn,intkey)/*key表示要找的數(shù)*/{inttop,bottom,mid;if(key>a[0]||key<a[n-1])return-1;/*返回-1表示沒(méi)找到*/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表示沒(méi)找到*/}
Page45
例7.24編寫(xiě)一個(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);}
Page46
例7.25改用兩個(gè)字符指針變量作stringcopy函數(shù)的形參#include<stdio.h>voidstringcopy(char*p,char*q){while((*p++=*q++)!='\0');*p='\0';}voidmain(){charstr1[]="IloveBeijing!";char*str2="IloveChina!";stringcopy(str1,str2);printf("str1=%s\nstr2=%s\n",str1,str2);}
Page47
例7.26編寫(xiě)一個(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));}
Page48
多維數(shù)組名作函數(shù)參數(shù)例如:
floatmax(intarray[3][10])形參多維數(shù)組的第一維大小可以不指定
floatmax(intarray[][10])正確但是形參多維數(shù)組的第二維及其它高維的大小不能省略
floatmax(intarray[3][])錯(cuò)誤
floatmax(intarray[][])錯(cuò)誤
Page49
舉例求二維數(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ù)組的第一維大小可以不指定*/
Page50
7.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用從什么地方調(diào)用函數(shù),就返回到什么地方...調(diào)用函數(shù)fun1...調(diào)用函數(shù)fun2main()函數(shù)fun2()函數(shù)fun1()函數(shù)①②⑤⑥⑦⑧⑨④③
Page51
函數(shù)的嵌套調(diào)用舉例—求cnm
voidmain(){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!
Page52
函數(shù)的遞歸調(diào)用inta(intn){intd,c;…d=a(c);
…}遞歸函數(shù)兩要素:1.遞歸調(diào)用
2.使遞歸結(jié)束的條件函數(shù)的遞歸調(diào)用:在定義一個(gè)函數(shù)的過(guò)程中又直接或間接地調(diào)用函數(shù)本身
Page53
函數(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)用
Page54
遞歸函數(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é)束條件
Page55
遞歸函數(shù)舉例1—年齡問(wèn)題例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é)束條件
Page56
遞歸函數(shù)舉例3#include<stdio.h>voidtry(){charc;if((c=getchar())!=’#’){try();putchar(c);}}voidmain(){try();}輸入apple#后的結(jié)果是:
elppa
Page57
7.5函數(shù)的返回值為指針一個(gè)函數(shù)可以返回整型、字符型、實(shí)型函數(shù)值,也可以返回一個(gè)指針值,即將地址作為函數(shù)值返回到主調(diào)函數(shù)中。返回指針的函數(shù)的定義:類(lèi)型名*函數(shù)名(參數(shù)表){
函數(shù)體語(yǔ)句組
}
Page58
例7.34編寫(xiě)一函數(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);}
Page59
例7.29編寫(xiě)程序,使能從輸入的若干個(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ù)*/
Page60
接上頁(yè)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;}/*返回最小串的地址*/
Page61
接上頁(yè)voidmain(){charstr[50][81],*strp;intn,i;n=getstring(str);strp=findminstr(str,n);puts(strp);}
Page62
例7.29編寫(xiě)程序,使能從輸入的若干個(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ù)*/
Page63
接上頁(yè)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]
Page64
接上頁(yè)voidmain(){charstr[50][81],*strp;intn,i;n=getstring(str);strp=findminstr(str,n);puts(strp);}
Page65
7.6變量的作用域和存儲(chǔ)類(lèi)別函數(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ù)
Page66
局部變量#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é)果:
subprogram1122mainprogram12
Page67
局部變量和全局變量變量按照其作用范圍分為局部變量和全局變量(外部變量)。
類(lèi)別作用域
(有效范圍)局
部
變
量函數(shù)形參本函數(shù)在函數(shù)體首部定義的變量/數(shù)組本函數(shù)在復(fù)合語(yǔ)句首部定義的變量/數(shù)組本復(fù)合語(yǔ)句全局
變量在函數(shù)之外定義的變量/數(shù)組定義起至文件結(jié)束
Page68
局部變量和全局變量?jī)牲c(diǎn)說(shuō)明:
①不同函數(shù)中的局部變量可以同名,全局變量與局部變量也可以同名,但它們代表不同的變量,在內(nèi)存中占有不同的存儲(chǔ)空間。
②局部變量起作用時(shí),同名全局變量不起作用。
Page69
局部變量和全局變量例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
Page70
全局變量intP1=1,P2=2;floatf1(inta){……}charc1,c2;floatf2(intb){……}voidmain(){……}全局變量P1,P2作用范圍全局變量c1,c2作用范圍一個(gè)不成文的約定:全局變量名的第一個(gè)字母大寫(xiě)。
Page71
全局變量應(yīng)用舉例例7.40有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生的成績(jī),寫(xiě)一個(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ù)中使用
Page72
全局變量應(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);}
Page73
變量的存儲(chǔ)類(lèi)型局部變量按其生存的時(shí)間(生存期)劃分為動(dòng)態(tài)存儲(chǔ)變量、靜態(tài)存儲(chǔ)變量和寄存器變量。變量定義完整格式:
[存儲(chǔ)類(lèi)別]數(shù)據(jù)類(lèi)型變量表列;存儲(chǔ)類(lèi)別缺省為auto(自動(dòng)型)
Page74
內(nèi)存中用戶(hù)區(qū)存儲(chǔ)空間的分配
內(nèi)存
系統(tǒng)區(qū)用戶(hù)區(qū)(存放用戶(hù)數(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ù)和返回值
Page75
變量的存儲(chǔ)類(lèi)型動(dòng)態(tài)變量靜態(tài)變量類(lèi)別
存儲(chǔ)類(lèi)別為auto(通常缺?。┑木植孔兞看鎯?chǔ)類(lèi)別為static的
局部變量存儲(chǔ)類(lèi)別為register的局部變量所有類(lèi)別的全局變量存儲(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)初值為空字符)
Page76
局部靜態(tài)變量應(yīng)用舉例1#include<stdio.h>f(inta){autointb=0;staticintc=3;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新型城鎮(zhèn)化建設(shè)項(xiàng)目勞務(wù)分包合同-@-1
- 2025年電燙板項(xiàng)目投資可行性研究分析報(bào)告
- 2025年度教育產(chǎn)業(yè)并購(gòu)擔(dān)保合同
- 2025年度機(jī)關(guān)單位食堂后勤保障服務(wù)承包合同
- 2025年度智能安防監(jiān)控系統(tǒng)安裝維護(hù)技術(shù)服務(wù)合同范本
- 離異貧困申請(qǐng)書(shū)范文
- 2025年中國(guó)航空鋼繩行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及投資潛力預(yù)測(cè)報(bào)告
- 2025年度危險(xiǎn)品包裝運(yùn)輸合同正規(guī)格式(安全包裝規(guī)范)
- 新型換氣扇行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 2025年度建筑工程合同糾紛調(diào)解簡(jiǎn)易合同編制規(guī)范
- 《工作場(chǎng)所安全使用化學(xué)品規(guī)定》
- 2022年菏澤醫(yī)學(xué)專(zhuān)科學(xué)校單招綜合素質(zhì)考試筆試試題及答案解析
- 市政工程設(shè)施養(yǎng)護(hù)維修估算指標(biāo)
- 課堂嵌入式評(píng)價(jià)及其應(yīng)用
- 《管理學(xué)基礎(chǔ)》完整版課件全套ppt教程(最新)
- 短視頻:策劃+拍攝+制作+運(yùn)營(yíng)課件(完整版)
- 基金會(huì)財(cái)務(wù)報(bào)表審計(jì)指引
- 藍(lán)色卡通風(fēng)好書(shū)推薦教育PPT模板
- 2022年江蘇省泰州市中考數(shù)學(xué)試題及答案解析
- 石家莊鐵道大學(xué)四方學(xué)院畢業(yè)設(shè)計(jì)46
- 智能化系統(tǒng)培訓(xùn)
評(píng)論
0/150
提交評(píng)論