日韩欧美国产精品,在线播放国产区,欧美人与物videos另类一,日韩经典欧美一区二区三区,成人午夜视频在线,无毒不卡,香蕉97碰碰视频免费

11程序設(shè)計(jì)實(shí)踐6w-線程、模塊化、時(shí)間函數(shù)和設(shè)計(jì)問題

上傳人:dream****gning 文檔編號(hào):240542721 上傳時(shí)間:2024-04-14 格式:PPTX 頁(yè)數(shù):76 大小:714.46KB
收藏 版權(quán)申訴 舉報(bào) 下載
11程序設(shè)計(jì)實(shí)踐6w-線程、模塊化、時(shí)間函數(shù)和設(shè)計(jì)問題_第1頁(yè)
第1頁(yè) / 共76頁(yè)
11程序設(shè)計(jì)實(shí)踐6w-線程、模塊化、時(shí)間函數(shù)和設(shè)計(jì)問題_第2頁(yè)
第2頁(yè) / 共76頁(yè)
11程序設(shè)計(jì)實(shí)踐6w-線程、模塊化、時(shí)間函數(shù)和設(shè)計(jì)問題_第3頁(yè)
第3頁(yè) / 共76頁(yè)

本資源只提供3頁(yè)預(yù)覽,全部文檔請(qǐng)下載后查看!喜歡就下載吧,查找使用更方便

16 積分

下載資源

資源描述:

《11程序設(shè)計(jì)實(shí)踐6w-線程、模塊化、時(shí)間函數(shù)和設(shè)計(jì)問題》由會(huì)員分享,可在線閱讀,更多相關(guān)《11程序設(shè)計(jì)實(shí)踐6w-線程、模塊化、時(shí)間函數(shù)和設(shè)計(jì)問題(76頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 模塊化設(shè)計(jì)問題模塊化設(shè)計(jì)問題1 提綱提綱1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)使用線程實(shí)現(xiàn)任務(wù)并發(fā)2.模塊化和工程模塊化和工程3.概要設(shè)計(jì)要點(diǎn)概要設(shè)計(jì)要點(diǎn)4.時(shí)間控制函數(shù)時(shí)間控制函數(shù)5.有限狀態(tài)自動(dòng)機(jī)解題有限狀態(tài)自動(dòng)機(jī)解題2 1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)問題的引出:以電梯控制系統(tǒng)為例問題的引出:以電梯控制系統(tǒng)為例目前能想到的程序主體結(jié)構(gòu)目前能想到的程序主體結(jié)構(gòu)main()while(1)state_trans();/計(jì)算此刻電梯的狀態(tài)計(jì)算此刻電梯的狀態(tài)print_message();/輸出電梯此刻的狀態(tài)輸出電梯此刻的狀態(tài),包括動(dòng)畫包括動(dòng)畫get_input();/接收當(dāng)前時(shí)刻的新輸入(包括新目接收當(dāng)前時(shí)刻的新

2、輸入(包括新目標(biāo)和新呼叫)標(biāo)和新呼叫)control();/*根據(jù)控制策略確定下一目標(biāo)樓層,根據(jù)控制策略確定下一目標(biāo)樓層,在在state_trans()中要用到中要用到*/time_count();/時(shí)間片推進(jìn)一個(gè)時(shí)間片推進(jìn)一個(gè)思考:上述結(jié)構(gòu)不合理之處?思考:上述結(jié)構(gòu)不合理之處?3 1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)上述結(jié)構(gòu)不合理之處上述結(jié)構(gòu)不合理之處:計(jì)算和輸出電梯狀態(tài)與接收服務(wù)計(jì)算和輸出電梯狀態(tài)與接收服務(wù)請(qǐng)求是串行的,與現(xiàn)實(shí)中的電梯運(yùn)行不符!請(qǐng)求是串行的,與現(xiàn)實(shí)中的電梯運(yùn)行不符!程序結(jié)構(gòu)的改進(jìn):程序結(jié)構(gòu)的改進(jìn):從上述代碼中刪除從上述代碼中刪除get_input(),從而實(shí)現(xiàn)每隔一小段時(shí),從而實(shí)現(xiàn)每隔

3、一小段時(shí)間就刷新電梯當(dāng)前狀態(tài)間就刷新電梯當(dāng)前狀態(tài)main()while(1)state_trans();/計(jì)算此刻電梯的狀態(tài)計(jì)算此刻電梯的狀態(tài)print_message();/輸出電梯此刻的狀態(tài)輸出電梯此刻的狀態(tài)control();/*根據(jù)控制策略確定下一目標(biāo)樓層,這根據(jù)控制策略確定下一目標(biāo)樓層,這在在state_trans()中要用到中要用到*/time_count();/時(shí)間片推進(jìn)一個(gè)時(shí)間片推進(jìn)一個(gè)4 1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)但是,程序必須要能接收電梯服務(wù)請(qǐng)求,如何但是,程序必須要能接收電梯服務(wù)請(qǐng)求,如何處理服務(wù)請(qǐng)求的輸入?處理服務(wù)請(qǐng)求的輸入?理想狀態(tài):理想狀態(tài):電梯服務(wù)請(qǐng)求的接收和電梯狀

4、態(tài)的計(jì)算輸出電梯服務(wù)請(qǐng)求的接收和電梯狀態(tài)的計(jì)算輸出能同時(shí)進(jìn)行,互不影響能同時(shí)進(jìn)行,互不影響但是,能否實(shí)現(xiàn)?但是,能否實(shí)現(xiàn)?答案是:使用線程答案是:使用線程電梯狀電梯狀態(tài)計(jì)算態(tài)計(jì)算和輸出和輸出共享內(nèi)存區(qū)共享內(nèi)存區(qū)接收服接收服務(wù)請(qǐng)求務(wù)請(qǐng)求5 1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)進(jìn)程進(jìn)程一個(gè)正在運(yùn)行的程序的實(shí)例,是一個(gè)程序在其自身一個(gè)正在運(yùn)行的程序的實(shí)例,是一個(gè)程序在其自身的地址空間中的一次執(zhí)行活動(dòng),例如的地址空間中的一次執(zhí)行活動(dòng),例如n用字處理軟件編輯文稿時(shí),同時(shí)打開用字處理軟件編輯文稿時(shí),同時(shí)打開mp3播放程序聽播放程序聽音樂,這兩個(gè)獨(dú)立的程序在同時(shí)運(yùn)行,稱為兩個(gè)進(jìn)程音樂,這兩個(gè)獨(dú)立的程序在同時(shí)運(yùn)行,稱為兩

5、個(gè)進(jìn)程進(jìn)程是資源申請(qǐng)、調(diào)度和獨(dú)立運(yùn)行的單位進(jìn)程是資源申請(qǐng)、調(diào)度和獨(dú)立運(yùn)行的單位6 1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)線程線程線程是系統(tǒng)分配處理器時(shí)間資源的基本單元。對(duì)于操作系統(tǒng)線程是系統(tǒng)分配處理器時(shí)間資源的基本單元。對(duì)于操作系統(tǒng)而言,其調(diào)度單元是線程(而言,其調(diào)度單元是線程(為線程提供時(shí)間片,線程在自己為線程提供時(shí)間片,線程在自己的時(shí)間片內(nèi)運(yùn)行)的時(shí)間片內(nèi)運(yùn)行)。一個(gè)程序中多段代碼同時(shí)并發(fā)執(zhí)行,稱為多線程一個(gè)程序中多段代碼同時(shí)并發(fā)執(zhí)行,稱為多線程n譬如用譬如用word同時(shí)打開多個(gè)文檔進(jìn)行編輯,用同時(shí)打開多個(gè)文檔進(jìn)行編輯,用IE瀏覽瀏覽器同時(shí)訪問多個(gè)網(wǎng)站器同時(shí)訪問多個(gè)網(wǎng)站通過多線程,一個(gè)通過多線程,一個(gè)進(jìn)

6、程進(jìn)程表面上看同時(shí)可以執(zhí)行一個(gè)以上表面上看同時(shí)可以執(zhí)行一個(gè)以上的任務(wù)的任務(wù)并發(fā)并發(fā)7 線程(續(xù))線程(續(xù))一個(gè)進(jìn)程至少包括一個(gè)線程(稱為主線程)。一個(gè)進(jìn)程至少包括一個(gè)線程(稱為主線程)。一個(gè)進(jìn)程從主線程的執(zhí)行開始進(jìn)而創(chuàng)建一個(gè)一個(gè)進(jìn)程從主線程的執(zhí)行開始進(jìn)而創(chuàng)建一個(gè)或多個(gè)附加線程,就是所謂基于多線程的多或多個(gè)附加線程,就是所謂基于多線程的多任務(wù)。任務(wù)。線程自己不擁有系統(tǒng)資源,但它可與同屬一線程自己不擁有系統(tǒng)資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源源8 1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)在在C程序中要?jiǎng)?chuàng)建線程,可以調(diào)用程序中要?jiǎng)?chuàng)建線程,可以調(diào)用Wind

7、ows操作系統(tǒng)提供的創(chuàng)操作系統(tǒng)提供的創(chuàng)建線程的函數(shù)建線程的函數(shù)CreateThread:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);LPVOID是一個(gè)是一個(gè)Void類型的指針,也就是說你可以將任意類類型的指針,也就是說你可以將任意類型的指針賦值給型的指針賦值給LPVOID類型的變量。類型的變量。DWO

8、RD是是32位無符號(hào)整數(shù)。位無符號(hào)整數(shù)。9 1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)lpThreadAttributes表示創(chuàng)建線程的安全屬性,表示創(chuàng)建線程的安全屬性,NT下有用。可賦值下有用??少x值為為NULL。dwStackSize指定線程棧的尺寸,如果為指定線程棧的尺寸,如果為0則與進(jìn)程主線程棧相同。則與進(jìn)程主線程棧相同。lpStartAddress指定線程開始運(yùn)行的地址。賦值為指向函數(shù)的指針,指定線程開始運(yùn)行的地址。賦值為指向函數(shù)的指針,即函數(shù)名。該函數(shù)的名稱任意,但函數(shù)類型必須遵照下述聲明形式即函數(shù)名。該函數(shù)的名稱任意,但函數(shù)類型必須遵照下述聲明形式:DWORDWINAPIThreadProc(LP

9、VOIDlpParameter);否則需要進(jìn)否則需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換行強(qiáng)制類型轉(zhuǎn)換lpParameter表示傳遞給線程的表示傳遞給線程的32位的參數(shù)(數(shù)值或指針)。位的參數(shù)(數(shù)值或指針)。若無若無參數(shù)則賦值為參數(shù)則賦值為NULL。dwCreationFlags表示是否創(chuàng)建后掛起線程表示是否創(chuàng)建后掛起線程(取值取值CREATE_SUSPENDED表示掛起,取值表示掛起,取值0表示創(chuàng)建后立即運(yùn)行表示創(chuàng)建后立即運(yùn)行),掛起后調(diào)用掛起后調(diào)用ResumeThread繼續(xù)執(zhí)行。若不掛起則賦值為繼續(xù)執(zhí)行。若不掛起則賦值為0。lpThreadId用來存放返回的線程用來存放返回的線程ID。DWORDThread

10、ID1=1;HANDLEhRead1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput,NULL,0,&ThreadID1);10#include#includeDWORDWINAPIFun1Proc(LPVOIDlpParameter);intmain()HANDLEhThreadl;/hThreadl=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);/CloseHandle(hThreadl);/printf(mainthreadisrunningn);/return0;11DWORDWINAPIF

11、un1Proc(LPVOIDlpParameter)printf(hThreadlisrunningn);return0;例例1 12#include#includeDWORDWINAPIFun1Proc(LPVOIDlpParameter)intmain()HANDLEhThreadl;/hThreadl=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);/CloseHandle(hThreadl);/printf(mainthreadisrunningn);/Sleep(10);/讓線程睡眠讓線程睡眠10毫秒毫秒return0;例例2#include#in

12、cludeintindex=0;DWORDWINAPIFun1Proc(LPVOIDlpParameter);intmain()HANDLEhThreadl;/hThreadl=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);/CloseHandle(hThreadl);/while(index+1000)printf(mainthreadisrunningn);/return0;13例例3DWORDWINAPIFun1Proc(LPVOIDlpParameter)while(index+1000)printf(hThreadlisrunningn);ret

13、urn0;14 15#include#includeinttickets=100;DWORDWINAPIFun1Proc(LPVOIDpPararneter)while(tickets0)printf(“thread1sellticket:%dn”,tickets-);return0;DWORDWINAPIFun2Proc(LPVOIDpPararneter)while(tickets0)printf(“thread2sellticket:%dn”,tickets-);return0;intmain()HANDLEhThread1=CreateThread(NULL,0,Fun1Proc,NU

14、LL,0,NULL);HANDLEhThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);Sleep(4000);return0;16 17 線程的同步線程的同步利用互斥對(duì)象利用互斥對(duì)象(mutex)實(shí)現(xiàn)線程的同步,互斥對(duì)象能實(shí)現(xiàn)線程的同步,互斥對(duì)象能夠確保線程擁有對(duì)單個(gè)資源的互斥訪問權(quán)。夠確保線程擁有對(duì)單個(gè)資源的互斥訪問權(quán)。3個(gè)操作個(gè)操作n互斥對(duì)象的創(chuàng)建互斥對(duì)象的創(chuàng)建n互斥對(duì)象的釋放互斥對(duì)象的釋放n互斥對(duì)象的請(qǐng)求互斥對(duì)象的請(qǐng)求18 互斥對(duì)象的創(chuàng)建HANDLE

15、CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL binitialOwner,LPCTSTR lpNarne)nlpMutexAttributes:可以給該參數(shù)傳遞 NULL值,讓互斥對(duì)象使用默認(rèn)的安全性nbinitialOwner:BOOL類型,指定互斥對(duì)象初始的擁有者。如果該值為真,則創(chuàng)建這個(gè)互斥對(duì)象的線程獲得該對(duì)象的所有權(quán);否則,該線程將不獲得所創(chuàng)建的互斥對(duì)象的所有權(quán)。nlpName:指定互斥對(duì)象的名稱。如果此參數(shù)為 NULL.則創(chuàng)建一個(gè)匿名的互斥對(duì)象。如果調(diào)用成功,該函數(shù)將返回所創(chuàng)建的互斥對(duì)象的句柄19 互斥對(duì)象的釋放BO

16、OL ReleaseMutex(HANDLE hMutex);ReleaseMutex函數(shù)只有一個(gè)HANDLE類型的參數(shù),即需要釋放的互斥對(duì)象的句柄。該函數(shù)的返回值是BOOL類型,如果函數(shù)調(diào)用成功,返回非0值;否則返回0值。20 互斥對(duì)象的請(qǐng)求DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);Handle:所請(qǐng)求的互斥對(duì)象的句柄。一旦互斥對(duì)象處于有信號(hào)狀態(tài),則該函數(shù)就返回。如果該互斥對(duì)象始終處于無信號(hào)狀態(tài),即未通知的狀態(tài),則該函數(shù)就會(huì)一直等待,這樣就會(huì)暫停線程的執(zhí)行。dwMilliseconds:指定等待的時(shí)間間隔,以

17、毫秒為單位。如果指定的時(shí)間間隔己過,即使所請(qǐng)求的對(duì)象仍處于無信號(hào)狀態(tài),WaitForSingleObject函數(shù)也會(huì)返回。如果將此參數(shù)設(shè)置為0,那么 WaitForSingleObject函數(shù)將測(cè)試該對(duì)象的狀態(tài)并立即返回;如果將此參數(shù)設(shè)置為INFINITE,則該函數(shù)會(huì)永遠(yuǎn)等待,直到等待的對(duì)象處于有信號(hào)狀態(tài)才會(huì)返回。調(diào)用WaitForSingleObject函數(shù)后,該函數(shù)會(huì)一直等待,只有在以下兩種情況下才會(huì)返回:1)指定的對(duì)象變成有信號(hào)狀態(tài)。2)指定的等待時(shí)間間隔己過。21 HANDLEhMutex;inttickets=100;DWORDWINAPIFun1Proc(LPVOIDpPararn

18、eter)while(tickets0)WaitForSingleObject(hMutex,INFINITE);if(tickets0)printf(thread1sellticket:%dn,tickets-);ReleaseMutex(hMutex);return0;22 DWORDWINAPIFun2Proc(LPVOIDpPararneter)while(tickets0)WaitForSingleObject(hMutex,INFINITE);if(tickets0)printf(thread2sellticket:%dn,tickets-);ReleaseMutex(hMutex

19、);return0;23 intmain()HANDLEhThread1,hThread2;hMutex=CreateMutex(NULL,FALSE,NULL);hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);Sleep(4000);return0;24 線程在電梯控制系統(tǒng)中的使用線程在電梯控制系統(tǒng)中的使用考慮現(xiàn)實(shí)中安裝在電梯考慮現(xiàn)實(shí)中安裝在電梯上的軟

20、件:接收電梯服上的軟件:接收電梯服務(wù)請(qǐng)求和計(jì)算電梯狀態(tài)、務(wù)請(qǐng)求和計(jì)算電梯狀態(tài)、從而控制電梯的運(yùn)行是從而控制電梯的運(yùn)行是并行的并行的因此我們可以考慮在模因此我們可以考慮在模擬電梯控制系統(tǒng)中設(shè)計(jì)擬電梯控制系統(tǒng)中設(shè)計(jì)一個(gè)線程專門用于接收一個(gè)線程專門用于接收電梯服務(wù)請(qǐng)求,另一個(gè)電梯服務(wù)請(qǐng)求,另一個(gè)線程實(shí)行電梯的狀態(tài)計(jì)線程實(shí)行電梯的狀態(tài)計(jì)算和狀態(tài)輸出算和狀態(tài)輸出電梯狀電梯狀態(tài)計(jì)算態(tài)計(jì)算和輸出和輸出線程共享內(nèi)存區(qū)線程共享內(nèi)存區(qū)接收服接收服務(wù)請(qǐng)求務(wù)請(qǐng)求電梯狀態(tài)計(jì)算和輸出電梯狀態(tài)計(jì)算和輸出:從共享內(nèi)存:從共享內(nèi)存區(qū)讀取電梯請(qǐng)求,計(jì)算下一目標(biāo)樓區(qū)讀取電梯請(qǐng)求,計(jì)算下一目標(biāo)樓層,從而確定電梯的下一狀態(tài)。層,從而確

21、定電梯的下一狀態(tài)。接收服務(wù)請(qǐng)求接收服務(wù)請(qǐng)求:接收電梯請(qǐng)求,將:接收電梯請(qǐng)求,將請(qǐng)求保存到內(nèi)存。請(qǐng)求保存到內(nèi)存。25 /主線程主線程main()DWORDThreadID;/創(chuàng)建線程(對(duì)應(yīng)于函數(shù)創(chuàng)建線程(對(duì)應(yīng)于函數(shù)input(),用于接收電梯輸入;,用于接收電梯輸入;HANDLEhRead=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput,NULL,0,&ThreadID);/進(jìn)行變量初始化工作進(jìn)行變量初始化工作線程在電梯控制系統(tǒng)中的使用線程在電梯控制系統(tǒng)中的使用26 while(1)state_trans();();/根據(jù)自動(dòng)機(jī)模型決定此

22、刻電梯的狀態(tài)根據(jù)自動(dòng)機(jī)模型決定此刻電梯的狀態(tài)print_message();/*輸出電梯此刻的狀態(tài)輸出電梯此刻的狀態(tài)*/control();/*根據(jù)控制策略確定下一目標(biāo)樓層,這在根據(jù)控制策略確定下一目標(biāo)樓層,這在state_trans()中要用到中要用到*/time_count();/*時(shí)間片推進(jìn)一個(gè)時(shí)間片推進(jìn)一個(gè)*/線程在電梯控制系統(tǒng)中的使用線程在電梯控制系統(tǒng)中的使用27 /接收輸入線程接收輸入線程voidgetInput(void)charch;while(1)ch=getchar();/加入代碼:將加入代碼:將ch翻譯成相應(yīng)請(qǐng)求并保存;翻譯成相應(yīng)請(qǐng)求并保存;time_count();/時(shí)

23、間片推進(jìn)一個(gè);時(shí)間片推進(jìn)一個(gè);線程在電梯控制系統(tǒng)中的使用線程在電梯控制系統(tǒng)中的使用28 提綱提綱1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)使用線程實(shí)現(xiàn)任務(wù)并發(fā)2.軟件設(shè)計(jì)和模塊化軟件設(shè)計(jì)和模塊化3.概要設(shè)計(jì)要點(diǎn)概要設(shè)計(jì)要點(diǎn)4.時(shí)間控制函數(shù)時(shí)間控制函數(shù)5.有限狀態(tài)自動(dòng)機(jī)解題有限狀態(tài)自動(dòng)機(jī)解題29 6.1 軟件設(shè)計(jì)概述軟件設(shè)計(jì)在開發(fā)階段中的重要性軟件設(shè)計(jì)在開發(fā)階段中的重要性需求分析模型中的每一個(gè)成份都提供了建立需求分析模型中的每一個(gè)成份都提供了建立設(shè)計(jì)模型所需的信息。設(shè)計(jì)模型所需的信息。根據(jù)數(shù)據(jù)、功能和行為模型來表示的軟件需根據(jù)數(shù)據(jù)、功能和行為模型來表示的軟件需求,采用某種設(shè)計(jì)方法進(jìn)行數(shù)據(jù)設(shè)計(jì)、系統(tǒng)求,采用某種設(shè)計(jì)

24、方法進(jìn)行數(shù)據(jù)設(shè)計(jì)、系統(tǒng)結(jié)構(gòu)設(shè)計(jì)和過程設(shè)計(jì)。結(jié)構(gòu)設(shè)計(jì)和過程設(shè)計(jì)。軟件需求分析:軟件需求分析:(1)(1)問題的信息域必須被表示和理解。問題的信息域必須被表示和理解。(數(shù)據(jù)模型數(shù)據(jù)模型)(2)(2)軟件將完成的功能必須被定義。軟件將完成的功能必須被定義。(功能模型功能模型)(3)(3)軟件的行為軟件的行為(作為外部事件的結(jié)果作為外部事件的結(jié)果)必須被表示。必須被表示。(行為模型行為模型)31 數(shù)據(jù)模型數(shù)據(jù)模型問題的信息域包含三個(gè)不同的數(shù)據(jù)和控制視圖:?jiǎn)栴}的信息域包含三個(gè)不同的數(shù)據(jù)和控制視圖:(1 1)信息內(nèi)容和關(guān)系)信息內(nèi)容和關(guān)系信息內(nèi)容表示了個(gè)體數(shù)據(jù)和控制對(duì)象,它們信息內(nèi)容表示了個(gè)體數(shù)據(jù)和控制對(duì)

25、象,它們可和其他的數(shù)據(jù)和控制對(duì)象關(guān)聯(lián)??珊推渌臄?shù)據(jù)和控制對(duì)象關(guān)聯(lián)。(2 2)信息流)信息流信息流表示了數(shù)據(jù)和控制在系統(tǒng)中流動(dòng)時(shí)變信息流表示了數(shù)據(jù)和控制在系統(tǒng)中流動(dòng)時(shí)變化的方式?;姆绞?。(3 3)信息結(jié)構(gòu))信息結(jié)構(gòu)信息結(jié)構(gòu)表示了各種數(shù)據(jù)和控制項(xiàng)的內(nèi)部組信息結(jié)構(gòu)表示了各種數(shù)據(jù)和控制項(xiàng)的內(nèi)部組織??棥9δ苣P凸δ苣P蛯?duì)進(jìn)入軟件的信息和數(shù)據(jù)進(jìn)行變換和處理的模對(duì)進(jìn)入軟件的信息和數(shù)據(jù)進(jìn)行變換和處理的模塊,它必須至少完成三個(gè)常見功能:輸入、處塊,它必須至少完成三個(gè)常見功能:輸入、處理和輸出。功能模型從頂層的語(yǔ)境層模型開始,理和輸出。功能模型從頂層的語(yǔ)境層模型開始,經(jīng)過一系列的細(xì)化迭代,越來越多的功能細(xì)節(jié)

26、經(jīng)過一系列的細(xì)化迭代,越來越多的功能細(xì)節(jié)被發(fā)現(xiàn),直至得到所有系統(tǒng)功能。被發(fā)現(xiàn),直至得到所有系統(tǒng)功能。4.3 軟件需求分析建模的原則和方法行為模型行為模型大多數(shù)軟件對(duì)來自外界的事件做出反應(yīng),這種大多數(shù)軟件對(duì)來自外界的事件做出反應(yīng),這種刺激反應(yīng)特征形成了行為模型的基礎(chǔ)。一個(gè)刺激反應(yīng)特征形成了行為模型的基礎(chǔ)。一個(gè)計(jì)算機(jī)程序總是處于某個(gè)計(jì)算機(jī)程序總是處于某個(gè)狀態(tài)狀態(tài):一種外部可觀:一種外部可觀測(cè)的行為模式(如等待、運(yùn)行),它僅當(dāng)某事測(cè)的行為模式(如等待、運(yùn)行),它僅當(dāng)某事件發(fā)生時(shí)才被改變。件發(fā)生時(shí)才被改變。6.1 軟件設(shè)計(jì)概述 分析模型轉(zhuǎn)換為軟件設(shè)計(jì)的映射關(guān)系分析模型轉(zhuǎn)換為軟件設(shè)計(jì)的映射關(guān)系 6.1

27、軟件設(shè)計(jì)概述數(shù)據(jù)設(shè)計(jì)將實(shí)體數(shù)據(jù)設(shè)計(jì)將實(shí)體關(guān)系圖中描述的對(duì)象和關(guān)關(guān)系圖中描述的對(duì)象和關(guān)系,以及數(shù)據(jù)詞典中描述的詳細(xì)數(shù)據(jù)內(nèi)容轉(zhuǎn)系,以及數(shù)據(jù)詞典中描述的詳細(xì)數(shù)據(jù)內(nèi)容轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)的定義?;癁閿?shù)據(jù)結(jié)構(gòu)的定義。系統(tǒng)結(jié)構(gòu)設(shè)計(jì)定義軟件系統(tǒng)各主要成份之間系統(tǒng)結(jié)構(gòu)設(shè)計(jì)定義軟件系統(tǒng)各主要成份之間的關(guān)系。接口設(shè)計(jì)根據(jù)數(shù)據(jù)流圖定義軟件內(nèi)的關(guān)系。接口設(shè)計(jì)根據(jù)數(shù)據(jù)流圖定義軟件內(nèi)部各成份之間、軟件與其它協(xié)同系統(tǒng)之間以部各成份之間、軟件與其它協(xié)同系統(tǒng)之間以及軟件與用戶之間的交互機(jī)制。及軟件與用戶之間的交互機(jī)制。過程設(shè)計(jì)則是把結(jié)構(gòu)成份轉(zhuǎn)換成軟件的過程過程設(shè)計(jì)則是把結(jié)構(gòu)成份轉(zhuǎn)換成軟件的過程性描述。在編碼階段,根據(jù)這種過程性描述,

28、性描述。在編碼階段,根據(jù)這種過程性描述,生成源程序代碼,最終通過測(cè)試得到完整有生成源程序代碼,最終通過測(cè)試得到完整有效的軟件。效的軟件。6.1 軟件設(shè)計(jì)概述軟件設(shè)計(jì)是開發(fā)階段中最重要的步驟,它是軟件開發(fā)過軟件設(shè)計(jì)是開發(fā)階段中最重要的步驟,它是軟件開發(fā)過程中質(zhì)量得以保證的關(guān)鍵步驟。程中質(zhì)量得以保證的關(guān)鍵步驟。軟件設(shè)計(jì)又是將用戶要求準(zhǔn)確地轉(zhuǎn)化成為最終的軟件產(chǎn)軟件設(shè)計(jì)又是將用戶要求準(zhǔn)確地轉(zhuǎn)化成為最終的軟件產(chǎn)品的唯一途徑。品的唯一途徑。軟件設(shè)計(jì)是后續(xù)開發(fā)步驟及軟件維護(hù)工作的基礎(chǔ)。軟件設(shè)計(jì)是后續(xù)開發(fā)步驟及軟件維護(hù)工作的基礎(chǔ)。軟件設(shè)計(jì)對(duì)后期開發(fā)的質(zhì)量影響軟件設(shè)計(jì)對(duì)后期開發(fā)的質(zhì)量影響 6.1 軟件設(shè)計(jì)概述軟

29、件設(shè)計(jì)的過程軟件設(shè)計(jì)的過程從工程管理角度來看,軟件設(shè)計(jì)分兩步完成。從工程管理角度來看,軟件設(shè)計(jì)分兩步完成。n概要設(shè)計(jì):將軟件需求轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)和軟概要設(shè)計(jì):將軟件需求轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)和軟件的系統(tǒng)結(jié)構(gòu)模塊;決定每個(gè)模塊的功能;件的系統(tǒng)結(jié)構(gòu)模塊;決定每個(gè)模塊的功能;決定模塊之間的調(diào)用關(guān)系,即模塊間傳遞的決定模塊之間的調(diào)用關(guān)系,即模塊間傳遞的數(shù)據(jù);決定模塊的接口。數(shù)據(jù);決定模塊的接口。n詳細(xì)設(shè)計(jì):在概要設(shè)計(jì)基礎(chǔ)上確定如何實(shí)現(xiàn)詳細(xì)設(shè)計(jì):在概要設(shè)計(jì)基礎(chǔ)上確定如何實(shí)現(xiàn)各模塊的內(nèi)部細(xì)節(jié),即對(duì)模塊內(nèi)部的算法和各模塊的內(nèi)部細(xì)節(jié),即對(duì)模塊內(nèi)部的算法和數(shù)據(jù)結(jié)構(gòu)進(jìn)行設(shè)計(jì),產(chǎn)生詳細(xì)設(shè)計(jì)文檔。在數(shù)據(jù)結(jié)構(gòu)進(jìn)行設(shè)計(jì),產(chǎn)生詳細(xì)設(shè)

30、計(jì)文檔。在后續(xù)的編碼階段就可以完全按照詳細(xì)設(shè)計(jì)的后續(xù)的編碼階段就可以完全按照詳細(xì)設(shè)計(jì)的細(xì)節(jié)過程來映射到代碼,最終實(shí)現(xiàn)整個(gè)系統(tǒng)細(xì)節(jié)過程來映射到代碼,最終實(shí)現(xiàn)整個(gè)系統(tǒng) 2.模塊化和工程模塊化和工程將復(fù)雜問題分解為若干較小問題,然后再去求解,有將復(fù)雜問題分解為若干較小問題,然后再去求解,有助于控制問題的復(fù)雜性,利于問題的解決。助于控制問題的復(fù)雜性,利于問題的解決。模塊化:把程序劃分成獨(dú)立命名且可獨(dú)立訪問的模塊,模塊化:把程序劃分成獨(dú)立命名且可獨(dú)立訪問的模塊,每個(gè)模塊完成一個(gè)子功能(解決一個(gè)子問題),所有每個(gè)模塊完成一個(gè)子功能(解決一個(gè)子問題),所有模塊集成起來構(gòu)成的整體可完成用戶的所有需求。高模塊集

31、成起來構(gòu)成的整體可完成用戶的所有需求。高層模塊從整體上把握問題層模塊從整體上把握問題,隱蔽細(xì)節(jié)。低層模塊解決細(xì)隱蔽細(xì)節(jié)。低層模塊解決細(xì)節(jié)問題。節(jié)問題。模塊化意義模塊化意義n降低了系統(tǒng)的復(fù)雜性,使系統(tǒng)容易修改和重用;降低了系統(tǒng)的復(fù)雜性,使系統(tǒng)容易修改和重用;n推動(dòng)系統(tǒng)各部分的并行開發(fā),提高開發(fā)效率。推動(dòng)系統(tǒng)各部分的并行開發(fā),提高開發(fā)效率。復(fù)雜問題復(fù)雜問題較小問題較小問題分解分解39 2.模塊化和工程模塊化和工程模塊的定義模塊的定義一般把用一個(gè)名字就可調(diào)用的一段程序稱為一般把用一個(gè)名字就可調(diào)用的一段程序稱為“模塊模塊”,如子程序、函數(shù)等。函數(shù)是最小的模塊,若干,如子程序、函數(shù)等。函數(shù)是最小的模塊,

32、若干個(gè)緊密相關(guān)的函數(shù)可以組成更大的模塊源文件。個(gè)緊密相關(guān)的函數(shù)可以組成更大的模塊源文件。模塊的基本屬性:模塊的基本屬性:n功能功能:描述該模塊實(shí)現(xiàn)什么功能:描述該模塊實(shí)現(xiàn)什么功能n邏輯邏輯:描述模塊內(nèi)部怎么做:描述模塊內(nèi)部怎么做n狀態(tài)狀態(tài):該模塊使用時(shí)的環(huán)境和條件:該模塊使用時(shí)的環(huán)境和條件40 2.模塊化和工程模塊化和工程除了基本屬性,還需描述模塊的內(nèi)部和外部特性除了基本屬性,還需描述模塊的內(nèi)部和外部特性n模塊的模塊的外部特性外部特性:模塊的模塊名、參數(shù)表:模塊的模塊名、參數(shù)表n模塊的模塊的內(nèi)部特性內(nèi)部特性:完成其功能的程序代碼和僅供該模:完成其功能的程序代碼和僅供該模塊內(nèi)部使用的數(shù)據(jù)塊內(nèi)部使

33、用的數(shù)據(jù)n通常是先確定模塊的外部特性通常是先確定模塊的外部特性(概要設(shè)計(jì)概要設(shè)計(jì)的任務(wù)的任務(wù)),再,再確定其內(nèi)部特性確定其內(nèi)部特性(詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì)的任務(wù)的任務(wù))。怎么樣對(duì)系統(tǒng)進(jìn)行模塊劃分才是好的劃分怎么樣對(duì)系統(tǒng)進(jìn)行模塊劃分才是好的劃分?41 2.模塊化和工程模塊化和工程 模模塊塊劃劃分分得得越越細(xì)細(xì)越越好嗎?好嗎?模塊大小、模塊數(shù)目與費(fèi)用的關(guān)系模塊大小、模塊數(shù)目與費(fèi)用的關(guān)系 2.模塊化和工程模塊化和工程信息隱藏信息隱藏如何分解一個(gè)軟件才能得到最佳的模塊組合如何分解一個(gè)軟件才能得到最佳的模塊組合?需要了解什么是?需要了解什么是“信息隱藏信息隱藏”。Parnas:每個(gè)模塊的實(shí)現(xiàn)細(xì)節(jié)對(duì)于其它模塊:

34、每個(gè)模塊的實(shí)現(xiàn)細(xì)節(jié)對(duì)于其它模塊來說是隱蔽的。就是說,模塊中所包含的信來說是隱蔽的。就是說,模塊中所包含的信息(包括數(shù)據(jù)和過程)不允許其它不需要這息(包括數(shù)據(jù)和過程)不允許其它不需要這些信息的模塊使用。些信息的模塊使用。信息隱藏使得在將來修改軟件時(shí)偶然引入錯(cuò)信息隱藏使得在將來修改軟件時(shí)偶然引入錯(cuò)誤所造成的影響可以局限在一個(gè)或幾個(gè)模塊誤所造成的影響可以局限在一個(gè)或幾個(gè)模塊內(nèi)部,不致波及到軟件的其它部分。內(nèi)部,不致波及到軟件的其它部分。6.4 軟件設(shè)計(jì)原則4.4.模塊的獨(dú)立性模塊的獨(dú)立性模塊獨(dú)立性是指軟件系統(tǒng)中每個(gè)模塊只涉及軟模塊獨(dú)立性是指軟件系統(tǒng)中每個(gè)模塊只涉及軟件要求的具體的子功能,而和軟件系統(tǒng)

35、中其它件要求的具體的子功能,而和軟件系統(tǒng)中其它的模塊的接口是簡(jiǎn)單的。的模塊的接口是簡(jiǎn)單的。一般采用兩個(gè)準(zhǔn)則度量模塊獨(dú)立性,即模塊間一般采用兩個(gè)準(zhǔn)則度量模塊獨(dú)立性,即模塊間耦合耦合和模塊和模塊內(nèi)聚內(nèi)聚。(。(1978年年Meyer)n耦合是模塊之間的互相連接的緊密程度的度耦合是模塊之間的互相連接的緊密程度的度量。量。n內(nèi)聚是模塊功能強(qiáng)度內(nèi)聚是模塊功能強(qiáng)度(一個(gè)模塊內(nèi)部各個(gè)元素一個(gè)模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度彼此結(jié)合的緊密程度)的度量。的度量。n模塊獨(dú)立性比較強(qiáng)的模塊應(yīng)是模塊獨(dú)立性比較強(qiáng)的模塊應(yīng)是高內(nèi)聚低耦合高內(nèi)聚低耦合的模塊。的模塊。2.模塊化和工程模塊化和工程(1)內(nèi)聚性(內(nèi)聚性(Coh

36、esion)內(nèi)聚是模塊功能強(qiáng)度(一個(gè)模塊內(nèi)部各個(gè)元素彼此內(nèi)聚是模塊功能強(qiáng)度(一個(gè)模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度)的度量。一個(gè)內(nèi)聚程度高的模塊結(jié)合的緊密程度)的度量。一個(gè)內(nèi)聚程度高的模塊(在理想情況下)應(yīng)當(dāng)只做一件事。一般模塊的內(nèi)(在理想情況下)應(yīng)當(dāng)只做一件事。一般模塊的內(nèi)聚性分為七種類型。聚性分為七種類型。模塊的內(nèi)聚度量模塊的內(nèi)聚度量 2.模塊化和工程模塊化和工程(2)耦合性(耦合性(Coupling)耦合是模塊之間的相對(duì)獨(dú)立性(互相連接的緊密程耦合是模塊之間的相對(duì)獨(dú)立性(互相連接的緊密程度)的度量。它取決于各個(gè)模塊之間接口的復(fù)雜程度)的度量。它取決于各個(gè)模塊之間接口的復(fù)雜程度、調(diào)用模塊的

37、方式以及哪些信息通過接口。度、調(diào)用模塊的方式以及哪些信息通過接口。一般模塊之間可能的連接方式有七種,構(gòu)成耦合性一般模塊之間可能的連接方式有七種,構(gòu)成耦合性的七種類型。的七種類型。模塊的耦合性度量模塊的耦合性度量 2.模塊化和工程模塊化和工程C語(yǔ)言中的分塊開發(fā)語(yǔ)言中的分塊開發(fā)C語(yǔ)言允許一個(gè)程序由多個(gè)源文件組成。當(dāng)語(yǔ)言允許一個(gè)程序由多個(gè)源文件組成。當(dāng)程序規(guī)模比較大時(shí),可以根據(jù)模塊化原則將程序規(guī)模比較大時(shí),可以根據(jù)模塊化原則將程序分成多個(gè)程序分成多個(gè).c源文件,每個(gè)源文件看作是源文件,每個(gè)源文件看作是一個(gè)模塊,每個(gè)源文件中可包含一個(gè)或多個(gè)一個(gè)模塊,每個(gè)源文件中可包含一個(gè)或多個(gè)功能連接緊密的函數(shù)。功能

38、連接緊密的函數(shù)。在編譯該程序時(shí),可以以源文件為單位分別在編譯該程序時(shí),可以以源文件為單位分別進(jìn)行編譯,產(chǎn)生對(duì)應(yīng)的目標(biāo)文件,然后再用進(jìn)行編譯,產(chǎn)生對(duì)應(yīng)的目標(biāo)文件,然后再用鏈接程序?qū)⒍鄠€(gè)目標(biāo)文件鏈接成一個(gè)可執(zhí)行鏈接程序?qū)⒍鄠€(gè)目標(biāo)文件鏈接成一個(gè)可執(zhí)行文件。文件。C語(yǔ)言的這種編譯過程稱為分塊編譯,語(yǔ)言的這種編譯過程稱為分塊編譯,這種開發(fā)方法稱為分塊開發(fā)這種開發(fā)方法稱為分塊開發(fā)47 C程序由后綴為程序由后綴為.c的源文件和后綴為的源文件和后綴為.h的頭文的頭文件組成。前者包含實(shí)際的程序代碼,后者為件組成。前者包含實(shí)際的程序代碼,后者為.c源文件提供輔助性信息。源文件提供輔助性信息。在確定一個(gè)程序要?jiǎng)澐殖?/p>

39、幾個(gè)源文件,每一在確定一個(gè)程序要?jiǎng)澐殖蓭讉€(gè)源文件,每一個(gè)源文件要包含哪些函數(shù)時(shí),需要以提高個(gè)源文件要包含哪些函數(shù)時(shí),需要以提高模模塊獨(dú)立性塊獨(dú)立性為原則,將相關(guān)的功能放在一起,為原則,將相關(guān)的功能放在一起,形成一個(gè)源文件。形成一個(gè)源文件。通常,輸入和輸出有關(guān)的函數(shù)放在一個(gè)文件通常,輸入和輸出有關(guān)的函數(shù)放在一個(gè)文件中;主函數(shù)單獨(dú)建立一個(gè)文件,其中也可以中;主函數(shù)單獨(dú)建立一個(gè)文件,其中也可以包含少數(shù)與它關(guān)系密切的其他函數(shù)的定義包含少數(shù)與它關(guān)系密切的其他函數(shù)的定義48 頭文件的確定頭文件的確定把所有公用的類型定義(結(jié)構(gòu)、聯(lián)合或枚舉聲明),把所有公用的類型定義(結(jié)構(gòu)、聯(lián)合或枚舉聲明),公用的宏定義放在

40、適當(dāng)?shù)念^文件中,供各個(gè)文件參公用的宏定義放在適當(dāng)?shù)念^文件中,供各個(gè)文件參考??肌H绻谠S多地方都使用一個(gè)(些)標(biāo)準(zhǔn)頭文件,或如果在許多地方都使用一個(gè)(些)標(biāo)準(zhǔn)頭文件,或者某個(gè)頭文件本身需要,則可以把標(biāo)準(zhǔn)頭文件包含者某個(gè)頭文件本身需要,則可以把標(biāo)準(zhǔn)頭文件包含到一個(gè)自己定義的頭文件里供使用。到一個(gè)自己定義的頭文件里供使用。如果只有一個(gè)源文件需要某個(gè)標(biāo)準(zhǔn)頭文件,則不要如果只有一個(gè)源文件需要某個(gè)標(biāo)準(zhǔn)頭文件,則不要將它放在公共的頭文件中,而是讓這個(gè)源文件直接將它放在公共的頭文件中,而是讓這個(gè)源文件直接包含它,以提高編譯效率。包含它,以提高編譯效率。對(duì)于所有在一個(gè)源文件里定義、而在其他文件中使對(duì)于所有在一

41、個(gè)源文件里定義、而在其他文件中使用的東西(函數(shù)原型或者變量的外部聲明),都需用的東西(函數(shù)原型或者變量的外部聲明),都需要在某個(gè)頭文件中聲明,以方便使用。要在某個(gè)頭文件中聲明,以方便使用。49 源文件設(shè)計(jì)時(shí)要注意以下問題:源文件設(shè)計(jì)時(shí)要注意以下問題:每個(gè)源文件只包含必要的頭文件,不用的東西盡量每個(gè)源文件只包含必要的頭文件,不用的東西盡量不包含。不包含。如果源文件既要包含標(biāo)準(zhǔn)頭文件,又要包含自定義如果源文件既要包含標(biāo)準(zhǔn)頭文件,又要包含自定義頭文件,則應(yīng)將標(biāo)準(zhǔn)頭文件寫在前面,以防止本程頭文件,則應(yīng)將標(biāo)準(zhǔn)頭文件寫在前面,以防止本程序的局部定義影響標(biāo)準(zhǔn)庫(kù)文件里的定義。序的局部定義影響標(biāo)準(zhǔn)庫(kù)文件里的定義

42、。在一個(gè)源文件中,所有局部的東西都寫在各自的函在一個(gè)源文件中,所有局部的東西都寫在各自的函數(shù)中;所有只在本文件范圍內(nèi)使用的外部變量和函數(shù)中;所有只在本文件范圍內(nèi)使用的外部變量和函數(shù),都使用數(shù),都使用static關(guān)鍵字定義為外部靜態(tài)的。關(guān)鍵字定義為外部靜態(tài)的。對(duì)于多個(gè)函數(shù)都需要訪問的變量,應(yīng)該根據(jù)誰(shuí)使用對(duì)于多個(gè)函數(shù)都需要訪問的變量,應(yīng)該根據(jù)誰(shuí)使用誰(shuí)管理的歸屬原則,分別定義為不同源文件里的外誰(shuí)管理的歸屬原則,分別定義為不同源文件里的外部變量。在許多文件中都使用的全局變量,一般在部變量。在許多文件中都使用的全局變量,一般在主程序文件里定義。主程序文件里定義。50 2.模塊化和工程模塊化和工程實(shí)例:猴

43、子選大王實(shí)例:猴子選大王如何模塊化如何模塊化linkNode.h:提供鏈表結(jié)點(diǎn)提供鏈表結(jié)點(diǎn)listNode、別名、別名LISTNODE和和LISTNODEPTR的定義的定義link.c:提供鏈表處理相關(guān)函數(shù)提供鏈表處理相關(guān)函數(shù)link.h:提供提供link.c中函數(shù)的函數(shù)原型中函數(shù)的函數(shù)原型main.c:實(shí)現(xiàn)選大王算法實(shí)現(xiàn)選大王算法 2.模塊化和工程模塊化和工程VC6.0下工程的創(chuàng)建下工程的創(chuàng)建模塊之間的交互:數(shù)據(jù)共享、函數(shù)調(diào)用模塊之間的交互:數(shù)據(jù)共享、函數(shù)調(diào)用如何實(shí)現(xiàn)不同模塊之間的數(shù)據(jù)共享和函數(shù)調(diào)用如何實(shí)現(xiàn)不同模塊之間的數(shù)據(jù)共享和函數(shù)調(diào)用?-再論函數(shù)再論函數(shù)52 提綱提綱1.使用線程實(shí)現(xiàn)任務(wù)

44、并發(fā)使用線程實(shí)現(xiàn)任務(wù)并發(fā)2.模塊化和工程模塊化和工程3.概要設(shè)計(jì)要點(diǎn)概要設(shè)計(jì)要點(diǎn)4.時(shí)間控制函數(shù)時(shí)間控制函數(shù)5.有限狀態(tài)自動(dòng)機(jī)解題有限狀態(tài)自動(dòng)機(jī)解題53 3.概要設(shè)計(jì)要點(diǎn)概要設(shè)計(jì)的目的:概要設(shè)計(jì)的目的:全局把握程序結(jié)構(gòu):進(jìn)行程序的模塊劃分,全局把握程序結(jié)構(gòu):進(jìn)行程序的模塊劃分,設(shè)計(jì)模塊之間如何相互調(diào)用來完成程序要求設(shè)計(jì)模塊之間如何相互調(diào)用來完成程序要求的功能。的功能。定義關(guān)鍵變量,用來存儲(chǔ)各模塊共享的數(shù)據(jù);定義關(guān)鍵變量,用來存儲(chǔ)各模塊共享的數(shù)據(jù);定義常量。定義常量。設(shè)計(jì)關(guān)鍵的算法,主要是控制策略,提前對(duì)設(shè)計(jì)關(guān)鍵的算法,主要是控制策略,提前對(duì)關(guān)鍵的、較難解決的問題進(jìn)行處理。關(guān)鍵的、較難解決的問題

45、進(jìn)行處理。54 3.概要設(shè)計(jì)要點(diǎn)概要設(shè)計(jì)主要從以下概要設(shè)計(jì)主要從以下5個(gè)方面考慮:個(gè)方面考慮:1.用戶界面:界面友好,要能從界面提示信息了解電梯用戶界面:界面友好,要能從界面提示信息了解電梯/火車火車/銀行的狀態(tài)和請(qǐng)求。銀行的狀態(tài)和請(qǐng)求。2.自動(dòng)機(jī)模型:電梯自動(dòng)機(jī)模型:電梯/火車火車/營(yíng)業(yè)窗口的行為可以用自動(dòng)營(yíng)業(yè)窗口的行為可以用自動(dòng)機(jī)模型來描述。繪制狀態(tài)遷移圖,圖上需要描述引起機(jī)模型來描述。繪制狀態(tài)遷移圖,圖上需要描述引起狀態(tài)遷移的條件,并且要在文檔中附加說明進(jìn)入某狀狀態(tài)遷移的條件,并且要在文檔中附加說明進(jìn)入某狀態(tài)要做的動(dòng)作。態(tài)要做的動(dòng)作。3.全局變量:較全面地給出了各個(gè)函數(shù)要共享的數(shù)據(jù)。全局

46、變量:較全面地給出了各個(gè)函數(shù)要共享的數(shù)據(jù)。4.程序模塊化:函數(shù)接口說明,函數(shù)調(diào)用關(guān)系說明。程序模塊化:函數(shù)接口說明,函數(shù)調(diào)用關(guān)系說明。5.調(diào)度算法:給出電梯、小火車調(diào)度或者銀行調(diào)度的算調(diào)度算法:給出電梯、小火車調(diào)度或者銀行調(diào)度的算法。法。55 3-1用戶界面(用戶界面(1)點(diǎn)評(píng):界面上增加各層向上向下請(qǐng)求對(duì)應(yīng)的字符,以便于點(diǎn)評(píng):界面上增加各層向上向下請(qǐng)求對(duì)應(yīng)的字符,以便于操作;電梯請(qǐng)求展示區(qū)需要再細(xì)化,分別顯示:向上請(qǐng)求、操作;電梯請(qǐng)求展示區(qū)需要再細(xì)化,分別顯示:向上請(qǐng)求、向下請(qǐng)求,電梯內(nèi)請(qǐng)求。向下請(qǐng)求,電梯內(nèi)請(qǐng)求。很漂亮,不過展示的信息太少很漂亮,不過展示的信息太少56 3-1用戶界面(用戶

47、界面(2)電梯內(nèi)部描述電梯內(nèi)部描述57 3-2自動(dòng)機(jī)模型自動(dòng)機(jī)模型思考:該圖存在的問題?思考:該圖存在的問題?58 3-3全局變量全局變量函數(shù)之間如何通信?全局變量或者參數(shù)函數(shù)之間如何通信?全局變量或者參數(shù)線程之間如何通信?全局變量或者參數(shù)線程之間如何通信?全局變量或者參數(shù)全局變量設(shè)計(jì)考慮要全面;全局變量設(shè)計(jì)考慮要全面;應(yīng)明確給出定義,如:應(yīng)明確給出定義,如:nintdestLayer;/記錄電梯下一目標(biāo)服務(wù)記錄電梯下一目標(biāo)服務(wù)樓層樓層59 3-4程序模塊化程序模塊化應(yīng)該說明程序的模塊結(jié)構(gòu),應(yīng)該說明程序的模塊結(jié)構(gòu),包括:包括:整個(gè)程序分成哪幾個(gè)文件整個(gè)程序分成哪幾個(gè)文件?每一個(gè)文件里面包含哪些

48、每一個(gè)文件里面包含哪些函數(shù)?函數(shù)原型說明?函數(shù)?函數(shù)原型說明?圖示說明函數(shù)調(diào)用關(guān)系。圖示說明函數(shù)調(diào)用關(guān)系。要考慮策略可切換的問題:要考慮策略可切換的問題:如何設(shè)計(jì)模塊,使得當(dāng)增加如何設(shè)計(jì)模塊,使得當(dāng)增加一個(gè)新的策略時(shí),對(duì)現(xiàn)有代一個(gè)新的策略時(shí),對(duì)現(xiàn)有代碼的修改盡量少?碼的修改盡量少?進(jìn)行清楚的描述。進(jìn)行清楚的描述。60 3-5關(guān)鍵算法關(guān)鍵算法給出調(diào)度算法設(shè)計(jì)給出調(diào)度算法設(shè)計(jì)算法思路要有助于進(jìn)一步設(shè)計(jì),不能很粗略算法思路要有助于進(jìn)一步設(shè)計(jì),不能很粗略61 提綱提綱1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)使用線程實(shí)現(xiàn)任務(wù)并發(fā)2.模塊化和工程模塊化和工程3.概要設(shè)計(jì)要點(diǎn)概要設(shè)計(jì)要點(diǎn)4.時(shí)間控制函數(shù)時(shí)間控制函數(shù)5.有限

49、狀態(tài)自動(dòng)機(jī)解題有限狀態(tài)自動(dòng)機(jī)解題62 4.1-計(jì)時(shí)函數(shù)while(1)state_trans();();/根據(jù)自動(dòng)機(jī)模型決定此刻電梯的狀態(tài)根據(jù)自動(dòng)機(jī)模型決定此刻電梯的狀態(tài)print_message();/*輸出電梯此刻的狀態(tài)輸出電梯此刻的狀態(tài)*/control();/*根據(jù)控制策略確定下一目標(biāo)樓層,這在根據(jù)控制策略確定下一目標(biāo)樓層,這在state_trans()中要用到中要用到*/time_count();/*時(shí)間片推進(jìn)一個(gè)時(shí)間片推進(jìn)一個(gè)*/63 4.1-計(jì)時(shí)函數(shù)clock_tclock(void);ANSI標(biāo)準(zhǔn)庫(kù)中的標(biāo)準(zhǔn)庫(kù)中的time.h頭文件,其中定義了日期和時(shí)頭文件,其中定義了日期和時(shí)間

50、的處理函數(shù)。間的處理函數(shù)。這個(gè)函數(shù)返回從這個(gè)函數(shù)返回從“啟動(dòng)程序啟動(dòng)程序”到到“程序中調(diào)用程序中調(diào)用clock()函數(shù)函數(shù)”之間的之間的CPU時(shí)鐘計(jì)時(shí)單元(時(shí)鐘計(jì)時(shí)單元(clocktick)數(shù),在)數(shù),在MSDN中稱之為掛鐘時(shí)間(中稱之為掛鐘時(shí)間(wal-clock)。其中)。其中clock_t是用來保存時(shí)間的數(shù)據(jù)類型,長(zhǎng)整型。是用來保存時(shí)間的數(shù)據(jù)類型,長(zhǎng)整型。clocktick:CPU時(shí)鐘計(jì)時(shí)單元,時(shí)間長(zhǎng)短由時(shí)鐘計(jì)時(shí)單元,時(shí)間長(zhǎng)短由CPU控制??刂?。一個(gè)一個(gè)clocktick不是不是CPU的一個(gè)時(shí)鐘周期,而是的一個(gè)時(shí)鐘周期,而是C/C+的一個(gè)基本計(jì)時(shí)單位。的一個(gè)基本計(jì)時(shí)單位。常常量量CLOC

51、KS_PER_SEC,它它表表示示一一秒秒鐘鐘會(huì)會(huì)有有多多少少個(gè)個(gè)時(shí)鐘計(jì)時(shí)單元時(shí)鐘計(jì)時(shí)單元。可可以以使使用用公公式式clock()/CLOCKS_PER_SEC來來計(jì)計(jì)算算一一個(gè)個(gè)進(jìn)程自身的運(yùn)行時(shí)間進(jìn)程自身的運(yùn)行時(shí)間。64 4.1-計(jì)時(shí)函數(shù)#include“stdio.h”#include“stdlib.h”#include“time.h”intmain(void)longi=10000000L;clock_tstart,finish;doubleduration;/*測(cè)量一個(gè)事件持續(xù)的時(shí)間測(cè)量一個(gè)事件持續(xù)的時(shí)間*/printf(“Timetodo%ldemptyloopsis”,i);sta

52、rt=clock();while(i-);/什么都不做什么都不做finish=clock();duration=(double)(finish-start)/CLOCKS_PER_SEC;printf(%fsecondsn,duration);system(pause);65 4.1-計(jì)時(shí)函數(shù)下述循環(huán)將持續(xù)運(yùn)行下述循環(huán)將持續(xù)運(yùn)行1秒鐘秒鐘clock_tstart,finish;doubleduration;start=clock();duration=0.0;while(duration1.0)finish=clock();duration=(double)(finish-start)/CLO

53、CKS_PER_SEC;66 4.2-線程休眠函數(shù)線程休眠函數(shù):線程休眠函數(shù):Sleep(int);Sleep(1000)Windows下表示下表示1000毫秒,也就是毫秒,也就是1秒鐘;秒鐘;Linux下表示下表示1000秒,秒,Linux下使用毫秒級(jí)別的函數(shù)可以使用下使用毫秒級(jí)別的函數(shù)可以使用usleep。Sleep函數(shù)是使調(diào)用函數(shù)是使調(diào)用Sleep函數(shù)的線程休眠,線程主動(dòng)放棄時(shí)間片。當(dāng)經(jīng)過函數(shù)的線程休眠,線程主動(dòng)放棄時(shí)間片。當(dāng)經(jīng)過指定的時(shí)間間隔后,再啟動(dòng)線程,繼續(xù)執(zhí)行代碼。指定的時(shí)間間隔后,再啟動(dòng)線程,繼續(xù)執(zhí)行代碼。Sleep函數(shù)并不能起到函數(shù)并不能起到定時(shí)的作用,主要作用是延時(shí)。定時(shí)的

54、作用,主要作用是延時(shí)。#include#include /注意頭文件一定要包含int main()int i=9;while(i1)Sleep(1000);/線程被掛起1秒,相當(dāng)于機(jī)器運(yùn)行到這里停頓1秒,再繼續(xù)向下運(yùn)行;printf(A);i-;system(pause);return 0;67 提綱提綱1.使用線程實(shí)現(xiàn)任務(wù)并發(fā)使用線程實(shí)現(xiàn)任務(wù)并發(fā)2.模塊化和工程模塊化和工程3.概要設(shè)計(jì)要點(diǎn)概要設(shè)計(jì)要點(diǎn)4.時(shí)間控制函數(shù)時(shí)間控制函數(shù)5.有限狀態(tài)自動(dòng)機(jī)解題有限狀態(tài)自動(dòng)機(jī)解題68 5.有限狀態(tài)自動(dòng)機(jī)解題有限狀態(tài)自動(dòng)機(jī)解題第一步:畫出狀態(tài)轉(zhuǎn)換圖第一步:畫出狀態(tài)轉(zhuǎn)換圖第二步:針對(duì)每一種狀態(tài),進(jìn)一步分別分

55、析:第二步:針對(duì)每一種狀態(tài),進(jìn)一步分別分析:當(dāng)輸入為字符當(dāng)輸入為字符1時(shí),需要做什么工作,下一個(gè)狀態(tài)時(shí),需要做什么工作,下一個(gè)狀態(tài)是什么是什么n如刪除注釋一題中要做的工作就是往目標(biāo)文件中如刪除注釋一題中要做的工作就是往目標(biāo)文件中寫入非注釋部分的字符;寫入非注釋部分的字符;當(dāng)輸入為字符當(dāng)輸入為字符2時(shí),需要做什么工作,下一個(gè)狀態(tài)時(shí),需要做什么工作,下一個(gè)狀態(tài)是什么;是什么;第三步:編碼。將要做的工作和狀態(tài)的遷移用代碼表第三步:編碼。將要做的工作和狀態(tài)的遷移用代碼表示出來示出來69 練習(xí):練習(xí):輸入一個(gè)字符串,以回車結(jié)束;判斷該字符串是否是合輸入一個(gè)字符串,以回車結(jié)束;判斷該字符串是否是合法的法的

56、C語(yǔ)言整型變量定義。語(yǔ)言整型變量定義。C語(yǔ)言變量名必須由下劃線、字母或者數(shù)字組成,且第一語(yǔ)言變量名必須由下劃線、字母或者數(shù)字組成,且第一個(gè)字符是下劃線或者字母。個(gè)字符是下劃線或者字母。int_myVariable,count;/合法合法int8Count;/非法非法要求:先畫出本題的有限狀態(tài)自動(dòng)機(jī)轉(zhuǎn)換圖,然后書寫要求:先畫出本題的有限狀態(tài)自動(dòng)機(jī)轉(zhuǎn)換圖,然后書寫程序。程序。5.有限狀態(tài)自動(dòng)機(jī)解題有限狀態(tài)自動(dòng)機(jī)解題70 5.有限狀態(tài)自動(dòng)機(jī)解題有限狀態(tài)自動(dòng)機(jī)解題程序程序71 q1:最近接收到的是:最近接收到的是/q5:已收到:已收到/,注釋已經(jīng)開注釋已經(jīng)開始始q4:非注釋狀態(tài)非注釋狀態(tài)q3:等待等待

57、/以結(jié)束注釋以結(jié)束注釋q2:已收到:已收到/*,注釋已經(jīng)開始注釋已經(jīng)開始上機(jī)題講解上機(jī)題講解【源程序源程序】72 電梯系統(tǒng)的電梯系統(tǒng)的state_trans函數(shù)設(shè)計(jì)函數(shù)設(shè)計(jì)73 電梯系統(tǒng)的電梯系統(tǒng)的state_trans函數(shù)設(shè)計(jì)函數(shù)設(shè)計(jì)voidstate_trans()switch(state)/*根據(jù)狀態(tài)和事件根據(jù)狀態(tài)和事件,進(jìn)行相應(yīng)的處理,進(jìn)行相應(yīng)的處理*/caseIDLE:if(存在其他樓層的呼叫事件存在其他樓層的呼叫事件)/執(zhí)行相關(guān)工作;執(zhí)行相關(guān)工作;state=RUN;if(存在本樓層的呼叫事件存在本樓層的呼叫事件)/執(zhí)行相關(guān)工作;執(zhí)行相關(guān)工作;state=STOP;/*電梯狀態(tài)設(shè)置為停靠電梯狀態(tài)設(shè)置為???/break;74 電梯系統(tǒng)的電梯系統(tǒng)的state_trans函數(shù)設(shè)計(jì)函數(shù)設(shè)計(jì)caseRUN:.break;caseSTOP:.break;default:break;75 76

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  sobing.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!