实验三 有穷自动机
一、实验目标
1、掌握有穷状态自动机的概念;
2、掌握有穷状态自动机的存储及表示方法;
3、掌握有穷状态自动机与正则式之间的关系。
二、实验要求
1、输入正规式;
2、构造该正规式的有穷状态自动机;
3. 以五元组形式输出。
三、算法
参见教材的转换规则。
练习:
² (a|b)*abb
² l(l|d)*
² 1(1010*|1(010)*1)*0
四、完成算法设计、编码和调试工作,完成实验报告
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char p[30][30]; char q[30][30]; int line=0; int n; inti,j; int count=0; intk,t=0; int flag=0; intl,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<