- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 6.2 程序设计实例研究 转换函数分析(续) q3状态下: 输入‘*’:状态不变 输入‘/’:state=q4 输入EOF:state=ERROR 输出其他: state=q2 q4状态下: 输入EOF:state=ACCEPT 输出其他: state=ERROR * 6.2 程序设计实例研究 例5 去除C语言注释 * 有限状态机解题通用处理模式 有限状态机解题通用处理模式 #define START 1 ... int state=START; ... while (state!=END) { ch=getch(); switch(state) { case START: if (ch==?) state=Q1; break; ...} * 为什么要用状态机? 有限状态机到底有什么好处?怎样才算应用状态机解题? 1、状态机用数学模型来设计解题思路,准确可靠、简练,而程序员仅仅依靠自己的脑力和复杂的程序结构。 2、状态机模型的思路和人解决问题的思路是一致的,都是把复杂的问题逐步分解为简单的步骤。所以状态机模型是程序员的好助手,不是你的竞争对手。 3、状态机解题的特征:在连续输入的逻辑判断过程中,有清楚的状态分段,各状态段之间的逻辑跳转有严谨的迁移规则。 4、应用状态机设计的程序最终表现出的清晰严谨的逻辑结构,而不是可读性很差的“聪明”代码。 * 例6: 输入一个字符串,以’#’结束,要求判断其是否满足anbncn形式。 程序运行效果如下: 例1: Please input string consist of a/b/c, #to end: aabbcc# the string is acceptable 例2: Please input string consist of a/b/c,#to end: aabbc# the string is not acceptable * 为什么要引入状态?-问题示例 main() { int count1=0,count2=0,count3=0; char ch; ch=getch() while (ch==‘a’){ count1++; ch=getch(); } while (ch==‘b’){ count2++; ch=getch(); } while (ch==‘c’){ count3++; ch=getch(); } if (ch==‘#’) { if (count1==count2)(count2==count3) printf(“string is acceptable!\n”); else printf(“string is not acceptable!\n”); } system(“pause”); return 0; } 初始化 状态1 getch=‘a’ getch=‘a’ 状态2 getch=‘b’ getch=‘b’ 状态3 getch=‘c’ getch=‘c’ 状态4 getch=‘#’ 正确 错误 返回 首字母不是a/b/c/# getch不是a/b/c/# 导论教材P168 图10.6程序实例不是好的状态机实例,同学不要学! * 上机作业 作业3,内容从网站下载。 * * 大作业-文件IO版本 设计思路 * * 大作业文件IO版本模块结构图 模型 内部状态 控制器 策略算法 结果记录 写入文件 状态 变化 事件 改变状态 文件输入 读取请求 事件 时间同步 * * 大作业文件IO版本程序框架 /* 大作业文件IO版本的程序主体结构 */ struct STATE {…} //电梯或银行的运行状态 struct LIST {…} //请求队列链表节点 struct REQ {…} //暂存每次获得的请求事件 int main(){ int timeCount=0; //计时器,每循环一次模拟2ms struct REQ theReq={}; //暂存每次获得的请求事件 struct STATE preST,theST ={}; //保存电梯或银行的运行状态 struct LIST *headp=NULL;//存请求队列链表头指针 File *fpin,*fpout; * * 大作业文件IO版本程序框架 openFile(**fpin,**fpout); //打开输入输出文件 theReq=get_fileInput(fpin); //读取第一个请求
文档评论(0)