一、实验目的:
1.设计、编制、调试一个确定有穷自动机的程序,加深对DFA确定化原理的理解。
2.掌握在对程序设计DFA确定化的过程。
二、实验要求:
1. NFA到DFA的转换过程
2. NFA初始状态集的λ合并集作为DFA的初始状态
3. 对DFA中一状态S,对a∈∑,VMP进行符号合并和λ合并得到的状态设为S’,定义DFA的转换函数为f(S,a)=S’
三、实验环境:
房地产公司简介Windows下的 Microsoft Visual C++ 6.0 或Visual Studio 2008;
四、实验步骤
1.查询资料,了解NFA确定化的工作过程与原理。
2.分析题目,整理出基本设计思路。
3.实践编码,将设计思想转换用c语言编码实现,编译运行。
五、调试程序:
举例说明
1、错误输入时
中国第一大姓氏
六、实验心得:
1:
通过此次实验,让我对老师在课堂上讲的有关DFA(确定有穷自动机)、NFA(非确定有穷自动机)的知识有了更深的理解,如它们的构造以及相互转化。在编写程序的过程中我们对C语言中有关数据结构及其相关的知识进行了复习,这更有利于我们目标的实现。在本次实验中,让我进一步的认识到组员的重要性,当遇到困难时,通过讨论、分析才能更好更快的解决问题,完成共同的任务。
2:
通过本次实验进一步的了解并掌握NFA确定化的运用,同时发现自己对关于NFA的很多知识不是很熟,运用的也不好。但是通过和同学的配合和学习知道了NFA,DFA的本质内容及其功能,以后会更多的学习这些知识,更好的掌握和熟练的运用所学的知识。
附录:
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
using namespace std;
///---------------------Function-------------------------------
void NFA_Input();
void Set_Inrt(vector<char>& vec, char ch);
bool Matching(vector<vector<char> >& Source, vector<char>& Target);
vector<char> EPSILON_CLOSURE(vector<char>& T);
vector<char> Transf(vector<char>& vec, char ch);
void DFA_Output();
void Output(vector<char>& vec);
///--------------------NFA-------------------------------------
struct Edge
{
char stat1;
char ch;
char stat2;
};
vector<char> Alpha;
vector<char> N_Stat;
vector<char> N_Start;
vector<char> N_End;
vector<Edge> N_Transfer;
vector<Edge> E_Transfer; //带 '~' 的状态转换
const char EPSILON = '~';
///--------------------DFA 部分---------------------------------
vector<vector<char> > D_Stats;
vector<vector<char> > D_End;股改方案
vector<char> D_Start;
//-----------------------------------------------------------------------------
// 主函数
//-----------------------------------------------------------------------------
int main()
{
cout << "--------------------NFA-----------------" << endl;
NFA_Input();
D_Start = EPSILON_CLOSURE(N_Start); //NFA初态的闭包为DFA的初态
D_Stats.push_back(D_Start);
stack<vector<char> > Q;
Q.push(D_Start);
cout << "\n--------------------NFA-----------------" << endl
好妇产
<< "Status transfer:" << endl
<< "Input stat\t" ;
for(vector<char>::size_type i = 0; i != Alpha.size(); i++)
cout << Alpha[i] << "\t" ;
cout << endl;
vector<char> V, T;
while(!Q.empty())
{
T = EPSILON_p());
Q.pop(); V.clear();
Output(T);
for(vector<char>::size_type i = 0; i != Alpha.size(); i++)
{
V = Transf(T, Alpha[i]);
V = EPSILON_CLOSURE(V);
if((V.size() != 0)&&!Matching(D_Stats, V))
{
D_Stats.push_back(V);
Q.push(V);
}
Output(V);
}
cout << endl;分类标记
}
DFA_Output();
system("PAUSE");
return 0;
芋头扣肉
}
//-----------------------------------------------------------------------------
// NFA 输入
//-----------------------------------------------------------------------------
void NFA_Input()
{
char ch;
cout << "Input the Status(End With '#'):" << endl;
while(cin >> ch, ch != '#')
N_Stat.push_back(ch);
sort(N_Stat.begin(), d());
一路向北吉他谱 cout << "\nInput the Alpha(End With '#'):" << endl;
while(cin >> ch, ch != '#')
Alpha.push_back(ch);
sort(Alpha.begin(), d());
cout << "\nInput the Status Transform Function: " << endl
<< " Input format: Q0 a Q1" << endl
<< " End format: # # #" << endl
<< " U '~' instead of 'ε'." << endl;
while(1)
{
Edge edge;
cin >> edge.stat1;
cin >> edge.ch;
cin >> edge.stat2;
if(edge.stat1 == '#' && edge.ch == '#' && edge.stat2 == '#' )
break;
if(edge.ch == EPSILON)
E_Transfer.push_back(edge);
el
N_Transfer.push_back(edge);
}
cout << "\nInput the Start Status(End With '#'):" << endl;
while(cin >> ch, ch != '#')
N_Start.push_back(ch);
sort(N_Start.begin(), d());
cout << "\nInput the End Status(End With '#'):" << endl;
while(cin >> ch, ch != '#')
N_End.push_back(ch);
sort(N_End.begin(), d());
}
//----------------------------------------------------------------------------
// stat_t Match
//----------------------------------------------------------------------------
bool Matching(vector<vector<char> >& Source, vector<char>& Target)