数据结构课程设计报告--电梯模拟
- 格式:doc
- 大小:497.00 KB
- 文档页数:29
问题描述:模拟某校九层教学楼的电梯系统。
该楼有一个自动电梯,能在每层停留。
九个楼层由下至上依次称为地下一层、第一层、第二层、……第八层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。
乘客可随时地进出于任何层。
对于每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
模拟时钟从0开始,时间单位为0.1秒。
人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t检测一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层精致时间超过300t,则驶回1层候命。
基本要求:按时序显示系统状态的变化过程,即发生的全部人和电梯的动作序列。
需求分析:(1)用系统计时,每当有新的动作要输入时要暂停计时,等输入完成后即可继续计时。
(2)输入各个动作,最后,输入完毕后,可以保存所有动作序列,并有序输出。
设计:设计思想(1)存储结构根据问题描述,可采用单链表结构。
结点描述:定义如下:typedef struct Node{char a[1000];//信息int mytime;//时间struct Node *next;}SLNode;(2)基本思想a.用time.h 里面的clock()来计时,当有输入时,记录下开始输入的时间和结束输入的时间,之后就可以算出动作的时间了。
b.将各个动作发生的时间进行处理,算出每个事件的发生顺序和时间。
c.将各个数据插入链表,即可实现题目要求。
设计表示法(1)过程或函数调用的关系图mainyunxingprintListInsertLinListSort各个动作函数(n个)ge)ListInitiat eDestroy(2)基于数据结构的操作组主要在于yunxing()函数,它将各个时间动作处理成时间事件,并将事件插入到链表中。
(3)过程与接口规格说明无实现注释未实现。
随着城市化进程的加快,电梯作为一种重要的交通工具,其安全性和智能化程度日益受到重视。
为了让学生更好地了解电梯的工作原理、控制方法及维护保养,本课程设计旨在通过模拟电梯运行,让学生在理论与实践相结合的过程中,掌握电梯相关知识和技能。
二、课程目标1. 理解电梯的基本组成和工作原理;2. 掌握电梯控制系统的编程方法;3. 熟悉电梯的维护保养流程;4. 培养学生的创新思维和团队协作能力。
三、课程内容1. 电梯基本知识(1)电梯的组成及工作原理;(2)电梯的驱动方式及控制系统;(3)电梯的运行参数及安全标准。
2. 电梯控制系统设计(1)PLC编程基础;(2)电梯控制系统的硬件设计;(3)电梯控制系统的软件设计;(4)电梯控制系统的调试与优化。
3. 电梯维护保养(1)电梯的日常维护保养;(2)电梯的故障排除及应急处理;(3)电梯的定期检修与维护。
1. 教学方法(1)理论教学:采用多媒体教学手段,结合实物展示,使学生了解电梯的基本知识;(2)实践教学:通过模拟电梯运行,让学生亲自动手操作,掌握电梯控制系统的编程、调试与优化;(3)项目教学:以实际电梯为例,让学生参与电梯维护保养的全过程,提高学生的实际操作能力。
2. 教学过程(1)课堂讲授:教师讲解电梯基本知识、控制系统设计及维护保养等内容;(2)实验操作:学生在教师指导下,完成电梯控制系统的编程、调试与优化;(3)项目实践:学生分组进行电梯维护保养,完成项目任务。
五、课程评价1. 课堂表现:学生出勤率、课堂纪律及参与度;2. 实验操作:学生完成电梯控制系统的编程、调试与优化情况;3. 项目实践:学生参与电梯维护保养的项目完成情况;4. 期末考核:理论考试、实践操作考核及项目答辩。
六、课程总结通过本课程设计,学生能够全面了解电梯的相关知识,掌握电梯控制系统的编程、调试与优化方法,以及电梯的维护保养流程。
同时,培养学生的创新思维和团队协作能力,为今后从事电梯行业打下坚实基础。
电梯模拟程序课程设计一、课程目标知识目标:1. 让学生理解电梯的工作原理,掌握电梯运行的模拟编程知识。
2. 使学生掌握利用流程图描述电梯运行逻辑的方法。
3. 帮助学生理解并运用条件语句和循环语句实现电梯模拟程序。
技能目标:1. 培养学生运用编程语言(如Scratch或Python)编写简单电梯模拟程序的能力。
2. 培养学生通过流程图分析问题、解决问题的能力。
3. 提高学生团队协作、沟通交流的能力。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发学生主动探索新知识的热情。
2. 培养学生严谨、细心的学习态度,增强面对困难的勇气和毅力。
3. 培养学生遵守程序设计规范,养成良好的编程习惯。
课程性质:本课程为信息技术学科的课程,以项目式学习为主,注重实践操作和团队合作。
学生特点:学生为五年级学生,具备一定的信息技术基础,对新事物充满好奇,喜欢动手操作。
教学要求:教师需引导学生通过自主探究、小组合作等方式完成课程内容,注重培养学生的实践能力和创新精神。
同时,关注学生的个体差异,提供有针对性的指导。
通过本课程的学习,使学生能够达到上述课程目标,实现具体的学习成果。
二、教学内容1. 电梯工作原理介绍:包括电梯的基本结构、运行原理、信号控制系统等,让学生对电梯的运行机制有整体认识。
2. 编程语言基础:回顾并巩固Scratch或Python编程语言的基础知识,如变量、列表、条件语句、循环语句等,为编写电梯模拟程序打下基础。
3. 流程图设计:学习如何利用流程图描述电梯运行的逻辑过程,分析电梯运行中的各种情况,并进行流程图设计。
4. 电梯模拟程序编写:根据流程图,运用所学编程知识,分组合作编写电梯模拟程序,实现基本的运行、停止、开门、关门等功能。
5. 程序调试与优化:指导学生如何调试程序,发现并解决程序中的问题,提高程序的稳定性和运行效率。
教学内容安排和进度:第一课时:电梯工作原理介绍,回顾编程语言基础知识。
第二课时:学习流程图设计,分析电梯运行逻辑。
电梯模拟问题一、目的与要求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是关键,它是一个链表在链表的头部是计时器时间最小的函数,根据模拟时钟判断是否调用这个函数以及删除这个节点。
课程设计实验报告课程名称__数据结构__题目名称电梯模拟专业班级学号学生姓名指导教师_2011 年1 月日一、需求分析及实现提示[需求分析](1)、模拟某校五层教学楼的电梯系统。
该楼有一个自动电梯,能在每层停留。
五个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来该层候命。
(2)、乘客可随机地进出于任何层。
对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
(3)、模拟时钟从0开始,时间单位为0.1秒。
人和电梯的各种动作均要耗费一定的时间单位(简记为t):有人进出时,电梯每隔40t测试一次,若无人进出,则关门关门和开门各需要20t每个人进出电梯均需要25t如果电梯在某层静止时间超过300t,则驶回1层候命。
(4)、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。
[实现提示](1)楼层由下至上依次编号为0,1,2,3,4。
每目有要求Up(上)和Down(下)的两个按钮,对应l0个变量CallUp[0..4]和CallDown[0..4]。
电梯内5个目标层按钮对应变量CallCar[0..4]。
有人按下某个按钮时,相应的变量就置为1,一旦要求满足后,电梯就把该变量清为0。
(2)电梯处于三种状态之一:GoingUp(上行)、GoingDown(下行)和IdIe(停候)。
如果电梯处于IdIe状态且不在1层,则关门并驶回1层。
在1层停候时,电梯是闭门候命。
一旦收到往另一层的命令,就转入GoingUp或GoingDown状态,执行相应的操作。
(3)用变量Time表示模拟时钟,初值为0,时间单位(t)为0.1秒。
其他重要的变量有:Floor——电梯的当前位置(楼层);D1——值为0,除非人们正在进入和离开电梯;D2——值为0,如果电梯已经在某层停候300t以上;D3——值为0,除非电梯门正开着又无人进出电梯;State——电梯的当前状态(GoingUp,GoingDown,IdIe)。
数据结构(Python课程)课程项目2-1(电梯系统模拟)(北京大学数学学院,2014年11月20日)本项目要求以项目组为单位独立完成下面工作。
一个项目组由两位同学组成,12月5日前将完成的程序和所写报告(打包)提交辅导老师。
评分要求包括:1. 所提交的程序应该完整,包括一个demo程序(演示程序)展示所开发系统的情况;程序的模块划分和采用的数据结构合理,代码清晰,格式合适,易读易理解;2. 所提交报告对项目工作描述应清晰准确,说明为什么采用有关的结构设计,其中的想法和解决的问题等;报告应包含对所完成的项目的分析,考虑其优点和缺点;3. 在用Python完成这一项目过程中的体会和遇到的困难(本条不作为强制性要求);4. 其他要求见下面项目说明。
项目描述:请开发一个简单的电梯模拟系统,具体要求如下:假设电梯所在的建筑共计4层(例如,就是目前数学学院所在的一号楼),从地面层(按习惯称1楼)直至最上层(4楼)。
这里的4应该是一个参数,可以修改。
例如可以方便地转去模拟7层楼的电梯(如信息科学技术学院那边)。
每层电梯门边有一个上行按钮和一个下行按钮,最下层和最上层只有一个按钮。
电梯里有一组按钮,供乘电梯人选择目标楼层。
电梯从一层到其相邻层需要k秒时间。
乘客按一定时间间隔到达某楼层,按电梯门边按钮表示要求上行或下行。
乘客到达的时间间隔是区间 [a, b] 里的某个随机值,到达楼层是 [1, 4] 中的随机值。
乘客进电梯后选择搭乘的目标楼层(随机值)。
乘客在电梯到达其目标楼层后离开电梯。
我们希望模拟N秒的电梯运行情况,并在模拟中做一些统计。
考虑下面的数据统计:模拟期间完成服务的共计人数;平均等电梯时间;电梯的平均负荷人数(请提出一种适当的统计方法);其他有意义的统计结果(自己考虑)。
项目要求:根据题目要求设计并实现所需的功能,1,设计所需的数据结构,根据需要定义有用的类(class)。
例如,用什么数据结构表示乘客、电梯、按钮等,模拟中的各种事件,怎样把它们组织起来形成完整的系统;2,可以参考课堂上给的实例,采用类似的实现技术。
数据结构——电梯模拟的报告数据结构——电梯模拟的报告1. 简介本文档将介绍电梯模拟的实现过程和基本原理。
通过模拟电梯的行为,我们可以更好地理解数据结构在实际应用中的作用和效果。
2. 问题描述在楼房中,电梯通常被用来运送乘客。
电梯内部有多个按钮,表示不同楼层的乘客需求。
乘客可以按下按钮来请求乘坐电梯到达特定楼层。
电梯的运行顺序应该是合理的,比如不会从高楼层下降到低楼层。
本模拟的电梯系统需要满足以下要求:- 电梯能接收来自乘客的请求。
- 电梯能根据请求的楼层,按照合理的顺序运行,将乘客送到目标楼层。
- 当电梯到达目标楼层,乘客可以进入或离开电梯。
- 电梯需要实时更新运行状态,如目标楼层、当前楼层等。
3. 数据结构设计为了实现电梯模拟,我们需要设计合适的数据结构来存储电梯的状态和乘客请求。
以下是我们设计的关键数据结构:3.1 电梯状态电梯的状态包括当前楼层、目标楼层和运行方向等信息。
我们可以使用一个结构体来表示电梯的状态:```c++struct ElevatorState {int currentFloor;int targetFloor;Direction direction;};```其中,`currentFloor`表示当前所在楼层,`targetFloor`表示目标楼层,`direction`表示电梯的运行方向。
3.2 乘客请求乘客请求包括乘客所在楼层和目标楼层。
我们可以使用一个结构体来表示乘客请求:```c++struct Request {int fromFloor;int toFloor;};```其中,`fromFloor`表示乘客所在楼层,`toFloor`表示目标楼层。
3.3 电梯控制器电梯控制器用于管理电梯的状态和乘客请求。
我们可以使用一个队列来存储乘客请求,使用一个变量来保存电梯的当前状态。
以下是电梯控制器的设计:```c++class ElevatorController {private:std::queue<Request> requests;ElevatorState state;public:void addRequest(Request request);void processRequests();};```其中,`addRequest`方法用于添加乘客请求到队列中,`processRequests`用于处理乘客请求并控制电梯的运行。
[目录1.引言 ...................................................... 错误!未定义书签。
2.需求分析................................................... 错误!未定义书签。
3. 概要设计.................................................. 错误!未定义书签。
数据结构描述............................................. 错误!未定义书签。
模块设计................................................. 错误!未定义书签。
电梯的模拟流程图......................................... 错误!未定义书签。
4详细设计及实现............................................. 错误!未定义书签。
%全局变量的定义........................................... 错误!未定义书签。
人具体情况的定义......................................... 错误!未定义书签。
队、栈的类型............................................. 错误!未定义书签。
.电梯类型................................................ 错误!未定义书签。
系统类的定义............................................. 错误!未定义书签。
5.调试分析................................................... 错误!未定义书签。
东北大学信息科学与工程学院数据结构课程设计报告题目电梯运行模拟课题组组长盛川课题组成员彭斌华尹泽阳杨箭王帅专业名称计算机科学与技术班级计1005指导教师孟凡荣2012 年6月课程设计任务课题任务分工目录课题一1 课题背景 (6)1.1 课题来源 (6)1.2 课题任务 (6)1.3 课题原理 (6)1.4 课题调研 (6)2 需求分析 (6)2.1 业务(用户)需求 (6)2.2 功能需求 (7)3 方案设计 (7)3.1 总体(功能)设计 (7)3.2 数据结构设计 (8)3.3 接口函数原型设计 (8)3.4 界面设计 (8)3.5 主算法设计 (8)4 方案实现 (8)4.1 开发环境与编程工具 (8)4.2 程序设计关键技术 (8)4.3 数据结构类实现 (8)4.4 接口函数实现 (8)4.5 界面设计实现 (9)4.6 主算法实现 (9)5 测试与运行 (9)5.1 测试方案 (9)5.2 数据结构测试 (10)5.3 模块测试 (10)5.4 组装测试 (10)5.5 系统测试 (10)5.6 系统运行 (10)6 用户手册(可选) (11)6.1 运行环境说明 (11)6.2 操作说明 (11)7 课题总结 (11)7.1 课题评价 (11)7.2 设计心得 (12)8 附录A(组员分课题报告) (13)8-1 盛川分课题报告 (13)8-2 彭斌华分课题报告 (20)8-3 尹泽阳分课题报告 (29)8-4 杨箭分课题报告 (32)8-5 王帅分课题报告 (37)9 附录B(源程序文件清单) (42)9-1 .H头文件清单 (42)9-2 .CPP文件清单 (42)10 附录C(光盘)10-1 课程设计报告(电子版)10-2 源程序代码(*.H,*.CPP)10-3 可执行打包文件(EXE文件,可选)1 课题背景1.1课题来源东北大学综合办公楼有14层,设有4部自动电梯。
每梯最多载客12人。
电梯程序模拟课程设计一、课程目标知识目标:1. 理解电梯的基本工作原理,掌握电梯程序设计的关键概念;2. 学会使用流程图和伪代码表达程序设计思路;3. 掌握运用顺序、选择和循环结构进行电梯程序设计。
技能目标:1. 能够运用所学知识,设计出符合实际需求的电梯程序;2. 通过编程实践,提高逻辑思维和问题解决能力;3. 学会与同伴合作,进行程序调试和优化。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发创新精神;2. 培养学生面对问题时的耐心和毅力,增强克服困难的信心;3. 增强学生的团队协作意识,培养良好的沟通与表达能力。
分析课程性质、学生特点和教学要求,本课程目标旨在使学生在理解电梯工作原理的基础上,通过学习程序设计方法,培养其逻辑思维和问题解决能力。
课程将引导学生从实际需求出发,学会分解问题、设计算法,并通过编程实践,实现电梯程序的模拟。
通过本课程的学习,学生将能够将所学知识应用于实际情境,提高其编程技能,并在团队合作中培养良好的沟通与协作能力。
二、教学内容1. 电梯工作原理介绍:分析电梯的基本结构、运行模式和控制系统;- 教材章节:第二章“自动控制系统原理”,第三节“电梯控制系统”。
2. 程序设计基本概念:流程图、伪代码及其在电梯程序设计中的应用;- 教材章节:第四章“程序设计基础”,第一节“流程图与伪代码”。
3. 程序设计结构:顺序结构、选择结构、循环结构在电梯程序设计中的应用;- 教材章节:第四章“程序设计基础”,第二节“程序设计结构”。
4. 电梯程序设计实践:- 任务一:设计一个简单的电梯召唤程序;- 任务二:设计一个具有楼层选择功能的电梯程序;- 任务三:优化电梯程序,实现连续召唤和节能控制。
5. 团队合作与程序调试:分组进行程序设计,相互协作完成程序调试与优化;- 教材章节:第五章“程序调试与优化”,第一节“团队合作与问题解决”。
教学内容安排与进度:第一课时:电梯工作原理介绍,程序设计基本概念;第二课时:程序设计结构,任务一设计;第三课时:任务二设计,团队合作与程序调试;第四课时:任务三优化,总结与展示。
课程设计课程名称数据结构题目名称 2.8电梯模拟(难度5) 学生学院计算机学院专业班级 XXXXXXXXXX 学号XXXXXXXX学生姓名 XXX 指导教师 XX2013年7月4日电梯模拟系统一、简单介绍1、问题描述设计一个电梯模拟系统,这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的,在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。
2、基本要求(1)、模拟某校五层教学楼的电梯系统。
该楼有一个自动电梯,能在每层停留。
五个楼层由下至上依次称为地下层、第一层、第二层、第三层,第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。
(2)、乘客可随机地进出于任何层。
对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
(3)、模拟时钟从0开始,时间单位为0.1秒。
人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层侯命。
(4)、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。
二、设计目的当初之所以选择做电梯模拟这个课题,主要是因为觉得当今时代需要,所以觉得想尝试一下,因为为了方便,我们都会选择乘坐电梯,既省时间又省力,粗略看了书本里面的描述,觉得应该不难,只是按照要求输出动作序列即可,后来经过老师的辅导,才发现,原来自己选了个最难的课程设计,也问了同学,很多都是因为太难了才没有选这个题目,因为它远比想象中的复杂的多很多,它实际上是模拟现实中的电梯的运行状况,因此要考虑很多现实中遇到的实际情况,坐过电梯的人都会应该有点印象,现实中的电梯是按照每个人按下按钮的时间顺序进行服务的,但是,并不是将一个人接进来后就直接开往其目的楼层就完事,其实,当电梯将某个人送往其目的楼层的过程中,经过某层时,如果此层的人也要用电梯,虽然其按按钮的时间有可能比先前那个人晚,但是电梯依旧会开门将其接入,然后继续送前一个人去目的地,之后再送这个人去他的目的楼层,如果有多人在电梯中时,也是按照申请时间的先后决定先去哪层的,同理,若在某层,电梯中的某个人,或者某几个人要在该层下,电梯也不能忽略这些,而是要先开门使要下的人出去,之后继续开往先前的楼层,所以设计时,每当电梯上升或下降一层后,都应该检测现在电梯所处的这层有没有人有用电梯的请求,或者电梯中的人有没有要在该层下的情况,若有则电梯要在该层停一下,否则继续上升或下降….此外,当电梯停在某一层时不外乎三种情况:1.此层有个人{或有几个人}等候要用电梯 2.电梯中的某个人或者某几个人要在该楼层下 3.则是前面两种情况的结合,此时情况相当复杂,因为,题目要求电梯开门和关门都要消耗一定的时间(题目中没有提电梯上升或者下降一层需要多少时间,所以不妨就假定为30t),而且人进电梯和人出电梯时也要消耗一定的时间,这说明了当同一时刻有至少两个以上的人要进行同一种动作的时候(比方说都是要出电梯,或都是在某一层等电梯,电梯来了后都要进去),但是因为每个人进出电梯都要消耗时间,所以不能单纯的同时让这些人同进或同出电梯,而是要有先后顺序的进出,此为其一………其二,题目中还提到每个人等候电梯到来时,都有一个容忍时间(每个人不一定相同),所以,万一,在他按下按钮到电梯开到他所在的那层楼的间隔时间大于他的最大容忍时间,他会先行离开,但这一切电梯并不知道啊,所以电梯依旧会按照每个申请使用电梯的时间进行服务,正是因为这样,极有可能发生这样的情况:电梯开到某层后打开电梯门,但是既没有人出去,也没有人进来………其三,根据题目中的要求,当电梯停在某层时候,有人进出,电梯每隔40t测试一次,若无人进出,则关门,关门完后,若300t时间内没有人使用,则自动开到第1层等候下次的使用(第1层楼是电梯的‘本垒层’,电梯“空闲”时,将来到该层候命)等等等等…………以上各种情况(还有一些情况这里没列举)都是要在做这道题时需要考虑的,否则这题的‘电梯’根本模拟不起来三、设计概要本程序中所有的抽象数据类型的定义及其相应的操作函数的定义如下:电梯的结构体dianti/*此电梯结构体中分别定义了电梯所在楼层,电梯的现有人数(现实中的电梯有个最大栽客量,在此题中不妨规定为最大12人),以及电梯门的状态(0为关,1为开),至于为什么定义电梯门的状态,并不是多此一举,而是我在调试的过程中发现必须加上的,否则,在一些情况下会出现电梯动作的局部重复,从而导致整个程序的失败*/人的结构体man/*在人的结构体中,分别定义了人的名字(这个有利于区别各个人),最大容忍时间(题目中的要求),所在的楼层,要去的目的楼层,两个标志位,其中一个标志记录该人是否还在电梯里面,另一个标志记录的是该人是否已经使用过电梯*/事件结构体结点SLNode/*在事件的结构体中分别定义了,事件信息,事件发生的时刻,以及指向下一个事件结构结点的指针*/void ListInitiate(SLNode**head)/*初始化链表*/void LinListSort(SLNode *head)/*用按发生时间的顺序给事件链表中的事件排序*/void Destroy(SLNode * *head)/*撤消链表*/void OPEN(SLNode *head,dianti dt,int now)/*电梯开门函数,将电梯开门的事件信息插入到事件链表中去*/void CLOSE(SLNode *head,dianti dt,int now)/*电梯关门函数,将电梯关门的事件信息插入到事件链表中去*/void GET_IN(SLNode *head,dianti dt,int now)/*人进电梯的函数,将人进电梯时候的各种信息插入到事件链表中去*/void GET_OUT(SLNode *head,dianti dt,int now)/*人出电梯的函数,将人出电梯时候的各种信息插入到事件链表中去*/注释:以上四个函数基本是用来完成人和电梯的动作序列int gettime(SLNode *head)/*返回最新事件(即事件涟表最后一个结点)的发生时间,此为该程序中最重要的一个函数之一,并且为调用最频率最高的一个函数*/void print(SLNode *head)/*将事件链表中的事件一一显示出来,即为最后显示电梯和人动作序列的函数*/void Go(SLNode *head,int n,dianti dt,clock_t s[1000],man r[1000])/*电梯运行函数,本程序中最最重要的函数,可以说这是这道程序中的灵魂函数,根据申请使用电梯的所有人的信息,以及所有事件发生时的时刻,将所有情况的处理都放在在其中,所以此函数的代码相当占了程序代码的百分之七十多了(程序总代码长度超过1200行)*/ 注释:以上各个函数以及抽象数据结构的定义都放在头文件”elevator.h”中void main()/*该程序的主函数*/程序流程图如下:四、详细设计本程序的所有抽象数据类型的具体实现一机相应的操作函数的伪算法如下:typedef struct{int lc;//电梯所在楼层int rs;//电梯中的人数,规定最大乘坐人数为12int door;//门的状态0关1开}dianti;typedef struct{char name[50]; //这个人的名字或序号(以示区别)int rrsj;//一个人的容忍时间int lc;//所在楼层int md;//目的楼层int biaozhi; //此标志位记录人使用电梯是否完成或者是否离去,为1表明使用过(离去),否则为0int in; //标志位,为1时表明人在电梯中,否则为0}man;typedef struct Node{char a[1000];//事件信息int mytime;//事件所发生的时间struct Node *next;}SLNode;//初始化链表void ListInitiate(SLNode* *head){if((*head = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);(*head)->next = NULL;}//将事件结点插入到事件链表中的第i个位置中去int ListInsert(SLNode *head,int i,char a[1000],int t){SLNode *p,*q;int j;p=head;j=-1;while(p->next!=NULL && j<i-1){p=p->next;j++;}if(j!=i-1){printf("\n 插入位置参数错!\n");return 0;}if((q=(SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);q->mytime = t;strcpy(q->a,a);q->next =p->next;p->next =q;return 1;}//用按发生时间的顺序给事件排序void LinListSort(SLNode *head){SLNode *curr,*pre,*p,*q;p=head->next;head->next=NULL;while(p!=NULL){curr=head->next;pre=head;while(curr!=NULL && curr->mytime<=p->mytime){pre=curr;curr=curr->next;}q=p;p=p->next;q->next=pre->next;pre->next=q;}}//销毁链表void Destroy(SLNode * *head){SLNode *p,*p1;p=*head;while(p!=NULL){p1=p;p=p->next;free(p1);}*head = NULL;/*电梯动作:1.开始开门,20t,开门结束;2.开始关门,20t,关门结束;3.从n-1层开始移动,30t,到达第n层;4.开始等待,有人来或者300t,等待结束;人的动作:1.开始等待,x<=最大容忍时间,等待结束;2.开始进门,25t,进门结束;3.开始出门,25t,出门结束;*///电梯开门void OPEN(SLNode *head,dianti dt,int now){char a[1000]={"电梯开始开门......"},b[1000]={"开门完毕!"};ListInsert(head,g,a,now);g++;ListInsert(head,g,b,now+20);g++;dt.door=1; //门的状态为开}//电梯关门void CLOSE(SLNode *head,dianti dt,int now){char a[1000]={"电梯开始关门......"},b[1000]={"关门完毕!"};ListInsert(head,g,a,now);g++;ListInsert(head,g,b,now+20);g++;dt.door=0; //门的状态为关}//人进电梯void GET_IN(SLNode *head,dianti dt,int now){char a[1000]={"人开始进门......"},b[1000]={"已经进入!"};ListInsert(head,g,a,now);g++;ListInsert(head,g,b,now+25);g++;dt.rs++; //电梯人数加一个}//人出电梯void GET_OUT(SLNode *head,dianti dt,int now){char a[1000]={"人开始出门......"},b[1000]={"已经出门!"};ListInsert(head,g,a,now);g++;ListInsert(head,g,b,now+25);g++;dt.rs--; //电梯中的人数减一个}//返回最新事件(即事件涟表最后一个结点)的发生时间int gettime(SLNode *head){SLNode *pre,*curr;curr=head->next;pre=head;while(curr!=NULL){pre=curr;curr=curr->next;}return pre->mytime;}//电梯运行函数void Go(SLNode *head,int n,dianti dt,clock_t s[1000],man r[1000]){int k=0,i,time,m,flag=0,counter=0; //flag 记录是否有多个人在同一层或去同一层楼for(i=0;i<n;i++){if(dt.door==0){ //初始电梯门状态为关着if(dt.lc==r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0){//人在该楼层,要进去电梯,且电梯人数不超过规定的12人if(i==0) time=s[i]/100; //记录当时时间else time=gettime(head);if(flag==0&&dt.door==0){OPEN(head,dt,time); //开门dt.door=1;}if((time-s[i]/100)<=r[i].rrsj){time=gettime(head);GET_IN(head,dt,time); //若超过此人的最大容忍时间,该人将放弃乘坐电梯r[i].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d 层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}time=gettime(head); //获得事件链表最后一个结点的时间(即当前时刻)if(dt.lc==r[i+1].lc) {flag=1;counter++;continue;} //该层的所有人都进入电梯else{if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40); //电梯经过40t时间后,若无人进出,则关门dt.door=0; //置电梯门状态为关g++;CLOSE(head,dt,time+40);}}/* 本层人已经全部进入电梯,接下来电梯启动按每个人事件发生的时间顺序将其送往目的楼层*/flag=0;if(dt.lc<=r[i-counter].md){time=gettime(head);while(dt.lc<=r[i-counter].md){ //开往该层第一个人的目的楼层flag=0;if(dt.lc<r[i-counter].md){dt.lc++;time+=30;}for(m=0;m<n;m++){if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){//若该楼层有人等候,使其进入if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;//电梯开门,并设置其门状态为开}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i-counter].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40); //电梯经过40t时间后,若无人进出,则关门dt.door=0;//置电梯门状态为关g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}else if(dt.lc>=r[i-counter].md){time=gettime(head);while(dt.lc>=r[i-counter].md){flag=0;if(dt.lc>r[i-counter].md){dt.lc--; //30t,电梯下降一层time+=30;}for(m=0;m<n;m++){if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){ //若该楼层有人等候,使其进入if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i-counter].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}i=i-counter;}else if(dt.lc==r[i].md&&r[i].biaozhi==0&&r[i].in==1){ //人在电梯中,在该楼层要出去if(i==0)time=s[0]/100;else time=gettime(head);for(m=0;m<n;m++){if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){ //若该楼层有人等候,使其进入if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}//1...if(dt.lc==r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0) ,,,,人在该楼层,要进去电梯//2...else if(dt.lc==r[i].md&&r[i].biaozhi==0&&r[i].in==1),,,,,,,,,,人在电梯中,在该楼层要出去//3...else if(dt.lc!=r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0),,,,,,,,,,,人不在该楼层,要进去电梯//4...else if(dt.lc!=r[i].md&&r[i].biaozhi==0&&r[i].in==1),,,,,,,,,,,人在电梯里,该楼层不是其目的楼层else if(dt.lc!=r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0){ //3...人不在该楼层,要进去电梯flag=0;if(i==0)time=s[0]/100; //以该事件发生的时间为起始时间else time=gettime(head); //取当前时间if(dt.lc<=r[i].lc){while(dt.lc<=r[i].lc){flag=0;if(dt.lc<r[i].lc){dt.lc++;time+=30;//30t,电梯上升一层}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}elseif(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯elseif(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].lc) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}else if(dt.lc>=r[i].lc){while(dt.lc>=r[i].lc){flag=0;if(dt.lc>r[i].lc){dt.lc--;time+=30;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}elseif(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯elseif(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].lc) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}/*接下来将电梯里的人按时间顺序送到各自的目的楼层*/time=gettime(head);if(dt.lc<=r[i].md&&r[i].in==1){while(dt.lc<=r[i].md){flag=0;if(dt.lc<r[i].md){dt.lc++;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}elseif(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯elseif(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}else if(dt.lc>=r[i].md&&r[i].in==1){while(dt.lc>=r[i].md){flag=0;if(dt.lc>r[i].md){dt.lc--;time+=30;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}elseif(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯elseif(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}}//1...if(dt.lc==r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0) ,,,,人在该楼层,要进去电梯//2...else if(dt.lc==r[i].md&&r[i].biaozhi==0&&r[i].in==1),,,,,,,,,,人在电梯中,在该楼层要出去//3...else if(dt.lc!=r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0),,,,,,,,,人不在该楼层,要进去电梯else if(dt.lc!=r[i].md&&r[i].biaozhi==0&&r[i].in==1){ //4...人在电梯里,该楼层不是其目的楼层flag=0;if(i==0)time=s[0]/100; //以该事件发生的时间为起始时间else time=gettime(head); //取当前时间if(dt.lc<=r[i].md){while(dt.lc<=r[i].md){flag=0;if(dt.lc<r[i].md){dt.lc++;time+=30;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}else if(dt.lc>=r[i].md){while(dt.lc>=r[i].md){flag=0;if(dt.lc>r[i].md){dt.lc--;time+=30;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}}}}time=gettime(head);if(dt.lc!=1){ListInsert(head,g,"在该层等候300t时间,无人进出,开始返回第一层",time+300);time=gettime(head);if(dt.lc>1){ListInsert(head,g,"电梯已经回到第一层,等候使用......",time+(dt.lc-1)*30);}else {ListInsert(head,g,"电梯已经回到第一层,等候使用......",time+30);}dt.lc=1;}else{time=gettime(head);ListInsert(head,g,"此时电梯已经在第一层,等候使用......",time);}}void print(SLNode *head){SLNode *p;p=head;if(p->next==NULL)printf("\n 错误,链表为空!\n");//此语句为检验之用while(p->next!=NULL){printf("\n时间:%d(单位:t) 动作:%s",p->next->mytime,p->next->a);p->next=p->next->next;}}//欢迎界面void Welcome(){char c;printf("\n\n\n******************************************************************************\ n");printf("______________________________________________________________________________\ n\n\n\n\n");printf(" ______________ 欢迎使用这个关于电梯模拟的软件! _______________\n");printf(" ______________ 制作者:XXX _______________\n");printf(" 班级:XXX 学号:XXXX \n\n");printf("\n\n\n________________________________________________________________~((M o M))~\n\n");printf("******************************************************************************\ n\n\n");printf(" Please input any key to continue~~");c=getche( );fflush(stdin);//不清除缓冲去会出错system("cls");}//主函数int main(){int t,a,k=0,i,flag=0;SLNode *head;//数组,用来存输入数据时候所用时间clock_t start,shijian[1000],In_put[1000][2];//为了保证输入数据时计时暂停,定义一个In_put[]dianti dt;Welcome();printf("\n\n时间单位t:0.1(秒)");printf("\n楼层范围:0--5(层)");printf("\n最大载客量:12(人)\n");start=clock();dt.lc=1; //开始电梯停在第一层dt.rs=0; //电梯最大人数为12,开始时候电梯内人数为空dt.door=0;t=(int)start/100;printf("\n当前时刻:%d(t) 计时开始.....\n",t);ListInitiate(&head);while(1){printf("\n0.下班楼空1.有人要用电梯\n");printf("请选择指令:");scanf("%d",&a);if(a==0){ printf("\n");break;}if(a==1){In_put[k][0]=clock();printf("\n暂停计时,请输入此人的序号(可以为任意字符): ");scanf("%s",ren[k].name);printf("所在楼层: ");scanf("%d",&ren[k].lc);printf("目的楼层: ");scanf("%d",&ren[k].md);printf("最大容忍时间:");scanf("%d",&ren[k].rrsj);In_put[k][1]=clock();k++;}}printf("------------------------------------------------------------------------------");printf("\n以下为要使用电梯的各个人的信息:(根据其申请使用电梯的时间先后顺序排列)\n");for(i=0;i<k;i++){int j;flag=0;for(j=0;j<i;j++){if(ren[i].lc==ren[j].lc){flag=1;break;} //判断这层是否有多个人一起等候电梯}shijian[i]=In_put[i][0]-start;if(flag==1) //若有多个人一起等候电梯,则申请电梯的时间取第一个人的时间printf("时间: %d(单位:t) 人序号:%s 所在楼层:%d 要去楼层:%d",shijian[j]/100,ren[i].name,ren[i].lc,ren[i].md);else if(flag==0)printf("时间: %d(单位:t) 人序号:%s 所在楼层:%d 要去楼层:%d 最大容忍时间:%d",shijian[j]/100,ren[i].name,ren[i].lc,ren[i].md,ren[i].rrsj);start=In_put[i][1]-In_put[i][0]; //计算输入输入数据所用时间}printf("\n------------------------------------------------------------------------------\n");shijian[i]=0;for(i=0;i<k;i++){ren[i].biaozhi=0;ren[i].in=0;}Go(head,k,dt,shijian,ren);LinListSort(head);printf("\n---------------------------------------------------------------------------\n");printf("\n以下为人和电梯的动作:");print(head);printf("\n\n---------------------------------------------------------------------------\n\n");Destroy(&head);return 0;}六、测试分析1、运行程序,进入如下界面:按任意键开始,进入如下选择界面:选择指令“1”,当只有一个人要进电梯的时候,输入数据:选择指令“0”,进入电梯模拟,操作结果如下:2、人数多于1人以及在不同楼层上下电梯的时候,输入数据:选择指令“0”,执行结果如下:七、心得体会此次选的电梯模拟对于我来说,难度实在是太大了,因为我在编程这块都不是很擅长,本来想选个简单的,结果没看清楚本题的难度系数,选了个最难的,在辅导的时候老师说电梯模拟这个最好要用栈和队列,但是由于能力有限,只能用链表来实现一些简单的基本要求,考虑的也不够周全,学的知识不够灵活应用,有些东西只是想得到,但是没有能力实现,也写不出程序。