




已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
操作系統(tǒng)課設(shè)報告1. 概述31.1. 目的31.2. 主要完成的任務(wù)31.3. 使用的開發(fā)工具31.4. 解決的主要問題32. 使用的基本概念和原理32.1. 線程32.2. 線程的同步42.3. 模態(tài)對話框42.4. 原理43. 總體設(shè)計43.1. 確定基本的技術(shù)路線43.2. 軟件的總體結(jié)構(gòu)43.3. 創(chuàng)建的進程和線程54. 詳細(xì)設(shè)計54.1. 利用的進程操作的函數(shù)、原語、API54.1.1. 信號量創(chuàng)建函數(shù)54.1.2. 互斥對象的創(chuàng)建.54.1.3. 線程創(chuàng)建函數(shù)64.1.4. 等待函數(shù)64.2. 模塊內(nèi)部的流程和實現(xiàn)算法64.3. 全局變量的聲明85. 編碼設(shè)計95.1. 開發(fā)環(huán)境的設(shè)置和建立95.2. 編譯環(huán)境的設(shè)置95.3. 程序設(shè)計時要注意的事項105.4. 主要程序的代碼設(shè)計及注釋105.5. 解決的技術(shù)難點、經(jīng)常犯的錯誤146. 測試時出現(xiàn)的問題及其解決方法147. 軟件使用說明及運行結(jié)果147.1. 基本功能147.2. 需要運行的環(huán)境157.3. 安裝及運行157.4. 操作157.5. 運行結(jié)果158. 總結(jié)168.1. 操作系統(tǒng)課程設(shè)計完成情況168.2. 收獲和感受168.3. 經(jīng)驗總結(jié)169. 參考文獻(xiàn)171. 概述1.1. 目的 通過使用程序設(shè)計語言設(shè)計一個程序,模擬生產(chǎn)者消費者和搬運者對產(chǎn)品操作的過程。1.2. 主要完成的任務(wù)PutMove2Buff1Buff2Buff3GetMove1 圖1 Buffer操作 (1) 可以隨機產(chǎn)生字符數(shù)據(jù),由put操作放入Buff1,buffer中容量單位是字符。 (2) 提供良好圖形界面,顯示Buffer的操作過程。 (3) 可以設(shè)定各Buffer的容量、PUT、GET、Move操作的個數(shù); (4) 可以設(shè)定PUT、GET、Move操作的速度; (5) 實時顯示每個Buffer中數(shù)據(jù)的個數(shù)和數(shù)據(jù)的內(nèi)容,空閑Buffer的空間的個數(shù); (6) 實時顯示線程、進程所處于等待(阻塞)狀態(tài)的個數(shù) (7) 程序運行結(jié)束,顯示匯總數(shù)據(jù): 總的運行時間; Buffer中數(shù)據(jù)的個數(shù); 已放入BUFFER的數(shù)據(jù)個數(shù); 已放已取的數(shù)據(jù)個數(shù); 平均每個buffer中的數(shù)據(jù)個數(shù)。1.3. 使用的開發(fā)工具使用MFC在VC+6.0上完成程序的設(shè)計。1.4. 解決的主要問題 (1)可以隨機產(chǎn)生字符數(shù)據(jù)。 (2)設(shè)計put,get,move的線程。 (3)可以設(shè)計buffer的容量,put,get,move的個數(shù)。 (4)控制put,get,move的速度。 (5)實時顯示buffer的內(nèi)容。2. 使用的基本概念和原理2.1. 線程線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。線程是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤消另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運行中呈現(xiàn)出間斷性。線程也有就緒、阻塞和運行三種基本狀態(tài)。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。2.2. 線程的同步 臨界段:臨界段對象通過提供所有線程必須共享的對象來控制線程。只有擁有臨界段對象的線程才可以訪問保護資源(進行臨界區(qū)操作)。在另一個線程可以獲取對象的訪問權(quán)。用戶應(yīng)用程序可能會使用臨界對象來阻止兩個線程同時訪問共享的資源發(fā)文件等。 互斥量:互斥量的工作方式和臨界段非常相似,其區(qū)別在于互斥量不公保護一個進程內(nèi)的資源共享,而且還保護系統(tǒng)中進程之間的共享資源。它是通過為互斥量提供一個“互斥量名”來進行進程間資源共享協(xié)調(diào)的。 事件:事件對象用于給線程傳遞信號,指示線程中特定的操作可以開始或結(jié)束。除非線程已經(jīng)收到了這個事件信號,否則它將一直處于掛起狀態(tài)。當(dāng)事件對象進入其信號狀態(tài)時,正在等待該事件的線程就可以開始執(zhí)行。例如,一個應(yīng)用程序可以通過事件來通知線程它需要的數(shù)據(jù)已經(jīng)準(zhǔn)備好。經(jīng)常利用事件進行線程之間的通信。 信號量:信號量與互斥相似,但是互斥只允許在同一時刻一個線程訪問它的數(shù)據(jù),而信號量允許多個線程在同一時刻訪問它的數(shù)據(jù)。WIN32 不知道哪一個線程擁有信號量,它只保證信號量使用的資源計數(shù)正確的設(shè)置。2.3. 模態(tài)對話框 模態(tài)對話框(Modal Dialogue Box,又叫做模式對話框),是指在用戶想要對對話框以外的應(yīng)用程序進行操作時,必須首先對該對話框進行響應(yīng)。如單擊【確定】或【取消】按鈕等將該對話框關(guān)閉。2.4. 原理 使用信號量作為同步互斥的工具,通過對BUFFER1、BUFFER2的容量,還有控制權(quán)設(shè)置不同的信號量來協(xié)調(diào)PUT、GET、MOVE線程,使其同步來實現(xiàn)P、V操作。3. 總體設(shè)計3.1. 確定基本的技術(shù)路線用MFC設(shè)計的,是面向?qū)ο蟮某绦颉?.2. 軟件的總體結(jié)構(gòu)設(shè)置模塊,設(shè)置生產(chǎn)者消費者搬運者的初始值,及其它們的速度。顯示模塊,實時顯示生產(chǎn)者消費者搬運者及buffer的情況變化,還有匯總的情況。生產(chǎn)者消費者搬運者過程演示控制模塊,控制開始,停止及退出。 圖2 框架圖3.3. 創(chuàng)建的進程和線程 (1)DWORD WINAPI ThreadProduct(LPVOID lpParameter);/生產(chǎn)者線程 (2)DWORD WINAPI ThreadConsumer(LPVOID lpParameter);/生產(chǎn)者線程 (3)DWORD WINAPI ThreadMover1(LPVOID lpParameter);/搬運者1線程 (4)DWORD WINAPI ThreadMover2(LPVOID lpParameter);/搬運者2線程 (5)DWORD WINAPI ThreadBuffer1(LPVOID lpParameter);/顯示buffer1的線程 (6)DWORD WINAPI ThreadBuffer2(LPVOID lpParameter);/顯示buffer2的線程 (7)DWORD WINAPI ThreadBuffer3(LPVOID lpParameter);/顯示buffer3的線程 (8)DWORD WINAPI ThreadCount(LPVOID lpParameter);/匯總的線程 (9)DWORD WINAPI Threadtime(LPVOID lpParameter);/時間的線程4. 詳細(xì)設(shè)計4.1. 利用的進程操作的函數(shù)、原語、API 4.1.1. 信號量創(chuàng)建函數(shù) HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, / 安全屬性指針LONG lInitialCount, / 初始計數(shù)LONG lMaximumCount, / 最大計數(shù)LPCTSTR lpName / 對象名指針); 該函數(shù)創(chuàng)建一個信號量,llnitialCount 是對信號量的初始值,iMaximunCount為信號量的最大值,即信號量在一個范圍內(nèi)有效,例empty=:CreateSemaphore(0,0,M,0);第二個0為empty信號量的初始值,M為信號量的最大值,在這個范圍內(nèi)(0,M)信號量都是有信號的。4.1.2. 互斥對象的創(chuàng)建HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,安全屬性結(jié)構(gòu)指針,可為NULL,表示默認(rèn)安全性BOOL bInitialOwner,/是否占有該互斥量,TRUE:占有,F(xiàn)ALSE:不占有LPCTSTR lpName/設(shè)置互斥對象的名字);如果一個線程擁有了一個互斥對象后,當(dāng)該線程運行完成后就要釋放該互斥對象,不然其他的線程得不到互斥對象則無法運行。用ReleaseMutex(HWND);操作它的具體作用是每調(diào)用它一次將互斥對象的計數(shù)器減一,直到減到零為止,此時釋放互斥對象,并將互斥對象中的線程id置零。它的使用條件是,互斥對象在哪個線程中被創(chuàng)建,就在哪個線程里面釋放。因為調(diào)用的時候會檢查當(dāng)前線程的id是不是與互斥對象中保存的id一致,若一致,則此次操作有效,不一致,則無效。4.1.3. 線程創(chuàng)建函數(shù)HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes./線程安全屬性DWORD dwStackSize,/線程堆棧的初始化大小,等于0時為系統(tǒng)默認(rèn)的堆棧大小PLTHREAD_START_ROUTINE lpStartAddress,/線程函數(shù)LPVOID lpParameter,/線程參數(shù)DWORD dwCreationFlags,/創(chuàng)建方式LPDWORD lpThreadId/線程標(biāo)識符);該函數(shù)創(chuàng)建一個線程,如果沒有特殊需要除第三個參數(shù)外都可設(shè)為0,按系統(tǒng)的默認(rèn)取值對待,主要是第三個參數(shù),它是線程程序的入口,線程序入口的標(biāo)準(zhǔn)形式為 UINT FUNCTION(LPVOID param)線程函數(shù)里可以傳一個指針做為參數(shù)(param),該參數(shù)由創(chuàng)建線程函數(shù)(CreateThread)里的第四個參數(shù)確定。4.1.4. 等待函數(shù) DWORD WaitForSingleObjec( HANDLE hHandle,/對象句柄 DWORD dwMilliseconds/等待的時間,單位為毫秒 )該函數(shù)在不同的應(yīng)用里會有不同的意義,在信號量里應(yīng)用時主要是判斷信號量是否有信號。第二個參數(shù)為等待時間,我們通常設(shè)為INFINITE,即為無限等待,在等待期間會將線程掛起,直到等待的信號量有信號。4.2. 模塊內(nèi)部的流程和實現(xiàn)算法 設(shè)置6個信號量full1、empty1、hMutex1、full2、empty2、hMutex2,full3、empty3,hMutex3它們的含義和初值如下: (1)full1buffer1是否有數(shù)據(jù),初值為0; (2)empty1buffer1有空間,初值為M; (3)hMutex1buffer1是否可操作,初值為1; (4)full2buffer2是否有數(shù)據(jù),初值為0; (5)empty2buffer2有空間,初值為N; (6)hMutex2buffer2是否可操作,初值為1;(7)full3buffer3是否有數(shù)據(jù),初值為0;(8)empty3buffer3有空間,初值為Q;(9)hMutex3buffer3是否可操作,初值為1; 設(shè)置三類進程函數(shù),用信號量實現(xiàn)同步互斥,PUT,MOVE,GET算法如下: While()P(empty1); /*判斷buff1是否有空間,沒有則等待 */ P(hMutex1); /*是否可操作buffer1*/PUT; V(hMutex1); /*設(shè)置buff1可操作標(biāo)志 */ V(full1); /*設(shè)置buff1有數(shù)據(jù)的標(biāo)志 */ until false Move1 While()P(full1); /*判斷buffer1是否有數(shù)據(jù)*/P(empty2); /*判斷buffer2是否有空間*/ P(hMutex1); /*是否可操作buffer1 */P(hMutex2); /*是否可操作buffer2 */MOVE; V(hMutex1); /*設(shè)置buffer1可操作標(biāo)志*/ V(hMutex2); /*設(shè)置buffer2可操作標(biāo)志*/ V(empty1); /*設(shè)置buffer1有空間標(biāo)志*/ V(full2); /*設(shè)置buffer2有數(shù)據(jù)標(biāo)志*/ until false Move2 While()P(full2); /*判斷buffer2是否有數(shù)據(jù)*/P(empty3); /*判斷buffer3是否有空間*/ P(hMutex2); /*是否可操作buffer2 */P(hMutex3); /*是否可操作buffer3*/MOVE; V(hMutex2); /*設(shè)置buffer2可操作標(biāo)志*/ V(hMutex3); /*設(shè)置buffer3可操作標(biāo)志*/ V(empty2); /*設(shè)置buffer2有空間標(biāo)志*/ V(full3); /*設(shè)置buffer3有數(shù)據(jù)標(biāo)志*/ until false While()P(full3); /*判斷buffer3是否有數(shù)據(jù),沒有則等待 */ P(hMutex3); /*是否可操作buffer3*/GET; V(hMutex3); /*設(shè)置buffer3可操作標(biāo)志 */ V(full3); /*設(shè)置buffer3有數(shù)據(jù)的標(biāo)志 */ until false4.3. 全局變量的聲明 int put_buffer1=0;/放入buffer1的產(chǎn)品個數(shù); int move_buffer1=0;/從buffer1中取走的產(chǎn)品個數(shù); int move_buffer2=0;/從buffer2中取走的產(chǎn)品個數(shù); int get_buffer3=0;/從buffer3中取走的產(chǎn)品個數(shù); int m_time;/記錄時間 int buffer1;/buffer1中產(chǎn)品個數(shù) int buffer2;/buffer2中產(chǎn)品個數(shù) int buffer3;/buffer3中產(chǎn)品個數(shù) int consumer;/消費者個數(shù) int product;/生產(chǎn)者個數(shù) int mover;/搬運者一的個數(shù) int mover2;/搬運者二的個數(shù) int producterid=1;/生產(chǎn)者的id號 int moverid1;/搬運者1的id號 int moverid2;/搬運者2的id號 int consumer_id=1;/消費者的id int productid=101;/生產(chǎn)者生產(chǎn)出來的產(chǎn)品的id號 int name_product;/存儲隨機產(chǎn)品; int ioend=0;/判斷用的 int toend=1; int consumerid=101;/消費者消費的產(chǎn)品id號 int move1_consumerid=101;/搬運者搬運的產(chǎn)品的id號 int move2_consumerid=101; int put=1000;/put的速度 int move1=1000;/move1的速度 int move2=1000;/move2的速度 int get=1000;/get的速度 CString getget;/存獲取m_list_buffer里面的第0行的字符串; CString move;/存獲取m_list_buffer里面的第0行的字符串; CString putput;/存獲取m_list_buffer里面的第0行的字符串;5. 編碼設(shè)計5.1. 開發(fā)環(huán)境的設(shè)置和建立 (1)起動VISUAL C+ 6.0程序 (2)在菜單里選擇文件,子菜單里選擇新建,彈出新建對話框,如圖3所示。 圖3.新建工程 (3)在左邊的新建選項里選擇MFC AppWizardexe選項,右邊的project name里填入一個工程名,選擇OK按扭。選擇默認(rèn)設(shè)置。5.2. 編譯環(huán)境的設(shè)置 在WINDOWS環(huán)境下的多線程中,為保證程序的正確性,必須使用用于多線程環(huán)境的正確的函數(shù)庫,在VC+ 6.0開發(fā)環(huán)境中在菜單工程中設(shè)置中進行選擇。步驟如下: (1)選擇PROJECT菜單中的SETTING.項; (2)在打開的表彰中選擇C/C+項; (3)選擇CATEGORY中的CODE GENERATION項; (4)在USE RUN-TIME LIBRARY中選擇MULTITHREADED; (5)單擊OK即可。 此時,在命令行方式下編譯選項由ML變?yōu)镸T,如圖4所示。 圖4.編譯環(huán)境5.3. 程序設(shè)計時要注意的事項(1)盡量避免全局變量的使用;(2)變量的命名要規(guī)范;(3)注意給代碼多寫注釋;(4)注意進行模塊化設(shè)計,寫相應(yīng)的函數(shù)來完成相應(yīng)的功能。5.4. 主要程序的代碼設(shè)計及注釋 (1)四個主要線程PUT,GET,MOVE1,MOVE2代碼實現(xiàn)。DWORD WINAPI ThreadProduct(LPVOID lpParameter)int j=producterid;/用j來標(biāo)記第幾條線程;producterid+;while(toend)Sleep(put);CString str;CString str1;CString str2;WaitForSingleObject(SemaphoreEmpty,INFINITE);WaitForSingleObject(hMutex,INFINITE);put_buffer1+;/放進去一個產(chǎn)品,就加一;srand(unsigned)time(NULL);name_product=(rand()%26)+65;str.Format(%s%d%4d%s,工作者完成,j,put_buffer1,次生產(chǎn));str1.Format(%s%d%s%c,產(chǎn)品號:,productid+,產(chǎn)品名:,name_product);str2.Format(%s%d%s,線程,j,在運行,其他線程處于阻塞狀態(tài));m_list_product-DeleteString(0);m_list_product-DeleteString(0);m_list_product-InsertString(-1,str);m_list_product-InsertString(-1,str1);m_list_product-InsertString(-1,str2);m_list_buffer1-InsertString(-1,str1);Sleep(400);m_list_product-DeleteString(2);ReleaseMutex(hMutex);ReleaseSemaphore(SemaphoreFULL,1,NULL);return 1;DWORD WINAPI ThreadMover1(LPVOID lpParameter)int j=moverid1;moverid1+;while(toend)Sleep(move1);CString str;CString str1;CString str2;WaitForSingleObject(SemaphoreFULL,INFINITE);WaitForSingleObject(SemaphoreEmpty2,INFINITE);WaitForSingleObject(hMutex,INFINITE);WaitForSingleObject(hMutex2,INFINITE);move_buffer1+;/表示從buffer1移出的產(chǎn)品也是移入buffer2的產(chǎn)品個數(shù);str.Format(%s%d%s%4d%s,搬運者,j,buffer1-buffer2,move_buffer1,次搬運);str2.Format(%s%d%s,線程,j,在運行其他線程處于阻塞狀態(tài));m_list_buffer1-GetText(0,putput);m_list_move1-DeleteString(0);m_list_move1-DeleteString(0);m_list_move1-InsertString(-1,str);m_list_move1-InsertString(-1,putput);m_list_move1-InsertString(-1,str2);m_list_buffer1-DeleteString(0);m_list_buffer2-InsertString(-1,putput);Sleep(400);m_list_move1-DeleteString(2);ReleaseMutex(hMutex2); ReleaseMutex(hMutex); ReleaseSemaphore(SemaphoreFULL2,1,NULL);ReleaseSemaphore(SemaphoreEmpty,1,NULL);return 1;DWORD WINAPI ThreadMover2(LPVOID lpParameter)int j=moverid2;moverid2+;while(toend)Sleep(move2);CString str;CString str2;WaitForSingleObject(SemaphoreFULL2,INFINITE);WaitForSingleObject(SemaphoreEmpty3,INFINITE);WaitForSingleObject(hMutex2,INFINITE);WaitForSingleObject(hMutex3,INFINITE);move_buffer2+;/表示從buffer2移出的產(chǎn)品也是移入buffer3的產(chǎn)品個數(shù);str.Format(%s%d%s%4d%s,搬運者,j,buffer2-buffer3,move_buffer2,次搬運);str2.Format(%s%d%s,線程,j,在運行其他線程處于阻塞狀態(tài));m_list_buffer2-GetText(0,move);m_list_move2-DeleteString(0);m_list_move2-DeleteString(0);m_list_move2-InsertString(-1,str);m_list_move2-InsertString(-1,move);m_list_move2-InsertString(-1,str2);m_list_buffer2-DeleteString(0);m_list_buffer3-InsertString(-1,move);Sleep(400);m_list_move2-DeleteString(2);ReleaseMutex(hMutex3); ReleaseMutex(hMutex2); ReleaseSemaphore(SemaphoreFULL3,1,NULL);ReleaseSemaphore(SemaphoreEmpty2,1,NULL);return 1;DWORD WINAPI ThreadConsumer(LPVOID lpParameter)int j=consumer_id;consumer_id+;while(toend)Sleep(get);CString str;CString str1;CString str2;WaitForSingleObject(SemaphoreFULL3,INFINITE);WaitForSingleObject(hMutex3,INFINITE);get_buffer3+;str.Format(%s%d%s,本次生產(chǎn)完成:,get_buffer3,次消費);str2.Format(%s%d%s,線程,j,在運行其他線程處于阻塞狀態(tài));m_list_buffer3-GetText(0,getget);m_list_buffer3-DeleteString(0);m_list_consumer-DeleteString(0);m_list_consumer-DeleteString(0);m_list_consumer-InsertString(-1,str);m_list_consumer-InsertString(-1,getget);m_list_consumer-InsertString(-1,str2);Sleep(400);m_list_consumer-DeleteString(2);ReleaseMutex(hMutex3); ReleaseSemaphore(SemaphoreEmpty3,1,NULL);return 1;5.5. 解決的技術(shù)難點、經(jīng)常犯的錯誤 (1)不了解MFC已經(jīng)封裝好的函數(shù)的功能,有時候都不會調(diào)用,要通過MSDN來查,或者通過百度來查。(2)控件不太會使用,剛開始的時候還不知道如何綁定控件和變量。(3)全局變量和局部變量的使用不清楚,有時候造成一些錯誤。6. 測試時出現(xiàn)的問題及其解決方法 (1)局部變量的運用:有一次有一個局部變量寫錯了,把j寫成了i,結(jié)果導(dǎo)致程序運行不下去,我通過單步跟蹤,跟蹤程序的運行,最后修改了這個局部變量。 (2)隨機生產(chǎn)的產(chǎn)品如何記錄:并非記錄全部產(chǎn)生的變量,我在生產(chǎn)者線程中用一個局部變量記錄隨機產(chǎn)生的字符產(chǎn)品,然后將其放入buffer1,搬運者是通過獲取buffer里的第一個字符就是所要搬運的產(chǎn)品。 (3)buffer的內(nèi)的內(nèi)容實時顯示是通過在定義了buffer
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省連云港市海州區(qū)2024-2025學(xué)年七年級上學(xué)期期末生物學(xué)試題(含答案)
- 水處理技術(shù)開發(fā)合同
- 人工智能金融風(fēng)險評估與控制手冊
- 生物學(xué)基因工程研究熱點練習(xí)題集編選
- 股份制公司運營指南
- 航空模型制造安全責(zé)任協(xié)議
- 高分子化學(xué)材料性質(zhì)題庫
- 語言學(xué)語言應(yīng)用知識問答
- 高中英語閱讀技巧課:如何快速找到文章主旨與細(xì)節(jié)教案
- 餐飲行業(yè)市場份額分析表
- 版式設(shè)計(全套課件455P)
- 幼兒園繪本故事:《羅伯生氣了》 課件
- 閱覽室使用記錄表
- 家畜的生產(chǎn)發(fā)育課件
- 森林防火主題教育班會PPT
- 船舶安檢缺陷處理建議表籍國內(nèi)航行海船
- 輻照交聯(lián)電線電纜型號說明
- 公路工程決算編制辦法(交公路發(fā)2004-507號)附表
- 礦山機械無人駕駛項目可行性研究報告模板
- 預(yù)充氣競技步槍 標(biāo)準(zhǔn)A4靶紙
- 避免同業(yè)競爭承諾函
評論
0/150
提交評論