电梯调度编码过程

电梯1.0

输入

分别用三个数组来储存请求时刻、起始楼层数和去往方向,然后将五组数据输入。最开始傻乎乎的用五个scanf输入数据(图1),其实可以简化成五个循环(图2)。

scanf("%d%d%d",&a[1],&b[1],&c[1]);
scanf("%d%d%d",&a[2],&b[2],&c[2]);
scanf("%d%d%d",&a[3],&b[3],&c[3]);
... ...

简化后

for(i=1;i<6;i++)
    scanf("%d%d%d",&a[i],&b[i],&c[i]);

但是由于输入的数据是随意的,我需要在代码中实现从小到大的排列,根据一个数组来进行比较排列的话,其他数组不会随之改变顺序,会导致数据不对应,这是使用三个数组的弊端。所以我参考其他同学使用结构体输入的方法,将三类数据存在结构体中,可以实现整组数据的排列,解决了这个问题。

编码过程

1)构造对应的结构体存储数据
2)输入数据并将0转化为10方便计算
3)利用冒泡法从小到大排序
4)计算第一趟所用时间
5)判断电梯是否需要停止一段时间等待下一次命令发出
6)计算后四趟所用时间

输出

正常输出即可。

运行结果

第2、5组数据用于检验程序是否能正确判断“电梯是否需要停止一段时间等待下一次命令发出”;
第3、4组数据用于检验程序是否能正确计算“相邻两趟目的地相同时所用时间”。
检验后证明代码可以简单地满足题目要求。

电梯2.0

编码过程

思路不变,只需将输入与输出改为文件读入写出即可。代码如下:

FILE* stream;
FILE* outputfile;
stream=fopen("input.txt","r");
	outputfile=fopen("output.txt","w");

输入改为:

if(stream==NULL)
	    printf("error");
	else
	{
		for(i=0;i<5;i++)
		{
			fscanf(stream,"%d %d %d",&ele[i].time,&ele[i].start,&ele[i].end);
		}		
	}

输出改为:

if(outputfile==NULL)
	printf("error");
else
	fprintf(outputfile,"%d时,停靠在%d楼
",t,ele[i].end);

运行结果


第3、5组数据用于检验程序是否能正确判断“电梯是否需要停止一段时间等待下一次命令发出”;
第2、3和4、5组数据用于检验程序是否能正确计算“相邻两趟目的地变化时所用时间”。
根据输出结果可以判断该程序简单地满足了题目要求,但是还不够优化。

bug调试

最让我印象深刻的就是在一条判断语句中我使用了“=”而不是“==”,一遍又一遍的检查都没有发现问题,最后还是同学帮我看出了这里的错误。记得以前就经常犯这样的错误,俗话说:吃一堑长一智,我要记住这个教训,为以后的编码减少麻烦。

优化思路

1)需要判断在电梯运送乘客的途中是否可以携带上同方向的乘客,通过减少电梯的运送次数来减少乘客等待时间总和;
2)在(1)的基础上需要进一步判断如果可以携带上同方向的乘客,电梯是否需要延长停留时间来携带其他乘客,如果需要延长停留时间,需要判断停留时间是否过长反而造成乘客等待时间总和超过只运送一名乘客的情况。
以上是我暂时能想到的优化思路,现在还没有想出简单的代码来实现这两种功能相结合,电梯调度代码还需要不断的优化与调试,未完待续。。。

原文地址:https://www.cnblogs.com/azeLibertas/p/8444952.html