




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第2章函數的定義當設計較大程序時,通常需要用若干個模塊來實現較復雜的功能,而每一個模塊自成結構,用來解決一些子問題。這種能完成某一獨立功能的子程序模塊,在C++中成為函數??梢?,函數是實現模塊化程序的基本單位。事實上,函數還能體現代碼重用的思想,因為一個函數可以在同一個程序中被多次調用或在多個程序中被調用。第2章函數和作用域2.1函數定義和調用2.2C++函數特性2.3作用域和存儲類型2.4名稱空間2.1函數定義和調用2.1.1函數定義C++的任何一個程序都可由一個主函數和若干個子函數組合而成。主函數可以調用子函數,子函數還可以調用其他子函數。C++規定主函數名必須是main,而其他函數可以是庫函數或自定義函數。(1)主函數main不僅是程序的入口函數,而且與其他函數相比較還有許多使用上的限制。例如,它不能被其他函數調用,不能用inline和static來說明等。(2)庫函數,又稱標準函數,是ANSI/ISOC++編譯系統已經預先定義好的函數,程序設計時可根據實際需要,直接使用這類函數,而不必重新定義。調用時,必須在程序中包含相應的頭文件,并指明使用名稱空間std。2.1函數定義和調用
(3)自定義函數是用戶根據程序的需要,將某一個功能相對獨立的程序定義成的一個函數,或將解決某個問題的算法用一個函數來組織。
與變量的使用規則相同,在C++程序中一定要先說明和定義函數,然后才能調用函數。C++中每一個函數的定義都是由4個部分組成的,即函數名、函數類型、形式參數表和函數體,其定義的格式如下:
<函數類型><函數名>(<形式參數表>){ <若干語句>}函數體2.1.1函數定義其中,函數名應是一個合法有效的C++標識符;函數頭的形式參數又簡稱為形參。參數表中的每一個形參都是由形參的數據類型和形參名來構成,根據上述定義格式,可以編寫一個函數sum,如圖2.1所示,注意它們的書寫規范。intsum(intx,inty){intz=x+y;returnz;}對齊函數頭函數體縮進函數類型函數名形參圖2.1定義一個函數sum2.1.1函數定義需要說明的是:(1)C/C++不允許在一個函數體中再定義函數,即禁止嵌套定義,但允許嵌套調用。(2)函數體也可不含有任何語句,這樣的函數稱為空函數,它僅為程序結構而設定,本身沒有任何操作。(3)函數類型決定了函數所需要的返回值類型,它可以是除數組類型之外的任何有效的C++數據類型,包括引用、指針等。2.1.1函數定義(4)若函數類型為void時,則表示該函數沒有返回值。但仍然可以在函數體中使用return語句“return
;”,此時可將“return;”語句理解為是函數體花括號“}”的作用,當流程遇到函數體的“}”時,函數調用結束,控制權返回給主調函數。例如: voidf1(inta) { if(a>10)
return; //return;一旦執行,后面的語句不再被執行
… }當a>10條件滿足時,“return;”語句將控制權返回給主調函數。2.1.2函數的調用和聲明1.函數的實參和形參定義一個函數就是為了以后的調用。調用函數時,先寫函數名,然后緊跟括號,括號里是實際調用該函數時所給定的參數,稱為實際參數,簡稱實參,并與形參相對應。要注意形參和實參的區別:(1)從模塊概念來說,形參是函數的接口,是存在于函數內部的變量。而實參是存在于函數外部的變量。它們不是同一個實體,也就是說,形參變量和實參變量所對應的內存空間不是同一個內存空間。(2)按函數定義時所指定的形參類型,實參除變量外還可以是數值或表達式等,而形參只能是變量。(3)形參在函數調用之前是不存在的,只有在發生函數調用時,函數中的形參才會被分配內存空間,然后執行函數體中的語句,而當調用結束后,形參所占的內存空間又會被釋放。2.1.2函數的調用和聲明2.函數的調用函數調用的一般格式為:
<函數名>(<實參表>);調用函數時要注意:實參與形參的個數應相等,類型應一致,且按順序對應,一一傳遞數據。
例如,下面的示例用來輸出一個三角形的圖案。2.1.2函數的調用和聲明
[例Ex_Call]函數的調用#include<iostream>usingnamespacestd;voidprintline(charch,intn){ for(inti=0;i<n;i++) cout<<ch; cout<<endl; }intmain(){ introw=5; for(inti=0;i<row;i++)
printline('*',i+1); //A return0; }
2.1.2函數的調用和聲明程序運行的結果如下:代碼中,main函數的for循環語句共調用了5次printline函數(A句),每次調用時因實參i+1值不斷改變,從而使函數printline打印出來的星號個數也隨之改變。
2.1.2函數的調用和聲明3.函數的聲明由于前面函數printline的定義代碼是放在main函數中調用語句A之前,因而A語句執行不會有問題。但若將函數printline的定義代碼放在調用語句A之后,即函數定義在后,而調用在前,就會產生“printline標識符未定義”的編譯錯誤。此時必須在調用前進行函數聲明。2.1.2函數的聲明聲明一個函數按下列格式進行:
<函數類型><函數名>(<形參表>);可見,函數聲明的格式是在函數頭的后面加上分號“;”。但要注意,函數聲明的內容應和函數的定義應相同。例如,對于前面sum函數和最后一個printline函數可有如下聲明: intsum(intx,inty); voidprintline(charch,intn);2.1.3值傳遞函數的調用實質上就是參數傳遞,在C++中,函數的參數傳遞有兩種方式,一是按值傳遞,二是地址傳遞或引用傳遞。這里先來說明按值傳遞的參數傳遞方法,地址傳遞或引用傳遞在以后來討論。當函數的形參定義成一般變量時,如前面printline和sum函數的形參都是一般變量,此時函數的參數傳遞就是按值傳遞方式,簡稱值傳遞,是指當一個函數被調用時,C++根據實參和形參的對應關系將實際參數的值一一傳遞給形參,供函數執行時使用。2.1.3值傳遞值傳遞的特點是:(1)若實參指定是一般變量,則傳遞的是實參變量的值而不是實參變量的地址。(2)在執行函數代碼時,由于對實參數據的操作最終是在形參的內存空間中進行,因此形參值的改變只是改變了形參的內存空間存儲的值,而不會改變實參變量所對應的內存空間的值。也就是說,即使形參的值在函數中發生了變化,函數調用結束后,實參的值不會受到影響。例如:2.1.3值傳遞[例Ex_SwapValue]交換函數兩個參數的值。#include<iostream>usingnamespacestd;voidswap(floatx,floaty);
//函數原型說明intmain(){ floata=20,b=40; cout<<"a="<<a<<",b="<<b<<"\n";
swap(a,b);
//函數調用 cout<<"a="<<a<<",b="<<b<<"\n"; return0;}voidswap(floatx,floaty)
//函數定義{ floattemp; temp=x;x=y;y=temp; cout<<"x="<<x<<",y="<<y<<"\n";}2.1.3值傳遞程序的運行結果為:可以看出,雖然函數swap中交換了兩個形參x和y的值,但交換的結果并不能改變實參的值,所以調用該函數后,變量a和b的值仍然為原來的值。2.1.4函數的默認形參值在C++中,允許在函數的聲明或定義時給一個或多個參數指定默認值。這樣在調用時,可以不給出實際參數,而按指定的默認值進行工作。例如:
voiddelay(intloops=1000)//函數定義,1000為形參loops的默認值 { if(0==loops)return; for(inti=0;i<loops;i++);//空循環,起延時作用 }2.1.4函數的默認形參值這樣,當有調用delay(); //和delay(1000)等效程序就會自動將loops當作成1000的默認值來進行處理。當然,也可在函數調用時指定相應的實際的參數值,例如:delay(2000); //形參loops的值為20002.1.4函數的默認形參值在設置函數的默認形參值時要注意:(1)當函數既有原型聲明又有定義時,默認參數只能在原型聲明中指定,而不能在函數定義中指定。例如: voiddelay(intloops); //函數原型聲明 //… voiddelay(intloops=1000)//錯誤:此時不能函數定義中指定默認參數 { //… }2.1.4函數的默認形參值(2)當一個函數中需要有多個默認參數時,則形參分布中,默認參數應嚴格從右到左逐次定義和指定,中間不能跳開。例如: voiddisplay(inta,intb,intc=3); //合法 voiddisplay(inta,intb=2,intc=3);//合法 voiddisplay(inta=1,intb=2,intc=3); //合法:可以對所有的參數設置默認值 voiddisplay(inta,intb=2,intc);//錯誤:默認參數應從最右邊開始 voiddisplay(inta=1,intb=2,intc); //錯誤:默認參數應從最右邊開始 voiddisplay(inta=1,intb,intc=3);//錯誤:多個默認參數中間不能有非默認參數2.1.4函數的默認形參值(3)當帶有默認參數的函數調用時,系統按從左到右的順序將實參與形參結合。當實參的數目不足時,系統將按同樣的順序用聲明或定義中的默認值來補齊所缺少的參數。例如:2.1.4函數的默認形參值[例Ex_Default]在函數定義中設置多個默認參數#include<iostream>usingnamespacestd;voiddisplay(inta,intb=2,intc=3)//在函數定義中設置默認參數{ cout<<"a="<<a<<",b="<<b<<",c="<<c<<"\n";}intmain(){
display(1); display(1,5); display(1,7,9); return0;}程序的運行結果為:2.2C++函數特性
在C++中,函數還有:嵌套調用、重載、內聯調用以及遞歸調用等特性,相應的函數被稱為嵌套函數、重載函數、內聯函數和遞歸調用等。2.2C++函數特性
函數重載(overloaded)是C++對C的擴展,它允許多個同名的函數存在,但同名的各個函數的形參必須有區別:要么形參的個數不同;要么形參的個數相同,但參數類型有所不同。優點:代碼中使用函數的重載,不僅方便函數名的記憶,而且更主要的是完善了同一個函數的代碼功能,給調用帶來了許多方便。下例程序中即是各種形式的sum函數都稱為sum的重載函數。
2.2C++函數特性【例Ex_OverLoad】編程求兩個或三個操作數之和#include<iostream.h>
intsum(intx,inty);intsum(intx,inty,intz);doublesum(doublex,doubley);doublesum(doublex,doubley,doublez);
//聲明4個同名的函數intmain(){ cout<<sum(2,5)<<endl; //結果為7 cout<<sum(2,5,7)<<endl; //結果為14 cout<<sum(1.2,5.0,7.5)<<endl;//結果為13.7 return0;}程序的運行結果為:
2.2C++函數特性intsum(intx,inty){ returnx+y; }intsum(intx,inty,intz){ returnx+y+z; }doublesum(doublex,doubley){ returnx+y; }doublesum(doublex,doubley,doublez){ returnx+y+z; }程序運行結果如下:2.2C++函數特性需要說明的是:(1)重載函數必須具有不同的參數個數或不同的參數類型,若只有返回值的類型不同是不行的。例如:voidfun(inta,intb); intfun(inta,intb);是錯誤的。因為如果有函數調用fun(2,3)時,編譯器無法準確地確定應調用哪一個函數。(2)當函數的重載帶有默認參數時,也要應該注意避免上述的二義性情況。例如:intfun(inta,intb=0);intfun(inta);是錯誤的。因為如果有函數調用fun(2)時,編譯器也是無法準確地確定應調用哪一個函數。2.2.2函數嵌套調用C++允許在函數中再調用其他函數,這種調用稱為函數的嵌套調用。
[例Ex_Root]函數嵌套調用:求解一元二次方程的根。(見書35頁)本例main函數中調用了root函數,root函數中又調用了sdelta和print函數,而sdelta函數還調用了cmath頭文件定義的庫函數sqrt(求平方根)和fabs(求浮點數的絕對值)。它們的調用關系如圖2.2所示。main函數root函數sdelta函數fabs庫函數print函數sqrt庫函數圖2.2例Ex_Root中的各函數調用的關系2.2.3遞歸函數C++允許在調用一個函數的過程中出現直接地或間接地調用函數本身,這種情況稱為函數的遞歸調用。遞歸(Recursion)是一種常用的程序方法(算法),相應的函數稱為遞歸函數例如,用遞歸函數編程求n的階乘n!。n!=n*(n-1)*(n-2)*...*2*1。它也可用下式表示:由于n!和(n-1)!都是同一個問題的求解,因此可將n!用遞歸函數longfactorial(intn)來描述,程序代碼如下:
2.2.3遞歸函數[例Ex_Factorial]編程求n的階乘n!#include<iostream>usingnamespacestd;longfactorial(intn);intmain(){ cout<<factorial(4)<<endl; //結果為24 return0;}
longfactorial(intn){ longresult=0; if(0==n) result=1; else result=n*factorial(n-1); //進行自身調用 returnresult;}1.5.4函數的遞歸調用程序運行結果如下:24下面來分析main函數中“factorial(4);”語句的執行過程,這一過程用圖1.8來表示:見書(p36)2.2.4內聯函數在程序的執行過程中,調用函數時首先需要保存主調函數的現場和返回地址,然后程序轉移到被調函數的起始地址繼續執行。被調函數執行結束后,先恢復主調函數的現場,取出返回地址,并將返回值賦給函數調用本身,最后在返回地址處開始繼續執行。當函數體比較小且執行的功能比較簡單時,這種函數調用方式的系統開銷相對較大。
2.2.4內聯函數為了解決這一問題,C++引入了內聯函數的概念,它把函數體的代碼直接插入到調用處,將調用函數的方式改為順序執行、直接插入的程序代碼,這樣可以減少程序的執行時間,但同時增加了代碼的實際長度。內聯函數的使用方法與一般函數相同,只是在內聯函數定義時,需在函數的類型前面加上inline關鍵字。例如:2.2.4內聯函數[例Ex_Inline]用內聯函數實現求兩個實數的最大值#include<iostream>usingnamespacestd;
inlinefloatfmax(floatx,floaty){ returnx>y?x:y; }intmain(){ floata; a=fmax(5,10); //A cout<<"最大的數為:"<<a<<"\n"; return0;}這樣,當程序編譯時,A語句變成了:a=5>10?5:10;2.2.4內聯函數在使用內聯函數時,還需要注意的是:(1)內聯函數也要遵循定義在前,調用在后的原則。形參與實參之間的關系與一般函數相同。(2)關鍵字inline必須放在函數定義體前才是內聯函數,僅在函數聲明時使用inline,不能定義內聯函數。(3)在C++中,需要定義成的內聯函數不能含有循環、switch和復雜嵌套的if語句。(4)遞歸函數不能被用來做內聯函數??傊瑑嚷摵瘮狄话闶潜容^小的、經常被調用的、大多可在一行寫完的函數。2.3作用域和存儲類型
2.3.1作用域作用域又稱作用范圍,是指程序中標識符(變量名、函數名、數組名、類名、對象名等)的有效范圍。一個標識符是否可以被引用,稱之為標識符的可見性。在一個C++程序項目中,一個標識符只能在聲明或定義它的范圍內可見,在此之外是不可見的。根據標識符的作用范圍,可將其作用域分為5種:函數原型作用域、函數作用域、塊作用域、類作用域和文件作用域。其中,類作用域將在以后介紹,這里介紹其他幾種。2.3作用域和存儲類型1.函數原型作用域函數原型作用域指的是在聲明函數原型所指定的參數標識符的作用范圍。這個作用范圍是在函數原型聲明中的左、右圓括號之間。
正因為如此,在函數原型中聲明的標識符可以與函數定義中說明的標識符名稱不同。由于所聲明的標識符與該函數的定義及調用無關,所以可以在函數原型聲明中只作參數的類型聲明,而省略參數名。例如: doublemax(doublex,doubley); 和 doublemax(double,double); 是等價的。2.3.1作用域2塊作用域塊語句就是由“{”和“}”組成的(復合語句)。在塊中聲明的標識符,其作用域從聲明處開始,一直到結束塊的花括號為止。塊作用域也稱作局部作用域,具有塊作用域的變量是局部變量。例如:voidfun(void){a的作用域b的作用域 inta; //a的作用域起始處 cin>>a; if(a<0){ a=-a;
intb; //b的作用域起始處 … } //b的作用域終止處} //a的作用域終止處2.3.1作用域需要說明的是:當標識符的作用域完全相同時,不允許出現相同的標識符名。而當標識符具有不同的作用域時,卻允許標識符同名。例如: voidfun(void)塊A塊B { //塊A開始 inti; … { //塊B開始 inti;
i=100; … } //塊B結束 }
//塊A結束代碼中,在A和B塊中都聲明了變量i,這是允許的,因為塊A和塊B不是同一個作用域。塊A塊B2.3.1作用域但同時出現另外一個問題,語句“i=100;”中的i是使用A塊中的變量i還是使用B中的變量i?C++規定在這種作用域嵌套的情況下,如果內層(塊B)和外層(塊A)作用域聲明了同名的標識符,那么在外層作用域中聲明的標識符對于該內層作用域是不可見的。也就是說,在塊B聲明的變量i與塊A聲明的變量i無關,當塊B中的i=100時,不會影響塊A中變量i的值。2.3.1作用域4.文件作用域在所有函數外定義的標識符稱為全局標識符。全局標識符的作用域是文件作用域。它從聲明之處開始,直到文件結束一直是可見的。具有文件作用域的變量和常量稱為全局變量和全局常量。例如:
constfloatPI=3.14; //全局常量PI,其作用域從此開始 inta; //全局變量a,其作用域從此開始 voidmain() { //… } voidfunA(intx) { //… }2.3.1作用域5函數作用域若函數定義在后,調用在前,必須進行函數原型聲明。若函數定義在前,調用在后,函數定義包含了函數的原型聲明。一旦聲明了函數原型,函數標識符的作用域是從聲明或定義之處開始到源程序文件結束。例如:
voidfunA(intx);//函數funA的作用域從此開始到文件結束
voidfunB() //函數funB的作用域從此開始到文件結束
{ //… } voidmain() { //… } voidfunA(intx) { //… }2.3.3存儲類型存儲類型是針對變量而言的,它規定了變量的生存期。無論是全局變量還是局部變量,編譯系統往往根據其存儲方式定義、分配和釋放相應的內存空間。變量的存儲類型反映了變量在哪開辟內存空間以及占用內存空間的有效期限。在C++中,變量有4種存儲類型:自動類型、靜態類型、寄存器類型和外部類型,這些存儲類型是在變量定義時來指定的.其一般格式如下:<存儲類型><數據類型><變量名表>;
2.3.3存儲類型1.自動存儲類型一般說來,用自動存儲類型聲明的變量都是限制在某個程序范圍內使用,即為局部變量。從系統角度來說,自動存儲類型變量是采用動態分配方式在棧區中來分配內存空間。因此,當程序執行到超出該變量的作用域時,就釋放它所占用的內存空間,其值也隨之消失了。在C++語言中,聲明一個自動存儲類型的變量是在變量類型前加上關鍵字auto,例如:
auto inti;2.3.3存儲類型若自動存儲類型的變量是在函數內或語句塊中聲明的,則可省略關鍵字auto,例如: voidfun() {
inti; //省略auto //… }2.3.3存儲類型2寄存器類型使用關鍵字register聲明寄存器類型的變量的目的是將所聲明的變量放入寄存器內,從而加快程序的運行速度。例如:
registerinti; //聲明寄存器類型變量但有時,在使用register聲明時,若系統寄存器已經被其他數據占據時,寄存器類型的變量就會自動當作auto變量。2.3.3存儲類型2.靜態類型從變量的生存期來說,一個變量的存儲空間可以是永久的,即在程序運行期間該變量一直存在,如全局變量。也可以是臨時的,如局部變量,當流程執行到它的說明語句時,系統為其在棧區中動態分配一個臨時的內存空間,并在它的作用域中有效,一旦流程超出該變量的作用域時,就釋放它所占用的內存空間,其值也隨之消失。
2.3.3存儲類型但是,若在聲明局部變量類型前面加上關鍵字static,則將其定義成了一個靜態類型的變量。這樣的變量雖具有局部變量的作用域,但由于它是用靜態分配方式在靜態數據區中來分配內存空間。因此,在這種方式下,只要程序還在繼續執行,靜態類型變量的值就一直有效,不會隨它所在的函數或語句塊的結束而消失。簡單地說,靜態類型的局部變量雖具有局部變量的作用域,但卻有全局變量的生存期。2.3.3存儲類型[例Ex_Static]使用靜態類型的局部變量#include<iostream>usingnamespacestd;voidcount(){ inti=0;
staticintj=0; //靜態類型 i++; j++; cout<<"i="<<i<<",j="<<j<<"\n";}intmain(){ count(); count(); return0;}
2.3.3存儲類型程序中,當第1次調用函數count時,由于變量j是靜態類型,因此其初值設為0后不再進行初始化,執行j++后,j值為1,并一直有效。第2次調用函數count時,由于j已分配內存且進行過初始化,因此語句“staticintj=0;”被跳過,執行j++后,j值為2。故程序運行結果為:
2.3.3存儲類型需要說明的是,靜態類型的局部變量只在第一次執行時進行初始化,正因為如此,在聲明靜態類型變量時一定要指定其初值,若沒有指定,編譯器還會將其初值置為0。2.4名稱空間
隨著程序代碼的增多,名稱相互沖突的可能性也將增加。尤其是在程序中使用多家廠商提供的類庫時,標示符名稱的沖突可能性更高。例如,兩個類庫中可能都定義了名為List、Tree和Node的類,但定義的含義和方式不兼容;或是兩個類庫定義基個程序本相同,但兩個類庫同時包含在一個程序中,會出現標示符重復定義的錯誤。這些問題統稱為名稱空間問題。解決這些名稱空間問題的方法是使用C++新的名稱空間特性,通過名稱空間的作用域機制來解決。2.4名稱空間2.4.1名稱空間的定義在C++中,定義一個名稱空間的格式如下:其中,namespace是C++關鍵字,標識符用作名稱空間的名稱,屬于該名稱空間體中的變量、函數、結構、枚舉、聯合以及以后要討論的類等都可以認為是該名稱空間的成員。namespace[標識符]{成員;…}體2.4.1名稱空間的定義需要說明的是:同一個文件中,可以允許定義多個名稱空間。一旦定義名稱空間后,標識符就標識名稱空間體的那個區域。例如:
usingnamespacestd; namespaceDING1 { charname[]="thisisinDING1region!"; voidshowname(void) {
cout<<name<<endl; } }2.4.1名稱空間的定義 namespaceDING2 { charname[]="thisisinDING2region!"; voidshowname(void) { cout<<name<<endl; } }
盡管名稱空間DIN1和DING2中定義的成員名都相同,但它們由于分屬不同的名稱區域,因而是合法的。此后,在引用各自的成員時就可使用域作用運算符來指定DIN1或DING2來標識各自所在的名稱區域。2.4.1名稱空間的定義(2)名稱空間中的函數、類等可稱為成員函數和成員類。成員函數的原型必須在名稱空間體中聲明,而此時的函數定義稱為函數的實現,可以在體內完成,也可在體外完成。例如,前面名稱空間DING1和DING2的成員函數showname的聲明和定義都是在體內一起完成的,若將成員函數showname的實現放在體外完成,則必須用域作用符“::”指明其所屬名稱空間。(下頁)2.4.1名稱空間的定義例如: usingnamespacestd;
namespaceDING1 { charname[]="thisisinDING1region!"; voidshow
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廈門石雕石欄桿施工方案
- 紙質航空航天材料開發與性能評價考核試卷
- 中國橋梁施工方案設計
- 農業經理人考試的必考知識模塊試題及答案
- 生物質燃氣的可行性研究與市場潛力評估考核試卷
- 生物質燃氣的風能利用技術考核試卷
- 電熱電蚊香液消耗速率考核試卷
- 礦山機械電子商城與網絡營銷考核試卷
- 2024年項目管理考試題型分析試題及答案
- 資格認證考試實戰模擬的重要性試題及答案
- 放射工作人員合同(2篇)
- 《石鐘山記》課件統編版高中語文選擇性必修下冊
- 廣西某農貿市場建設項目可行性研究報告
- 第二屆全國設備管理與智能運維職業技能競賽(電氣設備點檢員)考試題庫(含答案)
- 江蘇省常州市2024年中考物理試題【附參考答案】
- 2023-2024學年江蘇省南京市六校聯合體高一下學期5月期中考試化學試題
- TSHNX 001-2024 乳制品企業有害生物防制技術規范
- 第十三章-印花稅
- DL∕T 5362-2018 水工瀝青混凝土試驗規程
- 典型任務-人力制動機制動工作課件講解
- 藥品生產企業質量管理評審要求
評論
0/150
提交評論