![面向對象程序設計與實踐ch11c高級機制_第1頁](http://file4.renrendoc.com/view/b19df0cb3ab19e7e746973d824537b3b/b19df0cb3ab19e7e746973d824537b3b1.gif)
![面向對象程序設計與實踐ch11c高級機制_第2頁](http://file4.renrendoc.com/view/b19df0cb3ab19e7e746973d824537b3b/b19df0cb3ab19e7e746973d824537b3b2.gif)
![面向對象程序設計與實踐ch11c高級機制_第3頁](http://file4.renrendoc.com/view/b19df0cb3ab19e7e746973d824537b3b/b19df0cb3ab19e7e746973d824537b3b3.gif)
![面向對象程序設計與實踐ch11c高級機制_第4頁](http://file4.renrendoc.com/view/b19df0cb3ab19e7e746973d824537b3b/b19df0cb3ab19e7e746973d824537b3b4.gif)
![面向對象程序設計與實踐ch11c高級機制_第5頁](http://file4.renrendoc.com/view/b19df0cb3ab19e7e746973d824537b3b/b19df0cb3ab19e7e746973d824537b3b5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、面向對象程序設計與實踐第11章C+高級機制主講人:楊 峰華中科技大學數字化工程與仿真中心主要內容異常名字空間標準庫1 異常1.1程序的正確性實現正確的軟件編寫的軟件應滿足用戶的要求。至少應滿足以下3個要求:對于所有正確的輸入能產生正確的結果。對于所有不正確的輸入能給出合理的提示信息。程序運行遇到錯誤后能終止程序的運行。較高要求包括:硬件故障情況下,程序能繼續(xù)運行或合理終止(掉電、硬盤損壞,網絡故障等)系統(tǒng)軟件故障情況下,程序能繼續(xù)運行或合理終止(操作系統(tǒng),數據庫管理系統(tǒng)等)正確的實現軟件編寫的程序應該盡量減少錯誤。程序開發(fā)過程中會出現4種錯誤:編譯錯誤(compile-time errors)
2、。編譯器發(fā)現的錯誤,說明程序代碼不符合計算機語言規(guī)定的語法標準。鏈接錯誤(link-time errors)。鏈接器發(fā)現的錯誤,一般是函數實現與函數聲明不對應,全局變量未定義,未鏈接需要的庫等。運行時錯誤(run-time errors)。一般表示與硬件或系統(tǒng)軟件發(fā)生沖突,比如網絡中斷,硬盤耗盡,硬件中斷錯誤,軟件中斷錯誤,資源讀寫競爭,除0等等。邏輯錯誤(logic errors)。程序編寫中有bug,程序不能得到正確的計算結果。減少錯誤一般原則為:通過良好的代碼組織減少錯誤,較小錯誤的影響范圍(充分利用函數和類實現封裝,如果出現錯誤,盡量把錯誤的范圍限制在封裝的范圍內,不波及到程序的其它部
3、分)通過調試和測試消除錯誤。通過以上方法盡量減少錯誤,并使得未發(fā)現和未糾正的錯誤不會嚴重影響程序的正常運行。編寫正確的程序雖然需要大量的實踐經驗,但是從一開始就進行良好的訓練更重要。解決錯誤解決編譯錯誤編譯錯一般都是語法錯誤,比如:寫掉了行尾的;號把英文的;號寫成了漢字的;號括號沒有配對類型名稱,變量名稱,函數名稱,頭文件名稱鍵入錯誤一般情況下,編譯器給出的編譯錯誤都有相應描述,根據描述的內容查找到指定的代碼行糾正語法錯誤先解決第一個編譯錯對應的代碼行,然后再編譯。如果還有編譯錯,依此循環(huán),直至消除全部編譯錯解決錯誤解決鏈接錯誤函數定義和函數聲明不對應(一般是因為函數名鍵入錯誤)全局變量聲明和
4、使用了卻忘記了定義(前面加extern是全局變量的聲明,而不是定義)沒有鏈接需要的庫(標準庫自動鏈接,但其它庫需要告訴IDE庫的名稱和路徑才能正確鏈接)解決運行時錯誤通過一套完整的錯誤檢查,報告與處理機制來解決運行時錯誤解決邏輯錯誤通過調試和測試手段來解決邏輯錯誤1.2 函數的防錯設計函數設計的基本原則:函數負責檢查和報告錯誤,函數的調用者負責處理錯誤報告錯誤有4種方式通過返回值通過全局的錯誤變量;通過assert宏通過異常通過返回值報告錯誤返回整型和指針類型的函數可以通過返回值報告錯誤整型返回值返回負數表示函數執(zhí)行中出現了運行時錯誤,不能得到預期的結果。通常各種負返回值應該定義為符號常量或c
5、onst常量的形式。指針返回值返回空指針表示函數執(zhí)行中遇到了錯誤或沒有執(zhí)行函數功能。const int TheFirstError = -1;const int TheSecondError = -2;const int TheThirdError = -3;.int Func( argument list ).if( . )return TheFirstError;.if( . )return TheSecondError;.return 0;通過返回值報告錯誤示例:通過全局的錯誤變量報告錯誤返回浮點型變量的函數,因為任何一個浮點型的值都可以是合法的結果,所以找不到一個可以表示函數執(zhí)行錯誤的
6、值作為返回值。這時,可以使用全局的errno變量。C標準庫的頭文件中聲明了一個全局變量errno存儲錯誤代碼。一些庫函數通過給errno賦值來產生函數執(zhí)行出錯的信號。在調用函數后,可以檢查errno的值是否為0檢查函數執(zhí)行是否正常。在調用前需要將errno先清0,因為這是一個全局變量,函數只管修改它的值,而不管復原它。errno = 0;y = sqrt(x);if( errno != 0 )fprintf( stderr, sqrt error, program terminatedn);exit( -1 );通過errno報告錯誤示例:通過assert宏報告錯誤assert宏原型為 voi
7、d assert( int expression );該宏帶一個參數,該參數是一個正常情況一定為真的表達式。執(zhí)行時檢查參數表達式的值,如果該值為假(0),則向stderr輸出一行錯誤信息,并調用abort函數終止程序執(zhí)行。顯示的錯誤信息包括參數表達式,源文件名和代碼行號使用assert宏需包含 或 通過assert宏報告錯誤代碼示例:char *p = new charN+1;assert( p ); /保證p不為空assert函數會影響程序執(zhí)行性能,一般只在開發(fā)過程中使用,程序開發(fā)完成提供給用戶使用時定義NDEBUG宏來取消assert:#define NDEBUG#include C語言的
8、3種報告錯誤方法的比較第1種最常用不太方便,報告錯誤占用了返回值,函數要傳回計算結果只能通過指針類型的參數傳遞如果調用函數不檢查返回值,這種方式也起不到作用第2種基本上沒用第3種很常用只對調試版本有效,對發(fā)行版assert宏直接被跳過,不產生任何作用assert宏只能作為調試過程中發(fā)現bug的一種方法,不能作為程序正式運行時報告錯誤的方式。C+的錯誤報告方式異常C+中,如果函數執(zhí)行過程中發(fā)生錯誤,則在發(fā)生錯誤的地方拋出一個異常(throw exception),函數不再往下執(zhí)行。函數的調用者通過try-catch塊捕獲可能發(fā)生的異常并進行相應處理。如果調用者沒有進行捕獲,那么該異常一直向上傳遞
9、直到main函數,如果main函數仍然沒有捕獲,那么程序會終止執(zhí)行。采用異常后,程序異常退出運行的可能性增加,但至少不會讓程序在一種不受控制的狀態(tài)下運行。使用哪種方式報告錯誤?函數返回值表示函數執(zhí)行過程中可以預見到的不正常情況,比如文件打不開,數據庫連不上,給sqrt一個負數參數等等。errno只是函數返回值的替代方案(找不到一個合適的返回值表示錯誤)assert用于檢查完全不應該發(fā)生的情況(比如給指針參數提供一個空指針)assert宏只用于調試版本,而在發(fā)行版本中不起作用assert宏實際上是用來防止程序中出現的bug。異常主要用于編程時無法預見的運行時錯誤。如網絡連接中斷,硬盤耗盡等。函數
10、的前置條件與后置條件每個函數總是包含輸入,處理和輸出3個部分。函數對輸入參數的正確性要求稱為函數的前置條件(pre-conditions)。函數成功執(zhí)行后產生的結果稱為后置條件(post-conditions)。函數的前置和后置條件都應該在函數首部的注釋中寫明。前置條件前置條件反映函數對輸入參數的要求。如果輸入參數不滿足要求,采用assert宏或拋出異常的方式報告錯誤。用assert宏報告錯誤示例:void my_strcpy( char *dest, const char *src)assert( dest & src );while( *dest+ = *src+ );用異常報告錯誤示例:
11、double area(double a, double b, double c )if( a0 | b0 | c c & a+c b & b+c a) )throw invalid_argument(不是一個三角形);double s = ( a + b + c ) / 2.0;double area = sqrt( s * (s-a) * (s-b) * (s-c) );return area;后置條件后置條件描述函數成功執(zhí)行后的結果:如果函數只通過返回值返回,則應當描述這個返回值。如果函數還通過參數返回值,要描述對參數的修改內容。示例:階梯型電阻電路計算程序中void getResist
12、s(double rs, int rs_num)后置條件:接收用戶輸入,向電阻值數組中填充rs_num個電阻值,每個電阻值都大于0。1.3 異常異常的作用函數防錯的基本原則是函數負責檢測和報告錯誤,調用函數處理錯誤 C語言使用的返回值或全局錯誤變量報告錯誤的方法,每調用一個函數后面都要跟上一大堆if-elseif-else語句來檢測調用過程中是否出現了錯誤,過多的錯誤處理代碼常常淹沒了真正起核心作用的業(yè)務函數的調用代碼 C+通過引入異常機制,將正常調用函數和對錯誤進行處理的代碼嚴格分開,提高了程序的可讀性和可維護性。所謂異常,就是某種類的實例對象,這些類很簡單,一般只需要一個字符串的數據成員和
13、構造函數能提供錯誤信息即可。使用異常報告錯誤函數拋出異常函數負責檢測和報告異常。當函數中出現異常后,由函數拋出異常。拋出異常的語法:throw expr;示例:計算三角形面積的函數,如果輸入參數不合理,拋出異常if( a0 | b0 | c0 )throw invalid_argument(邊長不能為負);或寫為:if( a0 | b0 | c0 )invalid_argument error(邊長不能為負);throw error;即先構造一個異常類的實例變量,然后拋出這個異常。這里invalid_argument類是C+規(guī)定的標準異常。使用異常報告錯誤拋出異常以后函數中,執(zhí)行到throw語
14、句和執(zhí)行到return語句一樣,函數出棧,所有局部變量析構如果函數中動態(tài)分配了內存或其它資源沒有釋放就會產生內存泄漏(C+編程建議,類應該在構造函數中動態(tài)分配內存或資源,在析構函數中釋放)函數拋出異常出棧以后,與return不同,代碼并不是回到調用函數的地方,而是跳轉到捕獲該異常的代碼處(如果該異常沒有被捕獲,程序就會異常終止)C+規(guī)定的標準異常標準異常的基類是exception。該類含有一個成員函數用于提供what()出錯信息。該函數的原型為:virtual const char* what();exception的派生類分為3類:(1)語言核心異常,直接派生自exception。包括bad
15、_alloc, bad_cast, bad_typeid, bad_exception。這些異常由運行時拋出,用戶程序不應拋出這些異常。(2)邏輯異常,派生自logic_error。表示程序運行中出現了邏輯錯誤(表示程序有bug)。包括 length_error(長度過長), domain_error(專業(yè)領域范圍內的錯誤), out_of_range(下標訪問越界), invalid_argument(無效參數)。還有一個ios_base:failure(直接派生自exception),表示IO過程中出現了錯誤。(3)運行異常,派生自runtime_error。表示運行中遇到了不可預知的運行
16、錯誤。包括range_error(內部運算超出數據類型范圍), overflow_error(算術運算上溢), underflow_error(算術運算下溢)。運行異常也由運行時拋出,用戶程序不拋出這些異常。實現自己的異常異常類都是很簡單的類,構造函數接收一個描述錯誤的字符串。為和標準異常類行為一致,提供一個what()成員函數返回錯誤描述字符串。class baseExceptionpublic:baseException(const string& str = ):msgString(str)if (msgString = )msgString = Unspecified exceptio
17、n;string what() const return msgString; protected:string msgString;示例:自定義異常的基類class memoryAllocationError: public baseExceptionpublic:memoryAllocationError(const string& msg = ):baseException(msg);class rangeError: public baseExceptionpublic:rangeError(const string& msg = ):baseException(msg);派生一些更特
18、化的異常類。這些派生類不增加任何成員,只用于標識不同的運行錯誤。捕獲異常函數拋出異常,調用函數通過 try-catch塊捕獲異常調用可能發(fā)生異常函數的代碼應包圍在try-catch塊中catch語句用于捕獲異常,語法格式為:try可能拋出異常的代碼catch(異常類型 變量名)處理異常的代碼catch接收一個異常類型變量作為參數,可以是普通類型,也可以是引用類型。為保證what()執(zhí)行的多態(tài)效果,最好用引用類型。catch塊的處理通常比較簡單,打印異常變量提供的信息,然后返回或退出程序。一個try塊可以后接多個catch塊捕捉最特化的異常類放在最前面越泛化的異常類放在后面最后一個catch塊用
19、.號表示捕捉所有未指定的異常。try.catch( const indexRangeError &err )cerr err.what() endl;return -1;catch( const memoryAllocationError &err )cerr err.what() endl;return -1;catch( const baseException &err )cerr err.what() endl;return -1;catch(.)cerr Oops! Unknown exception. endl;return -1;catch語句示例:2 名字空間2.1名字空間的概念
20、名字空間提供了一種把相關的函數,變量,自定義類型分類到一起的機制提供這種分類機制的目的是防止不同廠家之間的變量名發(fā)生沖突名字空間就是名字定義的一個集合C+標準庫的所有名字都屬于名字空間std使用名字空間中的一個名字應使用作用域運算符:,稱為完全限定名std:string name;std:cout name;使用完全限定名訪問cin和cout:為減少輸入量,可以通過using聲明(using declaration)引入一個名字:using std:string;using std:cout;using std:cin;更簡單一點,也可以直接使用using指令(using directive)
21、引入一個名字空間的所有名字:using namespace std;使用using指令抵消了名字空間防止名字沖突的作用,例如:using namespace one;using namespace other;假設這2個名字空間都有叫LadderNum的變量:LadderNum = 5;以上語句有歧義,編譯器無法確定變量屬于哪個名字空間。此時應采用完全限定名:one:LadderNum = 5;或通過using聲明確定優(yōu)先選用的名字空間:using one:LadderNum;2.2 建立自己的名字空間名字空間是完全開放的。只要是包含在namespace aname.大括號內的內容都屬于該名字
22、空間。名字空間可以跨越多個源文件。示例:將階梯型電阻電路計算程序中所有代碼放置到名字空間LadderCircuit中namespace LadderCircuitconst int MAX_RESISTS = 500;extern int resistTotal;extern double srcVoltage;extern double resistsMAX_RESISTS;extern double resistVoltagesMAX_RESISTS;extern double resistCurrentsMAX_RESISTS;void getResistsTotal();void ge
23、tSrcVoltage();void getResists();void compute();void displayResult();LadderCircuit.h現在這些變量屬于名字空間LadderCircuit,它們的作用域范圍是名字空間LadderCircuit,而不再是全局作用域了。input.cpp#include #include #include LadderCircuit.husing std:cin;using std:cout;using std:endl;namespace LadderCircuitint resistTotal;double srcVoltage;d
24、ouble resistsMAX_RESISTS;void getResistsTotal(). void getResists(). void getSrcVoltage(). 這些變量和函數都屬于名字空間LadderCircuitcompute.cpp#include LadderCircuit.hnamespace LadderCircuitdouble resistVoltagesMAX_RESISTS;double resistCurrentsMAX_RESISTS;void compute() . output.cpp類似main.cpp#include LadderCircuit
25、.hvoid main()LadderCircuit:getResistsTotal();LadderCircuit:getResists();LadderCircuit:getSrcVoltage(); pute();LadderCircuit:displayResult();#include LadderCircuit.husing namespace LadderCircuit;void main()getResistsTotal();getResists();getSrcVoltage();compute();displayResult();或者簡寫:使用完全限定名使用using指令3
26、 C+標準庫3.1 標準庫的組成C+的標準庫是C+標準規(guī)定的隨編譯器一起提供的一套可以直接使用的函數和類的集合C+的標準庫主要是基于泛型編程技術,幾乎所有的函數和類都是模板,以前稱為標準模板庫(Standard Template Library,簡稱STL),現在稱為C+標準庫C+標準庫可以看做由以下部分組成存儲群體數據的數據容器,分為序列容器和關聯(lián)容器序列容器按元素進入容器的順序存放關聯(lián)容器在元素進入容器是就根據排序原則放置在合適的位置。迭代器迭代器提供遍歷群體數據容器的方法算法算法可以在遍歷群體數據容器時對容器中的每個元素進行操作函數對象替代函數指針string類型替代C風格的字符串ios
27、tream流庫替代C的printf,scanf和文件輸入輸出函數3.2群體數據容器向量vector語言提供的基本數組使用上有很多不便:數組大小不能改變需要另外一個整數變量描述數組實際存放數據的長度不能自行完成復制數組的工作數組只是一個存儲數據的集合,本身并不具有管理這種存儲的運算和操作標準庫提供的向量vector用于替代普通的數組,能夠自行管理存儲內容并進行運算使用更簡便#include #include using namespace std;int main( ) vector numbers; for( int i = 0; i 10; i+ ) numbers.push_back( i
28、*2 ); for( int i = 0; i numbers.size(); i+ ) cout numbers i = numbersi endl; return 0;vector使用示例:聲明一個向量類型的變量,其中沒有數據在向量尾部添加數據,自動擴展所需內存空間向量中的數據長度用下標運算符訪問向量中的數據元素,行為和數組相同使用向量類型包含需要的頭文件 #include 定義向量變量 vector numbers;該語句構造一個向量變量,該向量現在是空的,里面沒有元素,長度為0vector才是一個類型,vector本身不是類型,只是一個類型模板vector表明自己是一個存放整型數據的向
29、量numbers是一個變量,不是一群變量為向量添加數據 numbers.push_back(i*2)該循環(huán)向向量中增加10個元素。增加數據后,向量的長度為10向量自身管理內存的大小存取向量中的數據 cout numbersi向量的數據訪問與普通數組相同,用下標運算符下標范圍從0開始向量能管理自身的長度,通過size()方法獲得變量的長度調整向量的長度可以在定義向量變量時指定向量的長度 vector numbers(10);這種定義方式像一個函數調用,函數調用參數指定向量的長度這時向量中有10個數據,它們都是0若調用numbers.push_back(),那么是從第11個位置向后增加數據,并增加
30、向量的長度調用resize()方法重新設置向量的長度numbers.resize(20); 將向量的長度增長到20,增加的數據也會清0也可以減小向量長度,末尾數據銷毀復制向量vector numbers_a, numbers_b;for( int i=0; i10; +i )numbers_a.push_back( i*2 );numbers_b = numbers_a;向量通過賦值運算符實現向量的復制。例如:而數組,編程者則不得不自己寫復制代碼:int a10, b10;for( int i=0; i10; +i )ai = i*2;for( int i=0; i10; +i )bi = a
31、i;向量作為函數參數向量變量是單個變量,可以作為函數參數傳遞,由于一個向量變量中存儲了很多數據元素,通常采用引用類型進行參數傳遞:double avg( const vector &v )double sum = 0.0;for( int i=0; iv.size(); +i )sum += vi;return sum / v.size();向量編程示例例1:冒泡排序templatevoid BubbleSort( vector& v )int n = v.size();for( int pass=1; passn; +pass )for( int i=0; i vi+1 )T tmp = v
32、i+1;vi+1 = vi;vi = tmp;向量自行管理長度,只需要1個參數應用排序函數對字符串進行排序:void main()vector strs;cout 請輸入字符串(空行結束): endl;while( 1 )string s;getline( cin, s );if( s.size() = 0 )break;strs.push_back( s );BubbleSort( strs );for( int i=0; istrs.size(); +i )cout strsi endl;string替代C風格字符串,向量替代數組BubbleSort()是一個函數模板,對各種類型通用標準庫
33、已經提供了標準的排序函數:.#include void main()vector strs;.sort( strs.begin(), strs.end() );.sort()缺省按照從小到大排序,若改為從大到小排序:sort( strs.begin(), strs.end(), greater() );迭代器,指向第一個數據元素迭代器,指向最后一個數據元素后例2:向數組中插入元素if( waitInsert v.back() )v.push_back( waitInsert );elsefor( vector:iterator iter = v.begin(); iter != v.end()
34、; +iter )if( waitInsert *iter & waitInsert *(iter+1) )v.insert( iter+1, waitInsert );break;第一個數據元素的值最后一個數據元素的值迭代器,行為就像一個指針指定插入的位置用取內容運算符獲取元素的數據值向量變量的front()和back()方法獲取第0個元素和最后一個元素的值insert()方法向數組中插入一個元素,第1個參數為插入位置,第2個參數是待插入的數據不需要管理插入的具體細節(jié),既不需要預留空間,也不需要去移動位置,這些工作標準庫自動完成。向量的遍歷除了象C風格數組一樣用下標實現外,還可以使用標準庫的
35、迭代器機制實現對vector類型的向量進行遍歷的迭代器數據類型為vector:iterator反向遍歷的迭代器的數據類型為vector:reverse_iterator只讀遍歷的迭代器的數據類型為vector:const_iteratorbegin()方法返回vector的第一個位置的迭代器, end()方法返回vector的最后一個可用位置的迭代器反向遍歷時用rbegin()和rend()方法迭代器的行為和指針類似,可以通過加、減算術運算表示在向量中向前、向后移動,用取內容運算符*取出迭代器指向位置的數據值。例3:實現數組順序反轉直接使用標準庫的reverse算法需要頭文件 #include
36、 將ch05-07.cpp中的my_reverse()調用改為 reverse( v.begin(), v.end() );例4:數組元素的查找修改ch05-08.cpp的二分查找代碼,改造后的函數模板原型為:templateint BinarySearch( const vector& v, T value );或調用標準庫的find算法查找元素:vector:iterator result;result = find( numbers.begin(), numbers.end(), 16 );例5:階梯型電阻電路計算程序用向量類型實現LadderCircuit.h#include usin
37、g std:vector;double getSrcVoltage();void getResists( vector& );void compute(const vector&, double, vector&, vector&);void displayResult(const vector&, const vector&, const vector&);傳遞向量只需要一個參數應使用引用類型input.cppvoid getResists(vector& rs)int num = 0;for( ; ; )cout 請輸入第 +num r;if( r 0 )cout 輸入電阻為負數,取絕對值
38、 endl;r = -r;if( abs(r) numeric_limits:epsilon() )break;rs.push_back( r ); /接下頁輸入一個電阻值,添加到向量尾部可輸入任意多個電阻值,輸入0結束input.cpp/接上頁if( rs.size() % 2 != 0 )double r = rs.back() / 2.0;rs.pop_back();rs.push_back( r );rs.push_back( r );for( int i=0; irs.size(); +i )cout 第 i/2+1 節(jié):;if( i%2 = 0 )cout 串聯(lián)電阻=;elseco
39、ut 并聯(lián)電阻=;cout rsi ;if( (i+1)%2 = 0 )cout endl;若輸入電阻值為奇數,將最后一個電阻拆兩半compute.cppvoid compute(const vector &rs, double v, vector &vs, vector &is)int num = rs.size() - 1;vsnum = 1.0;isnum = vsnum / rsnum;-num;isnum = isnum+1;vsnum = isnum * rsnum;-num;for( ; num 0 ; )vsnum = vsnum+1 + vsnum+2;isnum = vsn
40、um / rsnum;-num;isnum = isnum+1 + isnum+2;vsnum = isnum * rsnum;-num;double PortVoltage = vs0 + vs1;double k = v / PortVoltage;for( int i=0; irs.size(); +i )vsi *= k;isi *= k;只讀的輸入參數使用引用常量計算代碼與數組版本完全相同main.cppvoid main()double srcVoltage;vector resists;getResists( resists );srcVoltage = getSrcVoltage();vector resistVoltages( resists.size() );vector resistCurrents( resists.size() );compute(resists
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個人店面商鋪租賃合同常用版(2篇)
- 2025年五年級教師年度考核思想工作總結樣本(三篇)
- 2025年個人承包工地合同(2篇)
- 2025年乙方房屋租賃合同(三篇)
- 農藥運輸安全責任協(xié)議
- 教育科研大樓轉讓居間合同
- 咖啡廳裝修工人合同范本
- 住宅精裝修保修合同范本
- 住宅小區(qū)石材裝修協(xié)議
- 展會物流支持外包合同
- 金礦管理制度
- 橋梁樁基礎施工概述及施工控制要點
- 云南省普通初中學生成長記錄模板-好ok
- SB/T 10415-2007雞粉調味料
- JB/T 20036-2016提取濃縮罐
- 考古繪圖基礎
- GB/T 3452.4-2020液壓氣動用O形橡膠密封圈第4部分:抗擠壓環(huán)(擋環(huán))
- GB/T 32574-2016抽水蓄能電站檢修導則
- 《社會主義市場經濟理論(第三版)》第十三章社會主義市場經濟標準論
- 變更索賠案例分析
- 2022年4月自學考試06093《人力資源開發(fā)與管理》歷年真題及答案
評論
0/150
提交評論