![函數(shù)和預(yù)處理_第1頁(yè)](http://file4.renrendoc.com/view/40cbaf86066c625ab9bf41d62582b93a/40cbaf86066c625ab9bf41d62582b93a1.gif)
![函數(shù)和預(yù)處理_第2頁(yè)](http://file4.renrendoc.com/view/40cbaf86066c625ab9bf41d62582b93a/40cbaf86066c625ab9bf41d62582b93a2.gif)
![函數(shù)和預(yù)處理_第3頁(yè)](http://file4.renrendoc.com/view/40cbaf86066c625ab9bf41d62582b93a/40cbaf86066c625ab9bf41d62582b93a3.gif)
![函數(shù)和預(yù)處理_第4頁(yè)](http://file4.renrendoc.com/view/40cbaf86066c625ab9bf41d62582b93a/40cbaf86066c625ab9bf41d62582b93a4.gif)
![函數(shù)和預(yù)處理_第5頁(yè)](http://file4.renrendoc.com/view/40cbaf86066c625ab9bf41d62582b93a/40cbaf86066c625ab9bf41d62582b93a5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
函數(shù)和預(yù)處理第1頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月第6章函數(shù)和預(yù)處理6.1函數(shù)概述6.2函數(shù)的定義和調(diào)用6.3函數(shù)間的參數(shù)傳遞6.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用6.5 變量的作用域和存儲(chǔ)類別6.6內(nèi)部函數(shù)和外部函數(shù)6.8編譯預(yù)處理第2頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月6.1 函數(shù)概述通常一個(gè)程序用來完成若干功能,每一功能又可以細(xì)化分為若干子功能。函數(shù)是用來實(shí)現(xiàn)特定功能的模塊。一個(gè)C程序包含一個(gè)main函數(shù)和若干其他函數(shù)。除main函數(shù)外,其他函數(shù)可相互調(diào)用,次數(shù)不限。第3頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月C程序的構(gòu)成:函數(shù)→源文件→C程序必須有且只能有一個(gè)main函數(shù)C程序的執(zhí)行從main函數(shù)開始,在main中結(jié)束函數(shù)不能嵌套定義,可以嵌套調(diào)用C函數(shù)的分類:說明:使用形式使用方式無參函數(shù):調(diào)用時(shí)不需要傳遞函數(shù)參數(shù)。有參函數(shù):調(diào)用時(shí)需要傳遞函數(shù)參數(shù)。庫(kù)函數(shù):由系統(tǒng)提供。自定義函數(shù):用戶應(yīng)先定義,再使用。第4頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月6.2.1無參函數(shù)的定義定義形式: 類型標(biāo)識(shí)符函數(shù)名(){聲明部分語(yǔ)句部分}說明:類型標(biāo)識(shí)符:說明本函數(shù)返回值的數(shù)據(jù)類型。若函數(shù)無返回值,用“void”說明為空類型。函數(shù)名:符合標(biāo)識(shí)符命名規(guī)則。聲明部分:用來定義本函數(shù)所用變量。6.2 函數(shù)的定義和調(diào)用第5頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.1:無參函數(shù)使用舉例#include<stdio.h>voidprint1(){printf("******************\n");}voidmessage(){printf("Helloworld!\n");}voidmain(){print1(); /*調(diào)用print1函數(shù)輸出一串**/message();/*調(diào)用message函數(shù)輸出Helloworld!*/print1(); /*調(diào)用print1函數(shù)輸出一串**/}運(yùn)行結(jié)果:******************
Helloworld!******************第6頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月定義形式:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列) { 聲明部分 語(yǔ)句部分}說明:類型標(biāo)識(shí)符:說明本函數(shù)返回值的類型,省略時(shí)默認(rèn)為int型。若函數(shù)無返回值,用“void”說明為空類型。形式參數(shù)表列:逐個(gè)說明形式參數(shù)的類型和形參名,形式參數(shù)之間均以“,”分隔。格式:類型形參1,類型形參2,…,類型形參n返回值使用return語(yǔ)句獲得。6.2.2有參函數(shù)的定義第7頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.2:編寫函數(shù)sum,功能是求1+2+3+…n#include<stdio.h>intsum(intm)
/*函數(shù)首部*/{intsum1=0,i;for(i=1;i<=m;i++)/*形參m在sum函數(shù)中可以使用*/ sum1+=i;returnsum1;/*將結(jié)果sum1的值返回到調(diào)用函數(shù)main*/}voidmain(){intn;longs;
printf("請(qǐng)輸入一個(gè)整數(shù):");scanf("%d",&n);
s=sum(n);
/*調(diào)用sum函數(shù)求1到n的和*/printf("1+2+3+...+%d=%ld\n",n,s);}
運(yùn)行情況:請(qǐng)輸入一個(gè)整數(shù):1001+2+3+…+100=5050第8頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月有參函數(shù)可實(shí)現(xiàn)主調(diào)函數(shù)與被調(diào)用函數(shù)之間數(shù)據(jù)的傳遞。定義函數(shù)時(shí),函數(shù)名后面括號(hào)中的變量名稱為形式參數(shù)。調(diào)用函數(shù)時(shí),函數(shù)名后面括號(hào)中的變量名稱為實(shí)際參數(shù)。6.2.3函數(shù)的參數(shù)和返回值1.形參和實(shí)參第9頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例:求任意兩整數(shù)的最大值。#include<stdio.h>voidmain(){intmax(intx,inty);/*對(duì)max函數(shù)的聲明*/inta,b,c;scanf("%d,%d",&a,&b);
c=max(a,b);/*調(diào)用函數(shù)max,并取大值賦給c*/printf("Maxis%d\n",c);}intmax(intx,inty)/*定義有參函數(shù)max*/{intz;z=x>y?x:y;return(z);}運(yùn)行情況:6,8Maxis8第10頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月c=max(a,b)(main函數(shù))
intmax(intx,inty)(max函數(shù)){intz;z=x>y?x:y;return(z);}第11頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月說明:
定義函數(shù)時(shí),形參必須指定類型。 例:intmax(intx,inty)
調(diào)用函數(shù)時(shí),實(shí)參與形參數(shù)據(jù)類型一致;
實(shí)參必須有確定的值。例:max(3,a-b)第12頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月形參在函數(shù)被調(diào)用前不占內(nèi)存。函數(shù)調(diào)用時(shí),參數(shù)傳遞方式是單向“值傳遞”,即:實(shí)參→形參,并為形參分配存儲(chǔ)空間。在內(nèi)存中,實(shí)參與形參占不同的存儲(chǔ)單元。2.形參和實(shí)參的特點(diǎn)2233axby第13頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月函數(shù)調(diào)用結(jié)束后,形參單元被釋放,而實(shí)參單元仍保留并保持原值(即不受形參的影響)。212313axby第14頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月return語(yǔ)句一般形式:
return(表達(dá)式);或return表達(dá)式;功能:使程序控制從被調(diào)用函數(shù)返回到主調(diào)函數(shù)中,同時(shí)把返回值帶給主調(diào)函數(shù)。說明:
·本語(yǔ)句用在被調(diào)用函數(shù)中,一個(gè)return只能返回一個(gè)值?!と魺oreturn語(yǔ)句,在被調(diào)用函數(shù)中遇}時(shí),自動(dòng)返回主調(diào)函數(shù)3.函數(shù)的返回值第15頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月為明確函數(shù)不產(chǎn)生返回值,用“void”定義函數(shù)為空類型,調(diào)用時(shí)禁止使用其返回值。例如:
voidprintstar() {……}
則:x=printstar();
在編譯時(shí)將出現(xiàn)錯(cuò)誤。第16頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例:#include<stdio.h>voidmain(){intmax(floatx,floaty);floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}intmax(floatx,floaty){floatz;z=x>y?x:y;return(z);}運(yùn)行情況:1.5,2.5Maxis2調(diào)用后,其返回值為整型。若函數(shù)類型與return語(yǔ)句中表達(dá)式值的類型不一致,以函數(shù)類型為準(zhǔn),自動(dòng)轉(zhuǎn)換(一般兩者應(yīng)一致)。第17頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月形式:函數(shù)名([實(shí)參列表])說明:調(diào)用無參函數(shù)時(shí),括號(hào)不可省略。實(shí)參用“,”分隔。實(shí)參與形參個(gè)數(shù)相等,類型一致,按順序一一對(duì)應(yīng)傳遞數(shù)據(jù)。6.2.4函數(shù)的調(diào)用1.函數(shù)調(diào)用的一般形式第18頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月實(shí)參求值順序取決于系統(tǒng)(VC
自右向左)。例如:當(dāng)i=3時(shí),c=max(i,++i);相當(dāng)于:c=max(4,4); ——自右向左 或c=max(3,4); ——自左向右避免使用!第19頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月函數(shù)語(yǔ)句 例:print1(); 函數(shù)表達(dá)式 例:c=max(a,b)%2函數(shù)參數(shù) 例:g=max(a,max(b,c));2.函數(shù)調(diào)用的方式第20頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月對(duì)被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫(kù)函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)原型聲明3.函數(shù)原型聲明函數(shù)原型聲明:函數(shù)必須先定義后使用。因此,當(dāng)對(duì)一個(gè)函數(shù)的調(diào)用在前定義在后時(shí),必須對(duì)函數(shù)進(jìn)行原型聲明;如果定義在前而調(diào)用在后,可以直接使用。第21頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月函數(shù)原型聲明一般形式:函數(shù)類型函數(shù)名(類型形參,…);
或函數(shù)類型函數(shù)名(類型,類型…);
作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)。第22頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月也可寫成:intmax(int,int);例:求任意兩整數(shù)的最大值。#include<stdio.h>voidmain(){
intmax(intx,inty);/*對(duì)max函數(shù)的聲明*/inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);/*調(diào)用函數(shù)max,并取大值賦給c*/printf("Maxis%d\n",c);}intmax(intx,inty)/*定義有參函數(shù)max*/{intz;z=x>y?x:y;return(z);}運(yùn)行情況:6,8Maxis8第23頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月以下情況可省去主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)的函數(shù)原型聲明:被調(diào)用的函數(shù)類型為整型。被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前。在文首已聲明過。例函數(shù)定義與函數(shù)原型聲明不同:
定義函數(shù):確定函數(shù)功能。包括:指定返回值類型、函數(shù)名、形參及其類型、函數(shù)體。
函數(shù)原型聲明:對(duì)已定義的函數(shù)做類型說明。包括:類型、函數(shù)名、形參及其類型,以便檢驗(yàn)。第24頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例:charstr(inta);floatf(floatb);voidmain(){……}/*main函數(shù)中調(diào)用str和f函數(shù)*/charstr(inta)/*定義str函數(shù)*/{……}floatf(floatb); /*定義f函數(shù)*/{……}兩函數(shù)在文首已聲明,主調(diào)函數(shù)中可省略函數(shù)原型聲明。第25頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月6.3.1值傳遞6.3 函數(shù)間的參數(shù)傳遞例6.3:實(shí)參和形參的值傳遞。#include<stdio.h>voidmain(){voidfun(intx,inty);/*fun函數(shù)聲明*/ intx=10,y=15; fun(x,y);/*調(diào)用函數(shù)fun*/ printf("主函數(shù)中x=%d,y=%d\n",x,y);
}voidfun(intx,inty)/*fun函數(shù)定義*/{ intk=x+y; x=k-x;y=k-y;/*交換x,y的值*/ printf("fun函數(shù)中x=%d,y=%d\n",x,y);}運(yùn)行結(jié)果:fun函數(shù)中x=15,y=10主函數(shù)中x=10,y=15值傳遞是把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。
第26頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月6.3.2地址傳遞
地址傳遞是把實(shí)參的地址傳遞給形參。實(shí)參和形參均為指針或數(shù)組名。
例6.4:實(shí)參和形參的地址傳遞。#include<stdio.h>voidmain(){voidfun(int*a,int*b); intx=10,y=15; fun(&x,&y); printf("x=%d,y=%d\n",x,y);
}voidfun(int*a,int*b){ intk; k=*a,*a=*b,*b=k; printf("%d,%d",*a,*b);}運(yùn)行結(jié)果:15,10x=15,y=10第27頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月1.數(shù)組元素作函數(shù)實(shí)參數(shù)組元素作實(shí)參同變量作實(shí)參,參數(shù)傳遞方式為“值傳遞”——單向傳遞。6.3.3數(shù)組作函數(shù)參數(shù)第28頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月#include<stdio.h>voidpzf(intv){if(v<0)printf("%d",v);elseprintf("%d",0);}voidmain(){inta[5],i;for(i=0;i<5;i++){scanf("%d",&a[i]);
pzf(a[i]);/*數(shù)組元素a[i]作實(shí)參,將a[i]的值傳給pzf中的變量v*/}}運(yùn)行情況:57-2-3400-2-30例6.5:判別一個(gè)整數(shù)數(shù)組中各元素的值,若小于0則輸出該值,若大于等于0則輸出0。
第29頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月2.一維數(shù)組名作函數(shù)參數(shù)說明:應(yīng)在主調(diào)與被調(diào)函數(shù)中分別定義實(shí)參數(shù)組和形參數(shù)組,且類型一致。參數(shù)傳遞方式為“地址傳遞”,即將實(shí)參數(shù)組的起始地址→形參數(shù)組。如下圖:
a d …… z
a[0]
a[1]
a[9]
p[0]
p[1]
p[9]…………形參數(shù)組與實(shí)參數(shù)組占用同一段內(nèi)存區(qū)域,所以形參數(shù)組值的變化必將導(dǎo)致實(shí)參數(shù)組值的相應(yīng)變化。例6.6第30頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月若形參數(shù)組定義時(shí)未指定大小,定義被調(diào)用函數(shù)時(shí)應(yīng)指定另一形參,以傳遞實(shí)參數(shù)組的元素個(gè)數(shù)。④形參和實(shí)參可以同為數(shù)組名、指向數(shù)組的指針,也可以形參為數(shù)組名,實(shí)參為指向數(shù)組的指針;或者形參為指向數(shù)組的指針,實(shí)參為數(shù)組名。第31頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.6:對(duì)輸入的10個(gè)字符按從小到大的順序排列。voidsort(chara[],intm){inti,j; charc; for(i=0;i<m-1;i++) for(j=0;j<m-i-1;j++) if(a[j]>a[j+1])
c=a[j],a[j]=a[j+1],a[j+1]=c;}#include<stdio.h>voidmain(){voidsort(chara[],intm);charp[10];inti;gets(p);
sort(p,10);for(i=0;i<10;i++)printf("%c",p[i]);
}運(yùn)行情況:adcbfehgtzabcdefghtz第32頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月3.多維數(shù)組名作函數(shù)參數(shù)多維數(shù)組元素作實(shí)參,同一維數(shù)組。多維數(shù)組名作函數(shù)參數(shù):在定義形參數(shù)組時(shí),形參數(shù)組第一維可省略,第二維必須與實(shí)參數(shù)組相同。第33頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.10:求23矩陣中數(shù)據(jù)的平均值。#include<stdio.h>voidmain(){intaverage(inta[][3],intm,intn);intvalue[][3]={{2,4,6},{8,10,12}};printf("平均值為:%d\n",average(value,2,3));}intaverage(inta[][3],intm,intn){inti,j,sum=0;for(i=0;i<m;i++)for(j=0;j<n;j++) sum+=a[i][j];return(sum/(m*n));}運(yùn)行結(jié)果:平均值為:7第34頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月6.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用嵌套調(diào)用:在調(diào)用一個(gè)函數(shù)的過程中,又調(diào)用了另一個(gè)函數(shù)。函數(shù)不可以嵌套定義,但函數(shù)可以嵌套調(diào)用。main()調(diào)用a函數(shù)結(jié)束a函數(shù)b函數(shù)調(diào)用b函數(shù)6.4.1函數(shù)的嵌套調(diào)用第35頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.12:計(jì)算sum=22!+32!
#include<stdio.h>intfun1(intp);intfun2(intq);intfun1(intp){intk,r;k=p*p;r=fun2(k);returnr;}intfun2(intq){inti,c=1;for(i=1;i<=q;i++)c=c*i;returnc;}運(yùn)行結(jié)果:sum=362904voidmain(){inti,sum=0;for(i=2;i<=3;i++)sum=sum+fun1(i);printf("sum=%d\n",sum);}第36頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月6.4.2函數(shù)的遞歸調(diào)用遞歸調(diào)用:一個(gè)函數(shù)在它的函數(shù)體內(nèi)直接調(diào)用它自身或通過其他函數(shù)間接調(diào)用它自身。遞歸調(diào)用的方式:直接調(diào)用:如下圖(左)間接調(diào)用:如下圖(右)f函數(shù)調(diào)用f函數(shù)f1函數(shù)調(diào)用f2函數(shù)f2函數(shù)調(diào)用f1函數(shù)注:遞歸調(diào)用次數(shù)有限,可由if語(yǔ)句控制實(shí)現(xiàn)。第37頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月分析:
n!=n*(n-1)! (n-1)!=(n-1)*(n-2)! …… 2!=2*1
1!=10!=1遞歸公式
n!=1 (n=0,1)
n!=n*(n-1)! (n>1)例6.13:用遞歸法計(jì)算n!第38頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月voidmain(){intn,y;printf("請(qǐng)輸入一個(gè)整數(shù):");scanf("%d",&n); y=fac(n);printf("%d!=%d",n,y);}#include<stdio.h>intfac(intn){intf;if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}運(yùn)行情況:請(qǐng)輸入一個(gè)整數(shù):55!=120第39頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月voidmain() charf(inta){intm,n; {charc;…… ……} }1.局部變量(內(nèi)部變量)在一個(gè)函數(shù)內(nèi)定義,只在該函數(shù)內(nèi)有效。m、n有效a、c有效6.5 變量的作用域和存儲(chǔ)類別變量按作用域分為:局部變量和全局變量。在函數(shù)內(nèi)部定義的變量稱局部變量,在函數(shù)外部定義的變量稱全局變量。6.5.1變量的作用域第40頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月形參是局部變量,其作用范圍僅限于本函數(shù)。例如:
floatf1(intx,inty) {…… }main函數(shù)內(nèi)定義的變量為局部變量,只能在main函數(shù)內(nèi)使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對(duì)象,互不干擾,分配不同的內(nèi)存單元,互不混淆。x、y有效第41頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月在復(fù)合語(yǔ)句中定義的變量,只在該復(fù)合語(yǔ)句中有效。voidmain(){inta,b;…… {intc; c=a+b; …… }……}c的作用范圍a、b的作用范圍第42頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月2.全局變量(外部變量)在函數(shù)外定義的變量,稱為全局變量。其作用域是整個(gè)源程序。例6.15:全局變量的定義和聲明。#include<stdio.h>inta=20;voidmain(){ externd;intb=15,c;c=a+b+d;printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d);}intd=30;
運(yùn)行結(jié)果:a=20,b=15,c=65,d=30
函數(shù)可直接引用定義過的外部變量,但定義點(diǎn)前的函數(shù)要引用外部變量,需用“extern”加以聲明。第43頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月
限制使用全局變量:全局變量在程序全部執(zhí)行過程中占用存儲(chǔ)單元降低了函數(shù)的通用性、可靠性、可移植性降低程序清晰性,容易出錯(cuò)在同一源文件中,局部變量與全局變量同名時(shí),在局部變量的作用范圍內(nèi),全局變量不起作用。例6.16第44頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.16:全局變量的屏蔽。#include<stdio.h>inta=13,b=5; /*a、b為全局變量*/intmax(inta,intb) /*a、b為局部變量*/{intc;c=a>b?a:b;return(c);}voidmain(){inta=8; /*a為局部變量*/printf("%d",max(a,b));}運(yùn)行結(jié)果:8形參a、b作用范圍局部變量a作用范圍;全局變量b作用范圍。第45頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月變量的存儲(chǔ)方式靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、靜態(tài)局部變量auto局部變量?jī)?nèi)存用戶區(qū)6.5.2變量的存儲(chǔ)類別第46頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月自動(dòng)變量靜態(tài)局部變量寄存器變量一、局部變量的存儲(chǔ)方式第47頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月定義:函數(shù)內(nèi)以“auto”作為存儲(chǔ)類型說明或省略存儲(chǔ)類型的,稱為自動(dòng)變量。例如:intf(intx) {inta=0; autointb; ……}
其中,x、a、b均為自動(dòng)變量。特點(diǎn):函數(shù)調(diào)用時(shí),其存儲(chǔ)空間動(dòng)態(tài)分配和釋放。說明:自動(dòng)變量的初值在函數(shù)調(diào)用時(shí)獲得(給定值或不確定)。1.自動(dòng)變量第48頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月定義:函數(shù)內(nèi)以“static”作為存儲(chǔ)類型說明的局部變量。例如:intf(intx) {inta; staticintb; ……}
其中,x、a為自動(dòng)變量,b為靜態(tài)局部變量。特點(diǎn):函數(shù)調(diào)用期間或調(diào)用結(jié)束,其值始終保留。說明:沒有初始化的靜態(tài)變量,默認(rèn)值為0或0.0或空,只賦一次初值。2.靜態(tài)局部變量第49頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例:#include<stdio.h>intf(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("%2d",f(a));}運(yùn)行結(jié)果:789bc031044第一次調(diào)用開始第一次調(diào)用結(jié)束第二次調(diào)用開始第50頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月不易過多地使用靜態(tài)局部變量,內(nèi)存開銷大,降低可讀性。靜態(tài)局部變量的適用場(chǎng)合:①局部變量之值在下次調(diào)用該函數(shù)時(shí)依然需要。②局部變量一次初始化后,需要多次引用其初值。說明:第51頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.18:打印1到4的階乘值。#include<stdio.h>intfac(intn){staticintf=1;f=f*n;return(f);}voidmain(){inti;for(i=1;i<=4;i++)printf("%d!=%d\n",i,fac(i));}運(yùn)行結(jié)果:1!=12!=23!=64!=24第52頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月定義:函數(shù)內(nèi)以“register”作為存儲(chǔ)類型說明的局部變量。存儲(chǔ)位置:CPU中的寄存器。特點(diǎn):在函數(shù)內(nèi)反復(fù)被引用,可提高運(yùn)行效率。說明:只有局部自動(dòng)變量可作為寄存器變量。函數(shù)調(diào)用結(jié)束后,寄存器變量被釋放。因計(jì)算機(jī)內(nèi)部寄存器數(shù)目有限,允許使用的寄存器變量個(gè)數(shù)也因此受到一定限制。局部靜態(tài)變量不能定義為寄存器變量。3.寄存器變量第53頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月二、全局變量的存儲(chǔ)類型根據(jù)全局變量的作用范圍,存儲(chǔ)類型有:外部變量:需要被其他文件引用的全局變量,應(yīng)以“extern”聲明。靜態(tài)外部變量:作用域僅限于本文件的全局變量,應(yīng)以“static”聲明。說明:外部變量必須是另一文件中已定義的變量,其值在此文件中依然有效。extern、static用于對(duì)變量做存儲(chǔ)類型說明,而不是定義變量。靜態(tài)外部變量?jī)H在本文件中有效。第54頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.20:全局變量的引用。/*文件file1*/externintc=5;staticintd=100;externvoidf();#include<stdio.h>voidmain(){ intc=2;printf("file1:%d,%d\n",c,d); f();}/*文件file2*/#include<stdio.h>voidf(){ externintc;printf("file2:%d",c);}運(yùn)行結(jié)果:file1:2,100file2:5第55頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月6.6內(nèi)部函數(shù)與外部函數(shù)根據(jù)函數(shù)能否被其他源文件調(diào)用,函數(shù)分為:內(nèi)部函數(shù):僅供本文件調(diào)用。外部函數(shù):可供其他文件調(diào)用。第56頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月一、內(nèi)部函數(shù)定義形式:static類型標(biāo)識(shí)符函數(shù)名([形參表]) 例如: file1.c file2.c voidmain() f() {…… {…… f1(); f1();/*此處不可調(diào)用*/ ……} ……}}
staticintf1() {……}說明:內(nèi)部函數(shù)只能被本文件中的其它函數(shù)調(diào)用。第57頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月定義形式:
[extern]類型標(biāo)識(shí)符函數(shù)名(形參表){…}說明:在調(diào)用此函數(shù)的文件中,用extern聲明所調(diào)用的函數(shù)是外部函數(shù)。即:
extern
類型標(biāo)識(shí)符函數(shù)名([參數(shù)表]);二、外部函數(shù)第58頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例:二分法查找。二分查找法也稱為折半查找法。它的基本思想是,將n個(gè)元素分成個(gè)數(shù)大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則終止。如果x<a[n/2],則只需在數(shù)組的左半部分繼續(xù)用此方法查找(這里假設(shè)數(shù)組元素呈升序排列)。如果x>a[n/2],則只需在數(shù)組的右半部分繼續(xù)查找。第59頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例:二分法查找。/*文件file1.cpp*/#include<stdio.h>voidmain(){
externintsearch(intx[],intn,ints);intx,i,value[]={3,8,14,37,89};/*數(shù)據(jù)要升序排列*/scanf("%d",&x);/*輸入要查找的數(shù)據(jù)*/i=search(value,5,x);if(i<0)printf("%d不存在\n",x);elseprintf("%d的位置是%d",x,i);/*i為下標(biāo),從0開始*/}第60頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月/*文件file2.cpp*/#include<stdio.h>intsearch(intx[],intn,ints){ intlow=0,high=n-1,mid;while(low<=high){mid=(low+high)/2;if(x[mid]==s)break; elseif(x[mid]<s) low=mid+1;elsehigh=mid-1;}if(low<=high)returnmid;elsereturn-1;}運(yùn)行情況:3737的位置是3第61頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月6.8
編譯預(yù)處理宏定義文件包含6.8.1
概述
C編譯系統(tǒng)對(duì)程序進(jìn)行編譯前,先對(duì)程序中某些特殊的命令進(jìn)行“預(yù)處理”。然后將預(yù)處理的結(jié)果和源程序一起再進(jìn)行通常的編譯處理,以得到目標(biāo)代碼。預(yù)處理命令的特點(diǎn):①以“#”開頭②結(jié)尾無“;”
第62頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月宏定義的概念用一個(gè)標(biāo)識(shí)符來表示一個(gè)字符串。不帶參數(shù)帶參數(shù)宏定義6.8.2宏定義分類第63頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月1.不帶參數(shù)的宏定義形式:#define宏名字符串作用:用宏名表示一個(gè)字符串。說明:宏名是用戶指定的有意義的標(biāo)識(shí)符,一般用大寫字母表示。例如:#defineG9.8使用宏定義,可以減少程序中某些字符串的重復(fù)書寫,同時(shí)提高程序的通用性。宏展開時(shí),字符串按原樣取代宏名。第64頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.23:無參宏定義#include<stdio.h>#defineM(y*y+3*y)voidmain(){ints,y;printf("Inputanumber:\n");scanf("%d",&y);s=3*M+4*M+5*M;printf("S=%d\n",s);}
運(yùn)行情況:Inputanumber:1↙S=48第65頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月宏定義允許嵌套。即:用已定義的宏還可以定義另一個(gè)宏。例2:#include<stdio.h>#defineR3.0#definePI3.1415926#defineSPI*R*Rvoidmain(){ printf("%f\n",S);}運(yùn)行結(jié)果:28.274333第66頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月⑤可用“#undef”命令終止宏定義的作用域,否則,終點(diǎn)到文件尾。例如:#defineG9.8#include<stdio.h>voidmain(){……}#undefGfloatf(){……}G的有效范圍第67頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月形式:#define宏名(參數(shù)表)字符串作用:用宏名代表一個(gè)字符串。說明:字符串中應(yīng)含有括號(hào)中所指定的參數(shù)。例如:
#defineL(r)3.141593*2*r#defineS(a,b)a*b宏展開時(shí),先進(jìn)行字符串原樣替換,之后進(jìn)行參數(shù)的替換。例如,對(duì)宏L(a+b)展開后為:3.141593*2*a+b
解決方法:字符串中的參數(shù)用括號(hào)括起來。2.帶參數(shù)的宏定義第68頁(yè),課件共77頁(yè),創(chuàng)作于2023年2月例6.25:帶參宏定義#include<stdio.h>#defineMAX(a,b)(a>b)?a:bvoidmain(){ intx,y,max;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代辦公家具的環(huán)保理念與可持續(xù)發(fā)展
- 現(xiàn)代生活節(jié)奏下的胃腸疾病預(yù)防教育
- 生產(chǎn)制造中的綠色技術(shù)升級(jí)路徑與策略
- 基坑施工安全專項(xiàng)方案
- 現(xiàn)代服務(wù)業(yè)的發(fā)展趨勢(shì)及投資策略研究
- 生產(chǎn)安全監(jiān)督與危機(jī)管理一體化建設(shè)
- 生態(tài)農(nóng)業(yè)發(fā)展對(duì)商業(yè)模式的創(chuàng)新影響
- 現(xiàn)代農(nóng)業(yè)機(jī)械設(shè)備智能化國(guó)際對(duì)比研究
- 2024-2025學(xué)年高中生物 專題5 課題1 DNA的粗提取與鑒定說課稿 新人教版選修1
- 9 生活離不開他們 第一課時(shí) 說課稿-2023-2024學(xué)年道德與法治四年級(jí)下冊(cè)統(tǒng)編版001
- 2025屆江蘇省常州市高級(jí)中學(xué)高三第二次模擬考試語(yǔ)文試卷含解析
- 高三日語(yǔ)一輪復(fù)習(xí)助詞「で」的用法課件
- 保險(xiǎn)業(yè)消費(fèi)者權(quán)益保護(hù)工作計(jì)劃
- 2024-2030年中國(guó)銣銫及其化合物行業(yè)深度調(diào)研及投資戰(zhàn)略分析報(bào)告
- 散貨物流行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- JJF 2168-2024鹽霧試驗(yàn)箱校準(zhǔn)規(guī)范
- 電子琴簡(jiǎn)譜大全100首
- 痛風(fēng)性關(guān)節(jié)炎中醫(yī)護(hù)理查房
- 石膏固定骨牽引的護(hù)理
- 廚房食材補(bǔ)貨方案
- 2024年重慶市中考數(shù)學(xué)試卷(AB合卷)【附答案】
評(píng)論
0/150
提交評(píng)論