版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第八章函數(shù)程序運(yùn)行后的輸出為****************************************Howareyou****************************************main(){}
printf(“*********************”);
printf(“*********************”);
printf(“*********************”);
printf(“*********************”);
printf(“Howareyou?”);main(){star();star();
Printmessage();star();
star();}
star(){printf(“*********************”);
}printmessage(){printf(“Howareyou?”);
}
printf(“*********************”);
printf(“*********************”);
printf(“*********************”);
printf(“*********************”);}
printf(“Howareyou?”);從上例程中不難看出:(1)函數(shù)分為標(biāo)準(zhǔn)函數(shù)和自定義函數(shù).例如:函數(shù)標(biāo)準(zhǔn)函數(shù)自定義函數(shù)scanf()printf()sqrt(x)sin(x)Printmessage()star()(2)程序的執(zhí)行從main()函數(shù)開(kāi)始,調(diào)用其他函數(shù)后又返回到main()函數(shù),在main()函數(shù)中結(jié)束程序的運(yùn)行.標(biāo)準(zhǔn)函數(shù):是系統(tǒng)定義好的函數(shù),我們可以直接從函數(shù)庫(kù)中取出來(lái)調(diào)用。如:“stadio.h”,“math.h”庫(kù)自定義函數(shù):是程序設(shè)計(jì)者為滿足自己的實(shí)際需要而自己定義的特殊功能的函數(shù)
8.2函數(shù)的定義變量定義輸入語(yǔ)句算法的描述輸出語(yǔ)句main(){}求兩個(gè)數(shù)中的最大值inta,b,c;Scanf(“,%d,%d”,&a,&b);變量定義輸入語(yǔ)句算法的描述輸出語(yǔ)句C=max(a,b);printf(“max=%d”,c);類型函數(shù)名(形參表)參數(shù)定義;{}inta,b;intz;if(a>b)z=a;elsez=b;return(z);求三個(gè)數(shù)中的最大值inta,b,c,d,x;Scanf(“%d,%d,%d”,&a,&b,&c);x=max(a,b);d=max(x,c);printf(“max=%d”,d);intmaxa,b形式參數(shù)實(shí)際參數(shù)main(){print();
}類型函數(shù)名(參數(shù)列表)參數(shù)定義;{
}變量定義輸入語(yǔ)句算法的描述輸出語(yǔ)句intn,i,j;
for(i=1;i<=n;i++){printf("%*c",40-2*(i-1),'');
for(j=1;j<=2*i-1;j++)
printf("%-2c",'*');
printf("\n");}
printscanf(“%d”,&n);當(dāng)我們只執(zhí)行某個(gè)操作而不需要傳遞數(shù)據(jù)時(shí)可以定義無(wú)參函數(shù)。如:打印三角形函數(shù)的定義從形式上可分為:定義的一般形式:類型說(shuō)明符函數(shù)名(){
說(shuō)明部分執(zhí)行部分
}定義的一般形式:類型說(shuō)明符函數(shù)名(形式參數(shù)表列)形式參數(shù)說(shuō)明部分{
說(shuō)明部分
執(zhí)行部分}無(wú)形式參數(shù)函數(shù)的定義有形式參數(shù)函數(shù)的定義算法輸出部分算法輸出部分8.4函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:函數(shù)名(實(shí)際參數(shù)表列);調(diào)用無(wú)參函數(shù),則實(shí)參表列可以沒(méi)有,但括弧不能省略。說(shuō)明:調(diào)用有參函數(shù),則實(shí)參表列各參數(shù)間用逗號(hào)間隔。實(shí)參與形參個(gè)數(shù)應(yīng)相等,類型應(yīng)一致,順序一一對(duì)應(yīng)。函數(shù)調(diào)用一般有以下三種方式:自定義函數(shù)的調(diào)用方式和標(biāo)準(zhǔn)函數(shù)的調(diào)用方式是一樣的。唯一的區(qū)別就是誰(shuí)編寫(xiě)的這個(gè)函數(shù)。標(biāo)準(zhǔn)函數(shù)的調(diào)用:x=sqrt(2*8);printf(“***”);等函數(shù)的調(diào)用方式:1、函數(shù)語(yǔ)句。(把函數(shù)調(diào)用作為一個(gè)語(yǔ)句)
標(biāo)準(zhǔn)函數(shù)
自定義函數(shù)
printf(“請(qǐng)用心聽(tīng)講”);
star();2、函數(shù)出現(xiàn)在一個(gè)表達(dá)式中。
標(biāo)準(zhǔn)函數(shù)
自定義函數(shù)
s=pow(x,y);
c=2*max(a,b);3、函數(shù)調(diào)用作為一個(gè)函數(shù)的參數(shù)。
標(biāo)準(zhǔn)函數(shù)
自定義函數(shù)
m=sqrt(pow(x,3));
m=max(a,max(b,c));
main(){inta,b,c,s;do{printf(“Enterthreemuber,end
markis000\n”);
scanf(“%d%d%d”,&a,&b,&c);s=sum(a,b,c);
printf(“sum=%d\n”,s);}while(!(a==0&&b==0&c==0));}intsum(x,y,z)intx,y,z;{intm;m=x+y+z;return(m);}float
%f%f%f”%f
float
float
,sum();
例當(dāng)用戶從鍵盤(pán)輸入三個(gè)整數(shù)時(shí),計(jì)算機(jī)顯示出這三個(gè)數(shù)之和。若三數(shù)均為零,則程序結(jié)束。注意:實(shí)參與形參個(gè)數(shù)應(yīng)相等,類型應(yīng)一致,順序一一對(duì)應(yīng)。實(shí)參形參float
main(){intm,n;longt,fac();
printf("Pleaseinputm,n(m>n):");
scanf("%d%d",&m,&n);t=fac(m)/(fac(n)*fac(m-n));printf("c(n,m)=%ld/(%ld*%ld)=%ld",fac(m),fac(n),fac(m-n),t);}longfac(n)
intn;{inti;longf=1;for(i=1;i<=n;i++)f=f*i;return(f);}輸入:87;m=8,n=7;t=fac(8)/(fac(7)*fac(1));
8840320775040Fac(7)Fac(8)403205040Fac(1)1111輸出:c(n,m)=40320/(5040*1)=8思考:編寫(xiě)程序計(jì)算函數(shù)的類型一、函數(shù)的類型說(shuō)明函數(shù)的類型是指函數(shù)返回值的類型.定義函數(shù)時(shí)是放在函數(shù)名之前.當(dāng)類型為char或int時(shí),可以缺省函數(shù)的類型說(shuō)明floatf1(x)floatx;…{…}doublef2(x)doubley;{…}voidf3(x)doublex;{…}longf4(x)intx;{…}intf5(x)intx;{…}函數(shù)的類型說(shuō)明可缺省的函數(shù)類型說(shuō)明是
int
或charcharf6(x)intx;{…}float
double
void
long
int
char
?在主調(diào)函數(shù)的函數(shù)體內(nèi)要對(duì)被調(diào)函數(shù)的類型進(jìn)行說(shuō)明floatf1(x,y)floatx;
inty;{…}main(){floatf1();floatf2();
int
f3();…}floatf2(x)doublex;{…}在主調(diào)函數(shù)體內(nèi)說(shuō)明被調(diào)函數(shù)的類型int
f3(x)intx;{…}定義在前,調(diào)用在后,可缺省對(duì)被調(diào)函數(shù)的類型說(shuō)明類型為char或int時(shí),可缺省對(duì)被調(diào)函數(shù)的類型說(shuō)明float
f1();float
f2();intf3();
?當(dāng)被調(diào)函數(shù)定義在前,主調(diào)函數(shù)定義在后,在主調(diào)函數(shù)內(nèi)可缺省對(duì)被調(diào)函數(shù)的類型說(shuō)明?當(dāng)說(shuō)明函數(shù)的類型為char或int時(shí),在主調(diào)函數(shù)內(nèi)可缺省對(duì)被調(diào)函數(shù)的類型說(shuō)明6.3.2返回語(yǔ)句返回語(yǔ)句可以有.例如:返回語(yǔ)句中的表達(dá)式類型與函數(shù)的類型說(shuō)明不一致時(shí),以函數(shù)的類型說(shuō)明為準(zhǔn).例如:intf1(x)intx;{
inty;y=++x;
returny;}返回語(yǔ)句也可以無(wú).例如:voidf1(x)intx;{
inty;y=++x;...}返回語(yǔ)句可以有表達(dá)式.例如:intf1(x)intx;{
inty;y=++x;
return++x;}intf1(x)floatx;{floaty;y=++x;
returny;}回傳類型為int格式:return(表達(dá)式);
return表達(dá)式;8.3函數(shù)參數(shù)和函數(shù)的值一、形式參數(shù)與實(shí)際參數(shù)在大多情況下的函數(shù)調(diào)用,主調(diào)函數(shù)和被調(diào)函數(shù)之間有數(shù)據(jù)傳遞關(guān)系.定義函數(shù)時(shí)的參數(shù)稱為形式參數(shù)(或“形參”),調(diào)用函數(shù)時(shí)的參數(shù)稱為實(shí)在參數(shù)(或“實(shí)參”).例如:數(shù)據(jù)傳送方式:傳值int
zs(x)
intx;{inti,k=1;for(i=2;i<x;i++)if(a%i==0)k=0;return(k);}main(){inta,i;for(a=3,i=1;i<=10;a++)if(zs(a)&&zs(a+2)){printf("%dand%d\n",a,a+2);i++;}}實(shí)參形參形參類型說(shuō)明函數(shù)返回值類型說(shuō)明
變量作為函數(shù)參數(shù)時(shí)數(shù)據(jù)傳遞是單向值傳遞,形參與實(shí)參分別占據(jù)不同的內(nèi)存單元。形參
x實(shí)參a33調(diào)用zs(a)結(jié)果1形參
x實(shí)參a+255調(diào)用zs(a+2)結(jié)果1傳值調(diào)用中,實(shí)際參數(shù)可以是:
變量、表達(dá)式、常數(shù)、函數(shù)還有數(shù)組元素。如:zs(a),zs(a+2)sqrt(16)max(a,max(a,b)),zs(a[2])二、形式參數(shù)與實(shí)際參數(shù)的結(jié)合下面,通過(guò)求三個(gè)數(shù)最大值的程序,討論形參與實(shí)參數(shù)的結(jié)合.main(){inta,b,c,f;a=4,b=3,c=5;f=max(max(a,b),c);
printf(“max=%d\n”,f);}max(a,b)inta,b;{intf;if(a>b)f=a;elsef=b;returnf;}a=4,b=3,c=5;max(a,b)max(4,3)a=4,b=3;4>3f=4;回傳
4后結(jié)束
.max(a,b)inta,b;{intf;if(a>b)f=a;elsef=b;returnf;}4max(4,c);a=4,b=5;4>5f=5;max(4,5)回傳5后結(jié)束.
5;max(a,b)inta,b;{intf;if(a>b)f=a;elsef=b;returnf;}輸出:max=5f=5;形式參數(shù)與實(shí)際參數(shù)的結(jié)合實(shí)際上是將實(shí)參的值賦給形參然后又用函數(shù)來(lái)完成規(guī)定的處理,并回送結(jié)果至主調(diào)程序。三、數(shù)組作為函數(shù)參數(shù)(1)數(shù)組元素作為函數(shù)參數(shù)數(shù)組元素作為函數(shù)參數(shù)時(shí),效果與簡(jiǎn)單變量相似,是實(shí)際參數(shù)向形式參數(shù)單向順序地值傳遞。設(shè)有兩個(gè)數(shù)組a和b,各有10個(gè)元素.求這兩數(shù)組對(duì)應(yīng)元素之和(例如:a[i]+b[i]),并分別統(tǒng)計(jì)其和大于0、小于0、等于0的個(gè)數(shù)main(){inta[10],b[10],L=0,S=0,E=0,i,f;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++){f=sum(a[i],b[i]);if(f==1)L++;elseif(f==0)E++;elseS++;}
printf(“L=%d,E=%d,S=%d\n”,L,E,S);}sum(x,y)intx,y;{
intf;if(x+y>0)f=1;elseif(x+y==0)f=0elsef=-1;return(f);}i=0,a[0]=1i=1,a[1]=2i=2,a[2]=3i=3333i=0,b[0]=0i=1,b[1]=-2i=2,b[2]=-4i=3i=0,sum(1,0),f=1,f=f=1,L++i=1,sum(2,-2),f=0,f=f=0,E++i=2,sum(3,-4),f=-1,f=f=-1,S++i=3b[i]=-2*i;a[i]=i+1;(2)數(shù)組名作為函數(shù)實(shí)參數(shù)組名作為函數(shù)參數(shù)時(shí),形參與實(shí)參都表示的是地址參數(shù).實(shí)參向形參傳遞地址.變量作為函數(shù)參數(shù)時(shí)數(shù)據(jù)傳遞是單向值傳遞,形參與實(shí)參分別占據(jù)不同的內(nèi)存單元。形參
x實(shí)參a3
3形參數(shù)組
x實(shí)參數(shù)組a2001
2001傳送地址的實(shí)質(zhì)是使主調(diào)函數(shù)和被調(diào)函數(shù)在同一的內(nèi)存單元上進(jìn)行數(shù)據(jù)操作.a[1]ff10a[0]a[2]a[3]a[4]ff10/&a[0ff18/&a[2]ff1c/&a[3]ff20/&a[4]floataverage(a)floata[5];{intk;floats=a[0];for(k=1;k<5;k++)s=s+a[k];s=s/5;returns;}main(){floatn[5],f;inti;for(i=0;i<5;i++)
scanf(“%f”,&n[i]);f=average(n);
printf(“average=%g\n”,f);}ff10n[0]
n[1]
n[2]
n[3]
n[4]n62108
a
for(i=0;i<5;i++)
scanf(“%f”,&n[i]);f=average(n);floataverage(a)floata[5];fi012345k=intk;floats=a[0];
4s=for(k=1;k<5;k++)s=s+a[k];
1
10
2
12
3
22
4
30
5
6s=6;
f=average(n);
4returns;
printf(“average=%g\n”,f);6ff14/&a[1]ff14/&a[1]例、從鍵盤(pán)輸入5個(gè)數(shù),求其平均值.下面的例題也是主調(diào)函數(shù)與被調(diào)函數(shù)在相同的地址單元上對(duì)數(shù)據(jù)進(jìn)行操作.通過(guò)對(duì)sort()函數(shù)的定義和main()函數(shù)對(duì)sort()函數(shù)的調(diào)用,完成一維數(shù)組的排序.main(){intx[5],i;for(i=0;i<5;i++)
scanf(“%d”,&x[i]);sort(x);for(i=0;i<5;i++)printf(“%8d”,&x[i]);}voidsort(a)inta[5];{inti,j,t;for(i=0;i<4;i++)for(j=i+1;j<5;j++)if(a[i]<a[j])t=a[i],a[i]=a[j],a[j]=t;}axX[0]xX[1]xX[2]xX[3]xX[4]x……x為了提高自定義函數(shù)的通用性,在定義函數(shù)時(shí),可用變量表示形參是一維數(shù)組的尺寸.也就是可用兩個(gè)形參來(lái)說(shuō)明一維數(shù)組,一個(gè)表示首地址;一個(gè)表示元素個(gè)數(shù).下面的程序是求數(shù)組中最大值的例題:main(){staticinta[5]={1,6,4,9,3};staticintb[6]={3,1,6,8,4,7};printf(“max=%d\n”,max(a,5));printf(“max=%d\n”,max(b,6));}intmax(x,n)intx[],n;{inti,t=x[0];for(i=1;i<n;i++)if(t<x[i])t=x[i];returnt;}在第一調(diào)用時(shí),max(a,5),使x=a地址相同
,n=5元數(shù)個(gè)數(shù)為5,返回值為9.在第一調(diào)用時(shí),max(b,6),使x=b地址相同,n=6元數(shù)個(gè)數(shù)為6,返回值為8.(3)、用多維數(shù)組作為函數(shù)的參數(shù)1、多維數(shù)組元素可以作為實(shí)參和形參,可當(dāng)作一個(gè)變量2、多維數(shù)組名作為實(shí)參和形參,就是傳地址,與一維數(shù)組類似。在被調(diào)用函數(shù)中對(duì)形參數(shù)組定義時(shí)可以指定每一維的大小,也可以省略第一維的大小說(shuō)明.如:intarray[3][10];
或intarray[][10];
都合法實(shí)參數(shù)組可以大于形參數(shù)組。實(shí)參數(shù)定義為intarray[5][10];形參數(shù)組定義為intarray[3][10];
max_value(array)
intarray[][4];{inti,j,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];return(max);}main(){staticinta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};
printf("maxvalueis%d\n",max_value(a));}例、有一個(gè)3*4的矩陣,求其中的最大元素。8.5函數(shù)的嵌套調(diào)用
C語(yǔ)言的函數(shù)定義都是互相平行、獨(dú)立的,即在定義函數(shù)時(shí),一個(gè)函數(shù)內(nèi)不能包含另一個(gè)函數(shù)的完整定義,也就是C語(yǔ)言不能嵌套定義函數(shù).但是C語(yǔ)言允許嵌套調(diào)用函數(shù).唯有主函數(shù)main()不可被其他函數(shù)調(diào)用.main(){floata,b,c,m,max();scanf(“%f%f%f”,&a&b,&c);m=max(a,b,c);printf(“max=%f\n”,m);}floatmax(a,b,c)floata,b,c;{floatt1,t2,func();t1=func(a,b);t2=func(t1,c);returnt2;}floatfunc(a,b)floata,b;{returna>b?a:b;}定義變量說(shuō)明函數(shù)下面是函數(shù)的嵌套調(diào)用,求三個(gè)數(shù)中最大值的程序:下面是函數(shù)的嵌套調(diào)用,求三個(gè)數(shù)中最大值的流程示意圖:main()max(a,b,c)func(a,b)func(t1,c)給a,b,c輸入數(shù)據(jù)輸出最大值mm=t1=t2=返回較大值返回較大值返回t2值結(jié)束運(yùn)行main(){floata,b,c,m,max();scanf(“%f%f%f”,&a&b,&c);m=max(a,b,c);printf(“max=%f\n”,m);}floatmax(a,b,c)floata,b,c;{floatt1,t2,func();t1=func(a,b);t2=func(t1,c);returnt2;}floatfunc(a,b)floata,b;{returna>b?a:b;}8.6函數(shù)的遞歸調(diào)用
C語(yǔ)言的函數(shù)可以直接或間接調(diào)用函數(shù)自身,我們稱這種調(diào)用為函數(shù)的遞歸調(diào)用.下面是用遞歸函數(shù)求n!的例題:定義函數(shù)fact()與自變量n的函數(shù)關(guān)系為:n!=(n-1)!*n1n>1n=1fact(n)/*定義fact()函數(shù)*/intn;{intf;if(n==1)f=1;elsef=fact(n-1)*n;returnf;}main()/*定義main()函數(shù)*/{intn;n=fact(4);printf(“4!=%d\n”,n);}該程序的執(zhí)行步驟如下:main()fact(4)fact(3)
4fact(2)
3fact(1)
2n=f=f=f=f=112f=2f=66f=24n=24輸出4!=24結(jié)束運(yùn)行fact(n)/*定義fact()函數(shù)*/intn;{intf;if(n==1)f=1;elsef=fact(n-1)*n;returnf;}例:用遞歸求m,n中的最大公約數(shù)(m>n)。
輾轉(zhuǎn)相除法
r=m%n;m=n;n=r;請(qǐng)把遞歸公式描述出來(lái)gcd(m,n)=ngcd(n,m%n),m%n==0m%n!=0main(){intm,n;
printf("inputtwonuber(m>n)");
scanf("%d%d",&m,&n);
printf("\t%d\n",gcd(m,n));}int
gcd(int
m,intn){if(n==0)returnm;elsereturngcd(n,m%n);}main()輸入12,8printf("%d",gcd(12,8));gcd(12,8){n!=0returngcd(8,12%8);}gcd(8,4){n!=0returngcd(4,0)}main()輸入12,8printf("%d",4);gcd(12,8){n!=0return4}gcd(8,4){n!=0return4}gcd(4,0){n==0returnm=4}例:(Hanoi)漢諾塔問(wèn)題(見(jiàn)課本161頁(yè))ABC模擬這一過(guò)程的算法稱為:hanoi(n,a,b,c);那么:第一步:先把n-1個(gè)盤(pán)子設(shè)法借C桿移到B桿,記做:hanoi(n-1,a,c,b);第二步:把第n個(gè)盤(pán)子從A桿移到C桿。(可用自然語(yǔ)言表示出來(lái))第三步:把B桿上的n-1個(gè)盤(pán)子借助A桿移到C桿,記做
hanoi(n-1,b,a,c)voidhanoi(intn,chara,charb,charc){if(n>0){hanoi(n-1,a,c,b);
printf("\tmove%dfrom%cto%c\n",n,a,c);hanoi(n-1,b,a,c);}}#include"conio.h"main(){intn;
clrscr();
printf("\tPleaseinputthenumberofdisk:");
scanf("%d",&n);
hanoi(n,'a','b','c');}歸納遞歸的基本思想如下:1、將后一項(xiàng)表示成前一項(xiàng)的表達(dá)式式子。(找出后一項(xiàng)與前一項(xiàng)之間的關(guān)系)如:n!=(n-1)!*n2、還要有一個(gè)能使遞歸結(jié)束返回的條件,如:n!=1(n=1)試寫(xiě)出用遞歸求xnxn=xn-1
x1n>=0n=01.完成下面的程序,使它能輸出10~1000之間的所有素?cái)?shù).#include<stdio.h>main(){inti;for(i=10;i<=1000;i++)if(isprime(________))
printf(“%d”,i);printf(“\n”);}#include________isprime(n)intn;{inti;for(i=2;i<=sqrt(n);i++)if(n%i==0)
return(________);return(________);}i<math.h>012.
函數(shù)tryme調(diào)用時(shí)若輸入ABCDE$,則輸出為_(kāi)___voidtryme(void){charch;
if((ch=getchar())!=’$’){putchar(ch);
tryme();}}
Aputchar(ch);Atryme();voidtryme(void)Bputchar(ch);ABtryme();ABCDE‘$’}(11)#include“stdio.h”main(){printf(“\nfact(5):%d”,fact(5));printf(“\nfact(1):%d”,fact(1));fact(-4);}fact(n);intn;{if(n<0){printf(“\nERROR!”);return(-1);}elseif(n==1)||(n==0)return1;elsereturn(n*fact(n-1));}fact(5)5120輸出:fact(5):120fact(1)11fact(5):120fact(1):1fact(-4);-4(-4<0)printf(“\nERROR!”);fact(5):120fact(1):1ERROR!return(-1);}-1receive(){charch;
scanf(%c”,&ch);
printf(“%c”,ch);if(ch!=‘.’)receive();
printf(“%c”,ch);}main(){receive();}輸入:god.輸出:ch=‘g’printf(“%c”,ch);gif(ch!=‘.’)receive();receive()ch=‘o’printf(“%c”,ch);goif(ch!=‘.’)receive();godreceive()ch=‘.’printf(“%c”,ch);if(ch!=‘.’)receive();god.printf(“%c”,ch);ch=‘g’printf(“%c”,ch);receive()printf(“%c”,ch);ch=‘o’printf(“%c”,ch);receive()printf(“%c”,ch);ch=‘d’printf(“%c”,ch);receive()printf(“%c”,ch);ch=‘.’printf(“%c”,ch);if(ch!=‘.’)…printf(“%c”,ch);god..god..dgod..dogod..dog上機(jī)作業(yè):1、定義一函數(shù)digit(n,k),它回送整數(shù)n的從右邊開(kāi)始數(shù)第k個(gè)數(shù)字的值。例如:
digit(15327,4)=5digit(289,5)=0
請(qǐng)編出完整的程序。2、定義一個(gè)函數(shù)check(n,d),它回送一個(gè)布爾值。如果數(shù)字d在整數(shù)n的某位中出現(xiàn),則回送1,否則回送0。假如:
check(3256,2)=1check(1725,3)=0
編出完整的程序。3、P186、8.4上機(jī)作業(yè):1、定義一函數(shù)digit(n,k),它回送整數(shù)n的從右邊開(kāi)始數(shù)第k個(gè)數(shù)字的值。例如:
digit(15327,4)=5digit(289,5)=0
請(qǐng)編出完整的程序。2、定義一個(gè)函數(shù)check(n,d),它回送一個(gè)布爾值。如果數(shù)字d在整數(shù)n的某位中出現(xiàn),則回送1,否則回送0。假如:
check(3256,2)=1check(1725,3)=0
編出完整的程序。for(i=1;i<=k-1;i++)n=n/10;d=n%10;n=n/(int)pow(10,k-1);d=n%10;for(i=0;n!=0;i++){x=n%10;n=n/10;if(x==n){bool=1;break;}}8.8局部變量與全局變量一、局部變量在函數(shù)內(nèi)部定義的變量稱為局部變量局部變量?jī)H能由定義該變量的函數(shù)的內(nèi)部語(yǔ)句所訪問(wèn)在一個(gè)函數(shù)當(dāng)前被執(zhí)行時(shí),它的局部變量生存;執(zhí)行結(jié)束后,它的局部變量消失一、局部變量在函數(shù)內(nèi)部定義的變量稱為局部變量.
局部變量?jī)H能由該函數(shù)內(nèi)部的語(yǔ)句所訪問(wèn);對(duì)于該函數(shù)之外的語(yǔ)句來(lái)說(shuō),局部變量是不可知的.在一個(gè)函數(shù)當(dāng)前被執(zhí)行時(shí),它的局部變量生存;執(zhí)行結(jié)束后,它的局部變量消失.例如:f1(){int
x;......}main(){floatx;……}main函數(shù)內(nèi)定義的局(或內(nèi))部變量x只能在main函數(shù)內(nèi)使用.f2(x)int
x;{int
y,z;…if(x)...}f1函數(shù)內(nèi)定義的局部變量x只能在f1函數(shù)內(nèi)使用.f2函數(shù)內(nèi)說(shuō)明的x,定義的y和z只能在f2函數(shù)內(nèi)使用.二、全局變量在函數(shù)體外定義的變量稱為全局變量,與局部變量不同,全局變量的有效范圍從定義起一直到本源文件結(jié)束止.例如:intx,a;f1(){int
a;...}main(){floaty;…}char
b;f2(z)int
z;{int
y;…if(x){int
n;…}…}全局變量x,a在f1、main、f2函數(shù)中都有效;全局變量b在f2函數(shù)中有效.全局變量a在f1函數(shù)中與局部變量a同名時(shí),在f1函數(shù)中全局變量a無(wú)效.inta=3,b=5;main(){voidfun(void);
printf("a=%d,b=%d\n",a,b);fun();
printf("a=%d,b=%d\n",a,b);}voidfun(void){intc;c=a,a=b,b=c;}main(){voidfun(void);
inta=3,b=5;
printf("a=%d,b=%d\n",a,b);fun();
printf("a=%d,b=%d\n",a,b);}voidfun(void){intc;c=a,a=b,b=c;}main(){voidfun();
inta=3,b=5;
printf("a=%d,b=%d\n",a,b);fun(a,b);
printf("a=%d,b=%d\n",a,b);}voidfun(int
a,intb){intc;c=a,a=b,b=c;}利用全局變量實(shí)現(xiàn)兩數(shù)交換不用全局變量,而用局部變量能實(shí)現(xiàn)嗎?如何實(shí)現(xiàn)?根本無(wú)法實(shí)現(xiàn)!練習(xí):寫(xiě)出下列程序的運(yùn)行結(jié)果inta=5;main(){printf("a=%d\n",a);p1();p2();return;}
p1(){printf("a*a=%d\n",a*a);a=8;return;}p2(){printf("a*a*a=%d\n",a*a*a);return;}printf("a=%d\n",5);printf("a*a=%d\n",a*a);p1();a=8;return;p2();printf("a*a*a=%d\n",a*a*a);return;return;輸出:a=5
a*a*a=512
a*a=258.9變量的存儲(chǔ)屬性在C語(yǔ)言中變量有兩個(gè)屬性:變量的類型和變量的存儲(chǔ)方式.類型:如char、int、float等在前面的章節(jié)中介紹過(guò)一些.存儲(chǔ)方式有四種:
自動(dòng)(auto)
靜態(tài)(static)
寄存器(register)
外部
(extern)前面,我們討論了全局變量和局部變量的作用(或有效)域,我們從變量的存在空間這一角度討論了變量的存儲(chǔ)屬性;在這一節(jié)我們將從變量值的存在時(shí)間這一角度來(lái)討論變量的存儲(chǔ)屬性.一、局部變量的存儲(chǔ)方式1)以自動(dòng)方式存儲(chǔ)
函數(shù)中的局部變量一般都是動(dòng)態(tài)分配存儲(chǔ)空間,對(duì)它們分配和釋放存儲(chǔ)空間的工作是由系統(tǒng)自動(dòng)處理的.因此,這類局部變量也稱為自動(dòng)變量.在定義變量時(shí)用auto修飾或缺省.例如:func(){autointi,j,k;...}func(){
inti,j,k;...}autointint
相等自動(dòng)變量在函數(shù)被調(diào)用時(shí)才存在,隨函數(shù)的返回(或結(jié)束)而消失.2)以靜態(tài)方式存儲(chǔ)一般情況下,局部變量的值在函數(shù)調(diào)用結(jié)束后就自動(dòng)消失,當(dāng)希望局部變量的值不隨函數(shù)的消失而釋放時(shí),可用靜態(tài)方式存儲(chǔ)局部變量.其方法是在定義變量時(shí),用static修飾.例如求階乘的程序如下
:main(){
inti;for(i=1;i<=4;i++)
printf(“%d!=%d\t”,i,func(i));}func(j)intj;{staticintt=1;t=t
j;returnt;}運(yùn)行結(jié)果為:
2!=23!=6
for(i=2;i<=3;i++)
func(2)
func(2)
j=2;
t=1;
回傳2結(jié)束func().t=2;
2
輸出
2!=2????_
main(){
inti;
for(i=2;i<=3;i++)
printf(“%d!=%d\t”,i,func(i));}func(j)intj;{staticintt=2;t=t
j;returnt;}func(3)
func(3)
j=3;
t=6;
回傳6結(jié)束func().
func(j)intj;{staticintt=6;t=t
j;returnt;}6
輸出:3!=6????
main(){
inti;for(i=1;i<=4;i++)
printf(“%d!=%d\t”,i,func(i));}func(j)intj;{staticintt=1;t=t
j;returnt;}main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;/*auto*/x++;
printf("\t%d\n",x);}main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;/*static*/x++;
printf("\t%d\n",x);}試比較二者輸出結(jié)果3)以寄存器方式存儲(chǔ)為了提高程序的執(zhí)行速度,C語(yǔ)言可直接把變量存儲(chǔ)到CPU中的寄存器中.其方法是在定義變量時(shí),用register修飾.例如下面是寄存器變量的定義格式:registerintx,y;或registerx,y;main(){inti=1,j=1;for(;i<=9;i++){for(j=1;j<=9;j++)
printf(“%d*%d=%2d”,i,j,i*j);
printf(“\n“);}}main(){registerinti=1,j=1;for(;i<=9;i++){for(j=1;j<=9;j++)
printf(“%d*%d=%2d”,i,j,i*j);
printf(“\n“);}}由于i,j使用頻繁,將i,j設(shè)為寄存器只有自動(dòng)變量和局部變量才能定義成寄存器變量4)外部變量(全局變量)的存儲(chǔ)方式在同一源程序文件全局變量的作用域是從定義它的地方開(kāi)始,一直到本源程序文件結(jié)束.
如果某個(gè)函數(shù)要求提前使用全局變量,則要在此函數(shù)中用“extern”對(duì)全局變量進(jìn)行說(shuō)明.例如:…f1(){externintx;.../*說(shuō)明全局變量*/}...intx;/*定義全局變量*/...5)以靜態(tài)方式存儲(chǔ)由上述的討論可知,對(duì)于定義的全局變量用“extern”進(jìn)行說(shuō)明,其作用是擴(kuò)大了全局變量的有效域.這樣做,一方面在函數(shù)之間建立了多種數(shù)據(jù)聯(lián)系;另一方面給程序的結(jié)構(gòu)方面帶來(lái)了一些副作用.為了克服副作用,可在定義全局變量時(shí)用“static”來(lái)限定變量只能被本源程序文件引用.例如:typefile1.cstatic
intx,y;charch;main(){...}...typefile2.cexternintx,y;externcharch;func21(){...}...在file2.c中不能引用file1.c中的全局變量x和y.限定全局變量x和y只能被本源程序文件引用.6)外部變量的副作用有了外部變量后增加了一條與外界傳遞數(shù)據(jù)的渠道,但它作為公共信息的一種載體,也會(huì)產(chǎn)生一些副作用。例、程序設(shè)計(jì)者試圖打印一個(gè)由“*”組成的55階矩陣而現(xiàn)在它輸出的又是什么?inti;main(){voidprt();for(i=0;i<5;i++)
prt();}voidprt(){for(i=0;i<5;i++)
printf("%c",'*');
printf("\n");}輸出:*****(9)以下程序的輸出結(jié)果是___
intfun(intx,inty)
{staticintm=0,i=2;
i+=m+1;
m=i+x+y;
returnm;
}
main()
{intj=4,m=1,k;
k=fun(j,m);printf("%d,",k);
k=fun(j,m);printf("%d\n",k);
}fun(4,1);
4,1i+=0+1;i=3;m=3+4+1;m=8;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)技術(shù)服務(wù)勞務(wù)協(xié)議(2024版)版B版
- 2024年綠色屋頂設(shè)計(jì)與施工合同范本3篇
- 2024房地產(chǎn)融資合同范本
- 【放射科】精準(zhǔn)醫(yī)療幕后的先鋒團(tuán)隊(duì)
- 11-1《諫逐客書(shū) 》(說(shuō)課稿)-2024-2025學(xué)年高一語(yǔ)文下學(xué)期同步教學(xué)說(shuō)課稿專輯(統(tǒng)編版必修下冊(cè))
- 福建省南平市塔前中學(xué)2022年高二數(shù)學(xué)理聯(lián)考試題含解析
- 2024文化石礦山開(kāi)采及加工合作合同范本3篇
- 雙十一旅行新品盛宴
- 2024港口物流信息化建設(shè)合同
- 招投標(biāo)問(wèn)題權(quán)威答復(fù)
- 老年人能力評(píng)估標(biāo)準(zhǔn)解讀講義課件
- 材料報(bào)價(jià)三家對(duì)比表
- 2024年國(guó)家公務(wù)員考試公共基礎(chǔ)知識(shí)全真模擬試題及答案(共四套)
- 焊接工序首件檢驗(yàn)記錄表
- (通橋【2018】8370)《鐵路橋梁快速更換型伸縮縫安裝圖》
- 針灸的作用原理和治療原則
- 標(biāo)準(zhǔn)輔助航空攝影技術(shù)規(guī)范
- 2023年中國(guó)人保財(cái)險(xiǎn)校園招聘筆試參考題庫(kù)附帶答案詳解
- 項(xiàng)目經(jīng)理部組織機(jī)構(gòu)
- 某辦公樓裝飾工程監(jiān)理大綱方案
- 七年級(jí)上學(xué)期期末考試歷史試卷及答案(人教版)
評(píng)論
0/150
提交評(píng)論