计算机实习指导书c++_第1页
计算机实习指导书c++_第2页
计算机实习指导书c++_第3页
计算机实习指导书c++_第4页
计算机实习指导书c++_第5页
已阅读5页,还剩39页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1计算机实习(C语言)指导书作者 雷电上海大学 自动化系2计算机实习指导书(C语言)学好一门编程语言,最重要的是进行大量的编程实践。通过计算机C语言实习,把已学过的编程语言知识和操作技能进行综合应用,加深对C语言的语法规范、程序结构以及编程方法和技巧的理解,培养良好的程序设计习惯,提高程序设计水平。在计算机的主流PC机上,由于Windows的广泛应用,基于Windows编程的MicrosoftVisual Studio已经成为主流,Visual C+/C#是程序员选择的主要编程工具,Turbo C等PC机上的C语言编程工具已很少使用。但C语言是C+的基础,且在嵌入式系统中发挥着不可替代的作用,

2、大量的单片机系统支持C语言编程,进行系统而扎实的C语言程序设计实习是非常重要的。考虑到这些,我们采用Visual C+6.0作为编程工具,选择编写Win32 ConsoleApplication类型的C语言程序。编程环境简介1.打开Visual C+6.0运行2.选择菜单file/New.,出现一个选择界面,在Project属性页中选择Win32 ConsoleApplication,然后在Project name文本框中填入一个工程名,如Ex1,在Location文本框中选择存放这一新工程的文件夹,如D:MyProjectEx1,此文件夹下将存放Ex1工程的所有相关文件。3.第2步确定后,出

3、现一个新的选择界面,在此选择A simple application.4.第3步完成后,VC会为你创建Win32 Console Application编程框架,在main()中可编写你的代码。(不要删除框架为你所加的代码,如#include “StdAfx.h”)。5.编程中常常需要创建多个源文件,并添加到工程中,这可以通过选择菜单file/New.,出现一个选择界面,在File属性页中,选择C/C+Header File,用于创建*.h头文件,选择C/C+Source File,用于创建*.c/*.cpp文件,并在File文本框中填入你想创建的文件名,OK.6.工具栏中按纽:Build(F

4、7)编译连接,go(F5)调试运行,!(ctrl+F5)非调试运行,手插入断点。F10单步执行,F11进入函数体,ctrl+F10运行到光标处。实习内容1掌握visual C+ 6.0控制台应用程序开发环境,掌握基本的程序调试技术。2用C语言编6个简单熟悉的覆盖C语言知识的解决实际问题的应用程序. 做一个较复杂的C语言应用程序设计(电梯运行系统)。3每次上机,做好实习笔记,按时间按实习题目记录下实习心得,编程中的问题、经验、技术技巧.4每次上机后, 按工程文件夹组织保存程序代码到软盘或U 盘, 只要保存 .c,.cpp,.h,.dsw,.dsp文件。记住:不能包含Debug子目录文件,否则太大

5、。5撰写实习报告,报告分二部分,第一部分内容为:按时间按实习题目记录整理的实习心得,编程中的问题、经验、技术技巧.第二部分是实验七的程序设计书,用框图、文字说明,写作规范见后。报告要写在正规的统一的实验报告上。3实习题目实验一:计算平均成绩实验内容:输入成绩,计算并显示平均成绩。运行效果:输入3门课程的成绩:69.5 80 90.5平均成绩:80.00退出否?y实验说明:上述显示效果中,下划线数字为用户的输入。当退出否不为y,则重复。初学C语言编程是一个充满挫折的艰难历程,特别是在使用scanf,printf进行数据的输入输出上常常容易出错,挫伤了初学者的积极性,实际上scanf已很少使用。可

6、以使用C+的控制台输入输出流cin、cout 取代scanf,printf,出错机会大为减少,而又更容易理解,cin理解为键盘,cout理解为屏幕。使用方法:1.包含iostream头文件,指定std名空间 2.用从cin输入数据,用向cout输出数据显示,都不必考虑输入输出的数据类型,当同时多个数据输入时,用空格来分隔其多个数据,回车接受输入。例: #include Using namespace std;void main()int a;cina; /* 等价 scanf(%d,&i); */couta; /* 等价 printf(%d,i); */目的要求:熟悉控制台输入输出, for、

7、while、do循环语句的使用。实验二:数据的不同数制显示实验内容:输入小于128的十进制整数,显示其ASCII码字符。输入十六进制整数,显示其十进制整数。输入十进制整数,显示其十六进制整数运行效果:输入小于128的十进制整数:63?输入一个字符:?63输入十六进制整数:0 x1A26输入十进制整数:261A目的要求:理解数字在计算机中的表示。实验三:猜数游戏实验内容:(1)先由计算机“想”一个数请人猜,如果猜对了,则继续猜下一个数,否则计算机给出提示,告诉所猜的数是太小还是太大。(2)当猜对或一个数猜了20次仍未猜中停止本次猜数,仍然继续猜下一个数。(3)计算机记录猜的次数,以此来反映猜数者

8、“猜”的水平。(4)每次运行程序可反复猜多个数,直到操作者停止时才结束。运行效果:20 太大,10 太小,15太大,12 对了!猜4 次成功继续否?n目的要求:本实验用于循环语句、条件语句的编程练习。实验说明:随机数产生头文件stdlib.h ,时间头文件time.h4始初化随机数种子srand(clock(); 或 srand(time(NULL);实验四:兔子生崽实验内容:假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么,如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,以后各月的可有多少对兔子?实验说明:这是13世纪意大利Fibon

9、acci借助民间的“兔子生崽”问题引入的一个著名的递推数列即Fibonacci数列。,采用递推分析法:第0个月兔子对数f(0)=1;第1个月兔子对数f(1)=2;第2个月兔子对数f(2)=3;第n个月兔子对数f(n)=f(n-1)+f(n-2)运行效果:一对兔子开始繁殖,以后各月的兔子对数:不用子函数计算结果:1 2 3 5 8 13 21 34 55 89 144 233用子函数计算结果:1 2 3 5 8 13 21 34 55 89 144 233目的要求:体会递推算法是把科学或工程计算中数学模型转变为计算机运算模型的重要方法。掌握数组、指针的编程,求各月的有多少对兔子用或不用一个子函数

10、实现。以后实验都必须采用模块化的程序设计方法,每个子任务对应一个子函数,完成总任务的程序由一个主函数和若干子函数组成,主函数起任务调度的总控作用。理解模块化程序设计方法,掌握函数的实现、调用编程技术。实验五:学生成绩统计实验内容:从键盘输入一个班(最多30人)的某门课程的学生成绩,当输入为负值时或已达30人时输入结束,分别统计下列内容:1)统计不及格人数并打印其学生名单。2)统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单。3)统计各分数段的学生人数及所占百分比。运行效果:学号 成绩 学号 成绩 学号 成绩 学号 成绩2001 60 2002 80 2003 90 2004 1002

11、005 70 2006 40 2007 80 -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)选课登记2)动态输入学生成绩。3)查询学生成绩。4)修改成绩运行效果: 学生成绩管理系统0新生注册1选课登记2学生成绩输入3成绩查询4修改

12、成绩55退出命令?0学号 姓名2001 李12002 李22003 李3-1学生数据库共有3个个记录继续新的注册? n (注:清屏返回主采单)命令?1课程号:1001输入选择该课程的学生学号:2001 2002 -1共有2个学生选此课程继续新的选课输入? y课程号:1002输入选择该课程的学生学号:2002 2003 -1共有2个学生选此课程继续新的选课输入? n (注:清屏返回主采单)命令?2课程号:1001学号:2001 姓名:李1 成绩:80学号:2002 姓名:李2 成绩:901001课程成绩已输入完成继续其他课程成绩输入? y课程号:1002学号:2003 姓名:李3 成绩:70学号

13、:2002 姓名:李2 成绩:601002课程成绩已输入完成继续其他课程成绩输入? n (注:清屏返回主采单)命令?3学号: 2002姓名:李2 成绩:课程号:0001 成绩:90课程号:0002 成绩:60继续查询?n (注:清屏并返回主采单)命令?4学号:2002 课程号:0001原成绩: 90 成绩修改为:70继续修改? n命令:5 (注:清屏并返回主采单)实验提示:1)清屏方法:包含头文件#include 调用函数system(cls);2)目的要求:本实验是较综合的实习,要求掌握结构体、指针、函数等基本知识,理解链6表的实现技术,理解模块化程序设计方法。实验七:办公楼电梯运行系统实验

14、内容:这是一个规模稍大的软件,它是要编写一个程序,模拟办公大楼中全部电梯的工作过程。这个仿真程序可以用来改善大楼管理,它也可以看成是一种游戏程序。下面让我们对这个系统作一个初步描述:办公大楼有二十层,每层有电梯,同时有步行楼梯;全楼有不多于10部电梯可同时供使用,电梯容量为24人,速度每上下一层需5秒,其运行状态可分:向上、向下、停止,当前乘客数,当前所在层数。它设有一个“按钮数组”,例如第五层的按钮按下,意味着有乘客在第5层到达目标层,等等。在楼的每一层,有当前电梯所在楼层显示,有按钮表示有人等待向上或向下,有若干人在等待,有若干电梯在本层停下,等等。在大楼中(包括进出)的总人数不超过500

15、人,每个人站在电梯前有个目标层,他有一个最大的忍受等待时间,因为他可以选择电梯或是步行走楼梯,等等。若干假设:在每个时间段要进大楼的人数在024之间随机取值;用电梯的每个人的目标层在019之间取值;一个人在进电梯或改走楼梯之前的等待时间在818秒范围内随机发生;一个人到达目标层后第二次再乘电梯中间的工作时间在4068秒间随机取值。以及其他假设。总之,在我们设计仿真程序之前应对整个系统有个比较量化的了解,同时应对整个系统的几方面因素有一定的划分。例如,可以把整个大楼视为系统的整体,在这个系统中运行的有不同类的对象:电梯、电梯集合、人、人的集合,楼层,楼层的集合,大楼。每个对象有他的数据结构,及在

16、此数据集上的操作(函数)。运行效果:办公楼电梯运行系统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按任意键停止实验说明:第一行数字表当前电梯位置,第一列表楼层号及上下按钮是否亮,等待人数,中间区表各个电梯的运行状态(上/下、电梯中的人数)。以下所附实验七源代码是采用面向对象的程序设

17、计思想和事件驱动技术编程的,这是当代程序设计的基本方法,望同学们详细研究,好好体会。附:实验六部分参考源代码(/ 。 / 中间的代码要求自己完成)#include stdafx.h#include #include / 链表结构 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学生成绩管理系统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);/ 。插入到选课链的头节点后/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); /定时器时间到事件处理函数说明extern int done;void iniTimer(); /初始化定时器void timerR

28、un(); /定时器运行/创建定时器,返回定时器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; /楼内总人数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;/电梯内按钮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 /电梯数#define MAXFLOORS 20 /楼层数#define MAXPERSONS 500 /最多人数#define CAPACITY 24 /电梯容量#define TRAVELTINE 2 /层间运行时间#define MAXWAITTIME (5*TRAVELTINE) /最大等待时间int NewPersons(); /每次进入大楼人数int BusinessT(); /连续工作时间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; /定时器数int done=0;struct STimer

36、15int timerID;void *sink;TimerHandle OnTimer; /obj对象的函数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办公楼电梯运行系统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, 楼内总人数:);sprintf(szNum,%d,building.totalPeople);strcat(s,szNum);strcat(s, 走楼梯人数:);int n=getPersonNum(building.pto

46、okStair);sprintf(szNum,%d,n);strcat(s,szNum);strcat(s, 电梯平均人数:);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() /每次进入大楼人数int n=(MAXPERSONS-building.totalPeople);if(n=0)return 0;n=rand() % 8;return n;24int BusinessT()ret

54、urn 40+(rand()%18); /连续工作时间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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论