【最新精选】状态机的编程思想
状态机的编程思想
K&R习
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
1-23中,要求“编写一个程序,删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。在C语言中,注释不允许嵌套”。
如果不考虑字符常量和字符串常量,问题确实很简单。只需要去掉//和/* */的注释。
考虑到字符常量'\''和字符串常量"he\"/*hehe*/",还有类似
的头文件以及表达式5/3中的除号/,情况就比较复杂了。
我想,这种问题最适合用正则表达式来解析,perl之类的语言应当很好处理,问题是这里让你用C语言实现,但是C语言对正则表达式并没有显式的支持。
学过编译原理的应该知道,正则表达式对应三型文法,也就对应着一个有限状态自动机(可以用switch偏重算法来实现,或者用状态转换矩阵/表偏重数据结构来实现),
所以这里的问题其实是
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
一个状态机,把输入的字符流扔进去跑就可以了。
【一个简单的状态机】
先看《K&R》第一章的一个简单习题1-12:"编写一个程序,以每行一个单词的形式打印其输入"
在这个题目之前,1.5.4节的单词计数示例中,其实K&R已经展示了一个非常简单的状态机。但没有提到这种编程思想。
当然这个题目也可以状态机的思想来编程。
回到题目,我们设初始的状态state为OUT,表示当前字符不在单词中(不是单词的组成字符),如果当前字符在单词中(属于单词的一部分),则state设为IN。
显然字符只能处于上述两种状态之一,有了这2个状态,我们就可以借助状态来思考问题 ——
(1)当前状态为OUT:若当前字符是空白字符(空格、制表符、换行符),则维护当前状态仍为OUT;否则改变状态为IN。
(2)当前状态为IN:若遇到的当前字符是非空白字符,则维护当前状态为IN;否则改变状态为OUT。
处于不同的状态,根据题意可以给予相对应的动作——
每当状态为IN的时候,意味字符属于单词的一部分,输出当前字符;
而当状态从IN切换为OUT的时候,说明一个单词结束了,此时我们输出一个回车符;状态为OUT则什么也不输出;
可以看出,借助自定义的状态,可以使编程思路更加清晰。
在遍历输入字符流的时候,程序(机器)就只能处于两种状态,对应不同状态或状态切换可以有相应的处理动作。
这样的程序不妨称为“状态机”。
按照上面的思路,代码实现就非常简单了——
1 #include
2 #define OUT 0 /* outside a word */
3 #define IN 1 /* inside a word */
4
5 int main(void)
6 {
7 int c, state;
8
9 state = OUT;
10 while ( ( c = getchar() ) != EOF ) {
11 if (state == OUT) {
12 if (c == ' ' || c == '\t' || c == '\n')
13 state = OUT;
14 else {
15 state = IN;
16 putchar(c); //action
17 }
18 } else {
19 if (c != ' ' && c != '\t' && c != '\n') {
20 state = IN;
21 putchar(c); //action
22 } else {
23 putchar('\n');//action
24 state = OUT;
25 }
26 }
27 }
28 return 0;
29 }
让我们回到主题吧——
【“编写一个程序,删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量。在C语言中,注释不允许嵌套”】
按照注释的各方面规则,我们来设计一个状态机——
00)设正常状态为0,并初始为正常状态
每遍历一个字符,就依次检查下列条件,若成立或全部检查完毕,则回到这里检查下一个字符
01)状态0中遇到/,说明可能会遇到注释,则进入状态1 ex. int a = b; /
02)状态1中遇到*,说明进入多行注释部分,则进入状态2 ex. int a= b; /*
03)状态1中遇到/,说明进入单行注释部分,则进入状态4 ex. int a = b; //
04)状态1中没有遇到*或/,说明/是路径符号或除号,则恢复状态0 ex. or 5/3
05)状态2中遇到*,说明多行注释可能要结束,则进入状态3 ex. int a = b; /*heh*
06)状态2中不是遇到*,说明多行注释还在继续,则维持状态2 ex. int a = b; /*hehe
07)状态3中遇到/,说明多行注释要结束,则恢复状态0 ex. int a = b; /*hehe*/
08)状态3中不是遇到/,说明多行注释只是遇到*,还要继续,则恢复状态2 ex. int
a = b; /*hehe*h
09)状态4中遇到回车符\n,说明单行注释结束,则恢复状态0 ex. int a = b; //hehe
10)状态0中遇到',说明进入字符常量中,则进入状态5 ex. char a = '
11)状态5中遇到\,说明遇到转义字符,则进入状态6 ex. char a = '\
12)状态6中遇到任何字符,都恢复状态5 ex. char a = '\n 还有如'\t', '\'', '\\' 等 主要是防止'\'',误以为结束
13)状态5中遇到',说明字符常量结束,则进入状态0 ex. char a = '\n'
14)状态0中遇到",说明进入字符串常量中,则进入状态7 ex. char s[] = "
15)状态7中遇到\,说明遇到转义字符,则进入状态8 ex. char s[] = "\
16)状态8中遇到任何字符,都恢复状态7 ex. char s[] = "\n 主要是防止"\",误以为结束
17)状态7中遇到"字符,说明字符串常量结束,则恢复状态0 ex. char s[] = "\"hehe"
前面说过,不同状态可以有相应的动作。比如状态0、5、6、7、8都需要输出当前字符,再考虑一些特殊情况就可以了。
读者实现时可以借助debug宏定义,将测试语句输出到标准错误输出,需要时可以重定位到标准输出,即2>&1,然后通过重定向|到more进行查看。
上面的状态机涉及到了[0, 8]一共9种状态,对应的状态转换图(或者说状态机/自动机)如下:
有了这些状态表示,编写代码就很容易了——
1 /*
2 *Copyright (C) Zhang Haiba
3 *Date 2014-02-26
4 *File exercise1_23.c
5 *
6 *this program removes all comments in grammatical C code,
7 *and as a integrity solution for exercise1-23 in <>
8 */
9
10 #include
11 #define debug
12 //#define debug(fmt, args...) fprintf(stderr, fmt, ##args) 13
14 void dfa();
15
16 int main(void)
17 {
18 dfa();
19 return 0;
20 }
21
22 void dfa()
23 {
24 int c, state;
25
26 state = 0;
27 while ((c = getchar()) != EOF) {
28 if (state == 0 && c == '/') // ex. [/] 29 state = 1;
30 else if (state == 1 && c == '*') // ex. [/*] 31 state = 2;
32 else if (state == 1 && c == '/') // ex. [//] 33 state = 4;
34 else if (state == 1) { // ex. [ or 5/3]
35 putchar('/');
36 state = 0;
37 }
38
39 else if (state == 2 && c == '*') // ex. [/*he*] 40 state = 3;
41 else if (state == 2) // ex. [/*heh] 42 state = 2;
43
44 else if (state == 3 && c == '/') // ex. [/*heh*/] 45 state = 0;
46 else if (state == 3) // ex. [/*heh*e] 47 state = 2;
48
49 else if (state == 4 && c == '\n') // ex. [//hehe] 50 state = 0;
51
52 else if (state == 0 && c == '\'') // ex. ['] 53 state = 5;
54 else if (state == 5 && c == '\\') // ex. ['\] 55 state = 6;
56 else if (state == 6) // ex. ['\n or '\' or '\t etc.]
57 state = 5;
58 else if (state == 5 && c == '\'') // ex. ['\n' or '\'' or '\t' ect.]
59 state = 0;
60
61 else if (state == 0 && c == '\"') // ex. ["] 62 state = 7;
63 else if (state == 7 && c == '\\') // ex. ["\] 64 state = 8;
65 else if (state == 8) // ex. ["\n or "\" or "\t ect.]
66 state = 7;
67 else if (state == 7 && c == '\"') // ex. ["\n" or "\"" or "\t" ect.]
68 state = 0;
69
70 //debug("c = %c, state = %d\n", c, state); 71
72 if ((state == 0 && c != '/') || state == 5 || state == 6 || state == 7 || state == 8)
73 putchar(c);
74 }
75 }
【测试用例(1)a.out < test.c > test2.c】
test.c如下:
/*
*This code make no sense,
*but for exercise1_23 in <> to test remove all comments in C code.
*/
# include
# include
#include
# include "/Users/apple/blog/zhanghaiba/KandR/test.h" #define debug
# define LESS(i) ( ((i) << 31) / 2 )
# define STRING "\"string\"" //to ensure legal
#define CHAR '\''
int main(void)
{
#ifdef A
"hehe..."
#else /*hehe*/
"blala"
#endif
///*testing*/
int idx;
if (idx > 3 && idx < 6) idx = idx/100;
/* // */
char a = '/'; // /
char b = '*'; // *
char c = '\''; // '
char d = '\n'; // enter
char e = '\"'; // "
char f = '\\'; // \
char g = '<'; // <
char h = '>'; // >
char i = '"'; // "
/* special***string */
char special0[] = "\"hello, world!\"";
char special1[] = "//";
char special2[] = "he\"/*hehe*/";
char *special = " \' hi \0\b\t \\\\ \a\e\f\n\r\v wolegequ \\ ";
return 0;
}
测试截图对比如下——
附加公文一篇,不需要的朋友可以下载后编辑删除,谢谢(关于进一步加快精准扶贫工作意)为认真贯彻落实省委、市委扶贫工作文件精神,根据《关于扎实推进扶贫攻坚工作的实施意见》和《关于进一步加快精准扶贫工作的意见》文件精神,结合我乡实际情况,经乡党委、
政府研究确定,特提出如下意见:
一、工作目标
总体目标:“立下愚公志,打好攻坚战”,从今年起决战三年,实现全乡基本消除农村绝对贫困现象,实现有劳动能力的扶贫对象全面脱贫、无劳动能力的扶贫对象全面保障,不让一个贫困群众在全面建成小康社会进程中掉队。
总体要求:贫困村农村居民人均可支配收入年均增幅高于全县平均水平5个百分点以上,遏制收入差距扩大趋势和贫困代际传递;贫困村基本公共服务主要指标接近全县平均水平;实现扶贫对象“两不愁三保障”(即:不愁吃、不愁穿,保障其义务教育、基本医疗和住房)。
年度任务:2015,2017年全乡共减少农村贫困人口844人,贫困发生率降至3%以下。
二、精准识别
(一)核准对象。对已经建档立卡的贫困户,以收入为依据再一次进行核实,逐村逐户摸底排查和精确复核,核实后的名单要进行张榜公示,对不符合政策条件的坚决予以排除,确保扶贫对象的真实性、精准度。建立精准识别责任承诺制,上报立卡的贫困户登记表必须经村小组长、挂组村干部、挂点乡干部、乡领导签字确认,并作出承诺,如扶贫对象不符合政策条件愿承担行政和法律责任,确保贫困户识别精准。
(二)分类扶持。通过精准识别建档立卡的贫困户分为黄卡户、红卡户和蓝卡户三类,第一类为黄卡户,是指有劳动能力,家庭经济收入在贫困线边缘的贫困户;第二类为红卡户,是指有一定的劳动能力,家庭贫困程度比较深的贫困户;第三类为蓝卡户,是指年老体弱或因病因残丧失劳动能力的贫困户和五保户。优先扶持黄卡户,集中攻坚扶持红卡户脱贫,对蓝卡户则通过保障扶贫来保障其基本生活。
(三)挂图作业。根据贫困户的实际情况,分三年制定脱贫规划。乡里将根据各村情况对每年精准脱贫任务落实到户到人,建立台账,并用图表标注清楚,挂图作业,脱贫一户销号一户,做到“贫困在库,脱贫出库”。
三、精准施策
针对贫困村和建档立卡贫困户的实际情况,分清类别,分类施策,强化措施,扎实推进各项扶贫政策落实到实处。在抓好贫困村公共设施和服务方面的建设同时要抓好对贫困户的帮扶,做到精准施策。
(一)推进基础设施扶贫
1(对“十三五”扶持贫困村25户以上的所有自然村,由规划所牵头负责进行村庄建设规划。
2(重点解决“最后一公里”的问题。着力解决贫困群众最需要、最期盼的交通、电力、水利、就医就学等方面“最后一公里”的问题,让贫困群众享受均等的基本公共服务。到2015年完成2个贫困村25户以上自然村水泥路建设,确保到2016年底新一轮贫困村中25户以上自然村全部通水泥路;在调查摸底和充分征求意见的基础上,确保到2016底全面完成农村贫困户土坯房和危旧住房的改造任务;灌溉渠系建设和小山塘除险加固改造主要倾向贫困村,提高灌溉能力,到2017底基本解决贫困村农村居民饮水安全和生产用水困难问题;每年安排贫困村至少一个“一事一议”项目,以帮助解决路、桥、水等问题。
(二)推进产业扶贫
1(培育壮大特色富民产业。大力发展高产油茶、白莲、等特色种植业和特色养殖业,鼓励支持贫困户依据当地资源禀赋发展“一村一品”富民特色产业。为贫困户发展种养业优先立项和优先提供苗木和种苗。每年通过产业扶持贫困户50户以上,到2020年有劳动能力的贫困户每户都有一个长效增收的主业。
乡财政筹集资金,重点打造空坑——XX扶贫产业带,带动全乡贫困群众发展扶贫产业。
2(筹集精准扶贫到户资金。县乡筹集精准帮扶到户资金,对贫困户发展产业给予奖补,或提供小额贷款担保、贴息、补助农业保险,以及提供信息、技术、服务等。县财政每年从产业扶贫资金中,切出一半以上用于精准扶贫到户,发展了扶贫产业的贫困户,经验收合格后每户获得一次性扶持资金5000元,按规划分批实施,5年内全覆盖;另外切除部分资金,用于贫困户精准扶贫发展产业贷款贴息。
3(积极探索“四位一体”的产业扶贫新模式。指导贫困村选择一个适合当地发展的高效产业;组建一个支撑有力的合作组织;设立一个产业贷款风险补偿金,为条件成熟的贫困村安排20万元产业扶贫专项资金,作为贫困户产业发展贷款风险补偿金,由合作商业银行按1:8放贷;创建一个部门配合的帮扶机制,县委农工部、县农业局、县林业局、县蔬菜局等相关部门在贫困村产业选择、合作社组建、技术培训推广、市场开发等方面会给予大力支持,共同推进。
4(创新产业发展服务体系。鼓励贫困农户以土(林)地经营权作价入股方式,参与家庭农场、农民专业合作社、合作农场和联户经营等新型农业经营体系。对贫困户创办的家庭农场和有贫困户参与的合作社,县财政将重点给予资金扶持。广泛推行“千村万户老乡工程”,力争2,3年覆盖黄卡、红卡贫困户,带动贫困户增收致富。
(三)推进搬迁扶贫
,(正确引导。对地处边远、生存和发展条件较差、就地扶贫难以奏效的贫困户,坚持群众自愿、规模适度、梯度安置的原则,稳步
推进贫困人口向县城工业园、县城次中心、中心圩镇或中心村有序搬迁转移。
2(整合资源。积极整合资源支持搬迁移民集中安置点的基础设施建设,完善搬迁移民集中安置点的道路、通水、通电、学校、幼儿园、卫生所、文化等公共设施。
3(扶持政策叠加。搬迁移民户可同时享受搬迁移民扶贫补助和农村危旧房、土坯房改造补助,对特别困难的搬迁户,进一步提高建房补助标准,动员和引导社会力量“一对一”帮扶;搬迁移民户除享受移民安置各项扶持政策外,迁出地的土地、山林、水面等承包经营权不变;帮助其解决后续发展问题,实现稳得住、奔小康能致富。
(四)落实智力扶贫政策
1(优先支持贫困村发展教育。加强贫困村学校规划,优先立项解决贫困村薄弱学校改造,同步实现标准化和现代远程教育,新招聘的老师优先安排到贫困村
小学
小学生如何制作手抄报课件柳垭小学关于三违自查自纠报告小学英语获奖优质说课课件小学足球课教案全集小学语文新课程标准测试题
任教,每年安排优秀小学教师到贫困村小学轮流支教,让贫困村的小学生能就近享受优质教育资源。优先支持贫困村利用闲置校舍改建公办幼儿园、村小增设附属幼儿班、学前教育巡回支教点项目。
2(加大贫困生资助力度。落实好现有国家济困助学政策,逐步提高贫困生资助标准。公办幼儿园、村小附属幼儿班对建档立卡贫困户子女学前教育的保教费减半;对义务教育阶段建档立卡的贫困家庭寄宿生生活补助标准,在上级规定的基础上每人每年增加500元;择优
录取建档立卡贫困户子女到县属中学上学,除享受国家规定的贫困家庭寄宿生生活补助和普通高中国家助学金外,每人每学年再给予1000元的生活补助,并免除学杂费、住宿费;对考取全日制普通高等学校的建档立卡贫困户子女每人一次性补助8000元;为当年被全日制大专以上院校录取的贫困家庭大学生办理国家生源地信用助学贷款。
3(大力实施职业教育和就业培训。继续实施“雨露
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
”,支持职业学历教育,对建档立卡贫困户子女参加中、高等职业学历教育的,在校期间每人每年给予2000元的补助;大力开展职业技能培训,对参加转移就业技能培训并取得有关部门颁发职业技能证书的扶贫对象,给予每人1000元培训补助;为贫困户免费开展农村实用技术培训,此项工作由县扶贫和移民办组织实施。面向农村贫困家庭定向培养人才,今年对建档立卡贫困户子女报考“三定向”的加20分录取;从2016年起,县里将切出20%的“三定向”招生指标,专门用于招收建档立卡贫困户子女,并根据当年招生考试情况确定具体加分标准。
(五)推进劳务扶贫
1(公益性岗位安置贫困户就业。
2(鼓励能人创业扶贫。凡通过创业带领贫困户家庭成员就业,经当地就业部门审核符合相关规定的,优先给予小额担保贷款政策扶持。
3(解决贫困户进企业务工。积极帮扶有劳动能力的贫困户农民工进企业务工,解决贫困家庭收入来源问题。
(六)推进保障扶贫
1(落实完善最低生活保障
制度
关于办公室下班关闭电源制度矿山事故隐患举报和奖励制度制度下载人事管理制度doc盘点制度下载
。逐步提高低保、“五保”补助标准,扩大低保覆盖面,对符合农村低保条件的做到“应保尽保”。
,(完善农村居民基本养老保险制度。全面推进农村居民基本养老保险,让其享受基本养老金保障。
,(健全医疗保障制度。对所有建档立卡的贫困户县内住院给予特殊政策倾斜。
,(完善临时救助制度。对遭遇突发事件、意外伤害、重大疾病等特殊原因导致基本生活困难,其他社会救助制度暂时无法覆盖或救助之后基本生活暂时仍有严重困难的家庭或个人给予临时救助,帮助他们渡过难关。
(七)推进社会扶贫
县工业园管委会将牵头联合县工信委、县扶贫和移民办在企业界开展主题为“全民扶贫,邀您同行”结对帮扶活动,积极组织工业企业自愿参与到贫困村开展结对帮扶活动。激励和引导“爱心协会”等社会力量参与扶贫,争取社会各界参与结对帮扶等扶贫攻坚工作。
四、精准帮扶
进一步完善精准扶贫机制,搭好精准扶贫的平台,实现扶贫方式由过去大水“漫灌式”向精准“滴灌式”转变,真正扶到点上、扶到根上。突出抓好“七个到村到户”:
(一)产业到村到户。每个贫困村都要根据当地的资源禀赋围绕富民产业,选择一个符合当地实际的特色产业,引导贫困户通过参与产业发展,实现增收致富。
(二)项目到村到户。根据建档立卡贫困户的实际情况,有针对性地选择脱贫项目,找准脱贫路子,做到能种则种,能养则养,能外出务工则外出务工。贫困村要根据当地产业特色,成立农民专业合作社,为贫困户发展产业提供服务。
(三)柚苗到村到户。县委农工部将安排专项资金、县农业局负责购买调运柚苗,给每户贫困户免费发放20株以上柚苗,扶持贫困户种好“摇钱树”。
(四)资金到村到户。对建档立卡的贫困户逐户制定发展目标、落实脱贫项目和帮扶资金,做到专项扶贫与行业扶贫、社会扶贫并举,专项扶贫资金要全部落实到贫困村、贫困户,行业扶贫资金、涉农部门项目资金要向贫困村、贫困户倾斜,与扶贫资金捆绑使用,实现贫困户精准扶贫全覆盖。
(五)干部帮扶到村到户。进一步加大干部挂点帮扶贫困村和结对帮扶贫困户工作力度。实施“四个一”组合式扶贫:每个贫困村都安排有一个以上县领导、一个以上县直单位、一个以上工业企业和一
笔专项扶贫资金,实行挂点帮扶。要按照“交朋友、摸实情、找路子、扶资金、促增收”的思路,继续推行科级以上领导干部“1+2”结对帮扶工作,即每位副科级以上领导干部每年扶助3户黄卡、红卡贫困户,按“一户一策”发展一项扶贫产业,增加贫困户家庭经济“造血功能”,所帮扶的贫困户每户每年增收要达到2000元以上。通过三年扶贫攻坚,使全乡所有黄卡户、红卡户真正脱贫,对蓝卡户进行最低生活保障。
(六)跟踪管理到村到户。加强扶贫信息监测工作,及时更新扶贫对象统计监测系统的数据信息,每年都要对贫困村、贫困户的收入变动状况、干部帮扶、项目帮扶、资金帮扶、扶贫项目实施等情况进行全面调查统计,并及时录入全国扶贫对象统计监测系统。按照“贫困在库,脱贫出库”的原则,对已经脱贫的贫困户及时销号,对有特殊情况返贫的登记入库,做到贫困户有进有出。对扶贫项目的安排及实施、扶贫资金使用、贫困户得到扶持等情况,定期在村务公开栏内进行公示,接受群众监督。
(七)土坯房改造到村到户。凡居住在危旧房或土坯房的建档立卡贫困户,三年内必须全面实施危旧房、土坯房改造,严格按照省定危旧房、土坯房改造补助标准补贴到户。
五、保障措施
(一)落实工作责任。乡党委、政府和各村党支部、村委会是实现扶贫攻坚的责任主体,各村要结合当地实际,制定具体的可操作性的
实施意见,落实扶贫攻坚任务和措施。乡党委、政府的主要领导是扶贫攻坚的第一责任人,乡党政班子成员、各村书记主任是扶贫攻坚的具体责任人。各村要广泛宣传扶贫攻坚的方针政策和上级党委、政府消除农村绝对贫困的决心和措施。
(二)加强队伍建设。乡组建扶贫工作站,由分管领导担任站长,同时安排4名有工作经验的干部集中办公,切实解决基层扶贫工作有人办事、有钱办事的问题。
(三)夯实基层组织。加强村级基层组织建设,选好配强贫困村的领导班子,尤其要选好村党支部书记,发挥好基层党组织的战斗堡垒和党员干部的先锋模范作用。着力解决贫困村“无址办事”和“无钱办事”的问题,2015年实现贫困村村级组织都有活动场所的目标;大力发展村级集体经济,到2018年底贫困村全面消除“空壳村”。
(四)加大扶贫专项资金监管力度。严格把握扶贫资金的使用范围,本着“渠道不乱、用途不变、归口管理”的原则,实行扶贫资金专款、专帐、专人管理、封闭运行。确保资金跟着项目走。凡涉及扶贫和移民资金的项目,一要严格按规定采取相应招投标形式,确定建设队伍;二要将所有与扶贫资金有关的施工合同必须列入廉政承诺条款;三要项目业主和建设单位必须签订廉政责任状。
(五)严格考核奖惩。一是将扶贫攻坚工作纳入年度综合考评和村书记、主任个人年度考核及述职的重要内容;二加强工作督查,每个月对各乡村的扶贫攻坚工作进行一次督查。督查结果一要作为扶贫
攻坚工作考核依据;二要与评先评优相结合。对在精准扶贫工作中有
实招、干实事、见实效的给予通报表扬;对工作不力、进展缓慢的给
予通报批评,并要求限期整改。