zoukankan      html  css  js  c++  java
  • 1118有限自动机的构造与识别

    复制代码

      1 #include<string.h>
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 int main()
      5 {
      6     char p[30][30];
      7     char q[30][30];
      8     int line=0;
      9     int n;
     10     int i,j;
     11     int count=0;
     12     int k,t=0;
     13     int flag=0;
     14     int l,m=0;
     15     char VN[30]={'\0'};
     16     char VT[30]={'\0'};
     17     printf("请输入规则个数");
     18     scanf("%d",&n);
     19     line=n;
     20     for(i=0;i<30;i++)
     21     for(j=0;j<30;j++)
     22     {
     23         p[i][j]='\0';
     24         q[i][j]='\0';
     25     }
     26     printf("请输入文法:\n");
     27     for(i=0;i<line;i++)
     28     {
     29         scanf("%s",p[i]);
     30     }
     31     l=0;
     32     m=0;
     33     for(i=0;i<line;i++)
     34     {
     35         for(j=0;j<30&&(p[i][j]!='\0');j++)
     36         {
     37             if(p[i][j]<='z'&&p[i][j]>='a'||(p[i][j]<='9'&&p[i][j]>='0'))
     38             {
     39                 flag=0;
     40                 for(t=0;VN[t]!='\0';t++)
     41                 {
     42                     if(VN[t]==p[i][j])
     43                    {
     44                         flag=1;
     45                         break;
     46                    }
     47                 }
     48                 if(flag==0)
     49                 {
     50                     VN[l]=p[i][j];
     51                     l++;
     52                 }
     53             }
     54             if(p[i][j]<='Z'&&p[i][j]>='A')
     55             {
     56                 flag=0;
     57                 for(t=0;t<30&&(VT[t]!='\0');t++)
     58                 {
     59                     if(VT[t]==p[i][j])
     60                     {
     61                         flag=1;
     62                         break;
     63                     }
     64             }
     65             if(flag==0)
     66             {
     67                 VT[m]=p[i][j];
     68                 m++;
     69             }
     70         }
     71     }
     72 }
     73     count=0;
     74     k=0;
     75     for(i=0;i<line;i++)
     76     {
     77         for(j=4;j<30&&(p[i][j]!='\0');j++)
     78         {
     79             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'))
     80             {
     81                 q[count][k]=p[i][j];
     82                 k++;
     83             }
     84             else
     85             {
     86                 count++;
     87                 k=0;
     88             }
     89         }
     90         count++;
     91         k=0;
     92     }
     93     flag=0;
     94     for(i=0;i<count;i++)
     95     {
     96         for(j=i+1;j<count;j++)
     97         {
     98             if(strcmp(q[i],q[j])==0)
     99             {
    100                 flag=1;
    101                 break;
    102             }
    103         }
    104     }
    105     if(flag==1)
    106     {
    107         printf("是非确定的有穷状态自动机,即NFA\n\n");
    108         printf("构造的有穷状态自动机为:\n");
    109         printf("NFA N=(K,E(总和的意思),M,{S},{Z})\n");
    110     }
    111     else
    112     {
    113         printf("是确定的有穷状态自动机,即DFA\n\n\n");
    114         printf("构造的有穷状态自动机为:\n");
    115         printf("DFA N=(K,E(总和的意思),M,{S},{Z})\n");
    116     }
    117     printf("其中,\nK={S");
    118     for(i=0;i<30&&(VT!='\0');i++)
    119     {
    120         printf(",%c",VT[i]);
    121     }
    122     printf("}\n");
    123     printf("E={");
    124     for(i=0;i<30&&(VN[i]!='\0');i++)
    125     {
    126         printf("%c ",VN[i]);
    127     }
    128     printf("}\n");
    129     //分离文法
    130     k=0;
    131     count=0;
    132     for(i=0;i<line;i++)
    133     {
    134         j=4;
    135         while(p[i][j]!='\0')
    136         {
    137             if(k<4)
    138             {
    139                 q[count][k]=p[i][k];
    140                 k++;
    141             }
    142             else
    143             {
    144                 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'))
    145                 {
    146                     q[count][k]=p[i][j];
    147                     k++;
    148                     j++;
    149                 }
    150                 if(p[i][j]=='l')
    151                 {
    152                     count++;
    153                     k=0;
    154                     j++;
    155                 }
    156             }
    157         }
    158         count++;
    159         k=0;
    160     }
    161     printf("\n");
    162     //打印
    163     printf("M:\n");
    164     l=0;
    165     while(VN[l]!='\0')
    166     {
    167         printf("M(S,%c)={",VN[l]);
    168         for(i=0;i<30;i++)
    169         {
    170             for(j=4;j<30&&(q[i][j]!='\0');j++)
    171             {
    172                 if(VN[l]==q[i][j]&&(q[i][j+1]=='\0')&&(q[i][j-1]=='='))
    173                 printf("%c",q[i][0]);
    174             }
    175         }
    176         printf("}\t");
    177         l++;
    178     }
    179     printf("\n");
    180     l=0;
    181     k=0;
    182     while(VT[k]!='\0')
    183     {
    184         l=0;
    185         while(VN[l]!='\0')
    186         {
    187             printf("M(%c,%c)={",VT[k],VN[l]);
    188             for(i=0;i<30;i++)
    189             {
    190                 for(j=4;j<30&&(q[i][j]!='\0');j++)
    191                 {
    192                     if(VT[k]==q[i][j]&&VN[l]==q[i][j+1])
    193                     printf("%c",q[i][0]);
    194                 }
    195             }
    196             printf("}\t");
    197             l++;
    198         }
    199         k++;
    200         printf("\n");
    201     }
    202     system("pause");
    203 }
    204                                     
    复制代码
  • 相关阅读:
    74.Interesting Sequence(有趣的数列)(拓扑排序)
    CODEVS 1746 贪吃的九头龙
    NYOJ 110 剑客决斗
    CODEVS 2451 互不侵犯
    洛谷 P1896 互不侵犯King
    洛谷 P1066 2^k进制数
    洛谷 P1656 炸铁路
    洛谷 P1830 轰炸Ⅲ
    CODEVS 1051 接龙游戏
    POJ 3461 Oulipo
  • 原文地址:https://www.cnblogs.com/wenting/p/5040007.html
Copyright © 2011-2022 走看看