




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章模塊化程序設(shè)計第一頁,共80頁。教學(xué)目標(biāo)理解如何用函數(shù)構(gòu)造程序模塊會聲明、定義和調(diào)用函數(shù)并理解函數(shù)調(diào)用的機(jī)制掌握變量的作用域和存儲類別2第二頁,共80頁。4.1模塊化程序設(shè)計概述
4.2函數(shù)的聲明、定義和調(diào)用
4.3函數(shù)的多級調(diào)用
4.4變量的作用域和存儲類別
4.5計算機(jī)隨機(jī)模擬方法(不要求)4.6編譯預(yù)處理
3第三頁,共80頁。復(fù)雜任務(wù)可以分解為若干子任務(wù)。重復(fù)使用的程序段,將其進(jìn)行獨(dú)立設(shè)計,使計算機(jī)可以重復(fù)執(zhí)行。程序執(zhí)行從主控程序開始、也從主控程序結(jié)束。分段設(shè)計的出發(fā)點(diǎn)在于一個程序模塊對于某個問題的解決應(yīng)保持相對的完整性。main()func1()func2()func3()func4()func5()func6()圖4-1程序模塊結(jié)構(gòu)圖4.1
模塊化程序設(shè)計概述4第四頁,共80頁。源文件1函數(shù)n函數(shù)2函數(shù)1源文件m源文件2函數(shù)是C語言的基本構(gòu)件一個C程序
一個C程序的源文件............5第五頁,共80頁。4.2函數(shù)的聲明、定義和調(diào)用引例函數(shù)說明函數(shù)定義函數(shù)調(diào)用及參數(shù)的傳遞帶自定義函數(shù)的程序設(shè)計6第六頁,共80頁。引例
/*程序名:4_1.cpp*//*功能:計算兩個實(shí)數(shù)中大的值*/#include<stdio.h>floatfmax(floatx,floaty);
/*函數(shù)說明*/voidmain(){floata,b,c;scanf("%f,%f",&a,&b);c=fmax(a,b);/*函數(shù)調(diào)用*/printf("max=%f\n",c);}floatfmax(floatx,floaty)
/*函數(shù)定義*/{floatz;z=x>y?x:y;returnz;}7第七頁,共80頁。函數(shù)定義
函數(shù)定義的一般形式:函數(shù)返回值類型函數(shù)名(類型名形參1,類型名形參2,…)/*函數(shù)頭*/{ /*函數(shù)體*/
函數(shù)實(shí)現(xiàn)過程}例如floatfmax(floatx,floaty){floatz;z=x>y?x:y;
returnz;}不能省略必為變量結(jié)束本函數(shù)的執(zhí)行并返回函數(shù)值此處不能有分號可以沒有參數(shù)8第八頁,共80頁。函數(shù)定義的幾點(diǎn)說明在定義函數(shù)時不指定函數(shù)返回值類型,系統(tǒng)會隱含指定函數(shù)返回值類型為int型。一個函數(shù)可有多個return語句。一個return語句只能返回一個值。如果被調(diào)函數(shù)中沒有return語句,函數(shù)并不是不帶回值。對不返回值的函數(shù),要使用關(guān)鍵字void,但可以在函數(shù)體中使用return;。即使函數(shù)沒有參數(shù),其名后的括弧也不能省。函數(shù)頭與函數(shù)說明不同,函數(shù)頭不是一條語句。9第九頁,共80頁。函數(shù)說明(函數(shù)原型)
說明格式為:
函數(shù)返回值類型函數(shù)名(參數(shù)表);
#include<stdio.h>floatfmax(floatx
,floaty);
/*函數(shù)說明*/voidmain(){floata,b,c;scanf("%f,%f",&a,&b);
c=fmax(a,b);printf("max=%f\n",c);}
函數(shù)說明是一條語句,它指出函數(shù)返回值的類型、函數(shù)的名稱、函數(shù)要接收的參數(shù)的個數(shù)、順序和類型。如果在一個函數(shù)中要調(diào)用另外一個函數(shù),則在調(diào)用之前要對該函數(shù)進(jìn)行說明。如果函數(shù)定義出現(xiàn)在程序中首次使用該函數(shù)之前,則不需要說明函數(shù)原型??墒÷员仨氂蟹痔?0第十頁,共80頁。函數(shù)調(diào)用及參數(shù)的傳遞
函數(shù)調(diào)用的一般形式為:
函數(shù)名(實(shí)參表)
voidmain(){floata,b,c;scanf("%f,%f",&a,&b);
c=fmax(a,b);printf("max=%f\n",c);}可用兩種方式調(diào)用函數(shù):(1)
函數(shù)的調(diào)用可以作為表達(dá)式出現(xiàn)在允許表達(dá)式出現(xiàn)的任何地方。如:c=fmax(a,b)+3;(2)函數(shù)調(diào)用可以作為一條獨(dú)立的語句。比如,有函數(shù)定義:voidprintstar(){printf(“***************”);}則可以把該函數(shù)調(diào)用作為一個獨(dú)立語句。
printstar();printf(“max=%f\n”,fmax(a,b));可為常量,變量或表達(dá)式11第十一頁,共80頁。函數(shù)返回值
(函數(shù)值)
函數(shù)返回值的類型是由函數(shù)說明中的函數(shù)返回類型決定的。如果返回的類型與函數(shù)說明的不同,則在返回值時,先作隱含的類型轉(zhuǎn)換,然后再返回。#include<stdio.h>intfmax(floatx,floaty){returnx>y?x:y;}voidmain(){intmax;floata=3.5,b=2.6;
max=fmax(a,b);
printf("max=%d\n",max);}max=3floatreturn(x>y?x:y);12第十二頁,共80頁。形參和實(shí)參
形式參數(shù):定義函數(shù)時放在函數(shù)名稱之后括號中的參數(shù),簡稱形參。形參必須是變量。實(shí)際參數(shù):調(diào)用函數(shù)時括號中的參數(shù),簡稱實(shí)參。實(shí)參可為常量、變量或表達(dá)式。形參與實(shí)參的結(jié)合:函數(shù)調(diào)用時,將生成實(shí)參值的一個副本傳遞給對應(yīng)的形參,這個過程稱為形參與實(shí)參的結(jié)合。只允許實(shí)參向形參傳遞數(shù)據(jù),則稱為“單向傳遞”。圖4-2實(shí)參和形參數(shù)據(jù)的傳遞3.53.52.62.6實(shí)參a實(shí)參b形參x形參y實(shí)參與形參必須一一對應(yīng),數(shù)量相同且類型一致13第十三頁,共80頁。函數(shù)的調(diào)用過程
#include<stdio.h>floatfmax(float,float);voidmain(){floata,b,c;scanf(“%f,%f”,&a,&b);
c=fmax(a,b);printf(“max=%f\n”,c);}floatfmax(floatx,floaty)
{floatz;z=x>y?x:y;returnz;}保存返回地址及當(dāng)前現(xiàn)場,為形參分配內(nèi)存并將實(shí)參值的副本傳給形參變量恢復(fù)main函數(shù)的現(xiàn)場,取得返回地址和返回值14第十四頁,共80頁。帶自定義函數(shù)的程序設(shè)計
程序設(shè)計思路:(1)定義一個函數(shù)isprime(inta)判斷a是否為素數(shù),若是素數(shù),函數(shù)返回1,否則返回0。#include<stdio.h>#include<math.h>intisprime(inta)//函數(shù)定義{inti;if(a==1)return0;for(i=2;i<=sqrt(a);i++)if(a%i==0)
return0;
return1;}(2)在主函數(shù)中輸入一個整數(shù),調(diào)用isprime函數(shù),如果函數(shù)值為1,則打印是素數(shù),否則打印不是素數(shù)。voidmain(){intiNumber;printf("請輸入一個整數(shù):");scanf("%d",&iNumber);if(isprime(iNumber))//函數(shù)調(diào)用
printf("%d是素數(shù)\n",iNumber);elseprintf("%d不是素數(shù)\n",iNumber);}【例4-2】從鍵盤輸入一個整數(shù),判斷該整數(shù)是否為素數(shù)。15第十五頁,共80頁。例題輸入圓柱的高和半徑,求圓柱體積,
volume=×r2×h。 要求定義和調(diào)用cylinder(r,h)計算圓柱體的體積。16第十六頁,共80頁。/*計算圓柱體積*/#include<stdio.h>voidmain(){doubleheight,radius,volume; doublecylinder(doubler,doubleh);/*函數(shù)聲明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); /*調(diào)用函數(shù),返回值賦給volume*/
volume=cylinder(radius,height); printf("Volume=%.3f\n",volume);}/*定義求圓柱體積的函數(shù)*/doublecylinder(doubler,doubleh) { doubleresult; result=3.1415926*r*r*h;/*計算體積*/ returnresult; /*返回結(jié)果*/}17第十七頁,共80頁。例題輸出5之內(nèi)的數(shù)字金字塔。
12233344445555518第十八頁,共80頁。/*輸出數(shù)字金字塔*/#include<stdio.h>voidmain(){
voidpyramid(intn); /*函數(shù)聲明*/
pyramid(5); /*調(diào)用函數(shù),輸出數(shù)字金字塔*/}voidpyramid(intn) /*函數(shù)定義*/{ inti,j; for(i=1;i<=n;i++)/*需要輸出的行數(shù)*/{ for(j=1;j<=n-i;j++) /*輸出每行左邊的空格*/ printf(""); for(j=1;j<=i;j++) /*輸出每行的數(shù)字*/ printf("%d",i); /*每個數(shù)字的后各有一個空格*/
putchar('\n');
}}19第十九頁,共80頁。例題
輸入精度e,使用格里高利公式求π的近似值,精確到最后一項的絕對值小于e。要求定義和調(diào)用函數(shù)funpi(e)求π的近似值。20第二十頁,共80頁。/*用格里高利公式計算π的近似值,精度為e*/#include<stdio.h>#include<math.h>voidmain(){ doublee,pi;
doublefunpi(doublee); printf("Entere:"); scanf("%lf",&e);
pi=funpi(e); printf("pi=%.4f\n",pi); }doublefunpi(doublee){ intdenominator,flag;doubleitem,sum;
flag=1; denominator=1;
item=1.0; sum=0;while(fabs(item)>=e){ item=flag*1.0/denominator;sum=sum+item;flag=-flag; denominator=denominator+2;} returnsum*4;}21第二十一頁,共80頁。4.3函數(shù)的多級調(diào)用函數(shù)的嵌套調(diào)用函數(shù)的遞歸調(diào)用遞歸與遞推22第二十二頁,共80頁。引例
設(shè)計一個常用圓形體體積的計算器,采用命令方式輸入1、2、3,分別選擇計算球體、圓柱體、圓錐體的體積,并輸入計算所需相應(yīng)參數(shù)。23第二十三頁,共80頁。#include<stdio.h>#definePI3.141592654voidcal(intsel);voidmain(){intsel;
while(1)
{printf("1-計算球體體積\n"); printf("2-計算圓柱體積\n"); printf("3-計算圓錐體積\n"); printf("其他-退出程序運(yùn)行\(zhòng)n"); printf("請輸入計算命令:"); scanf("%d",&sel); if(sel<1||sel>3)
break; /*輸入非1~3,循環(huán)結(jié)束*/ else
cal(sel); /*輸入1~3,調(diào)用cal()*/
}}24第二十四頁,共80頁。/*常用圓形體體積計算器的主控函數(shù)*/voidcal(intsel){doublevol_ball();doublevol_cylind();doublevol_cone();switch(sel){ case1: printf("球體積為:%.2f\n",vol_ball()); break;case2: printf("圓柱體積為:%.2f\n",vol_cylind()); break;case3: printf("圓錐體積為:%.2f\n",vol_cone()); break; }}25第二十五頁,共80頁。/*計算球體體積V=4/3*PI*r*r*r*/doublevol_ball(){doubler;printf("請輸入球的半徑");scanf("%lf",&r);return(4.0/3.0*PI*r*r*r);}/*計算圓柱體積V=PI*r*r*h*/doublevol_cylind(){doubler,h;printf("請輸入圓柱的底圓半徑和高:");scanf("%lf%lf",&r,&h);return(PI*r*r*h);}/*計算圓錐體積V=h/3*PI*r*r*/doublevol_cone(){doubler,h;printf("請輸入圓錐的底圓半徑和高:");scanf("%lf%lf",&r,&h);return(PI*r*r*h/3.0);}26第二十六頁,共80頁。嵌套調(diào)用
main函數(shù){……x=root(x1,x2);……}root函數(shù){……x=xpoint(x1,x2);……}xpoint函數(shù){……return(x1*f(x2)-x2*f(x1))/(f(x2)–f(x1));……}f函數(shù){……}圖4-5函數(shù)調(diào)用關(guān)系示意圖C語言不允許嵌套定義函數(shù),但允許嵌套調(diào)用函數(shù)。除了主函數(shù)外,其它函數(shù)可以相互調(diào)用。27第二十七頁,共80頁。遞歸調(diào)用
遞歸調(diào)用指的是一個函數(shù)執(zhí)行過程中出現(xiàn)了直接或間接調(diào)用函數(shù)本身的調(diào)用方式。如果直接調(diào)用函數(shù)本身稱為直接遞歸;如果調(diào)用了另外一個函數(shù),那個函數(shù)又調(diào)用該函數(shù),則稱為間接遞歸。遞歸方法的基本思想是將一個問題向下分解具有同樣解決方法但規(guī)模不斷縮小的子問題,不斷進(jìn)行這樣的分解,直到分解的子問題有一個已知解。28第二十八頁,共80頁。
例如:有4個人坐在一起,問第4個人多少歲?他說比第3個人大2歲。問第3個人多少歲?他說比第2個人大2歲。問第2個人多少歲?他說比第1個人大2歲。最后問第1個人,他說他10歲。請問第4個人多大。29第二十九頁,共80頁。分析:age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10可以用數(shù)學(xué)公式表示為:
age(n-1)+2(1<n≤4)age(n)=10(n=1)30第三十頁,共80頁。age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16求第4個人年齡的過程如下圖第一階段“回推”,第二階段“遞推”遞歸過程結(jié)束條件31第三十一頁,共80頁??梢钥闯?,當(dāng)n>1時,求第n個人的年齡的公式是相同的。因此可以編寫一個函數(shù)來表示上述關(guān)系。32第三十二頁,共80頁。#include<stdio.h>intage(intn){ intc; if(n==1) c=10;
else
c=age(n-1)+2;
returnc;}voidmain(){ printf("%d\n",age(4));}其中:age函數(shù)共被調(diào)用4次,即age(4),age(3),age(2),age(1)33第三十三頁,共80頁。age(4)mainc=age(3)+2age函數(shù)n=4c=age(2)+2age函數(shù)n=3c=age(1)+2age函數(shù)n=2c=10age函數(shù)n=1age(2)=12age(3)=14age(4)=16輸出age(4)age(1)=1034第三十四頁,共80頁。#include<stdio.h>floatfac(intn){ floatf; if(n==1) f=1; else f=n*fac(n-1);
returnf; }voidmain(){ intn; floaty; printf("inputanintergernumber:"); scanf("%d",&n); if(n>0) { y=fac(n); printf("%d!=%10.0f\n",n,y); } else printf("n<=0,dataerror!\n");}用遞歸的方法求n!35第三十五頁,共80頁。遞歸的條件
設(shè)計一個函數(shù)來實(shí)現(xiàn)遞歸算法,這個函數(shù)必須不斷使用下一級值調(diào)用自己,但不能無限地調(diào)用下去,最終應(yīng)能終止遞歸。因此遞歸函數(shù)一般必須滿足下列條件:必須有完成函數(shù)任務(wù)的語句(return語句);必須有一個確定是否能終止遞歸調(diào)用的語句;必須有一個遞歸調(diào)用語句。36第三十六頁,共80頁。遞歸與遞推
大多數(shù)遞歸問題都可以轉(zhuǎn)化為遞推求解,遞歸調(diào)用使用選擇結(jié)構(gòu),而遞推調(diào)用使用循環(huán)結(jié)構(gòu)。
37第三十七頁,共80頁。intage(intn){ intc=10,i=1;
while(i<n) { i++; c=c+2; } returnc;}intage(intn){ intc; if(n==1) c=10; else c=age(n-1)+2; returnc;}遞歸遞推38第三十八頁,共80頁。遞歸的優(yōu)點(diǎn):使用遞歸能夠更自然地反映解決問題的過程,符合人的思維習(xí)慣,易于理解和調(diào)試程序,簡化程序,便于閱讀遞歸的缺點(diǎn):大量的遞歸調(diào)用會占用處理器很多時間和大量的內(nèi)存遞推的優(yōu)點(diǎn):效率高遞推的缺點(diǎn):比較難編程,可讀性較差39第三十九頁,共80頁。4.4變量的作用域和存儲類別程序在內(nèi)存中的分布區(qū)域局部變量及存儲類別全局變量及存儲類別40第四十頁,共80頁。引例用函數(shù)實(shí)現(xiàn)財務(wù)現(xiàn)金記賬。先輸入操作類型(1--收入;2--支出;0--結(jié)束),再輸入操作金額,計算現(xiàn)金剩余額,經(jīng)多次操作直到操作類型為0時結(jié)束。要求定義并調(diào)用函數(shù),其中現(xiàn)金收入與現(xiàn)金支出分別用不同函數(shù)實(shí)現(xiàn)。41第四十一頁,共80頁。#include<stdio.h>floatcash;intmain(void){ voidincome(floatnumber),expend(floatnumber); intchoice; floatvalue;
cash=0; printf("Enteroperatechoice(0--end,1--income,2--expend):"); scanf("%d",&choice); while(choice!=0) { if(choice==1||choice==2) { printf("Entercashvalue:"); scanf("%f",&value); if(choice==1)
income(value); else
expend(value); printf("Currentcash:%.2f\n",cash); } printf("Enteroperatechoice(0--end,1--income,2--expend):"); scanf("%d",&choice); } return0;}voidincome(floatnumber){ cash=cash+number;}voidexpend(floatnumber){ cash=cash-number;}42第四十二頁,共80頁。從變量占用空間的角度(作用范圍)來分析問題,劃分出全局變量和局部變量,這是變量的作用域問題。從變量值存在的時間角度(生存周期)來分析問題,劃分出變量的靜態(tài)存儲和動態(tài)存儲,這是變量的存儲類別問題。43第四十三頁,共80頁。(1)程序區(qū):存放用戶程序代碼,即程序中各個函數(shù)的代碼。(2)靜態(tài)存儲區(qū):存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)。分配在靜態(tài)存儲區(qū)中的變量的生命期最長,它們在main函數(shù)運(yùn)行之前就存在了,在程序的整個活動期(從程序開始執(zhí)行到執(zhí)行結(jié)束)中,這些變量始終占用靜態(tài)存儲區(qū)中對應(yīng)的存儲空間,即程序開始執(zhí)行時分配存儲單元,程序執(zhí)行完畢后釋放。(3)動態(tài)存儲區(qū):存放局部變量。分配在動態(tài)存儲區(qū)中的變量只有在所定義的函數(shù)被調(diào)用時才分配存儲單元,函數(shù)結(jié)束時就釋放。系統(tǒng)對函數(shù)調(diào)用時的現(xiàn)場保護(hù)、返回地址等也占用動態(tài)存儲區(qū)。程序在內(nèi)存中的分布區(qū)域
44第四十四頁,共80頁。局部變量:在一個函數(shù)內(nèi)定義的變量。局部變量作用域:塊內(nèi)定義、塊內(nèi)使用。所謂塊內(nèi)是指一對以{}為界限的若干個語句,例如函數(shù)體、復(fù)合語句。塊內(nèi)使用是指變量的作用范圍僅僅局限在從變量定義處開始、到變量定義所在的那個塊結(jié)束。如:voidmain(){intn;/*……*/}voidfunc(){intn;/*……*/}局部變量及存儲類別
main的局部變量func的局部變量45第四十五頁,共80頁。形式參數(shù)也為局部變量,其作用范圍是形式參數(shù)所在的整個函數(shù)。例如:voidmain(){printf("%d,%d",x,y);
……}voidfunc(intx,inty){
……}在main函數(shù)中不能使用在func函數(shù)中定義的局部變量46第四十六頁,共80頁。在復(fù)合語句中定義局部變量。#include<stdio.h>voidmain(){int a;a=1;
{ /*復(fù)合語句開始*/intb=2;b=a+b;a=a+b;
}
/*復(fù)合語句結(jié)束*/ printf("%d",a);}b:小范圍內(nèi)的臨時變量
47第四十七頁,共80頁。局部變量的存儲類別:自動變量:用關(guān)鍵字auto(可缺省)
加以說明的局部變量。如:autofloatb;或floatb;
特點(diǎn):是短生命期的局部變量,安排在動態(tài)存儲區(qū),由系統(tǒng)自動分配和釋放,用到時分配內(nèi)存,不用時釋放內(nèi)存,以節(jié)省程序執(zhí)行時的內(nèi)存資源。局部靜態(tài)變量:用關(guān)鍵字static
加以說明的局部變量。如:
staticintcount;
特點(diǎn):是長生命期的局部變量。函數(shù)執(zhí)行結(jié)束后,分配給該變量的存儲區(qū)不釋放。局部靜態(tài)變量安排在靜態(tài)存儲區(qū)。寄存器變量:關(guān)鍵字register說明的局部變量為寄存器變量。特點(diǎn):寄存器變量的值存放在CPU的寄存器中,可以提高程序的執(zhí)行效率。如registerinti;48第四十八頁,共80頁。局部靜態(tài)變量說明:
如
staticintcount局部靜態(tài)變量屬于靜態(tài)存儲類別;局部靜態(tài)變量是在編譯時賦初值的,即只賦初值一次;局部靜態(tài)變量不賦初值,編譯時自動賦初值0;局部靜態(tài)變量在函數(shù)調(diào)用結(jié)束仍存在,但其他函數(shù)不能引用它。形參不能是局部靜態(tài)變量。寄存器變量說明:如
registerinti;只有局部自動變量和形式參數(shù)可以作為寄存器變量,其它(如全局變量)不行。一個計算機(jī)系統(tǒng)中的寄存器數(shù)目有限,不能定義太多寄存器變量;局部靜態(tài)變量不能定義為寄存器變量。如:
registerstaticinta,b;//error49第四十九頁,共80頁?!纠?-10】局部變量存儲方式舉例,分析下面程序運(yùn)行結(jié)果:/*程序名:4_10.cpp*//*功能:局部變量存儲方式示例*/#include<stdio.h>intfun1(int);intfun2(int);voidmain(){inti;for(i=2;i<5;i++)printf("%d\t",fun1(i));printf("\n");for(i=2;i<5;i++)printf("%d\t",fun2(i));printf("\n");}intfun1(intx){
intf=1;return(f*=x);}intfun2(intx){
staticintf=1;return(f*=x);}2342624staticintf;f=1;23423450第五十頁,共80頁。全局變量:在所有函數(shù)外定義的變量。全局變量作用域:從變量定義處開始到所定義的源文件結(jié)束處,即從全局變量定義所在處開始到源文件結(jié)束處之間的所有函數(shù)都可以訪問該變量。如:intn=1;voidmain(){/*……*/}floatm;voidfunc(){/*……*/}全局變量及存儲類別
51第五十一頁,共80頁。全局變量定義#include"stdio.h"intx; /*定義全局變量x*/intf(){
intx=4;/*x為局部變量*/returnx;}voidmain(){
inta=1;
x=a; /*對全局變量x賦值*/a=f(); /*a的值為4*/{
intb=2; b=a+b; /*b的值為4*/
x=x+b; /*全局變量運(yùn)算*/}printf("%d%d",a,x);}若局部變量與全局變量同名,局部變量優(yōu)先52第五十二頁,共80頁?!纠?-11】全局變量的作用域舉例,分析下面程序運(yùn)行結(jié)果。#include<stdio.h>voids);
inta,b;
voidmain(){scanf("%d,%d",&a,&b);printf("交換前的a和b是%d,%d\n",a,b);
swap();printf("交換后的a和b是%d,%d\n",a,b);}voidswap(){intt;
t=a;a=b;b=t;}53第五十三頁,共80頁。不要濫用全局變量使用全局變量會帶來如下問題:程序的清晰度降低函數(shù)的靈活性、通用性降低存儲空間的利用率降低54第五十四頁,共80頁。局部變量與全局變量同名時:小范圍優(yōu)先【例4-12】分析下面程序運(yùn)行結(jié)果:#include<stdio.h>inti=1;/*變量i定義在所有函數(shù)之外,屬于全局變量*/inttest();voidmain(){printf("主函數(shù)中i:%d其地址%p\n",i,&i);i=test()+1;printf("主函數(shù)中i:%d其地址%p\n",i,&i);}inttest(){inti;printf("test中i:%d其地址%p\n",i,&i);i=2;printf("test中i:%d其地址%p\n",i,&i);return(i);}55第五十五頁,共80頁。全局變量的存儲類別:(靜態(tài)存儲)靜態(tài)全局變量:使用關(guān)鍵字static定義的全局變量。特點(diǎn):只能被其定義所在的源文件中的函數(shù)訪問,同一程序的其它源文件中的函數(shù)都不能訪問該變量。非靜態(tài)全局變量:也稱為外部變量,不使用任何關(guān)鍵字。特點(diǎn):該變量不僅能被定義所在的源文件中的函數(shù)訪問,而且組成程序的其它源文件中的函數(shù)也都能訪問該變量。因此,從作用范圍看,外部變量的作用域要比使用關(guān)鍵字static的靜態(tài)全局變量的大。關(guān)鍵字extern
的作用關(guān)鍵字extern的作用是對要使用的某個尚未定義的全局變量在使用前作變量說明,該全局變量或者是以后會在該源文件中定義的全局變量,或者是在另一個源文件中定義的非靜態(tài)全局變量。56第五十六頁,共80頁。/*程序名:a.cpp*//*功能:全局變量存儲方式示例*/#include<stdio.h>externinta;/*對c.cpp中定義的變量進(jìn)行說明*/voidfun1();voidfun2();voidmain(){fun1();fun2();printf("函數(shù)main中的a是%d\n",a);}【例4-13】全局變量存儲方式舉例,分析下面程序運(yùn)行結(jié)果:57第五十七頁,共80頁。/*程序名:c.cpp*/#include<stdio.h>inta;
/*允許其它文件中函數(shù)訪問的全局變量*/voidfun2(){a=4;printf("函數(shù)fun2中的a是%d\n",a);}/*程序名:b.cpp*/#include<stdio.h>staticinta;/*只允許文件b.cpp中函數(shù)訪問的全局變量*/voidfun1(){a=2;printf("函數(shù)fun1中的a是%d\n",a);}58第五十八頁,共80頁。函數(shù)與程序文件模塊如果一個程序包含多個文件模塊,要實(shí)現(xiàn)在一個文件模塊A中調(diào)用另一個文件模塊B中的函數(shù)時,就要在文件模塊A中對函數(shù)進(jìn)行外部聲明。聲明格式為:
extern函數(shù)類型函數(shù)名(參數(shù)表說明);C語言也允許把函數(shù)定義成靜態(tài)的,以便把函數(shù)的使用范圍限制在文件模塊內(nèi)。即使其他文件模塊有同名的函數(shù)定義,相互也沒有任何關(guān)聯(lián),增強(qiáng)了文件模塊的獨(dú)立性。
static函數(shù)類型函數(shù)名(參數(shù)表說明);extern可省略59第五十九頁,共80頁。4.5計算機(jī)隨機(jī)模擬方法偽隨機(jī)數(shù)的產(chǎn)生蒙特卡羅方法(不要求)60第六十頁,共80頁。rand()函數(shù)可隨機(jī)生成0~RAND_MAX之間的一個整數(shù)。RAND_MAX是頭文件<stdlib.h>中定義的一個符號常量。ANSI規(guī)定RAND_MAX的值不小于32767。根據(jù)下面公式可以得到所需范圍內(nèi)的隨機(jī)數(shù):
n=a+rand()%b
其中a為位移,是所需連續(xù)整數(shù)范圍的第一個數(shù),b是比例因子,是所需連續(xù)整數(shù)范圍的寬度,則希望產(chǎn)生1~6之間隨機(jī)數(shù)的公式為:
face=1+rand()%6偽隨機(jī)數(shù)的產(chǎn)生
61第六十一頁,共80頁?!纠?-14】編寫一個模擬投擲硬幣的程序,模擬20次,統(tǒng)計出正面出現(xiàn)的次數(shù)。#include<stdio.h>#include<stdlib.h>voidmain(){ inti,face,iCount=0; for(i=1;i<=20;i++) { face=0+rand()%2; printf("%5d",face); if(i%10==0)printf("\n"); if(face)iCount++; } printf("正面出現(xiàn)次數(shù):%d次\n",iCount);}62第六十二頁,共80頁。運(yùn)行程序,結(jié)果為:11001000001111111010正面出現(xiàn)次數(shù):11次再次運(yùn)行該程序結(jié)果為:11001000001111111010正面出現(xiàn)次數(shù):11次用函數(shù)void
srand(
unsigned
int
seed
),通過提供不同的種子產(chǎn)生不同的隨機(jī)數(shù)序列。63第六十三頁,共80頁。用srand()函數(shù)進(jìn)行隨機(jī)化#include<stdio.h>#include<stdlib.h>voidmain(){ unsignedseed; printf("輸入一個非負(fù)整數(shù)做種子:"); scanf("%d",&seed); srand(seed); for(inti=1;i<=10;i++) printf("%3d",1+rand()%6);}運(yùn)行3次程序:輸入一個非負(fù)整數(shù)做種子:161343565262輸入一個非負(fù)整數(shù)做種子:333153565415輸入一個非負(fù)整數(shù)做種子:16134356526264第六十四頁,共80頁。使用系統(tǒng)定時/計數(shù)器的值做為隨機(jī)種子:
srand(time(NULL));time()函數(shù)返回以秒為單位的當(dāng)前時間值,因?yàn)橛袝r鐘參數(shù),而時間始終在變,隨機(jī)數(shù)序列就不會固定不變了?!纠?-16】編寫程序,用來生成一個隨機(jī)小寫字符串。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>voidmain(){srand(time(NULL)); for(inti=1;i<=20;i++) printf("%c",97+rand()%26); printf("\n");}65第六十五頁,共80頁。4.6編譯預(yù)處理文件包含#include宏定義#define條件編譯#if66第六十六頁,共80頁?!拔募笔侵敢粋€源文件可以將另一個源文件的全部內(nèi)容包含進(jìn)來。在編譯預(yù)處理時#include指令讓預(yù)處理器用指定文件內(nèi)容替換該語句,然后作為一個源文件編譯形成新文件。文件包含的一般形式為:(1)#include<文件名>(2)#include"文件名"例如:#include<stdio.h>(只查C語言的系統(tǒng)目錄)#include“stdio.h”(首先查當(dāng)前目錄)文件包含#include67第六十七頁,共80頁。(1)定義符號常量
#define標(biāo)識符
字符串如:#definePI3.14預(yù)處理器將在源文件中搜索PI,并把每個PI替換成3.14。完成搜索和操作替換后,預(yù)處理器刪除#define行。(2)定義宏
#define宏名(參數(shù)表)
字符串如:#defineS(a,b)a*b對程序中帶有實(shí)參的宏(如S(3,4)),按#define命令中指定的字符串從左到右進(jìn)行替換。如果字符串中包含宏的形參(如a,b),則將程序語句中相應(yīng)的實(shí)參代替形參,如果宏定義中字符串中的字符不是參數(shù)字符(如a*b中的*)則原樣保留。宏定義#define宏名中間不能有空格68第六十八頁,共80頁。宏的用途符號常量簡單的函數(shù)功能實(shí)現(xiàn)如:#defineMAX(a,b)(a)>(b)?(a):(b)為程序書寫帶來一些方便如:#defineSINA""C語言允許宏嵌套定義如:#definePI3.14159#defineSPI*r*r#include<stdio.h>voidmain(){ intr=2; printf("%f\n",S);}69第六十九頁,共80頁。宏的范圍宏可以寫在程序中的任何位置,它的作用范圍從定義書寫處到該文件尾,在此范圍內(nèi)都可以用宏名進(jìn)行替換,并可以通過#undef強(qiáng)制指定的宏的結(jié)束范圍.#include<stdio.h>#defineA"Thisisthefirstmacro"voidf1(){printf("A\n");}#defineB"Thisisthesecondmacro"
voidf2(){printf(B); }#undefBvoidmain(){f1();f2();printf("\n");}70第七十頁,共80頁。帶參數(shù)宏例1:#include<stdio.h>#defineSQR(n)(n)*(n)voidmain(){ intiNumb
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新能源汽車租賃服務(wù)合同細(xì)則
- 智能化系統(tǒng)集成設(shè)計合同樣本
- 財產(chǎn)繼承信托合同
- 簡短版項目合作投資合同范本
- 建筑裝飾裝修工程分包合同模板
- 新能源開發(fā)合作框架:光伏發(fā)電項目合作合同
- 2025年中國計算機(jī)數(shù)控機(jī)床行業(yè)市場供需預(yù)測研究報告
- 血液制品供應(yīng)合同書
- 南方區(qū)域經(jīng)銷代理合同
- 電子商務(wù)領(lǐng)域:跨境物流協(xié)作協(xié)議
- 文言文常用實(shí)詞簡表翻譯
- 《弘揚(yáng)優(yōu)秀家風(fēng)》完美課件
- 蘇教版六年級數(shù)學(xué)下冊《圓柱的體積》評課稿
- 小學(xué)生計算錯誤糾正策略論文
- 【高中生物】基因工程的基本操作程序課件 2022-2023學(xué)年高二下學(xué)期生物人教版選擇性必修3
- 太平猴魁的制作工藝
- 天策科技50t年高性能瀝青基碳纖維產(chǎn)業(yè)化項目環(huán)境影響報告書
- 云貴高原和四川盆地
- 2021張桂梅先進(jìn)事跡ppt
- JJF 1169-2007汽車制動操縱力計校準(zhǔn)規(guī)范
- GB/T 37136-2018電力用戶供配電設(shè)施運(yùn)行維護(hù)規(guī)范
評論
0/150
提交評論