結對程式設計:電梯排程

eininy發表於2016-04-08

電梯排程專案:


 

專案分析與需求:

      從題目上來看,專案要求編寫一個掌控電梯的程式。電梯這個東西,大家都乘過,無非就是:乘客上電梯,判斷是否超重,乘客選擇想要達到的樓層,最後依次去到離需求最近的一個樓層。

      專案中要求有四個電梯,其中第一號和第四號電梯是一模一樣的,只需要把負載量給修改即可;第二和第三也大同小異,只需要把負載量和輸入樓層的判斷方式修改一下即可。

      在我們的設想中,我們要達到的效果是這樣的:得有一個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("請問有多少人進入電梯:\n");
    scanf("%d",&people);
    while((people+j)>10)
    {
    printf("人數過多,本電梯最大載客量為10人,請最後進入電梯的一位乘客離開!\n");
    people--;
    printf("現在電梯內人數為%d!\n",people+j);
    }
    printf("本次進入人數為%d人!\n\n",people);
    return people;    
}

int in_w(int people,int j)                                       //判斷全員是否超重,返回剩餘乘客數量,電梯內最終重量weight1為全域性變數
{
    if(people>=1)
    {
    printf("請依次輸入本次加入的每位乘客的體重(體重單位kg):\n");
      for(w=0;w<people;w++)
      {
       scanf("%d",&a1[w]);
       weight1=weight1+a1[w];
      }    
      while(weight1>800)
      {
       printf("超重!請第%d位進入電梯的乘客自行離開電梯!\n",w);
       weight1=weight1-a1[w-1];
       w--;
       printf("剩餘乘客%d人,正在計算是否超重!\n",w+j);
      }
    }
    printf("電梯關門,請勿伸手觸碰!\n\n");

    return w;
}


void choose(int people,int j)                                             //選擇樓層,選擇後所有人選擇的樓層都將記錄在全域性陣列b1中
{
    int new_groud=0;
    if(people>=1)
    {
    printf("請當前上來的乘客依次選擇你想要去的樓層(0~20層),當前樓層數為%d!\n",groud);
    for(int k=0;k<j;k++)
    {
loop: scanf("%d",&new_groud);
    if(new_groud>=20)
    {
        printf("輸入的樓層不存在,請重新輸入!\n");
        goto loop;
    }
    if(b1[k]==-99)
    b1[k]=new_groud;
    }
    }
    printf("電梯正在執行!\n\n");

}

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層!到達目的地的乘客請下電梯!\n\n",groud);
    for(m=0;m<=u;m++)
    {
    if(b1[m]==groud)
    {
        b1[m]=-99;
        printf("下乘客一名!\n");
        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("請問有多少人進入電梯:\n");
    scanf("%d",&people);
    while((people+j)>10)
    {
    printf("人數過多,本電梯最大載客量為10人,請最後進入電梯的一位乘客離開!\n");
    people--;
    printf("現在電梯內人數為%d!\n",people+j);
    }
    printf("本次進入人數為%d人!\n\n",people);
    return people;    
}

int in_w2(int people,int j)                                       //判斷全員是否超重,返回剩餘乘客數量,電梯內最終重量weight1為全域性變數
{
    if(people>=1)
    {
    printf("請依次輸入本次加入的每位乘客的體重(體重單位kg):\n");
      for(w=0;w<people;w++)
      {
       scanf("%d",&a1[w]);
       weight1=weight1+a1[w];
      }    
      while(weight1>800)
      {
       printf("超重!請第%d位進入電梯的乘客自行離開電梯!\n",w);
       weight1=weight1-a1[w-1];
       w--;
       printf("剩餘乘客%d人,正在計算是否超重!\n",w+j);
      }
    }
    printf("電梯關門,請勿伸手觸碰!\n\n");

    return w;
}


void choose2(int people,int j)                                             //選擇樓層,選擇後所有人選擇的樓層都將記錄在全域性陣列b1中
{
    int new_groud=0;
    if(people>=1)
    {
    printf("請當前上來的乘客依次選擇你想要去的樓層(0~20層),當前樓層數為%d!\n",groud);
    for(int k=0;k<j;k++)
    {
loop: scanf("%d",&new_groud);
    if(new_groud%2!=1)
    {
    printf("錯誤樓層,請選擇單數樓層!\n");
    goto loop;
    }
    if(new_groud>=21)
    {
        printf("輸入的樓層不存在,請重新輸入!\n");
        goto loop;
    }
    if(b1[k]==-99)
    b1[k]=new_groud;
    }
    }
    printf("電梯正在執行!\n\n");

}

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層!到達目的地的乘客請下電梯!\n\n",groud);
    for(m=0;m<=u;m++)
    {
    if(b1[m]==groud)
    {
        b1[m]=-99;
        printf("下乘客一名!\n");
        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("請問有多少人進入電梯:\n");
    scanf("%d",&people);
    while((people+j)>20)
    {
    printf("人數過多,本電梯最大載客量為20人,請最後進入電梯的一位乘客離開!\n");
    people--;
    printf("現在電梯內人數為%d!\n",people+j);
    }
    printf("本次進入人數為%d人!\n\n",people);
    return people;    
}

int in_w3(int people,int j)                                       //判斷全員是否超重,返回剩餘乘客數量,電梯內最終重量weight1為全域性變數
{
    if(people>=1)
    {
    printf("請依次輸入本次加入的每位乘客的體重(體重單位kg):\n");
      for(w=0;w<people;w++)
      {
       scanf("%d",&a4[w]);
       weight1=weight1+a4[w];
      }    
      while(weight1>1600)
      {
       printf("超重!請第%d位進入電梯的乘客自行離開電梯!\n",w);
       weight1=weight1-a4[w-1];
       w--;
       printf("剩餘乘客%d人,正在計算是否超重!\n",w+j);
      }
    }
    printf("電梯關門,請勿伸手觸碰!\n\n");

    return w;
}


void choose3(int people,int j)                                             //選擇樓層,選擇後所有人選擇的樓層都將記錄在全域性陣列b1中
{
    int new_groud=0;
    if(people>=1)
    {
    printf("請當前上來的乘客依次選擇你想要去的樓層(0~20層),當前樓層數為%d!\n",groud);
    for(int k=0;k<j;k++)
    {
loop: scanf("%d",&new_groud);
    if(new_groud%2!=0)
    {
    printf("錯誤樓層,請選擇單數樓層!\n");
    goto loop;
    }
    if(new_groud>=21)
    {
        printf("輸入的樓層不存在,請重新輸入!\n");
        goto loop;
    }
    if(b4[k]==-99)
    b4[k]=new_groud;
    }
    }
    printf("電梯正在執行!\n\n");

}

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層!到達目的地的乘客請下電梯!\n\n",groud);
    for(m=0;m<=u;m++)
    {
    if(b4[m]==groud)
    {
        b4[m]=-99;
        printf("下乘客一名!\n");
        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("請問有多少人進入電梯:\n");
    scanf("%d",&people);
    while((people+j)>20)
    {
    printf("人數過多,本電梯最大載客量為20人,請最後進入電梯的一位乘客離開!\n");
    people--;
    printf("現在電梯內人數為%d!\n",people+j);
    }
    printf("本次進入人數為%d人!\n\n",people);
    return people;    
}

int in_w4(int people,int j)                                       //判斷全員是否超重,返回剩餘乘客數量,電梯內最終重量weight1為全域性變數
{
    if(people>=1)
    {
    printf("請依次輸入本次加入的每位乘客的體重(體重單位kg):\n");
      for(w=0;w<people;w++)
      {
       scanf("%d",&a4[w]);
       weight1=weight1+a4[w];
      }    
      while(weight1>2000)
      {
       printf("超重!請第%d位進入電梯的乘客自行離開電梯!\n",w);
       weight1=weight1-a4[w-1];
       w--;
       printf("剩餘乘客%d人,正在計算是否超重!\n",w+j);
      }
    }
    printf("電梯關門,請勿伸手觸碰!\n\n");

    return w;
}


void choose4(int people,int j)                                             //選擇樓層,選擇後所有人選擇的樓層都將記錄在全域性陣列b1中
{
    int new_groud=0;
    if(people>=1)
    {
    printf("請當前上來的乘客依次選擇你想要去的樓層(0~20層),當前樓層數為%d!\n",groud);
    for(int k=0;k<j;k++)
    {
loop: scanf("%d",&new_groud);
    if(new_groud>=20)
    {
        printf("輸入的樓層不存在,請重新輸入!\n");
        goto loop;
    }
    if(b4[k]==-99)
    b4[k]=new_groud;
    }
    }
    printf("電梯正在執行!\n\n");

}

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層!到達目的地的乘客請下電梯!\n\n",groud);
    for(m=0;m<u;m++)
    {
    if(b4[m]==groud)
    {
        b4[m]=-99;
        printf("下乘客一名!\n");
        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("歡迎使用電梯!\n");

    int i=1;

    int new_groud=1;

    printf("請選擇電梯(1~4):\n");

    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  \n");
    }
    return 0;
}

 

相關文章