1118 实验三 有限自动机的构造与识别
2015-12-11 17:27
92 查看
#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"); }
相关文章推荐
- iOS 9 平台上 AFNetworking 框架 3.0 版本解决的问题和问题解决
- C语言合法标识
- windows下 zookeeper dubbo 安装+配置+demo 详细图文教程
- Category和Extension
- Win7系统双击Adminiatrator帐户提示“读取错误,工作站服务没有启动”的解决方法
- 字符编码笔记:ASCII,Unicode和UTF-8
- 2015年12月11日 继续二开 ECtouch (手机站)
- 不要使用sun.misc.BASE64Encoder
- fragment之添加回退栈
- socket编程 —— 非阻塞socket
- socket编程——一个简单的例子
- animation 动画的定义和使用
- 欢迎使用CSDN-markdown编辑器
- java代码重用的一点思考
- 动态加载js和css
- golang的ssh例子
- 数据库的整理
- Android中Activity的初步接触(一)
- C++ vector 经常用到的小知识
- oracle JOB常见的执行时间