电梯调度系统(界面由C图形库编绘)
1.编程题目
电梯调度系统
2.结对编程组员
黄冠译,刘畅
3.编程语言
C语言图形库
4题目要求
编写人员:刘畅,黄冠译
代码如下:
# 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(); //关闭窗口
}
我队友真的太厉害了,编程能力真的是太强大了,经过这俩周的合作,我在他身上学到了好多在书本上学不到,看不到的知识。对于这次结队编程的总结跟体会我会在下一个博客中详细的说明下面附上我队友的链接http://www.cnblogs.com/hgcrown/p/5364849.html
电梯调度系统(界面由C图形库编绘)的更多相关文章
- 电梯调度系统(界面由C图形库编绘)
电梯调度系统编程 1.编程题目 电梯调度. 2.结对编程组员 黄冠译,刘畅. 3.编程语言 C语言图形库. 4.题目要求: 5.代码运行及结果调试: ① 运行界面为C++图形库支持,开始运行的初始界面 ...
- 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定时器来制作简易 ...
随机推荐
- web高并发的解决方案
我们先了解一下什么是并发和并行 并发:并发是指两个或多个事件在同一时间间隔内发生,就是可以重叠在时间段启动,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机 ...
- BeanFactory中Bean的生命周期
Bean的生命周期图解 集体过程如下: 当调用者通过getBean(beanName)向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.co ...
- 「雅礼集训 2017 Day7」事情的相似度
「雅礼集训 2017 Day7」事情的相似度 题目链接 我们先将字符串建后缀自动机.然后对于两个前缀\([1,i]\),\([1,j]\),他们的最长公共后缀长度就是他们在\(fail\)树上对应节点 ...
- Destroying Array CF 722C
题目大意就是给长度为 n 一个数列,有 n 每次删除,每一次删除第 i 个位置上的数,求每一次删除后剩余不连续数列的最大区间和. 输入样例 4 1 3 2 5 3 4 1 2 输出样例 5 4 3 0 ...
- Ceph的BlueStore总体介绍
整体架构 bluestore的诞生是为了解决filestore自身维护一套journal并同时还需要基于系统文件系统的写放大问题,并且filestore本身没有对SSD进行优化,因此bluestore ...
- zabbix_agent安装
#!/bin/bash#by Charon2Pluto#(linux)ML=`df |awk '{print $2,$NF}'|sort -n|tail -1|awk '{print $2}'` if ...
- 基于SaaS的企业数据隐私保护平台
导读 WireWheel成立于2016年,总部位于华盛顿,该公司致力于降低数据隐私保护合规能力建设的难度,帮助企业来应对复杂.严厉的法案.条例规定.2018年10月,公司获得了PSP Growth领投 ...
- 关于nodejs
#!/bin/bashcd /home/software/wget https://nodejs.org/dist/v9.8.0/node-v9.8.0-linux-x64.tar.xztar -xv ...
- Android学习之基础知识十三 — 四大组件之服务详解第二讲(完整版的下载示例)
上一讲学习了很多关于服务的使用技巧,但是当在真正的项目里需要用到服务的时候,可能还会有一些棘手的问题让你不知所措.接下来就来综合运用一下,尝试实现一下在服务中经常会使用到的功能——下载. 在这一讲我们 ...
- MySQL(六)常用语法和数据类型
阅读MySQL语法时,需要注意的规则: ①符号用来指出几个选择中的一个,比如:null | not null表示或者给出null或者给出not null: ②包含在方括号中的关键字或子句(如[like ...