• 开发经验之状态机思想,分别使用了swift,OC,C,PHP语言实现


    这里设计一个简单的练习,使用状态机思想实现,分别使用了swift,OC,C,PHP语言实现

    题目:1到10000遍历,开始-打印奇数-遇到7的倍数开始打印偶数--遇到10的倍数打印奇数   //部分结果:1 3 5  8 11 13  16 18 22 24 .....

    swift实现

    enum StateType{
      //奇数,偶数
      case state_Odd,state_Even
    }

    import UIKit
    //开始-打印奇数-遇到7的倍数开始打印偶数--遇到10的倍数打印奇数
    //部分结果:1 3 5  8 11 13  16 18 22 24
    class ViewController: UIViewController {
      //当前状态设置初始值
      var current_state = StateType.state_Odd
     
      override func viewDidLoad() {
        super.viewDidLoad()
        
        for i in 1...10000{ //for循环或while(true)驱动状态机的运转
          
          //状态机实现
          switch current_state
          {
          case .state_Odd:
            if i%7==0
            {
              //被7整除之后,改变状态并在另一状态中处理i
              current_state = StateType.state_Even
            }
            else
            {
              if i%2 != 0  {
              //状态不变,打印奇数
              println("(i) ")
              }
            }
          case .state_Even:
            if i%10==0
            {
              //被10整除之后,改变状态并在另一状态中处理i
              current_state = StateType.state_Odd
            }
            else
            {
              //状态不变,打印偶数
              if i%2 == 0 {
                println("(i) ")
              }
            }
          }
        }
        
        // Do any additional setup after loading the view, typically from a nib.
      }
     
    }

    OC实现

    enum StatusType{
      s_Odd,
      s_even //奇数偶数枚举
    };

    //初始化当前状态
    static int currentState = s_Odd;
    - (void)viewDidLoad {
      [super viewDidLoad];
     
      //for循环或while(true)驱动状态机的运转
      for(int i=1;i<=1000;i++)
          {
        //状态机实现
        switch (currentState) {
          case s_Odd:
            {
          if (i%7==0)
              {
            //被7整除之后,改变状态并在另一状态中处理i
            currentState = s_even;
              }
          else
              {
            if (i%2 != 0)  {
              //状态不变,打印奇数
              NSLog(@"%d ",i );
            }
              }
          break;
            case s_even:
          if (i%10==0)
              {
            //被10整除之后,改变状态并在另一状态中处理i
            currentState = s_Odd;
              }
          else
              {
            //状态不变,打印偶数
            if (i%2 == 0) {
              NSLog(@"%d ",i );
            }
              }
          break;
            }
        }
        
          }
      // Do any additional setup after loading the view, typically from a nib.
    }

    C,PHP实现方式

     enum StatusType
    {
      S_Odd,
      S_Even
    };

    void beginMachine()
    {
      //如果编程语言没有enum,如PHP,Javascript等,可以定义俩变量
      //$S_Odd=0,$S_Even=1;这种方式解决
     
      int currentState = S_Odd;
      //for循环或while(true)驱动状态机的运转
      for(int i=1;i<=1000;i++)
          {
        //状态机实现
        switch (currentState) {
          case S_Odd:
            {
          if (i%7==0)
              {
            //被7整除之后,改变状态并在另一状态中处理i
            currentState = S_Even;
              }
          else
              {
            if (i%2 != 0)  {
              //状态不变,打印奇数
              printf("%d ",i );
            }
              }
          break;
            case S_Even:
          if (i%10==0)
              {
            //被10整除之后,改变状态并在另一状态中处理i
            currentState = S_Odd;
              }
          else
              {
            //状态不变,打印偶数
            if (i%2 == 0) {
              printf("%d ",i );
            }
              }
          break;
            }
        }
        
          }
     
    }

    总结:

    1,状态机首先要确定状态数作为枚举值

    2,有当前状态变量

    3,switch case 来在特定情况下改变当前状态

  • 相关阅读:
    “Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED”
    【问底】夏俊:深入站点服务端技术(一)——站点并发的问题
    java反射调用方法
    linux 文件操作系统调用
    64位win7中使用vs2013为python3.4安装pycrypto-2.6.1插件报Unable to find vcvarsall.bat异常解决方式
    ViewPager+RadioGroup实现标题栏切换,Fragment切换
    Android View系统解析(下)
    高速学会Mac上托管代码到github(具体解释)
    linux程序设计——多线程(第十二章)
    使用工作流更新子记录
  • 原文地址:https://www.cnblogs.com/huntaiji/p/4089074.html
Copyright © 2020-2023  润新知