第二题:电梯模拟。
1、需求分析:
模拟某校九层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。九个楼层由下至上依次称为地下层、第一层、第二层、……第八层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。
乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:
有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层侯命。
而题目的最终要求输出时:
按时序显示系统状态的变化过程,即发生的全部人和电梯的动作序列。
2、设计。2.1设计思想:
1)数据结构设计。
本题中的电梯的变化,是一个动态变化的过程,要在动态过程中实现正常跳转,首先要确定各种跳转的状态,因而这里我使用枚举类型来表示电梯的各种状态的:
enum state(home);
同时初始化最初状态为电梯在本垒层。而在电梯的运行过程中对于乘客来说,显然有一个进入电梯与出电梯的队列,因而在这里我是用的链表来实现这个过程的,同时用结构体来保存该乘客的信息:
typedef struct passage
int now;//乘客当前所在的位置。
int dis;//乘客的目地地。
int wait;//最长的等待的时间。
int waitnow;//已经等待的时间。
struct passage *next;
passage;
虽然电梯中的状态是由枚举类型来实现的,但是在整个程序的运行过程中,我还是为电梯设置了一个结构体类型,以便保存更多的信息:
typedef struct lift
int count_c;//计数电梯已到达的层数。
int count_a;//系统的总时间计数器记得必须初始化为0
int flag_in[high];/九个楼层有无请求的标志哪个楼层如果有请求该标志置1
int num;//等待队列中的人数记得要进行初始化为0
int people;//电梯中人数。
int flag_out[high];
lift;2)算法设计。
顾名思义本程序在运行的过程中用到的算法便是—“电梯算法”,电梯算法借鉴了磁盘寻道c-look算法,即电梯向一个方向运行,直到这个方向上没有服务为止。
2.2设计表示。
1)、函数调用关系图及其说明如下 :
2)函数接口说明:
函数中的参数均是使用的全局变量的传递,因而在函数间进行传递的过程中比较简单,下面就将主要函数及他们之间的参数的关系列出如下:
int outorin(lift &l,passage *queue,passage *liftq);/进和出电梯的总函数。
int update(lift &l,passage *queue,passage *liftq);/刷新的函数。
int run(lift &l,passage *queue,passage *liftq);/整个电梯各种状态转换的函数。
int openthedoor(lift &l);/开门主要是用于解决其中的时间问题。
int closethedoor(lift &l);/关门。
int in(lift &l);/进入主要是解决每个人进入电梯的时间问题。
int out(lift &l);/出去。
int test(lift &l,passage *queue,passage *liftq);/电梯测试关门还是开门的函数。
int request(lift &l,passage *queue);
2.3详细设计。
3、调试分析。
该程序的调试过程较为轻松,基本在算法实现的基础上没有出现什么错误,因而在调试的过程中并无什么深刻印象。
4、用户手册。
点击运行程序,在弹出的窗口中,会提示要输入的信息:
1、 提示信息为:“请输入图中的顶点数和弧数以及图的标志和弧的标志:”按要求输入即可,本题即输入9 11 v a
2、 提示信息为“请完成该邻接表的输入”:由于邻接表的输入信息一般较多,而且均是采用的链表来存储,因而该部分的输入要特别的小心。
3、 在完成上面两步的输入后按enter键便能得到程序的运行结果,即输出完成整项工程至少需要多少时间和影响工程进度的关键活动。
5 测试数据及测试结果。
测试数据如下:
9 11 v a
程序运行结果如下:
6、原程序清单如下:
关键路径问题。
2024年07月31日晚上08:36开始动工。
#include
using namespace std;
const int max_v_num=20;//最大存储顶点的数目。
const int stack_init_size=20;//栈的存储空间分配量。
///数据存储部分。
一下是图的邻接表的存储表示,由于第一次用用的比较的生疏……
typedef struct arcnode
int adjvex该弧所指向的顶点的位置。
struct arcnode *nextarc;//指下一条弧的指针。
int info;//该弧相关信息即权值。
int name;//弧的名字。
arcnode;
typedef struct vnode
int data;//顶点的信息。
arcnode *firstarc;//指向第一条依附该顶点的弧的指针。
adjlist[max_v_num];
typedef struct
adjlist vertices;
int vnum,arcnum;//图中当前顶点数和弧数。
char kind,kind1;//图中的各类标志顶点和弧。
algraph;
typedef struct
int *base;
int *top;
int stacksize;
stack;
int ve[max_v_num];
stack t;
/函数体描述部分。
int initstack(stack &s);
int push(stack &s,int &e);
int pop(stack &s,int &e);
int criticalpath(algraph &g);
int topoorder(algraph &g,stack &t);
int findindegree(algraph &g,int (&indegree)[max_v_num]);
*下面是函数的具体实现部分*/
/构造一个空栈。
int initstack(stack &s)
if(!return 0;
可以用于当栈的存储空间不够的情况下进行扩充。
return 1;
/元素进栈。
int push (stack &s, int &e)
return 1;
/元素出栈。
int pop(stack &s, int &e)
if(return 0;
e=*return 1;
/判断栈是否为空。
int stackempty(stack &s)
if(return 1;
else return 0;
/找出每个顶点的入度。
int findindegree(algraph &g,int (&indegree)[max_v_num])
arcnode *p;
int i;
for(i=0;i indegree[i]=0;
for(i=0;i<
return 0;
/拓扑排序同时求出各活动的最早发生时间。
int topoorder(algraph &g,stack &t)
int count=0;
int i,j,k;
stack s1;
arcnode *p;
int indegree[max_v_num];
initstack(t);
initstack(s1);
findindegree(g,indegree);
for(i=0;i<
if(indegree[i]==0)
push(s1,i);
//建立0入度顶点栈s
for(i=0;i<
ve[i]=0;
while(!stackempty(s1))
/ for(i=0;i<
cout< if(count<
return 0;
else return 1;
/计算各顶点的最迟发生时间及进行输出。
int criticalpath(algraph &g)
int vl[max_v_num];
int dut;
int i,j,k,ee,el;
arcnode *p;
/ char tag;
if(!topoorder(g,t))
return 0;
cout<<"完成整项工程至少需要的时间是:" 东莞理工学院城市学院。题目 二叉排序树 专业 计算机科学与技术 本 年级 2010级计算机科学与技术专业 1 班。个人姓名 何振江。指导教师 张娟老师 时间 2010至2011第二学期第18周 地点 实验楼615机房 东莞理工学院城市学院计算机与信息科学系制。2011年 6月。实习报告的内容。一 问... 设计一个校园导游程序,为来访的客人提供信息查询服务。1 设计学校的校园平面图。选取若干个有代表性的景点抽象成一个无向带权图 无向网 以图中顶点表示校内各景点,边上的权值表示两景点之间的距离。2 存放景点代号 名称 简介等信息供用户查询。3 为来访客人提供图中任意景点相关信息的查询。4 为来访客人提供... 河北科技大学。课程设计报告。学生姓名学号。专业班级。课程名称数据结构。学年学期 2 012 2 013学年第 2 学期指导教师 黄春茹。2 0 13年 6 月。课程设计成绩评定表。一 数据结构课程设计目标。二 问题描述。三 需求分析。四 概要设计。五 详细设计。六 软件说明书 给出软件如何使用,使用...数据结构课程设计报告
数据结构课程设计报告
数据结构课程设计报告