DFA编程实现报告.docVIP

  • 36
  • 0
  • 约4.69千字
  • 约 11页
  • 2016-09-21 发布于重庆
  • 举报
DFA编程实现报告

实验一 DFA的编程实现 实验目的: 通过本次实验,加深对DFA及其识别的语言的理解,学习对一般的DFA的表达方 法与编程实现方法。 实验任务: 编写一个C语言程序,模拟实现DFA识别字符串的过程。 实验内容: (1)DFA的输入; (2)DFA的存储与读写; (3)DFA的正确性检查; (4)DFA的语言集列表显示; (5)DFA的规则字符串判定; 四、实验分析: DFA的初始化 一个DFA的基本信息 状态集、字符集、开始状态、结束状态集、状态转换表状态转换表 字符串判断 初始化一个DFA,后可以通过一下算法判断一个字符串是否符合该DFA。 判定算法概要: 准备:开始状态s0, 接受状态集F, 状态转换表T(s, c), s(S, c(( c = getchar(); s = 开始状态s0; while ( c != EOF ) // 输入未结束则循环… { s = T(s, c); if (s == NULL) error(); c = getchar(); } if (s ( 接受状态集F) accept (); else error (); 对DFA的存储与读写 将DNF的信息写入文件中, 第一行:字符集; 第二行:状态集; 第三行:开始状态; 第四行:结束状态集; 以下行写入状态转换 按照既定的规定读取文件 中的数据将其赋值,然后 初始化DFA即可; DFA的语言集列表显示: 这一个模块应该是这个实验中比较难的一部分了。我并没有使用while循环的这个做法。而是用函数递归,通过所有字符集的路径去遍历整个DFA。最后将符合条件的字符串输出; void Traversal(char present, int N,string strass=)//遍历DFA的语言集列表 { if(present==N||N0)//若路径已经大于N或者当前状态错误,停止递归 return; N--; if(FinalStates.find(present)!=FinalStates.npos) { cout该自动机识别字符串:strassendl; } for(int i=0;iAlphabet.length();i++) { string temp; temp=strass; strass+=Alphabet[i]; Traversal(move(present,Alphabet[i]),N,strass); strass=temp; } } 递归终止条件的判断。 当N-- 时, N小于0,或者遍历到无路可走是便终止 遇到的问题: 对于递归的终止条件写得不够明确。 递归前对字符串赋值strass赋值,递归后应该还原,这一点没有想到。调试了很久。 总结,对递归的具体编写 还是不熟悉。 目前的代码,字符集和状态只能是一个字符,若要优化可以用vectorstring容器存储即可; 实验用例: 实验结果: DFA的初始化 判断字符串: 显示小于N的语言集: 读取DFA文件: 五、实验总结: 在这次实验中,学习对一般的DFA的表达方法与编程实现方法。对课本提供的算法有了更深刻的认识。在编写和调试代码的过程中对自身的编程能力也有了很大的提高。对自动机和其识别语言有了更透彻的理解。在动手编程之前一定要好好明确实验的理论准备和思路的理清,能帮助我们在实验过程中少走更多的弯路。总之在这次实验中收获很多,提高了动手能力和分析问题的能力。 源代码: //构造一个DFA #includeiostream #includestring #includevector #includefstream using namespace std; class TransitionTable { public: char present; //当前状态 char next; //下一状态 char input; //输入字符 TransitionTable(char P,char I,char D) { present=P; next=D; input=I; } }; class DFA { public: DFA() { cout1、手动输入,2、读取txt文件endl; int select; cinselect; if(select==1) inti(); if(select==2) read(); } string States; //状态集 char Star

文档评论(0)

1亿VIP精品文档

相关文档