版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第六章第六章 函數(shù)函數(shù)1.為什么要使用函數(shù)?函數(shù)如何定義和調(diào)用?為什么要使用函數(shù)?函數(shù)如何定義和調(diào)用?2.函數(shù)參數(shù)如何傳遞?如何獲得函數(shù)的返回值?函數(shù)參數(shù)如何傳遞?如何獲得函數(shù)的返回值?3.如何使用局部變量與全局變量?變量有幾種存如何使用局部變量與全局變量?變量有幾種存儲類型?儲類型? 4.C提供的預(yù)處理功能主要有哪幾種?如何定義提供的預(yù)處理功能主要有哪幾種?如何定義帶參數(shù)的宏?帶參數(shù)的宏? 本章內(nèi)容6.1 問題的提出與程序示例問題的提出與程序示例6.2 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用6.3 函數(shù)的參數(shù)傳遞與返回值函數(shù)的參數(shù)傳遞與返回值6.4 變量的作用域和存儲類型變量的作用域和存儲類型6.
2、5 編譯預(yù)處理編譯預(yù)處理6.6 函數(shù)的應(yīng)用舉例函數(shù)的應(yīng)用舉例 * 6.7 函數(shù)的嵌套與遞歸調(diào)用函數(shù)的嵌套與遞歸調(diào)用6.1 問題的提出與程序示例為什么要使用函數(shù)?為什么要使用函數(shù)?大型程序多人合作大型程序多人合作模塊化,功能清晰,便于編寫、閱模塊化,功能清晰,便于編寫、閱讀和調(diào)試讀和調(diào)試減少重復(fù)編寫的工作量,如減少重復(fù)編寫的工作量,如#include long factorial(int x) /*定義函數(shù)定義函數(shù)factorial計(jì)算計(jì)算n的的階乘階乘*/ int i; long result=1; for(i=2;i=x;i+)result*=i; return result; /*將將re
3、sult作為作為factorial的函的函數(shù)值返回到主調(diào)函數(shù)中數(shù)值返回到主調(diào)函數(shù)中*/!() !nmmCnmnvoid main() int m, n; long c; printf(Please input m,n:); scanf(%d,%d, &m,&n); c=factorial(m)/(factorial(n)*factorial(m-n);/*調(diào)調(diào)用函數(shù)用函數(shù)factorial并作為運(yùn)算對象并作為運(yùn)算對象*/printf(“c=%ldn”,c); 例例2:double add(double a,double b) double s; s=a+b; return s;
4、 void main() x=add(3.0,4.0); for(y=0,i=1;i=5;i+) y=add(y,i);函數(shù)參數(shù)函數(shù)參數(shù)實(shí)際值代入實(shí)際值代入這是函這是函數(shù)返回?cái)?shù)返回值值例例3:計(jì)算計(jì)算1!+2!+3!+n! 用函數(shù)完成用函數(shù)完成 #include “stdio.h” fun( int n) int s=0,t=1; int i; for(i=1;i=n;i+) t=t*i; s=s+t; return (s); void main( ) int n; int s=0; scanf(“%d”,&n); s=fun(n); printf(“s=%dn”,s); 6.2 函數(shù)
5、的定義與調(diào)用6.2.1函數(shù)的分類函數(shù)的分類函數(shù)定義的角度函數(shù)定義的角度(1)庫函數(shù))庫函數(shù) 庫函數(shù)是由庫函數(shù)是由C系統(tǒng)提供的,可以直接使用它系統(tǒng)提供的,可以直接使用它們。如:們。如:scanf,printf,getchar,putchar等。等。(2)用戶自定義函數(shù))用戶自定義函數(shù) 用戶自定義函數(shù)就是由用戶自己定義和設(shè)計(jì)用戶自定義函數(shù)就是由用戶自己定義和設(shè)計(jì)的函數(shù)。的函數(shù)。主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳遞的角度主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳遞的角度(1)無參函數(shù))無參函數(shù)(2)有參函數(shù))有參函數(shù)6.2 函數(shù)的定義與調(diào)用6.2.2函數(shù)的定義函數(shù)的定義 C語言中的語言中的函數(shù)和變量一樣函數(shù)和變量一樣,
6、具有一定的,具有一定的存儲類型和存儲類型和數(shù)據(jù)類型數(shù)據(jù)類型。一般情況下,函數(shù)也應(yīng)先定義,后調(diào)用一般情況下,函數(shù)也應(yīng)先定義,后調(diào)用 1.無參函數(shù)的定義形式無參函數(shù)的定義形式 類型說明符類型說明符 函數(shù)名(函數(shù)名( ) 聲明部分聲明部分 語句部分語句部分 例如,定義一個打印一行例如,定義一個打印一行語句的函數(shù)。語句的函數(shù)。void printfline( ) printf(This is a C program!n);6.2 函數(shù)的定義與調(diào)用2. 有參函數(shù)的定義形式有參函數(shù)的定義形式類型說明符類型說明符 函數(shù)名(形式參數(shù)表列)函數(shù)名(形式參數(shù)表列) 聲明部分聲明部分語句部分語句部分 例如:定義一個
7、例如:定義一個average函數(shù),用來函數(shù),用來計(jì)算兩個整數(shù)的平均數(shù)。計(jì)算兩個整數(shù)的平均數(shù)。float average(int x, int y) float result; /* 定義變量定義變量result*/result=(x+y)/2.0;return result; /*函數(shù)返回值函數(shù)返回值*/6.2 函數(shù)的定義與調(diào)用 有參函數(shù)注意事項(xiàng)有參函數(shù)注意事項(xiàng): (1)為每一個參數(shù)指定數(shù)據(jù)類型,)為每一個參數(shù)指定數(shù)據(jù)類型, 如如 float average(int x, int y)。任何不指定參數(shù)。任何不指定參數(shù)類型的寫法都是錯誤的。如:類型的寫法都是錯誤的。如:float average
8、(int x, y)編譯時會出錯,參數(shù)編譯時會出錯,參數(shù) y 未指定數(shù)據(jù)類型。未指定數(shù)據(jù)類型。 (2)不允許在函數(shù)內(nèi)部再次定義與參數(shù)同名的)不允許在函數(shù)內(nèi)部再次定義與參數(shù)同名的變量。但不同函數(shù)內(nèi)部允許定義同名的變量。變量。但不同函數(shù)內(nèi)部允許定義同名的變量。6.2 函數(shù)的定義與調(diào)用6.2.3函數(shù)的調(diào)用函數(shù)的調(diào)用1.函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式為:函數(shù)調(diào)用的形式為:函數(shù)名(實(shí)參表列);函數(shù)名(實(shí)參表列);或或函數(shù)名();函數(shù)名();【例6-2】編寫程序計(jì)算兩個整數(shù)的平均數(shù)。要求調(diào)用printfline和average函數(shù)。#include void printfline( ) /*函
9、數(shù)定義函數(shù)定義*/printf(This is a C program!n); float average(int x,int y) /*函數(shù)定義函數(shù)定義*/float result;result=(x + y)/2.0; return result;void main( )int a,b;float ave;printfline( ); /*調(diào)用調(diào)用printfline函數(shù)輸出一行語句函數(shù)輸出一行語句*/printf(Please input a,b:);scanf(“%d,%d”, &a,&b); ave=average(a,b); /*調(diào)用調(diào)用average函數(shù)求兩個整數(shù)
10、函數(shù)求兩個整數(shù)a和和b的平均數(shù)的平均數(shù)*/ printf(Average of %d and %d is %f.n, a, b, ave); 按函數(shù)調(diào)用在程序中出現(xiàn)的位置來分,按函數(shù)調(diào)用在程序中出現(xiàn)的位置來分,函數(shù)調(diào)用函數(shù)調(diào)用大致可大致可分為以下幾種形式:分為以下幾種形式: (1)函數(shù)語句函數(shù)語句:把函數(shù)作為語句來使用把函數(shù)作為語句來使用,一般不需要返回一般不需要返回值值,只是通過函數(shù)調(diào)用完成某些操作。只是通過函數(shù)調(diào)用完成某些操作。 如如printfline( ); (2)函數(shù)表達(dá)式函數(shù)表達(dá)式:函數(shù)作為表達(dá)式中的一項(xiàng)出現(xiàn)在表:函數(shù)作為表達(dá)式中的一項(xiàng)出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算,
11、如達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算,如 ave=average(a,b); (3)函數(shù)實(shí)參函數(shù)實(shí)參:函數(shù)作為另一個函數(shù)調(diào)用的實(shí)際參數(shù):函數(shù)作為另一個函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。這種形式是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,出現(xiàn)。這種形式是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的因此要求該函數(shù)必須是有返回值的 6.2 函數(shù)的定義與調(diào)用6.2函數(shù)的定義與調(diào)用2.被調(diào)函數(shù)的聲明被調(diào)函數(shù)的聲明 函數(shù)聲明的一般形式為:函數(shù)聲明的一般形式為: 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(參數(shù)類型參數(shù)類型1, 參數(shù)類型參數(shù)類型2,); 或或 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名(參數(shù)類型參數(shù)類型1 參數(shù)
12、名參數(shù)名1, 參數(shù)類型參數(shù)類型2 參數(shù)名參數(shù)名2,); 自定義函數(shù)自定義函數(shù)一般應(yīng)一般應(yīng)定義在前,調(diào)用在后定義在前,調(diào)用在后。如果用戶在編制。如果用戶在編制程序時都按這個規(guī)律來進(jìn)行,則不需要進(jìn)行函數(shù)的聲明。程序時都按這個規(guī)律來進(jìn)行,則不需要進(jìn)行函數(shù)的聲明。但由于但由于C語言中的函數(shù)定義是各自獨(dú)立的。函數(shù)與函數(shù)之間語言中的函數(shù)定義是各自獨(dú)立的。函數(shù)與函數(shù)之間的排放位置并沒有先后順序關(guān)系,只有調(diào)用與被調(diào)用的關(guān)的排放位置并沒有先后順序關(guān)系,只有調(diào)用與被調(diào)用的關(guān)系。當(dāng)出現(xiàn)調(diào)用在前,定義在后的情況,系。當(dāng)出現(xiàn)調(diào)用在前,定義在后的情況,即即被調(diào)函數(shù)放置被調(diào)函數(shù)放置在主調(diào)函數(shù)之后,則應(yīng)在主調(diào)函數(shù)的適當(dāng)位置,
13、在主調(diào)函數(shù)之后,則應(yīng)在主調(diào)函數(shù)的適當(dāng)位置,加上函數(shù)加上函數(shù)原型聲明原型聲明 6.3 函數(shù)的參數(shù)傳遞和返回值6.3.1 函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞參數(shù)傳遞方式分為:參數(shù)傳遞方式分為:(1)值傳遞方式(單向傳遞)值傳遞方式(單向傳遞) 所謂所謂“值傳遞方式值傳遞方式”是指將實(shí)參的具體數(shù)值單向傳是指將實(shí)參的具體數(shù)值單向傳遞給形參的一種方式。遞給形參的一種方式。 注意:值單向傳遞是指只能由實(shí)參傳遞給形參,而注意:值單向傳遞是指只能由實(shí)參傳遞給形參,而不能由形參傳遞給實(shí)參。如下例中,只能由實(shí)參不能由形參傳遞給實(shí)參。如下例中,只能由實(shí)參a,b依次對應(yīng)傳遞給形參依次對應(yīng)傳遞給形參x,y,反之則不行。,反之
14、則不行。6.3 函數(shù)的參數(shù)傳遞和返回值例:例:#includevoid main()void swap(int x,int y); /* 函數(shù)原型說明聲明函數(shù)原型說明聲明*/ int a,b;a=2,b=6;printf(調(diào)用前:調(diào)用前:a=%d,b=%dn,a,b);swap(a,b); /*函數(shù)調(diào)用函數(shù)調(diào)用*/printf(調(diào)用后:調(diào)用后:a=%d,b=%dn,a,b);函數(shù)在后函數(shù)在后,調(diào)用調(diào)用在前在前,所以要在所以要在調(diào)用前加說明調(diào)用前加說明6.3 函數(shù)的參數(shù)傳遞和返回值void swap(int x,int y) /*函數(shù)定義函數(shù)定義*/ int temp;printf(交換前:交換
15、前:x=%d,y=%dn,x,y);temp=x;x=y;y=temp;printf(交換后:交換后:x=%d,y=%dn,x,y);6.3 函數(shù)的參數(shù)傳遞和返回值上例運(yùn)行結(jié)果:上例運(yùn)行結(jié)果:最后交換最后交換成功了嗎成功了嗎?為什么為什么?在語言中,數(shù)據(jù)只能從實(shí)參單向傳遞給形參,在語言中,數(shù)據(jù)只能從實(shí)參單向傳遞給形參,稱為稱為“按值按值” 傳遞,即當(dāng)簡單變量作為實(shí)參傳遞,即當(dāng)簡單變量作為實(shí)參時,用戶時,用戶不能不能在在函數(shù)函數(shù)中中改變改變對應(yīng)實(shí)參的值對應(yīng)實(shí)參的值6.3 函數(shù)的參數(shù)傳遞和返回值(2)地址傳遞方式)地址傳遞方式 所謂所謂“地址傳遞方式地址傳遞方式”是指將實(shí)參的地址傳遞給形參是指將實(shí)
16、參的地址傳遞給形參的一種方式。在函數(shù)調(diào)用時,通過對形參所指地址單的一種方式。在函數(shù)調(diào)用時,通過對形參所指地址單元中的內(nèi)容進(jìn)行操作,從而引起與形參指向同一地址元中的內(nèi)容進(jìn)行操作,從而引起與形參指向同一地址單元的實(shí)參的內(nèi)容發(fā)生變化。但這種變化并不是由形單元的實(shí)參的內(nèi)容發(fā)生變化。但這種變化并不是由形參傳回實(shí)參引起的。參傳回實(shí)參引起的。 采用這種方式時,實(shí)參可以是變量的地址、也可以是采用這種方式時,實(shí)參可以是變量的地址、也可以是后續(xù)章節(jié)要介紹的數(shù)組名、相關(guān)指針變量,形參通常后續(xù)章節(jié)要介紹的數(shù)組名、相關(guān)指針變量,形參通常是數(shù)組或指針變量。是數(shù)組或指針變量。6.3 函數(shù)的參數(shù)傳遞和返回值6.3.2 函數(shù)的
17、返回值函數(shù)的返回值在在C語言中,可以在被調(diào)函數(shù)內(nèi)采用語言中,可以在被調(diào)函數(shù)內(nèi)采用return語句獲得函語句獲得函數(shù)的返回值。一個函數(shù)利用數(shù)的返回值。一個函數(shù)利用return語句只能返回一個值。語句只能返回一個值。return語句的形式為:(以下兩種寫法均可)語句的形式為:(以下兩種寫法均可)return(表達(dá)式);(表達(dá)式);或或return 表達(dá)式;表達(dá)式;需注意的是:函數(shù)名前面的函數(shù)類型說明符是用來指定需注意的是:函數(shù)名前面的函數(shù)類型說明符是用來指定本函數(shù)返回值的數(shù)據(jù)類型。在進(jìn)行函數(shù)定義時,應(yīng)使本函數(shù)返回值的數(shù)據(jù)類型。在進(jìn)行函數(shù)定義時,應(yīng)使return語句中的表達(dá)式的類型與函數(shù)類型說明一致
18、。當(dāng)語句中的表達(dá)式的類型與函數(shù)類型說明一致。當(dāng)return語句中的表達(dá)式的類型與函數(shù)類型說明不一致時,語句中的表達(dá)式的類型與函數(shù)類型說明不一致時,則以函數(shù)類型說明為準(zhǔn),系統(tǒng)自動將則以函數(shù)類型說明為準(zhǔn),系統(tǒng)自動將return語句中的表達(dá)語句中的表達(dá)式的值轉(zhuǎn)換為函數(shù)類型說明所指定的類型。式的值轉(zhuǎn)換為函數(shù)類型說明所指定的類型。 #include void main() int average(int x,int y); /* 函數(shù)聲明函數(shù)聲明*/ int a,b; float ave; printf(Please input a,b:); scanf(“%d,%d”, &a,&b);
19、 ave=average(a,b); /*調(diào)用調(diào)用average函數(shù)求兩函數(shù)求兩個整數(shù)個整數(shù)a和和b的平均數(shù)的平均數(shù)*/ printf(Average of %d and %d is %f.n, a, b, ave); int average(int x,int y) /*將將average函數(shù)的類型改為函數(shù)的類型改為int型型*/float result;result=(x + y)/2.0; return result;本例中,因?yàn)楹瘮?shù)本例中,因?yàn)楹瘮?shù)average的返回類型為的返回類型為int型,所以要將型,所以要將return的實(shí)型值的實(shí)型值3.5轉(zhuǎn)化為轉(zhuǎn)化為int型。固結(jié)果為型。固結(jié)
20、果為3.000000當(dāng)函數(shù)沒有返回值時,為了使程序有良好的可讀性并減當(dāng)函數(shù)沒有返回值時,為了使程序有良好的可讀性并減少出錯,在函數(shù)定義時,函數(shù)類型說明符應(yīng)為少出錯,在函數(shù)定義時,函數(shù)類型說明符應(yīng)為void(“空類型空類型”)。)。注意:注意:(1)調(diào)用函數(shù)時,函數(shù)名不能有錯。)調(diào)用函數(shù)時,函數(shù)名不能有錯。(2)實(shí)參和形參要一一對應(yīng),個數(shù)一致,類實(shí)參和形參要一一對應(yīng),個數(shù)一致,類型匹配。型匹配。(3)函數(shù)必須先定義,后調(diào)用函數(shù)必須先定義,后調(diào)用,除非函數(shù)返,除非函數(shù)返回值類型為回值類型為int或或char。(4)函數(shù)可以自己調(diào)用自己,即遞歸調(diào)用。)函數(shù)可以自己調(diào)用自己,即遞歸調(diào)用。例:例:dou
21、ble add(double,double);函數(shù)說明的形式函數(shù)說明的形式類型名類型名 函數(shù)名(參數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型,參數(shù)類型2,) 對于用戶定義的函數(shù)要對于用戶定義的函數(shù)要“先定義,后使用先定義,后使用”的的規(guī)則。凡是未在調(diào)用前定義的函數(shù),默認(rèn)函數(shù)規(guī)則。凡是未在調(diào)用前定義的函數(shù),默認(rèn)函數(shù)的返回值為的返回值為int類型。類型。對于返回值為其它類型的函數(shù),對于返回值為其它類型的函數(shù),若把函數(shù)的定若把函數(shù)的定義放在調(diào)用之后,義放在調(diào)用之后,應(yīng)該在調(diào)用之間對應(yīng)該在調(diào)用之間對函數(shù)進(jìn)行函數(shù)進(jìn)行說明說明(稱為函數(shù)原型說明)(稱為函數(shù)原型說明)可放在所有函數(shù)可放在所有函數(shù)外部外部,在此后的所
22、有位置,在此后的所有位置上都可以上都可以調(diào)用調(diào)用該函數(shù)。該函數(shù)。也可放在某函數(shù)內(nèi)的說明部分,則只有在也可放在某函數(shù)內(nèi)的說明部分,則只有在某函數(shù)內(nèi)能識別該函數(shù)。某函數(shù)內(nèi)能識別該函數(shù)。71513114#include#includevoid main( ) float e,pi; double funpi(double t); scanf(“%lf”,&e); pi=funpi(e); printf(“pi=%fn”,pi);補(bǔ)充補(bǔ)充: 編寫函數(shù)編寫函數(shù)isprime(int a) 用來判斷自變量用來判斷自變量a是否為素是否為素?cái)?shù),若是素?cái)?shù),函數(shù)返回?cái)?shù),若是素?cái)?shù),函數(shù)返回1,否則返回,否則
23、返回0#include “math.h”int isprime (int ); void main()int x;printf(“Enter a integer number: ”);scanf(“%d”,&x);if(isprime(x) printf(“%d is primen”,x);else printf(“%d is not primen”,x); 編寫函數(shù)編寫函數(shù)isprime(int a) 用來判斷自變量用來判斷自變量a是否為是否為素?cái)?shù),若是素?cái)?shù),函數(shù)返回素?cái)?shù),若是素?cái)?shù),函數(shù)返回1,否則返回,否則返回0int isprime( int a) int i; for(i=2;
24、 i=(int)sqrt(double)a); i+) if(a%i=0) return 0; return 1;補(bǔ)充例子補(bǔ)充例子:編寫函數(shù)編寫函數(shù)myupper(ch),把把ch中的小寫字母轉(zhuǎn)換中的小寫字母轉(zhuǎn)換成大寫字母作為函數(shù)值返回成大寫字母作為函數(shù)值返回,其它字符不變其它字符不變,用字符用字符#結(jié)束結(jié)束輸入。輸入。#include char myupper(char);void main( ) char c; while(c=getchar()!=#) c=myupper(c); putchar(c);char myupper(char ch) if(ch=a & ch=z) c
25、h=ch-32; return ch;程序舉例程序舉例:補(bǔ)充補(bǔ)充: 編寫函數(shù)編寫函數(shù)sum( int n ) 求求 。 和值作為和值作為函數(shù)返回。函數(shù)返回。f(x)=x2+1#includeint sum (int);函數(shù)要先定義它的原型,后調(diào)用函數(shù)要先定義它的原型,后調(diào)用int f(int);void main( )int n,s;printf(“Enter a integer number: ”);scanf(“%d”,&n);s=sum(n);printf(“n=%d sum=%dn”,n,s); nxxf0)(int sum( int n) int x,s=0; for(x=0
26、; x=n; x+) s+=f(x); return s; int f(int x)return x*x+1; 補(bǔ)充補(bǔ)充: 用梯形法求函數(shù)用梯形法求函數(shù)f(x)=sin(x)在在0,1.5區(qū)間的區(qū)間的定積分,定積分,n選選100。近似公式。近似公式近似公式近似公式s=h*(f(a)+f(b)/2+ )#include “math.h”double integ(double a,double b) (函數(shù)先定義后函數(shù)先定義后調(diào)用調(diào)用)double s,x,h; int n=100,i; h=fabs(b-a)/n; s=(sin(a)+sin(b)/2.0; 11)*(nihiaffor(i=1
27、; i=n-1;i+) x=a+i*h; s=s+sin(x); s=s*h; return s;void main() double s; s=integ(0.0,1.5); printf(“s=%fn”,s);6.4 變量的作用域與存儲類型6.4.1 變量的作用域變量的作用域: 1局部變量局部變量(1)在函數(shù)體內(nèi)定義的變量,在本函數(shù)范圍內(nèi)有效,)在函數(shù)體內(nèi)定義的變量,在本函數(shù)范圍內(nèi)有效,作用域局限于函數(shù)體內(nèi)。作用域局限于函數(shù)體內(nèi)。(2)在復(fù)合語句內(nèi)定義的變量,在本復(fù)合語句范圍)在復(fù)合語句內(nèi)定義的變量,在本復(fù)合語句范圍內(nèi)有效,作用域局限于復(fù)合語句內(nèi)。內(nèi)有效,作用域局限于復(fù)合語句內(nèi)。(3)有參
28、函數(shù)的形式參數(shù)也是局部變量,只在其所)有參函數(shù)的形式參數(shù)也是局部變量,只在其所在的函數(shù)范圍內(nèi)有效。在的函數(shù)范圍內(nèi)有效。 注注:(:(1)主函數(shù)中定義的變量只能在主函數(shù)中使用,不)主函數(shù)中定義的變量只能在主函數(shù)中使用,不能在其它函數(shù)中使用。同時,主函數(shù)中也不能使用其它函能在其它函數(shù)中使用。同時,主函數(shù)中也不能使用其它函數(shù)中定義的變量。(數(shù)中定義的變量。(2)不同函數(shù)中和不同的復(fù)合語句中不同函數(shù)中和不同的復(fù)合語句中可以使用(即定義)相同的變量名??梢允褂茫炊x)相同的變量名。因?yàn)樗鼈兊淖饔糜虿灰驗(yàn)樗鼈兊淖饔糜虿煌?,程序運(yùn)行時在內(nèi)存中占據(jù)不同的存儲單元,各自代表同,程序運(yùn)行時在內(nèi)存中占據(jù)不同的存儲
29、單元,各自代表不同的對象,所以它們之間互不干預(yù)。不同的對象,所以它們之間互不干預(yù)。6.4 變量的作用域與存儲類型 2全局變量全局變量全局變量也稱為外全局變量也稱為外部變量,它是在任部變量,它是在任何函數(shù)之外定義的何函數(shù)之外定義的變量。變量。它的有效范它的有效范圍為從定義變量的圍為從定義變量的位置開始到本源文位置開始到本源文件結(jié)束。件結(jié)束。例如:例如: int x,y,z;/* x,y,z均是全局變量均是全局變量 */ float f1(float a,float b) char ch1,ch2; /* ch1,ch2均是均是全局變量全局變量 */ int f2( int m) double t
30、,p;/* t,p均是全局變量均是全局變量 */ void main( ) 6.4 變量的作用域與存儲類型全局變量和局部變量同名的應(yīng)用例子。全局變量和局部變量同名的應(yīng)用例子。 #include int a=3,b=5; /* a,b為為 變量變量*/ int max (int a, int b) /*a,b為為 變量變量 */ int c; c=ab?a:b; return (c); void main ( ) int a=8; /*a為為 變量變量 */ printf (max=%dn, max (a,b); 運(yùn)行結(jié)果:運(yùn)行結(jié)果:如果同一個源文件中,如果同一個源文件中,全局變量與局部變量全局
31、變量與局部變量同名,當(dāng)局部變量有同名,當(dāng)局部變量有效時,效時,同名的全局變同名的全局變量不起作用。量不起作用。 6.4 變量的作用域與存儲類型6.4.2 變量的存儲類型變量的存儲類型動態(tài)存儲方式和靜態(tài)存儲方式。動態(tài)存儲方式和靜態(tài)存儲方式。根據(jù)這兩類存儲方式,變量又可具體分為四種:根據(jù)這兩類存儲方式,變量又可具體分為四種:自動變量自動變量(auto)、寄存器變量、寄存器變量(register)、靜態(tài)變、靜態(tài)變量量(static)、 外部變量外部變量(extern)。在在C語言中,每個變量和函數(shù)有兩個屬性:數(shù)據(jù)語言中,每個變量和函數(shù)有兩個屬性:數(shù)據(jù)類型和存儲類型。定義變量的完整形式為:類型和存儲類
32、型。定義變量的完整形式為:存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 變量名變量名1,變量名,變量名2,;其中,其中,存儲類型可以是存儲類型可以是auto、register、extern或或static。6.4 變量的作用域與存儲類型1auto變量變量auto說明符常常省略說明符常常省略,系統(tǒng)默認(rèn)為沒有存儲類型說,系統(tǒng)默認(rèn)為沒有存儲類型說明符的變量為自動存儲類型的變量,前面各章中所明符的變量為自動存儲類型的變量,前面各章中所有程序中所用到的各個變量,都未說明存儲方式,有程序中所用到的各個變量,都未說明存儲方式,都是自動變量。都是自動變量。在函數(shù)體內(nèi)定義變量時,下面兩種寫法是等價(jià)的。在函數(shù)體內(nèi)定義變量時
33、,下面兩種寫法是等價(jià)的。int x,y,z;auto int x,y,z;6.4 變量的作用域與存儲類型2register變量變量一般情況下,變量的值都是存儲在內(nèi)存中的。對于一般情況下,變量的值都是存儲在內(nèi)存中的。對于一些頻繁使用的變量,可以放在一些頻繁使用的變量,可以放在CPU內(nèi)部的寄存器內(nèi)部的寄存器中,以提高訪問這些變量的速度。這種變量就稱為中,以提高訪問這些變量的速度。這種變量就稱為寄存器變量。寄存器變量也屬于局部變量范疇。寄存器變量。寄存器變量也屬于局部變量范疇。(1)只有局部變量和形參可以作為寄存器變量,)只有局部變量和形參可以作為寄存器變量,其他變量不可以(全局變量、局部靜變量不可
34、以)。其他變量不可以(全局變量、局部靜變量不可以)。(2)由于計(jì)算機(jī)的寄存器數(shù)目有限,不宜定義太)由于計(jì)算機(jī)的寄存器數(shù)目有限,不宜定義太多寄存器變量。不同的系統(tǒng)允許使用的寄存器個數(shù)多寄存器變量。不同的系統(tǒng)允許使用的寄存器個數(shù)是不同的。是不同的。 6.4 變量的作用域與存儲類型3static變量變量靜態(tài)變量在程序開始運(yùn)行時就分配了固定的內(nèi)存靜態(tài)變量在程序開始運(yùn)行時就分配了固定的內(nèi)存空間,在程序運(yùn)行過程中不釋放,直到程序運(yùn)行空間,在程序運(yùn)行過程中不釋放,直到程序運(yùn)行結(jié)束才釋放它所占的存儲空間,因此靜態(tài)變量的結(jié)束才釋放它所占的存儲空間,因此靜態(tài)變量的生存期是整個程序。由于變量分為局部變量和全生存期是
35、整個程序。由于變量分為局部變量和全局變量,所以靜態(tài)變量也分為靜態(tài)局部變量和靜局變量,所以靜態(tài)變量也分為靜態(tài)局部變量和靜態(tài)全局變量。態(tài)全局變量。(1)靜態(tài)局部變量)靜態(tài)局部變量靜態(tài)局部變量仍然是定義在函數(shù)內(nèi)部的局部變量,靜態(tài)局部變量仍然是定義在函數(shù)內(nèi)部的局部變量,它的作用域仍然局限于函數(shù)內(nèi)部。它的作用域仍然局限于函數(shù)內(nèi)部。例如:例如:static int m=10,n;6.4 變量的作用域與存儲類型【例例6-7】編寫程序計(jì)算編寫程序計(jì)算1!5!的值。!的值。 #include int fac(int n) /*函數(shù)定義函數(shù)定義*/ static int f=1; /* 靜態(tài)局部變量靜態(tài)局部變量
36、*/ f=f*n; return(f); void main() int i; for (i=1;i=5;i+) printf(%d! =%dn,i,fac(i); 在函數(shù)在函數(shù)fac內(nèi)部定義內(nèi)部定義了靜態(tài)局部變量了靜態(tài)局部變量 f,每次調(diào)用都保留了上每次調(diào)用都保留了上一次計(jì)算的結(jié)果一次計(jì)算的結(jié)果例如:例如:static int m=10,n;說明:說明:(1) 靜態(tài)局部變量的存儲空間是在程序編譯時由系統(tǒng)分靜態(tài)局部變量的存儲空間是在程序編譯時由系統(tǒng)分配的,且在程序運(yùn)行的整個期間都固定不變。配的,且在程序運(yùn)行的整個期間都固定不變。(2)靜態(tài)局部變量編譯時賦初值,每次調(diào)用時不再賦初靜態(tài)局部變量編譯
37、時賦初值,每次調(diào)用時不再賦初值,只保留調(diào)用結(jié)束時變量的值。值,只保留調(diào)用結(jié)束時變量的值。(3)對靜態(tài)局部變量,如果定義時不賦初值的話,編譯)對靜態(tài)局部變量,如果定義時不賦初值的話,編譯時系統(tǒng)會自動賦值為時系統(tǒng)會自動賦值為0或空字符(對字符變量)?;蚩兆址▽ψ址兞浚?。如上例在程序編譯時給變量如上例在程序編譯時給變量m賦予賦予10,對未給定,對未給定初值的變量初值的變量n,C 編譯系統(tǒng)自動給它賦編譯系統(tǒng)自動給它賦0值。值。(2)靜態(tài)全局變量)靜態(tài)全局變量在在C語言中,全局變量的存儲都采用靜態(tài)存儲方式。語言中,全局變量的存儲都采用靜態(tài)存儲方式。6.4 變量的作用域與存儲類型4extern變量變量
38、 全局變量(即外部變量)的作用域是從定義的位置起到本全局變量(即外部變量)的作用域是從定義的位置起到本文件的末尾止。采用文件的末尾止。采用extern來聲明全局變量可以擴(kuò)大全局來聲明全局變量可以擴(kuò)大全局變量的作用域。變量的作用域。 (1) 在多個文件中聲明全局變量在多個文件中聲明全局變量 一個一個C程序可以由多個文件組成。如果一個文件中要引用程序可以由多個文件組成。如果一個文件中要引用另外一個文件中所定義的全局變量,需要在此文件中,用另外一個文件中所定義的全局變量,需要在此文件中,用extern進(jìn)行聲明。進(jìn)行聲明。 (2) 在一個文件中聲明全局變量在一個文件中聲明全局變量 同一個文件中,在全局
39、變量定義點(diǎn)之前的函數(shù)想引用該全同一個文件中,在全局變量定義點(diǎn)之前的函數(shù)想引用該全局變量,應(yīng)該在引用之前用局變量,應(yīng)該在引用之前用extern對該變量作對該變量作“全局變量全局變量聲明聲明”。全局變量未被初始化,系統(tǒng)自動賦初值。全局變量未被初始化,系統(tǒng)自動賦初值0。6.4 變量的作用域與存儲類型 【例例6-8】同一個文件中聲明全局變量的應(yīng)用例子。同一個文件中聲明全局變量的應(yīng)用例子。 #include void main() 結(jié)果示例:結(jié)果示例: int min(int a,int b); extern x,y;/* 聲明全局變量聲明全局變量x,y */ printf(%dn,min(x,y);
40、int x=22,y=11;/* 定義全局變量定義全局變量x,y */ int min(int a,int b) int c; c=ab?a:b; return(c); 6.5 編譯預(yù)處理 編譯預(yù)處理是指,在對源程序進(jìn)行編譯之前,先編譯預(yù)處理是指,在對源程序進(jìn)行編譯之前,先對源程序中的編譯預(yù)處理命令進(jìn)行處理,然后再對源程序中的編譯預(yù)處理命令進(jìn)行處理,然后再將處理的結(jié)果,和源程序一起進(jìn)行編譯,以得到將處理的結(jié)果,和源程序一起進(jìn)行編譯,以得到目標(biāo)代碼。目標(biāo)代碼。 提供的預(yù)處理功能主要有宏定義、文件包含和提供的預(yù)處理功能主要有宏定義、文件包含和條件編譯。這些功能分別用宏定義命令、文件包條件編譯。這些
41、功能分別用宏定義命令、文件包含命令、條件編譯命令來實(shí)現(xiàn)。預(yù)處理命令是以含命令、條件編譯命令來實(shí)現(xiàn)。預(yù)處理命令是以號開頭的代碼行。號開頭的代碼行。6.5 編譯預(yù)處理 6.5.1 宏定義宏定義 宏定義是用指定標(biāo)識符(宏名)來代表一個字符串。宏定義是用指定標(biāo)識符(宏名)來代表一個字符串。1不帶參數(shù)的宏定義不帶參數(shù)的宏定義 其定義的一般形式:其定義的一般形式: define 宏名宏名 字符串字符串 字符串可以是常數(shù)、表達(dá)式、格式串等。字符串可以是常數(shù)、表達(dá)式、格式串等。宏定義可出現(xiàn)在宏定義可出現(xiàn)在程序中的任何位置。程序中的任何位置。 可以用可以用#undef命令終止宏名的作用域,其一般形式為命令終止宏
42、名的作用域,其一般形式為 undef 標(biāo)識符標(biāo)識符 一、無參數(shù)的宏定義一、無參數(shù)的宏定義 格式:格式:#define 宏名宏名 替換文本替換文本 or #define 宏名宏名 (說明宏名已被說明宏名已被”定義定義“)如如 :#define SIZE 100 替換文本中可以包含已定義過的宏名替換文本中可以包含已定義過的宏名如:如: #define PI 3.14#define ADDPI (PI+1)#define TWO_ADDPI (2*ADDPI) 若程序中有表達(dá)式若程序中有表達(dá)式:x=TWO_ADDPI/2,替換后替換后,表達(dá)式將表達(dá)式將成為成為: x=(2*(3.14+1)/2若寫成
43、若寫成 #define PI 3.14 #define ADDPI PI+1 (無括號無括號) #define TWO_ADDPI 2*ADDPI (無括號無括號)則以上表達(dá)式成為則以上表達(dá)式成為:x=2*3.14+1/2 二、有參數(shù)的宏定義二、有參數(shù)的宏定義 格式:格式: #define 宏名(參數(shù)表)宏名(參數(shù)表) 替換文本替換文本如:如: #define MU(X,Y) (X)*(Y) a=MU(5,2);/*引用帶參的宏名引用帶參的宏名*/b=6/MU(a+3,a);注意:同一宏名也不能重復(fù)定義注意:同一宏名也不能重復(fù)定義圓括號不能少圓括號不能少6.5 編譯預(yù)處理對于帶參數(shù)的宏定義有以
44、下問題需要說明:對于帶參數(shù)的宏定義有以下問題需要說明:(1)定義帶參數(shù)的宏時,宏名與左圓括號之間)定義帶參數(shù)的宏時,宏名與左圓括號之間不能留有空格。否則將空格以后的所有字符均作不能留有空格。否則將空格以后的所有字符均作為替換字符串,用來替換不帶參數(shù)的宏名。為替換字符串,用來替換不帶參數(shù)的宏名。(2)帶參數(shù)的宏展開時,用實(shí)參字符串替換形)帶參數(shù)的宏展開時,用實(shí)參字符串替換形參字符串,而不做任何語法檢查。參字符串,而不做任何語法檢查。讀者可能已經(jīng)讀者可能已經(jīng)體會到,帶參數(shù)的宏在程序中使用時,它的使用體會到,帶參數(shù)的宏在程序中使用時,它的使用形式和特性和函數(shù)很相似。但是在本質(zhì)上它們是形式和特性和函數(shù)
45、很相似。但是在本質(zhì)上它們是完全不同的。完全不同的。6.5 編譯預(yù)處理 帶參數(shù)的宏和函數(shù)的區(qū)別有以下幾點(diǎn):帶參數(shù)的宏和函數(shù)的區(qū)別有以下幾點(diǎn): (1)函數(shù)調(diào)用時,先求出實(shí)參表達(dá)式的值,然后將值代函數(shù)調(diào)用時,先求出實(shí)參表達(dá)式的值,然后將值代入形參;而宏調(diào)用時只是用實(shí)參簡單地替換形參。入形參;而宏調(diào)用時只是用實(shí)參簡單地替換形參。 (2)函數(shù)調(diào)用是在程序運(yùn)行時進(jìn)行的,為形參分配臨時函數(shù)調(diào)用是在程序運(yùn)行時進(jìn)行的,為形參分配臨時的內(nèi)存單元,占用運(yùn)行時間;而宏調(diào)用則是在編譯時由編的內(nèi)存單元,占用運(yùn)行時間;而宏調(diào)用則是在編譯時由編譯預(yù)處理程序完成的,僅僅是一種簡單的替換,并不分配譯預(yù)處理程序完成的,僅僅是一種簡
46、單的替換,并不分配內(nèi)存單元,不進(jìn)行值的傳遞處理,也沒有內(nèi)存單元,不進(jìn)行值的傳遞處理,也沒有“返回值返回值”的概的概念,因此宏調(diào)用不占用運(yùn)行時間。念,因此宏調(diào)用不占用運(yùn)行時間。 (3)在函數(shù)定義時,必須指定每一個形式參數(shù)的類型,在函數(shù)定義時,必須指定每一個形式參數(shù)的類型,而宏定義中只給出形式參數(shù),宏不存在類型問題,宏名無而宏定義中只給出形式參數(shù),宏不存在類型問題,宏名無類型,它的參數(shù)也沒有類型,只是一個符號代表。類型,它的參數(shù)也沒有類型,只是一個符號代表。 (4)調(diào)用函數(shù)只可以得到一個返回值,而用宏可以設(shè)法調(diào)用函數(shù)只可以得到一個返回值,而用宏可以設(shè)法得到幾個結(jié)果。得到幾個結(jié)果。 6.5 編譯預(yù)處
47、理6.5.2 文件包含文件包含一般形式為:一般形式為:include “文件名文件名” 或或 include 它的功能是把指定的文件插入該命令行位置取代它的功能是把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當(dāng)前的源程序文該命令行,從而把指定的文件和當(dāng)前的源程序文件連成一個源文件。件連成一個源文件。 6.5 編譯預(yù)處理 6.5.3 條件編譯條件編譯 為了提高程序的可移植性,增加程序的靈活性,有時只希為了提高程序的可移植性,增加程序的靈活性,有時只希望對其中某一部分在滿足一定條件時才進(jìn)行編譯,即對部望對其中某一部分在滿足一定條件時才進(jìn)行編譯,即對部分內(nèi)容指定編譯條件,這就是條件編譯
48、。分內(nèi)容指定編譯條件,這就是條件編譯。 條件編譯命令有以下幾種形式:條件編譯命令有以下幾種形式: (1)ifdef 標(biāo)識符標(biāo)識符 程序段程序段1 else 程序段程序段2 endif 它的功能是它的功能是:當(dāng)所指定的標(biāo)識符被當(dāng)所指定的標(biāo)識符被#define命令命令定義過,程定義過,程序在編譯時只編譯程序段序在編譯時只編譯程序段1;否則,只編譯程序段;否則,只編譯程序段2,或不,或不編譯。編譯。6.5 編譯預(yù)處理 (2)ifndef 標(biāo)識符標(biāo)識符 程序段程序段1 else 程序段程序段2 endif 它的功能是當(dāng)所指定的標(biāo)識符沒有被它的功能是當(dāng)所指定的標(biāo)識符沒有被 #define命令定義過,命令
49、定義過,則在程序編譯時只編譯程序段則在程序編譯時只編譯程序段1;否則編譯程序段;否則編譯程序段2,或不,或不編譯。這種形式與第一種形式的功能正好相反。編譯。這種形式與第一種形式的功能正好相反。 (3)if 表達(dá)式表達(dá)式 程序段程序段1 else 程序段程序段2 endif 它的功能是當(dāng)指定的表達(dá)式的值為真(非零)時,程序在它的功能是當(dāng)指定的表達(dá)式的值為真(非零)時,程序在編譯時只編譯程序段編譯時只編譯程序段1;否則編譯程序段;否則編譯程序段2,或不編譯。,或不編譯。 6.6函數(shù)應(yīng)用舉例 【例例6-14】由鍵盤任意輸入兩個整數(shù),求這兩個整數(shù)的最由鍵盤任意輸入兩個整數(shù),求這兩個整數(shù)的最大公約數(shù)和最
50、小公倍數(shù)。大公約數(shù)和最小公倍數(shù)。 分析:設(shè)兩個整數(shù)用變量分析:設(shè)兩個整數(shù)用變量m、n表示,最大公約數(shù)用表示,最大公約數(shù)用“輾輾轉(zhuǎn)相除法轉(zhuǎn)相除法”求解,其思路是:首先用兩個數(shù)中的大數(shù)求解,其思路是:首先用兩個數(shù)中的大數(shù)m除除以小數(shù)以小數(shù)n,得到一個余數(shù),得到一個余數(shù)r,若,若r的值為的值為0,則此時的除數(shù),則此時的除數(shù)n就是最大公約數(shù);若就是最大公約數(shù);若r的值不為的值不為0,則把除數(shù)作為被除數(shù),則把除數(shù)作為被除數(shù),余數(shù)作為除數(shù),再相除,直到余數(shù)為余數(shù)作為除數(shù),再相除,直到余數(shù)為0為止。從數(shù)學(xué)知識為止。從數(shù)學(xué)知識可知道,任何兩個整數(shù)的最小公倍數(shù)等于這兩個數(shù)之積再可知道,任何兩個整數(shù)的最小公倍數(shù)等
51、于這兩個數(shù)之積再除以這兩個數(shù)的最大公約數(shù)。即最小公倍數(shù)除以這兩個數(shù)的最大公約數(shù)。即最小公倍數(shù)=m*n/最大公最大公約數(shù)。定義一個函數(shù)約數(shù)。定義一個函數(shù)maxdivisor來實(shí)現(xiàn)最大公約數(shù)。來實(shí)現(xiàn)最大公約數(shù)。6.6函數(shù)應(yīng)用舉例 #include main( ) int maxdivisor(int m,int n); /* 函數(shù)的聲明函數(shù)的聲明*/ int a,b,divisor,multiple; printf(input two integer numbers:); scanf(%d%d,&a,&b);divisor= maxdivisor(a,b); /* 調(diào)用函數(shù),求最大公約數(shù)調(diào)用函數(shù),求最大公約數(shù)*/ multiple=a*b/divisor; /*求最小公倍數(shù)求最小公倍數(shù) */ printf(The largest common divisor:%dn,divisor);printf(The small common multiple:%dn,multiple); 6.6函數(shù)應(yīng)用舉例int maxdivisor(int m,int n)/* 定義求出最大公約定義求出最大公
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國教育智能交互顯示行業(yè)資本規(guī)劃與股權(quán)融資戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國鋁電解電容器行業(yè)全國市場開拓戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國單體酒店行業(yè)資本規(guī)劃與股權(quán)融資戰(zhàn)略制定與實(shí)施研究報(bào)告
- 建設(shè)項(xiàng)目安全設(shè)施監(jiān)理情況報(bào)告
- 網(wǎng)絡(luò)工程師2025年工作計(jì)劃
- 除塵器等電力設(shè)備制造申請報(bào)告可行性研究報(bào)告
- 三年級數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)匯編及答案
- 春節(jié)餐飲盛宴之道
- 實(shí)習(xí)班主任班級工作參考計(jì)劃
- 國內(nèi)專利培訓(xùn)課件知識
- 血細(xì)胞分析報(bào)告規(guī)范化指南2020
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之7:“5領(lǐng)導(dǎo)作用-5.1領(lǐng)導(dǎo)作用和承諾”(雷澤佳編制-2025B0)
- 2024年快速消費(fèi)品物流配送合同6篇
- 機(jī)電傳動單向數(shù)控平臺-礦大-機(jī)械電子-有圖
- 《中國近現(xiàn)代史綱要(2023版)》課后習(xí)題答案合集匯編
- GB/T 7661-2009光學(xué)零件氣泡度
- GB/T 4745-2012紡織品防水性能的檢測和評價(jià)沾水法
- GB/T 16857.1-2002產(chǎn)品幾何量技術(shù)規(guī)范(GPS)坐標(biāo)測量機(jī)的驗(yàn)收檢測和復(fù)檢檢測第1部分:詞匯
- GB 28261-2012安全氣囊氣體發(fā)生器用點(diǎn)火具生產(chǎn)安全技術(shù)條件
- RT qPCR(實(shí)時熒光定量PCR)課件
- 醫(yī)院發(fā)熱門診工作考核表
評論
0/150
提交評論