




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1計算機實習(C語言)指導書作者 雷電上海大學 自動化系2計算機實習指導書(C語言)學好一門編程語言,最重要的是進行大量的編程實踐。通過計算機C語言實習,把已學過的編程語言知識和操作技能進行綜合應用,加深對C語言的語法規(guī)范、程序結(jié)構(gòu)以及編程方法和技巧的理解,培養(yǎng)良好的程序設(shè)計習慣,提高程序設(shè)計水平。在計算機的主流PC機上,由于Windows的廣泛應用,基于Windows編程的MicrosoftVisual Studio已經(jīng)成為主流,Visual C+/C#是程序員選擇的主要編程工具,Turbo C等PC機上的C語言編程工具已很少使用。但C語言是C+的基礎(chǔ),且在嵌入式系統(tǒng)中發(fā)揮著不可替代的作用,
2、大量的單片機系統(tǒng)支持C語言編程,進行系統(tǒng)而扎實的C語言程序設(shè)計實習是非常重要的??紤]到這些,我們采用Visual C+6.0作為編程工具,選擇編寫Win32 ConsoleApplication類型的C語言程序。編程環(huán)境簡介1.打開Visual C+6.0運行2.選擇菜單file/New.,出現(xiàn)一個選擇界面,在Project屬性頁中選擇Win32 ConsoleApplication,然后在Project name文本框中填入一個工程名,如Ex1,在Location文本框中選擇存放這一新工程的文件夾,如D:MyProjectEx1,此文件夾下將存放Ex1工程的所有相關(guān)文件。3.第2步確定后,出
3、現(xiàn)一個新的選擇界面,在此選擇A simple application.4.第3步完成后,VC會為你創(chuàng)建Win32 Console Application編程框架,在main()中可編寫你的代碼。(不要刪除框架為你所加的代碼,如#include “StdAfx.h”)。5.編程中常常需要創(chuàng)建多個源文件,并添加到工程中,這可以通過選擇菜單file/New.,出現(xiàn)一個選擇界面,在File屬性頁中,選擇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)試運行,!(ctrl+F5)非調(diào)試運行,手插入斷點。F10單步執(zhí)行,F(xiàn)11進入函數(shù)體,ctrl+F10運行到光標處。實習內(nèi)容1掌握visual C+ 6.0控制臺應用程序開發(fā)環(huán)境,掌握基本的程序調(diào)試技術(shù)。2用C語言編6個簡單熟悉的覆蓋C語言知識的解決實際問題的應用程序. 做一個較復雜的C語言應用程序設(shè)計(電梯運行系統(tǒng))。3每次上機,做好實習筆記,按時間按實習題目記錄下實習心得,編程中的問題、經(jīng)驗、技術(shù)技巧.4每次上機后, 按工程文件夾組織保存程序代碼到軟盤或U 盤, 只要保存 .c,.cpp,.h,.dsw,.dsp文件。記?。翰荒馨珼ebug子目錄文件,否則太大
5、。5撰寫實習報告,報告分二部分,第一部分內(nèi)容為:按時間按實習題目記錄整理的實習心得,編程中的問題、經(jīng)驗、技術(shù)技巧.第二部分是實驗七的程序設(shè)計書,用框圖、文字說明,寫作規(guī)范見后。報告要寫在正規(guī)的統(tǒng)一的實驗報告上。3實習題目實驗一:計算平均成績實驗內(nèi)容:輸入成績,計算并顯示平均成績。運行效果:輸入3門課程的成績:69.5 80 90.5平均成績:80.00退出否?y實驗說明:上述顯示效果中,下劃線數(shù)字為用戶的輸入。當退出否不為y,則重復。初學C語言編程是一個充滿挫折的艱難歷程,特別是在使用scanf,printf進行數(shù)據(jù)的輸入輸出上常常容易出錯,挫傷了初學者的積極性,實際上scanf已很少使用。可
6、以使用C+的控制臺輸入輸出流cin、cout 取代scanf,printf,出錯機會大為減少,而又更容易理解,cin理解為鍵盤,cout理解為屏幕。使用方法:1.包含iostream頭文件,指定std名空間 2.用從cin輸入數(shù)據(jù),用向cout輸出數(shù)據(jù)顯示,都不必考慮輸入輸出的數(shù)據(jù)類型,當同時多個數(shù)據(jù)輸入時,用空格來分隔其多個數(shù)據(jù),回車接受輸入。例: #include Using namespace std;void main()int a;cina; /* 等價 scanf(%d,&i); */couta; /* 等價 printf(%d,i); */目的要求:熟悉控制臺輸入輸出, for、
7、while、do循環(huán)語句的使用。實驗二:數(shù)據(jù)的不同數(shù)制顯示實驗內(nèi)容:輸入小于128的十進制整數(shù),顯示其ASCII碼字符。輸入十六進制整數(shù),顯示其十進制整數(shù)。輸入十進制整數(shù),顯示其十六進制整數(shù)運行效果:輸入小于128的十進制整數(shù):63?輸入一個字符:?63輸入十六進制整數(shù):0 x1A26輸入十進制整數(shù):261A目的要求:理解數(shù)字在計算機中的表示。實驗三:猜數(shù)游戲?qū)嶒瀮?nèi)容:(1)先由計算機“想”一個數(shù)請人猜,如果猜對了,則繼續(xù)猜下一個數(shù),否則計算機給出提示,告訴所猜的數(shù)是太小還是太大。(2)當猜對或一個數(shù)猜了20次仍未猜中停止本次猜數(shù),仍然繼續(xù)猜下一個數(shù)。(3)計算機記錄猜的次數(shù),以此來反映猜數(shù)者
8、“猜”的水平。(4)每次運行程序可反復猜多個數(shù),直到操作者停止時才結(jié)束。運行效果:20 太大,10 太小,15太大,12 對了!猜4 次成功繼續(xù)否?n目的要求:本實驗用于循環(huán)語句、條件語句的編程練習。實驗說明:隨機數(shù)產(chǎn)生頭文件stdlib.h ,時間頭文件time.h4始初化隨機數(shù)種子srand(clock(); 或 srand(time(NULL);實驗四:兔子生崽實驗內(nèi)容:假設(shè)一對小兔的成熟期是一個月,即一個月可長成成兔,那么,如果每對成兔每個月都可以生一對小兔,一對新生的小兔從第二個月起就開始生兔子,試問從一對兔子開始繁殖,以后各月的可有多少對兔子?實驗說明:這是13世紀意大利Fibon
9、acci借助民間的“兔子生崽”問題引入的一個著名的遞推數(shù)列即Fibonacci數(shù)列。,采用遞推分析法:第0個月兔子對數(shù)f(0)=1;第1個月兔子對數(shù)f(1)=2;第2個月兔子對數(shù)f(2)=3;第n個月兔子對數(shù)f(n)=f(n-1)+f(n-2)運行效果:一對兔子開始繁殖,以后各月的兔子對數(shù):不用子函數(shù)計算結(jié)果:1 2 3 5 8 13 21 34 55 89 144 233用子函數(shù)計算結(jié)果:1 2 3 5 8 13 21 34 55 89 144 233目的要求:體會遞推算法是把科學或工程計算中數(shù)學模型轉(zhuǎn)變?yōu)橛嬎銠C運算模型的重要方法。掌握數(shù)組、指針的編程,求各月的有多少對兔子用或不用一個子函數(shù)
10、實現(xiàn)。以后實驗都必須采用模塊化的程序設(shè)計方法,每個子任務對應一個子函數(shù),完成總?cè)蝿盏某绦蛴梢粋€主函數(shù)和若干子函數(shù)組成,主函數(shù)起任務調(diào)度的總控作用。理解模塊化程序設(shè)計方法,掌握函數(shù)的實現(xiàn)、調(diào)用編程技術(shù)。實驗五:學生成績統(tǒng)計實驗內(nèi)容:從鍵盤輸入一個班(最多30人)的某門課程的學生成績,當輸入為負值時或已達30人時輸入結(jié)束,分別統(tǒng)計下列內(nèi)容:1)統(tǒng)計不及格人數(shù)并打印其學生名單。2)統(tǒng)計成績在全班平均分及平均分之上的學生人數(shù)并打印其學生名單。3)統(tǒng)計各分數(shù)段的學生人數(shù)及所占百分比。運行效果:學號 成績 學號 成績 學號 成績 學號 成績2001 60 2002 80 2003 90 2004 1002
11、005 70 2006 40 2007 80 -1 -1不及格人數(shù):1 名單:2006平均分:74.3平均分及平均分之上的學生:2002,2003,2004,2007不及格:14.3% 60-69分:14.3% 70-79分:14.3% 80-89分:28.6% 90-100分:28.6%實驗說明:學號、成績輸入小于0的數(shù)表示結(jié)束輸入。目的要求:該實驗是數(shù)組、指針、函數(shù)的綜合練習,理解指針及數(shù)據(jù)在函數(shù)間傳遞的編程方法。實驗六:學生成績管理系統(tǒng)實驗內(nèi)容: 1)選課登記2)動態(tài)輸入學生成績。3)查詢學生成績。4)修改成績運行效果: 學生成績管理系統(tǒng)0新生注冊1選課登記2學生成績輸入3成績查詢4修改
12、成績55退出命令?0學號 姓名2001 李12002 李22003 李3-1學生數(shù)據(jù)庫共有3個個記錄繼續(xù)新的注冊? n (注:清屏返回主采單)命令?1課程號:1001輸入選擇該課程的學生學號:2001 2002 -1共有2個學生選此課程繼續(xù)新的選課輸入? y課程號:1002輸入選擇該課程的學生學號:2002 2003 -1共有2個學生選此課程繼續(xù)新的選課輸入? n (注:清屏返回主采單)命令?2課程號:1001學號:2001 姓名:李1 成績:80學號:2002 姓名:李2 成績:901001課程成績已輸入完成繼續(xù)其他課程成績輸入? y課程號:1002學號:2003 姓名:李3 成績:70學號
13、:2002 姓名:李2 成績:601002課程成績已輸入完成繼續(xù)其他課程成績輸入? n (注:清屏返回主采單)命令?3學號: 2002姓名:李2 成績:課程號:0001 成績:90課程號:0002 成績:60繼續(xù)查詢?n (注:清屏并返回主采單)命令?4學號:2002 課程號:0001原成績: 90 成績修改為:70繼續(xù)修改? n命令:5 (注:清屏并返回主采單)實驗提示:1)清屏方法:包含頭文件#include 調(diào)用函數(shù)system(cls);2)目的要求:本實驗是較綜合的實習,要求掌握結(jié)構(gòu)體、指針、函數(shù)等基本知識,理解鏈6表的實現(xiàn)技術(shù),理解模塊化程序設(shè)計方法。實驗七:辦公樓電梯運行系統(tǒng)實驗
14、內(nèi)容:這是一個規(guī)模稍大的軟件,它是要編寫一個程序,模擬辦公大樓中全部電梯的工作過程。這個仿真程序可以用來改善大樓管理,它也可以看成是一種游戲程序。下面讓我們對這個系統(tǒng)作一個初步描述:辦公大樓有二十層,每層有電梯,同時有步行樓梯;全樓有不多于10部電梯可同時供使用,電梯容量為24人,速度每上下一層需5秒,其運行狀態(tài)可分:向上、向下、停止,當前乘客數(shù),當前所在層數(shù)。它設(shè)有一個“按鈕數(shù)組”,例如第五層的按鈕按下,意味著有乘客在第5層到達目標層,等等。在樓的每一層,有當前電梯所在樓層顯示,有按鈕表示有人等待向上或向下,有若干人在等待,有若干電梯在本層停下,等等。在大樓中(包括進出)的總?cè)藬?shù)不超過500
15、人,每個人站在電梯前有個目標層,他有一個最大的忍受等待時間,因為他可以選擇電梯或是步行走樓梯,等等。若干假設(shè):在每個時間段要進大樓的人數(shù)在024之間隨機取值;用電梯的每個人的目標層在019之間取值;一個人在進電梯或改走樓梯之前的等待時間在818秒范圍內(nèi)隨機發(fā)生;一個人到達目標層后第二次再乘電梯中間的工作時間在4068秒間隨機取值。以及其他假設(shè)??傊?,在我們設(shè)計仿真程序之前應對整個系統(tǒng)有個比較量化的了解,同時應對整個系統(tǒng)的幾方面因素有一定的劃分。例如,可以把整個大樓視為系統(tǒng)的整體,在這個系統(tǒng)中運行的有不同類的對象:電梯、電梯集合、人、人的集合,樓層,樓層的集合,大樓。每個對象有他的數(shù)據(jù)結(jié)構(gòu),及在
16、此數(shù)據(jù)集上的操作(函數(shù))。運行效果:辦公樓電梯運行系統(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ù)字表當前電梯位置,第一列表樓層號及上下按鈕是否亮,等待人數(shù),中間區(qū)表各個電梯的運行狀態(tài)(上/下、電梯中的人數(shù))。以下所附實驗七源代碼是采用面向?qū)ο蟮某绦蛟O(shè)
17、計思想和事件驅(qū)動技術(shù)編程的,這是當代程序設(shè)計的基本方法,望同學們詳細研究,好好體會。附:實驗六部分參考源代碼(/ 。 / 中間的代碼要求自己完成)#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;/學生課程成績列表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學生成績管理系統(tǒng)n;cout tt0新生注冊n;cout tt1選課登記n;cout tt2學生成績輸入n;cout tt3成績查詢n;cout tt4修改成績n;cout tt5退出n;coutcmd;return cmd;/新生注冊:建立學生信息鏈表,從鍵盤輸入學生姓名學號,插入到鏈表中。int stuReg(STU_SCORE *pHead)cout注意:新生注冊學號不能重復!n;start:/。/coutc;if(c=y|c=Y)goto start;return 0;/學生選課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)/有該學號bool be=false;SCORE *pcourse=pStu-scoreHead-pnext;while(pcourse!=pStu-scoreHead)/已有選課if(pcourse-courseId=cid)be=true;/已有該選課break;pcourse=pcourse-pnext;if(!be) /還沒有選此課程SCORE *pNewcourse=
22、(SCORE *)malloc(sizeof(SCORE);/ 。插入到選課鏈的頭節(jié)點后/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個學生選此課程n;coutc;if(c
23、=y|c=Y)goto start;return 0;10/學生成績輸入int inputData(STU_SCORE *pStuHead)int count;start:count=0;coutcid;STU_SCORE *pStu=pStuHead-pnext;while(pStu!=pStuHead)/if鏈表已有學生記錄SCORE *pcourse=pStu-scoreHead-pnext;while(pcourse!=pStu-scoreHead)if(pcourse-courseId=cid)cout學號:stuId 姓名:name;coutscore=0)coutpcourse-
24、score;count+;break;pcourse=pcourse-pnext;pStu=pStu-pnext;if(count=0)cout該課程無學生選!n;elsecoutcid課程成績已輸入完成!n;coutc;if(c=y|c=Y)goto start;return 0;/課程成績查詢int scoreQuery(STU_SCORE *pStuHead)/。11/return 0;/課程成績修改modify(STU_SCORE *pStuHead)/。/return 0;附:實驗七源代碼/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ù)說明extern int done;void iniTimer(); /初始化定時器void timerR
28、un(); /定時器運行/創(chuàng)建定時器,返回定時器ID,sink:接收定時器事件的對象int setTimer(void *sink,int dt,TimerHandle timerHandleFunc);int killTimer( int TimerID );/刪除定時器#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;/本電梯號int floorNumber;/當前樓層號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 /層間運行時間#define MAXWAITTIME (5*TRAVELTINE) /最大等待時間int NewPersons(); /每次進入大樓人數(shù)int BusinessT(); /連續(xù)工作時間int WaitingForElevT(); /可等待時間
33、int DestFloor(); /確定目標層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;/目標樓層int timeID;/Pers
34、onNode *next;void EnterBuilding(PersonNode *p); /進入大樓void OnElevtArrived(Elevator *elev,PersonNode *passengers); /passenger,電梯到達了void OnElevtCome(Elevator*elev,PersonNode *waitPerson); /waitPerson,電梯到了void OnTimer(void *person,time_t t); /person,定時到了bool IntoElev(bool in,PersonNode *one,Elevator *el
35、ev);/進出電梯PersonNode *delPerson(PersonNode *head,PersonNode *one); /從隊列刪除onePersonNode *addPerson(PersonNode *head,PersonNode *one); /one加入到隊列int getPersonNum(PersonNode *head);#endif/Timer1.cpp/#include stdafx.h#include #include #include #include Timer1.hint TIMERNUM=3; /定時器數(shù)int done=0;struct STimer
36、15int timerID;void *sink;TimerHandle OnTimer; /obj對象的函數(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;/定時器不夠,再分配。#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辦公樓電梯運行系統(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; /按目標層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 /到達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; /層間運行時間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)/是否有請求電梯向上int i;for(i=elev-f
52、loorNumber+1;ibuttonsi )return true;if(building.floorsi.down)return true;return false;bool RequestDn(Elevator *elev) /是否有請求電梯向下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() /每次進入大樓人數(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ù)工作時間int WaitingForElevT()return 8+(rand()%MAXWAITTIME); /等待時間int DestFloor() /確定目標層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);/等時間25else if(p-state=takingStairs)/到達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); /辦公時間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);/乘客已滿,再請求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)/有人進入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); /辦公時間p=pnext;continue;p=p-next;PersonNode *addPerson(PersonN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025金融衍生品交易及配套人民幣借款合同模板
- 第13課《賣油翁》第二課時(導學案)-七年級語文下冊同步備課系列(部編版)
- 2025正式員工合同協(xié)議模板
- 2025宣傳標語制作簡易合同
- 2025標準版地域轉(zhuǎn)讓合同
- 農(nóng)村資源循環(huán)利用合作開發(fā)協(xié)議
- 電影娛樂公司影視作品宣傳與推廣策略研究
- 酒店住宿客人入住前物品保管協(xié)議
- 《有理數(shù)的運算規(guī)則:小學數(shù)學四則運算教案》
- 智能辦公系統(tǒng)升級改造合作協(xié)議
- 人教版五年級下冊期末語文試卷答題卡及答案
- ZJUTTOP100理工類學術(shù)期刊目錄(2018年版)
- F0值計算公式自動
- 《全國統(tǒng)一建筑工程基礎(chǔ)定額河北省消耗量定額》宣貫資料
- (最新整理)《跨文化溝通》PPT課件
- 道路交通事故現(xiàn)場勘查課件
- 門店電表記錄表
- 組態(tài)王雙機熱備
- 綠地圖繪制指南
- 山體植被恢復項目綠化工程施工組織設(shè)計
- 初級長拳現(xiàn)用圖解(第一路)
評論
0/150
提交評論