1118有限自动机的构造与识别
2015-12-11 18:01
441 查看
#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"); }
总结:开始对自动机还没有理解透,所以写递归时有不少困难,后来通过熟悉自动机和借鉴同学的来解决,总体还是有不少收获的。
相关文章推荐
- Eclipse - JAR包制作细节
- Preparing Olympiad---cf550B(DFS或者状态压缩模板)
- 创建纯css下拉菜单
- Java 多线程(六) synchronized关键字详解(牛叉)
- mysql常用字符串操作函数大全,以及实例
- git实践题目
- 深入理解 AngularJS 的 Scope
- Oracle 12c 数据库的本地连接和远程连接
- AndroidM 振动器系统
- 基于暗通道去雾算法的实现与优化(二)opencv在pc上的实现
- 马云如何识人带人
- excel常用函数及功能操作
- 哈希表的综合应用(创建、处理冲突、查找成功和失败的次数)
- 蓝桥杯——数列特征,字母图形 , 01字串 ,闰年判断
- 主备同步
- Hive 设置map 和 reduce 的个数
- OC如何读取本地文件和网络文件
- 手动编译Jsp文件
- 计算比例
- JS横向轮播