版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第四章第四章 模塊化程序設計模塊化程序設計主講人:韓維良2022年3月1日C語言程序設計C語言支持模塊化程序設計的功能:(1) C語言用函數(shù)組織程序: 一個程序由一個或多個源程序文件組成; 每一個源程序文件就是一個程序模塊; 每一個程序模塊由一個或多個函數(shù)組成。程序設計的任務就是設計一個個函數(shù),并且確定它們之間的調(diào)用關系。在設計函數(shù)時要使每個函數(shù)都具有各自獨立的功能和明顯的界面。 C語言程序設計 (2) 通過給變量定義不同的存儲類別,控制模塊內(nèi)部及外部的信息交換。 (3) 具有編譯預處理功能,為程序的調(diào)試、移植提供了方便,也支持了模塊化程序設計。C語言程序設計第一節(jié)第一節(jié) 函函 數(shù)數(shù)一、設計一
2、、設計C C語言程序就是設計函數(shù)語言程序就是設計函數(shù)用C語言設計程序,任務只有一種,就是編寫函數(shù),至少也要編寫一個main函數(shù)。執(zhí)行C程序也就是執(zhí)行相應的main函數(shù)。即從main函數(shù)的第一個前花括號開始,依次執(zhí)行后面的語句,直到最后的后花括號為止。C語言程序設計模塊化程序設計有一個原則模塊化程序設計有一個原則:就是每個模塊的規(guī)模一般不能太大(一般要控制在4060行之間),以便于閱讀,便于檢查其中的錯誤。在C語言中,減少主函數(shù)規(guī)模的一項基本措施就是通過調(diào)用其它函數(shù)來實現(xiàn)主函數(shù)需要的一些功能。一般一般C C語言程序的執(zhí)行過程語言程序的執(zhí)行過程程序結(jié)構圖程序結(jié)構圖大學信息管理系統(tǒng)C語言程序設計二、
3、函數(shù)結(jié)構二、函數(shù)結(jié)構一個C語言函數(shù)的結(jié)構形式如下:函數(shù)頭函數(shù)體C語言程序設計1. 函數(shù)頭函數(shù)頭結(jié)構: 函數(shù)類型函數(shù)類型 函數(shù)名(形式參數(shù)表列)函數(shù)名(形式參數(shù)表列)一個函數(shù)的函數(shù)頭的結(jié)構如下:(1)函數(shù)類型:指定函數(shù)值的類型,即函數(shù)返回值的類型。(2)函數(shù)名:必須采用合法的用戶標識符。(3)圓括號:是“函數(shù)運算符”,表示進行函數(shù)運算,函數(shù)運算符具有很高的運算優(yōu)先級別。C語言程序設計(4)形式參數(shù)表:由寫在一對圓括號(函數(shù)運算符)中的一系列參數(shù)組成。每一個參數(shù)由一個類型符和一個參數(shù)名組成。參數(shù)名是合法的標識符。函數(shù)可以沒有參數(shù),這時在函數(shù)運算符內(nèi)寫一個“void”,也可以空白,但小括號不能省略。
4、C語言程序設計2. 函數(shù)體 函數(shù)體由一些語句組成。主要是三種類型的語句:聲明語句聲明語句:聲明在函數(shù)中要使用的變量等程序?qū)嶓w??蓤?zhí)行語句可執(zhí)行語句:用來實現(xiàn)函數(shù)的功能,包括若干流程控制 語句和表達式語句。returnreturn語句語句:停止本函數(shù)的執(zhí)行,使流程返回到調(diào)用處。C語言程序設計編譯器將函數(shù)分為三類進行處理:純粹計算型函數(shù),如sqrt()和sin()。將返回一個計算結(jié)果。完成一項具體工作,返回完成的成敗。如printf()執(zhí)行成功時,返回顯示的字節(jié)數(shù);失敗時,返回一個負整數(shù)。函數(shù)不產(chǎn)生返回值,其類型應定義為void。C99規(guī)定,對于非void類型的函數(shù),必須使用有返回值的return
5、語句。int absolutevalue (int x) /* 絕對值函數(shù) */ return (x=0?x:-x); void spc (int n) /* n空格函數(shù) */ int i;for (i=0; in;i+) printf ();return; /* 可以不要return語句 */ float y(float x) if (x10)return (2*n+3);elsereturn; C語言程序設計3. 函數(shù)中變量的作用域 作用域作用域指的是一個程序段中的變量的作用范圍,在一個函數(shù)中定義的變量只在本函數(shù)中有效,在其它函數(shù)中不能使用這個變量。因此說,該變量的作用域是它所在的函數(shù)(從
6、定義該變量的行開始到函數(shù)末尾)。即使在不同的函數(shù)中定義了同名的變量,它們也是指不同的變量。#include int func(int x) x=5;return x+3;int main(void)printf(x=%dn,x);return 0;C語言程序設計 4. 空函數(shù)空函數(shù)是一個不產(chǎn)生任何有效操作的函數(shù),但它卻是一個合法的C函數(shù)。例如函數(shù)void null(void) 就是一個空函數(shù)。空函數(shù)多使用在模塊化程序的設計或測試中。有一些函數(shù)還未編寫,可用空函數(shù)進行調(diào)試,這樣就可以調(diào)試程序的其它部分,等以后再逐步補上。C語言程序設計三、函數(shù)定義與函數(shù)聲明三、函數(shù)定義與函數(shù)聲明1、函數(shù)定義函數(shù)定
7、義是按照C語言的語法規(guī)則引入新的函數(shù),并提供如下信息:函數(shù)的返回值類型(如果有);參數(shù)的個數(shù)及類型和名稱;調(diào)用函數(shù)時要執(zhí)行的代碼;函數(shù)的有效性(不能嵌套定義)。C語言程序設計函數(shù)的定義函數(shù)的定義類型說明符類型說明符 函數(shù)名函數(shù)名( (類型名類型名 形式參數(shù)形式參數(shù)1 , 1 , 類型名類型名 形形式參數(shù)式參數(shù)2 , ) /2 , ) /* * 函數(shù)的首部函數(shù)的首部 * */ / 說明部分說明部分 / /* * 函數(shù)體函數(shù)體 * */ / 語句部分語句部分 C語言程序設計其中類型說明符和函數(shù)名部分共稱為函數(shù)頭函數(shù)頭。類型說明符類型說明符即本函數(shù)的類型,實為函數(shù)返回值的類型。函數(shù)名函數(shù)名是由用戶定
8、義的標識符,函數(shù)名后有一個括號,其內(nèi)容為形參表。在形參表中給出的參數(shù)稱為形式參數(shù)形式參數(shù),即形式參數(shù)變量的定義,各參數(shù)定義之間用逗號間隔各參數(shù)定義之間用逗號間隔。在進行函數(shù)調(diào)用時,主調(diào)函數(shù)將賦予這些形式參數(shù)實際的值。當形參表中無參數(shù)時,括號不可少。 中的內(nèi)容稱為函數(shù)體函數(shù)體。在函數(shù)體中也有類型說明, 這是對函數(shù)體內(nèi)部所用到的變量的類型說明。注意:函數(shù)不能嵌套定義。 void fun1() int fun2() C語言程序設計2 2、函數(shù)的返回值及其類型、函數(shù)的返回值及其類型(1 1) returnreturn語句語句函數(shù)的返回值通過函數(shù)體內(nèi)的return語句實現(xiàn)。returnreturn 返回
9、值表達式返回值表達式 ; ;或returnreturn ( (返回值表達式返回值表達式););如果沒有返回值,格式中的左、右圓括號可以省略,即寫為:returnreturn ; ;功能:返回調(diào)用函數(shù),并將“返回值表達式”的值帶給調(diào)用函數(shù)。C語言程序設計說明:1)函數(shù)的返回值只能有一個。2)當函數(shù)中不需要指明返回值時,可以寫成:return;也可以不寫。函數(shù)運行到右花括號自然結(jié)束。3)一個函數(shù)體內(nèi)可以有多個返回語句,不論執(zhí)行到哪一個,函數(shù)都結(jié)束,回到主調(diào)函數(shù)。4)當函數(shù)沒有指明返回值,即return; 或沒有返回語句時,函數(shù)執(zhí)行后實際上不是沒有返回值,而是返回一個不確定的值,有可能給程序帶來某種
10、意外的影響。C語言程序設計(2)函數(shù)返回值的類型函數(shù)定義時的類型就是函數(shù)返回值的類型。從理論上,C語言要求函數(shù)定義的類型應當與返回語句中表達式的類型保持一致。當兩者不一致時,系統(tǒng)自動進行轉(zhuǎn)換,將函數(shù)返回語句中表達式的類型轉(zhuǎn)換為函數(shù)定義時的類型。如果定義函數(shù)缺省函數(shù)類型,則如果定義函數(shù)缺省函數(shù)類型,則系統(tǒng)一律按系統(tǒng)一律按intint型處理型處理。C語言程序設計 3、函數(shù)聲明函數(shù)聲明是對所用到的函數(shù)的特征進行必要的聲明。編譯系統(tǒng)以函數(shù)聲明為檢測依據(jù)編譯系統(tǒng)以函數(shù)聲明為檢測依據(jù):檢測形參與實參類型是否一致,返回值的類型是否正確,以保證調(diào)用表達式與函數(shù)之間的參數(shù)正確傳遞。聲明語句提供的必要信息包括聲明
11、語句提供的必要信息包括:函數(shù)名,函數(shù)的類型,函數(shù)參數(shù)的個數(shù)、排列次序以及每個參數(shù)的類型。C語言程序設計函數(shù)的定義可以按任意的次序,但在主調(diào)函數(shù)中,要調(diào)用另一個函數(shù),則需要對被調(diào)函數(shù)先做聲明(或者說明)。所謂聲明所謂聲明,就是把函數(shù)的類型、函數(shù)的名稱、函數(shù)形參的類型及個數(shù)、順序通知編譯系統(tǒng),便于在調(diào)用時進行檢查。函數(shù)聲明的一般形式: 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( (參數(shù)類型參數(shù)類型1 , 1 , 參數(shù)類型參數(shù)類型2) ;2) ;或 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( (參數(shù)類型參數(shù)類型1 1 參數(shù)名參數(shù)名1 , 1 , 參數(shù)類型參數(shù)類型2 2 參數(shù)名參數(shù)名2) ;2) ;C語言程序設計說明:(
12、1)如果被調(diào)函數(shù)的返回值為int類型,則不管被調(diào)函數(shù)位置如何均不需要在主調(diào)函數(shù)中說明。(2) 如果被調(diào)用函數(shù)的聲明放在源文件的開頭,則該聲明對整個源文件都有效。(3) 如果被調(diào)用函數(shù)的聲明是在調(diào)用函數(shù)定義的內(nèi)部,則該聲明僅對該調(diào)用函數(shù)有效。 C語言程序設計(4) 在函數(shù)調(diào)用中,有下面幾種情況可以省略聲明:a. 如果調(diào)用函數(shù)和被調(diào)用函數(shù)是在同一個源文件中,而且被調(diào)用函數(shù)的定義是在調(diào)用函數(shù)之前。b. 函數(shù)的返回值是整數(shù)或字符。c. 所有被調(diào)用函數(shù)的聲明都是在源文件開頭。d. 如果被調(diào)用函數(shù)不是在源文件開頭,而是在源文件中間且在所有函數(shù)之外某處被聲明時,則在被聲明之后引用它時,不必再聲明,但在被聲明
13、之前引用它時,需要對其進行聲明。(5) 如果調(diào)用函數(shù)和被調(diào)用函數(shù)的定義是在同一源文件中,應該先說明或定義被調(diào)用函數(shù)。設有一函數(shù)的定義為:double func (double a, int b, char c)/* 函數(shù)體*/與之相應的函數(shù)聲明應為:double func (double x, int y, char z); /* 注意末尾的分號 */3333C語言程序設計例求二實數(shù)之和main ( ) float add(float,float); float a, b, c; scanf(%f%f,&a, &b); c=add(a, b); /*函數(shù)表達式調(diào)用形式*/ pr
14、intf (sum= %f;c);float add( float x, float y) float z; z=x+y; return z;說明:調(diào)用過程中參數(shù)的對應關系。C語言程序設計例 定義一個求兩個整數(shù)中極大值的max()函數(shù)。 /*功能:求2個整數(shù)中的較大數(shù) */*形參:2個,整型 */*返回值: 2個整數(shù)中的較大數(shù) */int max(int n1,int n2) /*函數(shù)定義 */ int z; z= n1 n2 ? n1 : n2; return (z);C語言程序設計void main( void ) int max(int n1, int n2); /*對被調(diào)函數(shù)說明*/
15、int num1,num2; printf(input two numbers: ); scanf(%d%d, &num1, &num2); printf(max=%dn, max(num1, num2);C語言程序設計四、虛實結(jié)合與傳值調(diào)用四、虛實結(jié)合與傳值調(diào)用一個函數(shù)中的函數(shù)體,只有在該函數(shù)被調(diào)用時才會執(zhí)行。在函數(shù)被調(diào)用時進行如下兩個操作:將函數(shù)調(diào)用中的實際參數(shù)值傳送給函數(shù)定義中的形式參數(shù);將流程從調(diào)用處轉(zhuǎn)到被調(diào)用函數(shù)的開頭,開始執(zhí)行函數(shù)體中的代碼。C語言程序設計1 1、函數(shù)調(diào)用的一般形式、函數(shù)調(diào)用的一般形式格式: 函數(shù)名(實參表)函數(shù)按名稱調(diào)用。如果是調(diào)用無參函數(shù),則實參
16、表可以沒有,但括號不能省略。用逗號分隔多個實參。實參與形參的個數(shù)應相等,類型應一致。實參與形參按順序?qū)?,一一傳遞數(shù)據(jù)。 調(diào)用時,實參必須具有確定的值,且與形參個數(shù)相等、調(diào)用時,實參必須具有確定的值,且與形參個數(shù)相等、類型匹配。類型匹配。C語言程序設計(1 1)形參與實參)形參與實參形式參數(shù)形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名:定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù)實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式:調(diào)用函數(shù)時函數(shù)名后面括號中的表達式開參是虛的,類似于占位符,而實參是實的,具體的。形參出現(xiàn)在函數(shù)定義中,只能在該函數(shù)體內(nèi)表示欲處理的數(shù)據(jù),并沒有確定的值。發(fā)生函數(shù)調(diào)用時,調(diào)用
17、函數(shù)把實參的值傳送給被調(diào)用函數(shù)中的形參,從而實現(xiàn)調(diào)用函數(shù)向被調(diào)用函數(shù)的數(shù)據(jù)傳送。C語言程序設計(2 2)函數(shù)調(diào)用的方式)函數(shù)調(diào)用的方式按函數(shù)在程序中出現(xiàn)的位置分,有2種函數(shù)調(diào)用方式。1) 1) 函數(shù)語句函數(shù)語句函數(shù)語句的調(diào)用,是指把被調(diào)函數(shù)作為一個獨立的語句直接出現(xiàn)在主調(diào)函數(shù)中。2) 2) 函數(shù)表達式函數(shù)表達式被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)中的表達式中,這種表達式稱為函數(shù)表達式。在被調(diào)函數(shù)中,必須有一個函數(shù)返回值,返回主調(diào)函數(shù)以參加表達式的運算。 C語言程序設計(3 3)說明)說明1)按函數(shù)名調(diào)用函數(shù)。2)實參在類型上按順序與形參一一對應和匹配實參在類型上按順序與形參一一對應和匹配。如果類型不匹配,C
18、編譯程序?qū)促x值兼容的規(guī)則進行轉(zhuǎn)換。如果實參和形參的類型不賦值兼容,通常并不給出出錯信息,且程序仍然繼續(xù)執(zhí)行,只是得不到正確的結(jié)果。3)實參可以是常量、變量、表達式、函數(shù)等實參可以是常量、變量、表達式、函數(shù)等。無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此,應預先用賦值、輸入等辦法,使實參獲得確定的值。C語言程序設計4)形參變量只有在被調(diào)用時,才分配內(nèi)存單元;調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元。因此,形參只有在該函數(shù)內(nèi)有效。調(diào)用結(jié)束,返回調(diào)用函數(shù)后,則不能再使用該形參變量。5)實參對形參的數(shù)據(jù)傳送是單向的實參對形參的數(shù)據(jù)傳送是單向的,即只能把實
19、參的值傳送給形參,而不能把形參的值反向地傳送給實參。6)實參和形參占用不同的內(nèi)存單元,即使同名也互不影響。2 2、函數(shù)調(diào)用時的虛實結(jié)合、函數(shù)調(diào)用時的虛實結(jié)合參數(shù)是函數(shù)調(diào)用時進行信息交換的載體。實參是調(diào)用函數(shù)中的變量,形參是被調(diào)函數(shù)中的變量。函數(shù)調(diào)用時實現(xiàn)了實參與形參的結(jié)合。這稱為“虛實結(jié)合”。#include float add( );int main(void)float x=1.5, y=-5.7;printf (%f+%f=%fn, x,y, add(x,y);float add (unsigned int a, unsigned int b) printf(a=%u, b=%un, a
20、,b);return (a+b);3 3、傳值調(diào)用的虛實結(jié)合過程、傳值調(diào)用的虛實結(jié)合過程程序進行編譯時,并不為形式參數(shù)分配存儲空間。只有在被調(diào)用時,形式參數(shù)才臨時地占有存儲空間,其過程如下:(1)調(diào)用開始,系統(tǒng)為形參開辟一個臨時存儲區(qū),形參與實參各占一個獨立的存儲空間。(2)將各實參之值傳遞給對應形參,形參得到了實參的值。這種虛實結(jié)合方式稱為“值結(jié)合”。(3)函數(shù)返回時,臨時存儲區(qū)也被撤銷。特別注意:在C程序中實參與形參是傳值調(diào)用(call by value) 的特點。即實參與形參是“單向的值傳遞單向的值傳遞”即函數(shù)中對形參變量的操作不會影響到調(diào)用函數(shù)中的實參變量,即形參值不能傳回給實參。#i
21、nclude void swap (int x, int y);int main(void)int a=3, b=5;swap (a,b);printf (a=%d, b=%dn, a,b);return 0;void swap (int x, int y)int temp;temp=x, x=y, y=temp; /* 交換變量的值 */printf(x=%d,y=%dn,x,y);執(zhí)行結(jié)果:執(zhí)行結(jié)果:x=5,y=3a=3,b=5企圖交換變量企圖交換變量a,b的值,沒的值,沒有成功有成功五、五、函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用語言的函數(shù)定義是互相平行、獨立的函數(shù)不能嵌套定義可以嵌套調(diào)用函數(shù)調(diào)用一
22、個函數(shù)的過程中,又可以調(diào)用另一個函數(shù)。函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用的過程的過程main函數(shù)函數(shù)調(diào)用調(diào)用a函數(shù)函數(shù)結(jié)束結(jié)束a函數(shù)函數(shù)調(diào)用調(diào)用b函數(shù)函數(shù)b函數(shù)函數(shù)C語言程序設計例一個偶數(shù)為兩個素數(shù)之和。德國數(shù)學家哥德巴赫(GoLdbach)在1725年寫給歐拉(Euler)的信中寫下了以下猜想:任何不小于6的偶數(shù)都是兩個素數(shù)之和(俗稱為1+1)。如633,1257等等。 兩個多世紀過去了,這一猜想既無法證明也沒被推翻。試設計程序驗證這一猜想是否成立。 對于一個偶數(shù),找出一個小于它的數(shù),判斷是否是素對于一個偶數(shù),找出一個小于它的數(shù),判斷是否是素數(shù)數(shù),如果是就計算該偶數(shù)與該素數(shù)的差并判斷它是否是素數(shù)。
23、如果兩者都是素數(shù)則猜想得到驗證。問題表現(xiàn)為:任意輸入一個偶數(shù),可將其分解為兩個素數(shù)之和。5050C語言程序設計#include main()void even(int x);int a;printf(“請輸入一個偶數(shù):”);scanf(“%d”,&a);if (a%2=0) even(a); /*函數(shù)調(diào)用語句*/else printf(“所輸入的數(shù)不是偶數(shù)!n”);5151C語言程序設計void even(int x)int isprime(int a);int i;for(i=2;i=x/2;i+) if ( isprime(i) & isprime(x-i) ) print
24、f(“%d=%d+%dn”,x,i,x-i); return; C語言程序設計int isprime(int a)int i;for(i=2;i=a/2;i+) if(a%i=0) return 0;return 1; 注意兩個返回語句。C語言程序設計例輸入一個由若干個單詞組成的文本串,每個單詞之間用空格、換行符、跳格符(制表符)分隔,且分隔符可以不至一個(如連續(xù)的兩個空格),以作為輸入的結(jié)束標志,統(tǒng)計此文本串單詞的個數(shù)? 如輸入:T This i is a a s student.分析:,所以從輸入的文本串中逐個讀取每一個字符,當讀到每一個單詞的第一個字母時,計數(shù)器加1 。如何知道讀取到的字
25、符是單詞的第一個字母呢?如何知道讀取到的字符是單詞的第一個字母呢?如果讀取到的字符是分隔符,則不是單詞的一部分;如果讀取到的字符不是分隔符,且它的上一個字符是分隔符,則它是單詞的第一個字母,計數(shù)器加1。如果讀取到的字符不是分隔符,且它的上一個字符也不是分隔符,則它是單詞的非首字母,計數(shù)器不加1。C語言程序設計當前讀取到的字符是否是單詞的一部分,可用一個狀態(tài)變量來表示,如果是單詞的一部分,則用1表示,反之用0表示。#include #define IN 1#define OUT 0int countword();main()int n;n=countword();printf(“單詞數(shù)為:%dn
26、”,n);5555C語言程序設計int countword() /*沒有形參*/int c,nw,state;state=OUT;nw=0;while(c=getchar()!=)if(c= |c=n|c=t) state=OUT;else if(state=OUT) state=IN; nw+; return(nw);六、遞歸函數(shù)六、遞歸函數(shù)一個函數(shù)可以調(diào)用另一個函數(shù)。遞歸函數(shù)一個函數(shù)自己調(diào)用自己(直接地或間接地調(diào)用自己)。前者稱為直接遞歸調(diào)用函數(shù),后者稱為間接遞歸調(diào)用函數(shù)。 1.遞歸調(diào)用次數(shù)有限 2.程序執(zhí)行有規(guī)律 3.有結(jié)束調(diào)用的條件C語言程序設計遞歸調(diào)用是指一個函數(shù)直接或間接地調(diào)用自己
27、。這種函數(shù)稱為遞歸函數(shù)。自己調(diào)用自己自己調(diào)用自己,即要解決一個問題,轉(zhuǎn)化為一個用同樣的方法解決的新問題,只是參數(shù)在不斷地遞增或者遞減。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復調(diào)用其自身。 對于一些特定的問題,用遞歸算法來解決,可以簡化問題的復雜程度。3/1/2022583/1/202259C語言程序設計例:用遞歸調(diào)用求n!。要用遞歸法解決此問題,必須明確兩個問題:、遞歸算法n!=n*(n-1)!(n-1)!=(n-1)*(n-2)!;求n的階乘的問題,轉(zhuǎn)化為用同樣的方法求(n-1)的階乘。如:4!4*3! 3!3*2!如果編寫成一個函數(shù),則調(diào)用如下:f(n)=n*f(n-1);不
28、斷地自己調(diào)用自己。C語言程序設計、遞歸終結(jié)條件遞歸到一定的程度后,必須終止。如求階乘時,當求到1!時,必須停止遞歸。f(1)=1這一條是必須的,否則將會沒完沒了的進行下去。通常用條件判斷, 滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。C語言程序設計例如有函數(shù)f如下:int f(int x) z=f(x1); return z;上頁中的函數(shù)是一個遞歸函數(shù)。 但是運行該函數(shù)將無休止地調(diào)用其自身,這當然是不正確的。為了防止遞歸調(diào)用無終止地進行, 必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。C語言程序設計例 用遞歸法計算n!。#include long f(int n) long y; if(n1) y=n*
29、f(n-1); else y=1; return(y);6464C語言程序設計main() int n; long y; printf(“input a inteager number:”); scanf(%d,&n); y=f(n); printf(%d!=%ldn,n,y);程序運行情況如下:input a inteager number: 5 5!=120C語言程序設計程序說明:程序中給出的函數(shù)f是一個遞歸函數(shù)。主函數(shù)調(diào)用f 后即進入函數(shù)f執(zhí)行,如果n0,n=0或n=1時都將結(jié)束函數(shù)的執(zhí)行,否則就遞歸調(diào)用f函數(shù)自身。由于每次遞歸調(diào)用的實參為n-1,即把n-1 的值賦予形參n,最后
30、當n-1的值為1時再作遞歸調(diào)用,形參n的值也為1,將使遞歸終止。然后可逐層退回。C語言程序設計如求4!的過程分解如下:f(4)=4*f(3)f(3)=3*f(2)f(2)=2*f(1)f(1)=1f(4)=4*6=24f(3)=3*2=6f(2)=2*1=2C語言程序設計例:用遞歸法求菲波那契數(shù)列第40項的值,該數(shù)列為:1,1,2,3,5,8,13,21,規(guī)律:每一項為其前兩項的和。遞歸算法如下:fib(n)=fib(n-1)+fib(n-2);遞歸的終結(jié)條件如下:fib(1)=1;fib(2)=1;C語言程序設計#include main()int n;long fib(int); /*第4
31、0項的值很大*/printf(“請輸入項數(shù):”);scanf(“%d”,&n);printf(“第%d項的值為:%ldn”,n,fib(n);6969C語言程序設計long fib(int n)long result;if(n=1|n=2) result=1;else result=fib(n-1)+fib(n-2);return result;第二節(jié)第二節(jié) 變量的存儲屬性變量的存儲屬性變量是對程序中數(shù)據(jù)存儲的抽象。C語言程序中變量都有類型,數(shù)據(jù)類型是變量的運算屬性的抽象,決定了該變量的取值范圍和可以施加的運算種類。除此之外,變量還有一些屬性,例如:一個變量在程序的哪個范圍內(nèi)是可以使用
32、的變量的變量的可用域可用域; 它什么時候生成以及什么時候被撤消變量的生存變量的生存期期; 它存儲在什么哪種類型的存儲器中以及用什么機制進行存儲變量的存儲區(qū)變量的存儲區(qū)。這些都稱為變量的存儲屬性。一、變量的作用域與生存期一、變量的作用域與生存期在函數(shù)中形參變量只在被調(diào)用期間才分配內(nèi)存單元,調(diào)用結(jié)束立即釋放。形參變量只有在函數(shù)內(nèi)才是有效的,離開該函數(shù)就不能再使用了。如:貨幣的使用范圍,校園卡的使用范圍。1. 1. 局部變量和全局變量局部變量和全局變量變量的可用域是指一個變量在程序的哪個域內(nèi)才是可以被識別的,也稱為可見(或可用)的。變量可分為兩種:全局可用全局可用全局變量全局變量局部可用局部可用局部
33、變量局部變量。C語言程序設計局部變量局部變量:在一個函數(shù)在一個函數(shù)或者復合語句或者復合語句( (如函數(shù)體、循環(huán)如函數(shù)體、循環(huán)體體) )內(nèi)部內(nèi)部定義定義的變量是的變量是局部變量局部變量,它只在該函數(shù)它只在該函數(shù)或者復合語或者復合語句句范圍內(nèi)有效。范圍內(nèi)有效。而在其它函數(shù)內(nèi)不能使用。而在其它函數(shù)內(nèi)不能使用。只有在包含變量定義的函數(shù)內(nèi)部,才能使用被定義的變量,在此函數(shù)之外就不能使用這些變量了。又稱為內(nèi)部變量。例如:int f1(int a) /*函數(shù)f1*/ int b,c; /*a,b,c作用域:僅限于函數(shù)f1()中*/C語言程序設計int f2(int x) /*函數(shù)f2*/ int y,z;
34、/*x,y,z作用域:僅限于函數(shù)f2()中*/ main() int m,n; /*m,n作用域:僅限于函數(shù)main()中*/由于局部變量只在一個局部范圍中使用,因此在不同的函數(shù)中可以定義同名的局部變量,它們互不干擾,各自分配不同的獨立存貯單元。這種特性便于進行模塊化設計,不同的模塊由不同的程序員設計,各模塊中使用的變量名由用戶自己確定,即便相同也不會彼此影響。7575C語言程序設計#include main() void fun1(); void fun2(); int x=1; printf(“x=%dn”,x); int x=3; printf(“x=%dn”,x); printf(“x
35、=%dn”,x); fun1(); printf(“x=%dn”,x); fun2(); printf(“x=%dn”,x); fun1();C語言程序設計fun1() int x=5; printf(“x=%dn”,x); fun2() int x=7; printf(“x=%dn”,x); 說明:四個X分別分配了不同的存貯單元。同一函數(shù)的兩次調(diào)用分配了不同的單元。b b的作用域的作用域C語言程序設計全局變量全局變量:也稱為外部變量,是在函數(shù)外部定義的變量,作用域為從定義全局變量位置開始到源程序結(jié)束,是多個是多個函數(shù)間進行數(shù)據(jù)傳遞的一種手段函數(shù)間進行數(shù)據(jù)傳遞的一種手段。全局變量可以在其作用范
36、圍內(nèi),由各函數(shù)所共用。 在函數(shù)中使用全局變量,一般應作全局變量說明。 只有在函數(shù)內(nèi)經(jīng)過說明的全局變量才能使用。全局變量的說明符為extern。 但在一個函數(shù)之前定義的全局變量,在該函數(shù)內(nèi)使用可不再加以說明。C語言程序設計例如:int a,b; /*外部變量*/void f1() /*函數(shù)f1*/float x,y; /*外部變量*/ int f2() /*函數(shù)f2*/C語言程序設計main() /*主函數(shù)*/ /*全局變量x,y作用域 全局變量a,b作用域*/從上例可以看出a、b、x、y 都是在函數(shù)外部定義的外部變量,都是全局變量。但x,y 定義在函數(shù)f1之后,而在f1內(nèi)又無對x,y的說明,所
37、以它們在f1內(nèi)無效。 a,b定義在源程序最前面,因此在f1,f2及main內(nèi)不加說明也可使用。8181C語言程序設計#include int a=3,b=5;main() void fun(); printf(“a=%d,b=%dn”,a,b); fun(); printf(“a=%d,b=%dn”,a,b); void fun() int c; c=a;a=b;b=c; printf(“a=%d,b=%dn”,a,b); C語言程序設計【例】輸入長方體的長寬高l,w,h。求體積及三個面x*y,x*z,y*z的面積。int s1,s2,s3;int vs( int a,int b,int c)
38、int v;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;return v;C語言程序設計main()int v,l,w,h;printf(ninput length,width and height: );scanf(%d%d%d,&l,&w,&h);v=vs(l,w,h);printf(v=%d s1=%d s2=%d s3=%dn,v,s1,s2,s3);程序運行結(jié)果如下:input length,width and height:4 5 6 v=120 s1=20 s2=30 s3=24C語言程序設計程序說明:本程序中定義了三個外部變量s1,s2,s
39、3,用來存放三個面積,其作用域為整個程序。函數(shù)vs用來求正方體體積和三個面積,函數(shù)的返回值為體積v。由主函數(shù)完成長寬高的輸入及結(jié)果輸出。由于語言規(guī)定函數(shù)返回值只有一個,當需要增加函數(shù)的返回數(shù)據(jù)時,用外部變量是一種很好的方式。本例中,如不使用外部變量,在主函數(shù)中就不可能取得v,s1,s2,s3四個值。而采用了外部變量,在函數(shù)vs中求得的s1,s2,s3值在main中仍然有效。因此外部變量是實現(xiàn)函數(shù)之間數(shù)據(jù)傳輸?shù)挠行侄?。C語言程序設計當在函數(shù)外定義了一個全局變量后,定義點之后的函數(shù)都可以使用該變量.當全局變量的值在一個函數(shù)中改變后,另一個函數(shù)使用的就是改變后的值.從定義開始到程序結(jié)束,全局變量自
40、始至終占用存儲空間.全局變量的使用使函數(shù)間的聯(lián)系加強,與程序設計”低耦合”的原則相違背,所以很少使用。例同名局部變量例同名局部變量#include int main(void) int a=3; printf(a1=%d,a); int a=5; printf(a2=%d,a); return 0;例演示全局變量例演示全局變量#include void a() int a=1; printf(a1=%dn,a); printf(x1=%dn,x);int x=3; * 定義外部變量定義外部變量 */void b() printf(x2=%dn,x);int main(void) a(); b(
41、); printf(x3=%dn,x); return 0;例演示全局變量與局部變量同名例演示全局變量與局部變量同名#include int x=3; /* 定義外部變量定義外部變量 */int main(void) int x=5; printf(x=%dn,x); return 0;2. 2. 動態(tài)變量與靜態(tài)變量動態(tài)變量與靜態(tài)變量運行中的程序,在內(nèi)存中被分成代碼區(qū)和數(shù)據(jù)區(qū)兩大部分。數(shù)據(jù)區(qū)又分為靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)、自動存儲區(qū)自動存儲區(qū)和動態(tài)分配區(qū)動態(tài)分配區(qū)三部分。自動存儲區(qū)是按棧組織的存儲區(qū)。除特別聲明的外,局部變量局部變量通常被存放在棧區(qū)。這些變量在進入所在的塊時被創(chuàng)建,所在的塊結(jié)束時被
42、撤銷,其值不再保留。并且,變量必須有程序員顯式地變量必須有程序員顯式地進行初始化進行初始化,否則它們的初始值是不確定的。靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)是在程序編譯時就分配的存儲區(qū)。分配在靜態(tài)存儲區(qū)的變量在程序開始執(zhí)行時被創(chuàng)建并自動初始化(數(shù)值變量被初始化為0),當程序結(jié)束時才被撤銷。所以常稱靜態(tài)變量的生存期是永久的靜態(tài)變量的生存期是永久的。全局變量就是被分配在靜態(tài)存儲區(qū)的。/* 企圖交換兩個變量的值*/#include void swap(void);/* 說明函數(shù) */int a=3, b=5;/* 聲明外部變量 */int main(void) printf (a=%d, b=%dn,a, b);
43、swap(); printf (a=%d, b=%dn, a,b); return 0;void swap(void) int c;/* 聲明自動變量*/ c=a; a=b; b=c;/* 交換變量的值 */二、二、C C語言中變量的存儲類型語言中變量的存儲類型根據(jù)可用域和生存期,變量有4種存儲類型:局部自動類型局部自動類型,在函數(shù)內(nèi)部用標識符auto或register聲明。靜態(tài)局部類型靜態(tài)局部類型,在函數(shù)內(nèi)部,使用static聲明。靜態(tài)全局類型靜態(tài)全局類型,在函數(shù)外部,使用static聲明,也稱靜態(tài)外部變量。全局類型全局類型,不需要標識符聲明。在函數(shù)外部直接聲明即可,通稱外部變量。1 1、a
44、utoauto存儲類型和存儲類型和registerregister存儲類型存儲類型使用auto聲明的變量是局部變量,編譯器將其分配在自動存儲區(qū)。其格式為:auto 數(shù)據(jù)類型變量名=初值表達式,;其中方括號表示可省略,省略auto,系統(tǒng)隱含認為此變量為auto。函數(shù)的參數(shù)(形參)也是一種自動變量。C語言程序設計自動變量的類型說明符為auto;語言規(guī)定,函數(shù)內(nèi)凡未加存儲類型說明的變量均視為函數(shù)內(nèi)凡未加存儲類型說明的變量均視為自動變量,也就是說自動變量可省去說明符自動變量,也就是說自動變量可省去說明符autoauto。在前面所學的程序中定義的變量凡未加存儲類型說明符的都是自動變量。C語言程序設計例如
45、: int a,b,k; char c;等價于: auto int a,b,k; auto char c;C語言程序設計自動變量自動變量的的特點:特點:自動變量的作用域僅限于定義該變量的函數(shù)或復合語句內(nèi)。自動變量存貯在自動存貯區(qū),只有在使用它,即定義該變量的函數(shù)被調(diào)用時才給它分配存儲單元,開始它的生存期。函數(shù)調(diào)用結(jié)束,釋放存儲單元,結(jié)束生存期。因此函數(shù)調(diào)用結(jié)束之后,自動變量的值不能保留。未初始化時,自動變量的值是不確定的。未初始化時,自動變量的值是不確定的。由于自動變量的作用域和生存期都局限于定義它的函數(shù)或復合語句內(nèi),因此不同的函數(shù)中允許使用同名的變量而不會混淆。C語言程序設計寄存器變量的說明
46、符是寄存器變量的說明符是registerregister。存放在CPU的寄存器中,使用時,不需要訪問內(nèi)存,而直接從寄存器中讀寫, 這樣可提高訪問效率。特點:加快運算速度,函數(shù)運行完即消失、使用有限。如定義一個頻繁使用的變量為寄存器類型:register int i;C語言程序設計2 2、靜態(tài)局部類型、靜態(tài)局部類型類型說明符:類型說明符:staticstatic,屬于靜態(tài)存儲方式;在一個函數(shù)內(nèi)部,可以用static定義一個變量,稱為靜靜態(tài)局部變量態(tài)局部變量。其作用域仍在定義它的函數(shù)內(nèi)部,但其生存期卻程序運行期。函數(shù)調(diào)用結(jié)束后,并不釋放所占用的存貯空間(總是占用固定的存貯空間),在程序運行期間,始
47、終存在,但除了定義它的函數(shù)以外,別的函數(shù)不能使用。整個程序運行結(jié)束后,才釋放占用的空間。C語言程序設計靜態(tài)局部變量的特點:靜態(tài)局部變量的特點:(1)靜態(tài)局部變量在每次調(diào)用函數(shù)結(jié)束后能夠保留調(diào)用結(jié)束后的值不變,留待下一次調(diào)用,變量值具有繼承性繼承性。 (2)靜態(tài)局部變量只限于被本函數(shù)使用,不能被其他函數(shù)使用 (3)靜態(tài)局部變量屬于靜態(tài)存儲類別,在整個程序運行期間都不釋放;而動態(tài)存儲變量屬于動態(tài)存儲類別,函數(shù)調(diào)用結(jié)束即釋放,再次調(diào)用又將重新分配空間。(4)在定義靜態(tài)局部變量時,如果不賦初值不賦初值,系統(tǒng)自動賦值為0或空字符(對字符型變量)。 9999C語言程序設計#include func() s
48、tatic int b=10; b=b+2; return b;main() int i; for(i=1;i4;i+) printf(“%d,b=%dn”,i,func();#include void increment(void);int main(void)increment ( );increment ( );increment ( );return 0;void increment(void)int x=0; /*auto*/x+;printf (%dn,x);#include void increment(void);int main(void)increment ( );incr
49、ement ( );increment ( );return 0;void increment(void)static int x=0; /*使用了static說明符 */x+;printf (%dn,x);3 3、靜態(tài)全局類型、靜態(tài)全局類型在多文件程序中,用用staticstatic聲明外部變量聲明外部變量,使該外部,使該外部變量的作用域僅限于所在的文件變量的作用域僅限于所在的文件,而不用而不用staticstatic聲明的外聲明的外部變量的作用域為整個程序。部變量的作用域為整個程序。例如:某個程序中要用到大量函數(shù),而有幾個函數(shù)需要共同使用幾個全局變量時,可以將這幾個函數(shù)組織在一個文件中,而
50、將這幾個全局變量用static定義為靜態(tài)的,以保證它們不會與其他文件中的變量發(fā)生名字沖突,保證文件的獨立性。static unsigned int r;int random(void) r=(r*123+59)%65536; return(r); /*產(chǎn)生r的初值*/unsigned randomstart(unsigned int seed)r=seed; #include int main(void) int i, n; printf (please enter the seed:); scanf(%d, &n); randomstart(n); for(i=1; i10; i+)
51、 printf(%u , random(); return 0; C語言程序設計4 4、外部變量的定義與聲明、外部變量的定義與聲明外部變量的類型說明符為外部變量的類型說明符為externextern。外部變量的特點:外部變量的特點:(1) 外部變量和全局變量是對同一類變量的兩種不同角度的提法。全局變量是從它的作用域提出的,外部變量從它的存儲方式提出的,表示了它的生存期。(2)當一個源程序由若干個源文件組成時, 在一個源文件中定義的外部變量在其它的源文件中也有效。一個變量被定義點之前的函數(shù)使用或者被別的文件中的一個變量被定義點之前的函數(shù)使用或者被別的文件中的函數(shù)使用時,應用函數(shù)使用時,應用ext
52、ernextern聲明。聲明。對外部變量(靜態(tài)全局變量除外),除可以定義一次外,還可以多次進行聲明(引用性聲明)。(1)通過聲明將外部變量的作用域在本文件范圍內(nèi)擴充向前引用通常,一個外部變量的作用域是從其定義點到本文件末尾。對于位于定義點之前的函數(shù),可以用extern聲明使變量的作用域擴充到需要用到它的函數(shù)。#include void gx(), gy ();void main(void) extern int x,y; /*聲明聲明x,y是外部變量,作用域擴充至此是外部變量,作用域擴充至此*/ printf (1:x=%dt y=%dn, x, y); y=246; gx(); gy();
53、void gx() extern int x, y; /*聲明聲明x,y是外部變量是外部變量*/ x=135; printf(2:x=%dt y=%dn, x, y);int x, y; /*定義定義x,y是外部變量是外部變量 */void gy() printf(3:x=%dt y=%dn, x, y);(2)利用聲明語句將作用域擴大到其他文件建立對象的外部鏈接假設一個程序由兩個以上的文件組成。當一個全局變量定義在文件file1中時,在另外的文件中使用extern聲明,可以通知編譯系統(tǒng)一個信息:“此變量到外部去找”。或者說在鏈接時,告訴鏈接器:“到別的文件中找這個變量的定義”。* file1
54、.c */#include int x, y; char ch;void main(void) x=12; y=24; f1(); printf(%cn, ch);* file2.c */extern int x,y; extern char ch; f1( ) printf (%d, %dn, x,y); ch=a; (3) 全局變量的副作用如果沒有外部變量,函數(shù)只能通過參數(shù)與外界發(fā)生數(shù)據(jù)聯(lián)系,有了外部變量以后,增加了一條與外界傳遞數(shù)據(jù)的渠道,但也會產(chǎn)生一些副作用. /* 例能否輸出5行 *?*/#include int i; void main(void) void prt(); for(
55、i=0; i5; i+) /* 輸出5行 */ prt();void prt() /* 輸出一行5個* */ for(i=0; i5; i+) printf (%c, *); printf(n);三、通過const聲明將變量存儲在只讀區(qū)C語言可以開辟一個只讀區(qū)。數(shù)據(jù)是以變量形式存儲的,只讀的,不可修改。也就是把變量定義為只讀變量。定義只讀變量的方法是在聲明變量時使用修飾符const。格式為:const 數(shù)據(jù)類型 變量1=初始表達式1,變量2=初始表達式2,如:const double X=3.14159265;C語言程序設計第三節(jié)第三節(jié) 模塊的編譯與鏈接模塊的編譯與鏈接一、分別編譯一、分別編譯
56、 C語言是一種支持模塊化程序設計的語言,它允許將一個大型程序分成多個程序文件分別進行編譯。這樣的好處在于:當程序的一個局部有錯誤或?qū)植窟M行了修改時,可以只重新編譯該局部,不需要將整個程序都重新編譯。 某些經(jīng)過考驗的函數(shù)的目標代碼可以添加為的庫函數(shù),供其他程序中使用。C語言程序設計二、用項目管理多文件程序的編譯與鏈接過程二、用項目管理多文件程序的編譯與鏈接過程多文件程序的編譯、鏈接過程是比較麻煩的。為了方便用戶進行多文件程序的編譯、鏈接,各種程序開發(fā)軟件都提供了用項目(project)管理多文件程序的編譯和鏈接過程。其使用方法因開發(fā)工具而異,請參考有關手冊。C語言程序設計三、頭文件三、頭文件用
57、戶顯式地保證程序一致性的基本方法是保持聲明的一致性。保持聲明一致性的簡單辦法是提供一個頭文件,讓頭文件中的信息作為各模塊之間的接口信息,有利于提供可重用的模塊。使用頭文件將把程序分為程序頭和程序體兩部分。好的頭文件應包含如下一些內(nèi)容:類型定義如定義一個枚舉類型:enum color RED,BLUE,GREEN,YELLOW;函數(shù)聲明如: extern int strlen const char*;嵌入函數(shù)聲明如:inline char get() return *p+;數(shù)據(jù)聲明如:extern int a;常量定義如: const float pi=3.141593;包含指令如: #incl
58、ude 宏定義如:#define case break; case注釋好的頭文件不能包含以下內(nèi)容:一般函數(shù)定義數(shù)據(jù)定義 如: int a;常量聚集定義 如: const tbl=/* */;用戶頭文件是由用戶自己定義的頭文件。系統(tǒng)將用雙引號方式進行搜索。#include 頭文件名.h程序員可以用它們建立各文件之間的信息窗口。應當注意,修改了頭文件時,所有涉及該頭文件的程序都應重新編譯,所以在編制頭文件時應盡量考慮周全。當使用很多頭文件時,常有重復嵌入的情形發(fā)生,在這種情形下,應防止標識符重復定義的錯誤。為避免錯誤,應使用條件編譯來測試有無重復定義。C語言程序設計第四節(jié)第四節(jié) 宏定義與宏替換宏定
59、義與宏替換編譯預處理是以“#”開頭的一些命令,它通知編譯系統(tǒng):在進行正式編譯前應當先進行一些前期工作(即編譯預處理)。目前,C語言的編譯預處理功能主要有如下一些:(1)文件包含,使用命令:#include。(2)宏定義,使用命令:#define、#undef。(3)條件編譯,使用命令:#if、#ifdef、#ifndef、#else、#endif、#elif、defind。(4)提供行號信息,使用命令:#line。(5)編譯雜注,使用命令:#progma。(6)錯誤信息,使用命令:#error。在這些編譯預處理中,應用最多的就是對宏的處理。它允許程序員使用define定義并應用宏名字書寫C語言
60、程序,同時也指示編譯器在正式編譯前通過宏替換,使程序能按照C語言的語法進行編譯。一、字符串宏定義及其基本格式一、字符串宏定義及其基本格式define命令最簡單的應用就是定義一個符號常量。格式為: define 宏名 字符串編譯預處理時,預處理程序?qū)殉绦蛭募性谠摵甓x之后的所有宏名,用#define命令中定義的字符串(稱為宏體)替換,這個過程稱為宏替換。符號常數(shù)的定義就是這種宏定義的一種應用。#define PI 3.14159265#define RADIUS 2.0使用宏定義的好處是:(1) 提高了程序的可讀性。如果人們看到以下語句 return (2.0*3.1415926536*2.0); 和 return (3.1415926536*2.0*2.0);是否能很快地看出
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年織錦緞小三角包項目投資價值分析報告
- 2025至2030年電烤鍋項目投資價值分析報告
- 鐵路石油制品運輸協(xié)議
- 企業(yè)采購居間合同模板
- 小學語文教育:2025學年度教學計劃創(chuàng)新
- 2024年度浙江省公共營養(yǎng)師之二級營養(yǎng)師過關檢測試卷B卷附答案
- 2025地方政府黨支部換屆選舉工作報告
- 礦壓監(jiān)測制度
- 酒店公寓管理制度規(guī)定模板
- 采購決策與審批管理制度
- 二零二五年度無人駕駛車輛測試合同免責協(xié)議書
- 北京市海淀區(qū)2024-2025學年高一上學期期末考試歷史試題(含答案)
- 常用口服藥品的正確使用方法
- 2025年湖北華中科技大學招聘實驗技術人員52名歷年高頻重點提升(共500題)附帶答案詳解
- 2024年鉆探工程勞務協(xié)作協(xié)議樣式版B版
- 《心肺復蘇機救治院內(nèi)心搏驟?;颊咦o理專家共識》解讀
- 計算機二級WPS考試試題
- 智聯(lián)招聘行測題庫及答案
- 前程無憂測評題庫及答案
- 2023中華護理學會團體標準-注射相關感染預防與控制
- 超潔凈管道(CL-PVC)施工技術
評論
0/150
提交評論