天天看點

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++)//給字元串數組p,q全部指派為'\0'

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

{

//非終結符放入數組VN中

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

}

//終結符放在數組VT中

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

}

//把規則右部分分離,放入數組q中

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;

//判斷是确定的還是非确定的有窮狀态自動機,并進行前半部分列印

//判斷依據:q數組中每一行字元串是否相同

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

//列印M後部分

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實驗三有限自動機的構造與識别