我们所完成的项目是电梯调度,具体要求如下:
一.项目
现有一新建办公大厦,共有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.上楼 "); printf("2.下楼 "); printf("3.退出 "); printf("请选择(1-3):"); scanf("%d",&c); switch(c) { case 1: printf("此电梯可服务全部楼层 "); printf("此电梯最大乘客数量10人,最大载重量800KG "); printf("此时电梯正在%d层,稍作等待 ",x); printf("请输入进入电梯的人数: "); scanf("%d",&p); printf("他们的体重依次是: "); 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,未超重 ",s); printf("请输入你想去的楼层: "); 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("将依次到达下列楼层: "); for(j=0;j<p;j++) { printf("%d ",floor[j]); printf("已到达%d层,走好 ",floor[j]); printf("此层有没有人进电梯?请选择:1-2 "); printf("1.有人 "); printf("2.无人 "); scanf("%d",&h); switch(h) { case 1: printf("请进电梯 "); printf("进入电梯人数: "); scanf("%d",&p1); printf("依次的体重: "); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,请下去一个人 "); s=s-weight[l]; p1=p1-1; } } printf("载重量为%dkg,未超重 ",s); printf("请输入想去的楼层: "); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到达%d层,走好 ",floor[m]); continue; } break; case 2: printf("关闭电梯门 "); break; } } break; case 2: printf("此电梯可服务全部楼层 "); printf("此电梯最大乘客数量10人,最大载重量800KG "); printf("此时电梯正在%d层,稍作等待 ",x); printf("请输入进入电梯的人数: "); scanf("%d",&p); printf("他们的体重依次是: "); 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,未超重 ",s); printf("请输入你想去的楼层: "); 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("将依次到达下列楼层: "); for(j=0;j<p;j++) { printf("%d ",floor[j]); printf("已到达%d层,走好 ",floor[j]); printf("此层有没有人进电梯?请选择:1-2 "); printf("1.有人 "); printf("2.无人 "); scanf("%d",&h); switch(h) { case 1: printf("请进电梯 "); printf("进入电梯人数: "); scanf("%d",&p1); printf("依次的体重: "); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,请下去一个人 "); s=s-weight[l]; p1=p1-1; } } printf("载重量为%dkg,未超重 ",s); printf("请输入想去的楼层: "); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到达%d层,走好 ",floor[m]); continue; } break; case 2: printf("关闭电梯门 "); 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.上楼 "); printf("2.下楼 "); printf("3.退出 "); printf("请选择(1-3):"); scanf("%d",&c); switch(c) { case 1: printf("此电梯只服务单号楼层 "); printf("此电梯最大乘客数量10人,最大载重量800KG "); printf("请输入进入电梯的人数: "); scanf("%d",&p); printf("他们的体重依次是: "); 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,未超重 ",s); printf("请输入你想去的单号楼层: "); 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("将依次到达下列楼层: "); for(j=0;j<p;j++) { printf("%d ",floor[j]); printf("已到达%d层,走好 ",floor[j]); printf("此层有没有人进电梯?请选择:1-2 "); printf("1.有人 "); printf("2.无人 "); scanf("%d",&h); switch(h) { case 1: printf("请进电梯 "); printf("进入电梯人数: "); scanf("%d",&p1); printf("依次的体重: "); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,请下去一个人 "); s=s-weight[l]; p1=p1-1; } } printf("载重量为%dkg,未超重 ",s); printf("请输入想去的楼层: "); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到达%d层,走好 ",floor[m]); continue; } break; case 2: printf("关闭电梯门 "); break; } } break; case 2: printf("此电梯只服务单号楼层 "); printf("此电梯最大乘客数量10人,最大载重量800KG "); printf("请输入进入电梯的人数: "); scanf("%d",&p); printf("他们的体重依次是: "); 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,未超重 ",s); printf("请输入你想去的单号楼层: "); 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("将依次到达下列楼层: "); for(j=0;j<p;j++) { printf("%d ",floor[j]); printf("已到达%d层,走好 ",floor[j]); printf("此层有没有人进电梯?请选择:1-2 "); printf("1.有人 "); printf("2.无人 "); scanf("%d",&h); switch(h) { case 1: printf("请进电梯 "); printf("进入电梯人数: "); scanf("%d",&p1); printf("依次的体重: "); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,请下去一个人 "); s=s-weight[l]; p1=p1-1; } } printf("载重量为%dkg,未超重 ",s); printf("请输入想去的楼层: "); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到达%d层,走好 ",floor[m]); continue; } break; case 2: printf("关闭电梯门 "); 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.上楼 "); printf("2.下楼 "); printf("3.退出 "); printf("请选择(1-3):"); scanf("%d",&c); switch(c) { case 1: printf("此电梯只服务双号楼层 "); printf("此电梯最大乘客数量20人,最大载重量1600KG "); printf("请输入进入电梯的人数: "); scanf("%d",&p); printf("他们的体重依次是: "); 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,未超重 ",s); printf("请输入你想去的双号楼层: "); 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("将依次到达下列楼层: "); for(j=0;j<p;j++) { printf("%d ",floor[j]); printf("已到达%d层,走好 ",floor[j]); printf("此层有没有人进电梯?请选择:1-2 "); printf("1.有人 "); printf("2.无人 "); scanf("%d",&h); switch(h) { case 1: printf("请进电梯 "); printf("进入电梯人数: "); scanf("%d",&p1); printf("依次的体重: "); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,请下去一个人 "); s=s-weight[l]; p1=p1-1; } } printf("载重量为%dkg,未超重 ",s); printf("请输入想去的楼层: "); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到达%d层,走好 ",floor[m]); continue; } break; case 2: printf("关闭电梯门 "); break; } } break; case 2: printf("此电梯只服务双号楼层 "); printf("此电梯最大乘客数量20人,最大载重量1600KG "); printf("请输入进入电梯的人数: "); scanf("%d",&p); printf("他们的体重依次是: "); 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,未超重 ",s); printf("请输入你想去的双号楼层: "); 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("将依次到达下列楼层: "); for(j=0;j<p;j++) { printf("%d ",floor[j]); printf("已到达%d层,走好 ",floor[j]); printf("此层有没有人进电梯?请选择:1-2 "); printf("1.有人 "); printf("2.无人 "); scanf("%d",&h); switch(h) { case 1: printf("请进电梯 "); printf("进入电梯人数: "); scanf("%d",&p1); printf("依次的体重: "); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,请下去一个人 "); s=s-weight[l]; p1=p1-1; } } printf("载重量为%dkg,未超重 ",s); printf("请输入想去的楼层: "); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到达%d层,走好 ",floor[m]); continue; } break; case 2: printf("关闭电梯门 "); 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.上楼 "); printf("2.下楼 "); printf("3.退出 "); printf("请选择(1-3):"); scanf("%d",&c); switch(c) { case 1: printf("此电梯可服务全部楼层 "); printf("此电梯最大乘客数量20人,最大载重量2000KG "); printf("此时电梯正在%d层,稍作等待 ",x); printf("请输入进入电梯的人数: "); scanf("%d",&p); printf("他们的体重依次是: "); 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,未超重 ",s); printf("请输入你想去的楼层: "); 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("将依次到达下列楼层: "); for(j=0;j<p;j++) { printf("%d ",floor[j]); printf("已到达%d层,走好 ",floor[j]); printf("此层有没有人进电梯?请选择:1-2 "); printf("1.有人 "); printf("2.无人 "); scanf("%d",&h); switch(h) { case 1: printf("请进电梯 "); printf("进入电梯人数: "); scanf("%d",&p1); printf("依次的体重: "); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,请下去一个人 "); s=s-weight[l]; p1=p1-1; } } printf("载重量为%dkg,未超重 ",s); printf("请输入想去的楼层: "); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到达%d层,走好 ",floor[m]); continue; } break; case 2: printf("关闭电梯门 "); break; } } break; case 2: printf("此电梯服务全部楼层 "); printf("此电梯最大乘客数量20人,最大载重量2000KG "); printf("此时电梯正在%d层,稍作等待 ",x); printf("请输入进入电梯的人数: "); scanf("%d",&p); printf("他们的体重依次是: "); 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,未超重 ",s); printf("请输入你想去的楼层: "); 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("将依次到达下列楼层: "); for(j=0;j<p;j++) { printf("%d ",floor[j]); printf("已到达%d层,走好 ",floor[j]); printf("此层有没有人进电梯?请选择:1-2 "); printf("1.有人 "); printf("2.无人 "); scanf("%d",&h); switch(h) { case 1: printf("请进电梯 "); printf("进入电梯人数: "); scanf("%d",&p1); printf("依次的体重: "); for(l=0;l<p1;l++) { scanf("%d",&weight[l]); s=s+weight[l]; if(s>800) { printf("超重,请下去一个人 "); s=s-weight[l]; p1=p1-1; } } printf("载重量为%dkg,未超重 ",s); printf("请输入想去的楼层: "); for(m=0;m<p1;m++) { scanf("%d",&floor[m]); printf("已到达%d层,走好 ",floor[m]); continue; } break; case 2: printf("关闭电梯门 "); break; } } break; case 3: return 0; break; } } } void main() { int a; while(1) { printf("欢迎使用电梯 "); printf("1.乘坐1号电梯 "); printf("2.乘坐2号电梯 "); printf("3.乘坐3号电梯 "); printf("4.乘坐4号电梯 "); printf("5.退出 "); 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; } } }