zoukankan      html  css  js  c++  java
  • 闭门造电梯

      

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

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

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

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

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

    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)显示。

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

  • 相关阅读:
    Leetcode-Minimum Depth of Binary Tree
    Leetcode-Path Sum II
    Leetcode-Path Sum
    Leetcode-Flatten Binary Tree to Linked List
    Leetcode-Populating Next Right Pointer in Binary Tree II
    Leetcode-Pascal's Triangle II
    Leetcode-Pascal's Triangle
    Leetcode-Triangle
    第10月第20天 afnetwork like MKNetworkEngine http post
    第10月第13天 xcode ipa
  • 原文地址:https://www.cnblogs.com/wodove/p/5372663.html
Copyright © 2011-2022 走看看