结对编程:电梯调度

电梯调度项目:


项目分析与需求:

      从题目上来看,项目要求编写一个掌控电梯的程序。电梯这个东西,大家都乘过,无非就是:乘客上电梯,判断是否超重,乘客选择想要达到的楼层,最后依次去到离需求最近的一个楼层。

      项目中要求有四个电梯,其中第一号和第四号电梯是一模一样的,只需要把负载量给修改即可;第二和第三也大同小异,只需要把负载量和输入楼层的判断方式修改一下即可。

      在我们的设想中,我们要达到的效果是这样的:得有一个switch语句,来控制一开始的电梯选择界面;之后在case语句之后相应搭载各种需要的语句以及子函数。Case中的东西就是每个电梯相对应的执行方法,也就是解决方案。

      从一号电梯来看,本电梯全楼层通用,并且限制载客量10人,总重量限制在800KG。虽然我并不知道限制载客量有什么用,一般来说电梯只有超重一说,毕竟体形庞大的人不多见,而且在实际应用中的电梯,总不可能上来一个人还要计数吧。但是既然项目要求限制载客量10人我也就不继续吐槽了。限制载客量很好解决,只要设定一个整形全局变量来表示电梯内当前总人数,保持它的数值不超过10即可。总重量限制也很好解决,设定一个容量为最大限制人数的数组,当然还得是全局变量,对其进行一系列的累加或者调整操作即可。之后接着加上记录乘客想要去的楼层的函数以及判断当前楼层并且对下一个人想要去的楼层数进行判断的函数(arrvie())。这些都比较简单。例如Arrvie函数对当前的楼层进行判断,并对所有人想要去的楼层与其判断,最后得出哪个楼层离现在的楼层最近就去哪一个楼层。


对方编程习惯总结:

      对于代码规范,我们已经上了这么久软件工程课,所以张宏伟同学还是对此比较重视的。代码基本清晰明了,并不存在某些语句看起来乱七八糟,不过不足的就是参数设定不够严谨,某些传递的参数,有时候传来传去自己都看不懂是干什么的了。算法效率的问题,他并没有考虑这一方面,能做到的只是把代码运行出来并且结果正确,这对于我们两人都是一样的。一开始设想这个程序会比较麻烦,于是打算使用面向对象的语言进行编写,这样或许会方便一些,张宏伟同学似乎对编程语言的学习挺丰富,JAVA和C++之类的语言都能上手,但是因为我不会JAVA,虽然能够看懂,但是却无法参与其中的编写。最后只能使用大家都会的C语言。


对方性格评价:

      张宏伟同学对这个结对编程是比较重视的,大概这对他也是一种磨练,所以他对此很积极。在编写代码的时候,会对一些比较复杂的东西探究到底,不说出个所以然决不罢休,这很对我的胃口,我也是属于那种问题不解决就不放手的那种人,于是我们对这个程序的编写过程的讨论持愉悦态度。不过他在编写程序的时候,容易漏掉一些字符,比如说分号或者大括号,这样一来在最后DEBUG的时候就会比较麻烦,一直在找哪里漏东西,的确有点累人。张宏伟同学虽然对问题的探究比较认真,但是却是一个脾气较好的人,并不会因为一时的讨论不清而产生争执,这是我最为欣赏他的一点,这也是我需要向他学习的一点。


本次编程的过程体会和总结:

      在最开始的设想,我们本来想做出一个特别完整的电梯程序——每到一个楼层之后,乘客下电梯,还有乘客上电梯,之后继续判定要去的楼层。不过我和张宏伟同学进行讨论以后,试着写了一下,发现这种复杂的项目让我们这些菜鸟来写,两周的时间是果断不够的。于是我们就研究出了一个比较简单的方法——就是中途不能上人,只能一开始上人,上完人之后立马依次按楼层走。这个思路是比较简单的,不过却能够很好地写出来。虽然有些不满足不甘心拿出这样的程序,但是也只能这样。不过这更加激发了我以后更加努力的决心,因为不足,所以才想奋斗。

      这一次的结对编程对我来说意义是重大的,因为这是我第一次和他人进行编写同一个程序。一个人写程序的时候,遇到了不懂得的问题,只能够问百度和谷歌,真的问不到的话,最后只能求救于大神。但是大神不可能每一次都在,也不可能每一次都能看懂我冗长的代码,所以这是比较难堪的一件事。但是在结对编程中,我有拍档,我和张宏伟同学在一起编写同一份程序,所以每个人都对这个程序十分的了解,也就并没有出现读不懂程序的事情。

      两人人的智慧加在一起,并不只是两个人的智慧。两人在一起做一件事情的时候,“互补”这个词就能体现的很明显。我不明白的时候,问拍档,拍档能够很好的解答我的问题;排档不明白的问题,我也能够稍加思索给出答案。若是两人都不懂的事情,可以共同探讨结果,得出结果的速度完全可以超过一个人的速度。

      这或许就是团队的力量。


源代码(已上传至coding):

#include <stdio.h>
#include <stdlib.h> 
#include <math.h>

int groud=1,weight1,a1[10]={0},b1[11]={-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99},w;            //a[]为1号电梯内人的重量,b[]为1号电梯内人依次选择的楼层数,以-99记为空值

int a4[11]={0},b4[21]={-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99,-99};



/////////一号电梯子函数///////////////////
 
int in_p(int j)                                  //乘客进入电梯,判断电梯内这次最终进入人数的函数
{
    int people=0;
    printf("请问有多少人进入电梯:
");
    scanf("%d",&people);
    while((people+j)>10)
    {
    printf("人数过多,本电梯最大载客量为10人,请最后进入电梯的一位乘客离开!
");
    people--;
    printf("现在电梯内人数为%d!
",people+j);
    }
    printf("本次进入人数为%d人!

",people);
    return people;    
}

int in_w(int people,int j)                                       //判断全员是否超重,返回剩余乘客数量,电梯内最终重量weight1为全局变量
{
    if(people>=1)
    {
    printf("请依次输入本次加入的每位乘客的体重(体重单位kg):
");
      for(w=0;w<people;w++)
      {
       scanf("%d",&a1[w]);
       weight1=weight1+a1[w];
      }    
      while(weight1>800)
      {
       printf("超重!请第%d位进入电梯的乘客自行离开电梯!
",w);
       weight1=weight1-a1[w-1];
       w--;
       printf("剩余乘客%d人,正在计算是否超重!
",w+j);
      }
    }
    printf("电梯关门,请勿伸手触碰!

");

    return w;
}


void choose(int people,int j)                                             //选择楼层,选择后所有人选择的楼层都将记录在全局数组b1中
{
    int new_groud=0;
    if(people>=1)
    {
    printf("请当前上来的乘客依次选择你想要去的楼层(0~20层),当前楼层数为%d!
",groud);
    for(int k=0;k<j;k++)
    {
loop: scanf("%d",&new_groud);
    if(new_groud>=20)
    {
        printf("输入的楼层不存在,请重新输入!
");
        goto loop;
    }
    if(b1[k]==-99)
    b1[k]=new_groud;
    }
    }
    printf("电梯正在运行!

");

}

int arrive(int j)                                    //到达目的地后,乘客下电梯与乘客上电梯,并将最后的人数返回
{
    int min=0,min1=0,groud_want=groud,u=j,m;
    if(b1[0]!=-99)
    {
    min=(int)(fabs(groud-b1[0]));
    groud_want=b1[0];
    for(m=1;m<=j;m++)
    {
     min1=(int)(fabs(groud-b1[m]));
        if(min1<=min)
         {
           min=min1;
           groud_want=b1[m];
         }
    }
    }
    groud=groud_want;
    printf("电梯已到达第%d层!到达目的地的乘客请下电梯!

",groud);
    for(m=0;m<=u;m++)
    {
    if(b1[m]==groud)
    {
        b1[m]=-99;
        printf("下乘客一名!
");
        j--;
    }
    }
    for(m=0;m<11;m++)
    {
    if(b1[m]==-99)
    {
      b1[m]=b1[m+1];
      b1[m+1]=-99;
    }
    }
    return j;
}


/////////二号电梯子函数///////////////////
 
int in_p2(int j)                                  //乘客进入电梯,判断电梯内这次最终进入人数的函数
{
    int people=0;
    printf("请问有多少人进入电梯:
");
    scanf("%d",&people);
    while((people+j)>10)
    {
    printf("人数过多,本电梯最大载客量为10人,请最后进入电梯的一位乘客离开!
");
    people--;
    printf("现在电梯内人数为%d!
",people+j);
    }
    printf("本次进入人数为%d人!

",people);
    return people;    
}

int in_w2(int people,int j)                                       //判断全员是否超重,返回剩余乘客数量,电梯内最终重量weight1为全局变量
{
    if(people>=1)
    {
    printf("请依次输入本次加入的每位乘客的体重(体重单位kg):
");
      for(w=0;w<people;w++)
      {
       scanf("%d",&a1[w]);
       weight1=weight1+a1[w];
      }    
      while(weight1>800)
      {
       printf("超重!请第%d位进入电梯的乘客自行离开电梯!
",w);
       weight1=weight1-a1[w-1];
       w--;
       printf("剩余乘客%d人,正在计算是否超重!
",w+j);
      }
    }
    printf("电梯关门,请勿伸手触碰!

");

    return w;
}


void choose2(int people,int j)                                             //选择楼层,选择后所有人选择的楼层都将记录在全局数组b1中
{
    int new_groud=0;
    if(people>=1)
    {
    printf("请当前上来的乘客依次选择你想要去的楼层(0~20层),当前楼层数为%d!
",groud);
    for(int k=0;k<j;k++)
    {
loop: scanf("%d",&new_groud);
    if(new_groud%2!=1)
    {
    printf("错误楼层,请选择单数楼层!
");
    goto loop;
    }
    if(new_groud>=21)
    {
        printf("输入的楼层不存在,请重新输入!
");
        goto loop;
    }
    if(b1[k]==-99)
    b1[k]=new_groud;
    }
    }
    printf("电梯正在运行!

");

}

int arrive2(int j)                                    //到达目的地后,乘客下电梯与乘客上电梯,并将最后的人数返回
{
    int min=0,min1=0,groud_want=groud,u=j,m;
    if(b1[0]!=-99)
    {
    min=(int)(fabs(groud-b1[0]));
    groud_want=b1[0];
    for(m=1;m<=j;m++)
    {
     min1=(int)(fabs(groud-b1[m]));
        if(min1<=min)
         {
           min=min1;
           groud_want=b1[m];
         }
    }
    }
    groud=groud_want;
    printf("电梯已到达第%d层!到达目的地的乘客请下电梯!

",groud);
    for(m=0;m<=u;m++)
    {
    if(b1[m]==groud)
    {
        b1[m]=-99;
        printf("下乘客一名!
");
        j--;
    }
    }
    for(m=0;m<11;m++)
    {
    if(b1[m]==-99)
    {
      b1[m]=b1[m+1];
      b1[m+1]=-99;
    }
    }
    return j;
}


/////////三号电梯子函数///////////////////
 
int in_p3(int j)                                  //乘客进入电梯,判断电梯内这次最终进入人数的函数
{
    int people=0;
    printf("请问有多少人进入电梯:
");
    scanf("%d",&people);
    while((people+j)>20)
    {
    printf("人数过多,本电梯最大载客量为20人,请最后进入电梯的一位乘客离开!
");
    people--;
    printf("现在电梯内人数为%d!
",people+j);
    }
    printf("本次进入人数为%d人!

",people);
    return people;    
}

int in_w3(int people,int j)                                       //判断全员是否超重,返回剩余乘客数量,电梯内最终重量weight1为全局变量
{
    if(people>=1)
    {
    printf("请依次输入本次加入的每位乘客的体重(体重单位kg):
");
      for(w=0;w<people;w++)
      {
       scanf("%d",&a4[w]);
       weight1=weight1+a4[w];
      }    
      while(weight1>1600)
      {
       printf("超重!请第%d位进入电梯的乘客自行离开电梯!
",w);
       weight1=weight1-a4[w-1];
       w--;
       printf("剩余乘客%d人,正在计算是否超重!
",w+j);
      }
    }
    printf("电梯关门,请勿伸手触碰!

");

    return w;
}


void choose3(int people,int j)                                             //选择楼层,选择后所有人选择的楼层都将记录在全局数组b1中
{
    int new_groud=0;
    if(people>=1)
    {
    printf("请当前上来的乘客依次选择你想要去的楼层(0~20层),当前楼层数为%d!
",groud);
    for(int k=0;k<j;k++)
    {
loop: scanf("%d",&new_groud);
    if(new_groud%2!=0)
    {
    printf("错误楼层,请选择单数楼层!
");
    goto loop;
    }
    if(new_groud>=21)
    {
        printf("输入的楼层不存在,请重新输入!
");
        goto loop;
    }
    if(b4[k]==-99)
    b4[k]=new_groud;
    }
    }
    printf("电梯正在运行!

");

}

int arrive3(int j)                                    //到达目的地后,乘客下电梯与乘客上电梯,并将最后的人数返回
{
    int min=0,min1=0,groud_want=groud,u=j,m;
    if(b4[0]!=-99)
    {
    min=(int)(fabs(groud-b4[0]));
    groud_want=b4[0];
    for(m=1;m<=j;m++)
    {
     min1=(int)(fabs(groud-b4[m]));
        if(min1<=min)
         {
           min=min1;
           groud_want=b4[m];
         }
    }
    }
    groud=groud_want;
    printf("电梯已到达第%d层!到达目的地的乘客请下电梯!

",groud);
    for(m=0;m<=u;m++)
    {
    if(b4[m]==groud)
    {
        b4[m]=-99;
        printf("下乘客一名!
");
        j--;
    }
    }
    for(m=0;m<11;m++)
    {
    if(b4[m]==-99)
    {
      b4[m]=b4[m+1];
      b4[m+1]=-99;
    }
    }
    return j;
}

/////////四号电梯子函数///////////////////
 
int in_p4(int j)                                  //乘客进入电梯,判断电梯内这次最终进入人数的函数
{
    int people=0;
    printf("请问有多少人进入电梯:
");
    scanf("%d",&people);
    while((people+j)>20)
    {
    printf("人数过多,本电梯最大载客量为20人,请最后进入电梯的一位乘客离开!
");
    people--;
    printf("现在电梯内人数为%d!
",people+j);
    }
    printf("本次进入人数为%d人!

",people);
    return people;    
}

int in_w4(int people,int j)                                       //判断全员是否超重,返回剩余乘客数量,电梯内最终重量weight1为全局变量
{
    if(people>=1)
    {
    printf("请依次输入本次加入的每位乘客的体重(体重单位kg):
");
      for(w=0;w<people;w++)
      {
       scanf("%d",&a4[w]);
       weight1=weight1+a4[w];
      }    
      while(weight1>2000)
      {
       printf("超重!请第%d位进入电梯的乘客自行离开电梯!
",w);
       weight1=weight1-a4[w-1];
       w--;
       printf("剩余乘客%d人,正在计算是否超重!
",w+j);
      }
    }
    printf("电梯关门,请勿伸手触碰!

");

    return w;
}


void choose4(int people,int j)                                             //选择楼层,选择后所有人选择的楼层都将记录在全局数组b1中
{
    int new_groud=0;
    if(people>=1)
    {
    printf("请当前上来的乘客依次选择你想要去的楼层(0~20层),当前楼层数为%d!
",groud);
    for(int k=0;k<j;k++)
    {
loop: scanf("%d",&new_groud);
    if(new_groud>=20)
    {
        printf("输入的楼层不存在,请重新输入!
");
        goto loop;
    }
    if(b4[k]==-99)
    b4[k]=new_groud;
    }
    }
    printf("电梯正在运行!

");

}

int arrive4(int j)                                    //到达目的地后,乘客下电梯与乘客上电梯,并将最后的人数返回
{
    int min=0,min1=0,groud_want=groud,u=j,m;
    if(b4[0]!=-99)
    {
    min=(int)(fabs(groud-b4[0]));
    groud_want=b4[0];
    for(m=1;m<=j;m++)
    {
     min1=(int)(fabs(groud-b4[m]));
        if(min1<=min)
         {
           min=min1;
           groud_want=b4[m];
         }
    }
    }
    groud=groud_want;
    printf("电梯已到达第%d层!到达目的地的乘客请下电梯!

",groud);
    for(m=0;m<u;m++)
    {
    if(b4[m]==groud)
    {
        b4[m]=-99;
        printf("下乘客一名!
");
        j--;
    }
    }
    for(m=0;m<11;m++)
    {
    if(b4[m]==-99)
    {
      b4[m]=b4[m+1];
      b4[m+1]=-99;
    }
    }
    return j;
}

int main()
{
    printf("欢迎使用电梯!
");

    int i=1;

    int new_groud=1;

    printf("请选择电梯(1~4):
");

    scanf("%d",&i);

    switch(i)
    {
        case 1:{
                 int people=0,j=0,k=0,all=-99;

                  people=in_p(j);

                  j=in_w(people,j);

                  choose(people,j);

                  while(j!=0)
                  {
                      j=arrive(j);
                  }
              
                  break;
               }

        case 2:{
                 int people=0,j=0,k=0,all=-99;

                  people=in_p2(j);

                  j=in_w2(people,j);

                  choose2(people,j);

                  while(j!=0)
                  {
                      j=arrive2(j);
                  }
              
                  break;
               }

        case 3:{
                 int people=0,j=0,k=0,all=-99;

                  people=in_p3(j);

                  j=in_w3(people,j);

                  choose3(people,j);

                  while(j!=0)
                  {
                      j=arrive3(j);
                  }
              
                  break;
               }

        case 4:{
                 int people=0,j=0,k=0,all=-99;

                  people=in_p4(j);

                  j=in_w4(people,j);

                  choose4(people,j);

                  while(j!=0)
                  {
                      j=arrive4(j);
                  }
              
                  break;
               }


        default : printf("error  
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/mohaozhong/p/5369209.html