C語言程序設計(第三版)課件第6章函數(shù)_第1頁
C語言程序設計(第三版)課件第6章函數(shù)_第2頁
C語言程序設計(第三版)課件第6章函數(shù)_第3頁
C語言程序設計(第三版)課件第6章函數(shù)_第4頁
C語言程序設計(第三版)課件第6章函數(shù)_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章函數(shù)

函數(shù)是C語言程序的基本模塊,由于采用了函數(shù)模塊式的結構,C語言易于實現(xiàn)結構化程序設計,使程序的結構清晰、減少重復編寫程序的工作量、提高程序的可讀性和可維護性。函數(shù)的定義與調用函數(shù)間的數(shù)據(jù)傳遞方法函數(shù)的遞歸調用變量的作用域和存儲類型編譯預處理命令6.1函數(shù)概述如果軟件可劃分為可獨立命名和編程的部件,則每個部件稱為一個模塊。模塊化就是把系統(tǒng)劃分成若干個模塊,每個模塊完成一個子功能,把這些模塊集中起來組成一個整體,從而完成指定的功能,滿足問題的要求。6.1.2函數(shù)的概念根據(jù)模塊化設計的原則,一個較大的程序一般應分為若干個程序模塊,每一個模塊用于實現(xiàn)一個特定的功能。在不同的程序設計語言中,模塊實現(xiàn)的方式有所不同。在C語言中,模塊用函數(shù)來實現(xiàn)。在C語言中,函數(shù)分為以下兩種:(1)標準庫函數(shù)這種函數(shù)用戶不必定義,但可直接使用。例如scanf()、printf()、fabs()、sprt()、exp()、sin()、cos()等都是C語言中常用的庫函數(shù)。(2)用戶自己定義的函數(shù)這種函數(shù)用以解決用戶的專門問題,一般由用戶自己編寫。【例6.1】從鍵盤輸入兩個正整數(shù)m和n,求m!/(m-n)!的值。voidmain(){intm,n;intp(int);/*聲明本函數(shù)中要調用的函數(shù)p()是整型,有一個整型參數(shù)*/scanf("%d,%d",&m,&n);if(m>n)printf("%d",p(m)/p(m-n));elseprintf("m<n!\n");}intp(intk)/*計算階乘的函數(shù)*/{ints,i;s=1;for(i=1;i<=k;i++)s*=i;return(s);}⑶C語言中的函數(shù)沒有從屬關系,各函數(shù)之間互相獨立,可以相互調用,但不能嵌套定義。

(1)一個完整的C程序可以由若干個函數(shù)組成,其中必須有一個且只能有一個主函數(shù)main()。C程序總是從主函數(shù)開始執(zhí)行(不管它在程序中的什么位置),而其他函數(shù)只能被調用。(2)一個完整C程序中的所有函數(shù)可以放在一個文件中;也可以放在多個文件中。例如,上述C程序中的兩個函數(shù)可以分別放在兩個文件中(主函數(shù)的文件名為sp.c,函數(shù)P()的文件名為spl.c)。voidmain(){intm,n;intp(int);scanf("%d,%d",&m,&n);if(m>n)printf("%d",p(m)/p(m-n));elseprintf("m<n!\n");}intp(intk){ints,i;s=1;for(i=1;i<=k;i++)s*=i;return(s);}#include"sp1.c"voidmain(){intm,n;intp(int);scanf("%d,%d",&m,&n);if(m>n)printf("%d",p(m)/p(m-n));elseprintf("m<n!\n");}intp(intk){ints,i;s=1;for(i=1;i<=k;i++)s*=i;return(s);}函數(shù)的分類

在C語言中,函數(shù)分為以下兩種:(1)標準庫函數(shù)(2)用戶自己定義的函數(shù)

這種函數(shù)用戶不必定義,但可直接使用。例如scanf()、printf()、fabs()、sprt()、exp()、sin()、cos()等都是C語言中常用的庫函數(shù),C語言功提供了六大類的庫函數(shù),比如數(shù)學函數(shù),字符函數(shù),字符串函數(shù)(P359附錄B)等。#include“*.h"

#include"stdio.h"

函數(shù)的聲明與定義

當用戶需要利用函數(shù)來完成某一項的任務,又沒有相應的庫函數(shù)可以使用時,就必須寫一個函數(shù)來完成指定的任務。在編寫的函數(shù)時候,必須遵循先聲明、后定義、再使用的原則,也就是說先要定義好函數(shù)的數(shù)據(jù)類型、存儲類型和函數(shù)體,然后才能使用。#include"stdio.h"main(){

inta,b,c,max,min,t;

intmax2(intx,inty);intmin2(intx,inty);voidpaixu3(intx,inty,intz);

scanf("%d%d%d",&a,&b,&c);

max=max2(a,b);max=max2(max,c);min=min2(a,b);min=min2(min,c);paixu3(a,b,c);

printf("max=%d,min=%d\n",max,min);

}

函數(shù)的聲明函數(shù)的調用函數(shù)定義intmax(intx,inty){intm;if(x>y)m=x;elsem=y;returnm;}函數(shù)返回值的類型函數(shù)名形參的數(shù)據(jù)類型形參名函數(shù)體聲明部分執(zhí)行部分6.2.2函數(shù)的參數(shù)和返回值函數(shù)的參數(shù)分為形式參數(shù)和實際參數(shù)兩種。形式參數(shù)(形參):函數(shù)定義時設定的參數(shù)。實際參數(shù)(實參):調用函數(shù)時所使用的實際的參數(shù)。形參和實參的功能是進行數(shù)據(jù)傳遞。發(fā)生函數(shù)調用時,主調函數(shù)把實參的值傳遞給被調函數(shù)的形參,從而實現(xiàn)主調函數(shù)向被調函數(shù)的數(shù)據(jù)傳遞。C語言可以從函數(shù)(被調用函數(shù))返回值給調用函數(shù)(這與數(shù)學函數(shù)相當類似)。在函數(shù)內是通過return語句返回值的。使用return語句能夠返回一個值或不返回值(此時函數(shù)類型是void)。return語句的格式為:return[表達式];或return(表達式);說明:(1)函數(shù)的類型就是返回值的類型,return語句中表達式的類型應該與函數(shù)類型一致。如果不一致,以函數(shù)類型為準(賦值轉化)。(2)函數(shù)類型省略,默認為int。(3)如果函數(shù)沒有返回值,函數(shù)類型應當說明為void(空類型)。6.2.3函數(shù)的聲明函數(shù)定義的位置可以在調用它的函數(shù)之前,也可以在調用它的函數(shù)之后,甚至可位于其他的源程序模塊中。若函數(shù)定義位置在前,函數(shù)調用在后,不必聲明,編譯程序產(chǎn)生正確的調用格式。若函數(shù)定義在調用它的函數(shù)之后或者函數(shù)在其他源程序模塊中,且函數(shù)類型不是整型,這時,為了使編譯程序產(chǎn)生正確的調用格式,可以在函數(shù)使用前對函數(shù)進行聲明。函數(shù)聲明的格式為:函數(shù)類型函數(shù)名([形式參數(shù)表]);.h文件內許多都是函數(shù)聲明,當源程序要使用庫函數(shù)時,就應當包含相應的頭文件。6.3函數(shù)的調用一個函數(shù)調用另一個函數(shù)稱為函數(shù)調用,其調用者稱為主調函數(shù),被調用者稱為被調函數(shù)。函數(shù)調用的一般形式在C語言中,調用函數(shù)主要有以下三種方式:1.函數(shù)語句形式函數(shù)只進行某些操作而不返回函數(shù)值,這時的函數(shù)調用可作為一條獨立的語句。voidmax(inta,intb){intm;m=(a>b)?a:b;printf("較大數(shù)=%d\n",m);}voidmain(){intx=5,y=9;

max(x,y);}2.函數(shù)表達式形式

函數(shù)作為表達式的一項,出現(xiàn)在表達式中,以函數(shù)返回值參與表達式的運算,這種方式要求函數(shù)必須有返回值。intmax(inta,intb){intm;m=(a>b)?a:b;return(m);}main(){intx=5,y=9,z;z=max(x,y);printf("較大數(shù)=%d\n",z);}voidmax(inta,intb){intm;m=(a>b)?a:b;printf("較大數(shù)=%d\n",m);}main(){intx=5,y=9;

max(x,y);}返回值的類型2、函數(shù)調用的一般形式3.函數(shù)實參形式

函數(shù)作為另一個函數(shù)調用的實際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實參進行傳送,因此要求該函數(shù)必須有返回值。intmax(inta,intb){intm;m=(a>b)?a:b;return(m);}voidmain(void){intx=5,y=9,z=10;printf("較大數(shù)=%d\n",max(max(x,y),z));}函數(shù)參數(shù)的傳遞方式

發(fā)生函數(shù)調用時,實參與形參的傳遞方式有兩種:1、值傳遞方式2、地址傳遞方式。值傳遞方式

如果參數(shù)傳遞的是數(shù)據(jù)本身,就稱為“值傳遞”。

C語言規(guī)定,數(shù)值只能由實參傳遞給形參,形參不能反過來傳值給實參,即傳值是單向的。也就是說,形參的任何變化不會影響到實參。

值傳遞過程如下:

①發(fā)生函數(shù)調用時,系統(tǒng)臨時創(chuàng)建形參變量;②實參將其數(shù)值復制一份給形參變量;③函數(shù)調用過程中,形參的任何改變只發(fā)生在被調函數(shù)內部,不會影響到實參;④當被調函數(shù)運行結束返回主調函數(shù)時,形參的存儲空間被自動釋放。用時建立、用完釋放

以下程序試圖通過調用swap()函數(shù),交換主函數(shù)中變量x、y的數(shù)值。根據(jù)程序代碼以及運行結果,思考主函數(shù)中變量x、y中的數(shù)值真的實現(xiàn)交換了嗎?為什么?五、應用舉例voidswap(inta,intb) {intt;printf("(2)a=%d,b=%d\n",a,b);t=a;a=b;b=t;printf("(3)a=%d,b=%d\n",a,b);}voidmain(){intx=2,y=4;printf("(1)x=%d,y=%d\n",x,y);swap(x,y); printf("(4)x=%d,y=%d\n",x,y);}xy24ab24t242(1)

x=2,y=4(2)

a=2,b=4(3)

a=4,b=2(4)

x=2,y=46.3.3函數(shù)的嵌套調用

C語言中函數(shù)定義都是互相平行、獨立的,也就是說在定義函數(shù)時,一個函數(shù)內不能包含另一個函數(shù)。C語言不能嵌套定義函數(shù),但可以嵌套調用函數(shù),也就是說,在調用一個函數(shù)的過程中,又調用另一個函數(shù)?!纠坑嬎?。longf1(intp){intk;longr;longf2(intq);k=p*p;

r=f2(k);

returnr;}main(){inti;longs=0;for(i=2;i<=3;i++)s=s+f1(i);printf("s=%ld\n",s);}longf2(intq){longc=1;inti;for(i=1;i<=q;i++)c=c*i;

returnc;}6.3.4函數(shù)的遞歸調用一個函數(shù)在它的函數(shù)體內調用它自身的過程稱為遞歸調用,遞歸調用表現(xiàn)為直接調用自己或間接調用自己兩種方式,也就是一個函數(shù)的執(zhí)行過程中出現(xiàn)直接或間接調用該函數(shù)自身的行為。前者稱為直接遞歸調用,后者稱為間接遞歸調用。這種函數(shù)稱為遞歸函數(shù)。intage(intn) {intc; if(n==1)c=10;elsec=age(n-1)+2;return(c);}【例6.6】有5個人坐在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2歲。問第3個人,又說比第2個人大2歲。問第2個人,說比第一個人大2歲。最后問第1個人,他說是10歲。請問第5個人多大。#include"stdio.h"voidmain(){printf("%d\n",age(5));}intage(intn) {intc; c=age(n-1)+2;return(c);}age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(l)+2age(l)=10intage(intn) {intc;

if(n==1)c=10;elsec=age(n-1)+2;return(c);}【例2】用遞歸法求n!for(i=1,p=1;i<=n;i++)p=p*i;n!=n*(n-1)!;(n-1)!=(n-1)*(n-2)!;long

ff(intn){longf;

f=ff(n-1)*n;

return(f);}if(n==0||n==1)f=1;elsemain(){intn;scanf("%d",&n);printf("%d!=%ld",n,ff(n));}遞歸算法的特點

任務具有相似性:age(n)=age(n-1)+2n!=n*(n-1)!;設計出口:if(n==1)c=10;if(n==0||n==1)f=1;【例5.22】某幼兒園按如下方法依次給A,B,C,D,E五個小孩發(fā)蘋果。將全部蘋果的一半加上二分之一個蘋果發(fā)放給第一個小孩;將剩下蘋果的三分之一在家三分之一個蘋果發(fā)給第二個小孩;將剩下蘋果的四分之一再加四分之一個蘋果發(fā)給第三個小孩;將剩下蘋果的五分之一再加五分之一個蘋果發(fā)給第四個小孩;將最后剩下的11個蘋果發(fā)給第五個小孩。每個小孩得到的蘋果數(shù)均為整數(shù)。編制一個C程序,確定原來共有的多少個蘋果?

floatfun(floatn){floata;if(n>=5)return11;a=fun(n+1)+1/(n+1);a=a*(n+1)/n;returna;}intmain(){floati;i=fun(1);printf("%8.2f\n",i);return0;}局部變量和全局變量

1、局部變量

局部變量也稱為內部變量。局部變量是在函數(shù)內作定義說明的。其作用域僅限于函數(shù)內。floatf1(inta){intb,c;…….}charf2(intx){inty,z;……}main(){intm,n;…….}a,b,c作用域x,y,z作用域m,n作用域【例】分析程序的執(zhí)行結果。voidmain(){inti=2,j=3,k;k=i+j;{intk=8;printf("%d\n",k);}printf("%d\n",k);}i2j3k5k885全局變量

全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。它不屬于哪一個函數(shù),而屬于一個源程序文件。其作用域是從定義變量的位置開始到本源文件結束?!纠?.9】輸入正方體的長寬高l,w,h,求體積及三個面的面積。ints1,s2,s3;intvs(inta,intb,intc){intv;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;returnv;}voidmain(){intv,l,w,h;scanf("%d,%d,%d",&l,&w,&h);v=vs(l,w,h);printf("v=%d,s1=%d,s2=%d,s3=%d\n“,v,s1,s2,s3);return0;}全局變量(1)如果全局變量在文件的開頭定義,則在整個文件范圍內均可以使用該全局變量;如果不在文件的開頭定義,又想在定義點之前使用該全局變量,需要用extern進行聲明。

(2)在同一個源文件中,允許全局變量與局部變量同名。在局部變量的作用范圍內,全局變量被“屏蔽”,即它不起作用。(3)如果沒有全局變量,函數(shù)只能通過參數(shù)與外界發(fā)生數(shù)據(jù)聯(lián)系,有了全局變量以后,增加了一條與外界傳遞數(shù)據(jù)的渠道。這種方法有利有弊。

【例3】編寫程序,輸入兩個數(shù),調用函數(shù)找出最大值。intmymax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}voidmain(){externa,b;/*全局變量聲明*/scanf("%d,%d",&a,&b);printf("max=%d\n",mymax(a,b));}inta,b;/*全局變量定義*/【例6.10】全局變量與局部變量同名。inta=3,b=5; //a,b為全局變量intmymax(intx,inty) //x,y,c為局部變量{intc;c=x>y?x:y;return(c);}voidmain(){inta=8;//a為局部變量

printf("%d\n",mymax(a,b));return0;}

【例6.12】全局變量的副作用。

inti;voidmain(){voidprt();for(i=0;i<5;i++)prt();return0;}voidprt(){for(i=0;i<5;i++)printf("%c",'*');printf("\n");return0;}******************************變量的存儲屬性

變量的存儲屬性包括變量的存儲類型、變量的生存期和變量的作用域。

C語言中,用的“存儲屬性”分為4類:register,auto,static,extern。

1、自動變量(auto)

[auto]數(shù)據(jù)類型

變量名[=初值表達式],…;例如:autointa=3,b=5;inta=3,b=5;

用時開辟空間,用完就釋放空間

用時開辟空間,用完就釋放空間【例6.13】有下列函數(shù),體會調用的過程voidmain(){/*①*/intx=1;{/*③*/voidprt();intx=3;prt();

printf("2ndx=%d\n",x);

}/*④*/printf("1stx=%d\n",x);return0;}/*voidprt(){/*⑤*/intx=5;printf("3thx=%d\n",x);return0;}/*⑥*/

i由所在的存儲單元中當時的狀態(tài)來決定。

【例6.14】使用未賦初值的自動變量。#include"stdio.h"voidmain(){inti;printf("i=%d\n",i);return0;}2、寄存器變量(register)

寄存器變量屬于動態(tài)變量,它與auto變量的區(qū)別是:register變量的值存放在CPU的寄存器中,auto變量的值存放在內存單元中。程序運行時,CPU訪問寄存器的速度比訪問內存的速度快,因此把變量設置為register型將提高程序運行的速度。

定義的格式為:

register

數(shù)據(jù)類型

變量名表;registerintx;應用舉例

intfac(intn){

registerintx,y=1

for(x=1;x<=n;x++)

y=y*x;return(y);}voidmain(){inti;for(i=0;i<=5;i++)printf("%d!=%d\n",i,fac(i));return0;}【例6.15】體會使用寄存器變量靜態(tài)變量(static)

static數(shù)據(jù)類型

變量名[=初始化常量表達式],…;定義的格式為:

第1次a2i0a2b0c3147第2次2ai14ca2b0158第3次22ai5ca2b0169【例6.16】請仔細考察靜態(tài)局部變量值的存儲過程。#include"stdio.h"intf(inta){autointb=0;

staticintc=3;/*靜態(tài)變量*/b=b+1;c=c+1;return(a+b+c);}voidmain(){inta=2,i;for(i=0;i<3;i++)printf("%d\n",f(a));}外部變量

外部變量(即全局變量)是在函數(shù)的外部定義的,其作用域為從變量定義處開始,到本程序文件末尾。

如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件的末尾。如果在定義點之前的函數(shù)想引用該外部變量,則應該在引用之前用關鍵字extern對該變量作“外部變量聲明”,表示該變量是一個已經(jīng)定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。【例6.17】用extern聲明外部變量,擴展程序文件中的作用域。intmymax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){externa,b;printf("%d\n",mymax(a,b));}inta=13,b=-8;【例6.17】已知半徑為5.0,計算以此為半徑的圓的周長和面積,以及圓球體的體積。#include"stdio.h"#defineR5.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*R#defineV4.0/3.0*PI*R*R*Rmain(){printf("L=%f\nS=%f\nV=%f\n",L,S,V);}6.6編譯預處理編譯預處理是在編譯前對源程序進行的一些預處理。預處理由編譯系統(tǒng)中的預處理程序按源程序中的預處理命令進行。C語言的預處理命令均以“#”打頭,末尾不加分號,以區(qū)別于C語句。它們可以出現(xiàn)在程序中的任何位置,其作用域是自出現(xiàn)點到所在源程序的末尾。6.6.1宏定義在C語言源程序中允許用一個標識符來表示一個字符串,稱為“宏”。被定義為“宏”的標識符稱為“宏名”。在編譯預處理時,對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的,宏代換是由預處理程序自動完成的。在C語言中,“宏”分為有參數(shù)和無參數(shù)兩種。宏定義1.無參宏定義無參宏的宏名后不帶參數(shù)。其定義的一般形式為:#define宏名字符串其中,作為宏名的標識符習慣上用有意義且易理解的大寫字母來表示,“字符串”可以是常數(shù)、表達式或格式串等。宏定義一般寫在文件開頭函數(shù)體的外面,有效范圍是從定義宏命令之后到遇到終止宏定義命令#undef為止,否則其作用域將一直到源文件結束。例如:#definePI3.1415926對于宏定義還要說明以下幾點:(1)宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的代換,字符串中可以含任何字符,可以是常數(shù),也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)。(2)如果在一行中寫不下整個宏定義,需要用兩行或更多行來書寫時,只需在每行的最后一個字符的后面加上反斜桿“\”,并在下一行的最開始接著寫即可。(3)宏定義必須寫在函數(shù)之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。(4)宏名在源程序中若用引號括起來,則預處理程序不對其作宏代換。(5)宏定義允許嵌套,在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開時由預處理程序層層代換。#definePI3.14159voidmain(){……}#undefPIf1(){……}表示PI只在main函數(shù)中有效,在f1中無效。printf("PI=",PI);在預處理時,將只對第二個PI進行代換,而對第一個雙引號中的PI,系統(tǒng)并不對其作代換。執(zhí)行該語句會輸出:PI=3.1415926#defineR5.6#definePI3.1415926#defineL2*PI*R#defineSPI*R*R/*PI,R是已定義的宏名*/在宏展開時,編譯器會把程序中的R用5.6來代換,把PI用3.1415926來代換,而將S用3.1415926*5.6*5.6來代換。【例6.18】已知半徑為5.0,計算以此為半徑的圓的周長和面積,以及圓球體的體積。#include"stdio.h"#defineR5.0#definePI3.1415926#defineSPI*R*R#defineV4.0/3.0*PI*R*R*Rvoidmain(){printf("L=%f\nS=%f\nV=%f\n",L,S,V);}帶參宏定義C語言允許宏帶有參數(shù)。在宏定義中的參數(shù)稱為形式參數(shù),在宏調用中的參數(shù)稱為實際參數(shù)。對帶參數(shù)的宏,在調用中,不僅要進行宏展開,而且要用實參去代換形參。帶參宏定義的一般形式為:#define宏名(形參表列)字符串在字符串中含有各個形參。帶參宏調用的一般形式為:宏名(實參表列);宏展開后該語句為:mymax=(x>y)?x:y;【例6.18】求兩數(shù)中較大者。#include"stdio.h"#defineMAX(a,b)(a>b)?a:bvoidmain(){intx,y,mymax;printf("請輸入x,y的值:\n");scanf("%d,%d",&x,&y);mymax=MAX(x,y);printf("max=%d\n",mymax);}#defineM(y)y*y+3*y/*宏定義*/……k=M(5);/*宏調用*/……在宏調用時,用實參5去代替形參y,經(jīng)預處理宏展開后的語句為:k=5*5+3*5;說明:

(1)帶參宏定義中,宏名和形參表之間不能有空格出現(xiàn)。#defineMAX(a,b)(a>b)?a:b將被認為是無參宏定義,宏名MAX代表字符串(a,b)(a>b)?a:b。宏展開時,宏調用語句:mymax=MAX(x,y);將變?yōu)椋簃ymax=(a,b)(a>b)?a:b(x,y);(2)在帶參宏定義中,形式參數(shù)不分配內存單元,因此不必作類型定義。而宏調用中的實參有具體的值,要用它們去代換形參,因此必須作類型說明。(3)在宏定義中的形參是標識符,而宏調用中的實參可以是表達式。#defineSQ(y)(y)*(y)……sq=SQ(a+1);……得到如下語句:sq=(a+1)*(a+1);(4)在宏定義中,字符串內的形參通常要用括號括起來以避免出錯。#defineF(x)x*x*xmain(){doublef,x;scanf("%lf",&x);f=F(x)+F(x+1);printf("f=%f\n",f);return0;}【例6.20】計算下列函數(shù)值:其中自變量的值從鍵盤輸入。#defineF(x)(x)*(x)*(x)main(){doublef,x;scanf("%lf",&x);f=F(x)+F(x+1);printf("f=%f\n",f);}main(){doublef,x;scanf("%lf",&x);f=(x)*(x)*(x)+(x+1)*(x+1)*(x+1);printf("f=%f\n",f);}(5)帶參的宏和帶參函數(shù)很相似,但有本質上的不同,除上面已講到的幾點外,把同一表達式用函數(shù)處理與用宏處理兩者的結果有可能是不同的?!纠?.22】用用戶自定義函數(shù)求

。#include"stdio.h"voidmain(){inti=1;while(i<=5)printf("%d\n",sq(i++));}intsq(inty){return((y)*(y));}【例6.23】用宏定義函數(shù)求。#include"stdio.h"#defineSQ(y)((y)*(y))voidmain(){inti=1;while(i<=5)printf("%d\n",SQ(i++));}6.6.2文件包含文件包含命令行的一般形式為:#include"文件名"文件包含命令的功能是把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當前的源程序文件連成一個源文件。說明:(1)文件包含命令中的文件名可以用雙引號括起來,也可以用尖括號括起來。(2)一個include命令只能指定一個被包含文件,若有多個文件要包含,則需用多個include命令。(3)文件包含允許嵌套,即在一個被包含的文件中又可以包含另一個文件。6.6.2文件包含【例6.24】將求圓球體體積的函數(shù)作為頭文件,并在其他程序中使用該函數(shù)。將以下程序源代碼保存到文件sphere.h中:#definePI3.1415926floatvolumn(floatr){floatv;v=4.0/3.0*PI*r*r*r;returnv;}程序如下:#include"sphere.h"#include"stdio.h"voidmain(){floatr,v;printf("r=");scanf("%f",&r);v=volumn(r);printf("PI=%f\nvolumn=%f\n",PI,v);}6.6.3條件編譯預處理程序提供了條件編譯的功能??梢园床煌臈l件去編譯不同的程序部分,因而產(chǎn)生不同的目標代碼文件。

(1)第一種形式:#ifdef標識符程序段1#else

程序段2#endif其中,標識符是指已用宏命令#define定義的宏名,而程序段可以是編譯預處理命令行,也可以是C語言組。它的功能是:如果標識符已被#define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯?!纠?.25】條件編譯命令的使用。#include"stdio.h"#defineREALfloatvoidmain(){#ifdefREALREALa;printf("輸入一個實數(shù):");scanf("%f",&a);printf("這個實數(shù)是:%f\n",a);#elsefloata;printf("輸入一個單精度浮點數(shù):");scanf("%f",&a);printf("這個單精度浮點數(shù)是:%f\n",a);#endif}運行結果為:輸入一個實數(shù):4.56這個實數(shù)是:4.560000經(jīng)過編譯預處理后,上述程序變成如下形式:voidmain(){REALa;printf("輸入一個實數(shù):");scanf("%f",&a);printf("這個實數(shù)是:%f\n",a);}(2)第二種形式:#ifndef標識符程序段1#else

程序段2#endif它的功能是:如果標識符未被#define命令定義過則對程序段1進行編譯,否則對程序段2進行編譯。(3)第三種形式:#if表達式程序段1#else

程序段2#endif它的功能是:如表達式的值為“真”(非0),則對程序段1進行編譯,否則對程序段2進行編譯。因此可以使程序在不同條件下完成不同的功能。【例6.25】條件編譯命令的使用。#include"stdio.h"#defineREALfloatvoidmain(){#ifdefREALREALa;printf("輸入一個實數(shù):");scanf("%f",&a);printf("這個實數(shù)是:%f\n",a);#elsefloata;printf("輸入一個單精度浮點數(shù):");scanf("%f",&a);printf("這個單精度浮點數(shù)是:%f\n",a);#endif}6.7應用舉例【例6.25】編寫一個程序完成“菜單”功能:提供三種選擇途徑:其一是秋水仙花數(shù)(所謂水仙花數(shù)是指3為整數(shù)的各位上數(shù)字的立方和等于該整數(shù)本身。例如153就是一個水仙花數(shù):153=13+53+33)。找出100~999之間的水仙花數(shù)。其二是查找素數(shù),找出2~n之間的素數(shù)。其三是求Faibonacci數(shù)列前n項的值。#include<stdio.h>#include<math.h>#include<stdlib.h>voidmain(){intm,xz;voidnarcissus();/*聲明求水仙花數(shù)的函數(shù)*/voidprime();/*聲明查找素數(shù)的函數(shù)*/voidfaibonacci();/*聲明求Faibonacci數(shù)列前n項的函數(shù)*/system("cls");m=0;while(m==0){printf("\n");printf("1求水仙花數(shù)\n");printf("2查找素數(shù)\n");printf("3求Faibonacci數(shù)列前n項\n");printf("輸入了非法的數(shù)據(jù),退出!\n");printf("\n");printf("請輸入1~3中的一個數(shù)字:");scanf("%d",&xz);switch(xz)/*用開關語句switch進行選擇*/{case1:narcissus();break;/*若選擇1,求水仙花數(shù)*/case2:prime();break;/*若選擇2,求素數(shù)*/case3:faibonacci();break;/*若選擇3,求Faibonacci數(shù)列前n項的值*/default:m=1;/*若選擇其他講m置1,循環(huán)結束*/}}}voidnarcissus()/*此函數(shù)用于求水仙花數(shù)*/{intk,a,b,c,d;for(k=100;k<1000;k++){a=k/100;b=k/100/10;c=k%10;d=a*a*a+b*b*b+c*c*c;if(d==k)printf("%d\n",k);}}voidprime()/*此函數(shù)用于查找素數(shù)*/{inti,j,k,n,m=0;printf("請輸入一個數(shù):");scanf("%d",&n);for(i=2;i<=n;i++){j=sqrt(i);for(k=2;k<=j;k++)if(i%k==0)break;if(k>j){m++;printf("%3d",i);if(m%10==0)printf("\n");}}}voidfaibonacci()/*此函數(shù)用于求Faibonacci數(shù)列前n項的值*/{longintf,f1=1,f2=1;inti,n;printf("請輸入n:");scanf("%d",&n);printf("%8ld%8ld",f1,f2);for(i=3;i<=n;i++){f=f1+f2;f1=f2;/*存放第一個數(shù)*/f2=f;/*存放第二個數(shù)*/printf("%8ld",f);if(i%6==0)/*為打印整齊,一行打印6個數(shù),滿6個數(shù)換行*/printf("\n");

溫馨提示

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

評論

0/150

提交評論