FSM和STATE模式

 

三种状态(ABC)三种操作(ONOFFACK

 

ON(0)

OFF(1)

ACK(2)

A(0)

A

B

C

B(1)

B(未定义)

A

C

C(2)

C(未定义)

C(未定义)

B

其中ABC三种状态和ON OFF ACK三种转化操作,下面代码给出了STATE模式的基本实现过程,一般而言,状态机的设计分为两大部分,FSM中包含所有状态转化的操作,FSMstate是所有状态的基类,该类中包含所有的状态迁移操作,其子类实现了不同的状态迁移,通过多态可以实现相同的操作实施在不同状态时转化。

#include<iostream>

 

using namespace std;

 

class FSMstate

{

public:

         virtual void on() { cout<<"undefined combo"<<endl; }

         virtual void off() { cout<<"undefined combo"<<endl; }

         virtual void ack() { cout<<"undefined combo"<<endl; }

};

 

class FSM

{

public:

         FSM();

         void on()

         {

                   states[current]->on();

                   current = next[current][0];

         }

         void off()

         {

                   states[current]->off();

                   current = next[current][1];

         }

         void ack()

         {

                   states[current]->ack();

                   current = next[current][2];

         }

private:

         FSMstate* states[3];

         int current;

         int next[3][3];

};

 

class A : public FSMstate

{

public:

         void on() { cout<<"A, on ==> A"<<endl; }

         void off() { cout<<"A, off ==> B"<<endl; }

         void ack() { cout<<"A, ack ==> C"<<endl; }

};

 

class B : public FSMstate

{

public:

         void off() { cout<<"B, off ==> A"<<endl; }

         void ack() { cout<<"B, ack ==> C"<<endl; }

};

 

class C : public FSMstate

{

         void ack() { cout<<"C, ack ==> B"<<endl; }

};

 

FSM::FSM()

{

//三种状态

         states[0] = new A;

         states[1] = new B;

         states[2] = new C;

//当前状态

         current = 1;

//描述状态转换的数组

         next[0][0] = 0; next[0][1] = 1; next[0][2] = 2;

         next[1][0] = 1; next[1][1] = 0; next[1][2] = 2;

         next[2][0] = 2; next[2][1] = 2; next[2][2] = 1;

}

 

enum Message { On, Off, Ack };

Message  messageArray[10] = { On,Off,Off,Ack,Ack,Ack,Ack,On,Off,Off };

 

void main()

{

         FSM fsm;

         for( int i = 0; i < 10; i++ )

         {

                   if( messageArray[i] == On ) fsm.on();

                   else if( messageArray[i] == Off ) fsm.off();

                   else if( messageArray[i] == Ack ) fsm.ack();

         }

}

 

### 有限状态机(FSM)与有限状态自动机(FSA)的概念及区别 有限状态机(Finite State Machine, FSM有限状态自动机(Finite State Automaton, FSA)是两个密切相关但存在细微区别的概念。以下从定义、功能以及应用场景等方面详细说明两者的联系与区别。 #### 定义与基本概念 有限状态机(FSM)是一种数学模型,用于描述系统的状态及其之间的转换行为[^1]。它由一组有限的状态、输入符号集合、状态转移函数、初始状态接受状态组成。FSM可以分为确定性有限状态机(DFA)非确定性有限状态机(NFA),其核心思想是通过状态的转换来处理输入序列并输出结果。 有限状态自动机(FSA)则是自动机理论中的一个术语,通常用来表示一种特殊的计算模型,用于识别特定的语言类[^2]。FSA同样由五元组 \( M = (S, I, f, A, S_0) \) 描述,其中 \( S \) 是状态集合,\( I \) 是输入符号集合,\( f \) 是状态转移函数,\( A \) 是接受状态集合,\( S_0 \) 是初始状态。 #### 联系 1. **本质相同**:在许多情况下,FSM FSA 可以互换使用,因为它们都基于相同的核心概念——状态状态转移。 2. **应用领域重叠**:两者都被广泛应用于计算机科学中,例如编译器设计、模式匹配、自然语言处理等领域[^3]。 #### 区别 尽管两者有相似之处,但在具体的应用场景定义上仍存在一些差异: 1. **定义范围**: - FSM 更倾向于描述具体的实现机制,尤其是在工程领域中,如硬件电路设计或软件状态管理[^4]。 - FSA 则更多地出现在理论研究中,作为自动机理论的一部分,主要用于形式语言可计算性研究[^2]。 2. **功能侧重点**: - FSM 强调的是状态之间的转换逻辑以及如何根据当前状态输入决定下一步的动作。 - FSA 主要关注的是对输入字符串的接受或拒绝,判断其是否属于某个特定的语言类。 3. **实现方式**: - FSM 的实现通常涉及编程语言中的状态表或状态转移图,例如 C 语言中的状态机实现[^3]。 - FSA 的实现更偏向于理论分析,虽然也可以用程序实现,但其主要目的是验证字符串是否符合某种语法规范。 #### 示例代码 以下是一个简单的 C 语言实现 FSM 的示例,展示了如何通过状态转移表来实现状态机的功能: ```c #include <stdio.h> typedef enum { STATE_A, STATE_B } STATE; typedef struct { int event; STATE cur_state; STATE next_state; void (*event_cb)(); } STATE_TABLE; void action_A_to_B() { printf("Transition from A to B\n"); } void action_B_to_A() { printf("Transition from B to A\n"); } STATE_TABLE table[] = { {1, STATE_A, STATE_B, action_A_to_B}, {2, STATE_B, STATE_A, action_B_to_A} }; void fsm_event_handle(STATE *state, int event) { for (int i = 0; i < sizeof(table)/sizeof(table[0]); i++) { if (event == table[i].event && *state == table[i].cur_state) { table[i].event_cb(); *state = table[i].next_state; return; } } printf("No transition defined for event %d\n", event); } int main() { STATE state = STATE_A; fsm_event_handle(&state, 1); // Transition from A to B fsm_event_handle(&state, 2); // Transition from B to A return 0; } ``` #### 结论 综上所述,FSM FSA 在本质上是相同的,但在实际应用中各有侧重。FSM 更加注重工程实现,而 FSA 则更多地服务于理论研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值