闭门造电梯

  

我们虽然分工明确,但我总觉得核心算法有点模糊。

多个类进行数据传递,想起友元函数,但没敢用,于是这里全是对文件的去写操作。

因为文件也能在各个函数里读写出数据,所以只要把数据写在文件中就行。

我们一直只在一个文件里进行编码,(不包括拷贝的文件)

看上去是面向对象的编程,其实是面向过程。

http://www.cnblogs.com/jingaaaaa/

上面介绍了李静同学写的具体内容,包括算法和界面的构建,在这里我就不多于的赘述了。

 

1.电梯里:

1. 首先,李静同学建立了6个界面并相对应定义了的是6个类,其中电梯里的class IN_ELECT类上设有楼层键,

如图

每一个按钮都单独建立一个函数,功能是把要去的楼层写入txt文件中,文件里写0表示第i层没有请求,写1,则表示第i层有人要用电梯的请求,无论电梯里是否有人,只要请求文件里写了,则就是告诉电梯要运动某层,。

在这个界面上建立了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.已知前面建立了5txt文件表示各个楼层的请求。首先将各个文件里的数字读出来,并保存在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数组中为的下标最大值和最小值,分别赋给manmin.

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;然后在把i1,后从新写入文件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  ELECT1Class  ELECT2Class  ELECT3Class  ELECT4Class  ELELCT5的类所对应界面中都有向上(下)的按钮,其实功能都一样,就是告诉电梯,待会经过这是顺便停一下(这里有个问题,电梯上下与人的上下不区分,)

电梯外电梯口:

按下电梯口上/下按钮,这会在对应层的请求文件中写入,例如在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)显示。

以下是我俩一起讨论是的照片

 

posted @ 2016-04-09 21:09  wodove  阅读(227)  评论(3编辑  收藏  举报