有限自动机的构造与识别

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char p[30][30];
 char q[30][30];
int line=0;
 int n;
    int i,j;
    int count=0;
    int k,t=0;
    int flag=0;
    int l,m=0;
    char VN[30]={'\0'};
    char VT[30]={'\0'};
    printf("请输入规则个数");
    scanf("%d",&n);
    line=n;
     for(i=0;i<30;i++)
     for(j=0;j<30;j++)
     {
         p[i][j]='\0';
         q[i][j]='\0';
     }
     printf("请输入文法:\n");
     for(i=0;i<line;i++)
     {
          scanf("%s",p[i]);
      }
      l=0;
    m=0;
      for(i=0;i<line;i++)
      {
          for(j=0;j<30&&(p[i][j]!='\0');j++)
         {
             if(p[i][j]<='z'&&p[i][j]>='a'||(p[i][j]<='9'&&p[i][j]>='0'))
             {
                 flag=0;
                 for(t=0;VN[t]!='\0';t++)
                  {
                      if(VN[t]==p[i][j])
                    {
                         flag=1;
                          break;
                   }
                 }
                if(flag==0)
                 {
                   VN[l]=p[i][j];
                    l++;
                  }
              }
              if(p[i][j]<='Z'&&p[i][j]>='A')
           {
                 flag=0;
                for(t=0;t<30&&(VT[t]!='\0');t++)
                 {
                    if(VT[t]==p[i][j])
                   {
                        flag=1;
                          break;
                     }
             }
            if(flag==0)
              {
                  VT[m]=p[i][j];
                  m++;
              }
          }
      }
  }
      count=0;
      k=0;
      for(i=0;i<line;i++)
      {
          for(j=4;j<30&&(p[i][j]!='\0');j++)
          {
              if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))
              {
                  q[count][k]=p[i][j];
                  k++;
              }
              else
              {
                 count++;
                  k=0;
              }
          }
          count++;
          k=0;
      }
      flag=0;
      for(i=0;i<count;i++)
     {
          for(j=i+1;j<count;j++)
          {
              if(strcmp(q[i],q[j])==0)
              {
                 flag=1;
                 break;
             }
         }
    }
    if(flag==1)
     {
         printf("是非确定的有穷状态自动机,即NFA\n\n");
         printf("构造的有穷状态自动机为:\n");
        printf("NFA N=(K,E(总和的意思),M,{S},{Z})\n");
    }
     else
    {
         printf("是确定的有穷状态自动机,即DFA\n\n\n");
         printf("构造的有穷状态自动机为:\n");
        printf("DFA N=(K,E(总和的意思),M,{S},{Z})\n");
     }
     printf("其中,\nK={S");
     for(i=0;i<30&&(VT!='\0');i++)
    {
         printf(",%c",VT[i]);
    }
     printf("}\n");
     printf("E={");
     for(i=0;i<30&&(VN[i]!='\0');i++)
     {
         printf("%c ",VN[i]);
    }
     printf("}\n");
     //分离文法
     k=0;
     count=0;
     for(i=0;i<line;i++)
     {
        j=4;
         while(p[i][j]!='\0')
         {
            if(k<4)
             {
                 q[count][k]=p[i][k];
                 k++;
             }
             else
             {
                 if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))
                 {
                     q[count][k]=p[i][j];
                     k++;
                     j++;
                 }
                 if(p[i][j]=='l')
                 {
                     count++;
                   k=0;
                     j++;
                 }
             }
         }
         count++;
         k=0;
     }
     printf("\n");
     //打印
     printf("M:\n");
     l=0;
     while(VN[l]!='\0')
     {
         printf("M(S,%c)={",VN[l]);
        for(i=0;i<30;i++)
         {
             for(j=4;j<30&&(q[i][j]!='\0');j++)
             {
                 if(VN[l]==q[i][j]&&(q[i][j+1]=='\0')&&(q[i][j-1]=='='))
                 printf("%c",q[i][0]);
             }
        }
        printf("}\t");
         l++;
     }
     printf("\n");
     l=0;
     k=0;
     while(VT[k]!='\0')
    {
        l=0;
         while(VN[l]!='\0')
         {
             printf("M(%c,%c)={",VT[k],VN[l]);
             for(i=0;i<30;i++)
             {
                for(j=4;j<30&&(q[i][j]!='\0');j++)
                {
                    if(VT[k]==q[i][j]&&VN[l]==q[i][j+1])
                     printf("%c",q[i][0]);
              }
             }
             printf("}\t");
             l++;
        }
        k++;
         printf("\n");
     }
     system("pause");
 }

 

posted @ 2016-12-02 16:33  098-谢家豪  阅读(733)  评论(0编辑  收藏  举报