有限状态机详解(转载)

有限状态机详解(转载)以前总觉得有限状态机和无限状态机非常的难理解 原来也就是自己一直没有一个直观的认识 今天看到一篇博客 总算对有限状态机入门了 一看就懂 转载地址 http blog csdn net zqixiao 09 article details 我们知道 一般编写程序时都要画出流程图 按照流程图结构来编程 如果编写一个比较繁琐 容易思维混乱的程序时 我们可以利用有限状态机模型画出一个状态

以前总觉得有限状态机和无限状态机非常的难理解,原来也就是自己一直没有一个直观的认识,今天看到一篇博客,总算对有限状态机入门了。一看就懂。

转载地址:http://blog.csdn.net/zqixiao_09/article/details/

简单知道其定义是没有用的,在C编程中我们改如何应用呢?

例题1:去除一个字符串中连续的空格,即 H__el___lo 变成 H_el_lo;

我们按照这种逻辑来写程序,看看是不是比较方便,代码如下:

#include 
    
    int main(int argc, char *argv[]) { char flag = 0; int ch; while((ch = getchar()) != EOF) { switch(flag) { case 0: if(ch == ' ') flag = 1; putchar(ch); break; case 1: if(ch == ' ') continue; flag = 0; putchar(ch); break; default: break; } } return 0; } 

程序执行结果如下:

[cpp] view plain copy fs@ubuntu:~/qiang/char1$ gcc -o test test.c fs@ubuntu:~/qiang/char1$ ./test H el lo H el lo 

效果很明显;

上面的例题还算简单吧,好像不用这个模型也可以是吧,那好,我们再来一题

#include 
    
    int main(int argc, char *argv[]) { char flag = 0; int ch; while((ch = getchar()) != EOF){ switch(flag){ case 0: if(ch == ' ') flag = 1; if(ch == '"') flag = 2; putchar(ch); break; case 1: if(ch != ' '){ flag = 0; if(ch == '"') flag = 2; putchar(ch); } break; case 2: if(ch == '"') flag = 0; if(ch == '\"') ch = '"'; putchar(ch); break; default: printf("error!\n"); break; } } return 0; } 

执行结果如下:

[cpp] view plain copy fs@ubuntu:~/qiang/char1$ ./char3 H el "wor ld" lo H el "wor ld" lo 
/*this is program*/ #include 
   
   int main() { printf( 
   "Hello world!\n"); 
   //Hello world!  } 
  

将这段程序中的单行注释去掉,继续画图:

这里写图片描述
编写程序如下:

#include 
    
    int main(void) { char flag = 0; char ch; while((ch = getchar()) != EOF) { switch(flag) { case 0: if(ch == '/') flag = 1; else putchar(ch); break; case 1: if(ch == '/'){ flag = 2; } else{ putchar('/'); putchar(ch); } break; case 2: if(ch == '\n') { flag = 0; putchar(ch); } break; default: break; } } } 

执行命令:

fs@ubuntu:~/qiang/char1$ ./quzhushi1 < test.c >result.c 

注意命令中用到的重定向,将test.c文件重定向到quzhushi1 中,输出结果重定向到 result.c中

可查看result.c中:

/*this is program*/ #include 
   
   int main() { printf( 
   "Hello world!\n"); 
   //Hello world!  } 
  

单行注释被删除。

/*this is program*/ #include 
   
   int main() { printf( 
   "Hello world!\n"); 
   //Hello world!  } 
  

测试代码如下:

#include 
    
    int main() { char ch; int flag = 0; while((ch = getchar()) != EOF) { switch(flag) { case 0: if(ch == '/') flag = 1; else putchar(ch); break; case 1: if(ch == '/') flag = 2; else if(ch == '*') flag = 3; else { flag = 0; putchar('/'); putchar(ch); } break; case 2: if(ch == '\n') { putchar(ch); flag = 0; } break; case 3: if(ch == '*') flag = 4; break; case 4: if(ch == '/') flag = 0; else flag = 3; break; } } } 

执行命令:

fs@ubuntu:~/qiang/char1$ ./quzhushi < test.c >result.c 

执行结果:

/*this is program*/ #include 
   
   int main() { printf( 
   "Hello world!\n"); 
   //Hello world!  } 
  

大家可以比较画的图与所写程序,这种方法可以使我们编写程序时有个很好的思路!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223322.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:20
下一篇 2026年3月17日 下午2:21


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号