开发经验之状态机思想,分别使用了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 来在特定情况下改变当前状态