2023學年完整公開課版C語言第七課_第1頁
2023學年完整公開課版C語言第七課_第2頁
2023學年完整公開課版C語言第七課_第3頁
2023學年完整公開課版C語言第七課_第4頁
2023學年完整公開課版C語言第七課_第5頁
已閱讀5頁,還剩6頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章函數7.1函數的定義與調用

(1)無參函數的一般形式

函數類型函數名(void){說明語句部分;可執行語句部分;

}注意:在舊標準中,函數可以缺省參數表。但在新標準中,函數不可缺省參數表;如果不需要參數,則用“void”表示,主函數main()例外。(2)有參函數的一般形式函數類型函數名(數據類型參數[,數據類型參數2……]){說明語句部分;可執行語句部分;

}有參函數比無參函數多了一個參數表。調用有參函數時,調用函數將賦予這些參數實際的值。為了與調用函數提供的實際參數區別開,將函數定義中的參數表稱為形式參數表,簡稱形參表。[案例7.1]定義一個函數,用于求兩個數中的大數。/*功能:定義一個求較大數的函數并在主函數中調用*/intmax(intn1,intn2) /*定義一個函數max()*/{return(n1>n2?n1:n2);

}main(){intmax(intn1,intn2); /*函數說明*/intnum1,num2;

printf("inputtwonumbers:\n");

scanf("%d%d",&num1,&num2);printf("max=%d\n",max(num1,num2));getch(); /*使程序暫停,按任一鍵繼續*/}(1)函數定義不允許嵌套。在C語言中,所有函數(包括主函數main())都是平行的。一個函數的定義,可以放在程序中的任意位置,主函數main()之前或之后。但在一個函數的函數體內,不能再定義另一個函數,即不能嵌套定義。(2)空函數──既無參數、函數體又為空的函數。其一般形式為:[函數類型]函數名(void){}7.2函數的嵌套調用和遞歸調用1.函數的嵌套調用

函數的嵌套調用是指,在執行被調用函數時,被調用函數又調用了其它函數。這與其它語言的子程序嵌套調用的情形是類似的,其關系可表示如圖7-1[案例7.4]計算s=1k+2k+3k+……+Nk

/*功能:函數的嵌套調用*/#defineK4#defineN5longf1(intn,intk) /*計算n的k次方*/{longpower=n;inti;for(i=1;i<k;i++)power*=n;returnpower;}longf2(intn,intk) /*計算1到n的k次方之累加和*/{longsum=0;inti;for(i=1;i<=n;i++)sum+=f1(i,k);returnsum;}main(){printf("Sumof%dpowersofintegersfrom1to%d=",K,N);printf("%d\n",f2(N,K));getch();}2.函數的遞歸調用函數的遞歸調用是指,一個函數在它的函數體內,直接或間接地調用它自身。C語言允許函數的遞歸調用。在遞歸調用中,調用函數又是被調用函數,執行遞歸函數將反復調用其自身。每調用一次就進入新的一層。[案例7.5]用遞歸法計算n!。/*功能:通過函數的遞歸調用計算階乘*/longpower(intn){longf;if(n>1)f=power(n-1)*n;elsef=1;return(f);}main(){intn;longy;printf("inputainteagernumber:\n");scanf("%d",&n);y=power(n);printf("%d!=%ld\n",n,y);getch();} 為了防止遞歸調用無終止地進行,必須在函數內有終止遞歸調用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調用,然后逐層返回。7.3數組作為函數參數數組用作函數參數有兩種形式:一種是把數組元素(又稱下標變量)作為實參使用;另一種是把數組名作為函數的形參和實參使用。

1數組元素作為函數參數[案例7.6]寫一函數,統計字符串中字母的個數。/*功能:數組元素作為函數實參*/intisalp(charc){if(c>='a'&&c<='z'||c>='A'&&c<='Z')return(1);elsereturn(0);}main(){inti,num=0;

charstr[255]; printf("Inputastring:"); gets(str); for(i=0;str[i]!='\0';i++) if(isalp(str[i]))num++; puts(str); printf("num=%d\n",num); getch();1)用數組元素作實參時,只要數組類型和函數的形參類型一致即可,并不要求函數的形參也是下標變量。換句話說,對數組元素的處理是按普通變量對待的。(2)在普通變量或下標變量作函數參數時,形參變量和實參變量是由編譯系統分配的兩個不同的內存單元。在函數調用時發生的值傳送,是把實參變量的值賦予形參變量。7.4內部變量與外部變量

C語言中所有的變量都有自己的作用域。變量說明的位置不同,其作用域也不同,據此將C語言中的變量分為內部變量和外部變量。1.內部變量在一個函數內部說明的變量是內部變量,它只在該函數范圍內有效。也就是說,只有在包含變量說明的函數內部,才能使用被說明的變量,在此函數之外就不能使用這些變量了。所以內部變量也稱“局部變量”。例如:intf1(inta)/*函數f1*/{intb,c;

……} /*a,b,c作用域:僅限于函數f1()中*/

intf2(intx)/*函數f2*/{inty,z;

……} /*x,y,z作用域:僅限于函數f2()中*/main(){intm,n;

……} /*m,n作用域:僅限于函數main()中*/說明以下幾點:1.主函數main()中定義的內部變量,也只能在主函數中使用,其它函數不能使用。同時,主函數中也不能使用其它函數中定義的內部變量。因為主函數也是一個函數,與其它函數是平行關系。這一點是與其它語言不同的,應予以注意。2.形參變量也是內部變量,屬于被調用函數;實參變量,則是調用函數的內部變量。3.允許在不同的函數中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發生混淆。4.在復合語句中也可定義變量,其作用域只在復合語句范圍內。2.外部變量:在函數外部定義的變量稱為外部變量。以此類推,在函數外部定義的數組就稱為外部數組。外部變量不屬于任何一個函數,其作用域是:從外部變量的定義位置開始,到本文件結束為止。外部變量可被作用域內的所有函數直接引用,所以外部變量又稱全局變量。

[案例7.9]輸入長方體的長(l)、寬(w)、高(h),求長方體體積及正、側、頂三個面的面積。/*功能:利用全局變量計算長方體的體積及三個面的面積*/ints1,s2,s3;intvs(inta,intb,intc){intv; v=a*b*c;s1=a*b;s2=b*c;s3=a*c; returnv;}main(){intv,l,w,h;clrscr();printf("\ninputlength,widthandheight:");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%ds1=%ds2=%ds3=%d\n",v,s1,s2,s3);getch();} 對于全局變量還有以下幾點說明:(1)外部變量可加強函數模塊之間的數據聯系,但又使這些函數依賴這些外部變量,因而使得這些函數的獨立性降低。從模塊化程序設計的觀點來看這是不利的,因此不是非用不可時,不要使用外部變量。(2)在同一源文件中,允許外部變量和內部變量同名。在內部變量的作用域內,外部變量將被屏蔽而不起作用。(3)外部變量的作用域是從定義點到本文件結束。如果定義點之前的函數需要引用這些外部變量時,需要在函數內對被引用的外部變量進行說明。外部變量說明的一般形式為:extern數據類型外部變量[,外部變量2……];注意:外部變量的定義和外部變量的說明是兩回事。外部變量的定義,必須在所有的函數之外,且只能定義一次。而外部變量的說明,出現在要使用該外部變量的函數內,而且可以出現多次。[案例7.10]外部變量的定義與說明。intvs(intxl,intxw){externintxh;/*外部變量xh的說明*/intv;

v=xl*xw*xh;/*直接使用外部變量xh的值*/returnv;

}main(){externintxw,xh;/*外部變量的說明*/intxl=5;/*內部變量的定義*/printf("xl=%d,xw=%d,xh=%d\nv=%d",xl,xw,xh,vs(xl,xw));

}intxl=3,xw=4,xh=5;/*外部變量xl、xw、xh的定義*/上機實踐,體驗函數調用求兩個數中的最小數。/*功能:定義一個求較大數的函數并在主函數中調用*/intmin(intn1,intn2) /*定義一個函數max()*/{return(n1<n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論