电梯调度系统(界面由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定时器来制作简易 ...
随机推荐
- .NET Core launch.json 简介
1.环境 Windows,.NET Core 2.0,VS Code dotnet> dotnet new console -o myApp 2.launch.json配置文件 { // Use ...
- 安全之路 —— C++实现进程守护
简介 所谓进程守护,就是A进程为了保护自己不被结束,创建了一个守护线程来保护自己,一旦被结束进程,便重新启动.进程守护的方法多被应用于恶意软件,是一个保护自己进程的一个简单方式,在ring3下即可轻松 ...
- 关于UIPageViewController那些事
一.前言 这些天有新生问及UIPageViewController这个视图控制器,自己原来没有用过,所以就看了一下相关的知识,就写了下来,分享一下经验. 主要的关于这个控制器的内容就从例子中去解说了. ...
- 这不是我想要的ABAP开发者
原文在此: These Aren’t the Developers You’re Looking for 在吃饼干的过程中偶然看到这篇文章,立刻被UC化的标题吸引到了. 全文读完,感觉作者还是有点刻薄 ...
- 基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码
比如 想跳到 mao.aspx 的页面 的div id="s" 的位置 那么 只用<a href="mao.aspx#s"> 就可实现跳转到指定位置 ...
- 从头学Android之RelativeLayout相对布局
http://blog.csdn.net/worker90/article/details/6893246 相对布局对于做Web开发来说再熟悉不过了,我们在用CSS+DIV的时候经常会用到这些类似的相 ...
- 2257: [Jsoi2009]瓶子和燃料
题意:给你n个数字,然后让你选出k个,这k个数字进行任意组合,问得到的最小结果是多少? 数学知识: 分析:根据题意得出数学公式: 那么,如何在n个之中选出k个呢?其实不用选,因为直接计算各个因子,然后 ...
- A - Divisors POJ - 2992 (组合数C的因子数)数学—大数
题意:就是求组合数C的因子的个数! 先说一下自己THL的算法,先把组合数求出来,然后将这个大数分解,得到各个素数的个数,再利用公式!用最快的大数分解算法 分析一下时间复杂度! n1/4但是分析一下 ...
- 双目SLAM(2) opencv
一步步实现ORB-SLAM2 http://www.fengbing.net/ 1 opencv 测试 http://blog.csdn.net/u010480194/article/details/ ...
- 原生js函数的伪重载
一.我们在学习java的时候,其中方法有一个比较的重要的特性重载,根据传入的参数的个数来执行不同的方法,而方法其根据签名来判断,而JavaScript却不能根据方法的签名来进行重载,只能通过参数的个数 ...