天天看点

1118实验三有限自动机的构造与识别

#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(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')

for(t=0;t<30&&(VT[t]!='\0');t++)

if(VT[t]==p[i][j])

flag=1;

break;

VT[m]=p[i][j];

m++;

}

count=0;

k=0;

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("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]);

//分离文法

j=4;

while(p[i][j]!='\0')

if(k<4)

q[count][k]=p[i][k];

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;

printf("\n");

//打印

printf("M:\n");

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++;

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");

}

1118实验三有限自动机的构造与识别