电梯调度系统(界面由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定时器来制作简易 ...
随机推荐
- 有效的括号golang实现
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...
- 写给spring版本的那些事儿
1.远程调用rmi协议 Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling re ...
- Java面试之五大框架的理解
五大框架(springMVC,struts2,spring,mybatis,hibernate) 说说你对springMVC框架的理解? 简要口述(如果感觉说的少可以在完整答案里面挑几条说) Spri ...
- php 安装xdebug进行调试(phpstorm)
一.下载xdebug xdebug官网:https://xdebug.org/download.php 在选择下载哪个版本的xdebug的时候需要注意了,下面有两种方法,让你准确的下载自己环境对应的x ...
- 安装eclipse、maven等JAVA开发环境
一 下载JAVA,这是官方JAVA8的下载地址,包含了JDK和JRE: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...
- Java中关于AbstractQueuedSynchronizer的入门(一)
备注:博文仅仅是学习过程中的零散记录,后期整理. AbstractQueuedSynchronizer的简单介绍可以网上搜索,简单了解字段作用. 示例代码,分析获取锁的过程: import java. ...
- Qt读取文件时中文乱码问题
在默认情况下,Qt 以 Unicode 格式处理文本字符,因此,字符本身是不会有问题的.之所以出现乱码,原因在于 Qt 不知道将 Unicode 字符以何种方式显示出来. 文本文件含有简 ...
- 项目Alpha冲刺 2
作业描述 课程: 软件工程1916|W(福州大学) 作业要求: 项目Alpha冲刺(团队) 团队名称: 火鸡堂 作业目标: 进行github实战训练,锻炼团队合作能力 1.团队信息 队名:火鸡堂 队员 ...
- 深入浅出的webpack构建工具---DllPlugin DllReferencePlugin提高构建速度(七)
阅读目录 一:什么是DllPlugin 和 DllReferencePlugin?作用是什么? 二:在项目中如何使用 DllPlugin 和 DllReferencePlugin? 三:DllPlug ...
- python线程和进程编程对比
import timefrom concurrent.futures import ThreadPoolExecutor,as_completedfrom concurrent.futures imp ...