DFA的编程实现

DFA的编程实现_第1张图片

附录(源代码如下):

/**
文本说明:
m n t a
4 2 1 10  分别代表有:m=4个状态,n=2个字符变量,t=1个接收状态,a=10个测试用例 
0 1 2 3   分别代表4个状态分为是什么 
a b       分别代表字符变量 
0         代表起始状态 
1 2       从这里开始4行2列代表状态转换表 
3 2
1 3
3 3
3         最后一行代表1个接收状态 
*/ 
#define LENOFINE 256
#include
#include
#include
#include
#include
#include


using namespace std;


long m,n,t,a;   //分别代表有:m个状态,n个字符变量,t个接收状态,a个测试用例
long s[1000][1000]; //存储转移矩阵
long Accept[1000];  //存储接受状态
int  status[1000]; //status存储状态
char by[1000];    //by存储字符集 
int  start=-1;    //记录起始状态 


void  dfs(int  N,long s[1000][1000],long Accept[1000],int  now,string str="")
{
if(N<0)
{
return ;
}
N--;
if(Accept[now]==1)
{
cout<}
for(int i=0;i{
string temp;
int nowtemp;
nowtemp=now;
temp=str;
str+=by[i];

now=s[now][i];
dfs(N,s,Accept,now,str);
str=temp;
now=nowtemp;
}
}




int  buildFile()
{
FILE *fp;
char filename[LENOFINE];
char strTmp[121];
cout<<"请输入文件名:";
    gets(filename);
int n=0;
fp=fopen(filename,"w");
if(fp==NULL)
{
cout<<"无法创建文件"<exit(0); 
}
cout<<"请输入文件内容:"<

while(strlen(gets(strTmp))>0)
{
fputs(strTmp,fp);
fputs("\n",fp);
n++;
}
fclose(fp);
return  n;
}


void  dispFile()
{
    cout<<"开始进行DFA操作:"<     start=-1,n=0,m=0,t=0,a=0;
for(int i=0;i<1000;i++)
{
for(int j=0;j<1000;j++)
{
s[i][j]=0;
}
Accept[i]=0;
status[i]=0;
by[i]=0;
}


    //读取文件 
    FILE *fp;
    char fname[LENOFINE];
    cout<<"请输入文件名:";
    gets(fname);
    // fp=fopen("DFA.txt","r");
        fp=fopen(fname,"r");
    if(fp==NULL)
    {
    cout<<"文件打开错误!"<     exit(0);

   fscanf(fp,"%d %d %d %d",&m,&n,&t,&a);
   cout<   cout<<"状态集如下:"<   for(int i=0;i   {
    fscanf(fp,"%d ",&status[i]);
    cout<}
cout<
//检查状态集中的状态是否唯一
for(int i=0;i{
for(int j=i+1;j{
if(status[j]==status[i])
{
printf("此状态集错误,…状态 %d.发生重复!\n",status[j]); 
}
}


cout<<"字符集如下:"<   for(int i=0;i   {
    fscanf(fp,"%c ",&by[i]);
    cout<}
cout<//检查字符集元素是否唯一 
for(int i=0;i{
for(int j=i+1;j{
if(by[j]==by[i])
{
printf("此状态集错误,…状态 %d.发生重复!\n",by[j]); 
}
}




//读取起始状态
fscanf(fp,"%d",&start);

//DFA的起始状态的正确性检查 
bool flag1=false;
for(int i=0;i{
if(start==status[i])
{
flag1=true;
break;

}
if(flag1)
{
cout<<"起始状态是=>  "<}
else
{
cout<<"起始状态不在状态集之内!"<}


//读取状态转换表 
bool flag2=false;
bool flag4=true;
cout<<"字符转换表如下: "<         memset(s,0,sizeof(s));
        memset(Accept,0,sizeof(Accept));
        for(int i = status[0];i<(status[0]+m);i++){
       
            for(int j = 0;j             {
            flag2=false;
            //cin>>s[i][j];
                fscanf(fp,"%d ",&s[i][j]);
                
                //DFA的状态转换表的正确性检查 
        for(int k=0;k        {
        if(s[i][j]==status[k])
        {
        flag2=true;
        break;
       
        }
        if(flag2)
        {
        cout<       
        }
        else
      {
      
      flag4=false;
       
}
             cout<         }
        if(!flag4){
        cout<<"状态转移表状态不在状态集之内!非法DFA"<}
        //读取接收状态
cout<<"接收状态如下:"<bool flag3=false;
        for(int i = 0;i         flag3=false;
            long temp;
            //cin>>temp;
            fscanf(fp,"%d ",&temp);
            
            //DFA的接收状态的正确性检查 
    for(int j=0;j    {
    if(temp==status[j])
    {
    flag3=true;
    break;
   
      }
    if(flag3)
    {

    cout<                 Accept[temp] = 1;
    }
    else
    {
    cout<<"接收状态不在状态集之内!"<    break;
    }
        }
        cout<         
        int  len=0;
        int now;
        
        /**第4题:DFA的语言集列表显示*/
        cout<<"输出可识别的规定长度的串:"<         cout<<"len <= ";
cin>>len; 
   
        string  str=" ";
        dfs(len,s,Accept,start,str);
        
        
        cout<<"请输入 <"< 个测试用例:"<         bool flag5=true; 
        while(a--){
        flag5=true;
            string temps;
            cout<<"还可以测试 <"<个串: ";
            cin>>temps;
            int after = start;
            cout<<"状态路径为 :"<"<             int byaim=-1;
            for(int i = 0;i             for(int j=0;j             {
            if(temps[i]==by[j])
            {
            // cout<<"temps[i]="<  "<byaim=-1;
}
else
{
after=1000;
cout<flag5=false;
break;
}
            }
            
            
            if(Accept[after]==1&&flag5)
            {
            cout<<"YES"<}
            else
            {
            cout<<"NO"<
            cout<         }
fclose(fp);
//}
}






int main(){

int flag=1;
char ctmp;
char fname[LENOFINE];
while(flag>0)
{
system("cls");
cout<<"          DFA的基本操作          "<cout<<"================================="<cout<<"1、创建dfa文件                   "<cout<<"2、读取文件内容并测试            "<cout<<"0、退出                          "<cout<<"================================="<cout<<"请选择:  ";
scanf("%d",&flag);
ctmp=getchar(); 
if(flag>0)
{
//cout<<"请输入文件名: ";
//gets(fname);
switch(flag)
{
case 1:
buildFile();
break;
case 2:
dispFile();
break;
default:
cout<<"输入错误!"<break;

}
}
    
    //return 0;
}

你可能感兴趣的:(C++)