




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
5.4函數(shù)嵌套調(diào)用和遞歸調(diào)用5.4.1函數(shù)嵌套調(diào)用C語言不允許函數(shù)嵌套定義(單一性、獨立性)。但允許函數(shù)嵌套調(diào)用,即被調(diào)函數(shù)中又調(diào)用其它函數(shù)(見P133
例5.11)。
mian函數(shù)①調(diào)用squa函數(shù)s=s+squa(i)結(jié)束squa函數(shù)調(diào)用fact函數(shù)b=fact(k)fact函數(shù)②③④⑤⑥⑦⑧⑨兩層嵌套執(zhí)行過程}}}#include<stdio.h>doublefact(intm){doublea=1;inti;for(i=1;i<=m;i++)a=a*i;returna;}doublesqua(intn){doubleb;intk;k=n*n;b=fact(k);returnb;}voidmain(void){inti;doubles=0;for(i=1;i<=5;i++)s=s+squa(i);printf("s=%e\n",s);}5.4.2函數(shù)遞歸調(diào)用(嵌套調(diào)用特例)概念:函數(shù)直接或間接地自我調(diào)用稱為遞歸函數(shù)。intfun1(intx){…z=fun1(y);…}intfun1(intx)intfun2(intt){{……z=fun2(y);c=fun1(a);……}}直接引用本身間接引用本身遞歸在沒有控制條件情況下是無窮遞歸。#include<stdio.h>voidmain(void){printf("*****\n");
main();}只有經(jīng)過控制條件,使遞歸調(diào)用終止,才能應(yīng)用。#include<stdio.h>voidmain(void){charch;printf("******\n");ch=getchar();if(ch!='9')main();}遞歸舉例:求n!n!=1
n=0或n=1n(n-1)!
n>1f(n)=1
n=0或n=1nf(n-1)
n>1#include<stdio.h>longlfac(long);voidmain(void){longi,x;scanf("%ld",&i);x=lfac(i);printf("\n%ld",x);}longlfac(longn){if(n==0||n==1)return1;elsereturn(n*lfac(n-1));}lfac(4)4*lfac(3)3*lfac(2)2*flac(1)2*13*2*14*3*2*1遞推回歸=n×(n-1)×(n-2)×…×3×2×1=n×(n-1)!5.5變量作用域和存放類型變量生存期:變量占用內(nèi)存單元(活著)時間。
內(nèi)存中供用戶使用存放空間:
程序區(qū):存放程序代碼。
數(shù)據(jù)區(qū):存放數(shù)據(jù),分為動態(tài)存放區(qū)和靜態(tài)存放區(qū)。
5.5.1
變量生存期和作用域C語言中,定義變量應(yīng)包含三個內(nèi)容:
①數(shù)據(jù)類型:變量占用內(nèi)存空間大小。如:int,float,char。
②作用域:變量在程序中有效區(qū)域。
③存放類型:變量在內(nèi)存中存放方式。存放方式不一樣,變量占用內(nèi)存時間不一樣。
①靜態(tài)存放區(qū):定義變量(程序編譯)時就分配內(nèi)存單元,直到程序結(jié)束。生存期為整個程序運行期。
②動態(tài)存放區(qū):使用時才分配內(nèi)存單元,使用完成,馬上釋放。生存期為函數(shù)調(diào)用期。變量作用域:變量在程序中可使用范圍(有效性)。
1.局部變量定義在函數(shù)內(nèi)部變量。也稱為內(nèi)部變量。放在動態(tài)區(qū)中,只有調(diào)用它函數(shù)才能使用它。調(diào)用時才分配內(nèi)存單元,調(diào)用結(jié)束,內(nèi)存即刻被釋放,
作用域:僅限于函數(shù)內(nèi)部或復(fù)合語句內(nèi)。
生存期:函數(shù)調(diào)用期間。作用域能夠是一個函數(shù)或一個復(fù)合語句,取決于定義變量位置,可分為局部變量和全局變量。注意:不一樣函數(shù)或復(fù)合語句中能夠使用相同變量名。因為它們作用域不一樣,所以它們互不干預(yù)。即:同名,不一樣作用域變量是不一樣變量。
例:(見p137例5.13)
#include<stdio.h>
voidfunc();
main(){inty=10;printf(“1:y=%d\n”,y);
func();
printf(“2:y=%d\n”,y);}
voidfunc(){intx=5;
{intx=3;
{intx=1;printf(“@x=%d\n”,x);}
printf(“@@x=%d\n”,x);}printf(“@@@x=%d\n”,x);}運行結(jié)果:1:y=10@x=1@@x=3@@@x=52:y=102.全局變量
定義在函數(shù)之外變量。也稱為外部變量。放在靜態(tài)區(qū)中。作用域:從定義直到文件結(jié)束。生存期:在程序整個執(zhí)行過程中。#include<stdio.h>voidadd(void);inta,b,c;voidmain(void){scanf(“%d,%d”,&a,&b);add();printf(“%d”,c);}voidadd(void){
c=a+b;
}外部變量作用域注意:1.任何函數(shù)對外部變量修改都會影響其它函數(shù)對它引用。2.當函數(shù)中出現(xiàn)和全局變量同名局部變量時,局部變量優(yōu)先。5.5.2變量存放類型
變量存放類型有四種:⑴自動類型auto⑵存放器類型register⑶靜態(tài)類型static⑷外部類型extern完整變量說明格式:存放類型
數(shù)據(jù)類型
變量名表;確定變量在內(nèi)存中表示方法。確定變量生存期和作用域。該項省略表示auto存放類型。變量作用域不一樣,本質(zhì)上是變量存放類型不一樣:
靜態(tài)存放:程序編譯時就分配內(nèi)存單元,直到程序結(jié)束。
動態(tài)存放:使用時才分配內(nèi)存單元,使用完成,馬上釋放。
動態(tài)存放方式
靜態(tài)存放方式
1、自動類型—auto(C默認存放方式)
定義在復(fù)合語句開始處。塊內(nèi)生存塊內(nèi)有效。#include<stdio.h>voidmain(void){
autointa,b;scanf(“%d,%d”,&a,&b);if(b>a){
intT;T=a;a=b;b=T;}printf(“Max=%d”,a);}ab作用域T作用域生存期:
執(zhí)行到復(fù)合語句時建立內(nèi)存變量。執(zhí)行出復(fù)合語句后變量消亡。T2、存放器類型—register
作用域和生存期與auto相同,差異:
假如CPU內(nèi)部存放器空閑,則使用存放器作為變量存放單元,以提升速度。主要用于循環(huán)變量。(見p140例5.16)3、靜態(tài)類型—static(局部/全局)作用域:在定義復(fù)合語句內(nèi)引用,出了復(fù)合語句不可見。生存期:從定義直到程序結(jié)束。執(zhí)行出{}時,原值并不消失,下次調(diào)用時變量中仍保留上次調(diào)用結(jié)束時值。voidrow(void);voidmain(void){intb;for(b=1;b<=9;b++)row();}voidrow(void){inta=1;
intb;for(b=1;b<=9;b++)printf("%3d",a*b);printf("\n");a++;}static說明a為靜態(tài)局部變量生存期從第一次調(diào)用到程序結(jié)束。a作用域①靜態(tài)局部變量特點:1.系統(tǒng)自動為靜態(tài)局部變量賦初值0。2.作用域與局部變量相同。3.生存期與局部變量不一樣。②靜態(tài)全局變量全局變量和靜態(tài)全局變量都是靜態(tài)存放方式,區(qū)分:全局變量作用域為整個源程序,靜態(tài)全局變量作用域為定義該變量源文件;若一個程序由多個“.c”文件組成
,全局變量在各個源文件中都有效,靜態(tài)全局變量則僅在定義它源文件中有效
。全局變量前加上存放類型說明static,即組成靜態(tài)全局變量。statica=3;voidmain(void){…}注意static位置:★靜態(tài)局部變量改變了局部變量存放方式(生存期),使其生存期與作用域不一樣?!镬o態(tài)全局變量改變了全局變量作用域,限制了全局變量使用范圍。4、外部類型(全局變量)—extern文件a1.c
文件b1.cintxx;externintxx;
voidmain()fun(){…}{…}文件1定義外部變量b1經(jīng)過說明使用a1外部變量假如只希望在本文件中使用,能夠加static說明。static定義在全部函數(shù)(任何花括號)之外全局變量。外部和全局是從不一樣角度對同一類變量提法,外部是從生存期(時間)角度提出;全局是從作用域(空間)角度提出。主要用于在多個文件間傳遞數(shù)據(jù)。特點:1.系統(tǒng)自動為外部變量賦初值0。2.作用域從定義開始直到文件結(jié)束。3.外部變量可被不一樣文件共享。格式:extern數(shù)據(jù)類型變量名;外部變量副作用#include<stdio.h>inti;voidprt(void);voidmain(void){for(i=0;i<5;i++)prt();}voidprt(void){for(i=0;i<5;i++)printf(“%c”,’$’);printf(“\n”);}函數(shù)作用:打印五個’$’。i==0i==0i==0i==0i==0i==1i==2i==3i==4i==5i==5i==5i==5i==5??模塊設(shè)計標準:內(nèi)聚性強,耦合性弱。外部變量使用占用內(nèi)存且增加模塊耦合性,使函數(shù)通用性降低,使程序模塊化、結(jié)構(gòu)化變差所以,應(yīng)盡可能不使用外部變量。幾次調(diào)用函數(shù)?外部變量應(yīng)用見p143例5.19綜合舉例:#include<stdio.h>inti=1;voidother(void);voidmain(){staticinta;intb=-10,c=0;
printf(“i=%d,a=%d,b=%d,c=%d\n”,i,a,b,c);c=c+8;other();
printf(“i=%d,a=%d,b=%d,c=%d\n”,i,a,b,c);i=i+10;other();}voidother(){staticinta=2;staticintb;intc=10;a=a+2;i=i+32;c=c+5;printf(“i=%d,a=%d,b=%d,c=%d\n”,i,a,b,c);
b=a;}運行結(jié)果:i=1,a=0,b=-10,c=0i=33,a=4,b=0,c=15i=33,a=0,b=-10,c=8i=75,a=6,b=4,c=15★課堂作業(yè):編寫函數(shù)求二維方陣主對角線上最大值及其位置。要求:在主函數(shù)中輸入a[3][3],經(jīng)過該函數(shù)求a[3][3]主對角線最大元素和位置。5.6編譯預(yù)處理C語言除了說明語句、執(zhí)行語句及控制語句外,還有一類以‘#’號開頭編譯預(yù)處理語句。如:#include、#define。該類語句作用是在編譯前對程序作一些處理,滿足特定處理要求。編譯預(yù)處理是C主要特征,它優(yōu)化了C程序設(shè)計環(huán)境。編譯預(yù)處理不用‘;’作為結(jié)束標志!以區(qū)分其它C語句。5.7.1宏定義1、不帶參數(shù)宏定義作用:定義常量名為一字符串。提升程序可讀性,便于修改。格式:#define宏名字符串#definePI3.1415926voidmain(void){flaotr;scanf(“%f”,&r)
printf(“%f\n”,PI*r*r);}編譯時用字符串替換宏名(宏代換)3.1415926說明:⑴宏名普通用大寫(區(qū)分變量);⑵預(yù)處理程序用字符串無條件替換宏名,編譯時檢驗語法。#definePI3.1415926;…PI*r*r3.1415926;*r*r
⑶宏名定義域:從定義到程序結(jié)束。能夠經(jīng)過#undef修改定義范圍。#defineG9.8voidmain(void){…}#undefGG范圍⑷宏定義允許嵌套(在字符串中使用已定義宏名)。⑸宏定義可定義運算符、表示式和提醒信息(見P146例5.20)。#define
R3.0#define
PI
3.14159#defineS
PI*R*Rprintf(“S=%f”,S);不替換2、帶參數(shù)宏定義格式:
#define宏名(形參表)含參數(shù)字符串#defineS(a,b)a*b…area=S(4,3);替換過程:①用實參替換宏定義形參。②替換字符串中參數(shù)。③替換整個宏。4*3帶參宏與函數(shù)區(qū)分:帶參宏不分配內(nèi)存單元,沒有值傳遞,不返回值,只是在預(yù)處理時按規(guī)則進行字符串代換。注意:①要嚴格按格式書寫,不然會造成錯誤。#defineS
(a,b)a*b
則:S(3,4)被替換成:(a,b)a*b(3,4)②實參有可能是表示式時,定義形參字符串要加()。#defineS(r)PI*r*r則:S(a+b)替換為:PI*a+b*a+b#defineS(r)PI*(r)*(r)S(a+b)替換為:PI*(a+b)*(a+b)5.6.2文件包含格式1:
#include<被包含文件名>格式2:
#include“被包含文件名”<>表示編譯系統(tǒng)定義路徑;“”表示用戶當前路徑。作用:將指定文件內(nèi)容和當前源文件一起編譯,聯(lián)成一個源文件。⑴一個#include只能包含一個文件。⑵文件包含能夠嵌套。⑶普通將宏定義及函數(shù)申明放在包含文件中。⑷被包含文件普通擴展名為.h,稱為頭文件
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 管理創(chuàng)新方法試題及答案
- 貴州中考語文答案及試題
- 防火培訓(xùn)試題及答案
- 小院經(jīng)濟面試題及答案
- 西方國家的電力政策與國際關(guān)系試題及答案
- 現(xiàn)代文學(xué)小說主題應(yīng)用題集
- 項目管理中的網(wǎng)絡(luò)安全策略試題及答案
- 機電工程流體控制試題匯編
- 軟件設(shè)計中的用戶角色分配與試題答案
- 探討2025年機電工程的國際化趨勢試題及答案
- 課題申報參考:數(shù)智時代大學(xué)生網(wǎng)絡(luò)社會心態(tài)形成發(fā)展規(guī)律及引導(dǎo)策略研究
- 船舶與海洋工程原理(上)知到智慧樹章節(jié)測試課后答案2024年秋哈爾濱工程大學(xué)
- 《核電廠實物保護系統(tǒng)定期試驗規(guī)范》
- 江蘇卷2024年高考語文第一次模擬考試一(原卷版+解析版)
- 甘肅開放大學(xué)2024年《信息技術(shù)與信息管理》形考作業(yè)1-4答案
- 【MOOC】應(yīng)用光學(xué)實驗-浙江大學(xué) 中國大學(xué)慕課MOOC答案
- 【MOOC】臺灣歷史與文化-福建師范大學(xué) 中國大學(xué)慕課MOOC答案
- 轉(zhuǎn)體施工案例
- 深圳2020-2024年中考英語真題復(fù)習(xí)專題01 語法填空(解析版)
- JJF(津) 139-2024 電動汽車公用充電設(shè)施統(tǒng)計抽樣計量性能評價技術(shù)規(guī)范
- DB11T 301-2017 燃氣室內(nèi)工程設(shè)計施工驗收技術(shù)規(guī)范
評論
0/150
提交評論