您的位置:首页 > 其它

有限自动机的构造与识别

2015-12-30 16:51 127 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: