




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
函數(shù)及變量的存儲類別第一頁,共八十一頁,編輯于2023年,星期日第5章函數(shù)及變量的存儲類別5.0
概述模塊化程序設計基本思想:將一個大的程序按功能分割成一些小模塊,特點:各模塊相對獨立、功能單一、結構清晰、接口簡單控制了程序設計的復雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復勞動易于維護和功能擴充開發(fā)方法:自上向下,逐步分解,分而治之第二頁,共八十一頁,編輯于2023年,星期日C是模塊化程序設計語言C程序結構C是函數(shù)式語言必須有且只能有一個名為main的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始,在main中結束函數(shù)不能嵌套定義,可以嵌套調用第三頁,共八十一頁,編輯于2023年,星期日函數(shù)分類從用戶角度標準函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)使用庫函數(shù)應注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件第四頁,共八十一頁,編輯于2023年,星期日#include"stdio.h"main(){intn,k,c;printf("\npleaseinput(n,k):");/*輸入n、k的值*/scanf("%d,%d",&n,&k);c=fac(n)/(fac(k)*fac(n-k));/*三次調用函數(shù)fac,求n!、k!、(n-k)!*/printf("\nC(n,k)=%d",c);/*輸出計算結果*/}intfac(intm)/*計算一個整數(shù)的階乘*/{inti,s=1;for(i=1;i<=m;i++)s*=i;return(s);}
【例5.2】編寫程序計算組合數(shù):
n!C(n,k)=────k!(n-k)!第五頁,共八十一頁,編輯于2023年,星期日5.1
函數(shù)的定義5.1.1一般格式合法標識符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){
說明部分 語句部分}現(xiàn)代風格:例有參函數(shù)(現(xiàn)代風格)
intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)(現(xiàn)代風格)
intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)
dummy(){}函數(shù)體為空例無參函數(shù)
printstar(){printf(“**********\n”);}或
printstar(void){printf(“**********\n”);}第六頁,共八十一頁,編輯于2023年,星期日函數(shù)類型函數(shù)名(形參表)形參類型說明{
說明部分 語句部分}傳統(tǒng)風格:例有參函數(shù)(傳統(tǒng)風格)
intmax(x,y)
intx,y;{intz;z=x>y?x:y;return(z);}第七頁,共八十一頁,編輯于2023年,星期日intmax(intx1,intx2,intx3)/*定義函數(shù)的返回值類型,函數(shù)名,形參*/{intmax;if(x1>x2)max=x1;elsemax=x2;if(max<x3)max=x3;/*通過比較得到三個數(shù)的最大值放到max中*/return(max);/*返回運算結果*/} 【例5.1】編寫函數(shù),求三個整型參數(shù)的最大值。
第八頁,共八十一頁,編輯于2023年,星期日5.1.2函數(shù)的返回值返回語句形式:return(表達式);
或
return表達式;
或
return;功能:使程序控制從被調用函數(shù)返回到調用函數(shù)中,同時把返值帶給調用函數(shù)說明:函數(shù)中可有多個return語句若無return語句,遇到函數(shù)結束的“}”時,自動返回調用函數(shù)若函數(shù)類型與return語句中表達式值的類型不一致,按前者為準,自動轉換------函數(shù)調用轉換void型函數(shù):無返回值的函數(shù)例無返回值函數(shù)
voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}第九頁,共八十一頁,編輯于2023年,星期日printstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}例無返回值的函數(shù)返回后帶回不確定值輸出:10voidprintstar(){printf("**********");}main(){inta;
a=printstar();printf("%d",a);}編譯錯誤!第十頁,共八十一頁,編輯于2023年,星期日例函數(shù)返回值類型轉換main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;
return(z);}第十一頁,共八十一頁,編輯于2023年,星期日5.2
函數(shù)的調用5.2.1調用形式:
函數(shù)名(實參表)函數(shù)語句:函數(shù)調用可單獨成為一個語句
例output();
;printf(“Hello,World!\n”);函數(shù)表達式:
調用函數(shù)后的返回值可參加表達式的計算,這時要求被調函數(shù)帶返回值。例sum=add(a,b);
c=fac(n)/(fac(k)*fac(n-k))
;函數(shù)參數(shù):帶返回值的函數(shù)調用亦可作為其它函數(shù)的參數(shù)(實際參數(shù))
例printf(“%d”,max(a,b));m=max(a,max(b,c));第十二頁,共八十一頁,編輯于2023年,星期日調用方式函數(shù)語句:函數(shù)調用可單獨成為一個語句
例output();
;printf(“Hello,World!\n”);函數(shù)表達式:
調用函數(shù)后的返回值可參加表達式的計算,這時要求被調函數(shù)帶返回值。例sum=add(a,b);
c=fac(n)/(fac(k)*fac(n-k))
;函數(shù)參數(shù):帶返回值的函數(shù)調用亦可作為其它函數(shù)的參數(shù)(實際參數(shù))
例printf(“%d”,max(a,b));m=max(a,max(b,c));第十三頁,共八十一頁,編輯于2023年,星期日調用函數(shù)的過程是:①為函數(shù)的所有形參分配內存單元。②計算各個實參表達式的值,一一對應的賦值給相應形參(若是無參函數(shù),上述過程不執(zhí)行)。③進入函數(shù)體,執(zhí)行函數(shù)中的語句,實現(xiàn)函數(shù)的功能。④執(zhí)行到return語句時,計算return語句中表達式的值(若是無返回值函數(shù),本項不做),返回到主調函數(shù)。⑤釋放形參及本函數(shù)內的局部變量所占內存,繼續(xù)執(zhí)行主調函數(shù)中的后繼語句。說明:實參與形參個數(shù)相等,類型一致,按順序一一對應形參與實參的結合順序,因系統(tǒng)而定(TurboC自右向左)第十四頁,共八十一頁,編輯于2023年,星期日main(){inti=2,p;p=f(i,++i);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}例參數(shù)求值順序main(){inti=2,p;p=f(i,i++);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}運行結果:0運行結果:1第十五頁,共八十一頁,編輯于2023年,星期日對于函數(shù)的位置:對于非int函數(shù),調用單位的位置要在被調用單位在下面,否則編譯產(chǎn)生錯誤。解決方法是:在調用單位加上被調用函數(shù)的聲(說)明。voidf(){…}main(){…f();…}voidf(){…}main(){…f();…}voidf(){…}main(){voidf();…f();…}第十六頁,共八十一頁,編輯于2023年,星期日5.2.2函數(shù)說明對被調用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)類型說明函數(shù)說明一般形式:函數(shù)類型函數(shù)名(形參類型[形參名],…..);
或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗;函數(shù)定義與函數(shù)說明不同;函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內或外);下列情況下,可不作函數(shù)說明若函數(shù)返值是char或int型,系統(tǒng)自動按int型處理;被調用函數(shù)定義出現(xiàn)在主調函數(shù)之前;有些系統(tǒng)(如BorlandC++)要求函數(shù)說明指出函數(shù)返值類型和形參類型,并且對void和int型函數(shù)也要進行函數(shù)說明第十七頁,共八十一頁,編輯于2023年,星期日例函數(shù)說明舉例main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說明(BorlandC++不行)/*ch7_5.c*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被調函數(shù)出現(xiàn)在主調函數(shù)之前,不必函數(shù)說明/**/main(){floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd();第十八頁,共八十一頁,編輯于2023年,星期日
例4.44.5第十九頁,共八十一頁,編輯于2023年,星期日C語言中,函數(shù)調用是值傳遞方式,即函數(shù)的實際參數(shù)和形式參數(shù)之間的數(shù)據(jù)傳遞方向是單向的,只能由實際參數(shù)傳遞給形式參數(shù),而不能由形式參數(shù)傳遞給實際參數(shù),是實際參數(shù)向形式參數(shù)單向賦值的關系。在內存中,形式參數(shù)與實際參數(shù)占用不同的內存單元。當調用函數(shù)時,給形式參數(shù)分配內存單元,將實際參數(shù)的值賦值給形式參數(shù),調用后,形式參數(shù)單元釋放,實際參數(shù)仍保留調用前的值,形式參數(shù)值的變化不影響實際參數(shù)。5.2.3
函數(shù)參數(shù)及其傳遞方式形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調用函數(shù)時函數(shù)名后面括號中的表達式第二十頁,共八十一頁,編輯于2023年,星期日c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}例比較兩個數(shù)并輸出大者main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}形參實參第二十一頁,共八十一頁,編輯于2023年,星期日說明:實參必須有確定的值形參必須指定類型形參與實參類型一致,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉換———函數(shù)調用轉換形參在函數(shù)被調用前不占內存;函數(shù)調用時為形參分配內存;調用結束,內存釋放第二十二頁,共八十一頁,編輯于2023年,星期日例計算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728第二十三頁,共八十一頁,編輯于2023年,星期日參數(shù)傳遞方式值傳遞方式方式:函數(shù)調用時,為形參分配單元,并將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內存單元單向傳遞第二十四頁,共八十一頁,編輯于2023年,星期日35a:b:調用前:調用結束:35a:b:例5.6交換兩個數(shù)#include<stdio.h>main(){inta=3,b=5;printf(“a=%d,\tb=%d\n",a,b);printf("swapped:\n");
swap(a,b);printf(“a=%d,\tb=%d\n",a,b);}swap(intx,inty){inttemp;temp=x;x=y;y=temp;}調用35x:y:35a:b:swap:temp35a:b:x:35y:第二十五頁,共八十一頁,編輯于2023年,星期日如何實現(xiàn)“地址傳遞”?只能是:函數(shù)調用時,將數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參,當然此時的行參只能是能存儲地址的變量(指針變量)。才能達到“雙向”傳送的目的。第二十六頁,共八十一頁,編輯于2023年,星期日swap(p1,p2)int*p1,*p2;{intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;scanf("%d,%d",&a,&b);printf(“a=%d,b=%d\n”,a,b);printf(“swapped:\n”);swap(&a,&b);printf(”a=%d,b=%d\n",a,b);}例交換兩個數(shù)a59b調前:a59b調swap:p1&a&bp2a95b交換:p1&a&bp2a95b返回:第二十七頁,共八十一頁,編輯于2023年,星期日#include<stdio.h>
longsum(inta,intb);longfactorial(intn);main(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);printf("a=%1d",a);}longsum(inta,intb){longc1,c2;c1=factorial(a);c2=factorial(b);
return(c1+c2);}
longfactorial(intn){longrtn=1;inti;for(i=1;i<=n;i++)rtn*=i;
return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含編譯預處理命令函數(shù)類型說明函數(shù)定義函數(shù)調用函數(shù)調用函數(shù)返回值形參實參第二十八頁,共八十一頁,編輯于2023年,星期日5.3
變量的作用域和存儲類別變量是對程序中數(shù)據(jù)的存儲空間的抽象內存…….main(){inta;a=10;printf(“%d”,a);}編譯或函數(shù)調用時為其分配內存單元1020002001程序中使用變量名對內存操作第二十九頁,共八十一頁,編輯于2023年,星期日變量的屬性數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(操作屬性)存儲屬性存儲器類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)生存期:變量在某一時刻存在-------靜態(tài)變量與動態(tài)變量作用域:變量在某區(qū)域內有效-------局部變量與全局變量變量的存儲類型auto-----自動型register-----寄存器型static------靜態(tài)型extern-----外部型變量定義格式:[存儲類型]數(shù)據(jù)類型變量表;如:intsum;
autointa,b,c;
registerinti;
staticfloatx,y;第三十頁,共八十一頁,編輯于2023年,星期日變量的作用域程序中所聲明的在程序的那一部分中是可用的。只有在自己的作用域中才可用。
第三十一頁,共八十一頁,編輯于2023年,星期日從作用域角度考慮分為:內部變量、外部變量內部變量(局部變量)的作用域:是定義它的函數(shù)內或復合語句內,在它的作用域之外,內部變量是不可見的,也就是說,一個函數(shù)內定義的內部變量是不能被其它的函數(shù)所引用的。特性:有助實現(xiàn)信息隱蔽,即使不同的函數(shù)定義了同名的內部變量,也不會相互影響。第三十二頁,共八十一頁,編輯于2023年,星期日內部變量---局部變量定義:在函數(shù)內定義,只在本函數(shù)內有效說明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內存單元形參屬于局部變量可定義在復合語句中有效的變量局部變量可用存儲類型:autoregisterstatic(默認為auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效第三十三頁,共八十一頁,編輯于2023年,星期日復合語句中變量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)
{
inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;
}for(i=0;i<N;i++)printf("%d",a[i]);}運行結果:54321例不同函數(shù)中同名變量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4第三十四頁,共八十一頁,編輯于2023年,星期日外部變量(全局變量)定義:在函數(shù)外面定義的變量。外部變量的作用域:對于只有一個源程序文件構成的程序,外部變量的作用域是從定義它的位置開始,直至它所在源程序文件的結束。特點:外部變量的使用增加了函數(shù)之間傳遞數(shù)據(jù)的途徑,在外部變量的作用域內的任何函數(shù)都能引用該外部變量,一個函數(shù)對外部變量的修改,能影響到其它引用這個變量的函數(shù);因此對外部變量的使用不當,會產(chǎn)生意外的錯誤。第三十五頁,共八十一頁,編輯于2023年,星期日floatmax,min;floataverage(intn){inti;floatx;scanf(“%f”,&x);max=min=x;for(i=2;i<n;i++){scanf(“%f”,&x);if(x>max)max=x;elseif(x<min)min=x;sum+=x;}return(sum/n);}main(){intn;floatave;scanf(“%d”,&n);ave=average(n);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxmin第三十六頁,共八十一頁,編輯于2023年,星期日inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf(“a=%d\n,b=%d\n,max=%d\n",a,b,max(a,b));}外部變量與局部變量同名時,在內部變量的作用域中,外部變量被屏蔽。例:運行結果:a=8/*main中的a*/b=5/*main中的b*/max=8第三十七頁,共八十一頁,編輯于2023年,星期日inti;main(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}
外部變量使用不當時,會引起副作用。運行結果:*****第三十八頁,共八十一頁,編輯于2023年,星期日外部變量的作用域可以通過關鍵字“extern”來擴展:intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){externinta,b;printf("max=%d",max(a,b));}inta=13,b=-8;運行結果:max=13externinta,b;intmax(){intz;z=a>b?a:b;return(z);}main(){printf("max=%d",max());}inta=13,b=-8;第三十九頁,共八十一頁,編輯于2023年,星期日intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范圍p,q的作用范圍externcharc1,c2;c1,c2的作用范圍擴展后c1,c2的作用范圍擴展后externcharc1,c2;
第四十頁,共八十一頁,編輯于2023年,星期日main(){voidgx(),gy();
externintx,y;printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){externintx,y;x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}用extern擴展外部變量作用域例子:運行結果:1:x=0y=02:x=135y=2463:x=135y=246第四十一頁,共八十一頁,編輯于2023年,星期日intglobal;/*定義*/externfloatx;
/*說明*/main(){intlocal; . . .}externintglobal;/*說明*/intnumber;/*定義*/func2(){ . . .}floatx;/*定義*/intnumber;/*定義*/func3(){externintglobal;/*說明*/ . . .}file1.cfile2.cfile3.c外部變量(全局變量)繼續(xù):
對于多文件程序,在一個源文件中定義的外部變量還可以在其它的文件中使用,這時需要在使用它的文件中用extern進行說明,這樣的變量稱為程序級的變量。第四十二頁,共八十一頁,編輯于2023年,星期日應盡量少使用全局變量,因為:全局變量在程序全部執(zhí)行過程中占用存儲單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯定義
說明次數(shù):只能1次可說明多次位置:所有函數(shù)之外函數(shù)內或函數(shù)外分配內存:分配內存,可初始化不分配內存,不可初始化外部變量定義與外部變量說明不同:
在同一個文件中,定義在后使用在前的外部變量,在使用前需要對其進行聲明。在包含多個文件的程序中,一個文件若使用其它文件中定義的外部變量也要進行聲明。外部變量說明:
extern數(shù)據(jù)類型變量表;第四十三頁,共八十一頁,編輯于2023年,星期日
C語言中,按作用域的大小,可將變量的作用域分為四個級別:程序級、文件級、函數(shù)級、復合語句級。這是由C程序的結構特點所決定的。第四十四頁,共八十一頁,編輯于2023年,星期日5.3.2變量的存儲類別------動態(tài)變量與靜態(tài)變量動態(tài)變量:動態(tài)存儲類別的變量當進入定義它的函數(shù)或復合語句時被分配存儲空間,當離開時所占內存空間被釋放。
靜態(tài)變量:靜態(tài)存儲類別的變量在源程序編譯的時候被分配固定的存儲空間,從程序開始執(zhí)行到程序運行結束,一直占用該內存空間,直至程序運行結束,才被釋放內存空間。程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、局部靜態(tài)變量形參變量局部動態(tài)變量(autoregister)函數(shù)調用現(xiàn)場保護和返回地址等生存期------變量存在(在內存有存儲空間)的時間段。靜態(tài)變量:從程序開始執(zhí)行到程序結束動態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結束第四十五頁,共八十一頁,編輯于2023年,星期日5.3.3內部變量的存儲類別內部變量的作用域是定義它的函數(shù)或復合語句。內部變量的存儲類別是指它存放的位置。內部變量可存放于內存的動態(tài)區(qū),寄存器和內存的靜態(tài)區(qū)。但無論內部變量存放在何處,它的作用域是不變的。
內部變量可以定義為:
自動的(auto
)寄存器(register
)靜態(tài)的(static)
自動的(auto
):在函數(shù)內定義的變量都是自動的。
main(){inta;/*等價于:autointa;*/…}寄存器變量(register)如:registerinti;動態(tài)變量靜態(tài)變量第四十六頁,共八十一頁,編輯于2023年,星期日例auto變量的作用域main(){intx=1;voidprt(void);
{
intx=3;prt();printf(“2ndx=%d\n”,x);
}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}運行結果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域第四十七頁,共八十一頁,編輯于2023年,星期日靜態(tài)的(static):如:staticinti;
下次再調用該函數(shù)時,staic變量仍使用原來的存儲單元,仍使用原來存儲單元中的值。
分配內存后、賦初值,并且只被賦初值一次,未賦值的內部staic變量,系統(tǒng)自動給它賦值為0。被分配在內存的靜態(tài)存儲區(qū)中。
staic變量在內存的靜態(tài)存儲區(qū)占用的固定的內存單元;即使它所在的函數(shù)被調用結束后,也不釋放存儲單元,它所在單元的值也會繼續(xù)保留-----因此:雖然staic變量在整個程序運行期間都是存在的,但在它的作用域外,它是不可見的,也就是說其它函數(shù)是不能引用它的。
第四十八頁,共八十一頁,編輯于2023年,星期日main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}例局部靜態(tài)變量值具有可繼承性運行結果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}運行結果:123第四十九頁,共八十一頁,編輯于2023年,星期日#include"stdio.h"voidtest_a_s(){autointauto_v=0;/*內部自動的*/staticintstatic_v=0;/*內部靜態(tài)的*/printf("\nauto_v=%d,static_v=%d",auto_v,static_v);auto_v++;static_v++;}main(){inti;for(i=0;i<3;i++)test_a_s();}例5.8運行結果:auto_v=0,static_v=0auto_v=0,static_v=1auto_v=0,static_v=2第五十頁,共八十一頁,編輯于2023年,星期日利用靜態(tài)變量的情況:longfunc(longi){staticlongk=1;k=k*i;return(k);}main(){longn,m;printf("\n");scanf("%ld",&n);for(m=1L;m<=n;m++)printf("\n%ld!=%ld",m,func(m));}例5.9計算
1!、2!、3!、……n!(n的值由鍵盤輸入)不利用靜態(tài)變量的情況:longfunc(longn){longk=1;inti;for(i=1;i<=n;i++)k=k*i;return(k);}main(){longn,m;printf("\n");scanf("%ld",&n);for(m=1L;m<=n;m++)printf("\n%ld!=%ld",m,func(m));}第五十一頁,共八十一頁,編輯于2023年,星期日5.3.4外部變量的存儲類別外部變量只能存放在內存的靜態(tài)存儲區(qū)。它在整個程序的運行期間一直占用內存單元。
外部變量的作用域可以通過關鍵字“extern”來擴展。(擴展至某個文件,甚至被其它源程序文件使用)用static聲明的外部變量能夠限制它的作用域的擴展,達到信息隱蔽的目的。①在同一個文件中,定義在后使用在前的外部變量,在使用前需要對其進行聲明。②在不同文件中(但同屬一個程序),使用其它文件中定義的外部變量(但是不要企圖使用static聲明了的外部變量)。第五十二頁,共八十一頁,編輯于2023年,星期日/*p5-1002.c*/intMax;voidfunc(intx,inty,intz){externintMin;Max=x;Min=x;if(y>Max)Max=y;if(z>Max)Max=z;if(y<Min)Min=y;if(z<Min)Min=z;}intMin;例5.10該程序包括兩個文件p5-1001.c和p5-1002.c,并且文件p5-1001.c使用p5-1002.c中的外部變量,因此要在文件p5-1001.c中對該外部變量進行聲明。
/*p5-1001.c*/#include"p6-1402.c"externintMax,Min;main(){voidfunc(intx,inty,intz);inta,b,c;printf("\a,b,c=?");scanf("%d,%d,%d",&a,&b,&c);func(a,b,c);printf("\nMax=%d,Min=%d",Max,Min);}第五十三頁,共八十一頁,編輯于2023年,星期日變量存儲類型靜態(tài)動態(tài)存儲方式程序整個運行期間函數(shù)調用開始至結束生存期編譯時賦初值,只賦一次每次函數(shù)調用時賦初值自動賦初值0或空字符不確定未賦初值靜態(tài)存儲區(qū)動態(tài)區(qū)存儲區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復合語句內本文件其它文件局部變量默認為auto型register型變量個數(shù)受限,且不能為long,double,float型局部static變量具有全局壽命和局部可見性局部static變量具有可繼承性extern不是變量定義,可擴展外部變量作用域register局部staticauto外部static外部存儲類別第五十四頁,共八十一頁,編輯于2023年,星期日例文件file1.cinta;main(){…….…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:第五十五頁,共八十一頁,編輯于2023年,星期日例變量的壽命與可見性#include<stdio.h>inti=1;main(){staticinta;
registerintb=-10;
intc=0;printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);c=c+8;other();printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);i=i+10;
other();}other(){staticinta=2;staticintb;
intc=10;a=a+2;i=i+32;c=c+5;printf("-----OTHER------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);b=a;}-------Main------i:1a:0b:-10c:0------Other------i:33a:4b:0c:15-------Main-----i:33a:0b:-10c:8-------Other-------i:75a:6b:4c:15全局i1main:a0b:-10registermain:c0靜態(tài)存儲區(qū)動態(tài)存儲區(qū)other:a2other:b0other:c10843315443other:c10675156第五十六頁,共八十一頁,編輯于2023年,星期日例引用其它文件中的變量,輸出ab和a的m次方inta;main(){intpower(intn);intb=3,c,d,m;printf("Enterthenumberaanditspower:\n");scanf("%d,%d",&a,&m);c=a*b;printf("%d*%d=%d\n",a,b,c);d=power(m);printf("%d**%d=%d",a,m,d);}externinta;intpower(intn){inti,y=1;for(i=1;i<=n;i++) y*=a;return(y);}第五十七頁,共八十一頁,編輯于2023年,星期日5.4內部函數(shù)和外部函數(shù)5.4.1外部函數(shù)外部函數(shù)是可以被程序中的其它文件所調用的函數(shù)。定義格式如下:
extern數(shù)據(jù)類型函數(shù)名(形式參數(shù)表列)
{說明部分;執(zhí)行部分;
}
外部函數(shù)是C語言默認的函數(shù)類型,若沒有特別的聲明為extern類型,系統(tǒng)也會默認為外部函數(shù)。第五十八頁,共八十一頁,編輯于2023年,星期日5.4.2內部函數(shù)內部函數(shù)是只能被本文件中其它函數(shù)調用,而不能被其它文件調用的函數(shù)。它的定義格式如下:static
數(shù)據(jù)類型函數(shù)名(形式參數(shù)表列){說明部分;執(zhí)行部分;}第五十九頁,共八十一頁,編輯于2023年,星期日5.5函數(shù)的嵌套與遞歸調用嵌套調用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調用函數(shù)main()調用函數(shù)a結束a函數(shù)b函數(shù)調用函數(shù)b第六十頁,共八十一頁,編輯于2023年,星期日例求三個數(shù)中最大數(shù)和最小數(shù)的差值#include<stdio.h>
intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()調用函數(shù)dif輸出結束dif函數(shù)max函數(shù)調用函數(shù)max調用函數(shù)minmin函數(shù)第六十一頁,共八十一頁,編輯于2023年,星期日例用弦截法求方程根xyf(x)0x1x2xf(x1)f(x2)第六十二頁,共八十一頁,編輯于2023年,星期日求f(x1)與f(x2)連線與x軸的交點x輸入x1,x2,求f(x1),f(x2)直到f(x1)與f(x2)異號y=f(x),y1=f(x1)y與y1同號真假x1=xy1=yx2=x直到
|y|<root=x輸出
rootroot函數(shù)運行情況:Inputx1,x2:2,6Arootofequationis5.0000main()調用函數(shù)root輸出根x結束root函數(shù)xpoint函數(shù)調用函數(shù)xpoint調用函數(shù)ff函數(shù)第六十三頁,共八十一頁,編輯于2023年,星期日第六十四頁,共八十一頁,編輯于2023年,星期日遞歸調用定義:函數(shù)直接或間接的調用自身叫函數(shù)的遞歸調用f()調f調f2調f1f1()f2()說明C編譯系統(tǒng)對遞歸函數(shù)的自調用次數(shù)沒有限制每調用函數(shù)一次,在內存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出intf(intx){inty,z;……
z=f(y);…….return(2*z);}intf1(intx){inty,z;……
z=f2(y);…….return(2*z);}intf2(intt){inta,c;……
c=f1(a);…….return(3+c);}第六十五頁,共八十一頁,編輯于2023年,星期日例求n的階乘/*ch7_8.c*/#include<stdio.h>intfac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);
y=fac(n);printf("%d!=%15d",n,y);}第六十六頁,共八十一頁,編輯于2023年,星期日Hanoi(漢諾)塔問題:古代有一個梵塔,塔內有三各底座A、B、C。開始時A座上有64個盤子,牌子大小不等,大的在下,小的在上。有一個老和尚想把這64個盤子從A座移到C座上去,每一次只允許移動一個盤子,且在移動過程中每個底座上的盤子必須是大的在下,小的在上。第六十七頁,共八十一頁,編輯于2023年,星期日老和尚自然這樣想:假若有另外一個和尚想辦法將63個盤子從一個地座上,那么問題就解決了。老和尚只需這樣做:(1)命令第二個和尚將63個盤子從A移到B座;(2)自己將最底下的最大的那一個盤子從A移到C座;(3)再命令第二個和尚將63個盤子從B移到C座;任務就完成了。第六十八頁,共八十一頁,編輯于2023年,星期日第二個和尚自然這樣想:假若有第三個和尚想辦法將62個盤子從一個地座上,那么問題就解決了。第二個和尚只需這樣做:(1)命令第三個和尚將62個盤子從A移到C座;(2)自己將最底下的最大的那一個盤子從A移到B座;(3)再命令第二個和尚將62個盤子從C移到B座;這樣第二個和尚的任務就完成了。第六十九頁,共八十一頁,編輯于2023年,星期日這樣以此類推,層層下放,直到第63個和尚找到第64個和尚,第64個和尚的任務是將一個盤子移到另一座上,第63個和尚再完成自己的任務;第62個和尚再完成自己的任務;…;老和尚才能完成自己的任務。以3個盤子為例,步驟為:A->C,A->B,C->B,A->C,B->A,B->C,A->C第七十頁,共八十一頁,編輯于2023年,星期日例5.14Hanoi問題voidmove(chargetone,charputone){printf("%c--->%c\n",getone,putone);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three);}}main(){intm;printf("Inputthenumberofdisks:");scanf("%d",&m);printf("Thestepstomoving%3ddisks:\n",m);hanoi(m,'A','B','C');}ABC第七十一頁,共八十一頁,編輯于2023年,星期日6.7
數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實參——值傳遞例兩個數(shù)組大小比較432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a和b為有10個元素的整型數(shù)組比較兩數(shù)組對應元素變量n,m,k記錄a[i]>b[i],a[i]==b[i],a[i]<b[i]的個數(shù)最后若n>k,認為數(shù)組a>b
若n<k,認為數(shù)組a<b
若n==k,認為數(shù)組a==b#include<stdio.h>main(){inta[10],b[10],i,n=0,m=0,k=0;printf("Enterarraya:\n");for(i=0;i<10;i++) scanf("%d",&a[i]);printf("Enterarrayb:\n");for(i=0;i<10;i++) scanf("%d",&b[i]);for(i=0;i<10;i++){if(large(a[i],b[i])==1)n=n+1;elseif(large(a[i],b[i])==0)m=m+1;elsek=k+1;}
/*Output*/}intlarge(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}第七十二頁,共八十一頁,編輯于2023年,星期日數(shù)組名作函數(shù)參數(shù)地址傳遞在主調函數(shù)與被調函數(shù)分別定義數(shù)組,且類型應一致形參數(shù)組大小(多維數(shù)組第一維)可不指定形參數(shù)組名是地址變量第七十三頁,共八十一頁,編輯于2023年,星期日例求學生的平均成績
#include<stdio.h>
floataverage(intstu[10],intn);voidmain(){intscore[10],i;floatav;printf("Input10scores:\n");for(i=0;i<10;i++)scanf("%d",&score[i]);av=average(score,10);printf("Averageis:%.2f",av);}floataverage(int
stu[10],intn){inti;floatav,total=0;for(i=0;i<n;i++)total+=stu[i];av=total/n;returnav;}實參用數(shù)組名形參用數(shù)組定義,intstu[]..2109score562312….….88stu第七十四頁,共八十一頁,編輯于2023年,星期日例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較12a調用前a[0]a[1]12a調用a[0]a[1]12xy21xy交換12a返回#include<stdio.h>voidswap2(intx,inty){intz;z=x;x=y;y=z;}main(){inta[2]={1,2};
swap2(a[0],a[1]);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}值傳遞第七十五頁,共八十一頁,編輯于2023年,星期日12a調用前12ax調用21ax交換21a返回#include<stdio.h>voidswap2(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z;}main(){inta[2]={1,2};
swap2(a);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}地址傳遞例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較第七十六頁,共八十一頁,編輯于2023年,星期日例數(shù)組排序----簡單選擇排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廈門市2024-2025學年高二上學期期末考試歷史試題(含答案)
- 質控護士考核-護理文件書寫復習試題含答案
- 危急值管理?復習測試有答案
- 2025年對口旅游類考試題及答案
- EDA軟件:OrCAD二次開發(fā)-OrCAD二次開發(fā)案例分析
- 2025年物理文科會考試題及答案
- 2025年產(chǎn)地證考試試題及答案
- 2025年精致旅游面試題及答案
- 2025年市場營銷測試試題及答案
- 2025年淡水養(yǎng)魚面試題及答案
- 2025江西吉泰廬陵開發(fā)投資集團有限公司及下屬子公司招聘26人筆試參考題庫附帶答案詳解
- 2025年開封文化藝術職業(yè)學院單招職業(yè)傾向性測試題庫含答案
- 高中英語丨高考核心高頻詞匯
- 《數(shù)智化技術應用與創(chuàng)新》課件 第1章 走進數(shù)智化時代
- 2025中煤電力限公司面向中煤集團內部招聘15人易考易錯模擬試題(共500題)試卷后附參考答案
- 二零二五年阿里巴巴電商平臺代銷代運營合同書模板3篇
- 2024年江西青年職業(yè)學院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 培訓機構校長聘任協(xié)議證書
- 四川省成都市高新區(qū)2024-2025學年八年級(上)期末物理試卷(含答案)
- 2025年浙江嘉興桐鄉(xiāng)市水務集團限公司招聘10人高頻重點提升(共500題)附帶答案詳解
- ICH《M10:生物分析方法驗證及樣品分析》
評論
0/150
提交評論