版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
lesson程序的組織結構變量作用域演示文稿1/38目前一頁\總數三十七頁\編于十四點lesson程序的組織結構變量作用域目前二頁\總數三十七頁\編于十四點學習目標:31進一步加深對函數的理解掌握編譯預處理命令3/38目前三頁\總數三十七頁\編于十四點3變量的作用域2變量的作用域指在源程序中定義變量的位置及其能被讀寫訪問的范圍位置是指在函數內還是函數外讀寫是指可以使用變量局部變量全局變量4/38目前四頁\總數三十七頁\編于十四點3變量的作用域2局部變量floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效在語句塊內(函數)定義的變量在語句塊內(函數)內有效5/38目前五頁\總數三十七頁\編于十四點3變量的作用域2說明:形參也是局部變量定義時不會自動初始化,除非程序員指定初值并列語句塊各自定義的同名變量互不干擾main函數中定義的變量也是局部變量例不同函數中同名變量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);}例復合語句中變量#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例復合語句中變量#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]);}例不同函數中同名變量voidmain(){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=46/38目前六頁\總數三十七頁\編于十四點3變量的作用域2全局變量在函數之外定義的變量從定義變量的位置開始到文件結束有效。inta=13,b=-8;intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){printf("max=%d",max(a,b));}全局變量全局變量a,b的有效范圍floatmax,min;floataverage(floatarray[],intn){inti;floatsum=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+=array[i];}return(sum/n);}voidmain(){inti;floatave,score[10];
/*Input*/
ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxmin7/38目前七頁\總數三十七頁\編于十四點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;externcharc1,c2;c1,c2的作用范圍擴展后c1,c2的作用范圍擴展后8/38目前八頁\總數三十七頁\編于十四點例:外部變量定義與說明intmax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){externinta,b;printf("max=%d",max(a,b));}inta=13,b=-8;運行結果:max=13externinta,b;intmax(){intz;z=a>b?a:b;return(z);}voidmain(){printf("max=%d",max());}inta=13,b=-8;9/38目前九頁\總數三十七頁\編于十四點inti;voidmain(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}例:外部變量副作用運行結果:*****10/38目前十頁\總數三十七頁\編于十四點#include<stdio.h>inta,b;/*a,b為全局變量*/voidf1(){intt1,t2;t1=a*2;t2=b*3;b=100;
printf(“t1=%d,t2=%d\n”,t1,t2);}voidmain(){a=2;b=4;f1();printf(“a=%d,b=%d”,a,b);}程序輸出結果為:t1=4,t2=12a=2,b=10011/38目前十一頁\總數三十七頁\編于十四點將程序改為:#include<stdio.h>inta=2,b=4;/*a,b為全局變量*/voidf1(){intt1,t2;t1=a*2;t2=b*3;b=100;
printf(“t1=%d,t2=%d\n”,t1,t2);}voidmain(){intb=4;f1();printf(“a=%d,b=%d”,a,b);}
程序輸出結果為:t1=4,t2=12a=2,b=4
結論:全局變量與局部變量同名時,局部變量的作用域屏蔽全局變量12/38目前十二頁\總數三十七頁\編于十四點3變量的存儲類型3存儲類型:數據在內存中存儲的方式,它決定變量的生存期13/38目前十三頁\總數三十七頁\編于十四點3變量的存儲類型3堆區(qū)棧區(qū)全局數據區(qū)代碼區(qū)一個程序在內存中分為4個區(qū)域程序代碼全局變量函數中變量使用malloc申請函數調用時生成,結束時收回14/38目前十四頁\總數三十七頁\編于十四點3變量的存儲類型3動態(tài)變量:在棧區(qū)標準定義格式auto類型名變量名;函數執(zhí)行時,動態(tài)地創(chuàng)建,函數執(zhí)行結束后被收回,在次進入后,重新初始化auto可以省略15/38目前十五頁\總數三十七頁\編于十四點3變量的存儲類型3靜態(tài)變量:全局數據區(qū)標準定義格式static類型名變量名;程序執(zhí)行過程當中一直存在16/38目前十六頁\總數三十七頁\編于十四點3變量的存儲類型3例2分析程序結果:#include<stdio.h>intf(inta){staticints=0;s++;returns+a;}intmain(){inti,s=0;for(i=0;i<3;i++){s+=f(i);}printf(“s=%d”,s);return0;}17/38目前十七頁\總數三十七頁\編于十四點f(inta){intb=0;staticintc=3;b++;c++;printf(“%5d%5d%5d”,a,b,c);return(a+b+c);}voidmain(){inta=2,k;for(k=0;k<3;k++)printf(“%5d\n”,f(a));}例:考察靜態(tài)局部變量的值:18/38目前十八頁\總數三十七頁\編于十四點例:auto變量的作用域voidmain(){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作用域19/38目前十九頁\總數三十七頁\編于十四點voidmain(){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=24620/38目前二十頁\總數三十七頁\編于十四點(1)intsub(intx){inty=0;staticintz=0;y+=x++,z++;printf("%d,%d,%d\n",x,y,z);returny;}練習:寫出下列程序的運行結果:#include<stdio.h>voidmain(){inti;intsub(intx);for(i=0;i<3;i++)printf("%d\n",sub(i));}1,0,102,1,213,2,3221/38目前二十一頁\總數三十七頁\編于十四點(2)#include<stdio.h>intx=1,y=8;voidsub(inty){x++;y++;}voidmain(){ intx=2; sub(x); printf("x+y=%d\n",x+y);}x+y=1022/38目前二十二頁\總數三十七頁\編于十四點內部函數和外部函數函數本質上是全局的,因為一個函數要被另外的函數調用,但是,也可以指定函數不能被其他文件調用。根據函數能否被其他源文件調用,將函數區(qū)分為內部函數和外部函數?!靸炔亢瘮等绻粋€函數只能被本文件中其他函數所調用,它稱為內部函數。在定義內部函數時,在函數名和函數類型的前面加static。即static類型標識符函數名(形參表)如staticintfun(inta,intb)23/38目前二十三頁\總數三十七頁\編于十四點§外部函數(1)在定義函數時,如果在函數首部的最左端加關鍵字extern,則表示此函數是外部函數,可供其他文件調用。如函數首部可以寫為externintfun(inta,intb)這樣,函數fun就可以為其他文件調用。C語言規(guī)定,如果在定義函數時省略extern,則隱含為外部函數。本書前面所用的函數都是外部函數。(2)在需要調用此函數的文件中,用extern對函數作聲明,表示該函數是在其他文件中定義的外部函數24/38目前二十四頁\總數三十七頁\編于十四點3多文件程序設計4如何劃分模塊讀多少行的程序能讓你不頭疼?每個模塊只負責一件事情,它可以更專心便于進行單個模塊的設計、開發(fā)、調試、測試和維護等工作25/38目前二十五頁\總數三十七頁\編于十四點3多文件程序設計4多模塊文件將一個程序分解成若干個模塊,分別放在幾個源文件中,形成一個項目(Project)對每一個源文件分別單獨進行編譯再將它們的目標代碼連同標準函數庫中的函數鏈接在一起,形成可執(zhí)行文件。主模塊:main()所在的文件模塊之間通過互相調用函數頭文件是聯(lián)系的紐帶26/38目前二十六頁\總數三十七頁\編于十四點3多文件程序設計4intx;voidmain(){………}
文件名file1.cexternx;/*使用file1.c中的全局變量x*/f1(){………}
文件名file2.c擴大全局變量的作用域27/38目前二十七頁\總數三十七頁\編于十四點例:有一個字符串,內有若干個字符,今輸入一個字符,要求程序將字符串中該字符刪去。用外部函數實現File.c(文件1)#include<stdio.h>voidmain(){externvoidenter_string(charstr[]);externvoiddelete_string(charstr[],charch);externvoidprint_string(charstr[]);/*以上3行聲明在本函數中將要調用的在其他文件中定義的3個函數*/
charc;charstr[80];enter_string(str);scanf("%c",&c);delete_string(str,c);print_string(str);}28/38目前二十八頁\總數三十七頁\編于十四點file2.c(文件2)#include<stdio.h>voidenter_string(charstr[80])/*定義外部函數
enter-string*/
{gets(str);/*向字符數組輸入字符串*/
}
file3.c(文件3)voiddelete_string(charstr[],charch)/*定義外部函數
delete_string*/{inti,j;for(i=j=0;str[i]!='\0';i++) if(str[i]!=ch) str[j++]=str[i];str[j]='\0';}29/38目前二十九頁\總數三十七頁\編于十四點File4.c(文件4)#include<stdio.h>voidprint_string(charstr[]){printf("%s\n",str);}
運行情況如下:abcdefgc↙(輸入str)c↙(輸入要刪去的字符)abdefg(輸出已刪去指定字符的字符串)30/38目前三十頁\總數三十七頁\編于十四點3編譯預處理命令5編譯預處理:程序在編譯之前做的一些處理編譯預處理命令:以#打頭31/38目前三十一頁\總數三十七頁\編于十四點3編譯預處理命令5#define命令#define
宏名字
替換文本例如:#definePI3.14在#define之后,所有獨立出現“宏名字”的地方(除了字符串外)都被“替換文本”替換32/38目前三十二頁\總數三十七頁\編于十四點3編譯預處理5#include<stdio.h>#definePI3.14intmain(){floatl,s,r;scanf(“%f”,&r);l=2*PI*r;s=PI*r*r;printf(“l(fā)=%f,s=%f”,l,s);return0;}編譯時:main(){floatl,s,r;scanf(“%f”,&r);l=2*3.14*r;s=3.14*r*r;printf(“l(fā)=%f,s=%f”,l,s);}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度貨運司機勞動合同模板(含績效考核)
- 二零二五年度學校教師學生國際交流與合作聘用合同3篇
- 二零二五年度信息技術產品軟件售后服務合同書模板2篇
- 2025年度個人法律咨詢委托書范本4篇
- 二零二五年度廚房電氣設備安裝與維護承包協(xié)議4篇
- 2025版實習合同模板:實習期間解約與補償3篇
- 二零二五版舊機動車交易車輛售后配件供應合同3篇
- 2025版實習期員工勞動合同-實習期間合同解除與續(xù)簽3篇
- 珠??萍紝W院《賈平凹文學創(chuàng)作研究》2023-2024學年第一學期期末試卷
- 二零二五年度商業(yè)寫字樓租賃合同樣本
- 運動技能學習與控制課件第十一章運動技能的練習
- 蟲洞書簡全套8本
- 射頻在疼痛治療中的應用
- 四年級數學豎式計算100道文檔
- “新零售”模式下生鮮電商的營銷策略研究-以盒馬鮮生為例
- 項痹病辨證施護
- 職業(yè)安全健康工作總結(2篇)
- 懷化市數字經濟產業(yè)發(fā)展概況及未來投資可行性研究報告
- 07FD02 防空地下室電氣設備安裝
- 教師高中化學大單元教學培訓心得體會
- 彈簧分離問題經典題目
評論
0/150
提交評論