结对项目---电梯调度

 

结队人员:董强强(本人),万延正(小伙伴)

我的小伙伴:万延正,博客地址:http://www.cnblogs.com/wyz937386163/

程序已经推送到coding上了,coding链接:https://coding.net/u/DreamQ/p/Elevator/git/blob/master/Elevator.cpp

电梯调度

控制21层楼的4部电梯,1、4号电梯全部楼层可以停靠,2、3号电梯分别停靠单双层,1、2号电梯最大载重800kg,人数限制为10人,3、4号电梯人数限制为20人,最大载重分别为1600kg和2000kg。

以上是老师原本的要求,但我和我的结对伙伴编程能力比较弱,因此没有做出来界面,程序也只是对一部电梯实现了look算法,没有使用多线程编程,没有达到老师的要求。以下是程序介绍以及结队心得。

 需求分析:

某小区高层建筑,由于开发商资金匮乏,每栋楼只配备一部电梯(为了我们两人小组的程序虚构的小区)。人数限制为不超过10人,载重量不超过800kg。

该电梯采用look算法。电梯初始化停靠在-1层。电梯上行,首先保存所有提出申请的楼层,然后根据申请的编号到达不同的楼层,乘客进入电梯,判断是否超重或超员,乘客的人数和重量可以用传感器测出来然后把数据送入程序,如果超重提示乘客离开电梯,如果不超重由乘客输入目的楼层,到达目的楼层开门让乘客离开电梯。到达最后的目的层后判断是否有下行申请,如果有则进行电梯下行的操作,如果没有申请电梯降到-1层待命。电梯下行类似于上行操作,不同的是电梯上行到某一层,这层之后如果没有被要求到达的楼层电梯降到-1层待命,电梯下行是直接降落到-1层,中途在需要停靠的楼层停靠。

程序设计:

由于只有一部电梯,只需要设计上行和下行两部分就行了。look算法是scan算法的优化版本,但本质还是扫描(scan)算法。

流程图如下:

电梯上行,由于没有界面,只能由用户从控制台输入数据,用户输入完数据后保存在申请楼层的数组里,逐层判断。到达申请楼层输入目的楼层,然后继续逐层判断,直到没有需要到达的楼层。感觉自己的注释比较清楚,就不做赘述了。代码如下:

void Up()
{

    //数组floor1保存提出申请的层数
    int floor1[21];
    //变量floor2保存到达目的层数
    int floor2[21];
    //定义变量Weight,Num保存电梯内的总人数和重量
    int Weight=0,Num=0;
    //定义变量Weight1,Num1保存进入电梯的乘客的重量和人数
    int Weight1=0,Num1=0;
    //定义变量Weight2,Num2保存离开电梯的乘客的人数和质量
    int Weight2=0,Num2=0;
    //定义一维数组存储出电梯的人数以及重量
    int out[2];
    //避免二次提示的变量
    int Number=0;

    //判断有无下行的变量
    int Request;
    //临时变量
    int i,j,k;
    int m=1,temp1=0,temp2=0;
    //int m,n,l;


    printf("输入提出申请的层数,回车结束输入\n");
    //将提出申请的层数的乘客信息保存
    for(i=0;;i++)
    {
        scanf("%d",&floor1[i]);
        if(temp1<floor1[i])
        {
            temp1=floor1[i];
        }
        //回车结束输入
        if(getchar()=='\n')
        {
            break;
        }
    }
    
    
    printf("上行...\n");

    //每循环一次电梯上一层楼
    for(i=0;i<=temp1||i<=temp2;i++)
    {
        
        printf("电梯到达%d层\n",i);
        //循环判断是否到达需要停靠的楼层,可以免去排序过程
        for(j=0;j<floor1[j]||j<floor2[j];j++)
        {
            //判断是否到达目的楼层
            if(i==floor2[j])
            {

                printf("开门,乘客离开,输入离开的乘客的人数,重量\n");
                scanf("%d%d",&Num2,&Weight2);
                //判断是否超重
                Weight-=Weight2;
                Num-=Num2;
                Number=floor2[j];
                printf("电梯内有%d人,重%d\n",Num,Weight);
            }
            //判断是否到达申请的楼层
            if(i==floor1[j])
            {
                //申请楼层和目的楼层相同,避免多次提示开门
                if(Number!=floor1[j])
                {
                    printf("开门,乘客进入\n");
                }
                else
                {
                    printf("乘客进入\n");
                }
                printf("输入进入电梯乘客的人数和重量\n");
                scanf("%d%d",&Num1,&Weight1);
                Num+=Num1;
                Weight+=Weight1;
                //如果超重或超员
                if(Weight>=800||Num>=10)
                {
                    //提示乘客离开电梯
                    while(1)
                    {
                        printf("超重或人数过多,输出下电梯的人数及重量:\n");
                        scanf("%d%d",&out[0],&out[1]);
                        Num-=out[0];
                        Weight-=out[1];
                        if(Num<10&&Weight<800)
                        {
                            break;
                        }
                    }
                    
                }
                    printf("不超重,关门\n");
                    printf("电梯内有%d人,重%d\n",Num,Weight);
                    //输入目的层数
                    printf("输入目的层数,回车结束输入:\n");
                    //循环输入目的楼层,但输入数据不能多于还未到达楼层的总数
                    for(k=m;k<(21-i);k++)
                    {
                        scanf("%d",&floor2[k-1]);
                        //如果最高申请楼层不是顶层且该层之上无申请
                        if(temp2<=floor2[k-1])
                        {
                            temp2=floor2[k-1];
                            
                        }  
                        //设置第三方变量m,防止再次输入楼层时数据覆盖
                        m++;
                        //结束输入条件判断
                        if(getchar()=='\n')
                        {
                            break;
                        }    
                    }
                    //电梯继续上行
                
            }
            
        }
        
    }

    
    printf("是否有下行申请,有(1),无(0)\n");
    scanf("%d",&Request);
    if(Request==0)
    {
        printf("电梯降到-1层待命\n");
    }
    else
    {
        Down();
    }
    //printf("up\n");
}
View Code

 

电梯下行,下行的子程序和上行的子程序基本相同,少了判断电梯到达的楼层之后是否还有需求楼层的部分,其他部分基本相同。具体代码可以到博客开头的coding地址上查看。

程序调试:

因为我的我的搭档在编程方面都是水的不要不要的人,所以代码的测试部分还是有很多问题的,比如超重或者超员的判断,一开始我是写了个子程序来判断,超重处理是在子程序完成的,所以需要返回两个值,人数和重量,准备定义全局变量或者定义指针来解决这个问题,万延正说这段子程序完全可以不写嘛,几行代码没必要在写成个子程序,于是判断超重与超员的函数写到电梯上行子函数里面问题解决了。之后还有提示的问题,由于没有界面程序不直观,只能用语言来弥补,但话说多了难免混乱,我的搭档删减了一些提示语句后就让程序还看得过去了。然后就是电梯到达的楼层之上的楼层不再被需要时的操作,万延正说可以把最高楼层的编号放到数组的首地址里面,然后用这个判断是否到达申请或目的的最高楼层。我感觉不使用第三方变量肯定会有bug,聪明如我,bug还是被我发现了,然后万延正听我的定义了一个临时变量,判断楼层编号大小,然后把最大的编号存放到临时变量里面,问题解决:)。其实我们还讨论很多小问题,只是时间有些长了,忘了:(  下面附上几张程序调试的截图:

 界面有限,只输入两个上行申请楼层,乘客在5层和9层提出申请,分别要到达8层和14层,14层之上的楼层没有被需求,判断是否有下行申请,有执行下行申请,无降到-1层待命。

超重判断的程序调试截图如下:

电梯下行的程序调试界面,申请楼层为14层和16层,目的楼层为5层和2层,最后停靠在-1层待命:

程序比较简单,以上是测试截图。

结队心得:

还得说说我俩的基础,我的基础已经很差了,我的小伙伴和我比真的是半斤八两,真的是太差了,简直不忍直视。我俩接受新事物能力又不强,学习计算机的竟然还说编程是新事物真的很惭愧,但是事实如此,也只能硬着头皮上了,感觉我俩很努力了,但效果并不显著,项目虽然做出来了,但完全不符合要求(泪奔)。我前几年作的死(打死不学专业课)的恶果已经长成,流着泪都得咽下去:(。看到其他同学的项目,才发现差距之巨大,才知道自己还是没有用全力去学习,才知道自己弱小的不要不要的。现在只能用羡慕的眼光看着别人把胜利果实高高举起。不过还好是结队编程,这又不是我一个人的事,小伙伴忙一点我忙一点,慢慢的程序就成型了,然后他指出bug,我攻克bug,程序就可以运行了,尽管现在的程序依然有很多bug,不过之前的bug已经消失了,慢慢努力吧。

I am a slow worker,but I never work backwards.–––Lincoln

我很喜欢林肯的这句话,虽然我进步不明显,但我是不会再走回头路的。且行且进步。

最后附上我俩工作中的英姿:

posted on 2016-04-07 22:55  Double强  阅读(449)  评论(1编辑  收藏  举报

导航