有限状态机在C语言编程中的各种应用

来源:互联网 发布:从unix到linux 乱码 编辑:程序博客网 时间:2024/05/21 11:22

1. 使用case的有限状态机

[cpp] view plain copy
  1. //使用switch/case或者if/else实现的基于状态机(FSM)的密码锁  
  2. //只有正确输入密码 2479 才能解锁   
  3. #include <stdio.h>    
  4. #include <stdlib.h>    
  5. #include <string.h>     
  6.   
  7. typedef enum{     
  8.     STATE0 = 0,     
  9.     STATE1,     
  10.     STATE2,    
  11.     STATE3,     
  12.     STATE4,    
  13. }STATE;  
  14.     
  15.   
  16. int main()     
  17.   
  18. {     
  19.     char ch;   
  20.     STATE current_state = STATE0;      
  21.     while(1){     
  22.         printf("In put password:");     
  23.         while((ch = getchar()) != '\n')  
  24.         {     
  25.             if((ch < '0') || (ch > '9'))  
  26.             {     
  27.                 printf("Input num,ok?/n");     
  28.                 break;     
  29.             }     
  30.             switch(current_state){     
  31.             case STATE0:     
  32.                 if(ch == '2')   current_state = STATE1;     
  33.                 break;     
  34.             case STATE1:     
  35.                 if(ch == '4')   current_state = STATE2;     
  36.                 break;     
  37.             case STATE2:     
  38.                 if(ch == '7')   current_state = STATE3;     
  39.                 break;     
  40.             case STATE3:     
  41.                 if(ch == '9')   current_state = STATE4;     
  42.                 break;     
  43.             default:     
  44.                 current_state = STATE0;     
  45.                 break;     
  46.             }     
  47.         }   //end inner while   
  48.   
  49.         if(current_state == STATE4){     
  50.             printf("Correct, lock is open!\n");     
  51.             current_state =   STATE0;  
  52.               
  53.         }else  
  54.         {  
  55.             printf("Wrong, locked!\n");     
  56.             current_state =   STATE0;  
  57.               
  58.         }  
  59.         break;  
  60.     }     
  61.     return 0;     
  62.   
  63. }   
  64. //代码摘自http://blog.csdn.net/qp120291570/article/details/8634582   
2. 使用函数指针的有限状态机的应用

[cpp] view plain copy
  1. //使用函数指针实现的基于状态机(FSM)的密码锁  
  2. //只有正确输入密码 2479 才能解锁   
  3. #include <stdio.h>    
  4. //这个秘密锁的密码是xxxx2479,就是说最后4位是2479,前面若干为为0~9里的数字,也可没有   
  5. #include <stdlib.h>    
  6. #include <string.h>     
  7.   
  8. //定义锁事件处理函数的函数指针类型  
  9. typedef void (*lock_func_temp)(char c);  
  10. typedef lock_func_temp (*lock_func)(char c);  
  11. lock_func state;  
  12.   
  13. //函数声明队列   
  14. //列出来,交叉引用才不会报错   
  15. lock_func init_state(char ch);  
  16. lock_func state1(char ch);  
  17. lock_func state2(char ch);  
  18. lock_func state3(char ch);  
  19. lock_func state4(char ch);  
  20.   
  21. //初始状态   
  22. lock_func init_state(char ch)  
  23. {  
  24.     if ((ch < '0') || (ch > '9'))  
  25.         return NULL;      
  26.     else  
  27.         return state1(ch); //这里还必须得有参数,不然就会漏处理一个字符   
  28. }  
  29.   
  30. //状态1   
  31. lock_func state1(char ch)  
  32. {  
  33.     if (ch == '2')  
  34.     {  
  35.         return state2;        
  36.     } else   
  37.     {  
  38.         return init_state;  
  39.     }  
  40. }  
  41.   
  42. //状态2   
  43. lock_func state2(char ch)  
  44. {  
  45.     if (ch == '4')  
  46.     {  
  47.         return state3;        
  48.     } else   
  49.     {  
  50.         return init_state;  
  51.     }     
  52. }  
  53.   
  54. //状态3   
  55. lock_func state3(char ch)  
  56. {  
  57.     if (ch == '7')  
  58.     {  
  59.         return state4;        
  60.     } else   
  61.     {  
  62.         return init_state;  
  63.     }  
  64. }  
  65.   
  66. //状态4   
  67. lock_func state4(char ch)  
  68. {  
  69.     if (ch == '9')  
  70.     {  
  71.         printf("Correct, lock is open!\n");   
  72.         return NULL;          
  73.     } else   
  74.     {  
  75.         return init_state;  
  76.     }  
  77. }  
  78.   
  79. //结束状态是NULL  
  80. //就是通过 return NULL;表达的结束状态.   
  81.    
  82. //状态转换在这里   
  83. void lock_handle (void)  
  84. {  
  85.     char ch;  
  86.     state = init_state;  
  87.     while (state)  
  88.     {  
  89.         ch = getchar();  
  90.         state = (*state)(ch);  
  91.     }  
  92. }   
  93.   
  94.    
  95. int main()     
  96. {         
  97.     lock_handle();  
  98. }   

3.基于状态矩阵的FSM应用

参考:http://www.cookiebear.info/archives/557

0 0
原创粉丝点击