我們所完成的專案是電梯排程,具體要求如下:
一.專案
現有一新建辦公大廈,共有21層,共有四部電梯,所有電梯基本引數如下表所示:
電梯編號 | 客服務樓層 | 最大乘客數量 | 最大載重量 |
1 | 全部樓層 | 10 | 800kg |
2 | 單層 | 10 | 800kg |
3 | 雙層 | 20 | 1600kg |
4 | 全部樓層 | 20 | 2000kg |
其使用規定如下:
1.樓層號為0到20,其中0為地下一層。
2.有樓層限制的電梯不在響應樓層停靠,如單雙層。
3.所有電梯採用統一按鈕標誌。
二.專案需求與程式分析
這個專案是由我和郭榮傑搭檔完成,程式一開始我們再想利用何種語言去編寫,C++編寫起來過於複雜,計算機圖形學學的又不紮實,利用起來也會困難,最後達成一致利用的語言是C語言。總程式碼行數大致有854行,比我之前做課設的程式碼還要多,歷時10天的樣子。下面對程式進行詳細的分析,程式由4個子函式構成,第一個子函式代表一號電梯的執行,第二個函式代表二號電梯的執行,第三個函式代表三號電梯的執行,第四個函式代表第四個電梯的執行。可想而知,每個電梯的函式所執行的功能基本是一致的,所以一開始我們便想到只要編寫好第一個電梯的執行函式,其他3個電梯的執行函式便能一一攻破。首先單一介紹第一個電梯函式所實現的功能,考慮到電梯不可能一直在一層,所以在使用的過程中,可能遇到電梯在別的樓層停靠,那麼就需要等待,這裡可用隨機數表示此時電梯停在哪層。函式一開始便表明了這個電梯所能容納的人數以及最大載重量,那麼我們需要對每次進來的人數進行統計,然後對他們的體重進行統計,在現實生活中,電梯通過電路和物理相關的知識能自動得出體重,但在C程式中很難實現,我和郭榮傑談論過後,決定人為的輸入體重,以模仿電梯自動獲取重量,對體重進行求和,如果超重了就會提示下去一個人以致於電梯可以正常執行。然後,程式中用到了switch()語句用來選擇下樓還是上樓操作。之後,每個人輸入自己想去的樓層,利用氣泡排序對這些輸入的樓層進行排序,從小到大,電梯然後可以按照這個順序依次上樓並停下,按照這個序列,到某層停下後,可以提示這層有沒有人進來,如果有人進來,會計算他們的體重會不會超重,如果不會超重,統計這個人想上的樓層,然後顯示出來。如此看來程式是完美的,但其實還是存在缺陷的,我們所設計的程式,在中途接人時,只能進入一個人,進入多個人會導致執行出錯,這一點很可惜,我們能力有限沒改出來。電梯下樓的演算法和上樓的演算法大致相同,就是在氣泡排序那裡將從小到大的順序改為由大到小的順序,以實現正常的下樓順序。
對於後面三個電梯函式,所編寫的演算法和第一個電梯函式基本一直,除了電梯限制人數和最大載重量的不同,以及電梯所停靠的樓層是全部樓層還是單雙層,這3處不同稍作修改就能實現。對於全部樓層的程式的1號電梯和4號電梯,電梯一開始的位置是隨機的,可以用隨機數函式表示,但2號電梯和3號電梯很難用隨機數得到準確單雙層樓層號,我試著用了(rand()*10)*2+1結果也並不正確,也許沒有這種表達方式。郭榮傑同學表示他也並不清楚,所以在這裡可以人為的提醒2號電梯和3號電梯只能到達單層號樓或者雙層號樓,這裡我和郭榮傑同學都認為是一個投機行為,現實生活中,我感覺應該用到中斷和電路的知識以及紅外感應的方式,人為輸出提醒標誌應該也是一種很好的解決方法。到這裡基本介紹完了,演算法算是比較交單的,這也和我們的能力有關。程式中用到了大量的switch()語句,以及氣泡排序語句,思路很清晰,功能也很簡單。但比起某些大神設計的程式,真是小巫見大巫了。這也更激發了我在日後的學習過程更加的努力和奮鬥。
三.對方性格評價
應老師的要求下面對我的隊友郭榮傑進行些許評價,郭榮傑同學工作起來的樣子很認真,態度很端正,我們在某些環節的爭論過程中也沒有出現面紅耳赤的情況,那是因為郭榮傑同學的脾氣較好,我本人的脾氣也不差,我覺得郭榮傑同學是理想的合作伙伴,郭榮傑同學還學習了編寫網頁的語言,我也學了些許html的知識,開始我們想用html知識或者php編寫,後來想想挺難的,便想用html完成介面設計,然而能力有限,介面還是沒開發出來,只能利用c語言的exe視窗了。郭榮傑同學在編碼時容易漏掉花括號,以致於總是讓我來找錯誤,然後,郭榮傑同學容易把中文輸入法的標點符號輸入到程式中去,而不是用英文輸入法輸入程式,以致於這裡也會出錯,在演算法效率上,舉個簡單的例子,對於排序演算法,郭榮傑喜歡用快速排序,這種排序效率高,而我喜歡用氣泡排序,雖然氣泡排序效率低,但程式簡單易懂,最後我們便統一了用氣泡排序,這樣程式會更短一點,別人看起來也不會覺得累。下面附上我們一起程式設計過程中的幾張照片:
四.過程總結與感悟
最後對這次程式設計進行大致的總結,一開始拿到這個專案的時候,我們都覺得挺複雜的,程式設計過程中也遇到了不少麻煩,儘管都一一改進了,但終究是能力有限,不能做到更好,我個人在這次結隊程式設計中也深深的知道了自身的缺陷,尤其是在和別的隊伍的成員討論起來時,發現到自己的不足,體會最深的一點是,別的同學已經用JAVA來實現電梯排程程式了,而我所編寫的程式還停留在大一的C語言,儘管我意識到了這一點並開始慢慢的接觸JAVA,以開拓自己的視野和知識,但這次程式設計時間有限,我也就只能在日後的程式設計中,儘量用更高階的語言去實現程式的編寫,而不是隻固定在C語言上。另外,以前落下的基礎知識我也要開始去複習,認真的學習到腦子中,並在日後的自我學習以及上課時,認真對待,不論上的是不是專業課,都認真去聽,不能落在別人的後面。自我感覺,這兩週,我的程式碼量提高了不少,儘管不是什麼優質的程式碼,但我做到了認真去程式設計,認真去修改,認真的和隊友合作,我也感受到了《軟體工程》這門課的魅力,我相信會在日後的學習中,提高自己做為一名軟體工程師的素養,在這次結隊程式設計中,我也學到了不少,首先便是與人合作的能力,之前的程式設計或者是做別的事情,基本沒有和別人合作過,除了在籃球場上打籃球需要團隊合作以外,這次的結隊程式設計合作也許算是我人生中第一次和別人合作去解決問題了把,與人合作不但能學到知識,也能學到別人優秀的品質,更能發現自己的不足之處,程式每天在堆砌,缺點每天也在改正,日後的學習中,我會尋找與別人合作的機會,不但能提高知識,更能學到為人處世的哲學。
五.執行結果與原始碼
下面附上程式執行截圖以及原始碼:
原始碼:
#include<stdio.h> #include<stdlib.h> #include <time.h> int elevator1() { int floor[20]; int i=0; int j=0; int t=0; int p=0; int c=0; int weight[10]; int s=0; int h; int l; int p1; int m; int x; srand(time(NULL)); x=rand()%20; while(1) { printf("1.上樓\n"); printf("2.下樓\n"); printf("3.退出\n"); printf("請選擇(1-3):"); scanf("%d",&c); switch(c) { case 1: printf("此電梯可服務全部樓層\n"); printf("此電梯最大乘客數量10人,最大載重量800KG\n"); printf("此時電梯正在%d層,稍作等待\n",x); printf("請輸入進入電梯的人數:\n"); scanf("%d",&p); printf("他們的體重依次是:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&weight[i]); s=s+weight[i]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[i]; p=p-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入你想去的樓層:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&floor[i]); } for(j=0;j<p-1;j++) for(i=0;i<p-1-j;i++) { if(floor[i]>floor[i+1]) { t=floor[i]; floor[i]=floor[i+1]; floor[i+1]=t; } } printf("將依次到達下列樓層:\n"); for(j=0;j<p;j++) { printf("%d\n",floor[j]); printf("已到達%d層,走好\n",floor[j]); printf("此層有沒有人進電梯?請選擇:1-2\n"); printf("1.有人\n"); printf("2.無人\n"); scanf("%d",&h); switch(h) { case 1: printf("請進電梯\n"); printf("進入電梯人數:\n"); scanf("%d",&p1); printf("依次的體重:\n"); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[l]; p1=p1-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入想去的樓層:\n"); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到達%d層,走好\n",floor[m]); continue; } break; case 2: printf("關閉電梯門\n"); break; } } break; case 2: printf("此電梯可服務全部樓層\n"); printf("此電梯最大乘客數量10人,最大載重量800KG\n"); printf("此時電梯正在%d層,稍作等待\n",x); printf("請輸入進入電梯的人數:\n"); scanf("%d",&p); printf("他們的體重依次是:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&weight[i]); s=s+weight[i]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[i]; p=p-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入你想去的樓層:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&floor[i]); } for(j=0;j<p-1;j++) for(i=0;i<p-1-j;i++) { if(floor[i]<floor[i+1]) { t=floor[i]; floor[i]=floor[i+1]; floor[i+1]=t; } } printf("將依次到達下列樓層:\n"); for(j=0;j<p;j++) { printf("%d\n",floor[j]); printf("已到達%d層,走好\n",floor[j]); printf("此層有沒有人進電梯?請選擇:1-2\n"); printf("1.有人\n"); printf("2.無人\n"); scanf("%d",&h); switch(h) { case 1: printf("請進電梯\n"); printf("進入電梯人數:\n"); scanf("%d",&p1); printf("依次的體重:\n"); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[l]; p1=p1-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入想去的樓層:\n"); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到達%d層,走好\n",floor[m]); continue; } break; case 2: printf("關閉電梯門\n"); break; } } break; case 3: return 0; break; } } } int elevator2() { int floor[20]; int i=0; int j=0; int t; int p; int c; int h; int weight[10]; int s=0; int l; int p1; int m; while(1) { printf("1.上樓\n"); printf("2.下樓\n"); printf("3.退出\n"); printf("請選擇(1-3):"); scanf("%d",&c); switch(c) { case 1: printf("此電梯只服務單號樓層\n"); printf("此電梯最大乘客數量10人,最大載重量800KG\n"); printf("請輸入進入電梯的人數:\n"); scanf("%d",&p); printf("他們的體重依次是:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&weight[i]); s=s+weight[i]; if(s>800) { printf("超重,請下去一個人"); s=s-weight[i]; p=p-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入你想去的單號樓層:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&floor[i]); } for(j=0;j<p-1;j++) for(i=0;i<p-1-j;i++) { if(floor[i]>floor[i+1]) { t=floor[i]; floor[i]=floor[i+1]; floor[i+1]=t; } } printf("將依次到達下列樓層:\n"); for(j=0;j<p;j++) { printf("%d\n",floor[j]); printf("已到達%d層,走好\n",floor[j]); printf("此層有沒有人進電梯?請選擇:1-2\n"); printf("1.有人\n"); printf("2.無人\n"); scanf("%d",&h); switch(h) { case 1: printf("請進電梯\n"); printf("進入電梯人數:\n"); scanf("%d",&p1); printf("依次的體重:\n"); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[l]; p1=p1-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入想去的樓層:\n"); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到達%d層,走好\n",floor[m]); continue; } break; case 2: printf("關閉電梯門\n"); break; } } break; case 2: printf("此電梯只服務單號樓層\n"); printf("此電梯最大乘客數量10人,最大載重量800KG\n"); printf("請輸入進入電梯的人數:\n"); scanf("%d",&p); printf("他們的體重依次是:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&weight[i]); s=s+weight[i]; if(s>800) { printf("超重,請下去一個人"); s=s-weight[i]; p=p-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入你想去的單號樓層:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&floor[i]); } for(j=0;j<p-1;j++) for(i=0;i<p-1-j;i++) { if(floor[i]<floor[i+1]) { t=floor[i]; floor[i]=floor[i+1]; floor[i+1]=t; } } printf("將依次到達下列樓層:\n"); for(j=0;j<p;j++) { printf("%d\n",floor[j]); printf("已到達%d層,走好\n",floor[j]); printf("此層有沒有人進電梯?請選擇:1-2\n"); printf("1.有人\n"); printf("2.無人\n"); scanf("%d",&h); switch(h) { case 1: printf("請進電梯\n"); printf("進入電梯人數:\n"); scanf("%d",&p1); printf("依次的體重:\n"); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[l]; p1=p1-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入想去的樓層:\n"); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到達%d層,走好\n",floor[m]); continue; } break; case 2: printf("關閉電梯門\n"); break; } } break; case 3: return 0; break; } } } int elevator3() { int floor[20]; int i=0; int j=0; int t; int p; int c; int weight[20]; int s=0; int h; int l; int p1; int m; while(1) { printf("1.上樓\n"); printf("2.下樓\n"); printf("3.退出\n"); printf("請選擇(1-3):"); scanf("%d",&c); switch(c) { case 1: printf("此電梯只服務雙號樓層\n"); printf("此電梯最大乘客數量20人,最大載重量1600KG\n"); printf("請輸入進入電梯的人數:\n"); scanf("%d",&p); printf("他們的體重依次是:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&weight[i]); s=s+weight[i]; if(s>1600) { printf("超重,請下去一個人"); s=s-weight[i]; p=p-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入你想去的雙號樓層:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&floor[i]); } for(j=0;j<p-1;j++) for(i=0;i<p-1-j;i++) { if(floor[i]>floor[i+1]) { t=floor[i]; floor[i]=floor[i+1]; floor[i+1]=t; } } printf("將依次到達下列樓層:\n"); for(j=0;j<p;j++) { printf("%d\n",floor[j]); printf("已到達%d層,走好\n",floor[j]); printf("此層有沒有人進電梯?請選擇:1-2\n"); printf("1.有人\n"); printf("2.無人\n"); scanf("%d",&h); switch(h) { case 1: printf("請進電梯\n"); printf("進入電梯人數:\n"); scanf("%d",&p1); printf("依次的體重:\n"); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[l]; p1=p1-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入想去的樓層:\n"); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到達%d層,走好\n",floor[m]); continue; } break; case 2: printf("關閉電梯門\n"); break; } } break; case 2: printf("此電梯只服務雙號樓層\n"); printf("此電梯最大乘客數量20人,最大載重量1600KG\n"); printf("請輸入進入電梯的人數:\n"); scanf("%d",&p); printf("他們的體重依次是:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&weight[i]); s=s+weight[i]; if(s>1600) { printf("超重,請下去一個人"); s=s-weight[i]; p=p-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入你想去的雙號樓層:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&floor[i]); } for(j=0;j<p-1;j++) for(i=0;i<p-1-j;i++) { if(floor[i]<floor[i+1]) { t=floor[i]; floor[i]=floor[i+1]; floor[i+1]=t; } } printf("將依次到達下列樓層:\n"); for(j=0;j<p;j++) { printf("%d\n",floor[j]); printf("已到達%d層,走好\n",floor[j]); printf("此層有沒有人進電梯?請選擇:1-2\n"); printf("1.有人\n"); printf("2.無人\n"); scanf("%d",&h); switch(h) { case 1: printf("請進電梯\n"); printf("進入電梯人數:\n"); scanf("%d",&p1); printf("依次的體重:\n"); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[l]; p1=p1-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入想去的樓層:\n"); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到達%d層,走好\n",floor[m]); continue; } break; case 2: printf("關閉電梯門\n"); break; } } break; case 3: return 0; break; } } } int elevator4() { int floor[20]; int i=0; int j=0; int t; int p; int c; int weight[20]; int s=0; int h; int x; int l; int p1; int m; srand(time(NULL)); x=rand()%20; while(1) { printf("1.上樓\n"); printf("2.下樓\n"); printf("3.退出\n"); printf("請選擇(1-3):"); scanf("%d",&c); switch(c) { case 1: printf("此電梯可服務全部樓層\n"); printf("此電梯最大乘客數量20人,最大載重量2000KG\n"); printf("此時電梯正在%d層,稍作等待\n",x); printf("請輸入進入電梯的人數:\n"); scanf("%d",&p); printf("他們的體重依次是:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&weight[i]); s=s+weight[i]; if(s>2000) { printf("超重,請下去一個人"); s=s-weight[p]; p=p-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入你想去的樓層:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&floor[i]); } for(j=0;j<p-1;j++) for(i=0;i<p-1-j;i++) { if(floor[i]>floor[i+1]) { t=floor[i]; floor[i]=floor[i+1]; floor[i+1]=t; } } printf("將依次到達下列樓層:\n"); for(j=0;j<p;j++) { printf("%d\n",floor[j]); printf("已到達%d層,走好\n",floor[j]); printf("此層有沒有人進電梯?請選擇:1-2\n"); printf("1.有人\n"); printf("2.無人\n"); scanf("%d",&h); switch(h) { case 1: printf("請進電梯\n"); printf("進入電梯人數:\n"); scanf("%d",&p1); printf("依次的體重:\n"); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[l]; p1=p1-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入想去的樓層:\n"); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到達%d層,走好\n",floor[m]); continue; } break; case 2: printf("關閉電梯門\n"); break; } } break; case 2: printf("此電梯服務全部樓層\n"); printf("此電梯最大乘客數量20人,最大載重量2000KG\n"); printf("此時電梯正在%d層,稍作等待\n",x); printf("請輸入進入電梯的人數:\n"); scanf("%d",&p); printf("他們的體重依次是:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&weight[i]); s=s+weight[i]; if(s>2000) { printf("超重,請下去一個人"); s=s-weight[i]; p=p-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入你想去的樓層:\n"); for(i=0;i<p;i++) { printf("第%d個人: ",i+1); scanf("%d",&floor[i]); } for(j=0;j<p-1;j++) for(i=0;i<p-1-j;i++) { if(floor[i]<floor[i+1]) { t=floor[i]; floor[i]=floor[i+1]; floor[i+1]=t; } } printf("將依次到達下列樓層:\n"); for(j=0;j<p;j++) { printf("%d\n",floor[j]); printf("已到達%d層,走好\n",floor[j]); printf("此層有沒有人進電梯?請選擇:1-2\n"); printf("1.有人\n"); printf("2.無人\n"); scanf("%d",&h); switch(h) { case 1: printf("請進電梯\n"); printf("進入電梯人數:\n"); scanf("%d",&p1); printf("依次的體重:\n"); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,請下去一個人\n"); s=s-weight[l]; p1=p1-1; } } printf("載重量為%dkg,未超重\n",s); printf("請輸入想去的樓層:\n"); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到達%d層,走好\n",floor[m]); continue; } break; case 2: printf("關閉電梯門\n"); break; } } break; case 3: return 0; break; } } } void main() { int a; while(1) { printf("歡迎使用電梯\n"); printf("1.乘坐1號電梯\n"); printf("2.乘坐2號電梯\n"); printf("3.乘坐3號電梯\n"); printf("4.乘坐4號電梯\n"); printf("5.退出\n"); printf("請選擇(1-5):"); scanf("%d",&a); getchar(); switch(a) { case 1: elevator1(); break; case 2: elevator2(); break; case 3: elevator3(); break; case 4: elevator4(); break; case 5: exit(0); break; } } }