我们虽然分工明确,但我总觉得核心算法有点模糊。
多个类进行数据传递,想起友元函数,但没敢用,于是这里全是对文件的去写操作。
因为文件也能在各个函数里读写出数据,所以只要把数据写在文件中就行。
我们一直只在一个文件里进行编码,(不包括拷贝的文件)
看上去是面向对象的编程,其实是面向过程。
http://www.cnblogs.com/jingaaaaa/
上面介绍了李静同学写的具体内容,包括算法和界面的构建,在这里我就不多于的赘述了。
1.电梯里:
1. 首先,李静同学建立了6个界面并相对应定义了的是6个类,其中电梯里的class IN_ELECT类上设有楼层键,
如图
每一个按钮都单独建立一个函数,功能是把要去的楼层写入txt文件中,文件里写0表示第i层没有请求,写1,则表示第i层有人要用电梯的请求,无论电梯里是否有人,只要请求文件里写了1 ,则就是告诉电梯要运动某层,。
在这个界面上建立了5个保存各个楼层请求的文件,还有个now.txt文件,用来保存电梯现在的位置,取值分别为楼层数;此外,还有个up_down.txt文件,用来保存电梯现在的运动方向,文件里位1则代表电梯刺客在向上运动,位0表示电梯在向下运动。
在这个对话框上,还建立了一个全局变量,Frool[5],用来保存从文件里读出的各个楼层的请求,Frool [i]=0表示第i层没有请求,Frool[i]=1,则表示第i层有人要用电梯的请求。
当然,在面向过程的编程中,就直接赋值为1也无大碍。Frool数组主要在读取个楼层请求是起作用。
具体代码如下(以一楼为例):
void IN_ELECT::On_to_one()
{
// TODO: Add your control notification handler code here
Frool[0]=1;//去1楼
FILE *fp1;
fp1=fopen("1.txt","w");
fscanf(fp1,"%d",Frool[0]);
fclose(fp1);
}
把对1楼的请求写入文件1.txt中,表示电梯里有人要去1楼,
同理可得
其他楼层按钮也是将请求写入文件中。
2. 然后可以看到李静同学在电梯里的那个界面上各有个上下键,其实我某天在乘电梯特意看了一下电梯里的按钮,并没有上下键。所以这个界面上上下键没作用。
3. 然后是这个键,功能有点像是关门,并开始运行电梯。
具体是这样的:
1.已知前面建立了5个txt文件表示各个楼层的请求。首先将各个文件里的数字读出来,并保存在Frool[5],数组里,方法有点笨,反正也不是很长,
for(i=0;i<5;i++)
switch(i)
{
case 0:{fp4=fopen("1.txt","r");fscanf(fp4,"%d",&Frool[0]);fclose(fp4);continue;}
case 1:{fp4=fopen("2.txt","r");fscanf(fp4,"%d",&Frool[1]);fclose(fp4);continue;}
case 2:{fp4=fopen("3.txt","r");fscanf(fp4,"%d",&Frool[2]);fclose(fp4);continue;}
case 3:{fp4=fopen("4.txt","r");fscanf(fp4,"%d",&Frool[3]);fclose(fp4);continue;}
case 4:{fp4=fopen("5.txt","r");fscanf(fp4,"%d",&Frool[4]);fclose(fp4);continue;}
}
2.然后是找这一趟请求中,Frool数组中为1 的下标最大值和最小值,分别赋给man和min.
3.读文件up_down.txt,并赋值给updown,,这个变量表示电梯的运动方向,
4.紧接着,读文件now.txt,并赋值给一个字符ch,然后把它从字符用atoi()函数装为数字i,
5.判断电梯现在的状态,
a) 如果电梯向下即,updown=0;则比较现在的位置i是否比最低层的请求min大,大则继续向下运动,执行IN_ELECT::DOWN(min),如果小,不用处理,等电梯下一趟在来处理。并把最低的楼层数传给IN_ELECT::DOWN(min);
b)如果电梯向下即,updown=1;则比较现在的位置i是否比最高层的请求max小,大则继续向上运动,如果大,执行IN_ELECT::UP(max),不用处理,等电梯下一趟在来处理。并把最低的楼层数传给IN_ELECT::UP(max);
具体代码如下:
if(updown==0)///////////////////////初始状态电梯下行
if(i>min)///////////////////////电梯现在的位置高于最底层的请求,电梯下放
IN_ELECT::DOWN(min); //////////////电梯继续下行
else //初始状态电梯下行//电梯现在的高度低于最低请求层则电梯上行
if(i<max)
IN_ELECT::UP(max) ;
6.现在来介绍是向上运动的函数IN_ELECT::UP(int l) ;
a)首先读出总共有多少层需要请求。保存在j变量里。
for( i=0;i<5;i++)
if(Frool[i]==1)
j++;
b)然后电梯在向上运动中一次到达各个需要请求的层数,并且对应第i层的数组Frool[i]清0;并且对请求文件i.txt文件写入0;然后先 UpdateData(true)刷新编辑框并显示楼层数i;然后在把i加1,后从新写入文件now.txt文件里。
到达顶(底)层后将电梯的运动方向翻转一下
用a)里统计的j变量判断是否到达这一趟中最后一个目的层。j=0就退出电梯停在。
具体代码如下:
for( i=0;i<l;i++)
{if(Frool[i]==1)
{
Frool[i]=0;//
switch(i)
{
case 0:{fp=fopen("1.txt","w");fprintf(fp,"%d",Frool[0]);fclose(fp);continue;}
case 1:{fp=fopen("2.txt","w");fprintf(fp,"%d",Frool[1]);fclose(fp);continue;}
case 2:{fp=fopen("3.txt","w");fprintf(fp,"%d",Frool[2]);fclose(fp);continue;}
case 3:{fp=fopen("4.txt","w");fprintf(fp,"%d",Frool[3]);fclose(fp);continue;}
case 4:{fp=fopen("5.txt","w");fprintf(fp,"%d",Frool[4]);fclose(fp);continue;}
}
itoa(i+1,ch1,10);
UpdateData(true); //还要埋一个时间种子,进行延时显示
SetDlgItemText(IDC_EDIT1,ch1); ///////////或者用循环执行空语句也行
fp=fopen("now.txt","w");
fscanf(fp,"%c",ch1);
fclose(fp);
j--;
if(j==0) ///是否是最后一个目的地
break;
else
continue;
}
}
7.
同理IN_ELECT::DOWN(int l)函数也是一样的功能
先读各个楼层请求数组Frool[5]中用j统计总共有几层有请求,在从该层向下运动,
(PS:发现一个问题,j可以在电梯到最后一层后终止运动,调用函数是传递来的参数l,也有同样的功能)
从最高请求层(不一定是楼层的最高层)开始向下运动---------即Frool[i],从最高请求层的下标一次递减经过其下面的各层,每经过一层UpdateData(true)刷新编辑框并调用显示函数SetDlgItemText(IDC_EDIT1,ch1)显示层数i;直到j=0,(j=0意味着所有请求都已经完成,break,电梯停止)
2电梯外
在Class ELECT1,Class ELECT2,Class ELECT3,Class ELECT4,Class ELELCT5的类所对应界面中都有向上(下)的按钮,其实功能都一样,就是告诉电梯,待会经过这是顺便停一下(这里有个问题,电梯上下与人的上下不区分,)
电梯外电梯口:
按下电梯口上/下按钮,这会在对应层的请求文件中写入1 ,例如在1楼具体代码如下:
int a;
a=1;
FILE *fp1;
fp1=fopen("1.txt","w");
fscanf(fp1,"%d",a);
fclose(fp1);
CDialog::OnOK();
3电梯的位置显示
各层电梯口和电梯内多对应的类中有一个
void IN_ELECT::DoDataExchange(CDataExchange* pDX)函数,在这个函数内
写上读取文件now.txt,得到当前电梯位子并用SetDlgItemText(IDC_EDIT1,ch1)显示。
以下是我俩一起讨论是的照片