版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年獵頭服務(wù)定制合同
- 2024年主題公園招商合同范本3篇
- 2024年學(xué)生托管服務(wù)與心理咨詢服務(wù)合作協(xié)議3篇
- 餐廳年度工作計劃11篇
- 安防風(fēng)險評估報告
- 政治教師工作計劃
- 英文感謝信模板錦集10篇
- 幼兒園安全教育心得體會
- 大學(xué)個人學(xué)習(xí)規(guī)劃范文7篇
- 城南舊事的觀后感350字
- 教師教學(xué)事故檢討書
- 鐵工電〔2023〕54號國鐵集團(tuán)關(guān)于印發(fā)《普速鐵路工務(wù)安全規(guī)則》的通知
- 事業(yè)單位工作人員處分暫行規(guī)定2012
- CJJ 169-2012城鎮(zhèn)道路路面設(shè)計規(guī)范
- 現(xiàn)代機(jī)械工程圖學(xué) 課件 第10章-裝配圖
- 新概念英語第一冊1-72課測試題
- 天貓售后工作總結(jié)
- 國賽一等獎經(jīng)驗分享
- 2024年試驗箱行業(yè)未來三年發(fā)展洞察報告
- 江西省萍鄉(xiāng)市2023-2024學(xué)年高一上學(xué)期期末生物試題
- 《性格決定命運(yùn)》課件
評論
0/150
提交評論