版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1,第4章 模塊化程序設(shè)計(jì),2,教學(xué)目標(biāo),理解如何用函數(shù)模塊構(gòu)造程序 熟悉標(biāo)準(zhǔn)庫(kù)中常見(jiàn)的函數(shù) 會(huì)定義和調(diào)用函數(shù)并理解函數(shù)調(diào)用的機(jī)制 掌握變量的作用域和存儲(chǔ)類別 理解并運(yùn)用遞歸函數(shù)編寫(xiě)程序。,3,4.1 模塊化程序設(shè)計(jì)概述 4.2 函數(shù)的聲明、定義和調(diào)用 4.3 函數(shù)的多級(jí)調(diào)用 4.4 變量的作用域和存儲(chǔ)類別 4.5 計(jì)算機(jī)隨機(jī)模擬方法 4.6 編譯預(yù)處理,4,復(fù)雜任務(wù)可以分解為若干子任務(wù)。 重復(fù)使用的程序段,將其進(jìn)行獨(dú)立設(shè)計(jì),使計(jì)算機(jī)可以重復(fù)執(zhí)行。,4.1 模塊化程序設(shè)計(jì)概述,5,1. 引例,4.2 函數(shù)的聲明、定義和調(diào)用,/*程序名:4_1.cpp*/ /*功能:計(jì)算兩個(gè)實(shí)數(shù)中大的值*/ #
2、include float fmax(float x , float y); /*函數(shù)說(shuō)明*/ void main() float a , b , c; scanf( “%f,%f”, ,float fmax(float x , float y) /*函數(shù)定義*/ float z; z = x y ? x : y; return z; ,6,2.函數(shù)說(shuō)明,說(shuō)明格式為: 函數(shù)返回值類型 函數(shù)名(參數(shù)表);,#include float fmax(float x , float y); /*函數(shù)說(shuō)明*/ void main() float a , b , c; scanf( “%f,%f”, ,函
3、數(shù)說(shuō)明是一條語(yǔ)句,它指出函數(shù)返回值的類型、函數(shù)的名稱、函數(shù)要接收的參數(shù)的個(gè)數(shù)、順序和類型。 如果在一個(gè)函數(shù)中要調(diào)用另外一個(gè)函數(shù),則在調(diào)用之前要對(duì)該函數(shù)進(jìn)行說(shuō)明。,4.2 函數(shù)的聲明、定義和調(diào)用,7,3.函數(shù)定義,函數(shù)定義的一般形式: 函數(shù)值類型 函數(shù)名(形參表) /*函數(shù)頭*/ /*函數(shù)體*/ 說(shuō)明部分 執(zhí)行部分 ,4.2 函數(shù)的聲明、定義和調(diào)用,float fmax(float x , float y) float z; z = x y ? x : y; return z; ,函數(shù)頭,函數(shù)體,8,4.函數(shù)調(diào)用,函數(shù)調(diào)用的一般形式為: 函數(shù)名(實(shí)參表);,4.2 函數(shù)的聲明、定義和調(diào)用,voi
4、d main() float a , b , c; scanf( “%f,%f”, ,可用兩種方式調(diào)用函數(shù): (1) 函數(shù)的調(diào)用可以在允許表達(dá)式出現(xiàn)的任何地方。如: c=fmax( a , b ); (2) 函數(shù)調(diào)用可以作為一條獨(dú)立的語(yǔ)句。比如,有函數(shù)定義: void printstar( ) printf(“*”); 則可以把該函數(shù)調(diào)用作為一個(gè)獨(dú)立語(yǔ)句, printstar();,9,4.2 函數(shù)的聲明、定義和調(diào)用,函數(shù)返回值 函數(shù)返回值的類型是由函數(shù)定義或說(shuō)明中的函數(shù)返回類型決定的。如果返回的類型與函數(shù)說(shuō)明的不同,則在返回值時(shí),先作隱含的類型轉(zhuǎn)換,然后再返回。,#include int f
5、max(float x , float y) return x y ? x : y; void main() float max; max = fmax(3.5 , 2.6); printf( “max=%fn” , max); ,結(jié)果?,10,4.2 函數(shù)的聲明、定義和調(diào)用,形參和實(shí)參 形式參數(shù):定義函數(shù)時(shí)放在函數(shù)名稱之后括號(hào)中的參數(shù),簡(jiǎn)稱形參。 實(shí)際參數(shù):調(diào)用函數(shù)時(shí)括號(hào)中的參數(shù),簡(jiǎn)稱實(shí)參。 形參與實(shí)參的結(jié)合:函數(shù)在調(diào)用時(shí),將生成實(shí)參值的一個(gè)副本傳遞給對(duì)應(yīng)的形參,這個(gè)過(guò)程稱為形參與實(shí)參的結(jié)合。如果只允許實(shí)參向形參傳遞數(shù)據(jù),則被稱為“單向傳遞”。,11,4.2 函數(shù)的聲明、定義和調(diào)用,參數(shù)傳遞
6、實(shí)例,void swap(float x , float y) float t; t=x; x=y; y=t; void main() float a , b; scanf( “%f,%f”, ,12,4.2 函數(shù)的聲明、定義和調(diào)用,函數(shù)的調(diào)用過(guò)程,void main() float a , b , c; scanf( “%f,%f”, ,float fmax(float x , float y) float z; z = x y ? x : y; return z; ,保存返回地址及當(dāng)前現(xiàn)場(chǎng),為形參分配內(nèi)存并將實(shí)參的值傳給形參變量,恢復(fù)main函數(shù)的現(xiàn)場(chǎng),取得返回地址和返回值,13,4.帶自
7、定義函數(shù)的程序設(shè)計(jì),4.2 函數(shù)的聲明、定義和調(diào)用,程序設(shè)計(jì)思路: (1)定義一個(gè)函數(shù)isprime(int m)判斷m是否為素?cái)?shù),若是素?cái)?shù),函數(shù)返回1,否則返回0。 int isprime(int m) int i; for(i=2;i=m-1; i+) if (m % i = 0) return 0; return 1; ,(2)在主函數(shù)中輸入一個(gè)整數(shù),調(diào)用isprime函數(shù),如果函數(shù)值為1,則打印是素?cái)?shù),否則打印不是素?cái)?shù)。 void main() int iNumber; printf (請(qǐng)輸入一個(gè)整數(shù):); scanf (%d , ,【例4-2】從鍵盤(pán)輸入一個(gè)整數(shù),判斷該整數(shù)是否為素?cái)?shù)
8、。,14,1.嵌套調(diào)用,int min2(int a,int b) return ab?a:b; int min3(int a,int b,int c) int x,y; x=min2(a,b); y=min2(t,c); return y; ,#include void main() int t1,t2; t1=min2(-2,8); printf(“min=%dn”t1,); t2=min3(-2,8,-6); printf(“min=%dn”,t2); ,4.3 函數(shù)的多級(jí)調(diào)用,15,4.3 函數(shù)的多級(jí)調(diào)用,main函數(shù) t1=min2(-2,8); t2=min3(-2,8,-6);
9、,min3函數(shù) x=min2(a,b); ,min2函數(shù) return ab?a:b; ,圖4-5 函數(shù)調(diào)用關(guān)系,16,1.嵌套調(diào)用(續(xù)),【例4-5】 用弦截法求方程x35x216x80=0 的根。,4.3 函數(shù)的多級(jí)調(diào)用,求解的方法是:,17,程序設(shè)計(jì)思路: (1)輸入x1,x2代表根的初始區(qū)間,f1,f2代表函數(shù)f在x1,x2兩點(diǎn)的函數(shù)值。要保證初始的f1,f2異號(hào),如果不是異號(hào),要重新輸入x1,x2。 (2)定義函數(shù)f(x)計(jì)算多項(xiàng)式f(x)= x35x216x80的值。 (3)用函數(shù)xpoint(x1, x2 )計(jì)算f(x1,f(x1)和f(x2,f(x2)的連線與x軸交點(diǎn)x的值,公
10、式為: (4)定義函數(shù)root(x1, x2 )來(lái)求解實(shí)根。首先調(diào)用用函數(shù)xpoint( x1,x2)計(jì)算f(x1,f(x1)和f( x2 , f (x2) )的連線與x軸交點(diǎn)x的值,再判斷f (x)與f (x1)和f (x2)哪一個(gè)同號(hào),如果f (x)與f (x1) 同號(hào),就用x作為新的x1,否則就用x作為新的x2。再在新的區(qū)間內(nèi)進(jìn)行計(jì)算。,4.3 函數(shù)的多級(jí)調(diào)用,18,4.3 函數(shù)的多級(jí)調(diào)用,19,2.遞歸調(diào)用,遞歸調(diào)用指的是一個(gè)函數(shù)執(zhí)行過(guò)程中出現(xiàn)了直接或間接調(diào)用函數(shù)本身的調(diào)用方式。如果直接調(diào)用函數(shù)本身稱為直接遞歸;如果調(diào)用了另外一個(gè)函數(shù),那個(gè)函數(shù)又調(diào)用該函數(shù),則稱為間接遞歸。 遞歸方法的
11、基本思想是將一個(gè)問(wèn)題向下分解具有同樣解決方法但規(guī)模不斷縮小的子問(wèn)題,不斷進(jìn)行這樣的分解,直到分解的子問(wèn)題有一個(gè)已知解。 某數(shù)列為k(n)的定義為: 1 n=1 k(n)= 2k(n-1) n為偶數(shù) 3k(n-1) n為奇數(shù),4.3 函數(shù)的多級(jí)調(diào)用,20,4.3 函數(shù)的多級(jí)調(diào)用,k(4)=k(3) 2,k(3)=k(2) 3,k(2)=k(1) 2,k(1) = 1,k(2) = 12=2,k(3)=23=6,k(4)=62=12,圖4-6 回推和遞推過(guò)程,21,int k(int n)/*遞歸計(jì)算函數(shù)*/ int m;/*m存放函數(shù)的返回值*/ if(n = = 1) m = 1; else
12、if(n % 2 = = 0) m = k(n - 1) * 2;/*調(diào)用自身,n為偶數(shù)*/ else m = k(n - 1) * 3; /*調(diào)用自身,n為奇數(shù)*/ return(m); void main( ) printf(nk(%d)=%f , k( 4 ); ,4.3 函數(shù)的多級(jí)調(diào)用,22,【例4-6】求Fibonacci數(shù)列第n項(xiàng)的值。Fibonacci數(shù)列以1,1開(kāi)頭,以后每一項(xiàng)都是前兩項(xiàng)之和。 1,1,2,3,5,8,13,21 程序設(shè)計(jì)思路: (1) 求Fibonacci數(shù)列第n項(xiàng)的值可用遞歸形式定義為: fibonacci (0) = 1 fibonacci (1) = 1
13、 fibonacci (n) = fibonacci (n - 1) + fibonacci (n - 2) (2)定義fibonacci函數(shù)計(jì)算第n項(xiàng)的值 int fibonacci(int n) if(n =0 | n = 1) return 1; else return fibonacci( n 1 ) + fibonacci( n 2 ); ,4.3 函數(shù)的多級(jí)調(diào)用,3. 遞歸調(diào)用舉例,23,【例4-8】反向輸出一個(gè)長(zhǎng)整數(shù) 程序設(shè)計(jì)思路: (1) 如果要輸出的數(shù)據(jù)只有一位,則“反向輸出”問(wèn)題可簡(jiǎn)化為輸出一位整數(shù)。 (2) 如果要輸出的數(shù)據(jù)超過(guò)一位,則可將該整數(shù)分為兩部分:個(gè)位上的數(shù)字和
14、個(gè)位以前的數(shù)字。個(gè)位上的數(shù)字可以直接輸出,而個(gè)位以前的數(shù)字又可以看成一個(gè)新的整數(shù),重復(fù)執(zhí)行“反向輸出”的操作。這時(shí),反向輸出在規(guī)模上縮小了一位,但求解的方法還是一致的。 (3) 用表達(dá)式x % 10可以分離出一個(gè)整數(shù)個(gè)位上的數(shù)字,用表達(dá)式x / 10可以表示出個(gè)位以前的數(shù)。定義一個(gè)反向輸出函數(shù)invertLongInt,每次先用x % 10計(jì)算并輸出個(gè)位上的數(shù),然后用x / 10(即個(gè)位以前的數(shù))做參數(shù)調(diào)用自己,不斷進(jìn)行下去,直到只剩一位數(shù)字。,4.3 函數(shù)的多級(jí)調(diào)用,24,遞歸函數(shù)可以寫(xiě)為: void invertLongInt(long x) if(x =0 ,4.3 函數(shù)的多級(jí)調(diào)用,25
15、,小結(jié): 函數(shù)分為系統(tǒng)函數(shù)和自定義函數(shù)。 每個(gè)函數(shù)的都是獨(dú)立定義的,如果函數(shù)定義在后、調(diào)用在前,要對(duì)函數(shù)原型進(jìn)行說(shuō)明。 除了主函數(shù)外,其他函數(shù)可以相互調(diào)用,如果A調(diào)用B,B又調(diào)用C,稱為嵌套調(diào)用,如果直接或間接調(diào)用自己,稱為遞歸。,26,練習(xí): 函數(shù)fun實(shí)現(xiàn)計(jì)算兩個(gè)數(shù)之差的絕對(duì)值,并將差值返回調(diào)用函數(shù),請(qǐng)編寫(xiě)fun函數(shù) fun(int x, int y),27,第7周作業(yè): 1在主函數(shù)中輸入三角形的的三條邊,調(diào)用子函數(shù),判斷是否能組成三角形,若可以則返回1否則返回0。在主函數(shù)中輸出判斷結(jié)果。 2編寫(xiě)函數(shù),求兩個(gè)正整數(shù)m和n的最大公約數(shù)。m 和 n 作為函數(shù)的參數(shù)。函數(shù)返回運(yùn)算結(jié)果,由主函數(shù)輸
16、出。 4. 習(xí)題4.2 要求: 第8周上課前提交,28,(1) 程序區(qū):存放用戶程序代碼,即程序中各個(gè)函數(shù)的代碼。 (2) 靜態(tài)存儲(chǔ)區(qū):存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)。分配在靜態(tài)存儲(chǔ)區(qū)中的變量的生命期最長(zhǎng),它們?cè)趍ain函數(shù)運(yùn)行之前就存在了,在程序的整個(gè)活動(dòng)期(從程序開(kāi)始執(zhí)行到執(zhí)行結(jié)束)中,這些變量始終占用靜態(tài)存儲(chǔ)區(qū)中對(duì)應(yīng)的存儲(chǔ)空間,即程序開(kāi)始執(zhí)行時(shí)分配存儲(chǔ)單元,程序執(zhí)行完畢后釋放。 (3) 動(dòng)態(tài)存儲(chǔ)區(qū):存放局部變量。分配在動(dòng)態(tài)存儲(chǔ)區(qū)中的變量只有在所定義的函數(shù)被調(diào)用時(shí)才分配存儲(chǔ)單元,函數(shù)結(jié)束時(shí)就釋放。系統(tǒng)對(duì)函數(shù)調(diào)用時(shí)的現(xiàn)場(chǎng)保護(hù)、返回地址等也占用動(dòng)態(tài)保護(hù)區(qū)。 (4)堆:自由存儲(chǔ)區(qū),用于運(yùn)行程序時(shí)動(dòng)
17、態(tài)申請(qǐng)內(nèi)存。,4.4 變量的作用域和存儲(chǔ)類別,1.程序在內(nèi)存中的分布區(qū)域,29,局部變量:在塊內(nèi)定義的變量。 局部變量作用域:塊內(nèi)定義、塊內(nèi)使用。所謂塊內(nèi)是指一對(duì)以 為界限的若干個(gè)語(yǔ)句,例如函數(shù)體、復(fù)合語(yǔ)句。而塊內(nèi)使用,是指變量的作用范圍僅僅局限在從變量定義處開(kāi)始、到變量定義所在的那個(gè)塊結(jié)束。如:,4.4 變量的作用域和存儲(chǔ)類別,2.局部變量及存儲(chǔ)類別,局部于main的局部變量,局部于func的局部變量,void main() int n=5; printf(“%d”,n); func(); void func() int n=8; printf(“%d”,n); ,30,形式參數(shù)也為局部變量
18、,其作用范圍是形式參數(shù)所在的整個(gè)函數(shù)。例如: void main() printf(“%d,%d”,x , y); /*error*/ void func(int x , int y) /*/ ,4.4 變量的作用域和存儲(chǔ)類別,31,局部變量的存儲(chǔ)類別 : 自動(dòng)變量:用關(guān)鍵字auto(可缺省) 加以說(shuō)明的局部變量。如: auto float b; 或float b; 特點(diǎn):是短生命期的局部變量,安排在動(dòng)態(tài)存儲(chǔ)區(qū),由系統(tǒng)自動(dòng)分配和釋放,用到時(shí)分配內(nèi)存,不用時(shí)釋放內(nèi)存,以節(jié)省程序執(zhí)行時(shí)的內(nèi)存資源。 局部靜態(tài)變量:用關(guān)鍵字static 加以說(shuō)明的局部變量。局部靜態(tài)變量在靜態(tài)存儲(chǔ)區(qū)分配空間。如: st
19、atic int count; 特點(diǎn):是長(zhǎng)生命期的局部變量。函數(shù)執(zhí)行結(jié)束后,分配給該變量的存儲(chǔ)區(qū)不釋放。局部靜態(tài)變量安排在靜態(tài)存儲(chǔ)區(qū)。 寄存器變量:用關(guān)鍵字register說(shuō)明的局部變量為寄存器變量。 特點(diǎn):寄存器變量的值存放在CPU的寄存器中??梢蕴岣叱绦虻膱?zhí)行效率。,4.4 變量的作用域和存儲(chǔ)類別,32,【例4-10】局部變量存儲(chǔ)方式舉例,分析下面程序運(yùn)行結(jié)果: /*程序名:4_10.cpp*/ /*功能:局部變量存儲(chǔ)方式示例*/ #include int fun1( int ); int fun2( int ); void main() int i; for(i = 2 ; i 5 ;
20、i+) printf (fun1(%d) = %d t , i , fun1( i ) ); printf(n); for(i = 2 ; i 5 ; i+) printf (fun2(%d) = %d t , i , fun2( i ) ); printf(n); ,4.4 變量的作用域和存儲(chǔ)類別,33,續(xù)上頁(yè): int fun1( int x ) int f = 1; return ( f *= x ); int fun2( int x ) static int f = 1; return ( f *= x ); ,4.4 變量的作用域和存儲(chǔ)類別,程序執(zhí)行結(jié)果為: fun1(2)=2 fu
21、n1(3)=3 fun1(4)=4 fun2(2)=2 fun2(3)=6 fun2(4)=24,34,#include int func(int,int); void main() int k = 4, m = 1, p; p=func(k,m); printf(%d,p); p=func(k,m); printf(%dn,p); int func(int a,int b) static int m, i = 2; i += m+1; m = i+a+b; return(m); ,結(jié)果: 8,17,主函數(shù):,第一次 fun函數(shù):,k,m,4,1,m,i,0,2,m,i,8,3,第二次 fun
22、函數(shù):,m,i,8,3,m,i,17,12,35,全局部變量:函數(shù)外定義的變量。 全局變量作用域:全局變量的作用范圍是從變量定義處開(kāi)始到所定義的源文件結(jié)束處,即從全局變量定義所在處開(kāi)始到源文件結(jié)束處之間的所有函數(shù)都可以訪問(wèn)該變量。如: int n=1; void main() printf(“%d”,n); func(); printf(“%d”,n); float m; void func() n=5; m=3; ,4.4 變量的作用域和存儲(chǔ)類別,2.全局部變量及存儲(chǔ)類別,36,【例4-11】全局變量的作用域舉例,分析下面程序運(yùn)行結(jié)果。 #include void swap(void); i
23、nt a , b; /*是兩個(gè)函數(shù)公用的變量*/ void main() scanf(%d%d, /*使用的變量名 a和 b 全局變量 a和 b*/ ,4.4 變量的作用域和存儲(chǔ)類別,37,局部變量與全局變量同名時(shí)的處理:小范圍優(yōu)先 【例4-12】分析下面程序運(yùn)行結(jié)果: int i = 1; /*變量i定義在所有函數(shù)之外,屬于全局變量*/ void main() printf(“主函數(shù)中訪問(wèn)的變量 i:%dn , i); i = test ( ) + 1; printf(“主函數(shù)中訪問(wèn)的變量 i:%dn , i); int test ( ) int i; printf(“ test 中訪問(wèn)的變
24、量 i:%dn , i); i = 2; printf(“ test 中訪問(wèn)的變量 i:%dn , i); return i; ,4.4 變量的作用域和存儲(chǔ)類別,程序運(yùn)行結(jié)果: 主函數(shù)中訪問(wèn)的變量 i:1 test 中訪問(wèn)的變量 i:28345 test 中訪問(wèn)的變量 i:2 主函數(shù)中訪問(wèn)的變量 i:3,38,全局部變量的存儲(chǔ)類別 : 靜態(tài)全局變量:使用關(guān)鍵字 static定義 的全局變量是文件內(nèi)部的全局變量。 特點(diǎn):只能被定義所在的源文件中的所有函數(shù)訪問(wèn),同一程序的其它 源文件中的函數(shù)都不能訪問(wèn)該變量。 非靜態(tài)全局變量:使用缺省關(guān)鍵字的全局變量。 特點(diǎn):則該變量不僅能被定義所在的源文件中的所
25、有函數(shù)訪問(wèn),而且組成程序的其它源文件中的所有函數(shù)也都能訪問(wèn)該變量。因此,從作用范圍看,缺省關(guān)鍵字的全局變量要比使用關(guān)鍵字 static 的靜態(tài)全局變量大。 關(guān)鍵字 extern 的作用 關(guān)鍵字 extern 的作用是對(duì)要使用的某個(gè)尚未定義的全局變量在使用前作變量說(shuō)明,該全局變量或者是以后會(huì)在該源文件中定義的全局變量,或者是在另一個(gè)源文件中使用缺省關(guān)鍵字定義的全局變量。,4.4 變量的作用域和存儲(chǔ)類別,39,【例4-13】全局變量存儲(chǔ)方式舉例,分析下面程序運(yùn)行結(jié)果: /*程序名:4_13.cpp*/ /*功能:全局變量存儲(chǔ)方式示例*/ #include extern int a; /*對(duì)4_13
26、_2.cpp中定義的變量進(jìn)行說(shuō)明*/ void fun1(); void fun2(); void main() fun1(); fun2(); printf(函數(shù) main 中的 a是 %dn,a); ,4.4 變量的作用域和存儲(chǔ)類別,40,/*程序名:4_13_1.cpp*/ #include static int a; /*只允許文件4_13_1.cpp中函數(shù)訪問(wèn)的全局變量*/ void fun1() a = 2; printf(函數(shù) fun1 中的 a是 %dn,a); /*程序名:4_13_2.cpp */ #include int a; /*允許其它文件中函數(shù)訪問(wèn)的全局變量*/ v
27、oid fun2() a = 4; printf(函數(shù) fun2 中的 a是 %dn,a); ,4.4 變量的作用域和存儲(chǔ)類別,41,rand()函數(shù)可隨機(jī)生成0RAND_MAX之間的一個(gè)整數(shù)。RAND_MAX是頭文件中定義的一個(gè)符號(hào)常量。ANSI規(guī)定RAND_MAX的值不小于32767。 根據(jù)下面公式可以得到所需范圍內(nèi)的隨機(jī)數(shù): n = a + rand () % b 其中a為位移,是所需連續(xù)整數(shù)范圍的第一個(gè)數(shù),b是比例因子,是所需連續(xù)整數(shù)范圍的寬度,則希望產(chǎn)生16之間隨機(jī)數(shù)的公式為: face = 1 + rand () % 6,4.5 計(jì)算機(jī)隨機(jī)模擬方法,1.偽隨機(jī)數(shù)的產(chǎn)生,42,【例4
28、-14】編寫(xiě)一個(gè)模擬投擲硬幣的程序,模擬20次,統(tǒng)計(jì)出正面出現(xiàn)的次數(shù)。 #include #include void main() int i , face , iCount = 0; for(i = 1 ; i = 20 ; i+) face = rand () % 2; printf(%5d , face); if ( i % 10 = 0 ) printf(n); if ( face ) iCount+; printf(正面出現(xiàn)次數(shù):%d次n , iCount); ,4.5 計(jì)算機(jī)隨機(jī)模擬方法,43,運(yùn)行程序,結(jié)果為: 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1
29、0 1 0 正面出現(xiàn)次數(shù):11次 再次運(yùn)行該程序結(jié)果為: 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0,4.5 計(jì)算機(jī)隨機(jī)模擬方法,44,用srand()函數(shù)進(jìn)行隨機(jī)化 void main() unsigned seed; printf(“輸入一個(gè)非負(fù)整數(shù)做種子:”); scanf(“%d” , 運(yùn)行3次程序: 輸入一個(gè)非負(fù)整數(shù)做種子:16 1 3 4 3 5 6 5 2 6 2 輸入一個(gè)非負(fù)整數(shù)做種子:33 3 1 5 3 5 6 5 4 1 5 輸入一個(gè)非負(fù)整數(shù)做種子:16 1 3 4 3 5 6 5 2 6 2,4.5 計(jì)算機(jī)隨機(jī)模擬方法,45,使用系統(tǒng)
30、定時(shí)/計(jì)數(shù)器的值做為隨機(jī)種子: srand(time(NULL); time()函數(shù)返回以秒為單位的當(dāng)前時(shí)間值,因?yàn)橛袝r(shí)鐘參數(shù),而時(shí)間始終在變,隨機(jī)數(shù)序列就不會(huì)固定不變了。 【例4-16】編寫(xiě)程序,用來(lái)生成一個(gè)隨機(jī)小寫(xiě)字符串。 #include #include #include void main() srand (time (NULL) ); for(int i = 1 ; i = 20 ; i+) printf (%c , 97 + rand () % 26 ); ,4.5 計(jì)算機(jī)隨機(jī)模擬方法,46,用事件發(fā)生的“頻率”來(lái)決定事件的“概率” 考慮平面上的一個(gè)邊長(zhǎng)為1的正方形及其內(nèi)部的一個(gè)
31、形狀不規(guī)則的“圖形”,如何求出這個(gè)“圖形”的面積呢?Monte Carlo方法是這樣一種“隨機(jī)化”的方法:向該正方形“隨機(jī)地”投擲N個(gè)點(diǎn)落于“圖形”內(nèi),則該“圖形”的面積近似為M/N。 【例4-17】計(jì)算圖形面積。圖中有兩條半徑為1的圓弧,求s的面積。,4.5 計(jì)算機(jī)隨機(jī)模擬方法,2.蒙特卡羅(Monte Carlo)方法,x,y,o,1,1,s,圖4-10 求面積,47,程序設(shè)計(jì)思路:模擬雨點(diǎn)落在陰影區(qū)域的情況。對(duì)于以x=0,y=0位圓心的圓,s中每個(gè)點(diǎn)應(yīng)該滿足: (1) 對(duì)于以x=1,y=0位圓心的圓,s中每個(gè)點(diǎn)應(yīng)該滿足: (2) 同時(shí)滿足(1)和(2)就可以保證雨點(diǎn)落在s區(qū)域。可以使用如
32、下語(yǔ)句: if (sqrt(x * x + y * y) 1 g為落入s區(qū)雨點(diǎn)的數(shù)目。程序參見(jiàn)教材4_17.cpp。,4.5 計(jì)算機(jī)隨機(jī)模擬方法,48,“文件包含”是指一個(gè)源文件可以將另一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來(lái)。在編譯預(yù)處理時(shí)#include指令讓預(yù)處理器在程序該點(diǎn)處加入指定文件內(nèi)容,然后作為一個(gè)源文件編譯形成新文件。 文件包含的一般形式為: (1) #include (2) #include文件名 例如:#include #include stdio.h,4.6 編譯預(yù)處理,1.文件包含#include,49,(1) 定義符號(hào)常量 #define 標(biāo)識(shí)符 字符串 如:#define PI
33、 3.14 預(yù)處理器將在源文件中搜索PI,并把每個(gè)PI替換成3.14。完成搜索和操作替換后,預(yù)處理器刪除#define行。 (2) 定義宏 #define 宏名(參數(shù)表) 字符串 如: #define S(a , b) a * b 對(duì)程序中帶有實(shí)參的宏(如S(3 , 4),按#define命令中指定的字符串從左到右進(jìn)行替換。如果字符串中包含宏的形參(如a , b),則將程序語(yǔ)句中相應(yīng)的實(shí)參代替形參,如果宏定義中字符串中的字符不是參數(shù)字符(如a*b中的*)則原樣保留。,4.6 編譯預(yù)處理,2.宏定義#define,50,(3) 宏與函數(shù) 宏替換只占編譯時(shí)間,不占運(yùn)行時(shí)間。但函數(shù)調(diào)用時(shí)分配單元、傳
34、值、返回值時(shí)都占時(shí)間,特別是多次調(diào)用時(shí)尤為嚴(yán)重。但使用宏的程序代碼較長(zhǎng),因?yàn)楹暝诔绦蛑写嬖诹硕啻?,而使用函?shù)時(shí),雖然多次調(diào)用,但函數(shù)代碼只存在一次。 函數(shù)調(diào)用時(shí)先求實(shí)參表達(dá)式的值,再傳給形參。而帶參數(shù)的宏只是簡(jiǎn)單的字符替換,宏展開(kāi)時(shí)并不對(duì)實(shí)參表達(dá)式求值。函數(shù)調(diào)用時(shí)臨時(shí)分配存儲(chǔ)單元,宏替換并不分配存儲(chǔ)單元,也沒(méi)有返回值。 宏是無(wú)類型的。宏既可以用于浮點(diǎn)型,也可以用于整型,因?yàn)轭A(yù)處理器只是完成字符替換,而不考慮它的參數(shù)類型。如果使用函數(shù),則對(duì)于每種求平方的數(shù)據(jù)類型都需要一個(gè)函數(shù)。,4.6 編譯預(yù)處理,51,條件編譯就是按條件對(duì)C/C+程序的一部分進(jìn)行編譯,其它部分不編譯。 (1)使源代碼能更迅速、更容易地進(jìn)行修改,并使目標(biāo)代碼縮短。如: # if (MAX 99) printf(Compiled for array greater
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026福建同安第一中學(xué)附屬學(xué)校校園招聘考試備考試題及答案解析
- 2026廣西玉林福綿區(qū)就業(yè)服務(wù)中心招聘見(jiàn)習(xí)生1人考試備考題庫(kù)及答案解析
- 2026年春季學(xué)期廣東廣州市天河區(qū)同仁天興學(xué)校招聘4人考試備考試題及答案解析
- 2026上海虹口區(qū)委黨校招聘專職教師1人考試參考試題及答案解析
- 2026年寧夏招錄選調(diào)生選報(bào)考試備考題庫(kù)及答案解析
- 2026中國(guó)人民銀行清算總中心直屬企業(yè)深圳金融電子結(jié)算中心有限公司招聘14人考試備考試題及答案解析
- 2026福汽集團(tuán)校園招聘279人考試參考試題及答案解析
- 2026年上海市嘉定區(qū)嘉一實(shí)驗(yàn)初級(jí)中學(xué)教師招聘考試參考題庫(kù)及答案解析
- 2026年上海煙草集團(tuán)有限責(zé)任公司應(yīng)屆生招聘考試備考題庫(kù)及答案解析
- 家庭養(yǎng)老護(hù)理急救注意事項(xiàng)
- 水車澆水施工方案
- 4M變化點(diǎn)管理記錄表
- Tickets-please《請(qǐng)買(mǎi)票》 賞析完整
- 《馬克的怪病》課件
- 部編版八年級(jí)道德與法治上冊(cè)《樹(shù)立維護(hù)國(guó)家利益意識(shí)捍衛(wèi)國(guó)家利益》教案及教學(xué)反思
- 基于單片機(jī)的智能家居控制系統(tǒng)設(shè)計(jì)
- 鍋爐大件吊裝方案
- 昆明醫(yī)科大學(xué)第二附屬醫(yī)院進(jìn)修醫(yī)師申請(qǐng)表
- 湖北2023年湖北銀行武漢洪山區(qū)支行行長(zhǎng)招聘上岸提分題庫(kù)3套【500題帶答案含詳解】
- 基本醫(yī)療保險(xiǎn)跨省異地就醫(yī)備案?jìng)€(gè)人承諾書(shū)
- 中國(guó)近代史期末復(fù)習(xí)(下)(第21-25課)【知識(shí)建構(gòu)+備課精研】 高一歷史上學(xué)期期末 復(fù)習(xí) (中外歷史綱要上)
評(píng)論
0/150
提交評(píng)論