版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1計(jì)算機(jī)實(shí)習(xí)(C語(yǔ)言)指導(dǎo)書作者 雷電上海大學(xué) 自動(dòng)化系2計(jì)算機(jī)實(shí)習(xí)指導(dǎo)書(C語(yǔ)言)學(xué)好一門編程語(yǔ)言,最重要的是進(jìn)行大量的編程實(shí)踐。通過(guò)計(jì)算機(jī)C語(yǔ)言實(shí)習(xí),把已學(xué)過(guò)的編程語(yǔ)言知識(shí)和操作技能進(jìn)行綜合應(yīng)用,加深對(duì)C語(yǔ)言的語(yǔ)法規(guī)范、程序結(jié)構(gòu)以及編程方法和技巧的理解,培養(yǎng)良好的程序設(shè)計(jì)習(xí)慣,提高程序設(shè)計(jì)水平。在計(jì)算機(jī)的主流PC機(jī)上,由于Windows的廣泛應(yīng)用,基于Windows編程的MicrosoftVisual Studio已經(jīng)成為主流,Visual C+/C#是程序員選擇的主要編程工具,Turbo C等PC機(jī)上的C語(yǔ)言編程工具已很少使用。但C語(yǔ)言是C+的基礎(chǔ),且在嵌入式系統(tǒng)中發(fā)揮著不可替代的作用,
2、大量的單片機(jī)系統(tǒng)支持C語(yǔ)言編程,進(jìn)行系統(tǒng)而扎實(shí)的C語(yǔ)言程序設(shè)計(jì)實(shí)習(xí)是非常重要的??紤]到這些,我們采用Visual C+6.0作為編程工具,選擇編寫Win32 ConsoleApplication類型的C語(yǔ)言程序。編程環(huán)境簡(jiǎn)介1.打開Visual C+6.0運(yùn)行2.選擇菜單file/New.,出現(xiàn)一個(gè)選擇界面,在Project屬性頁(yè)中選擇Win32 ConsoleApplication,然后在Project name文本框中填入一個(gè)工程名,如Ex1,在Location文本框中選擇存放這一新工程的文件夾,如D:MyProjectEx1,此文件夾下將存放Ex1工程的所有相關(guān)文件。3.第2步確定后,出
3、現(xiàn)一個(gè)新的選擇界面,在此選擇A simple application.4.第3步完成后,VC會(huì)為你創(chuàng)建Win32 Console Application編程框架,在main()中可編寫你的代碼。(不要?jiǎng)h除框架為你所加的代碼,如#include “StdAfx.h”)。5.編程中常常需要?jiǎng)?chuàng)建多個(gè)源文件,并添加到工程中,這可以通過(guò)選擇菜單file/New.,出現(xiàn)一個(gè)選擇界面,在File屬性頁(yè)中,選擇C/C+Header File,用于創(chuàng)建*.h頭文件,選擇C/C+Source File,用于創(chuàng)建*.c/*.cpp文件,并在File文本框中填入你想創(chuàng)建的文件名,OK.6.工具欄中按紐:Build(F
4、7)編譯連接,go(F5)調(diào)試運(yùn)行,!(ctrl+F5)非調(diào)試運(yùn)行,手插入斷點(diǎn)。F10單步執(zhí)行,F(xiàn)11進(jìn)入函數(shù)體,ctrl+F10運(yùn)行到光標(biāo)處。實(shí)習(xí)內(nèi)容1掌握visual C+ 6.0控制臺(tái)應(yīng)用程序開發(fā)環(huán)境,掌握基本的程序調(diào)試技術(shù)。2用C語(yǔ)言編6個(gè)簡(jiǎn)單熟悉的覆蓋C語(yǔ)言知識(shí)的解決實(shí)際問(wèn)題的應(yīng)用程序. 做一個(gè)較復(fù)雜的C語(yǔ)言應(yīng)用程序設(shè)計(jì)(電梯運(yùn)行系統(tǒng))。3每次上機(jī),做好實(shí)習(xí)筆記,按時(shí)間按實(shí)習(xí)題目記錄下實(shí)習(xí)心得,編程中的問(wèn)題、經(jīng)驗(yàn)、技術(shù)技巧.4每次上機(jī)后, 按工程文件夾組織保存程序代碼到軟盤或U 盤, 只要保存 .c,.cpp,.h,.dsw,.dsp文件。記?。翰荒馨珼ebug子目錄文件,否則太大
5、。5撰寫實(shí)習(xí)報(bào)告,報(bào)告分二部分,第一部分內(nèi)容為:按時(shí)間按實(shí)習(xí)題目記錄整理的實(shí)習(xí)心得,編程中的問(wèn)題、經(jīng)驗(yàn)、技術(shù)技巧.第二部分是實(shí)驗(yàn)七的程序設(shè)計(jì)書,用框圖、文字說(shuō)明,寫作規(guī)范見后。報(bào)告要寫在正規(guī)的統(tǒng)一的實(shí)驗(yàn)報(bào)告上。3實(shí)習(xí)題目實(shí)驗(yàn)一:計(jì)算平均成績(jī)實(shí)驗(yàn)內(nèi)容:輸入成績(jī),計(jì)算并顯示平均成績(jī)。運(yùn)行效果:輸入3門課程的成績(jī):69.5 80 90.5平均成績(jī):80.00退出否?y實(shí)驗(yàn)說(shuō)明:上述顯示效果中,下劃線數(shù)字為用戶的輸入。當(dāng)退出否不為y,則重復(fù)。初學(xué)C語(yǔ)言編程是一個(gè)充滿挫折的艱難歷程,特別是在使用scanf,printf進(jìn)行數(shù)據(jù)的輸入輸出上常常容易出錯(cuò),挫傷了初學(xué)者的積極性,實(shí)際上scanf已很少使用???/p>
6、以使用C+的控制臺(tái)輸入輸出流cin、cout 取代scanf,printf,出錯(cuò)機(jī)會(huì)大為減少,而又更容易理解,cin理解為鍵盤,cout理解為屏幕。使用方法:1.包含iostream頭文件,指定std名空間 2.用從cin輸入數(shù)據(jù),用向cout輸出數(shù)據(jù)顯示,都不必考慮輸入輸出的數(shù)據(jù)類型,當(dāng)同時(shí)多個(gè)數(shù)據(jù)輸入時(shí),用空格來(lái)分隔其多個(gè)數(shù)據(jù),回車接受輸入。例: #include Using namespace std;void main()int a;cina; /* 等價(jià) scanf(%d,&i); */couta; /* 等價(jià) printf(%d,i); */目的要求:熟悉控制臺(tái)輸入輸出, for、
7、while、do循環(huán)語(yǔ)句的使用。實(shí)驗(yàn)二:數(shù)據(jù)的不同數(shù)制顯示實(shí)驗(yàn)內(nèi)容:輸入小于128的十進(jìn)制整數(shù),顯示其ASCII碼字符。輸入十六進(jìn)制整數(shù),顯示其十進(jìn)制整數(shù)。輸入十進(jìn)制整數(shù),顯示其十六進(jìn)制整數(shù)運(yùn)行效果:輸入小于128的十進(jìn)制整數(shù):63?輸入一個(gè)字符:?63輸入十六進(jìn)制整數(shù):0 x1A26輸入十進(jìn)制整數(shù):261A目的要求:理解數(shù)字在計(jì)算機(jī)中的表示。實(shí)驗(yàn)三:猜數(shù)游戲?qū)嶒?yàn)內(nèi)容:(1)先由計(jì)算機(jī)“想”一個(gè)數(shù)請(qǐng)人猜,如果猜對(duì)了,則繼續(xù)猜下一個(gè)數(shù),否則計(jì)算機(jī)給出提示,告訴所猜的數(shù)是太小還是太大。(2)當(dāng)猜對(duì)或一個(gè)數(shù)猜了20次仍未猜中停止本次猜數(shù),仍然繼續(xù)猜下一個(gè)數(shù)。(3)計(jì)算機(jī)記錄猜的次數(shù),以此來(lái)反映猜數(shù)者
8、“猜”的水平。(4)每次運(yùn)行程序可反復(fù)猜多個(gè)數(shù),直到操作者停止時(shí)才結(jié)束。運(yùn)行效果:20 太大,10 太小,15太大,12 對(duì)了!猜4 次成功繼續(xù)否?n目的要求:本實(shí)驗(yàn)用于循環(huán)語(yǔ)句、條件語(yǔ)句的編程練習(xí)。實(shí)驗(yàn)說(shuō)明:隨機(jī)數(shù)產(chǎn)生頭文件stdlib.h ,時(shí)間頭文件time.h4始初化隨機(jī)數(shù)種子srand(clock(); 或 srand(time(NULL);實(shí)驗(yàn)四:兔子生崽實(shí)驗(yàn)內(nèi)容:假設(shè)一對(duì)小兔的成熟期是一個(gè)月,即一個(gè)月可長(zhǎng)成成兔,那么,如果每對(duì)成兔每個(gè)月都可以生一對(duì)小兔,一對(duì)新生的小兔從第二個(gè)月起就開始生兔子,試問(wèn)從一對(duì)兔子開始繁殖,以后各月的可有多少對(duì)兔子?實(shí)驗(yàn)說(shuō)明:這是13世紀(jì)意大利Fibon
9、acci借助民間的“兔子生崽”問(wèn)題引入的一個(gè)著名的遞推數(shù)列即Fibonacci數(shù)列。,采用遞推分析法:第0個(gè)月兔子對(duì)數(shù)f(0)=1;第1個(gè)月兔子對(duì)數(shù)f(1)=2;第2個(gè)月兔子對(duì)數(shù)f(2)=3;第n個(gè)月兔子對(duì)數(shù)f(n)=f(n-1)+f(n-2)運(yùn)行效果:一對(duì)兔子開始繁殖,以后各月的兔子對(duì)數(shù):不用子函數(shù)計(jì)算結(jié)果:1 2 3 5 8 13 21 34 55 89 144 233用子函數(shù)計(jì)算結(jié)果:1 2 3 5 8 13 21 34 55 89 144 233目的要求:體會(huì)遞推算法是把科學(xué)或工程計(jì)算中數(shù)學(xué)模型轉(zhuǎn)變?yōu)橛?jì)算機(jī)運(yùn)算模型的重要方法。掌握數(shù)組、指針的編程,求各月的有多少對(duì)兔子用或不用一個(gè)子函數(shù)
10、實(shí)現(xiàn)。以后實(shí)驗(yàn)都必須采用模塊化的程序設(shè)計(jì)方法,每個(gè)子任務(wù)對(duì)應(yīng)一個(gè)子函數(shù),完成總?cè)蝿?wù)的程序由一個(gè)主函數(shù)和若干子函數(shù)組成,主函數(shù)起任務(wù)調(diào)度的總控作用。理解模塊化程序設(shè)計(jì)方法,掌握函數(shù)的實(shí)現(xiàn)、調(diào)用編程技術(shù)。實(shí)驗(yàn)五:學(xué)生成績(jī)統(tǒng)計(jì)實(shí)驗(yàn)內(nèi)容:從鍵盤輸入一個(gè)班(最多30人)的某門課程的學(xué)生成績(jī),當(dāng)輸入為負(fù)值時(shí)或已達(dá)30人時(shí)輸入結(jié)束,分別統(tǒng)計(jì)下列內(nèi)容:1)統(tǒng)計(jì)不及格人數(shù)并打印其學(xué)生名單。2)統(tǒng)計(jì)成績(jī)?cè)谌嗥骄旨捌骄种系膶W(xué)生人數(shù)并打印其學(xué)生名單。3)統(tǒng)計(jì)各分?jǐn)?shù)段的學(xué)生人數(shù)及所占百分比。運(yùn)行效果:學(xué)號(hào) 成績(jī) 學(xué)號(hào) 成績(jī) 學(xué)號(hào) 成績(jī) 學(xué)號(hào) 成績(jī)2001 60 2002 80 2003 90 2004 1002
11、005 70 2006 40 2007 80 -1 -1不及格人數(shù):1 名單:2006平均分:74.3平均分及平均分之上的學(xué)生:2002,2003,2004,2007不及格:14.3% 60-69分:14.3% 70-79分:14.3% 80-89分:28.6% 90-100分:28.6%實(shí)驗(yàn)說(shuō)明:學(xué)號(hào)、成績(jī)輸入小于0的數(shù)表示結(jié)束輸入。目的要求:該實(shí)驗(yàn)是數(shù)組、指針、函數(shù)的綜合練習(xí),理解指針及數(shù)據(jù)在函數(shù)間傳遞的編程方法。實(shí)驗(yàn)六:學(xué)生成績(jī)管理系統(tǒng)實(shí)驗(yàn)內(nèi)容: 1)選課登記2)動(dòng)態(tài)輸入學(xué)生成績(jī)。3)查詢學(xué)生成績(jī)。4)修改成績(jī)運(yùn)行效果: 學(xué)生成績(jī)管理系統(tǒng)0新生注冊(cè)1選課登記2學(xué)生成績(jī)輸入3成績(jī)查詢4修改
12、成績(jī)55退出命令?0學(xué)號(hào) 姓名2001 李12002 李22003 李3-1學(xué)生數(shù)據(jù)庫(kù)共有3個(gè)個(gè)記錄繼續(xù)新的注冊(cè)? n (注:清屏返回主采單)命令?1課程號(hào):1001輸入選擇該課程的學(xué)生學(xué)號(hào):2001 2002 -1共有2個(gè)學(xué)生選此課程繼續(xù)新的選課輸入? y課程號(hào):1002輸入選擇該課程的學(xué)生學(xué)號(hào):2002 2003 -1共有2個(gè)學(xué)生選此課程繼續(xù)新的選課輸入? n (注:清屏返回主采單)命令?2課程號(hào):1001學(xué)號(hào):2001 姓名:李1 成績(jī):80學(xué)號(hào):2002 姓名:李2 成績(jī):901001課程成績(jī)已輸入完成繼續(xù)其他課程成績(jī)輸入? y課程號(hào):1002學(xué)號(hào):2003 姓名:李3 成績(jī):70學(xué)號(hào)
13、:2002 姓名:李2 成績(jī):601002課程成績(jī)已輸入完成繼續(xù)其他課程成績(jī)輸入? n (注:清屏返回主采單)命令?3學(xué)號(hào): 2002姓名:李2 成績(jī):課程號(hào):0001 成績(jī):90課程號(hào):0002 成績(jī):60繼續(xù)查詢?n (注:清屏并返回主采單)命令?4學(xué)號(hào):2002 課程號(hào):0001原成績(jī): 90 成績(jī)修改為:70繼續(xù)修改? n命令:5 (注:清屏并返回主采單)實(shí)驗(yàn)提示:1)清屏方法:包含頭文件#include 調(diào)用函數(shù)system(cls);2)目的要求:本實(shí)驗(yàn)是較綜合的實(shí)習(xí),要求掌握結(jié)構(gòu)體、指針、函數(shù)等基本知識(shí),理解鏈6表的實(shí)現(xiàn)技術(shù),理解模塊化程序設(shè)計(jì)方法。實(shí)驗(yàn)七:辦公樓電梯運(yùn)行系統(tǒng)實(shí)驗(yàn)
14、內(nèi)容:這是一個(gè)規(guī)模稍大的軟件,它是要編寫一個(gè)程序,模擬辦公大樓中全部電梯的工作過(guò)程。這個(gè)仿真程序可以用來(lái)改善大樓管理,它也可以看成是一種游戲程序。下面讓我們對(duì)這個(gè)系統(tǒng)作一個(gè)初步描述:辦公大樓有二十層,每層有電梯,同時(shí)有步行樓梯;全樓有不多于10部電梯可同時(shí)供使用,電梯容量為24人,速度每上下一層需5秒,其運(yùn)行狀態(tài)可分:向上、向下、停止,當(dāng)前乘客數(shù),當(dāng)前所在層數(shù)。它設(shè)有一個(gè)“按鈕數(shù)組”,例如第五層的按鈕按下,意味著有乘客在第5層到達(dá)目標(biāo)層,等等。在樓的每一層,有當(dāng)前電梯所在樓層顯示,有按鈕表示有人等待向上或向下,有若干人在等待,有若干電梯在本層停下,等等。在大樓中(包括進(jìn)出)的總?cè)藬?shù)不超過(guò)500
15、人,每個(gè)人站在電梯前有個(gè)目標(biāo)層,他有一個(gè)最大的忍受等待時(shí)間,因?yàn)樗梢赃x擇電梯或是步行走樓梯,等等。若干假設(shè):在每個(gè)時(shí)間段要進(jìn)大樓的人數(shù)在024之間隨機(jī)取值;用電梯的每個(gè)人的目標(biāo)層在019之間取值;一個(gè)人在進(jìn)電梯或改走樓梯之前的等待時(shí)間在818秒范圍內(nèi)隨機(jī)發(fā)生;一個(gè)人到達(dá)目標(biāo)層后第二次再乘電梯中間的工作時(shí)間在4068秒間隨機(jī)取值。以及其他假設(shè)??傊?,在我們?cè)O(shè)計(jì)仿真程序之前應(yīng)對(duì)整個(gè)系統(tǒng)有個(gè)比較量化的了解,同時(shí)應(yīng)對(duì)整個(gè)系統(tǒng)的幾方面因素有一定的劃分。例如,可以把整個(gè)大樓視為系統(tǒng)的整體,在這個(gè)系統(tǒng)中運(yùn)行的有不同類的對(duì)象:電梯、電梯集合、人、人的集合,樓層,樓層的集合,大樓。每個(gè)對(duì)象有他的數(shù)據(jù)結(jié)構(gòu),及在
16、此數(shù)據(jù)集上的操作(函數(shù))。運(yùn)行效果:辦公樓電梯運(yùn)行系統(tǒng)Floor 4 5 3 5 7 4 1 09:- : : : : : : : :8:- : : : : : : : :7:- : : : : Dn:1 : : :6:-D1 : : : : : : :5:- : Up:11 : Up:5 : : :4:- Up:9 : Up:4 : :3:- Up:13 : :2:- Up:15 :1:- Up:130:U-3按任意鍵停止實(shí)驗(yàn)說(shuō)明:第一行數(shù)字表當(dāng)前電梯位置,第一列表樓層號(hào)及上下按鈕是否亮,等待人數(shù),中間區(qū)表各個(gè)電梯的運(yùn)行狀態(tài)(上/下、電梯中的人數(shù))。以下所附實(shí)驗(yàn)七源代碼是采用面向?qū)ο蟮某绦蛟O(shè)
17、計(jì)思想和事件驅(qū)動(dòng)技術(shù)編程的,這是當(dāng)代程序設(shè)計(jì)的基本方法,望同學(xué)們?cè)敿?xì)研究,好好體會(huì)。附:實(shí)驗(yàn)六部分參考源代碼(/ 。 / 中間的代碼要求自己完成)#include stdafx.h#include #include / 鏈表結(jié)構(gòu) head-,-next.data0,-nextdata1,-next.datan,-head7struct SCOREint courseId;int score;SCORE *pnext;struct STU_SCOREchar name16;int stuId;SCORE *scoreHead;/學(xué)生課程成績(jī)列表struct STU_SCORE *pnext;in
18、t mainMenu();int stuReg(STU_SCORE *pHead);int selCourse(STU_SCORE *pHead);int inputData(STU_SCORE *pHead);int scoreSort(STU_SCORE *pHead);int scoreQuery(STU_SCORE *pHead);int modify(STU_SCORE *pHead);enum MAIN_CMDREG,SEL=1,INPUT,QUERY,MODI,EXIT;int main(int argc, char* argv)STU_SCORE *head=( STU_SCO
19、RE *)malloc(sizeof(STU_SCORE);head-stuId=-1;head-pnext=head;while(1)int cmd=mainMenu();switch(cmd)case REG:stuReg(head);break;case SEL:selCourse(head);break;case INPUT:inputData(head);break;case QUERY:scoreQuery(head);break;case MODI:modify(head);break;case EXIT:8return 0;return 0;int mainMenu()syst
20、em(cls);couttt學(xué)生成績(jī)管理系統(tǒng)n;cout tt0新生注冊(cè)n;cout tt1選課登記n;cout tt2學(xué)生成績(jī)輸入n;cout tt3成績(jī)查詢n;cout tt4修改成績(jī)n;cout tt5退出n;coutcmd;return cmd;/新生注冊(cè):建立學(xué)生信息鏈表,從鍵盤輸入學(xué)生姓名學(xué)號(hào),插入到鏈表中。int stuReg(STU_SCORE *pHead)cout注意:新生注冊(cè)學(xué)號(hào)不能重復(fù)!n;start:/。/coutc;if(c=y|c=Y)goto start;return 0;/學(xué)生選課int selCourse(STU_SCORE *pHead)start:int
21、 cid;coutcid;coutstuId;while(stuId0)STU_SCORE *pStu=pHead-pnext;9while(pStu!=pHead)/鏈表已有記錄if(pStu-stuId=stuId)/有該學(xué)號(hào)bool be=false;SCORE *pcourse=pStu-scoreHead-pnext;while(pcourse!=pStu-scoreHead)/已有選課if(pcourse-courseId=cid)be=true;/已有該選課break;pcourse=pcourse-pnext;if(!be) /還沒(méi)有選此課程SCORE *pNewcourse=
22、(SCORE *)malloc(sizeof(SCORE);/ 。插入到選課鏈的頭節(jié)點(diǎn)后/pStu=pStu-pnext;cinstuId;int count=0;STU_SCORE *pStu=pHead-pnext;while(pStu!=pHead)/鏈表已有記錄SCORE *pcourse=pStu-scoreHead-pnext;while(pcourse!=pStu-scoreHead)if(pcourse-courseId=cid)count+;pcourse=pcourse-pnext;pStu=pStu-pnext;cout共有count個(gè)學(xué)生選此課程n;coutc;if(c
23、=y|c=Y)goto start;return 0;10/學(xué)生成績(jī)輸入int inputData(STU_SCORE *pStuHead)int count;start:count=0;coutcid;STU_SCORE *pStu=pStuHead-pnext;while(pStu!=pStuHead)/if鏈表已有學(xué)生記錄SCORE *pcourse=pStu-scoreHead-pnext;while(pcourse!=pStu-scoreHead)if(pcourse-courseId=cid)cout學(xué)號(hào):stuId 姓名:name;coutscore=0)coutpcourse-
24、score;count+;break;pcourse=pcourse-pnext;pStu=pStu-pnext;if(count=0)cout該課程無(wú)學(xué)生選!n;elsecoutcid課程成績(jī)已輸入完成!n;coutc;if(c=y|c=Y)goto start;return 0;/課程成績(jī)查詢int scoreQuery(STU_SCORE *pStuHead)/。11/return 0;/課程成績(jī)修改modify(STU_SCORE *pStuHead)/。/return 0;附:實(shí)驗(yàn)七源代碼/Ex7.cpp /#include stdafx.h#include 大樓.h#include
25、 Timer1.hint main(int argc, char* argv)iniTimer();initBuilder();timerRun();return 0;/ stdafx.h / stdafx.h : include file for standard system include files,/ or project specific include files that are used frequently, but/ are changed infrequently/#if !defined(AFX_STDAFX_H_EED464F0_F241_47EA_87DA_8C5
26、457EE1D58_INCLUDED_)#define AFX_STDAFX_H_EED464F0_F241_47EA_87DA_8C5457EE1D58_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ TODO: reference additional headers your program requires here#include #include #include #include /AFX_INSERT_LOCATION12/ Microsoft Visual C+ will insert additio
27、nal declarations immediately before theprevious line.#endif/ !defined(AFX_STDAFX_H_EED464F0_F241_47EA_87DA_8C5457EE1D58_INCLUDED_)/Timer1.h /#ifndef _TIMER1_H#define _TIMER1_H#include typedef void (*TimerHandle)(void *sink,time_t t); /定時(shí)器時(shí)間到事件處理函數(shù)說(shuō)明extern int done;void iniTimer(); /初始化定時(shí)器void timerR
28、un(); /定時(shí)器運(yùn)行/創(chuàng)建定時(shí)器,返回定時(shí)器ID,sink:接收定時(shí)器事件的對(duì)象int setTimer(void *sink,int dt,TimerHandle timerHandleFunc);int killTimer( int TimerID );/刪除定時(shí)器#endif/大樓.h/#ifndef _BUILDING_H#define _BUILDING_H#include 模擬.h#include 人.h#include 電梯.hstruct Floorbool up; /上按鈕bool down; /下按鈕PersonNode *pWaiting; /等電梯人列表Person
29、Node *pInFloor; /在本樓辦公人員列表;struct BuildingFloor floorsMAXFLOORS;Elevator elevatorsMAXELEVS;PersonNode *ptookStair; /走樓人列表int totalPeople; /樓內(nèi)總?cè)藬?shù)int timerID;void initBuilder();void PushFloorButton(PersonNode* );void waitElev(bool wait,PersonNode* one);void takeStair(bool go,PersonNode *one);13void in
30、toOffice(bool work,PersonNode *one);void OnElevStoped(Elevator *elev,int floor);extern Building building;#endif/電梯.h/#ifndef _ELEV_H#define _ELEV_Henum DirectionDOWN=-1,NODIRECTION=0,UP=1;struct PersonNode;struct Elevatorint elevNumber;/本電梯號(hào)int floorNumber;/當(dāng)前樓層號(hào)bool runing;/是否正在Direction dir;bool b
31、uttonsMAXFLOORS;/電梯內(nèi)按鈕int timerID;PersonNode *inList;typedef void (*ElevArrivedHandle)( void *sink,Elevator * elev);void PushClose(Elevator *elev);bool RequestDn(Elevator *elev);bool RequestUp(Elevator *elev);bool RequestOpen(Elevator *elev);void Run(Elevator *elev);void OnArrived(Elevator *p);#endi
32、f/模擬.h/#ifndef _SIMULATION_H#define _SIMULATION_H#define MAXELEVS 7 /電梯數(shù)#define MAXFLOORS 20 /樓層數(shù)#define MAXPERSONS 500 /最多人數(shù)#define CAPACITY 24 /電梯容量#define TRAVELTINE 2 /層間運(yùn)行時(shí)間#define MAXWAITTIME (5*TRAVELTINE) /最大等待時(shí)間int NewPersons(); /每次進(jìn)入大樓人數(shù)int BusinessT(); /連續(xù)工作時(shí)間int WaitingForElevT(); /可等待時(shí)間
33、int DestFloor(); /確定目標(biāo)層14#endif/人.h/#ifndef _PERSON_H#define _PERSON_H/#include 電梯.h/#include 大樓.hstruct Elevator;enum PersonState waitingForElev,/等待電梯elevNowIn, /在電梯中officeIn, / 在辦公takingStairs, /走樓梯outside;struct PersonNodePersonState state;int floorNowOn;/所在樓層int destination;/目標(biāo)樓層int timeID;/Pers
34、onNode *next;void EnterBuilding(PersonNode *p); /進(jìn)入大樓void OnElevtArrived(Elevator *elev,PersonNode *passengers); /passenger,電梯到達(dá)了void OnElevtCome(Elevator*elev,PersonNode *waitPerson); /waitPerson,電梯到了void OnTimer(void *person,time_t t); /person,定時(shí)到了bool IntoElev(bool in,PersonNode *one,Elevator *el
35、ev);/進(jìn)出電梯PersonNode *delPerson(PersonNode *head,PersonNode *one); /從隊(duì)列刪除onePersonNode *addPerson(PersonNode *head,PersonNode *one); /one加入到隊(duì)列int getPersonNum(PersonNode *head);#endif/Timer1.cpp/#include stdafx.h#include #include #include #include Timer1.hint TIMERNUM=3; /定時(shí)器數(shù)int done=0;struct STimer
36、15int timerID;void *sink;TimerHandle OnTimer; /obj對(duì)象的函數(shù)int isUsing;clock_t startT;long dt;STimer *timers;/TIMERNUM;void iniTimer()timers=(STimer *)malloc(TIMERNUM*sizeof(STimer);int i;for(i=0;iTIMERNUM;i+)timersi.isUsing=0;void timerRun()int i;char c=0;clock_t currT;while(!c)currT = clock();for(i=0;
37、i=endT)timersi.OnTimer(timersi.sink,time(NULL);timersi.startT=currT;c=_kbhit();int killTimer( int TimerID )if(TimerID0 & TimerID =TIMERNUM)timersTimerID-1.isUsing=0;return TimerID;16return 0;int setTimer(void* sink1,int dt,TimerHandle timerHandleFunc)int i;for(i=0;iTIMERNUM;i+)if(timersi.isUsing=0)t
38、imersi.sink=sink1;timersi.isUsing=1;timersi.timerID=i+1;timersi.OnTimer=timerHandleFunc;timersi.startT=clock();timersi.dt=dt;return i+1;/定時(shí)器不夠,再分配。#define GROWN 3TIMERNUM=TIMERNUM+GROWN ;timers=(STimer*)realloc(timers,TIMERNUM*sizeof(STimer);timersi.sink=sink1;timersi.isUsing=1;timersi.timerID=i+1;t
39、imersi.OnTimer=timerHandleFunc;timersi.startT=clock();timersi.dt=dt;for(i=i+1;iTIMERNUM;i+)timersi.isUsing=0;return i+1;/大樓.cpp/#include stdafx.h#include #include 大樓.h#include Timer1.hBuilding building;void display(void *sink,time_t t);void OnEnterBuilding(void *sink,time_t t)int n=NewPersons();int
40、i;for(i=0;in;i+)PersonNode *p=(PersonNode *)malloc(sizeof(PersonNode);building.totalPeople+=1;17EnterBuilding(p);void initBuilder()int i;building.ptookStair=0;building.totalPeople=0;for(i=0;iMAXELEVS;i+)building.elevatorsi.elevNumber=i;building.elevatorsi.floorNumber=0;building.elevatorsi.runing=fal
41、se;building.elevatorsi.dir=NODIRECTION;building.elevatorsi.inList=0;building.elevatorsi.timerID=0;for(i=0;ifloorNowOn;if(wait)PushFloorButton(one);building.floorsfloor.pWaiting=addPerson(building.floorsfloor.pWaiting,one);int i;for(i=0;istate=waitingForElev);int floor=one-floorNowOn;assert(one-desti
42、nation != floor);if(one-destinationfloor)building.floorsfloor.up=true;elsebuilding.floorsfloor.down=true;void intoOffice(bool work ,PersonNode *one)int floor=one-floorNowOn;PersonNode *head=building.floorsfloor.pInFloor;if(work)building.floorsfloor.pInFloor=addPerson(head,one);elsebuilding.floorsflo
43、or.pInFloor=delPerson(head,one);void display(void *sink,time_t t)int i;char s1000;char szNum10;HANDLE handle;sprintf(s,ttt辦公樓電梯運(yùn)行系統(tǒng)n);strcat(s,Floor);for(i=0;i=0;i-)strcat(s,n);sprintf(szNum,%d,i);strcat(s,szNum);/ strcat(s,:);19if(building.floorsi.up)strcat(s,U);elsestrcat(s,-);if(building.floorsi.
44、down)strcat(s,D);elsestrcat(s,-);int n=getPersonNum(building.floorsi.pWaiting);if(n=0)sprintf(szNum, );elsesprintf(szNum,%d,n);strcat(s,szNum);strcat(s,t);for(int j=0;jMAXELEVS;j+)if(building.elevatorsj.floorNumberfloorNumber=i)if(building.elevatorsj.dir=UP) /elevSj-dir=UP)strcat(s,Up);else if(build
45、ing.elevatorsj.dir=DOWN)strcat(s,Dn);elsestrcat(s, );int pn=getPersonNum(building.elevatorsj.inList);sprintf(szNum,%d,pn);strcat(s,szNum);strcat(s,t);elsestrcat(s,t);strcat(s,n);strcat(s, 樓內(nèi)總?cè)藬?shù):);sprintf(szNum,%d,building.totalPeople);strcat(s,szNum);strcat(s, 走樓梯人數(shù):);int n=getPersonNum(building.pto
46、okStair);sprintf(szNum,%d,n);strcat(s,szNum);strcat(s, 電梯平均人數(shù):);int k;20n=0;for(k=0;kfloorNowOn;elev-inList=addPerson(elev-inList,one);elev-buttonsone-destination=true; /按目標(biāo)層return true;else /出電梯elev-inList=delPerson(elev-inList,one);return true;void takeStair(bool go,PersonNode *one)/ int floor=one
47、-floorNowOn;if(go) /走樓building.ptookStair=addPerson(building.ptookStair,one);else /到達(dá)building.ptookStair=delPerson(building.ptookStair,one);/電梯.cpp/#include stdafx.h#include Timer1.h#include 大樓.h21void OnElevTimer(void *sink,time_t t)Elevator *p=(Elevator *)sink;if(p-runing)if( p-dir=UP)if(p-floorNu
48、mberfloorNumber+=1;assert(p-floorNumberbuttonsp-floorNumber | RequestOpen(p)killTimer(p-timerID);p-timerID=0;p-runing=false;OnArrived(p);else if(p-dir=DOWN)if(p-floorNumber0)p-floorNumber-=1;if(p-buttonsp-floorNumber | RequestOpen(p)killTimer(p-timerID);p-timerID=0;p-runing=false;OnArrived(p);void O
49、nArrived(Elevator *p)int floor=p-floorNumber;p-buttonsfloor=false;if(floor=MAXFLOORS-1)p-dir=DOWN;/NODIRECTION;if(floordir=UP;/NODIRECTION;OnElevtArrived(p,p-inList);OnElevStoped(p,floor); /通知樓層,電梯已停在此Run(p);void Run(Elevator *elev)22if(elev-runing)return;bool dirUp=RequestUp(elev);/false;bool dirDn
50、=RequestDn(elev);/false;if(elev-dir=UP)if(!dirUp) if(dirDn)elev-dir=DOWN;else elev-dir=NODIRECTION;else if(elev-dir=DOWN)if(!dirDn) if(dirUp)elev-dir=UP;else elev-dir=NODIRECTION;elseif(dirDn)elev-dir=DOWN;else if(dirUp)elev-dir=UP;/;int dt=1000*TRAVELTINE; /層間運(yùn)行時(shí)間if(elev-dir!=NODIRECTION)elev-runin
51、g=true;assert(elev-timerID=0);elev-timerID=setTimer(elev,dt,OnElevTimer);void PushClose(Elevator *elev)Run(elev);bool RequestOpen(Elevator *elev)int f=elev-floorNumber;if(building.floorsf.down | building.floorsf.up)return true;return false;23bool RequestUp(Elevator *elev)/是否有請(qǐng)求電梯向上int i;for(i=elev-f
52、loorNumber+1;ibuttonsi )return true;if(building.floorsi.down)return true;return false;bool RequestDn(Elevator *elev) /是否有請(qǐng)求電梯向下int i;for(i=elev-floorNumber-1;i=0;i-)if(elev-buttonsi)return true;if(building.floorsi.up)return true;return false;void OnElevStoped(Elevator *elev,int floor)if(elev-dir=UP)
53、building.floorsfloor.up=false;else if(elev-dir=DOWN)building.floorsfloor.down=false;/通知等待人OnElevtCome(elev,building.floorsfloor.pWaiting);/模擬.cpp/#include stdafx.h#include 大樓.hint NewPersons() /每次進(jìn)入大樓人數(shù)int n=(MAXPERSONS-building.totalPeople);if(n=0)return 0;n=rand() % 8;return n;24int BusinessT()ret
54、urn 40+(rand()%18); /連續(xù)工作時(shí)間int WaitingForElevT()return 8+(rand()%MAXWAITTIME); /等待時(shí)間int DestFloor() /確定目標(biāo)層return rand()%(MAXFLOORS-1);/人.cpp/#include stdafx.h#include #include Timer1.h#include 大樓.hvoid EnterBuilding(PersonNode *p)p-floorNowOn=0;p-destination=DestFloor();if(p-destination!=0)p-state=w
55、aitingForElev;int dt=WaitingForElevT()*1000;p-timeID=setTimer(p,dt,OnTimer);waitElev(true,p); /開始等候void OnTimer(void *sender,time_t t)PersonNode *p=(PersonNode *)sender;killTimer(p-timeID);p-timeID=0;if( p-state=officeIn)/下班或到其他樓p-destination=DestFloor();if(p-floorNowOn=p-destination)return ;intoOff
56、ice(false,p);/leaveOffice(p);p-state=waitingForElev;waitElev(true,p);/PushFloorButton(p);/開始等候電梯int dt=1000*WaitingForElevT();assert(p-timeID=0);p-timeID=setTimer(p,dt,OnTimer);/等時(shí)間25else if(p-state=takingStairs)/到達(dá)p-state=officeIn;p-floorNowOn=p-destination;takeStair(false,p);intoOffice(true,p);int
57、 dt=1000*BusinessT();assert(p-timeID=0);p-timeID=setTimer(p,dt,OnTimer); /辦公時(shí)間else if(p-state=waitingForElev)p-state=takingStairs;waitElev(false,p);takeStair(true,p);void OnElevtCome(Elevator *elev,PersonNode *persons) / persons 等電梯的人PersonNode *p=persons;assert(elev-runing=false);/ int n=getPersonN
58、um(persons);bool into=false;PersonNode *pnext=0;while(p)assert(p-state=waitingForElev);int passengers=getPersonNum(elev-inList);if(passengers=CAPACITY)/elev-PushFloorButton(p);/乘客已滿,再請(qǐng)求break;/Direction dir=p-destinationp-floorNowOn?UP:DOWN;if(dir=elev-dir | elev-dir=NODIRECTION)pnext=p-next;killTime
59、r(p-timeID);p-timeID=0;waitElev(false,p);into=IntoElev(true,p,elev);p-state=elevNowIn;p=pnext;continue;p=p-next;26if(into)/有人進(jìn)入PushClose(elev);void OnElevtArrived(Elevator *elev,PersonNode *persons)/persons 電梯中的人PersonNode *p=persons;while(p)assert(p-state=elevNowIn);PersonNode *pnext=0;if(p-destina
60、tion=elev-floorNumber)pnext=p-next;IntoElev(false,p,elev);/elev-inList=delPerson(elev-inList,p);p-state=officeIn;p-floorNowOn=p-destination;intoOffice(true,p); /去辦公int dt=1000*BusinessT();assert(p-timeID=0);p-timeID=setTimer(p,dt,OnTimer); /辦公時(shí)間p=pnext;continue;p=p-next;PersonNode *addPerson(PersonN
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 增強(qiáng)趣味性與教育意義考核試卷
- 味精生產(chǎn)過(guò)程中的資源綜合利用考核試卷
- 堅(jiān)果加工企業(yè)生產(chǎn)計(jì)劃與調(diào)度考核試卷
- 冷藏車運(yùn)輸職業(yè)培訓(xùn)與職業(yè)發(fā)展考核試卷
- 婦幼保健院績(jī)效管理與評(píng)價(jià)考核試卷
- 體育場(chǎng)館會(huì)員制度與粉絲運(yùn)營(yíng)考核試卷
- 原動(dòng)設(shè)備在環(huán)保設(shè)備行業(yè)的應(yīng)用考核試卷
- 考慮舒適性的智能汽車典型工況自動(dòng)緊急避撞研究
- 基于DEA-AHP的木門制造類企業(yè)T公司供應(yīng)商選擇研究
- 我國(guó)新市民商業(yè)醫(yī)療保險(xiǎn)需求影響因素研究
- 物業(yè)工程管理安全培訓(xùn)課件
- 《文化苦旅》讀書分享 PPT
- 氧化鋁生產(chǎn)工藝教學(xué)拜耳法
- 2023年十八項(xiàng)醫(yī)療核心制度考試題與答案
- 氣管切開患者氣道濕化的護(hù)理進(jìn)展資料 氣管切開患者氣道濕化
- GB/T 12706.1-2020額定電壓1 kV(Um=1.2 kV)到35 kV(Um=40.5 kV)擠包絕緣電力電纜及附件第1部分:額定電壓1 kV(Um=1.2 kV)和3 kV(Um=3.6 kV)電纜
- 管理模板:某跨境電商企業(yè)組織結(jié)構(gòu)及部門職責(zé)
- 底架總組裝工藝指導(dǎo)書
- 簡(jiǎn)單臨時(shí)工勞動(dòng)合同模板(3篇)
- 聚酯合成反應(yīng)動(dòng)力學(xué)
- 上??萍即髮W(xué),面試
評(píng)論
0/150
提交評(píng)論