C語言程序設(shè)計(第四版)(微課版)ch07 函數(shù)_第1頁
C語言程序設(shè)計(第四版)(微課版)ch07 函數(shù)_第2頁
C語言程序設(shè)計(第四版)(微課版)ch07 函數(shù)_第3頁
C語言程序設(shè)計(第四版)(微課版)ch07 函數(shù)_第4頁
C語言程序設(shè)計(第四版)(微課版)ch07 函數(shù)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

7.1函數(shù)概述7.2函數(shù)的聲明7.3函數(shù)定義和函數(shù)調(diào)用7.4程序舉例7.5函數(shù)的嵌套調(diào)用和遞歸調(diào)用7.6變量的作用域7.7變量的存儲類別7.1函數(shù)概述模塊化程序設(shè)計基本思想:將一個大的程序按功能分割成一些小模塊。特點:各模塊相對獨立、功能單一、結(jié)構(gòu)清晰、接口簡單控制了程序設(shè)計的復(fù)雜性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動易于維護(hù)和功能擴(kuò)充開發(fā)方法:自上向下,逐步分解,分而治之【例7.1】

計算5!+6!+7!并輸出結(jié)果。#include<stdio.h>main(){ inti,t,num1=5,num2=6,num3=7,sum=0;

for(i=1,t=1;i<=num1;i++) t=t*i; sum=sum+t;

for(i=1,t=1;i<=num2;i++) t=t*i; sum=sum+t; for(i=1,t=1;i<=num3;i++)

t=t*i; sum=sum+t; printf("5!+6!+7!=%d\n",sum);}出現(xiàn)重復(fù)#include<stdio.h>intfac(intnum); main(){ intt1,t2,t3,sum=0;

t1=fac(5); t2=fac(6); t3=fac(7); sum=t1+t2+t3; printf("5!+6!+7!=%d\n",sum);}intfac(intnum) /*定義fac函數(shù),num是形參*/{ inti,t; for(i=1,t=1;i<=num;i++) t=t*i; returnt; /*函數(shù)的返回值*/}7.2函數(shù)的聲明函數(shù)聲明的一般形式如下:類型標(biāo)識符函數(shù)名(類型形參名1,類型形參名2,…);或類型標(biāo)識符函數(shù)名(類型,類型,…);#include<stdio.h>intfac(intnum);/*對函數(shù)fac的聲明語句*/main(){ ...}7.3函數(shù)定義和函數(shù)調(diào)用函數(shù)類型函數(shù)名(形參類型說明表){

說明部分 語句部分}函數(shù)定義:函數(shù)的調(diào)用調(diào)用形式

函數(shù)名(實參表);說明:實參與形參個數(shù)相等,類型一致,按順序一一對應(yīng)實參表求值順序,因系統(tǒng)而定#include<stdio.h>intmax(inta,intb);/*函數(shù)原型的聲明*/intmain(){ intx,y,z; printf("inputtwonumbers:\n"); scanf("%d%d",&x,&y);

z=max(x,y);/*函數(shù)的調(diào)用語句*/

printf("maxmum=%d",z); return0;}/*以下是函數(shù)的定義部分*/intmax(inta,intb){ if(a>b)returna; elsereturnb;}實參形參7.5函數(shù)的嵌套調(diào)用和遞歸調(diào)用7.5.1嵌套調(diào)用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)例7.7輸入兩個整數(shù),輸出較大值的函數(shù)調(diào)用過程如下圖所示。7.5.2函數(shù)的遞歸調(diào)用遞歸是一種特殊的解決問題的方法。其基本思想是:將要解決的問題分解成比原問題規(guī)模小的類似子問題,而解決這個類似子問題時,又可以用到原有問題的解決方法,按照這一原則,逐步遞推轉(zhuǎn)化下去,最終將原問題轉(zhuǎn)化成較小且有已知解的子問題。(1)遞推階段:將原問題不斷地轉(zhuǎn)化成子問題,逐漸從未知向已知推進(jìn),最終到達(dá)已知解的問題,遞推階段結(jié)束。(2)回歸階段:從已知解的問題出發(fā),按照遞推的逆過程,逐一求值回歸,最后到達(dá)遞歸的開始處,結(jié)束回歸階段,獲得問題的解。例如:求5!遞推階段5!=5×4!→4!=4×3!→3!=3×2!→2!=2×1!→1!停止,其中1!=1回歸階段5!=5×4!=120←4!=4×3!=24←3!=3×2!=6←2!=2×1!=2←1!=1例:有5個人坐在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2歲。問第3個人,又說比第2個人大2歲。問第2個人,說比第1個人大2歲。最后問第1個人,他說是10歲。請問第5個人多大。

age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10用數(shù)學(xué)公式表述如下:age(n)=10(n=1)age(n-1)+2(n>1)age(5)

c=age(4)+2;

returnc;age(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}遞歸過程跟蹤分析:age(4)

c=age(3)+2;

returnc;age(3)

c=age(2)+2;

returnc;age(2)

c=age(1)+2;

returnc;age(1)

c=10

returnc;c=10c=12c=14c=16c=187.6變量的作用域7.6.1局部變量1、定義:在一個函數(shù)(或復(fù)合語句)內(nèi)部定義的變量。

2、作用域:本函數(shù)(或復(fù)合語句)

它只在本函數(shù)范圍(或復(fù)合語句)內(nèi)有效,也就是說只有在本函數(shù)(或復(fù)合語句)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的。floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效3、說明(1)形式參數(shù)是局部變量。如f1中形參a,出了f1函數(shù)就無效。(2)main中定義的變量只在main中有效,也是局部變量。不能因為在main函數(shù)中定義就在整個文件或程序中有效。main函數(shù)也不能使用其它函數(shù)中定義的變量。例不同函數(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);}運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=43、說明(3)不同函數(shù)中的同名變量,占有不同內(nèi)存單元,因此不會相互影響3、說明(4)復(fù)合語句中的變量運(yùn)行結(jié)果:54321例復(fù)合語句中變量#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]);}變量temp只在本復(fù)合語句中有效,離開該復(fù)合語句就無效,釋放內(nèi)存。1、定義:在所有函數(shù)外部定義的變量。全局變量可以為本文件中其他函數(shù)所共用。2、作用域:從定義變量的位置開始到本源文件結(jié)束,及有

extern說明的其它源文件。7.6.2全局變量3、說明:(1)有效范圍:從定義或有extern聲明的位置開始,直至它所在源程序文件的結(jié)束。intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范圍p,q的作用范圍3、說明:

(2)若外部變量與局部變量同名,則外部變量被屏蔽inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}例外部變量與局部變量運(yùn)行結(jié)果:max=8內(nèi)存…….main(){inta;a=10;printf(“%d”,a);}編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元1020002001程序中使用變量名對內(nèi)存操作在C語言中每一個變量和函數(shù)有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。7.7變量的存儲類別靜態(tài)變量:存儲在靜態(tài)存儲區(qū)的變量。在程序運(yùn)行期間分配固定的存儲空間不釋放生存期:從程序開始執(zhí)行到程序結(jié)束動態(tài)變量:存儲在動態(tài)區(qū)的變量。在程序運(yùn)行期間根據(jù)需要臨時分配存儲空間,離開即釋放生存期:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束存儲類別:指變量、函數(shù)等存儲的方式和位置存儲器類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、局部靜態(tài)變量形參變量局部動態(tài)變量(autoregister)函數(shù)調(diào)用現(xiàn)場保護(hù)和返回地址等變量的存儲類型auto-----自動型register-----寄存器型static------靜態(tài)型extern-----外部型變量定義格式:[存儲類型]數(shù)據(jù)類型變量表;如:intsum;

autointa,b,c;

registerinti;

staticfloatx,y;auto(自動)變量沒有聲明為static的局部變量都屬于此類。如:函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量)。存儲特性:存儲在動態(tài)存儲區(qū)。調(diào)用時自動動態(tài)分配存儲空間。調(diào)用結(jié)束后自動釋放存儲空間。例如:

intf(inta)/*定義f函數(shù),a為形參*/

{autointb,c=3;/*定義b、c為自動變量*/

}執(zhí)行完f后,自動釋放a、b、c所占的內(nèi)存。

autointb,c=3和intb,c=3等價。register(寄存器)變量只有auto變量與形式參數(shù)可以作為register變量register變量和auto變量不同之處在于register變量存放在CPU的寄存器中,因此比auto變量存取速度快。通常將頻繁使用的變量放在寄存器中,以提高程序執(zhí)行速度不能對寄存器變量使用取地址運(yùn)算符&計算機(jī)中寄存器的數(shù)量是有限的,而且寄存器的數(shù)據(jù)長度也是有限的。因此register變量不能定義太多,也不能是數(shù)據(jù)類型太大的變量(long、float、double型)目前register變量定義通常是不必要的,優(yōu)化的編譯系統(tǒng)能夠識別使用頻繁的變量,并將其放到寄存器中static(靜態(tài))變量static變量存放在內(nèi)存的靜態(tài)存儲區(qū),在整個程序運(yùn)行期間占用固定的內(nèi)存單元。可以修飾局部變量和全局變量。系統(tǒng)在編譯時為static變量分配空間并賦初值,對未賦值的局部static數(shù)值型變量,系統(tǒng)自動給它賦值為0;對未賦值的局部static字符型變量,自動賦值為空字符。因為在編譯時賦初值,所以只能賦一次初值且只能在定義時進(jìn)行。由于變量占用的存儲單元不消失,再次調(diào)用static局部變量時,static局部變量的值為上次調(diào)用結(jié)束時的值。注意:static局部變量的生存期是整個程序運(yùn)行期間,但作用域仍然是定義該變量的函數(shù)體(或復(fù)合語句)內(nèi)部。即:靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)不能引用它。static修飾全局變量,將使全局變量作用域局限于本文件內(nèi)。main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}練習(xí)局部靜態(tài)變量值具有可繼承性運(yùn)行結(jié)果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}運(yùn)行結(jié)果:123#include<stdio.h>voidmain(){

intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));

intf(inta){autointb=0;

intc=3;

b=b+1;

c=c+1;return(a+b+c);}考察靜態(tài)局部變量的值。#include<stdio.h>voidmain(){

intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));

intf(inta){autointb=0;

staticintc=3;

b=b+1;

c=c+1;return(a+b+c);}結(jié)果:7,8,9b、c是自動變量,函數(shù)調(diào)用結(jié)束后,b、c的存儲空間釋放。再一次調(diào)用,b、c重新賦值。c是靜態(tài)局部變量

溫馨提示

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

評論

0/150

提交評論