Linux C 编程技巧--利用有限状态机模型编程

2023-05-16



      我们知道,一般编写程序时都要画出流程图,按照流程图结构来编程,如果编写一个比较繁琐,容易思维混乱的程序时,我们可以利用有限状态机模型画出一个状态转移图,这样便可以利用画出的逻辑图来编写程序,简洁且不易出错。

      那什么是有限状态机是什么意思呢?百度百科上这样解释:

      有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

 

常见的计算机就是使用有限状态机作为计算模型的:对于内存的不同状态,CPU通过读取内存值进行计算,更新内存中的状态。CPU还通过消息总线接受外部输入设备(如键盘、鼠标)的指令,计算后更改内存中的状态,计算结果输出到外部显示设备(如显示器),以及持久化存储在硬盘。
电脑游戏设计中也经常使用有限状态机模型。以水果忍者游戏为例,游戏中水果的状态是有限状态,其运行轨迹是由模拟物理运动规律的计算公式运算而成的,一个香蕉抛起来后会按照抛物线运行,其每一帧位置变化都是一个状态的改变,状态改变通过计算公式来决定。当然作为游戏不会仅仅这么简单,如果这么简单就是动画了,游戏还有复杂的人机交互事件,比如用手在屏幕上“切”了水果,水果感知到这个事件后,会按照程序逻辑进入爆炸状态。
 
简单知道其定义是没有用的,在C编程中我们改如何应用呢?
 
例题1:去除一个字符串中连续的空格,即 H__el___lo 变成 H_el_lo;
 
我们拿到这道题时,可能会想到用getchar()依次取字符,当遇到空格时,继续下一个字符是否为空格,如果是则删除,如果不是则继续;那么问题来了,如果空格后面还有空格呢?如果还有很多空格呢?如果还有其他要求呢?这样很容易造成思维混乱,所以这时我们可以用到有限状态机模型,好像这样说很模糊啊,该怎么使用呢?利用这种方式,最后的就是利用好flag,即标识符;这样吧,我们来画一下这个模型:
 
这样看好像有点抽象,我来解释一下:
状态0  (flag = 1)若当前字符是空格,输出并跳转到状态1(flag = 1),如果是非空格,则打印字符;
状态1  (flag = 1) 若当前字符为非空格,则输出并跳转到状态0,若是空格,则不打印;
下面几个例题我尽量写得清楚;
 
我们按照这种逻辑来写程序,看看是不是比较方便,代码如下:
 
#include <stdio.h>

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;
}

程序执行结果如下:
fs@ubuntu:~/qiang/char1$ gcc -o test test.c 
fs@ubuntu:~/qiang/char1$ ./test
H  el   lo
H el lo
效果很明显;
 
上面的例题还算简单吧,好像不用这个模型也可以是吧,那好,我们再来一题
 
例题2:除连续的空格但字符串中的连续空格不变,比如H_ _el__"wor___ld"___lo;
大家看看,如果直接写程序是不是很烦,一会就乱掉了,那我们还用这个模型来编写,还是先画图:
 
 
 
#include <stdio.h>

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;
}

执行结果如下:
fs@ubuntu:~/qiang/char1$ ./char3
H  el  "wor   ld"   lo
H el "wor   ld" lo

 
来个实际点的问题:
例题3::除单行注释
示例程序:
 
/*****This is a program!*****/
#include <stdio.h>

int main()
{
	printf("Hello world!\n");//Hello world!
}

将这段程序中的单行注释去掉,继续画图:
 
编写程序如下:
#include <stdio.h>

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 a program!*****/
#include <stdio.h>

int main()
{
	printf("Hello world!\n");
}

单行注释被删除。
 
例题4:去除单行注释和多行注释
     还是这个测试程序:
/*****This is a program!*****/
#include <stdio.h>

int main()
{
	printf("Hello world!\n");//Hello world!
}

好吧,继续画图,图上比较抽象,大家可以自己思考一下
这次比较复杂,要有5个标识符
 
测试代码如下:
#include <stdio.h>

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

执行结果:
result.c

#include <stdio.h>

int main()
{
	printf("Hello world!\n");
}

大家可以比较画的图与所写程序,这种方法可以使我们编写程序时有个很好的思路!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux C 编程技巧--利用有限状态机模型编程 的相关文章

  • 基于树莓派的网络打印服务器

    网络上关于 基于树莓派的网络打印服务器 的资料非常多了 xff0c 感谢大神们的无私分享 xff0c 才能让技术不停传递 xff0c 造福所有人 xff01 建这个服务器的起因和目的很简单 xff1a 1 手边有树莓派 2 家里有闲置的US
  • 基于树莓派的DLNA和Airplay无线音频传输

    首先 xff0c 感谢网络上国内外各位大神 xff0c 我只是依葫芦画瓢的做了试验实现了基于树莓派的DLNA和Airplay无线音频传输的功能 因为过程中也走了弯路有些问题 xff0c 所以这里也只是来记录一下操作过程 xff0c 整个实现
  • 基于树莓派的蓝牙音频接收器

    首先声明一下 xff0c 本文内容参考如下国外大神的配置过程进行操作并成功实现基于树莓派的蓝牙音频接收功能 xff1a https thecodeninja net 2016 06 bluetooth audio receiver a2dp
  • 基于树莓派和Homebridge实现小米智能插座的控制

    首先声明本文纯属依照如下链接的文章进行测试的小结 xff1a https www wandianshenme com play siri iphone homekit control xiaomi devices by homebridge
  • [C语言] [试题详解] 求1000之内的所有 完数

    题目 gt gt gt 一个数如果恰好等于它的因子之和 xff0c 这个数就称为 完数 例如 xff0c 6的因子为1 2 3 xff0c 而6 xff1d 1 xff0b 2 xff0b 3 xff0c 因此6是 完数 编程序找出1000
  • [C语言] [典例详解] 打印杨辉三角(找规律简单实现)

    题目 gt gt gt 用C语言打印杨辉三角 杨辉三角参考图如下 xff1a 分析 gt gt gt 于是不清楚杨辉三角的同学们可以上网查查 xff0c 可以立刻知道它的相关推理归纳和公式总结 它的简介如下 xff1a 所以我们可以使用二项
  • WampServer操作手册--转

    原链接 blog csdn net PoppinRubo article details 65627304 2017年03月24日 10 08 55 PoppinRubo 阅读数 xff1a 2191 标签 xff1a apache 更多
  • vs2015 qt链接出现MSB3758 MSB4036 这两个错误解决办法

    如果是tohashset缺少using什么的 xff0c 就把 netframework更新到4 8或者 4 7 2以上版本都可以 xff0c 在vs中帮助 gt 最下面的关于 中可以查看 net版本 xff0c 如果不是4 8就更新
  • 构建 ARM版 ubuntu18.04

    1 下载ARM ubuntu 基础版镜像 wget http cdimage ubuntu com ubuntu base releases 18 04 release ubuntu base 18 04 core armhf tar gz
  • ubuntu 14.04安装x11VNC

    环境 xff1a Ubuntu 14 04 1 xff09 安装x11vnc xff1a sudo apt get install x11vnc 2 xff09 设置VNC的连接密码 xff1a x11vnc storepasswd Ent
  • ios中几种跳转方式,普通,和StoryBoard跳转

    一 纯代码界面跳转方式 1 导航控制器 UINavigationController self navigationController pushViewController NewVC animated YES 跳转到下一界面 self
  • 【组织架构】中国铁路哈尔滨局集团有限公司

    0 参考 中国铁路哈尔滨局集团有限公司 1 公司简介 中国铁路哈尔滨局集团有限公司 xff08 China Railway Harbin Group Co Ltd xff09 xff0c 简称哈局 xff0c 是中国国家铁路集团有限公司管理
  • 【组织架构】中国铁路呼和浩特局集团有限公司

    0 参考 中国铁路呼和浩特局集团有限公司 1 公司介绍 中国铁路呼和浩特局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 呼局 成立于1958年11月1日 xff0c 地处内蒙古自治
  • 【组织架构】中国铁路郑州局集团有限公司

    0 参考 中国铁路郑州局集团有限公司 1 公司介绍 中国铁路郑州局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 郑局 正式成立于1949年3月11日 xff0c 总部位于河南省郑州
  • 【组织架构】中国铁路武汉局集团有限公司

    0 参考 中国铁路武汉局集团有限公司 1 公司介绍 中国铁路武汉局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 武局 成立于2005年5月18日 xff0c 是全路实行局直管站段体
  • 人工智能轨道交通行业周刊-第36期(2023.2.27-3.5)

    本期关键词 xff1a 智能高铁体系架构 广州港海铁联运 5G R 铁路受电弓 电务信号工 图像压缩 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS Wor
  • 人工智能轨道交通行业周刊-第37期(2023.3.6-3.12)

    本期关键词 xff1a 智能天窗 广铁数字化 司机手势 编组站 AIGC 事件相机 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟V
  • 人工智能轨道交通行业周刊-第38期(2023.3.13-3.19)

    本期关键词 xff1a 车顶检修机器人 CTCS 机车重联作业 铁水联运 大模型 GPT 4 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道
  • 【组织架构】中国铁路西安局集团有限公司

    0 参考 中国铁路西安局集团有限公司 1 公司介绍 中国铁路西安局集团有限公司 xff08 原西安铁路局 xff09 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 西局 位于西北地区 管内有陇海
  • 【组织架构】中国铁路济南局集团有限公司

    0 参考 中国铁路济南局集团有限公司 1 公司介绍 中国铁路济南局集团有限公司 xff08 China Railway Jinan Group Co Ltd xff09 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之

随机推荐

  • spark-sql处理json字符串的常用函数

    整理了spark sql处理json字符串的几个函数 xff1a 1 get json object 解析不含数组的 json 2 from json 解析json 3 schema of json 提供生成json格式的方法 4 expl
  • 【组织架构】中国铁路上海局集团有限公司

    0 参考 中国铁路上海局集团有限公司 1 公司介绍 中国铁路上海局集团有限公司成立于1994年11月15日 xff0c 注册地位于上海市静安区天目东路80号 xff0c 法定代表人为侯文玉 公司是中国国家铁路集团有限公司管理的18个铁路局集
  • 【组织架构】中国铁路南昌局集团有限公司

    0 参考 中国铁路南昌局集团有限公司 1 公司介绍 中国铁路南昌局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 于2017年11月19日挂牌成立 xff0c 前身为南昌铁路局 中国铁路南
  • 【组织架构】中国铁路南宁局集团有限公司

    0 参考 中国铁路南宁局集团有限公司 1 公司介绍 中国铁路南宁局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 宁局 xff0c 前身是成立于1953年1月1日的柳州铁路局 xff
  • 【组织架构】中国铁路成都局集团有限公司

    0 参考 中国铁路成都局集团有限公司 1 公司介绍 中国铁路成都局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 成局 xff0c 地处中国西南 xff0c 管辖范围辐射四川 贵州
  • 【组织架构】中国铁路昆明局集团有限公司

    0 参考 中国铁路昆明局集团有限公司 1 公司介绍 中国铁路昆明局集团有限公司 xff0c 是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一 xff0c 简称 昆局 管理昆明铁路办事处以及开远铁路办事处 xff0c 路局机关设在
  • 人工智能轨道交通行业周刊-第39期(2023.3.20-3.26)

    本期关键词 xff1a 综合运维智控中心 现场防护员 模型先验知识 机器视觉照明 国铁统计公报 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨
  • Midjourney保姆级入门教程

    0 背景 在 AI 画图领域 xff0c midjourney 目前是效果最好的一个工具 xff0c 目前已经更新到 V5 版本 xff0c 生成的各种神图层出不穷 xff0c 什么国足夺冠 特朗普插秧 教皇打碟 异形下乡 只要你敢想AI就
  • 人工智能轨道交通行业周刊-第40期(2023.3.27-4.2)

    本期关键词 xff1a TACS列车 智能雄安站 火车掉头 高铁供电 AIGC发展史 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟
  • 人工智能轨道交通行业周刊-第41期(2023.4.3-4.9)

    本期关键词 xff1a 西安智慧车站 宁波应急保障 钢轨伸缩调节器 城轨统计报告 SAM SegGPT 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS Wo
  • 人工智能轨道交通行业周刊-第42期(2023.4.10-4.23)

    本期关键词 xff1a 车辆智能检测 智能运维 数字孪生 无人机 信号工装备 商汤大模型 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通
  • mysql视图使用

    先讲下视图的概述吧 视图是一种 虚拟表 xff0c 本身是 不具有数据 的 xff0c 占用很少的内存空间 xff0c 它是 SQL 中的一个重要概念 视图建立在已有表的基础上 视图赖以建立的这些表称为 基表 视图他自己可以被称为 从表 虚
  • 人工智能轨道交通行业周刊-第43期(2023.4.24-5.7)

    本期关键词 xff1a 综合智能检测 隧道检测 智慧城轨白皮书 虚拟编组 讯飞星火大模型 央企数字化 1 整理涉及公众号名单 1 1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS Wor
  • kolla搭建octavia

    本文是在另外一篇文章的基础上使用kolla ansible 部署octavia实践总结 部分内容总结略有粗糙 xff0c 见谅 使用kolla ansible all in one部署OpenStack Stein https blog c
  • 关闭win10自动更新——组策略

    1 为什么要关闭自动更新 我一向是推荐关闭自动更新 xff0c 然后有时间的时候自己主动去更新 xff0c 因为win10更新还是修复了一些bug的 xff0c 但是自动更新会闹出很多问题 xff0c 例如紧急开会的时候发现电脑在自动更新
  • python 中位于运算符 & 应用

    amp 运算符在计算机中是二进制运算符 xff0c 常使用 amp 61 xff0c 即先进性位于运算符 xff0c 在进行赋值 xff0c 例如 a amp 61 b 等价于 a 61 a amp b 位于运算只二进制 保同除异 a 61
  • 【FreeRDP 】

    Ubuntu18 04安装FreeRDP 远程连接Windows桌面 1 FreeRDP2 环境3 Ubuntu安装xfreerdp4 连接准备5 连接6 问题总结 1 FreeRDP FreeRDP lt 61 61 gt Remote
  • 7-1 编写程序,输入年、月、日,计算该 日是该年的第几天。要求:计算日期、判断闰年均使用自定义函数实现。

    7 1 编写程序 xff0c 输入年 月 日 xff0c 计算该 日是该年的第几天 要求 xff1a 计算日期 判断闰年均使用自定义函数实现 编写程序 xff0c 输入年 月 日 xff0c 计算该 日是该年的第几天 要求 xff1a 计算
  • ifort + mkl + impi (全套intel)编译安装量子化学软件GAMESS 2022 R1版本

    说明 xff1a linux下编译软件都需要先配置好该软件依赖的系统环境 系统环境可以通过软件的安装说明了解 xff0c 例如 xff1a readme md等文件或网页 这个前提条件很重要 xff01 后面正式编译出错基本都可以归结到系统
  • Linux C 编程技巧--利用有限状态机模型编程

    我们知道 xff0c 一般编写程序时都要画出流程图 xff0c 按照流程图结构来编程 xff0c 如果编写一个比较繁琐 xff0c 容易思维混乱的程序时 xff0c 我们可以利用有限状态机模型画出一个状态转移图 xff0c 这样便可以利用画