电梯调度
现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示:
电梯编号 |
可服务楼层 |
最大乘客数量 |
最大载重量 |
1 |
全部楼层 |
10 |
800 kg |
2 |
单层 |
10 |
800 kg |
3 |
双层 |
20 |
1600 kg |
4 |
全部楼层 |
20 |
2000 kg |
其使用规定如下:
1、楼层号为0~20,其中0号为地下一层;
2、有楼层限制的电梯不在响应楼层停靠,如单双层;
3、所有电梯采用统一按钮控制
请根据上述要求设计并实现一个电梯控制程序,
程序思想及解决办法
1.楼层问题及解决办法:先定义一个结构体,把电梯的属性都定义在一个结构体中这样以后想要使用电梯属性的话,很容易就从结构体中用。之后就是考虑楼层了。如果上来3个人按了分别不同的按钮,我要先判断哪个最近然后,开始运行电梯。所以,楼层这个方面我用了链表来完成,用链表的好处在于,
数组在内存中是逐个存放的,也就是说倘若数组的第一个元素在地址A,则数组第二个元素就在地址A+1。
而链表则不是,链表每个节点没有相对固定的位置关系。某个节点在地址A其后的节点不一定是A+1,而在内存的其他空闲区域,呈现一种随机的状态。
数组一旦显式的被申明后,其大小就固定了,不能动态进行扩充。而链表则可以,可以动态生成节点并且添加到已有的链表后面。这样就解决了电梯楼层的问题。如下为代码和效果图
struct elevator*Create(struct elevator*head)//创建链表
{
struct elevator*p1, *p2;
p1=p2=(struct elevator*)malloc(sizeof(struct elevator));
printf("\t\t请输入楼层*回车继续输入*按-1表示结束");
scanf("%d",&p1->floor);
p1->pNext = NULL;
while (p1->floor > -1)
{
if (head== NULL)
head = p1;
else
p2->pNext = p1;
p2 = p1;
p1 = (struct elevator*)malloc(sizeof(struct elevator));
printf("\t\t请输入楼层,按-1表示结束");
scanf("%d", &p1->floor);
}
free(p1); //申请到的没录入,所以释放掉
p1 = NULL; //使指向空
p2->pNext = NULL; //到表尾了,指向空
printf("\t\t楼层输入结束(END)\n");
return head;
}
2.然后需要解决的就是,电梯超载。这个问题就相对简单。题中要求的载重数,我为了方便按每个人65kg的体重算,所以,在程序执行的途中加入一个if判断语句就OK如下为程序代码和效果图
int elevatorONE()//一号电梯函数
{
int a = 0;
struct elevator elevator1;
printf("\t\t\t欢迎使用一号电梯系统\n");
printf("\t请输入一使用一号电梯系统*若想退出一号电梯系统请按2*");
while (a=1)
{
scanf_s("%d", &a);
if (a == 1)
{
printf("\t\t\t请输入人数;");
scanf_s("%d", &elevator1.outnumber);
if (elevator1.outnumber > 12 || elevator1.outnumber < 1)
{
printf("\t\t一号电梯最多承载人数为12人,请您谅解\n");
}
else
{
printf("\t\t提示**一号电梯提供1—21层的服务**\n");
struct elevator *head;
head = NULL;
head = Create(head);
printf(head);
printf("\t\t如果继续请按1否则请按0");
}
}
else
break;
}
printf("\t\t感谢使用一号电梯系统");
printf("\t\t如果继续请按1否则请按0");
return 0;
}
3。然后题中要求2号 和3号电梯分别是单层和双层电梯,所以电梯运行时需要判断输入的是否正确。如下为代码和截图
void printfF(struct elevator*head)//三号电梯的输出函数,判断输入是否为双层
{
struct elevator *three;
three = head;
printf("\t\t电梯开始运行\n");
while (three->floor%2==0)
{
Sleep(N);
printf("\a");
printf("\t\t到达您所输入的楼层%30d楼\n", three->floor);
printf("是否有请求*有请求请按1否则请按0");
int a = 0;
scanf_s("%d", &a);
if (a == 1)
{
break;
}
else
{
printf("\n");
three = three->pNext;
}
}
printf("\t\t您输入有误三号电梯只提供双层服务\n");
4.如果有个人在1楼到5楼 但是途中在3楼有人要使用电梯的话怎么办呢? 这个问题我用了比较笨的办法就是,电梯每到一个楼层我就进行一次提示是否有请求,如果有请求就可以中途使用电梯,就是可以在3楼进入这个电梯系统。如果没有就继续上升到5楼。代码和效果图如下。
跟小伙伴的合影:
* 对这次结对编程的感想*
刚开始,老师说这次作业要进行结对编程,我是拒绝的,从大一开始敲代码开始都是自己一个人写,突然让跟别的人一起写真有点不适应。刚开始我俩都很不怎么达标自己的想法。可是随着时间的推移,慢慢的程序的轮廓出来之后,我们两个交流也多了起来。给我最大的感受就是,一个人写代码发现不足点很少,两个人写可以从更广阔的视野下写程序,这样写出来的程序可以更好地被大多数人所接受,我想这就是老师让我们的做团队合作的原因吧。毕竟人是群居动物(虽然我们是程序猿~~)。还有,因为我俩实力有限对这次编程也不是很满意,没有做出图形出来(主要是对图形学一窍不通啊~~~).....还有就是无法让四个电梯同时运行。希望以后通过自己的努力学习能过弥补不足做出更好的程序。