




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
計算機實習(C語言)指導書作者雷電上海大學自動化系2計算機實習指導書(C語言)學好一門編程語言,最重要的是進行大量的編程實踐。通過計算機C語言實習,把已學過的編程語言知識和操作技能進行綜合應用,加深對C語言的語法規范、程序結構以及編程方法和技巧的理解,培養良好的程序設計習慣,提高程序設計水平。在計算機的主流PC機上,由于Windows的廣泛應用,基于Windows編程的MicrosoftVisualStudio已經成為主流,VisualC++/C#是程序員選擇的主要編程工具,TurboC等PC機上的C語言編程工具已很少使用。但C語言是C++的基礎,且在嵌入式系統中發揮著不可替代的作用,大量的單片機系統支持C語言編程,進行系統而扎實的C語言程序設計實習是非常重要的??紤]到這些,我們采用VisualC++6.0作為編程工具,選擇編寫Win32ConsoleApplication類型的C語言程序。編程環境簡介打開VisualC++6.0運行選擇菜單file/New...,出現一個選擇界面,在Project屬性頁中選擇Win32ConsoleApplication,然后在Projectname文本框中填入一個工程名,如Exl,在Location文本框中選擇存放這一新工程的文件夾,如D:\MyProject\Ex1,此文件夾下將存放Ex1工程的所有相關文件。第2步確定后,出現一個新的選擇界面,在此選擇Asimpleapplication.第3步完成后,VC會為你創建Win32ConsoleApplication編程框架,在main()中可編寫你的代碼。(不要刪除框架為你所加的代碼,女沖include“StdAfx.h”)。5?編程中常常需要創建多個源文件,并添加到工程中,這可以通過選擇菜單file/New...,出現一個選擇界面,在File屬性頁中,選擇C/C++HeaderFile,用于創建*.h頭文件,選擇C/C++SourceFile,用于創建*.c/*.cpp文件,并在File文本框中填入你想創建的文件名,0K.6.工具欄中按紐:Build(F7)編譯連接,go(F5)調試運行,!(ctrl+F5)非調試運行,手插入斷點。F10單步執行,F11進入函數體,ctrl+F10運行到光標處。實習內容掌握visualC++6.0控制臺應用程序開發環境,掌握基本的程序調試技術。用C語言編6個簡單熟悉的覆蓋C語言知識的解決實際問題的應用程序.做一個較復雜的C語言應用程序設計(電梯運行系統)。每次上機,做好實習筆記,按時間按實習題目記錄下實習心得,編程中的問題、經驗、技術技巧.每次上機后,按工程文件夾組織保存程序代碼到軟盤或U盤,只要保存.c,.cpp,.h,.dsw,.dsp文件。記?。翰荒馨珼ebug子目錄文件,否則太大。撰寫實習報告,報告分二部分,第一部分內容為:按時間按實習題目記錄整理的實習心得,編程中的問題、經驗、技術技巧.第二部分是實驗七的程序設計書,用框圖、文字說明,寫作規范見后。報告要寫在正規的統一的實驗報告上。實習題目實驗一:計算平均成績實驗內容:輸入成績,計算并顯示平均成績。運行效果:輸入3門課程的成績:69.58090.5平均成績:80.00退出否?y實驗說明:上述顯示效果中,下劃線數字為用戶的輸入。當退出否不為y,則重復。初學C語言編程是一個充滿挫折的艱難歷程,特別是在使用scanf,printf進行數據的輸入輸出上常常容易出錯,挫傷了初學者的積極性,實際上scanf已很少使用??梢允褂肅++的控制臺輸入輸出流cin、cout取代scanf,printf,出錯機會大為減少,而又更容易理解,cin理解為鍵盤,cout理解為屏幕。使用方法:1.包含iostream頭文件,指定std名空間2.用〉〉從cin輸入數據,用〈〈向cout輸出數據顯示,都不必考慮輸入輸出的數據類型,當同時多個數據輸入時,用空格來分隔其多個數據,回車接受輸入。例:#include〈iostream〉Usingnamespacestd;voidmain(){inta;cin〉〉a;/*等價scanf("%d",&i);*/cout〈〈a;/*等價printf("%d",i);*/}目的要求:熟悉控制臺輸入輸出,for、while、do循環語句的使用。實驗二:數據的不同數制顯示實驗內容:輸入小于128的十進制整數,顯示其ASCII碼字符。輸入十六進制整數,顯示其十進制整數。輸入十進制整數,顯示其十六進制整數運行效果:輸入小于128的十進制整數:63?輸入一個字符:?63輸入十六進制整數:0x1A26輸入十進制整數:261A目的要求:理解數字在計算機中的表示。實驗三:猜數游戲實驗內容:(1)先由計算機“想”一個數請人猜,如果猜對了,則繼續猜下一個數,否則計算機給出提示,告訴所猜的數是太小還是太大。(2) 當猜對或一個數猜了20次仍未猜中停止本次猜數,仍然繼續猜下一個數。(3) 計算機記錄猜的次數,以此來反映猜數者“猜”的水平。(4) 每次運行程序可反復猜多個數,直到操作者停止時才結束。運行效果:20太大,10太小,15太大,12對了!猜4次成功繼續否?n目的要求:本實驗用于循環語句、條件語句的編程練習。實驗說明:隨機數產生頭文件stdlib.h,時間頭文件time.h4始初化隨機數種子srand(clock());或srand(time(NULL));實驗四:兔子生崽實驗內容:假設一對小兔的成熟期是一個月,即一個月可長成成兔,那么,如果每對成兔每個月都可以生一對小兔,一對新生的小兔從第二個月起就開始生兔子,試問從一對兔子開始繁殖,以后各月的可有多少對兔子?實驗說明:這是13世紀意大利Fibonacci借助民間的“兔子生崽”問題引入的一個著名的遞推數列即Fibonacci數列。,采用遞推分析法:第0個月兔子對數f(0)=1;第1個月兔子對數f(1)=2;第2個月兔子對數f(2)=3;第n個月兔子對數f(n)=f(n-1)+f(n-2)運行效果:一對兔子開始繁殖,以后各月的兔子對數:不用子函數計算結果:123581321345589144233用子函數計算結果:123581321345589144233目的要求:體會遞推算法是把科學或工程計算中數學模型轉變為計算機運算模型的重要方法。掌握數組、指針的編程,求各月的有多少對兔子用或不用一個子函數實現。以后實驗都必須采用模塊化的程序設計方法,每個子任務對應一個子函數,完成總任務的程序由一個主函數和若干子函數組成,主函數起任務調度的總控作用。理解模塊化程序設計方法,掌握函數的實現、調用編程技術。實驗五:學生成績統計實驗內容:從鍵盤輸入一個班(最多30人)的某門課程的學生成績,當輸入為負值時或已達30人時輸入結束,分別統計下列內容:統計不及格人數并打印其學生名單。統計成績在全班平均分及平均分之上的學生人數并打印其學生名單。統計各分數段的學生人數及所占百分比。運行效果:學號成績學號成績學號成績學號成績602002802003902004100200570200640200780-1-1不及格人數: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的數表示結束輸入。目的要求:該實驗是數組、指針、函數的綜合練習,理解指針及數據在函數間傳遞的編程方法。實驗六:學生成績管理系統實驗內容:1)選課登記動態輸入學生成績。查詢學生成績。4)修改成績運行效果:《學生成績管理系統》[0]新生注冊選課登記學生成績輸入成績查詢修改成績5退出命令?0學號姓名2001李1李2李3-1學生數據庫共有3個個記錄繼續新的注冊?n(注:清屏返回主采單)命令?1課程號:1001輸入選擇該課程的學生學號:20012002-1共有2個學生選此課程繼續新的選課輸入?y課程號:1002輸入選擇該課程的學生學號:20022003-1共有2個學生選此課程繼續新的選課輸入?n(注:清屏返回主采單)命令?2課程號:1001學號:2001姓名:李1成績:80學號:2002姓名:李2成績:901001課程成績已輸入完成繼續其他課程成績輸入?y課程號:1002學號:2003姓名:李3成績:70學號:2002姓名:李2成績:601002課程成績已輸入完成繼續其他課程成績輸入?n(注:清屏返回主采單)命令?3學號:2002姓名:李2成績:課程號:0001成績:90課程號:0002成績:60繼續查詢?n(注:清屏并返回主采單)命令?4學號:2002課程號:0001原成績:90成績修改為:70繼續修改?n命令:5(注:清屏并返回主采單)實驗提示:1)清屏方法:包含頭文件#include<stdlib.h〉調用函數system("cls");2)目的要求:本實驗是較綜合的實習,要求掌握結構體、指針、函數等基本知識,理解鏈6表的實現技術,理解模塊化程序設計方法。實驗七:辦公樓電梯運行系統實驗內容:這是一個規模稍大的軟件,它是要編寫一個程序,模擬辦公大樓中全部電梯的工作過程。這個仿真程序可以用來改善大樓管理,它也可以看成是一種游戲程序。下面讓我們對這個系統作一個初步描述:辦公大樓有二十層,每層有電梯,同時有步行樓梯;全樓有不多于10部電梯可同時供使用,電梯容量為24人,速度每上下一層需5秒,其運行狀態可分:向上、向下、停止,當前乘客數,當前所在層數。它設有一個“按鈕數組”,例如第五層的按鈕按下,意味著有乘客在第5層到達目標層,等等。在樓的每一層,有當前電梯所在樓層顯示,有按鈕表示有人等待向上或向下,有若干人在等待,有若干電梯在本層停下,等等。在大樓中(包括進出)的總人數不超過500人,每個人站在電梯前有個目標層,他有一個最大的忍受等待時間,因為他可以選擇電梯或是步行走樓梯,等等。若干假設:在每個時間段要進大樓的人數在0~24之間隨機取值;用電梯的每個人的目標層在0~19之間取值;一個人在進電梯或改走樓梯之前的等待時間在8~18秒范圍內隨機發生;一個人到達目標層后第二次再乘電梯中間的工作時間在40~68秒間隨機取值。以及其他假設??傊?,在我們設計仿真程序之前應對整個系統有個比較量化的了解,同時應對整個系統的幾方面因素有一定的劃分。例如,可以把整個大樓視為系統的整體,在這個系統中運行的有不同類的對象:電梯、電梯集合、人、人的集合,樓層,樓層的集合,大樓。每個對象有他的數據結構,及在此數據集上的操作(函數)。運行效果:《辦公樓電梯運行系統》Floor453574109:--::::::::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按任意鍵停止實驗說明:第一行數字表當前電梯位置,第一列表樓層號及上下按鈕是否亮,等待人數中間區表各個電梯的運行狀態(上/下、電梯中的人數)。以下所附實驗七源代碼是采用面向對象的程序設計思想和事件驅動技術編程的,這是當代程序設計的基本方法,望同學們詳細研究,好好體會。附:實驗六部分參考源代碼(//{。。。//}中間的代碼要求自己完成)#include"stdafx.h"#include<iostream.h>#include<stdlib.h>//鏈表結構head->[,->next]...[data0,->next][data1,->next]...[datan,->head]7structSCORE{intcourseId;intscore;SCORE*pnext;};structSTU_SCORE{charname[16];intstuId;SCORE*scoreHead;//學生課程成績列表structSTU_SCORE*pnext;};intmainMenu();intstuReg(STU_SCORE*pHead);intselCourse(STU_SCORE*pHead);intinputData(STU_SCORE*pHead);intscoreSort(STU_SCORE*pHead);intscoreQuery(STU_SCORE*pHead);intmodify(STU_SCORE*pHead);enumMAIN_CMD{REG,SEL=1,INPUT,QUERY,MODI,EXIT};intmain(intargc,char*argv[]){STU_SCORE*head=(STU_SCORE*)malloc(sizeof(STU_SCORE));head->stuId=-1;head->pnext=head;while(1){intcmd=mainMenu();switch(cmd){caseREG:stuReg(head);break;caseSEL:selCourse(head);break;caseINPUT:inputData(head);break;caseQUERY:scoreQuery(head);break;caseMODI:modify(head);break;caseEXIT:8return0;}}return0;}intmainMenu(){system("cls");cout〈〈"\t\t《學生成績管理系統》\n";cout〈〈"\t\t[0]新生注冊\n";cout〈〈"\t\t[1]選課登記\n";cout〈〈"\t\t[2]學生成績輸入\n";cout〈〈"\t\t[3]成績查詢\n";cout〈〈"\t\t[4]修改成績\n";cout〈〈"\t\t[5]退出\n";cout〈〈"命令?";intcmd;cin>>cmd;returncmd;}//新生注冊:建立學生信息鏈表,從鍵盤輸入學生姓名學號,插入到鏈表中intstuReg(STU_SCORE*pHead){cout〈〈"注意:新生注冊學號不能重復!\n";start://{//oooooo//}cout〈〈"繼續新的注冊?";charc;cin>>c;if(c=='y'||c=='Y')gotostart;return0;}//學生選課intselCourse(STU_SCORE*pHead){start:intcid;cout〈〈〃課程號:〃;cin>>cid;cout〈〈"輸入選擇該課程的學生學號\n〃;intstuId;cin>>stuId;while(stuId>0){STU_SCORE*pStu=pHead->pnext;9while(pStu!二pHead)//鏈表已有記錄{f(pStu-〉stuld==stuld)//有該學號{boolbe=false;SCORE*pcourse=pStu-〉scoreHead-〉pnext;while(pcourse!=pStu-〉scoreHead)//已有選課{if(pcourse-〉courseId==cid){be二true;////已有該選課break;}pcourse=pcourse-〉pnext;}if(!be){//還沒有選此課程SCORE*pNewcourse=(SCORE*)malloc(sizeof(SCORE));//{//。。。。。。插入到選課鏈的頭節點后//}}}pStu=pStu->pnext;}cin>>stuId;}intcount=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";cout〈〈〃繼續新的選課輸入?〃;charc;cin>>c;if(c=='y'||c=='Y')gotostart;return0;10}//學生成績輸入intinputData(STU_SCORE*pStuHead){intcount;start:count=0;cout〈〈〃課程號:〃;intcid;cin>>cid;STU_SCORE*pStu=pStuHead->pnext;while(pStu!二pStuHead)//if鏈表已有學生記錄{SCORE*pcourse=pStu->scoreHead->pnext;while(pcourse!=pStu->scoreHead){if(pcourse->courseId==cid){cout〈〈"學號:"〈〈pStu-〉stuld〈〈"姓名:"〈〈pStu-〉name;cout<<"成績:";if(pcourse-〉score〉=0)cout〈〈"已輸入";else{cin〉〉pcourse-〉score;count++;}break;}pcourse=pcourse-〉pnext;}pStu=pStu-〉pnext;}if(count==0)cout〈〈"該課程無學生選!\n";elsecout〈〈cid〈〈〃課程成績已輸入完成!〃〈〈〃\n〃;cout〈〈〃繼續其他課程成績輸入?〃;charc;cin〉〉c;if(c=='y'||c=='Y')gotostart;return0;}//課程成績查詢intscoreQuery(STU_SCORE*pStuHead){//{//。。。。。。11//}return0;}//課程成績修改modify(STU_SCORE*pStuHead){//{//。。。。。。//}return0;}附:實驗七源代碼////////////Ex7.cpp/////////////////#include"stdafx.h"#include"大樓.h"#include"Timer1.h"intmain(intargc,char*argv[]){iniTimer();initBuilder();timerRun();return0;}/////////////////////////////stdafx.h/////////////////////////////////////stdafx.h:includefileforstandardsystemincludefiles,//orprojectspecificincludefilesthatareusedfrequently,but//arechangedinfrequently//#if!defined(AFX_STDAFX_H__EED464F0_F241_47EA_87DA_8C5457EE1D58__INCLUDED_)#defineAFX_STDAFX_H__EED464F0_F241_47EA_87DA_8C5457EE1D58__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000//TODO:referenceadditionalheadersyourprogramrequireshere#include<stdio.h>#include<stdlib.h>#include<time.h>#include<assert.h>//{{AFX_INSERT_LOCATION}}12//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined(AFX_STDAFX_H__EED464F0_F241_47EA_87DA_8C5457EE1D58__INCLUDED_)///////////////////////////Timer1.h//////////////////////////////////#ifndef_TIMER1_H#define_TIMER1_H#include<time.h>typedefvoid(*TimerHandle)(void*sink,time_tt);/定/時器時間到事件處理函數說明externintdone;voidiniTimer();//初始化定時器voidtimerRun();//定時器運行//創建定時器,返回定時器ID,sink:接收定時器事件的對象intsetTimer(void*sink,intdt,TimerHandletimerHandleFunc);intkillTimer(intTimerID);//刪除定時器#endif///////////////////////////大樓.h//////////////////////#ifndef_BUILDING_H#define_BUILDING_H#include"模擬.h"#include"人.h"#include"電梯.h"structFloor{boolup;//上按鈕booldown;//下按鈕PersonNode*pWaiting;//等電梯人列表PersonNode*pInFloor;//在本樓辦公人員列表};structBuilding{Floorfloors[MAXFLOORS];Elevatorelevators[MAXELEVS];PersonNode*ptookStair;//走樓人列表inttotalPeople;//樓內總人數inttimerID;};voidinitBuilder();voidPushFloorButton(PersonNode*);voidwaitElev(boolwait,PersonNode*one);voidtakeStair(boolgo,PersonNode*one);13voidintoOffice(boolwork,PersonNode*one);voidOnElevStoped(Elevator*elev,intfloor);externBuildingbuilding;#endif////////////////////電梯.h////////////////////////////////////////#ifndef_ELEV_H#define_ELEV_HenumDirection{DOWN=-1,NODIRECTION=0,UP=1};structPersonNode;structElevator{intelevNumber;//本電梯號intfloorNumber;//當前樓層號boolruning;//是否正在Directiondir;boolbuttons[MAXFL00RS];//電梯內按鈕inttimerID;PersonNode*inList;};typedefvoid(*ElevArrivedHandle)(void*sink,Elevator*elev);voidPushClose(Elevator*elev);boolRequestDn(Elevator*elev);boolRequestUp(Elevator*elev);boolRequestOpen(Elevator*elev);voidRun(Elevator*elev);voidOnArrived(Elevator*p);#endif//////////////////模擬.h////////////////////////////////////////#ifndef.SIMULATION」#define_SIMULATION_H#defineMAXELEVS7//電梯數#defineMAXFLOORS20//樓層數#defineMAXPERSONS500//最多人數#defineCAPACITY24//電梯容量#defineTRAVELTINE2//層間運行時間#defineMAXWAITTIME(5*TRAVELTINE)//最大等待時間intNewPersons();//每次進入大樓人數intBusinessT();//連續工作時間intWaitingForElevT();//可等待時間intDestFloor();//確定目標層14#endif///////////////////////人.h///////////////////////////#ifndef_PERSON_H#define_PERSON_H//#include"電梯.h"http://#include"大樓.h"structElevator;enumPersonState{waitingForElev,//等待電梯elevNowIn,//在電梯中officeIn,//在辦公takingStairs,//走樓梯outside};structPersonNode{PersonStatestate;intfloorNowOn;//所在樓層intdestination;//目標樓層inttimeID;//PersonNode*next;};voidEnterBuilding(PersonNode*p);//進入大樓voidOnElevtArrived(Elevator*elev,PersonNode*passengers);//passenger,電梯到達了voidOnElevtCome(Elevator*elev,PersonNode*waitPerson);//waitPerson,電梯到了voidOnTimer(void*person,time_tt);//person,定時到了boolIntoElev(boolin,PersonNode*one,Elevator*elev);//進出電梯PersonNode*delPerson(PersonNode*head,PersonNode*one);//從隊列刪除onePersonNode*addPerson(PersonNode*head,PersonNode*one);//one加入到隊列intgetPersonNum(PersonNode*head);#endif///////////////////////Timer1.cpp///////////////////////////////////#include"stdafx.h"#include<time.h>#include<conio.h>#include<stdlib.h>#include"Timer1.h"intTIMERNUM=3;//定時器數intdone=0;structSTimer{15inttimerID;void*sink;TimerHandleOnTimer;//obj對象的函數intisUsing;clock_tstartT;longdt;};STimer*timers;//[TIMERNUM];voidiniTimer(){timers=(STimer*)malloc(TIMERNUM*sizeof(STimer));inti;for(i=0;i<TIMERNUM;i++)timers[i].isUsing=0;}voidtimerRun(){inti;charc=0;clock_tcurrT;while(!c){currT=clock();for(i=0;i<TIMERNUM;i++){if(timers[i].isUsing){clock_tendT=timers[i].startT+timers[i].dt;if(currT>=endT){timers[i].OnTimer(timers[i].sink,time(NULL));timers[i].startT=currT;}}}c=_kbhit();}}intkillTimer(intTimerID){if(TimerID>0&&TimerID<=TIMERNUM){timers[TimerID-1].isUsing=0;returnTimerID;}16return0;}intsetTimer(void*sink1,intdt,TimerHandletimerHandleFunc){inti;for(i=0;i<TIMERNUM;i++){if(timers[i].isUsing==0){timers[i].sink=sink1;timers[i].isUsing=1;timers[i].timerID=i+1;timers[i].OnTimer=timerHandleFunc;timers[i].startT=clock();timers[i].dt=dt;returni+1;}}//定時器不夠,再分配。#defineGROWN3TIMERNUM=TIMERNUM+GROWN;timers=(STimer*)realloc(timers,TIMERNUM*sizeof(STimer));timers[i].sink=sink1;timers[i].isUsing=1;timers[i].timerID=i+1;timers[i].OnTimer=timerHandleFunc;timers[i].startT=clock();timers[i].dt=dt;for(i=i+1;i<TIMERNUM;i++)timers[i].isUsing=0;returni+1;}/////////////////大樓.cpp///////////////////////#include"stdafx.h"#include<Windows.h>#include"大樓.h"#include"Timer1.h"Buildingbuilding;voiddisplay(void*sink,time_tt);voidOnEnterBuilding(void*sink,time_tt){intn=NewPersons();inti;for(i=0;i<n;i++){PersonNode*p=(PersonNode*)malloc(sizeof(PersonNode));building.totalPeople+=1;17EnterBuilding(p);}}voidinitBuilder(){inti;building.ptookStair=0;building.totalPeople=0;for(i=0;i<MAXELEVS;i++){building.elevators[i].elevNumber=i;building.elevators[i].floorNumber=0;building.elevators[i].runing=false;building.elevators[i].dir=NODIRECTION;building.elevators[i].inList=0;building.elevators[i].timerID=0;}for(i=0;i<MAXFLOORS;i++){building.floors[i].pInFloor=0;building.floors[i].pWaiting=0;}building.timerID=setTimer(0,2000,OnEnterBuilding);setTimer(0,1000,display);}voidwaitElev(boolwait,PersonNode*one){intfloor=one->floorNowOn;if(wait){PushFloorButton(one);building.floors[floor].pWaiting=addPerson(building.floors[floor].pWaiting,one);inti;for(i=0;i<MAXELEVS;i++){if(!building.elevators[i].runing&&building.elevators[i].floorNumber==floor){//電梯已停在此,通知等候乘客OnElevtCome(&building.elevators[i],building.floors[floor].pWaiting);}}}else{18building.floors[floor].pWaiting=delPerson(building.floors[floor].pWaiting,one);}}voidPushFloorButton(PersonNode*one){assert(one->state==waitingForElev);intfloor=one->floorNowOn;assert(one->destination!=floor);if(one->destination>floor)building.floors[floor].up=true;elsebuilding.floors[floor].down=true;}voidintoOffice(boolwork,PersonNode*one){intfloor=one->floorNowOn;PersonNode*head=building.floors[floor].pInFloor;if(work)building.floors[floor].pInFloor=addPerson(head,one);elsebuilding.floors[floor].pInFloor=delPerson(head,one);}voiddisplay(void*sink,time_tt){inti;chars[1000];charszNum[10];HANDLEhandle;sprintf(s,"\t\t\t《辦公樓電梯運行系統》\n");strcat(s,"Floor");for(i=0;i<MAXELEVS;i++){//當前電梯所在樓層strcat(s,"\t");intf=building.elevators[i].floorNumber;sprintf(szNum,"%d",f);strcat(s,szNum);}for(i=MAXFLOORS-1;i>=0;i--){strcat(s,"\n");sprintf(szNum,"%d",i);strcat(s,szNum);//strcat(s,":");19if(building.floors[i].up)strcat(s,"U");elsestrcat(s,"-");if(building.floors[i].down)strcat(s,"D");elsestrcat(s,"-");intn=getPersonNum(building.floors[i].pWaiting);if(n==0)sprintf(szNum,"");elsesprintf(szNum,"%d",n);strcat(s,szNum);strcat(s,"\t");for(intj=0;j<MAXELEVS;j++){f(building.elevators[j].floorNumber〈i)//電梯在該樓以下strcat(s,":\t");elseif(building.elevators[j].floorNumber==i)//elevS[j]->floorNumber==i){if(building.elevators[j].dir==UP)//elevS[j]->dir==UP)strcat(s,"Up");elseif(building.elevators[j].dir==DOWN)strcat(s,"Dn");elsestrcat(s,"");intpn=getPersonNum(building.elevators[j].inList);sprintf(szNum,"%d",pn);strcat(s,szNum);strcat(s,"\t");}else{strcat(s,"\t");}}}strcat(s,"\n");strcat(s,"樓內總人數:");sprintf(szNum,"%d",building.totalPeople);strcat(s,szNum);strcat(s,"走樓梯人數:");intn=getPersonNum(building.ptookStair);sprintf(szNum,"%d",n);strcat(s,szNum);strcat(s,"電梯平均人數:");intk;20n=0;for(k=0;k〈MAXELEVS;k++){n+=getPersonNum(building.elevators[k].inList);}sprintf(szNum,"%d\n",n/MAXELEVS);strcat(s,szNum);strcat(s,"按任意鍵結束.");handle=GetStdHandle(STD_OUTPUT_HANDLE);COORDpos={0,0};SetConsoleCursorPosition(handle,pos);DWORDdw;WriteConsole(handle,s,strlen(s),&dw,0);}boolIntoElev(boolin,PersonNode*one,Elevator*elev){if(in){//進入電梯//intfloor=one->floorNowOn;elev->inList=addPerson(elev->inList,one);elev->buttons[one->destination]=true;//按目標層returntrue;}else{//出電梯elev->inList=delPerson(elev->inList,one);returntrue;}}voidtakeStair(boolgo,PersonNode*one){//intfloor=one->floorNowOn;if(go){//走樓building.ptookStair=addPerson(building.ptookStair,one);}else{//到達building.ptookStair=delPerson(building.ptookStair,one);}}///////////////////電梯.cpp///////////////////////////////////////////#include"stdafx.h"#include"Timer1.h"#include"大樓.h"21voidOnElevTimer(void*sink,time_tt){Elevator*p=(Elevator*)sink;if(p->runing){if(p->dir==UP){if(p->floorNumber<MAXFLOORS-1)p->floorNumber+=1;assert(p->floorNumber<MAXFLOORS);if(p->buttons[p->floorNumber]||RequestOpen(p)){killTimer(p->timerID);p->timerID=0;p->runing=false;OnArrived(p);}}elseif(p->dir==DOWN){if(p->floorNumber>0)p->floorNumber-=1;if(p->buttons[p->floorNumber]||RequestOpen(p)){killTimer(p->timerID);p->timerID=0;p->runing=false;OnArrived(p);}}}}voidOnArrived(Elevator*p){intfloor=p->floorNumber;p->buttons[floor]=false;if(floor>=MAXFLOORS-1)p->dir=DOWN;//NODIRECTION;if(floor<=0)p->dir=UP;//NODIRECTION;OnElevtArrived(p,p->inList);OnElevStoped(p,floor);//通知樓層,電梯已停在此Run(p);}voidRun(Elevator*elev){22if(elev->runing)return;booldirUp=RequestUp(elev);//false;booldirDn=RequestDn(elev);//false;if(elev->dir==UP){if(!dirUp){if(dirDn)elev->dir=DOWN;elseelev->dir=NODIRECTION;}}elseif(elev->dir==DOWN){if(!dirDn){if(dirUp)elev->dir=UP;elseelev->dir=NODIRECTION;}}else{if(dirDn)elev->dir=DOWN;elseif(dirUp)elev->dir=UP;//;}intdt=1000*TRAVELTINE;//層間運行時間if(elev->dir!=NODIRECTION){elev->runing=true;assert(elev->timerID==0);elev->timerID=setTimer(elev,dt,OnElevTimer);}}voidPushClose(Elevator*elev){Run(elev);}boolRequestOpen(Elevator*elev){intf=elev->floorNumber;if(building.floors[f].down||building.floors[f].up)returntrue;returnfalse;}23boolRequestUp(Elevator*elev)//是否有請求電梯向上{inti;for(i=elev->floorNumber+1;i<MAXFLOORS;i++){if(elev->buttons[i]){returntrue;}if(building.floors[i].down)returntrue;}returnfalse;}boolRequestDn(Elevator*elev)//是否有請求電梯向下{inti;for(i=elev->floorNumber-1;i>=0;i--){if(elev->buttons[i]){returntrue;}if(building.floors[i].up)returntrue;}returnfalse;}voidOnElevStoped(Elevator*elev,intfloor){if(elev->dir==UP)building.floors[floor].up=false;elseif(elev->dir==DOWN)building.floors[floor].down=false;//通知等待人OnElevtCome(elev,building.floors[floor].pWaiting);}/////////////////////////模擬.cpp///////////////////////#include"stdafx.h"#include"大樓.h"intNewPersons()//每次進入大樓人數{intn=(MAXPERSONS-building.totalPeople);if(n<=0)return0;n=rand()%8;returnn;}24intBusinessT(){return40+(rand()%18);//連續工作時間}intWaitingForElevT(){return8+(rand()%MAXWAITTIME);//等待時間}intDestFloor()//確定目標層{returnrand()%(MAXFLOORS-1);}//////////////////////人.cpp///////////////////////////////////////////#include"stdafx.h"#include〈stdlib.h〉#include"Timer1.h"#include"大樓.h"voidEnterBuilding(PersonNode*p){p-〉floorNowOn=0;p-〉destination=DestFloor();if(p-〉destination!=0){p-〉state=waitingForElev;intdt=WaitingForElevT()*1000;p-〉timeID=setTimer(p,dt,OnTimer);waitElev(true,p);//開始等候}}voidOnTimer(void*sender,time_tt){PersonNode*p=(PersonNode*)sender;killTimer(p-〉timeID);p-〉timeID=0;if(p-〉state==officeIn){//下班或到其他樓p-〉destination=DestFloor();if(p-〉floorNowOn==p-〉destination)return;intoOffice(false,p);//leaveOffice(p);p->state=waitingForElev;waitElev(true,p);//PushFloorButton(p);//開始等候電梯intdt=1000*WaitingForElevT();assert(p->timeID==0);p->timelD二setTimer(p,dt,OnTimer);//等時間25}elseif(p->state==takingStairs){//到達p->state=officeIn;p->floorNowOn=p->destination;takeStair(false,p);intoOffice(true,p);intdt=1000*BusinessT();assert(p->timeID==0);p->timeID=setTimer(p,dt,OnTimer);//辦公時間}elseif(p->state==waitingForElev){p->state=takingStairs;waitElev(false,p);takeStair(true,p);}}voidOnElevtCome(Elevator*elev,PersonNode*persons){//persons等電梯的人PersonNode*p=persons;assert(elev->runing==false);//intn=getPersonNum(persons);boolinto=false;PersonNode*pnext=0;while(p){assert(p->state==waitingForElev);intpassengers=getPersonNum(elev->inList);if(passengers>=CAPACITY)//elev->{PushFloorButton(p);//乘客已滿,再請求break;//}Directiondir=p->destination>p->floorNowOn?UP:DOWN;if(dir==elev->dir||elev->dir==NODIRECTION){pnext=p->next;killTimer(p->timeID);p->timeID=0;waitElev(false,p);into=IntoElev(true,p,elev);p->state=elevNowIn;p=pnext;continue;}p=p->next;26}if(into)//有人進入PushClose(elev);}voidOnElevtArrived(Elevator*elev,PersonNode*persons){//persons電梯中的人PersonNode*p=persons;while(p){assert(p->state==elevNowIn);PersonNode*pnext=0;if(p->destination==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);//去辦公intdt=1000*BusinessT();assert(p->timeID==0);p->timeID=setTimer(p,dt,OnTimer);//辦公時間p=pnext;continue;}p=p->next;}}PersonNode*addPerson(PersonNode*head,PersonNode*one){PersonNode*p=head;one->next=0;if(p==0){p=one;returnp;}while(p->next!=0){p=p->next;}p->next=one;returnhead;}27intgetPersonNum(PersonNode*head){intcount=0;PersonNode*p=head;while(p){count++;p=p->next;}returncount;}PersonNode*delPerson(PersonNode*head,PersonNode*one){if(head==one){returnhead->next;}PersonNode*p=head;while(p->next!=one&&p->next!=0)p=p->next;if(p->next==one){p->next=one->next;}returnhead;}//注:assert函數用于調試,在調試版本運行中,測試表達式是否為true,是繼續運行,否終止運行在該處,于是可檢查各運行變量,發現錯誤的原因。//////////////////////////////////////////////////////////////////////////////////實習報告規范每個實驗題包括2部分報告,規范如下第一部分編程筆記規范一.遇到的主要問題及采取的解決措施二.編程中經驗、技術技巧。三.測試結果的分析與討論.第二部分程序設計報告規范一.需求分析定義問題,不考慮如何實現、不考慮如何編程,描述系統的功能,系統操作規范,業務28邏輯等。二.界面設計描繪用戶與系統交互的界面,及使用方法。(本書已有描述,可省或不寫)三.數據、函數設計1.定義數據結構定義數據類型,數據間關系,說明數據含義。2.定義函數定義函數返回類型,函數名,函數參數。描述函數功能,參數含義,調用函數的條件,和調用前后狀態的變化。四.函數設計方法、技巧、控制流程圖。1.描述完成一個函數所需要的活動,即流程圖。2.描述對象的狀態遷移過程中的動作、事件。3.描述對象間交互行為中,各函數被調用的先后順序(時序)。4.描述完成一個函數的編程技術。五.描述對象間的關系。整體和部分關系、擁有歸屬關系、父子關系等。辦公樓電梯運行系統UML設計對象類別:主要有:人、電梯、大樓、定時器它們的屬性、行為學生自己分析。系統狀態圖進入/Set等待Timer()等待電梯進入/Push電梯Button()乘電梯[方向=目標方向]在目標樓層/到達進入/Kill等待Timer(),Set走樓Timer()走樓梯[目標!=底樓]/進入大樓[下班且在底樓]進入/Set辦公Timer()辦公//////////////////////////////////////////////////////
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025O2O家政服務O2O戰略合作框架協議書
- 四川三河職業學院《當代書法研究》2023-2024學年第二學期期末試卷
- 腫瘤免疫治療藥物支持行業跨境出海項目商業計劃書
- 體育綜合體管理AI應用行業深度調研及發展項目商業計劃書
- 博物館藝術品投資風險管理平臺企業制定與實施新質生產力項目商業計劃書
- 海南科技職業大學《抽樣調查》2023-2024學年第二學期期末試卷
- 湖南稅務高等專科學校《音樂聲學》2023-2024學年第二學期期末試卷
- 河北工藝美術職業學院《外國文學作品選讀》2023-2024學年第二學期期末試卷
- 會計中級管理制度
- 會議設施管理制度
- JTJ-248-2001港口工程灌注樁設計與施工規程-PDF解密
- T-CACM 1184-2019 中醫內科臨床診療指南 酒精性肝病
- 廣東省佛山市南海區桂城街道2022-2023學年五年級上學期期末英語試卷+
- DB32∕T-1553-2017-高速公路工程工程量清單計價規范
- 政府機關保安服務項目背景及需求分析
- 新媒體視頻節目制作 課件 學習領域2 微電影制作
- 藥品網絡銷售監督管理辦法培訓
- 天車軌道梁加固安全施工方案
- 脫發介紹演示培訓課件
- 初中物理教材插圖原理集錦(回歸教材)
- 2024屆遼寧省沈陽市東北育才校中考沖刺卷物理試題含解析
評論
0/150
提交評論