版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第4章函數與編譯預處理程序設計基礎1第4章函數與編譯預處理
4.1函數概述4.2函數定義與調用4.3局部變量和全局變量4.4變量的生存期和存儲類別4.5
編譯預處理24.1函數概述……C程序源程序文件n函數1函數m……源程序文件1函數1函數n4.1.1函數簡介3【例】
#include<stdio.h>voidprint_line()/*函數定義*/{printf("*********************************\n");}voidprint_text()/*函數定義*/{printf("WelcometoBeijing\n");}voidmain(){print_line();/*函數調用*/print_text();/*函數調用*/print_line();/*函數調用*/}程序的執(zhí)行總是從main函數開始4voidmain函數{
……
調用函數
print_line();
……}函數
print_line(){
……
}5⑴一個C源程序可以由一個或多個源程序文件組成。C編譯系統(tǒng)在對C源程序進行編譯時是以文件為單位進行的。⑵一個C源程序文件可以由一個或多個函數組成。所有函數都是獨立的。主函數可以調用其它函數,其它函數可以相互調用。⑶在一個C程序中,有且僅有一個主函數main。C程序的執(zhí)行總是從main函數開始,調用其它函數后最終回到main函數,在main函數中結束整個程序的運行。說明6⑷函數的種類從使用的角度看:①標準函數(庫函數)庫函數是由系統(tǒng)提供的。如:getchar()、sin(x)等。在程序中可以直接調用它們。附錄B列出了C的部分庫函數。②用戶自定義函數。如:例中的print_line()函數。7由C編譯系統(tǒng)定義的一種函數,存放在系統(tǒng)函數庫中,用戶可以根據需要隨時調用常用函數如:fabs、sqrt、sin、pow、rand(常用數學函數參見教材P100表4-1和附錄B
)函數調用形式:函數名([參數表])例如:
sqrt(x)4.1.2數學庫函數8例#include<math.h>#include<stdio.h>voidmain(){floatx=4.5;
printf("%f,%f,%f\n",sqrt(x),pow(x,2),fabs(-x));}輸出結果:2.121320,20.250000,4.50000094.2.1函數的定義函數定義的一般形式函數類型函數名(類型名形式參數1,…
){說明語句
執(zhí)行語句}例如:求兩個數的最大值。
int
max(int
x,inty){intz;z=x>y?x:y;return(z);}4.2函數定義及調用10#include<stdio.h>int
cube(inty);/*函數原型聲明*/voidmain(){
int
x,last,nowcb;last=1;printf("1~5之間,相鄰兩數的立方差是:\n");
for(x=2;x<=5;x++){
nowcb=cube(x);/*函數調用*/
printf("%d",nowcb-last);last=nowcb;}
printf("\n");}/*函數定義*/
int
cube(inty)/*函數首部*/{returny*y*y;}例4-1編寫一個函數cube,計算整數的立方。花括號中也可以為空,這種函數叫空函數。不能在函數體內定義其他函數,即函數不能嵌套定義。11函數名(實參表列)在C語言中,把函數調用也作為一個表達式。因此凡是表達式可以出現的地方都可以出現函數調用。例如:①welcome();/*函數調用語句*/②if(iabs(a)>max)max=iabs(a);
/*函數調用構成表達式*/
③m=max(c,max(a,b));/*函數調用作為函數參數*/4.2.2函數的調用函數調用的一般形式:12voidswap(intx,inty){intz;z=x;x=y;y=z;
printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;
swap(a,b);
printf("\na=%d,b=%d\n",a,b);}4.2.3函數參數傳遞與返回值1.函數的參數傳遞(值傳遞)程序輸出結果:x=20,y=10a=10,b=20形式參數(形參)實際參數(實參)【例】編一程序,將主函數中的兩個變量的值傳遞給swap函數中的兩個形參,交換兩個形參的值。單向值傳遞13有關形參和實參的說明:
①當函數被調用時才給形參分配內存單元。調用結束,所占內存被釋放。②實參可以是常量、變量或表達式,但要求它們有確定的值。③實參與形參類型要一致,字符型與整型兼容。④實參與形參的個數必須相等。在函數調用時,實參的值賦給與之相對應的形參。“單向值傳遞”。14函數的返回值是通過return語句帶回到主調函數的功能:終止函數的運行,返回主調函數,若有返回值,將返回值帶回主調函數。說明:①若函數沒有返回值,return語句可以省略。②return語句中的表達式類型一般應和函數的類型一致,如果不一致,系統(tǒng)自動將表達式類型轉換為函數類型。2.函數的返回值return語句格式:return;或return表達式
;15【例】計算并輸出圓的面積。#include<stdio.h>s(intr){return3.14*r*r;}voidmain(){intr;
scanf("%d",&r);
printf("%d\n",s(r));}自動轉換為int型程序運行情況如下:2'12說明:①函數的類型決定了函數返回值的類型。若省略函數的類型,系統(tǒng)默認其為int型。②無返回值的函數應將其類型定義為void(空)類型。16【例4-8】編寫函數實現兩組變量的顯示定義2組,共8個整型變量a1……a4,b1……b4,要求:輸入字符a和整數1,顯示a1變量的值,輸入字符b和整數1,顯示b1變量的值……17#include<stdio.h>int
ArrayOperating(int
i,char
ch){inta1=1,a2=0,a3=3,a4=5;
intb1=2,b2=0,b3=4,b4=3;
switch(i){case1:
switch(ch) {case'a':returna1;case'b':returnb1; }case2:……case3:……case4:……}}voidmain(){int
i;char
ch;
printf("輸入顯示的變量,形式如:a1或b4:");
scanf("%c%d",&ch,&i);
printf("%c%d=%d\n",ch,
i,ArrayOperating(i,ch));}184.2.4函數的嵌套調用main函數{
……
調用函數A;
……}函數A{……
調用函數B;
……}函數B{
……
……
……}19【例】函數的嵌套調用main(){intn=3;
printf("%d\n",sub1(n));}sub1(intn){int
i,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序輸出結果:920
4.2.5對被調函數的聲明和函數原型變量要先定義后使用,函數也如此。即被調函數的定義要出現在主調函數的定義之前。如swap函數.voidswap(intx,inty){…}main(){…
swap(a,b);
}main(){…c=max(a,b);}max(int
x,inty){…}允許整型函數(且參數也是整型)的定義出現在主調函數之后。如max函數.21對被調函數進行聲明的一般形式
函數類型函數名(參數類型1
參數名1,…);或函數類型函數名(參數類型1,參數類型2,…);第二種形式省略了參數名,此種形式也稱為函數的原型。如果非整型函數在主調函數之后定義,則應在主調函數中或主調函數之前對被調函數進行聲明。22#include<stdio.h>voidmain(){floatcalc(float
x,float
y,char
opr);floata,b;charopr;
printf("\n輸入四則運算表達式:");
scanf("%f%c%f",&a,&opr,&b);
if(opr=='+'||opr=='-'||opr=='*'||opr=='/')printf("%5.2f%c%5.2f=%6.2f\n",a,opr,b,calc(a,b,opr));elseprintf("非法運算符!\n");}floatcalc(float
x,float
y,char
opr){switch(opr){case'+':return(x+y); case'-':return(x-y); case'*':return(x*y); case'/':return(x/y);}}}對被調函數的聲明【例4-12】計算并輸出兩個數的和、差、積、商。234.3局部變量和全局變量變量的作用域:變量在程序中可以被使用的范圍。根據變量的作用域可以將變量分為局部變量和全局變量。局部變量(內部變量):在函數內或復合語句內定義的變量以及形參。作用域:函數內或復合語句內。4.3.1局部作用域和局部變量【例】分析下面程序的運行結果及變量的作用域。24voidsub(int
a,int
b){
int
c;a=a+b;b=b+a;c=b-a;printf("sub:\ta=%db=%dc=%d\n",a,b,c);}局部變量voidmain(){
int
a=1,b=1,c=1;
printf("main:\ta=%db=%dc=%d\n",a,b,c);
sub(a,b);
printf("main:\ta=%db=%dc=%d\n",a,b,c);
{
int
a=2,b=2;
printf("comp:\ta=%db=%dc=%d\n",a,b,c);}
printf("main:\ta=%db=%dc=%d\n",a,b,c);}局部變量局部變量“分程序”或“程序塊”程序輸出結果:main: a=1b=1c=1sub: a=2b=3c=1main:a=1b=1c=1comp:a=2b=2c=1main: a=1b=1c=1254.3.2全局作用域和全局變量全局變量(外部變量):在函數外部定義的變量。作用域:從定義變量的位置開始到本源文件結束。如在其作用域內的函數或分程序中定義了同名局部變量,則在局部變量的作用域內,同名全局變量暫時不起作用。【例】全局變量和局部變量的作用域。26int
a=5; voidf(int
x,int
y) {
int
b,c; b=a+x;c=a-y;printf("%d\t%d\t%d\n",a,b,c);}局部變量main(){int
b=6,c=7;
f(b,c);
printf("%d\t%d\t%d\n",a,b,c);
{
int
a=9,b=8;
printf("%d\t%d\t%d\n",a,b,c);
{
c=10;
printf("%d\t%d\t%d\n",a,b,c);
}
printf("%d\t%d\t%d\n",a,b,c);
}
printf("%d\t%d\t%d\n",a,b,c);}局部變量局部變量程序輸出結果:511-2567987981098105610全局變量“分程序”或“程序塊”int274.4變量的生存期和存儲類別4.4.1變量的生存期變量的生存期:變量在內存中占據存儲空間的時間。程序代碼區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)存儲分配動態(tài)存儲變量靜態(tài)存儲變量284.4.2變量的存儲類別變量的屬性數據類型:決定為變量分配內存單元的長度,數據的存放形式,數的范圍。存儲類別:決定了變量的生存期,給它分配在哪個存儲區(qū)。29變量定義語句的一般形式存儲類別數據類型變量名1,…,變量名n;auto(自動的)register(寄存器的)static(靜態(tài)的)
extern(外部的)301.自動變量(auto類別)main()
{int
x,y;…}main()
{auto
int
x,y;…}自動變量等價可省局部變量可以定義為自動變量。31main(){int
a,b,c;
printf(“Entera,b:\n”);
scanf(“%d%d”,&a,&b);c=sum(a,b);
printf(“Sum=%d\n”,c);}sum(int
a,intb){intc=0;
c=a+b;
return(c);}printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);c=a+b;return(c);printf(“Sum=%d\n”,c);main()Entera,b:內存用戶區(qū)靜態(tài)存儲區(qū)am
不定bm
不定cm
不定12<回車>as=1bs=2cs=0bm=2am=1sum(int
a,intb)Sum=3程序程序區(qū)動態(tài)存儲區(qū)觀察下列程序運行時變量的存儲情況單擊開始運行as=1bs=2cs=3運行結束cm=3
32⑴內存分配調用函數或執(zhí)行分程序時在動態(tài)存儲區(qū)為其分配存儲單元,函數或分程序執(zhí)行結束,所占內存空間即刻釋放。⑵變量的初值定義變量時若沒賦初值,變量的初值不確定;如果賦初值則每次函數被調用時執(zhí)行一次賦值操作。⑶生存期在函數或分程序執(zhí)行期間。⑷作用域自動變量所在的函數內或分程序內。自動變量332.靜態(tài)變量(static類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。static
int
a;main(){floatx,y;…}f(){static
int
b=1;……}全局靜態(tài)變量局部靜態(tài)變量自動變量不能省34⑴內存分配編譯時,將其分配在內存的靜態(tài)存儲區(qū)中,程序運行結束釋放該單元。⑵靜態(tài)變量的初值若定義時未賦初值,在編譯時,系統(tǒng)自動賦初值為0;若定義時賦初值,則僅在編譯時賦初值一次,程序運行后不再給變量賦初值。⑶生存期整個程序的執(zhí)行期間。⑷作用域局部靜態(tài)變量的作用域是它所在的函數或分程序。全局靜態(tài)變量的作用域是從定義處開始到本源文件結束。靜態(tài)變量35staticintb=0;main(){int a=2,i;for(i=0;i<2;i++)
printf("%4d",f(a));
printf("\n");}int
f(inta){staticintc=3;b++;c++;return(a+b+c);}【例】靜態(tài)變量的使用。main()for(i=0;i<2;i++)printf("%4d",f(a));int
f(inta)b++;c++;return(a+b+c);for(i=0;i<2;i++)printf("%4d",f(a));int
f(inta)b++;c++;return(a+b+c);printf("\n");for(i=0;i<2;i++)36int
c;staticint
a;main(){floatx,y;…}chars;f(){staticint
b=1;……}3.外部變量(extern
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南陽社旗縣招聘鄉(xiāng)鎮(zhèn)政府專職消防員筆試真題2025
- 2026 年高中秋季開學第一課高中生騎行安全頭盔佩戴教育
- 2026 年秋季初一開學第一課制定初中階段學期目標教育
- 2026年普外科護理風險防控專項查房
- 實習護士:尊重患者隱私是護理職業(yè)的第一課
- 電子廠產品質量檢驗細則
- 造紙廠節(jié)能管理規(guī)范
- 某建筑公司材料管理規(guī)范
- 高一語文暑假基礎知識梳理講義
- 小學教師考試題庫全解及答案解析
- 2026年甘肅金麟鋰電新材料有限公司招聘78人筆試參考題庫及答案詳解
- 2026福建福州市城市排水有限公司招聘6人筆試參考題庫及答案詳解
- 2026-2027學年安徽省高三六校第一次聯(lián)考數學試卷(含答案解析)
- 橋式起重機起升機構卷筒與鋼絲繩設計計算書
- 2024 電動汽車用驅動電機系統(tǒng)
- 2026年上海市中考數學試卷(附答案解析)
- 嘉興南湖區(qū)招聘社區(qū)工作者筆試真題2025
- 2026年消防文職電腦操作測試題及答案
- T∕IAC CAMRA 50-2024 事故汽車常用零部件修復與更換判別規(guī)范
- 《農村社會學》教案-緒論 農村社會學的研究對象與學科邊界
- 算電協(xié)同發(fā)展策略
評論
0/150
提交評論