高級語言講課第23次課c2_第1頁
高級語言講課第23次課c2_第2頁
高級語言講課第23次課c2_第3頁
高級語言講課第23次課c2_第4頁
高級語言講課第23次課c2_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余33頁可下載查看

下載本文檔

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

文檔簡介

1、第九章 再論函數(shù)參數(shù)C參數(shù)傳遞規(guī)則指針作參數(shù)數(shù)組作參數(shù)結(jié)構(gòu)體作參數(shù)函數(shù)值返回指針值的函數(shù)返回結(jié)構(gòu)體值的函數(shù)作用域作用域局部量和全局量作業(yè): 9.9 練習(xí): 9.1 9.2 9.3 9.4 9.1 參數(shù)9.1.1 C參數(shù)傳遞規(guī)則 C只有值參數(shù)一種參數(shù)類別。函數(shù)調(diào)用時(shí)把實(shí)在參數(shù)的值傳送到形式參數(shù)中。值參數(shù)意味著: 1. 函數(shù)調(diào)用中,與值參數(shù)對應(yīng)的實(shí)在參數(shù)是一個表達(dá)式(單個變量,常量是表達(dá)式的特例),并且要求實(shí)在參數(shù)表達(dá)式與形式參數(shù)變量之間賦值兼容。 2. 當(dāng)程序運(yùn)行時(shí),調(diào)用函數(shù),進(jìn)行參數(shù)結(jié)合的動作是:首先計(jì)算實(shí)在參數(shù)表達(dá)式的值;把實(shí)參值按賦值轉(zhuǎn)換規(guī)則,轉(zhuǎn)換成形參的類型;把轉(zhuǎn)換后的實(shí)參值送入形參變量

2、中。 3. 在整個函數(shù)執(zhí)行期間,值參數(shù)表示形式參數(shù)本身,它是函數(shù)內(nèi)的一個局部變量,已經(jīng)與實(shí)在參數(shù)脫離關(guān)系,與實(shí)在參數(shù)無關(guān)了。在函數(shù)內(nèi)對形式參數(shù)的賦值不影響實(shí)在參數(shù)。 4. 當(dāng)函數(shù)執(zhí)行結(jié)束返回后,實(shí)在參數(shù)值無任何變化,還是調(diào)用函數(shù)之前的值。void p( int x , int y) y = x+y; printf(“%d %dn” , x,y ) ; void main(void) int u,v ; u = 3; v = 4; p( u , v ); printf(“%d %dn” , u , v ); p( 6 , u+v ); printf(“%d %d %dn” , u, v ,u+v

3、 ); 4內(nèi)存空間3p.yp.xmain.vmain.u3473 73 476136 133 4 7程序輸出:例9.1 C參數(shù)傳遞規(guī)則9.1.2 指針作參數(shù) 第五章例 5.2 求三角形重心, 傳遞直線方程的斜率、截距,讓人感到十分別扭 函數(shù)不能把多個計(jì)算結(jié)果帶回調(diào)用處,不得不使用全局變量 首先舉一個簡單例子,引進(jìn)指針做函數(shù)參數(shù)概念,然后改寫例 5.2 破壞了程序的模塊化結(jié)構(gòu),使程序變得難懂。使用指針參數(shù)可以解決這個問題。void swap(int *xx, int *yy) int temp; temp=*xx; *xx=*yy; *yy=temp; void main() int x,y;

4、scanf(%d %d, &x,&y); if(xy) swap(&x,&y); printf(n%dt%dn,x,y);63yx23422340返回值xx23462344yy234Atemp234Emainswap234023423 6 3 程序輸出:6 3例9.2 指針作參數(shù)#include / 括入標(biāo)準(zhǔn)輸入輸出函數(shù)庫頭文件float xa,ya,xb,yb,xc,yc; /分別保存三角形三個頂點(diǎn)點(diǎn)的X、Y方向坐標(biāo)float xd,yd,xe,ye ; /分別表示中點(diǎn)D、E坐標(biāo)float a1,b1,a2,b2,a,b;/分別表示中線AD、BE的方程系數(shù), a、b臨時(shí)變量float xo,

5、yo;/重心O的坐標(biāo)void lines( float xr,float yr,float xs,float ys,float xt,float yt ,float *a,float *b)/6 float xu,yu;/中點(diǎn)u坐標(biāo)/7 xu=(xs+xt)/2; /求st邊的中點(diǎn)u/8 yu=(ys+yt)/2;/9 *a=(yr-yu)/(xr-xu); /計(jì)算系數(shù)a;用指針參數(shù)帶回主程序/11 *b=yr - *a * xr ; /計(jì)算系數(shù)b;用指針參數(shù)帶回主程序/12/13main( ) / 主函數(shù)/14 printf(please input xa,ya,xb,yb,xc,yc:n)

6、; / 輸入/15 scanf(%f%f%f %f%f%f,&xa,&ya,&xb,&yb,&xc,&yc);/16 lines(xa,ya,xb,yb,xc,yc,&a1,&b1); /求BC邊的中線AD/17 lines(xb,yb,xa,ya,xc,yc,&a2,&b2); /求AC邊的中線BE/19 xo=(b2-b1)/(a1-a2); /求AD、BE交點(diǎn)O/21 yo=a1*xo+b1;/22 printf(“重心坐標(biāo):x=%10.3f y=%10.3f n”,xo,yo);/ 輸出 23 /24 【例9.3】改寫例5.2的程序,求三角形重心。 在該程序中,求中線函數(shù) lines

7、用指針參數(shù) a 、b 代替了原來的全局量和函數(shù)值來傳遞計(jì)算結(jié)果。使用形式是:函數(shù)聲明,增加指針參數(shù)a 、b ,把它聲明成指針類型;void lines( float xr,float yr ,float xs,float ys ,float xt,float yt , float *a , float *b )函數(shù)調(diào)用,用指針作實(shí)參,對應(yīng)形參。對應(yīng) BC 邊中線 AD 有:lines(xa,ya,xb,yb,xc,yc,&a1,&b1); /求BC邊的中線AD在函數(shù)內(nèi),對形參 a 、b 以間接尋址方式賦值,把值送入實(shí)參指針?biāo)赶蜃兞俊?*a=(yr-yu)/(xr-xu); /計(jì)算系數(shù)a;用指

8、針參數(shù)帶回主程序 *b=yr-a*xr ; /計(jì)算系數(shù)b;用指針參數(shù)帶回主程序函數(shù)調(diào)用 lines(xa,ya,xb,yb,xc,yc , &a1 , &b1 ) 執(zhí)行過程是:函數(shù)調(diào)用時(shí)實(shí)在參數(shù)把變量 a1 、b1 的指針分別送入形式參數(shù) a 、b中,因此 a 、b 分別指向 a1 、b1 ;函數(shù)內(nèi)部,以間接尋址方式賦值,分別通過 *a 、*b 把值送入 a 、b 所指的變量中,也就是 a1 、b1 中。當(dāng)函數(shù)返回后,a1 、b1 中自然是函數(shù)內(nèi)部給它們賦的值。 指針參數(shù),作用是相當(dāng)大的。 在函數(shù)內(nèi)部,指針參數(shù)變量可以指向它的調(diào)用處(外層程序)的其它變量,并訪問它(為它賦值)。 起到了其它程序

9、設(shè)計(jì)語言中變量參數(shù)的作用。 9.1.3 數(shù)組作參數(shù)【例9.4】重新觀察例 6.8 程序,使用“冒泡法”法對成績數(shù)組 a 進(jìn)行排序。#include stdio.h#define M 50int a M ; /* 數(shù)組從0開始編下標(biāo) */void sortofup ( int s M ,int n ) / 對數(shù)組s進(jìn)行冒泡排序 while ( flag ) / 掃描一次 flag = false ;/ 先假設(shè)本次無交換,flag為false for ( i=0 ; i si+1 ) r = si ; si = si+1 ; si+1 = r ; / 交換 flag=true;/ 有交換,則fla

10、g為true void main ( ) / 輸入 sortofup ( a ,M );/ 排序 / 輸出在該程序中,把被排序數(shù)組作為函數(shù)的參數(shù)使用數(shù)組作函數(shù)參數(shù)的形式一般是: 形式參數(shù)用數(shù)組聲明符說明。例如,函數(shù)sortofup中的s 實(shí)在參數(shù)用數(shù)組名對應(yīng)形式參數(shù)數(shù)組。例如,調(diào)用函數(shù)sortofup使用a對應(yīng)s函數(shù)調(diào)用 sortofup ( a ,M )把數(shù)組 a 的首地址送入函數(shù) sortofup 的形式參數(shù) s 中。在函數(shù)執(zhí)行期間,形式參數(shù)s指向?qū)嵲趨?shù)數(shù)組 a ,用 a 參與進(jìn)一步運(yùn)算。 C 參數(shù)都是值方式的,但是數(shù)組參數(shù)傳遞給函數(shù)的值不是整個數(shù)組的值,而是數(shù)組名的值,也就是實(shí)在參數(shù)數(shù)

11、組的首地址。在函數(shù)內(nèi)不給形式參數(shù)開辟數(shù)組存儲空間,只給它開辟一個指針空間。事實(shí)上C把數(shù)組參數(shù)當(dāng)作指針來處理。 省略數(shù)組形式參數(shù)最外層的尺寸最外層的尺寸對計(jì)算數(shù)組元素的地址不起作用,在對數(shù)組參數(shù)的形式參數(shù)聲明時(shí),可以省略最外層尺寸, sortofup ( int sM,int n ) 可以寫成: sortofup ( int s ,int n )多維情況也是這樣。例如 int q ( float y 20 ) 聲明兩維數(shù)組參數(shù) y ,y 每行 20 個元素,具體多少行不確定。數(shù)組參數(shù)可以有各種變形與數(shù)組初值一樣,省略尺寸的只能是最外層,下述函數(shù)定義說明符都是錯誤的。 int r ( float

12、z ) int s ( float z10 ) int t ( float z10 20 ) 數(shù)組名實(shí)質(zhì)是指針,那么除了形式參數(shù)和實(shí)在參數(shù)都是數(shù)組這種普通形式外,形參和實(shí)參還可以使用數(shù)組形式和指針形式的各種組合。包括:形式參數(shù)使用數(shù)組形式, 實(shí)在參數(shù)使用指針形式形式參數(shù)使用指針形式, 實(shí)在參數(shù)使用數(shù)組形式形式參數(shù)、實(shí)在參數(shù)都使用指針形式下邊再舉幾個數(shù)組參數(shù)的例題請讀者從中體會數(shù)組參數(shù)各種變形【例9.5】編函數(shù),把給定數(shù)組中的n個整數(shù)反序存放。解:void inv(int x,int n)int temp,i,j;for(i=0;i=(n-1)/2;i+)j=n-1-i;temp=xi;xi=x

13、j;xj=temp;設(shè)有聲明 int a10,*pa=a則可以用 inv(a,10) inv(pa,10)調(diào)用該函數(shù)。該函數(shù)還可以把數(shù)組參數(shù)看作指針參數(shù),用指針形式編成:void inv(int *x,int n)int temp,*i,*j;/ j從后向前變化,i從前向后變化for(i=x,j=x+n-1; i=x+(n-1)/2; i+,j-)temp = *i;/ temp保存 i 所指數(shù)組元素xi的值*i = *j; / xj 的值送入 xi*j = temp;/ 把temp中保存的xi的值送入xj這個函數(shù)與前一個完成同樣功能,可以使用相同的方式調(diào)用。設(shè)有聲明 int a10,*pa=

14、a則可以用 inv(a,10) inv(pa,10)調(diào)用該函數(shù)。例9.6 編函數(shù),從n個整數(shù)中找出最大和最小的數(shù)。void max_min_value( int x , int n , int *max , int *min)int *p;*max = *min = *x;/ 把x0送入max、min所指變量中for(p=x+1; p *max)/ 求極大值,p指向當(dāng)前數(shù)組元素*max = *p;/ max指向極大值單元if (*p birthdate );writedate(effectivedate , card0-effectivedate );觀察 writedate(“ birthd

15、ate”, card0- birthdate ) : 函數(shù)調(diào)用使用結(jié)構(gòu)體變量card0- birthdate作實(shí)在參數(shù),把 card0- birthdate 的值傳遞給形式參數(shù) date0。在writedate內(nèi),date0 具有 out_answer 中 card0- birthdate值。 進(jìn)入writedate 后,date0 是 writedate 的局部變量,與out_answer 中的 card0- birthdate 無關(guān)。 在 writedate 內(nèi)調(diào)用 printf ,實(shí)參 date0.year , date0.month , date0.day 使用 date0 中的值(由

16、card0- birthdate傳遞過來的)。在函數(shù)之間,通過參數(shù)傳送結(jié)構(gòu)體值有兩種方法直接用結(jié)構(gòu)體變量作函數(shù)參數(shù)。用指向結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)。第二種方式就是指針作函數(shù)參數(shù),只不過相應(yīng)指針是指向結(jié)構(gòu)體類型變量的指針。與指向其它類型變量的指針沒有任何區(qū)別。在9.1.1已經(jīng)介紹過,同時(shí)例 8.9、8.10 中的函數(shù) out_anser、readdate 都使用過這種方式 。 函數(shù) out_anser 的定義說明符形式是:void out_answer( struct identitycard *card0 ) 形式參數(shù) card0 是指針參數(shù),將指向 struct identitycard

17、類型變量。函數(shù)調(diào)用out_answer(&groupcardk) 把結(jié)構(gòu)體變量 groupcardk 的指針(地址)傳遞給card0,使card0 指向 groupcardk。 在 out_anser 函數(shù)內(nèi),用 card0 訪問 groupcardk,以“間接成員選擇”方式訪問 groupcardk 的成員。 這種方式,若在函數(shù)內(nèi)修改形式參數(shù)所指變量值,則直接影響的實(shí)在參數(shù) 可以用這種方式從函數(shù)向主調(diào)用函數(shù)帶回值。 第一種方式與一般int類型、float類型參數(shù)一樣,傳遞實(shí)在參數(shù)的值到形式參數(shù)中,在函數(shù)內(nèi)部,形式參數(shù)是函數(shù)的一個局部變量,與實(shí)在參數(shù)無關(guān)。已經(jīng)介紹過,例8.10的writeda

18、te函數(shù)就是使用這種方式?!纠?.7】編程序,讀入月份數(shù),輸出該月份英文名稱。9.2 函數(shù)值9.2.1 打印月份名返回指針值的函數(shù)char *month_name(int);char *name=“illegal month”, “Jan”, ”Feb”, ”Mar”, ”Apr”, ”May”, ”Jun” , “Jul”, ”Aug”, ”Sep”, ”O(jiān)ct”, ”Nov”, ”Dec”;int main(void) int n; char *p; printf(“Input a number of a month:”); scanf(“%d”,&n); p = month_name(n

19、); printf( “It is %sn”,p);char *month_name(int m) if (m12) return name0 ; else return namem;程序運(yùn)行結(jié)果Input a number of a month:2It is Feb 函數(shù)返回類型不允許是數(shù)組類型和函數(shù)類型,除此之外允許一切類型,當(dāng)然允許指針類型本節(jié)僅介紹函數(shù)結(jié)果類型是一般指針類型的形式帶回指針值的函數(shù)的函數(shù)定義說明符形式是: 類型名 *函數(shù)名( 形式參數(shù)表 ) 例:float *f ( int x , int y )f 是函數(shù)名;x 和 y 是兩個 int 類型形參;該函數(shù)的返回類型是“ f

20、loat * ” 即指向 float 類型的指針??梢赃@樣解釋該函數(shù)定義說明符。按運(yùn)算符優(yōu)先級規(guī)定,“ * ” 的級別低于 “()”,f (int x, int y)是一個函數(shù),它的類型是 “ float *”,即函數(shù) f 的類型是 float 類型指針函數(shù)f 是返回指針值的函數(shù)。 在函數(shù)內(nèi),return 語句后邊的表達(dá)式類型必須是 類型名 * 若有聲明 float u , *v ;則,下述return語句都是正確的return &u; rerurn v;而語句 return u; 是錯誤的。 C指針函數(shù)只允許返回 全局變量指針 靜態(tài)變量指針 堆內(nèi)空間地址不允許把函數(shù)內(nèi)部聲明的局部變量指針(地

21、址)作為返回值。 #include stdio.hchar *Test(int x,int y) char a=T; char *pa=&a; return pa;void main()char * Te;Te=Test(4,5);printf(%cn,*Te);9.2.2 讀入一張身份證信息返回結(jié)構(gòu)體值的函數(shù) 回顧第八章例 8.9 中函數(shù) inputcard。struct identitycard inputcard( void ) struct identitycard card; int k; printf(nn new card:); printf(nplease input name

22、:); scanf(%s, ); printf(nplease input effectivedate date-); readdate(&(card.effectivedate); return card;inputcard函數(shù)的類型是結(jié)構(gòu)體類型struct identitycard表示函數(shù)返回值是一個結(jié)構(gòu)體值。在inputcard返回時(shí),使用語句return card;帶著變量 card 的值返回,card的類型正好是struct identitycard函數(shù)將帶著一個結(jié)構(gòu)體值返回到主函數(shù) main 中。 在主函數(shù)main中,以groupcardi = inputcard

23、( );調(diào)用函數(shù) inputcard。把 inputcard 帶回的結(jié)構(gòu)體值送入數(shù)組成分變量 groupcardi 函數(shù)的計(jì)算結(jié)果可能是一個結(jié)構(gòu)體值。在C中,有兩種途徑能夠把該結(jié)構(gòu)體值通過函數(shù)名字帶回調(diào)用函數(shù)的主程序。使用指針就是“返回指針的函數(shù)函數(shù)的結(jié)果類型是指向結(jié)構(gòu)體類型變量的指針類型直接使用結(jié)構(gòu)體類型剛剛介紹 inputcard 函數(shù)的結(jié)果類型是結(jié)構(gòu)體類型,直接把一個結(jié)構(gòu)體值帶回調(diào)用函數(shù)的主程序9.3 作用域9.3.1 作用域程序中聲明的標(biāo)識符有定義的區(qū)域。在一個標(biāo)識符的作用域內(nèi),使用它是合法的;在作用域之外不能使用相應(yīng)標(biāo)識符 。作用域是一個靜態(tài)概念描述從程序靜態(tài)行文上看,程序中一個被聲

24、明的標(biāo)識符起作用的范圍(一段程序行文)本節(jié)所涉及的內(nèi)容都是從程序的靜態(tài)行文上看C 標(biāo)識符作用域類別聲明的作用域頂層標(biāo)識符從聲明處到本源程序編譯單位文本結(jié)束函數(shù)定義中的形參從聲明處到函數(shù)體結(jié)束函數(shù)原型中的形參從聲明處到函數(shù)原型結(jié)束復(fù)合語句中聲明的標(biāo)識符從復(fù)合語句中聲明處到復(fù)合語句結(jié)束語句標(biāo)號相應(yīng)標(biāo)號聲明所在的整個函數(shù)體預(yù)處理器的宏從相應(yīng)宏定義的#define命令到本源程序編譯單位文本結(jié)束,或第一個取消相應(yīng)宏定義的#undef命令C中,每個源程序編譯單位,每個函數(shù)定義、函數(shù)原型、復(fù)合語句都各自構(gòu)成一個作用域區(qū)域。C規(guī)定: 在嵌套結(jié)構(gòu)中,若里層區(qū)域的一個標(biāo)識符與外層區(qū)域的某 標(biāo)識符同名,則外層標(biāo)識符

25、的作用域不包括里層那個同名 標(biāo)識符的作用域區(qū)域。 C 程序中使用的任意一個標(biāo)識符必須聲明;并且必須先聲 明后使用;在同一區(qū)域內(nèi)任何標(biāo)識符不得重復(fù)聲明。 【例9.8】下述應(yīng)用都是錯誤的 標(biāo)識符 k 沒有聲明標(biāo)識符 x 在同一作用域中重復(fù)聲明 int i,j; int f(void) . . k=i+j; float f( int x ) int x ; . . 第三行的 c 將被替換為2.0標(biāo)識符 index , t2 先使用后聲明 #define c 2.0 typedef int t ; t c,d,e; #define c 2.0 t2 y index ; typedef t2 float

26、 ; #define index 109.3.2 局部量和全局量由作用域規(guī)則可知一個函數(shù)或復(fù)合語句引入的標(biāo)識符只在本函數(shù)或復(fù)合語句內(nèi)有效,在本函數(shù)或復(fù)合語句外,便失去了它的意義稱它們是局部于聲明它們的函數(shù)或復(fù)合語句或稱該標(biāo)識符相對于聲明它們的函數(shù)或復(fù)合語句來講是局部量。 由作用域規(guī)則還可知 頂層聲明的標(biāo)識符在所有函數(shù)、復(fù)合語句內(nèi)都可以使用。 相對于函數(shù)和復(fù)合語句,稱之為全局量 若一個復(fù)合語句嵌套在某函數(shù)或復(fù)合語句之內(nèi),一個標(biāo)識符在其外層聲明,則在內(nèi)層復(fù)合語句中仍可使用這個標(biāo)識符。在外層中聲明的標(biāo)識符相對于其內(nèi)層是全局量全局量和局部量是一個相對概念。某標(biāo)識符相對于某復(fù)合語句是局部的,相對于其內(nèi)層

27、復(fù)合語句卻是全局的;反之某標(biāo)識符相對于里層某復(fù)合語句是全局的,但是相對于聲明它本身的那個復(fù)合語句來講卻是局部的。全局量在內(nèi)層具有外層同樣的意義在內(nèi)層對全局量的操作直接反應(yīng)在外層程序中 【例9.9】編程序計(jì)算調(diào)合級數(shù)前項(xiàng)和。要求結(jié)果是一個準(zhǔn)確的分?jǐn)?shù)形式。 開始 結(jié)束h=0i=1 TO nh=h+1/ih 約分/*PROGRAM the summation of a seriers*/ #include stdio.h /* 1 */int a,b,n; /* 2 */void add ( int ii ) /* 3 a、b使用全局量*/a = a * ii + b ; /* 4 */b = b

28、* ii ; /* 5 */ /* 6 */int gcd( int u , int v ) /* 7 */ int r ; /* 8 */ r=v; /* 9 */ while ( r!=0 ) /* 10 */ r = u % v ; /* 11 */ u = v ; /* 12 */ v = r ; /* 13 */ /* 14 */ return u ; /* 15 */ /* 16 */void reduce ( int *x , int *y ) /* 17 */ int g ; /* 18 */ g = gcd( *x,*y ) ; /* 19 */ *x = (*x) / g

29、; /* 20 */ *y = (*y) / g ; /* 21 */ /* 22 */void main( ) /* 23 */ int i ; /* 24 */ printf(please input the value of n:); /* 25 */ scanf(%d,&n); /* 26 */ a=0; /* 27 */ b=1; /* 28 */ for (i=1 ; i=n ; i+ ) /* 29 */ add( i ); /* 30 a、b使用全局量 */ reduce( &a , &b ); /* 31 */ /* 32 */ printf( %dn , a ) ; /*

30、33 */ printf( Hn = n); /* 34 */ printf( %dn , b ) ; /* 35 */ 程序中各個變量的作用域/*PROGRAM the summation of a seriers*/ #include stdio.h /* 1 */int a,b,n; /* 2 */void add ( int ii ) /* 3 a、b使用全局量*/a = a * ii + b ; /* 4 */b = b * ii ; /* 5 */ /* 6 */int gcd( int u , int v ) /* 7 */ int r ; /* 8 */ r=v; /* 9 *

31、/ while ( r!=0 ) /* 10 */ r = u % v ; /* 11 */ u = v ; /* 12 */ v = r ; /* 13 */ /* 14 */ return u ; /* 15 */ /* 16 */void reduce ( int *x , int *y ) /* 17 */ int g ; /* 18 */ g = gcd( *x,*y ) ; /* 19 */ *x = (*x) / g ; /* 20 */ *y = (*y) / g ; /* 21 */ /* 22 */變量a, b, n、函數(shù) main, add, reduce, gcd 在頂

32、層聲明是全局量。作用域是它們各自的聲明符以后直到整個程序文件結(jié)束。gcd 的形式參數(shù) u, v 復(fù)合語句中聲明的變量 r是局部于 gcd 的局部量。作用域是第 7、8 行它們各自的聲明符以后直到第 16 行。reduce 的形參 x, y 復(fù)合語句中聲明的變量 g 是局部于 reduce 的局部量。作用域是第 17、18 行它們各自的聲明以后到第 22 行add 的形式參數(shù) ii 在 add 中聲明是 add 的局部量作用域是第 3 行它的聲明符以后直到第 6 行。void main( ) /* 23 */ int i ; /* 24 */ printf(please input the va

33、lue of n:); /* 25 */ scanf(%d,&n); /* 26 */ a=0; /* 27 */ b=1; /* 28 */ for (i=1 ; i=n ; i+ ) /* 29 */ add( i ); /* 30 a、b使用全局量 */ reduce( &a , &b ); /* 31 */ /* 32 */ printf( %dn , a ) ; /* 33 */ printf( Hn = n); /* 34 */ printf( %dn , b ) ; /* 35 */ 變量 i 在主函數(shù) main 中聲明是 main 的局部量。作用域是第 24 行它的聲明符以后直

34、到第36行/*PROGRAM the summation of a seriers*/ #include stdio.h /* 1 */int a,b,n; /* 2 */void add ( int ii ) /* 3 a、b使用全局量*/a = a * ii + b ; /* 4 */b = b * ii ; /* 5 */ /* 6 */int gcd( int u , int v ) /* 7 */ int r ; /* 8 */ r=v; /* 9 */ while ( r!=0 ) /* 10 */ r = u % v ; /* 11 */ u = v ; /* 12 */ v =

35、 r ; /* 13 */ /* 14 */ return u ; /* 15 */ /* 16 */void reduce ( int *x , int *y ) /* 17 */ int g ; /* 18 */ g = gcd( *x,*y ) ; /* 19 */ *x = (*x) / g ; /* 20 */ *y = (*y) / g ; /* 21 */ /* 22 */在本程序的執(zhí)行過程中:void main( ) /* 23 */ int i ; /* 24 */ printf(please input the value of n:); /* 25 */ scanf(%d

36、,&n); /* 26 */ a=0; /* 27 */ b=1; /* 28 */ for (i=1 ; i=n ; i+ ) /* 29 */ add( i ); /* 30 a、b使用全局量 */ reduce( &a , &b ); /* 31 */ /* 32 */ printf( %dn , a ) ; /* 33 */ printf( Hn = n); /* 34 */ printf( %dn , b ) ; /* 35 */ 第 30 行調(diào)用函數(shù)add作加法。以 i 作實(shí)在參數(shù)對應(yīng)形式參數(shù) ii ,把 i 的值送入 ii 之中,參與運(yùn)算。/*PROGRAM the summat

37、ion of a seriers*/ #include stdio.h /* 1 */int a,b,n; /* 2 */void add ( int ii ) /* 3 a、b使用全局量*/a = a * ii + b ; /* 4 */b = b * ii ; /* 5 */ /* 6 */int gcd( int u , int v ) /* 7 */ int r ; /* 8 */ r=v; /* 9 */ while ( r!=0 ) /* 10 */ r = u % v ; /* 11 */ u = v ; /* 12 */ v = r ; /* 13 */ /* 14 */ return u ; /* 15 */ /* 16 */void reduce ( int *x , int *y ) /* 17 */ int g ; /* 18 */ g = gcd( *x,*y ) ; /* 19 */ *x = (*x) / g ; /* 20 */ *y = (*y) / g ; /* 21 */ /* 22 */加法函數(shù) add: 形式參數(shù) ii 使用實(shí)在參數(shù) i 帶入的值,參與運(yùn)算。 該函數(shù)還直接訪問全局量 a 、b ,用 a 、b 的值參與運(yùn)算。void main( ) /* 23 */ int i ; /* 24 */ printf(plea

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論