C語言項目化教程五_第1頁
C語言項目化教程五_第2頁
C語言項目化教程五_第3頁
C語言項目化教程五_第4頁
C語言項目化教程五_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

變量的作用域與生存期

張競丹深圳信息職業(yè)技術(shù)學(xué)院12變量的存儲方式和生存期目錄變量的作用域目錄121變量的作用域變量的存儲方式和生存期變量的作用域變量的作用域變量的作用域即為變量的作用范圍(有效范圍),有的變量可以在本文件或其它文件中進(jìn)行引用,有的則只能在局部范圍內(nèi)引用。因此,根據(jù)變量的作用域范圍可分為局部變量和全局變量。變量的作用域局部變量局部變量也稱為內(nèi)部變量,是在一個模塊內(nèi)部定義的變量,此模塊通常以一對大括號括起來,例如一個函數(shù)內(nèi)、一個復(fù)合語句內(nèi)。局部變量只能在所定義的模塊范圍內(nèi)才能使用,這也是函數(shù)模塊化思想的優(yōu)點。注意:主函數(shù)中定義的變量只能在主函數(shù)中有效,主函數(shù)不能使用其它函數(shù)中定義的變量。不同函數(shù)中可以使用相同名字的變量,它們代表不同的對象,內(nèi)存單元不同、互不干擾。形式化參數(shù)屬于被調(diào)用函數(shù)的局部變量。在復(fù)合語句中定義的變量屬于局部變量,只在本復(fù)合語句中有效。變量的作用域全局變量全局變量也稱外部變量,是在所有函數(shù)之外定義的變量,可被本文件中其它函數(shù)所共用,有效范圍為從定義變量的位置開始到本文件結(jié)束。注意:C程序中設(shè)計人員習(xí)慣將全局變量名的第一個字母大寫。建議盡量避免使用全局變量。全局變量在程序的全部執(zhí)行過程中始終占用存儲單元。函數(shù)在執(zhí)行時要依賴于其所在的外部變量,使函數(shù)的通用性降低使用全局變量過多,會降低程序的清晰性,往往難以清楚地判斷出每個瞬時各個外部變量的值,程序容易出錯。外部變量與局部變量同名,則在局部變量的作用范圍內(nèi),外部變量被“屏蔽”,不起作用目錄122變量的存儲方式和生存期變量的存儲方式和生存期變量的作用域變量的存儲方式和生存期(1)變量的存儲方式變量是對程序中數(shù)據(jù)的存儲空間的抽象。變量的存儲方式,規(guī)定了變量占用內(nèi)存空間的方式,分為靜態(tài)存儲和動態(tài)存儲。靜態(tài)存儲類型的變量:在程序運行中被系統(tǒng)分配固定的內(nèi)存單元,并一直保持不變,直至整個程序結(jié)束,內(nèi)存空間才被釋放,例如全局變量。動態(tài)存儲類型的變量:在程序運行期間根據(jù)需要進(jìn)行動態(tài)分配內(nèi)存單元,使用完畢立即釋放,例如函數(shù)的形參。變量的存儲方式和生存期在C語言中,對變量的存儲類型說明有四種:

自動變量——auto函數(shù)中的形參和在函數(shù)中定義的變量都是自動變量。自動型變量不可以定義在函數(shù)外部,只能定義在函數(shù)內(nèi)部。在函數(shù)內(nèi)部定義的變量默認(rèn)是auto類型,通??梢允÷躁P(guān)鍵字auto。靜態(tài)變量——static函數(shù)中靜態(tài)變量的值在函數(shù)調(diào)用結(jié)束后不會消失而保留原值。靜態(tài)變量可分為靜態(tài)局部變量和靜態(tài)全局變量兩種。變量的存儲方式和生存期在C語言中,對變量的存儲類型說明有四種:

寄存器變量——registerC語言允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。外部變量——externextern聲明外部變量可以擴(kuò)展外部變量的作用域。extern全局變量可以在另外一個文件中調(diào)用,static不可以。變量的存儲方式和生存期(2)變量的生存期變量的生存期是指變量占有內(nèi)存單元的時間。靜態(tài)變量在程序執(zhí)行期間將一直占用內(nèi)存單元,自動變量在作用域結(jié)束后將內(nèi)存釋放。謝謝您的聆聽!Thankyou!數(shù)組作為函數(shù)參數(shù)

張競丹深圳信息職業(yè)技術(shù)學(xué)院12數(shù)組名作函數(shù)實參目錄數(shù)組元素作函數(shù)實參目錄121數(shù)組元素作函數(shù)實參數(shù)組名作函數(shù)實參數(shù)組元素作函數(shù)實參數(shù)組元素作函數(shù)實參由于實參可以是表達(dá)式形式,數(shù)組元素可以是表達(dá)式的組成部分,因此數(shù)組元素可以作為函數(shù)的實參,與變量作實參一樣是單向傳遞,即“值傳遞”的方式。例5-7

統(tǒng)計10個學(xué)生的語文成績,輸出及格學(xué)生的成績。編程分析:(1)數(shù)據(jù)結(jié)構(gòu)類型題目要求形式語言(C)的表達(dá)輸入數(shù)據(jù)10個學(xué)生的語文成績實型數(shù)組:floatscore[10];數(shù)組元素作函數(shù)實參例5-7

統(tǒng)計10個學(xué)生的語文成績,輸出及格學(xué)生的成績。編程分析:(2)算法算法流程形式語言的表達(dá)在主函數(shù)中從鍵盤讀入10個學(xué)生的語文成績存放在實型數(shù)組score中循環(huán)以函數(shù)scanf讀入數(shù)據(jù),依次存放在數(shù)組score中編寫函數(shù)判斷學(xué)生的成績是否及格voidscoref(floats){

若s>=60

輸出s}將輸入成績中及格成績輸出循環(huán)調(diào)用函數(shù)scoref數(shù)組元素作函數(shù)實參例5-7

統(tǒng)計10個學(xué)生的語文成績,輸出及格學(xué)生的成績。注意:在主函數(shù)中以數(shù)組元素score[i]作為實參調(diào)用scoref函數(shù)。當(dāng)i=0時,將score[0]的數(shù)值傳遞給形參s,這是單向傳遞數(shù)值的方式.33score[0]s目錄122數(shù)組名作函數(shù)實參數(shù)組名作函數(shù)實參數(shù)組元素作函數(shù)實參數(shù)組名作函數(shù)實參如希望在函數(shù)中處理整個數(shù)組元素,可以用數(shù)組名作函數(shù)實參,其用法與變量相同;但是,此時傳遞的是數(shù)組的首地址,這是一個雙向“傳地址”的方式。例5-8有10個學(xué)生成績,用一個函數(shù)求全體學(xué)生的平均成績編程分析:(1)數(shù)據(jù)結(jié)構(gòu)類型題目要求形式語言(C)的表達(dá)輸入數(shù)據(jù)10個學(xué)生的成績實型數(shù)組:floatscore[10];數(shù)組名作函數(shù)實參例5-8有10個學(xué)生成績,用一個函數(shù)求全體學(xué)生的平均成績編程分析:(2)算法算法流程形式語言的表達(dá)在主函數(shù)中從鍵盤讀入10個學(xué)生的語文成績存放在實型數(shù)組score中循環(huán)以函數(shù)scanf讀入數(shù)據(jù),依次存放在數(shù)組score中編寫函數(shù)計算10個學(xué)生的平均成績floatmeanf(floats[]){floatsum=0;sum←循環(huán)計算累加和returnsum/10;}輸出平均分調(diào)用函數(shù)meanf,輸出其結(jié)果數(shù)組名作函數(shù)實參例5-8有10個學(xué)生成績,用一個函數(shù)求全體學(xué)生的平均成績說明:數(shù)組名即是數(shù)組的首地址,主函數(shù)以數(shù)組名score為實參調(diào)用meanf函數(shù),就是將數(shù)組的首地址傳遞給形參s,那么s所指向的即為數(shù)組score的首地址,這是雙向“傳地址”的方式。此時在函數(shù)中可以通過修改形參而改變數(shù)組元素的值,例如s[4]即為score[4]。score[4]sscores[4]謝謝您的聆聽!Thankyou!函數(shù)的嵌套調(diào)用和遞歸調(diào)用

張競丹深圳信息職業(yè)技術(shù)學(xué)院12函數(shù)的遞歸調(diào)用目錄函數(shù)的嵌套調(diào)用目錄121函數(shù)的嵌套調(diào)用函數(shù)的遞歸調(diào)用函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用C語句不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),即在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。例5-4求

(n的值由用戶從鍵盤中輸入)編程分析:(1)數(shù)據(jù)結(jié)構(gòu)類型題目要求形式語言(C)的表達(dá)輸入數(shù)據(jù)n1個整型(int)變量:n函數(shù)的嵌套調(diào)用例5-4求

(n的值由用戶從鍵盤中輸入)編程分析:(2)算法算法流程形式語言的表達(dá)編寫函數(shù)sqr_fun計算n的平方intsqr_fun(intn)編寫函數(shù)add_fun(intn)計算n個數(shù)的平方和,其中調(diào)用函數(shù)sqr_fun計算n的平方intadd_fun(intn)編寫主函數(shù)main,從鍵盤讀入整型變量n;然后調(diào)用add_fun函數(shù),計算n個數(shù)的平方和。以scanf讀入nadd_fun(n)以printf函數(shù)輸出add_fun(n)的返回值目錄122函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用函數(shù)的嵌套調(diào)用函數(shù)的遞歸調(diào)用

C語言程序中,如果調(diào)用一個函數(shù)的過程中又直接或間接地調(diào)用了該函數(shù)本身,則稱之為遞歸調(diào)用。例5-5用遞歸方法求Fibonacci數(shù)列問題已知:11235

813213455

……在屏幕上打印出數(shù)列的前20個元素。函數(shù)的遞歸調(diào)用

C語言程序中,如果調(diào)用一個函數(shù)的過程中又直接或間接地調(diào)用了該函數(shù)本身,則稱之為遞歸調(diào)用。例5-5用遞歸方法求Fibonacci數(shù)列問題算法分析:

設(shè)n為正整數(shù),f(n)表示Fibonacci數(shù)列的第n個數(shù)當(dāng)n=1時,f(n)=1當(dāng)n=2時,f(n)=1當(dāng)n>2時,f(n)=f(n-2)+f(n-1)函數(shù)的遞歸調(diào)用遞歸問題的三個必要條件:求解問題能夠以同一方法解決,即能夠歸納出遞歸公式,例如在例5-5中“當(dāng)n>2時,f(n)=f(n-2)+f(n-1)”。遞歸中參數(shù)每次遞減,例如在例5-5中求f(20)調(diào)用f(19)、f(18)……遞歸中必須有遞歸出口,即遞歸的結(jié)束條件,例如在例5-5中f(1)=1、f(2)=1。另外,受計算機(jī)操作系統(tǒng)內(nèi)存管理限制,遞歸調(diào)用不能層次太深。函數(shù)的遞歸調(diào)用例5-6趣味程序(迷宮—迷宮地圖的生成)以深度優(yōu)先生成樹算法生成迷宮地圖,地圖中從入口到出口有且只有一條通路。編程分析:(1)以函數(shù)遞歸實現(xiàn)迷宮地圖的生成迷宮地圖的生成就是深度優(yōu)先生成樹算法的實現(xiàn),下面以函數(shù)遞歸來實現(xiàn)該算法的編寫。首先,選擇一個頂點為起始頂點將其賦值為路,例如第一個頂點Map[1,1]=0。然后,找到其相鄰頂點,任意選擇其中一個頂點,先判斷此頂點是否被遍歷過,如果未被遍歷過,則將這兩個頂點以邊相連接,并從這個鄰接頂點開始,遞歸調(diào)用函數(shù),繼續(xù)處理。直到所有頂點都被處理完畢。函數(shù)的遞歸調(diào)用例5-6趣味程序(迷宮—迷宮地圖的生成)以深度優(yōu)先生成樹算法生成迷宮地圖,地圖中從入口到出口有且只有一條通路。編程分析:(1)以函數(shù)遞歸實現(xiàn)迷宮地圖的生成最后,將邊框頂點賦值為墻,出入口只需選擇邊框中任意下標(biāo)為奇數(shù)行位置的數(shù)組元素即可,例如選Map[1,0]點為入口,Map[Height,width+1]點為出口。(2)在第四章例4-4的基礎(chǔ)上,將迷宮數(shù)據(jù)類型的初始化、迷宮的后處理、迷宮的繪制以函數(shù)來實現(xiàn),編寫相應(yīng)的函數(shù)initalizemap、finishmap和drawmap。函數(shù)的遞歸調(diào)用例5-6趣味程序(迷宮—迷宮地圖的生成)以深度優(yōu)先生成樹算法生成迷宮地圖,地圖中從入口到出口有且只有一條通路。執(zhí)行結(jié)果:函數(shù)的遞歸調(diào)用例5-6趣味程序(迷宮—迷宮地圖的生成)以深度優(yōu)先生成樹算法生成迷宮地圖,地圖中從入口到出口有且只有一條通路。結(jié)果分析:程序編寫完畢,編譯、鏈接、執(zhí)行后,發(fā)現(xiàn)設(shè)計的迷宮地圖過于簡單,如圖5-8。主要原因在于生成迷宮時,初始節(jié)點固定選擇Map[1,1],對鄰接節(jié)點的選擇也是按照固定方向選擇。算法改進(jìn):迷宮地圖的隨機(jī)生成:為使得生成的迷宮地圖復(fù)雜化,設(shè)計隨機(jī)選取初始節(jié)點以及隨機(jī)選取鄰接節(jié)點,生成的隨機(jī)迷宮地圖如圖5-9。函數(shù)的遞歸調(diào)用例5-6趣味程序(迷宮—迷宮地圖的生成)以深度優(yōu)先生成樹算法生成迷宮地圖,地圖中從入口到出口有且只有一條通路。背景知識:rand函數(shù)語法:rand(void)功能:用于產(chǎn)生一個偽隨機(jī)unsignedint整數(shù)。srand(seed)用于給rand()函數(shù)設(shè)定種子。srand和rand應(yīng)該組合使用。一般來說,srand是對rand進(jìn)行設(shè)置。注意:此函數(shù)定義在stdlib.h中函數(shù)的遞歸調(diào)用例5-6趣味程序(迷宮—迷宮地圖的生成)以深度優(yōu)先生成樹算法生成迷宮地圖,地圖中從入口到出口有且只有一條通路。背景知識:srand函數(shù)語法:voidsrand(unsignedintseed);功能:srand函數(shù)是隨機(jī)數(shù)發(fā)生器的初始化函數(shù)注意:此函數(shù)定義在stdlib.h中函數(shù)的遞歸調(diào)用例5-6趣味程序(迷宮—迷宮地圖的生成)以深度優(yōu)先生成樹算法生成迷宮地圖,地圖中從入口到出口有且只有一條通路。背景知識:time函數(shù)語法:time_ttime(time_t*t);功能:返回某一特定時間的小數(shù)值。函數(shù)TIME返回的小數(shù)值為0(零)到0.99999999之間的數(shù)值,代表從0:00:00(12:00:00AM)到23:59:59(11:59:59P.M.)之間的時間.返回值:成功則返回秒數(shù),失敗則返回((time_t)-1)值,錯誤原因存于errno中。注意:此函數(shù)定義在time.h中函數(shù)的遞歸調(diào)用例5-6趣味程序(迷宮—迷宮地圖的生成)以深度優(yōu)先生成樹算法生成迷宮地圖,地圖中從入口到出口有且只有一條通路。執(zhí)行結(jié)果:謝謝您的聆聽!Thankyou!函數(shù)的定義與調(diào)用

張競丹深圳信息職業(yè)技術(shù)學(xué)院課前準(zhǔn)備引言例5-1輸入a、b、c三個實數(shù),輸出最小值。編程分析:(1)數(shù)據(jù)結(jié)構(gòu)類型題目要求形式語言(C)的表達(dá)輸入數(shù)據(jù)三個實型變量a、b、cfloata,b,c;輸出數(shù)據(jù)三個實型變量的最小值floatmin;課前準(zhǔn)備引言例5-1輸入a、b、c三個實數(shù),輸出最小值。編程分析:(2)算法

算法流程形式語言的表達(dá)比較a和b的大小,將最小值賦值給實型變量min若a>bmin←b否則min←a比較min與c的大小,將最小值賦值給實型變量min若min>cmin←c輸出最小值以printf函數(shù)輸出min課前準(zhǔn)備引言例5-1輸入a、b、c三個實數(shù),輸出最小值。

#include<stdio.h>

voidmain()

{ floata,b,c,min; scanf("%f%f%f",&a,&b,&c); if(a<b)min=a; else

min=b; if(c<min)

min=c; printf("min=%f\n",min);

}課前準(zhǔn)備引言例5-1輸入a、b、c三個實數(shù),輸出最小值。

#include<stdio.h>floatmin(floatx,floaty){floatz;if(x<y)z=x;

elsez=y;

returnz;}voidmain(){ floata,b,c,fmin; scanf("%f%f%f",&a,&b,&c); fmin=min(a,b);

fmin=min(fmin,c); printf("min=%f\n",fmin);}23函數(shù)的概念函數(shù)的調(diào)用目錄1函數(shù)的定義目錄23函數(shù)的概念1函數(shù)的概念函數(shù)的調(diào)用1函數(shù)的定義函數(shù)的概念函數(shù)是C語言源程序的基本模塊,通過對函數(shù)模塊的調(diào)用實現(xiàn)特定的功能,函數(shù)的名字一般反映其代表的功能。用戶可把自己的算法編成一個相對獨立的函數(shù)模塊,然后以調(diào)用的方法來使用函數(shù)。

一個C語言的源程序可以由一個主函數(shù)和若干個其它函數(shù)構(gòu)成,程序的執(zhí)行從主函數(shù)(main)開始,主函數(shù)可以調(diào)用其它函數(shù),調(diào)用后返回主函數(shù),在主函數(shù)中結(jié)束整個程序的運行。主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也可以互相調(diào)用,同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次,但是任何其它函數(shù)都不可以調(diào)用主函數(shù)。函數(shù)的概念函數(shù)分類從用戶使用的角度:庫函數(shù):編譯系統(tǒng)提供的,用戶可以直接使用例如:scanf,printf,powf,sqrt等用戶自定義函數(shù)例如:floatmin(floatx,floaty)從函數(shù)的形式看:無參數(shù)函數(shù)例如:voidmain()有參數(shù)函數(shù)例如:floatmin(floatx,floaty)目錄23函數(shù)的概念2函數(shù)的定義函數(shù)的調(diào)用1函數(shù)的定義課前準(zhǔn)備函數(shù)的定義一般形式:類型名

函數(shù)名(){

函數(shù)體}例如:voidprint_star(){printf("******\n");}無參函數(shù)的定義課前準(zhǔn)備函數(shù)的定義一般形式:類型名

函數(shù)名(形式參數(shù)表列){

函數(shù)體}例如:floataddf(floatc1,floatc2){c1=c1+c2;printf("=%.2f\n",c1);returnc1;}有參函數(shù)的定義課前準(zhǔn)備函數(shù)的定義關(guān)于函數(shù)定義的說明:函數(shù)名的命名遵循標(biāo)識符命名規(guī)則,不能與同一作用域中其它標(biāo)識符重名。無參函數(shù)雖然沒有形式參數(shù),但是函數(shù)名后的一對括號不能省略。有參函數(shù)在定義函數(shù)時,形參只是一個形式上的參數(shù),沒有具體的值,也不分配內(nèi)存。只有當(dāng)其它函數(shù)調(diào)用該函數(shù)時,才會為形參分配內(nèi)存并賦予具體的值。每個形參的類型必須單獨定義,即使形參的類型相同,也不能合在一起定義,并且中間用逗號隔開。類型名是指函數(shù)值的數(shù)據(jù)類型。如果調(diào)用函數(shù)后需要得到函數(shù)返回值,則在函數(shù)體中用return語句將函數(shù)值返回,并且在函數(shù)首部的最前面給出該函數(shù)值的類型;如果不需要得到函數(shù)值,那么在函數(shù)體中不需要出現(xiàn)return語句,在函數(shù)首部的最前面將函數(shù)值的類型定義為空類型void。目錄23函數(shù)的概念3函數(shù)的調(diào)用函數(shù)的調(diào)用1函數(shù)的定義課前準(zhǔn)備函數(shù)的調(diào)用一般形式:函數(shù)名();例如:print_star();有參函數(shù)的調(diào)用一般形式:函數(shù)名(實參表列);例如:

count1=addf(count1,count2);無參函數(shù)的調(diào)用課前準(zhǔn)備函數(shù)的調(diào)用關(guān)于形參與實參的說明:在被定義的函數(shù)中必須指定形參的類型。形參在函數(shù)定義時并不占內(nèi)存中的存儲單元,只有在函數(shù)調(diào)用時形參才被分配內(nèi)存單元;調(diào)用結(jié)束后形參所占的內(nèi)存單元會被釋放。實參可以是常量、變量或表達(dá)式實參與形參的類型應(yīng)相同或兼容。C語言規(guī)定,實參變量對形參變量的數(shù)據(jù)傳遞是單向的,只能將實參的數(shù)值傳遞給形參,形參的改變是不會影響實參的數(shù)值;在內(nèi)存中,實參單元與形參單元是不同的。課前準(zhǔn)備函數(shù)的調(diào)用對被調(diào)用函數(shù)的聲明和

溫馨提示

  • 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

提交評論