第4章模塊化程序設計_第1頁
第4章模塊化程序設計_第2頁
第4章模塊化程序設計_第3頁
第4章模塊化程序設計_第4頁
第4章模塊化程序設計_第5頁
已閱讀5頁,還剩65頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章模塊化程序設計第一頁,共80頁。教學目標理解如何用函數構造程序模塊會聲明、定義和調用函數并理解函數調用的機制掌握變量的作用域和存儲類別2第二頁,共80頁。4.1模塊化程序設計概述

4.2函數的聲明、定義和調用

4.3函數的多級調用

4.4變量的作用域和存儲類別

4.5計算機隨機模擬方法(不要求)4.6編譯預處理

3第三頁,共80頁。復雜任務可以分解為若干子任務。重復使用的程序段,將其進行獨立設計,使計算機可以重復執行。程序執行從主控程序開始、也從主控程序結束。分段設計的出發點在于一個程序模塊對于某個問題的解決應保持相對的完整性。main()func1()func2()func3()func4()func5()func6()圖4-1程序模塊結構圖4.1

模塊化程序設計概述4第四頁,共80頁。源文件1函數n函數2函數1源文件m源文件2函數是C語言的基本構件一個C程序

一個C程序的源文件............5第五頁,共80頁。4.2函數的聲明、定義和調用引例函數說明函數定義函數調用及參數的傳遞帶自定義函數的程序設計6第六頁,共80頁。引例

/*程序名:4_1.cpp*//*功能:計算兩個實數中大的值*/#include<stdio.h>floatfmax(floatx,floaty);

/*函數說明*/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;}7第七頁,共80頁。函數定義

函數定義的一般形式:函數返回值類型函數名(類型名形參1,類型名形參2,…)/*函數頭*/{ /*函數體*/

函數實現過程}例如floatfmax(floatx,floaty){floatz;z=x>y?x:y;

returnz;}不能省略必為變量結束本函數的執行并返回函數值此處不能有分號可以沒有參數8第八頁,共80頁。函數定義的幾點說明在定義函數時不指定函數返回值類型,系統會隱含指定函數返回值類型為int型。一個函數可有多個return語句。一個return語句只能返回一個值。如果被調函數中沒有return語句,函數并不是不帶回值。對不返回值的函數,要使用關鍵字void,但可以在函數體中使用return;。即使函數沒有參數,其名后的括弧也不能省。函數頭與函數說明不同,函數頭不是一條語句。9第九頁,共80頁。函數說明(函數原型)

說明格式為:

函數返回值類型函數名(參數表);

#include<stdio.h>floatfmax(floatx

,floaty);

/*函數說明*/voidmain(){floata,b,c;scanf("%f,%f",&a,&b);

c=fmax(a,b);printf("max=%f\n",c);}

函數說明是一條語句,它指出函數返回值的類型、函數的名稱、函數要接收的參數的個數、順序和類型。如果在一個函數中要調用另外一個函數,則在調用之前要對該函數進行說明。如果函數定義出現在程序中首次使用該函數之前,則不需要說明函數原型。可省略必須有分號10第十頁,共80頁。函數調用及參數的傳遞

函數調用的一般形式為:

函數名(實參表)

voidmain(){floata,b,c;scanf("%f,%f",&a,&b);

c=fmax(a,b);printf("max=%f\n",c);}可用兩種方式調用函數:(1)

函數的調用可以作為表達式出現在允許表達式出現的任何地方。如:c=fmax(a,b)+3;(2)函數調用可以作為一條獨立的語句。比如,有函數定義:voidprintstar(){printf(“***************”);}則可以把該函數調用作為一個獨立語句。

printstar();printf(“max=%f\n”,fmax(a,b));可為常量,變量或表達式11第十一頁,共80頁。函數返回值

(函數值)

函數返回值的類型是由函數說明中的函數返回類型決定的。如果返回的類型與函數說明的不同,則在返回值時,先作隱含的類型轉換,然后再返回。#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頁。形參和實參

形式參數:定義函數時放在函數名稱之后括號中的參數,簡稱形參。形參必須是變量。實際參數:調用函數時括號中的參數,簡稱實參。實參可為常量、變量或表達式。形參與實參的結合:函數調用時,將生成實參值的一個副本傳遞給對應的形參,這個過程稱為形參與實參的結合。只允許實參向形參傳遞數據,則稱為“單向傳遞”。圖4-2實參和形參數據的傳遞3.53.52.62.6實參a實參b形參x形參y實參與形參必須一一對應,數量相同且類型一致13第十三頁,共80頁。函數的調用過程

#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;}保存返回地址及當前現場,為形參分配內存并將實參值的副本傳給形參變量恢復main函數的現場,取得返回地址和返回值14第十四頁,共80頁。帶自定義函數的程序設計

程序設計思路:(1)定義一個函數isprime(inta)判斷a是否為素數,若是素數,函數返回1,否則返回0。#include<stdio.h>#include<math.h>intisprime(inta)//函數定義{inti;if(a==1)return0;for(i=2;i<=sqrt(a);i++)if(a%i==0)

return0;

return1;}(2)在主函數中輸入一個整數,調用isprime函數,如果函數值為1,則打印是素數,否則打印不是素數。voidmain(){intiNumber;printf("請輸入一個整數:");scanf("%d",&iNumber);if(isprime(iNumber))//函數調用

printf("%d是素數\n",iNumber);elseprintf("%d不是素數\n",iNumber);}【例4-2】從鍵盤輸入一個整數,判斷該整數是否為素數。15第十五頁,共80頁。例題輸入圓柱的高和半徑,求圓柱體積,

volume=×r2×h。 要求定義和調用cylinder(r,h)計算圓柱體的體積。16第十六頁,共80頁。/*計算圓柱體積*/#include<stdio.h>voidmain(){doubleheight,radius,volume; doublecylinder(doubler,doubleh);/*函數聲明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); /*調用函數,返回值賦給volume*/

volume=cylinder(radius,height); printf("Volume=%.3f\n",volume);}/*定義求圓柱體積的函數*/doublecylinder(doubler,doubleh) { doubleresult; result=3.1415926*r*r*h;/*計算體積*/ returnresult; /*返回結果*/}17第十七頁,共80頁。例題輸出5之內的數字金字塔。

12233344445555518第十八頁,共80頁。/*輸出數字金字塔*/#include<stdio.h>voidmain(){

voidpyramid(intn); /*函數聲明*/

pyramid(5); /*調用函數,輸出數字金字塔*/}voidpyramid(intn) /*函數定義*/{ inti,j; for(i=1;i<=n;i++)/*需要輸出的行數*/{ for(j=1;j<=n-i;j++) /*輸出每行左邊的空格*/ printf(""); for(j=1;j<=i;j++) /*輸出每行的數字*/ printf("%d",i); /*每個數字的后各有一個空格*/

putchar('\n');

}}19第十九頁,共80頁。例題

輸入精度e,使用格里高利公式求π的近似值,精確到最后一項的絕對值小于e。要求定義和調用函數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函數的多級調用函數的嵌套調用函數的遞歸調用遞歸與遞推22第二十二頁,共80頁。引例

設計一個常用圓形體體積的計算器,采用命令方式輸入1、2、3,分別選擇計算球體、圓柱體、圓錐體的體積,并輸入計算所需相應參數。23第二十三頁,共80頁。#include<stdio.h>#definePI3.141592654voidcal(intsel);voidmain(){intsel;

while(1)

{printf("1-計算球體體積\n"); printf("2-計算圓柱體積\n"); printf("3-計算圓錐體積\n"); printf("其他-退出程序運行\n"); printf("請輸入計算命令:"); scanf("%d",&sel); if(sel<1||sel>3)

break; /*輸入非1~3,循環結束*/ else

cal(sel); /*輸入1~3,調用cal()*/

}}24第二十四頁,共80頁。/*常用圓形體體積計算器的主控函數*/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頁。嵌套調用

main函數{……x=root(x1,x2);……}root函數{……x=xpoint(x1,x2);……}xpoint函數{……return(x1*f(x2)-x2*f(x1))/(f(x2)–f(x1));……}f函數{……}圖4-5函數調用關系示意圖C語言不允許嵌套定義函數,但允許嵌套調用函數。除了主函數外,其它函數可以相互調用。27第二十七頁,共80頁。遞歸調用

遞歸調用指的是一個函數執行過程中出現了直接或間接調用函數本身的調用方式。如果直接調用函數本身稱為直接遞歸;如果調用了另外一個函數,那個函數又調用該函數,則稱為間接遞歸。遞歸方法的基本思想是將一個問題向下分解具有同樣解決方法但規模不斷縮小的子問題,不斷進行這樣的分解,直到分解的子問題有一個已知解。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可以用數學公式表示為:

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個人年齡的過程如下圖第一階段“回推”,第二階段“遞推”遞歸過程結束條件31第三十一頁,共80頁。可以看出,當n>1時,求第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函數共被調用4次,即age(4),age(3),age(2),age(1)33第三十三頁,共80頁。age(4)mainc=age(3)+2age函數n=4c=age(2)+2age函數n=3c=age(1)+2age函數n=2c=10age函數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頁。遞歸的條件

設計一個函數來實現遞歸算法,這個函數必須不斷使用下一級值調用自己,但不能無限地調用下去,最終應能終止遞歸。因此遞歸函數一般必須滿足下列條件:必須有完成函數任務的語句(return語句);必須有一個確定是否能終止遞歸調用的語句;必須有一個遞歸調用語句。36第三十六頁,共80頁。遞歸與遞推

大多數遞歸問題都可以轉化為遞推求解,遞歸調用使用選擇結構,而遞推調用使用循環結構。

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頁。遞歸的優點:使用遞歸能夠更自然地反映解決問題的過程,符合人的思維習慣,易于理解和調試程序,簡化程序,便于閱讀遞歸的缺點:大量的遞歸調用會占用處理器很多時間和大量的內存遞推的優點:效率高遞推的缺點:比較難編程,可讀性較差39第三十九頁,共80頁。4.4變量的作用域和存儲類別程序在內存中的分布區域局部變量及存儲類別全局變量及存儲類別40第四十頁,共80頁。引例用函數實現財務現金記賬。先輸入操作類型(1--收入;2--支出;0--結束),再輸入操作金額,計算現金剩余額,經多次操作直到操作類型為0時結束。要求定義并調用函數,其中現金收入與現金支出分別用不同函數實現。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頁。從變量占用空間的角度(作用范圍)來分析問題,劃分出全局變量和局部變量,這是變量的作用域問題。從變量值存在的時間角度(生存周期)來分析問題,劃分出變量的靜態存儲和動態存儲,這是變量的存儲類別問題。43第四十三頁,共80頁。(1)程序區:存放用戶程序代碼,即程序中各個函數的代碼。(2)靜態存儲區:存放程序的全局數據和靜態數據。分配在靜態存儲區中的變量的生命期最長,它們在main函數運行之前就存在了,在程序的整個活動期(從程序開始執行到執行結束)中,這些變量始終占用靜態存儲區中對應的存儲空間,即程序開始執行時分配存儲單元,程序執行完畢后釋放。(3)動態存儲區:存放局部變量。分配在動態存儲區中的變量只有在所定義的函數被調用時才分配存儲單元,函數結束時就釋放。系統對函數調用時的現場保護、返回地址等也占用動態存儲區。程序在內存中的分布區域

44第四十四頁,共80頁。局部變量:在一個函數內定義的變量。局部變量作用域:塊內定義、塊內使用。所謂塊內是指一對以{}為界限的若干個語句,例如函數體、復合語句。塊內使用是指變量的作用范圍僅僅局限在從變量定義處開始、到變量定義所在的那個塊結束。如:voidmain(){intn;/*……*/}voidfunc(){intn;/*……*/}局部變量及存儲類別

main的局部變量func的局部變量45第四十五頁,共80頁。形式參數也為局部變量,其作用范圍是形式參數所在的整個函數。例如:voidmain(){printf("%d,%d",x,y);

……}voidfunc(intx,inty){

……}在main函數中不能使用在func函數中定義的局部變量46第四十六頁,共80頁。在復合語句中定義局部變量。#include<stdio.h>voidmain(){int a;a=1;

{ /*復合語句開始*/intb=2;b=a+b;a=a+b;

}

/*復合語句結束*/ printf("%d",a);}b:小范圍內的臨時變量

47第四十七頁,共80頁。局部變量的存儲類別:自動變量:用關鍵字auto(可缺省)

加以說明的局部變量。如:autofloatb;或floatb;

特點:是短生命期的局部變量,安排在動態存儲區,由系統自動分配和釋放,用到時分配內存,不用時釋放內存,以節省程序執行時的內存資源。局部靜態變量:用關鍵字static

加以說明的局部變量。如:

staticintcount;

特點:是長生命期的局部變量。函數執行結束后,分配給該變量的存儲區不釋放。局部靜態變量安排在靜態存儲區。寄存器變量:關鍵字register說明的局部變量為寄存器變量。特點:寄存器變量的值存放在CPU的寄存器中,可以提高程序的執行效率。如registerinti;48第四十八頁,共80頁。局部靜態變量說明:

staticintcount局部靜態變量屬于靜態存儲類別;局部靜態變量是在編譯時賦初值的,即只賦初值一次;局部靜態變量不賦初值,編譯時自動賦初值0;局部靜態變量在函數調用結束仍存在,但其他函數不能引用它。形參不能是局部靜態變量。寄存器變量說明:如

registerinti;只有局部自動變量和形式參數可以作為寄存器變量,其它(如全局變量)不行。一個計算機系統中的寄存器數目有限,不能定義太多寄存器變量;局部靜態變量不能定義為寄存器變量。如:

registerstaticinta,b;//error49第四十九頁,共80頁。【例4-10】局部變量存儲方式舉例,分析下面程序運行結果:/*程序名: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頁。全局變量:在所有函數外定義的變量。全局變量作用域:從變量定義處開始到所定義的源文件結束處,即從全局變量定義所在處開始到源文件結束處之間的所有函數都可以訪問該變量。如: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; /*全局變量運算*/}printf("%d%d",a,x);}若局部變量與全局變量同名,局部變量優先52第五十二頁,共80頁。【例4-11】全局變量的作用域舉例,分析下面程序運行結果。#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頁。不要濫用全局變量使用全局變量會帶來如下問題:程序的清晰度降低函數的靈活性、通用性降低存儲空間的利用率降低54第五十四頁,共80頁。局部變量與全局變量同名時:小范圍優先【例4-12】分析下面程序運行結果:#include<stdio.h>inti=1;/*變量i定義在所有函數之外,屬于全局變量*/inttest();voidmain(){printf("主函數中i:%d其地址%p\n",i,&i);i=test()+1;printf("主函數中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頁。全局變量的存儲類別:(靜態存儲)靜態全局變量:使用關鍵字static定義的全局變量。特點:只能被其定義所在的源文件中的函數訪問,同一程序的其它源文件中的函數都不能訪問該變量。非靜態全局變量:也稱為外部變量,不使用任何關鍵字。特點:該變量不僅能被定義所在的源文件中的函數訪問,而且組成程序的其它源文件中的函數也都能訪問該變量。因此,從作用范圍看,外部變量的作用域要比使用關鍵字static的靜態全局變量的大。關鍵字extern

的作用關鍵字extern的作用是對要使用的某個尚未定義的全局變量在使用前作變量說明,該全局變量或者是以后會在該源文件中定義的全局變量,或者是在另一個源文件中定義的非靜態全局變量。56第五十六頁,共80頁。/*程序名:a.cpp*//*功能:全局變量存儲方式示例*/#include<stdio.h>externinta;/*對c.cpp中定義的變量進行說明*/voidfun1();voidfun2();voidmain(){fun1();fun2();printf("函數main中的a是%d\n",a);}【例4-13】全局變量存儲方式舉例,分析下面程序運行結果:57第五十七頁,共80頁。/*程序名:c.cpp*/#include<stdio.h>inta;

/*允許其它文件中函數訪問的全局變量*/voidfun2(){a=4;printf("函數fun2中的a是%d\n",a);}/*程序名:b.cpp*/#include<stdio.h>staticinta;/*只允許文件b.cpp中函數訪問的全局變量*/voidfun1(){a=2;printf("函數fun1中的a是%d\n",a);}58第五十八頁,共80頁。函數與程序文件模塊如果一個程序包含多個文件模塊,要實現在一個文件模塊A中調用另一個文件模塊B中的函數時,就要在文件模塊A中對函數進行外部聲明。聲明格式為:

extern函數類型函數名(參數表說明);C語言也允許把函數定義成靜態的,以便把函數的使用范圍限制在文件模塊內。即使其他文件模塊有同名的函數定義,相互也沒有任何關聯,增強了文件模塊的獨立性。

static函數類型函數名(參數表說明);extern可省略59第五十九頁,共80頁。4.5計算機隨機模擬方法偽隨機數的產生蒙特卡羅方法(不要求)60第六十頁,共80頁。rand()函數可隨機生成0~RAND_MAX之間的一個整數。RAND_MAX是頭文件<stdlib.h>中定義的一個符號常量。ANSI規定RAND_MAX的值不小于32767。根據下面公式可以得到所需范圍內的隨機數:

n=a+rand()%b

其中a為位移,是所需連續整數范圍的第一個數,b是比例因子,是所需連續整數范圍的寬度,則希望產生1~6之間隨機數的公式為:

face=1+rand()%6偽隨機數的產生

61第六十一頁,共80頁。【例4-14】編寫一個模擬投擲硬幣的程序,模擬20次,統計出正面出現的次數。#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("正面出現次數:%d次\n",iCount);}62第六十二頁,共80頁。運行程序,結果為:11001000001111111010正面出現次數:11次再次運行該程序結果為:11001000001111111010正面出現次數:11次用函數void

srand(

unsigned

int

seed

),通過提供不同的種子產生不同的隨機數序列。63第六十三頁,共80頁。用srand()函數進行隨機化#include<stdio.h>#include<stdlib.h>voidmain(){ unsignedseed; printf("輸入一個非負整數做種子:"); scanf("%d",&seed); srand(seed); for(inti=1;i<=10;i++) printf("%3d",1+rand()%6);}運行3次程序:輸入一個非負整數做種子:161343565262輸入一個非負整數做種子:333153565415輸入一個非負整數做種子:16134356526264第六十四頁,共80頁。使用系統定時/計數器的值做為隨機種子:

srand(time(NULL));time()函數返回以秒為單位的當前時間值,因為有時鐘參數,而時間始終在變,隨機數序列就不會固定不變了。【例4-16】編寫程序,用來生成一個隨機小寫字符串。

#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編譯預處理文件包含#include宏定義#define條件編譯#if66第六十六頁,共80頁。“文件包含”是指一個源文件可以將另一個源文件的全部內容包含進來。在編譯預處理時#include指令讓預處理器用指定文件內容替換該語句,然后作為一個源文件編譯形成新文件。文件包含的一般形式為:(1)#include<文件名>(2)#include"文件名"例如:#include<stdio.h>(只查C語言的系統目錄)#include“stdio.h”(首先查當前目錄)文件包含#include67第六十七頁,共80頁。(1)定義符號常量

#define標識符

字符串如:#definePI3.14預處理器將在源文件中搜索PI,并把每個PI替換成3.14。完成搜索和操作替換后,預處理器刪除#define行。(2)定義宏

#define宏名(參數表)

字符串如:#defineS(a,b)a*b對程序中帶有實參的宏(如S(3,4)),按#define命令中指定的字符串從左到右進行替換。如果字符串中包含宏的形參(如a,b),則將程序語句中相應的實參代替形參,如果宏定義中字符串中的字符不是參數字符(如a*b中的*)則原樣保留。宏定義#define宏名中間不能有空格68第六十八頁,共80頁。宏的用途符號常量簡單的函數功能實現如:#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頁。宏的范圍宏可以寫在程序中的任何位置,它的作用范圍從定義書寫處到該文件尾,在此范圍內都可以用宏名進行替換,并可以通過#undef強制指定的宏的結束范圍.#include<stdio.h>#defineA"Thisisthefirstmacro"voidf1(){printf("A\n");}#defineB"Thisisthesecondmacro"

voidf2(){printf(B); }#undefBvoidmain(){f1();f2();printf("\n");}70第七十頁,共80頁。帶參數宏例1:#include<stdio.h>#defineSQR(n)(n)*(n)voidmain(){ intiNumb

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論