电梯调度系统(界面由C图形库编绘)
电梯调度系统编程
1、编程题目
电梯调度。
2、结对编程组员
黄冠译,刘畅。
3、编程语言
C语言图形库。
4、题目要求:
5、代码运行及结果调试:
① 运行界面为C++图形库支持,开始运行的初始界面如图,且默认所有电梯初始状态都为1楼,此时不分奇偶层:
② 我设置了鼠标响应事件,左边上下箭头为当前楼层有人要上或下的按钮,可以用鼠标直接点击响应,点击后要输入有多少人在此楼层等待,示例点击5楼,输入15人,如图所示:
③ 输入完毕后,电梯会根据单双层或全部楼层4个电梯的忙碌状态调度一个电梯过去,第一个调度1号电梯,因为1号电梯只能容纳10人,剩余5人还在等待,此时会再调度另一个电 梯过去接人,优先调度全部楼层的,所以调度4号电梯,如图所示:
④ 当两个电梯都接完人后,右侧电梯状态的1号和4号显示如图,1号10人,满状态,4号5人:
⑤ 1号和4号电梯此时可以点击右侧电梯内部按钮,若有人在电梯内才可以点击,否则无法点击,我们对1号电梯选择12楼,此时会出现输入12楼下电梯的人数,我们输入4人,电 梯就会到12楼去送人,如图所示:
⑥ 1号电梯送完人后的状态如图,我们将1号和4号电梯人全部送到,1号到19楼送6人,4号到20楼送4人,地下室送1人,如图所示:
⑦ 电梯的大致功能如此,最后实现所有电梯一起运转,如图所示:
6、总结
这次的编程用C语言图形库,界面不是现成的,而是需要自己画的,就画这个界面就花了大约一星期的时间,虽然麻烦,但是一个程序如果有一个好的界面用起来还是比较舒服的,所以再苦也值得了。代码不多,一共才500行不到,功能都实现了,主要用结构体来存储每个电梯和楼层的状态,再用图形学的画图函数,通过刷新率来统一绘制,相当于在统一的频率下更新状态并绘制图形。大致的思路是这样的,代码完完全全是我们自己编写,没有参考任何资料。
电梯调度基本算法:
所用的调度算法与大家的大同小异,基本都是判断距离。如果有人按楼层上或下,则先判断4个电梯是否在此楼层停留筛选出一部分电梯,其次判断电梯上或下,是否与要乘坐电梯的人方向相同,筛选出一部分电梯,最后剩下的电梯如果大于1部,则判断电梯距离此楼层的距离,选出一部电梯进行调动。
7、easyx图形库下载及exe文件博客内地址下载:
要运行源码需要easyx图形库,点击安装到VC或VS目录即可:http://files.cnblogs.com/files/hgcrown/EasyX%E5%9B%BE%E5%BD%A2%E5%BA%93.zip
http://files.cnblogs.com/files/hgcrown/%E7%94%B5%E6%A2%AF%E8%B0%83%E5%BA%A6%E7%B3%BB%E7%BB%9F.zip
8、源代码
# include <stdio.h>
# include <graphics.h>
# include <conio.h>
# include <time.h>
# include <memory.h> int x[] = {,,,},k[]={,,,},t[]={,,,},di[]={,,,};
int cro,col;
char s[];
int refresh_rate = ; //刷新率定义大小
MOUSEMSG M;
IMAGE ima,ima1,ima2,back,block; struct elevator //定义4个电梯结构体数组
{
int num,msum,dir,flo,mflo,numm,summ,elein[],eleof[],peom[];
}ele[]={{,,,,,,},{,,,,,,},{,,,,,,},{,,,,,,}}; struct floors //定义21个楼层结构体数组
{
int num[],go,emin;
}floor[]; void Draw1(int e) //电梯接人路线绘制函数
{
if(t[e]==) //如果电梯没有到达目的楼层,则继续绘制路线
{
if (ele[e].dir==) //电梯上楼绘制
{
putimage(+e*,(-ele[e].flo)*-k[e],&ima);
k[e]++;
if (k[e]==)
{
ele[e].flo++;
k[e]=;
}
}
if (ele[e].dir==) //电梯下楼绘制
{
putimage(+e*,(-ele[e].flo)*+k[e],&ima);
k[e]++;
if (k[e]==)
{
ele[e].flo--;
k[e]=;
}
}
if (ele[e].dir==) //电梯停歇状态绘制
putimage(+e*,(-ele[e].flo)*,&ima);
if ((ele[e].flo==ele[e].mflo)&&(ele[e].dir!=)) //电梯到达目的楼层后的数值重新赋值
{
int h;
ele[e].dir=;
floor[ele[e].flo].emin=;
t[e]=;
k[e]=;
while (floor[ele[e].mflo].num[]!=) //接人后电梯内部状态赋值
{
h=rand()%+;
if ((ele[e].num+<=ele[e].numm)&&(ele[e].msum+h<=ele[e].summ))
{
ele[e].num++;
ele[e].peom[ele[e].num-]=h;
ele[e].msum=ele[e].msum+h;
floor[ele[e].flo].num[]--;
}
else
break;
}
while (floor[ele[e].mflo].num[]!=)
{
h=rand()%+;
if ((ele[e].num+<=ele[e].numm)&&(ele[e].msum+h<=ele[e].summ))
{
ele[e].num++;
ele[e].peom[ele[e].num-]=h;
ele[e].msum=ele[e].msum+h;
floor[ele[e].flo].num[]--;
}
else
break;
}
}
}
if (t[e]!=) //如果电梯到达目的楼层,则绘制电梯开门关门状态
{
if (t[e]>) //开门
{
putimage(+e*-+t[e]+,(-ele[e].flo)*,&ima1);
putimage(+e*+-t[e]+,(-ele[e].flo)*,&ima2);
t[e]--;
}
else if (t[e]>)
{
putimage(+e*-+,(-ele[e].flo)*,&ima1);
putimage(+e*++,(-ele[e].flo)*,&ima2);
t[e]--;
}
else if (t[e]>) //关门
{
putimage(+e*-t[e]+,(-ele[e].flo)*,&ima1);
putimage(+e*+t[e]+,(-ele[e].flo)*,&ima2);
t[e]--;
}
}
} void Draw2(int e) //电梯接人结束后,进入送客绘制模式
{
for (int v=;v<=;v++) //电梯内部按钮绘制
{
if ((v==)&&(ele[e].elein[v]==))
putimage(+%*,+/*19.3+e*,&block);
else if (ele[e].elein[v]==)
putimage(+(v-)%*,+(v-)/*+e*,&block);
}
if(t[e]==) //如果电梯没有到达目的楼层,则继续绘制路线
{
if (ele[e].dir==) //电梯上楼绘制
{
putimage(+e*,(-ele[e].flo)*-k[e],&ima);
k[e]++;
if (k[e]==)
{
ele[e].flo++;
k[e]=;
}
}
if (ele[e].dir==) //电梯下楼绘制
{
putimage(+e*,(-ele[e].flo)*+k[e],&ima);
k[e]++;
if (k[e]==)
{
ele[e].flo--;
k[e]=;
}
}
if (ele[e].flo==ele[e].mflo) //到达目的楼层后绘制
{
ele[e].elein[ele[e].flo]=;
di[e]=;
for (int v=;v<=;v++)
if (ele[e].elein[v]==)
di[e]=;
k[e]=;
ele[e].dir=;
while(ele[e].eleof[ele[e].flo]!=) //电梯下人操作,重新赋值
{
ele[e].num--;
ele[e].msum=ele[e].msum-ele[e].peom[ele[e].num];
ele[e].eleof[ele[e].flo]--;
if (ele[e].num==)
break;
}
t[e]=;
}
}
if (t[e]!=) //如果电梯到达目的楼层,则绘制电梯开门关门状态
{
if (t[e]>) //开门
{
putimage(+e*-+t[e]+,(-ele[e].flo)*,&ima1);
putimage(+e*+-t[e]+,(-ele[e].flo)*,&ima2);
t[e]--;
}
else if (t[e]>)
{
putimage(+e*-+,(-ele[e].flo)*,&ima1);
putimage(+e*++,(-ele[e].flo)*,&ima2);
t[e]--;
}
else if (t[e]>) //关门
{
putimage(+e*-t[e]+,(-ele[e].flo)*,&ima1);
putimage(+e*+t[e]+,(-ele[e].flo)*,&ima2);
t[e]--;
}
}
} void run () //电梯运行总调度函数
{
int o,p,mine;
setcolor(BLACK);
while() //电梯运行状态循环
{
if(MouseHit()) //如果触发鼠标时间
{
M = GetMouseMsg(); //鼠标事件获取
if (M.uMsg == WM_LBUTTONDOWN) //如果鼠标左键单击
{
if (M.x>=&&M.x<=) //判断鼠标指针所在范围是否上楼
{
o=-(M.y+)/;
InputBox(s, , "请输入进电梯的人数"); //弹窗响应,要求输入
sscanf(s,"%d",&p);
floor[o].num[]=p;
}
if (M.x>=&&M.x<=) //判断鼠标指针所在范围是否下楼
{
o=-(M.y+)/;
InputBox(s, , "请输入进电梯的人数"); //弹窗响应,要求输入
sscanf(s,"%d",&p);
floor[o].num[]=p;
}
if ((ele[].num!=)&&(M.x>=&&M.x<=&&M.y>=&&M.y<=)) //判断电梯内部按钮是否由鼠标响应
{
int r;
cro=(M.x-)/;
col=(M.y-)/;
r=cro+col*+;
if (r==)
r=;
di[]=;
ele[].mflo=r;
ele[].elein[ele[].mflo]=;
InputBox(s, , "请输入此楼层要下电梯的人数"); //弹窗响应,要求输入
sscanf(s,"%d",&p);
ele[].eleof[ele[].mflo]=p;
}
if ((ele[].num!=)&&(M.x>=&&M.x<=&&M.y>=&&M.y<=)) //判断电梯内部按钮是否由鼠标响应
{
int r;
cro=(M.x-)/;
col=(M.y-)/;
r=cro+col*+;
if (r==)
r=;
if (r%==)
{
di[]=;
ele[].mflo=r;
ele[].elein[ele[].mflo]=;
InputBox(s, , "请输入此楼层要下电梯的人数"); //弹窗响应,要求输入
sscanf(s,"%d",&p);
ele[].eleof[ele[].mflo]=p;
}
}
if ((ele[].num!=)&&(M.x>=&&M.x<=&&M.y>=&&M.y<=)) //判断电梯内部按钮是否由鼠标响应
{
int r;
cro=(M.x-)/;
col=(M.y-)/;
r=cro+col*+;
if (r==)
r=;
if (r%==)
{
di[]=;
ele[].mflo=r;
ele[].elein[ele[].mflo]=;
InputBox(s, , "请输入此楼层要下电梯的人数"); //弹窗响应,要求输入
sscanf(s,"%d",&p);
ele[].eleof[ele[].mflo]=p;
}
}
if ((ele[].num!=)&&(M.x>=&&M.x<=&&M.y>=&&M.y<=)) //判断电梯内部按钮是否由鼠标响应
{
int r;
cro=(M.x-)/;
col=(M.y-)/;
r=cro+col*+;
if (r==)
r=;
di[]=;
ele[].mflo=r;
ele[].elein[ele[].mflo]=;
InputBox(s, , "请输入此楼层要下电梯的人数"); //弹窗响应,要求输入
sscanf(s,"%d",&p);
ele[].eleof[ele[].mflo]=p;
}
}
}
for(int j=;j>=;j--) //每个楼层开始判断是否有客人要上电梯的响应
{
mine=;
if (floor[j].num[]!=) //有上电梯响应且客人要上楼,开始电梯调度
{
if ((ele[].num<)&&(ele[].msum<)) //1号电梯条件是否满足
{
if ((j>=ele[].flo)&&(ele[].dir!=))
if (floor[j].emin>(j-ele[].flo))
{
floor[j].emin=j-ele[].flo;
mine=;
}
if ((j<ele[].flo)&&(ele[].dir==))
if (floor[j].emin>(ele[].flo-j))
{
floor[j].emin=ele[].flo-j;
mine=;
}
}
if ((ele[].num<)&&(ele[].msum<)) //4号电梯条件是否满足
{
if ((j>=ele[].flo)&&(ele[].dir!=))
if (floor[j].emin>(j-ele[].flo))
{
floor[j].emin=j-ele[].flo;
mine=;
}
if ((j<ele[].flo)&&(ele[].dir==))
if (floor[j].emin>(ele[].flo-j))
{
floor[j].emin=ele[].flo-j;
mine=;
}
}
if (j%==)
{
if ((ele[].num<)&&(ele[].msum<)) //3号电梯条件是否满足
{
if ((j>=ele[].flo)&&(ele[].dir!=))
if (floor[j].emin>(j-ele[].flo))
{
floor[j].emin=j-ele[].flo;
mine=;
}
if ((j<ele[].flo)&&(ele[].dir==))
if (floor[j].emin>(ele[].flo-j))
{
floor[j].emin=ele[].flo-j;
mine=;
}
}
}
if (j%==) //2号电梯条件是否满足
{
if ((ele[].num<)&&(ele[].msum<))
{
if ((j>=ele[].flo)&&(ele[].dir!=))
if (floor[j].emin>(j-ele[].flo))
{
floor[j].emin=j-ele[].flo;
mine=;
}
if ((j<ele[].flo)&&(ele[].dir==))
if (floor[j].emin>(ele[].flo-j))
{
floor[j].emin=ele[].flo-j;
mine=;
}
}
}
if (j>=ele[mine].flo) //用距离判断满足条件的电梯,在此筛选出满足条件电梯
ele[mine].dir=;
else
ele[mine].dir=; //满足条件的电梯设置目的楼层
ele[mine].mflo=j;
}
if (floor[j].num[]!=) //有上电梯响应且客人要下楼,开始电梯调度
{
if ((ele[].num<)&&(ele[].msum<))
{
if ((j<=ele[].flo)&&(ele[].dir!=))
if (floor[j].emin>(ele[].flo-j))
{
floor[j].emin=ele[].flo-j;
mine=;
}
if ((j>ele[].flo)&&(ele[].dir==))
if (floor[j].emin>(j-ele[].flo))
{
floor[j].emin=j-ele[].flo;
mine=;
}
}
if ((ele[].num<)&&(ele[].msum<))
{
if ((j<=ele[].flo)&&(ele[].dir!=))
if (floor[j].emin>(ele[].flo-j))
{
floor[j].emin=ele[].flo-j;
mine=;
}
if ((j>ele[].flo)&&(ele[].dir==))
if (floor[j].emin>(j-ele[].flo))
{
floor[j].emin=j-ele[].flo;
mine=;
}
}
if (j%==)
{
if ((ele[].num<)&&(ele[].msum<))
{
if ((j<=ele[].flo)&&(ele[].dir!=))
if (floor[j].emin>(ele[].flo-j))
{
floor[j].emin=ele[].flo-j;
mine=;
}
if ((j>ele[].flo)&&(ele[].dir==))
if (floor[j].emin>(j-ele[].flo))
{
floor[j].emin=j-ele[].flo;
mine=;
}
}
}
if (j%==)
{
if ((ele[].num<)&&(ele[].msum<))
{
if ((j<=ele[].flo)&&(ele[].dir!=))
if (floor[j].emin>(ele[].flo-j))
{
floor[j].emin=ele[].flo-j;
mine=;
}
if ((j>ele[].flo)&&(ele[].dir==))
if (floor[j].emin>(j-ele[].flo))
{
floor[j].emin=j-ele[].flo;
mine=;
}
}
}
if (j>=ele[mine].flo)
ele[mine].dir=;
else
ele[mine].dir=;
ele[mine].mflo=j;
}
}
BeginBatchDraw(); //开始画图
putimage(,,&back);
for (int i=;i<;i++) //四个电梯一次绘制当前状态
{
if (di[i]==) //接客的电梯绘制
Draw1(i);
if (di[i]==) //送客的电梯绘制
{
if (ele[i].mflo>=ele[i].flo) //上楼绘制
{
ele[i].dir=;
for (int w=ele[i].flo;w<=;w++)
{
if (ele[i].elein[w]==)
{
ele[i].mflo=w;
break;
}
}
}
else //下楼绘制
{
ele[i].dir=;
for (int w=ele[i].flo;w>=;w--)
{
if (ele[i].elein[w]==)
{
ele[i].mflo=w;
break;
}
}
}
Draw2(i);
}
setbkmode(TRANSPARENT); //输出电梯当前状态数值
sprintf(s,"%d",ele[i].num); //电梯当前人数
outtextxy(,+i*,s);
sprintf(s,"%d",ele[i].msum); //电梯当前重量
outtextxy(,+i*,s);
sprintf(s,"%d",ele[i].flo); //电梯当前楼层
outtextxy(,+i*,s);
}
EndBatchDraw(); //结束绘制
Sleep(refresh_rate); //延时绘制,否则会本次绘制会遮挡下一次绘制
} } void main() //主函数
{
for (int i=;i<;i++) //初始化
{
floor[i].num[]=;
floor[i].num[]=;
floor[i].emin=;
}
initgraph(,); //构建窗口大小
loadimage(&back,"pic//2.jpg"); //载入图片2
putimage(,,&back);
loadimage(&ima,"pic//1.jpg"); //载入图片1
loadimage(&ima1,"pic//3.jpg"); //载入图片3
loadimage(&ima2,"pic//4.jpg"); //载入图片4
loadimage(&block,"pic//5.jpg"); //载入图片5
BeginBatchDraw(); //初始化绘制
for (int j=;j<;j++)
putimage(+j*,(-ele[j].flo)* ,&ima);
EndBatchDraw(); //结束绘制
run(); //进入电梯调度函数开始电梯总调度
closegraph(); //关闭窗口
}
电梯调度系统(界面由C图形库编绘)的更多相关文章
- 电梯调度系统(界面由C图形库编绘)
1.编程题目 电梯调度系统 2.结对编程组员 黄冠译,刘畅 3.编程语言 C语言图形库 4题目要求 编写人员:刘畅,黄冠译 代码如下: # include <stdio.h> # incl ...
- C++ 课程设计——电梯调度系统
这是我在本学期C++课程最后的课程设计报告,源代码将会上传到GitHub上. 一.背景 随着经济的不断发展,越来越多的摩天大楼拔地而起,而电梯作为高层建筑物种的运送人员货物的设备也越来越被广泛使用.电 ...
- 【软件工程】电梯调度的初步实现 李亚文&&郭莉莉
一.开门见山,代码粘 using System; using System.Collections.Generic; using System.Data; using System.Drawing; ...
- OO第二次博客作业——电梯调度
OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...
- 电梯调度编写(oo-java编程)
第二单元的问题是写一个关于电梯调度的程序. 需要模拟一个多线程实时电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出. 主要锻炼学生的多线程程序 ...
- Hulu大规模容器调度系统Capos
Hulu是美国领先的互联网专业视频服务平台,目前在美国拥有超过2000万付费用户.Hulu总部位于美国洛杉矶,北京办公室是仅次于总部的第二大研发中心,也是从Hulu成立伊始就具有重要战略地位的分支办公 ...
- PairProject 电梯调度 【附加题】
[附加题] 改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享. 目前的设计有什么缺点, 你会如何改进它? 1.之前判断电梯是否闲置的函 ...
- 4.NFC前台调度系统
使用目的:当前Activity能直接响应NFC标签,而不需要用户在choose所有能处理的Activity. 使用步骤: 第一步:在onCreate()方法中,创建一个PendingIntent对象 ...
- 部署Kettle做ETL开发并使用Crontab制作调度系统
背景说明: 在数据量较小,且数据源和装载地都是关系型数据库时,使用Kettle做ETL较为简便. 由于调度系统产品因为服务器环境方面的因素,而无法部署,故使用Linux的crontab定时器来制作简易 ...
随机推荐
- react canvas
http://engineering.flipboard.com/2015/02/mobile-web/
- scribe日志系统安装笔记
版本历史 2011-02-12 17:36:57 完成文章2011-02-23 10:49:12 更新,修正部分文字 目前web访问日志为crontab定时清空,而且负载均衡后,访问随机分配到一台服务 ...
- 20155229 《信息安全系统设计基础》 week10 课上测试ch06
1( 单选题 | 1 分) 下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为() A . 1 B . 1/4 C . 1/2 D . 3/4 正确答案: D 解析:填充消除 ...
- 洛咕 P3961 [TJOI2013]黄金矿工
甚至都不是树形背包= = 把每条线抠出来,这一条线就是个链的依赖关系,随便背包一下 // luogu-judger-enable-o2 #include<bits/stdc++.h> #d ...
- Nessus 用好的网络(比如热点)就可以正常在线更新扫描插件了
折腾那么多不如直接开热点 nethogs 实时查看网络流量 ( linux下 )
- springmvc框架开发常用的注解总结
1.@Controller使用:表示表现层中的JavaBean被spring容器管理. 2.@requestMapping使用: a) 在方法上: 标记url到请求方法的映射, 就相当于从一个ur ...
- 【日常训练】Help Victoria the Wise(Codeforces 99C)
题意与分析 这题意思是这样的:在正方体的六面镶嵌给定颜色的宝石(相同颜色不区分),然后问最多有几种彼此不等价(即各种旋转过后看起来一致)的方案. 其实可以乱搞,因为范围只有720.求出全排列,然后每个 ...
- 高大上网站-CSS3总结1-图片2D处理以及BUG修复
高大上网站-CSS3总结1-图片2D处理以及BUG修复 一,前言: 现在的前端UI相对JS来说,重视并不够. 但是CSS3提供的新特性,将现在的网站赤裸裸的划分为两类:一类还在写着老旧样式,或者通过b ...
- Jmeter 数据库配置池设置IP为参数
我在网上查了很多资料,发现jmter链接数据库的URL都是设置成固定值的.没有参数化. 当我需要使用配置文件链接不同服务器上的数据库的时候,发现无法实现. 原因在于:jmeter的元件执行优先级是配置 ...
- Tomcat性能优化方案
1. 提高JVM栈内存Increase JVM heap memory 你使用过tomcat的话,简单的说就是"内存溢出". 通常情况下,这种问题出现在实际的生产环境中.产生这种问 ...