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

时间:2022-06-01 20:38:19

这里设计一个简单的练习,使用状态机思想实现,分别使用了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 来在特定情况下改变当前状态