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                                     
复制代码

你可能感兴趣的:(1118有限自动机的构造与识别)