模拟电梯问题实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电梯模拟问题
一、目的与要求
1. 掌握线性结构的逻辑特点及存储实现;
2. 根据选题,按规范化流程完成课程设计报告:
⑴.提供需求分析。(15分)
⑵.列出概要设计。(包括:抽象数据类型的描述;程序结构图或功能模块图)(20分)
⑶.给出详细设计。(包括:①存储结构的描述;②算法的详细设计,对复杂算法,最好画出其N-S流程图;③函数的调用关系图)(30分)
⑷.进行调试分析(注:调试时遇到的问题及解决方法,程序的输出结果及对结果的分析)。(15分)
⑸. 整理设计总结。(设计心得体会,以及其他总结信息等)(10分)
⑹.附有程序清单(注:代码可具有适当注释,用来说明程序的功能、结构)。(10分)
二、设计步骤
1、线性结构是有序数据元素的集合,存在着“一对一”的线性关系且只有一
个首结点,一个尾结点,首结点只有后继没有前趋,尾结点只有前趋没有后继。顺序表的存储结构包括顺序表和链表,顺序存储是指将线性表元素按照逻辑顺序依次存储在一组连续的地址单元中。链式存储是通过结点中的链域将线性表中n个结点按其逻辑顺序链接在一起。分为:单向链表,双向链表,循环链表。
2、(1)设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是
乘客和电梯等“活动体”够成的集合,虽然他们彼此交互作用,但是他们的行为是基本独立的。在离散的模拟中,一模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。可模拟某校五层教学楼的电梯系统,或者九层教学楼的电梯系统。
此程序的关键是模拟好电梯运行状态的转换与乘客进出的同步进行,需要一个函数判断电梯的运行状态,决定电梯的下一个运行状态如电梯的开门,关门,上升,下降,减速,加速等,也需要模拟时钟的函数来判断该运行哪个函数,也需要定义几个结构体存放结点信息。
(2)时钟函数:
void DoTime()
{
//此函数用于模拟时钟
while(1)
{
if(Time>MaxTime)
return;
TestPeople();//两个始终都会被调用的函数
Controler();
struct Activity* p=activity.next;
if(p==NULL)
{
Time=MaxTime;
}
if(p&&Time>=p->time)
{//取出活动队头的,检测定时是否到了
activity.next=p->next;
p->fn();
free(p);
}
Time++;
}
}
其中activity是关键,它是一个链表在链表的头部是计时器时间最小的函数,根据模拟时钟判断是否调用这个函数以及删除这个节点。以下是Activity的具体定义:
typedef struct Activity
{
int time;
void(*fn)(void);
struct Activity* next;
}Activity;
定义说明:
#ifndef _DIANTI_H_
#define _DIANTI_H_
#define GoingUp 1//匀速上升
#define GoingDown 2//匀速下降
#define SpeedUp 3//加速上升
#define SpeedDown 4//加速下降
#define SlowUp 5//减速上升准备停靠
#define SlowDown 6//减速下降准备停靠
#define Idle 7//空闲
#define Stop 8//停止且已关门
#define DoorOpen 9//停止且门已打开
#define DoorOpening 10
#define DoorCloseing 11
#define CloseTest 40//电梯关门测试时间
#define OverTime 300//电梯停候超时时间
#define Accelerate 15//加速时间
#define UpTime51//上升时间
#define DownTime 61//下降时间
#define UpDecelerate 14//上升减速
#define DownDecelerate 23//下降减速
#define DoorTime20//开门关门时间
#define InOutTime25//进出电梯时间
#define MaxTime 10000
#define MaxFloor 5
#define BaseFloor 1
程序框图:
开始
Input()
Dotime()
结束
(3)存储结构描述:
此代码采用单链表的存储结构,结点存放起始楼层、目标楼层、容忍时间、下一个用户的到来时间等信息。
typedef struct Person
{
int Id;
int OutFloor;
int GiveupTime;
struct Person* next;
}Person;
N-S流程图:
Input():
开始
Person* p = (Person*)mallo c(sizeof(Person
输入用户信息
判断输入信息是否合
p->Id=PersonId ++;
Whil e (1) 否
是
否
是 p->GiveupTime=giveuptime+Time
p->next=NULL;
p->OutFloor=ou tfloor;