【发布时间】:2014-08-05 14:55:40
【问题描述】:
我的程序应该为二进制字符串实现 dfa...dfa 是一台机器,一次只能处于一个状态(当你输入一个字符串时,机器应该使用它,并且在最后一步它应该到达最终状态。如果是这样,我们说这个字符串被机器接受了)...... 这台机器是这样工作的:
首先程序询问状态数,如果你考虑我的图片,你会看到它有 3 个状态(q0,q1,q2)所以我们输入 3。然后它询问输入的数量。我的输入是 0,1 所以我输入 2... 然后它要求输入输入,我们输入 0 然后 1!然后它询问最终状态的数量,这里的最终状态只有 q1...所以我们输入它...然后您会看到: (q0,0) = q 这意味着 q0 进入 0 的哪个状态...例如,这里 q0 以 0 转到 q0 ...其他人就是这样。填写完这部分后,我们输入sring,它会说字符串是否有效
代码如下:
#include<stdio.h>
#include<conio.h>
int ninputs;
int check(char,int ); //function declaration
int dfa[10][10];
char c[10], string[10];
int main()
{
int nstates, nfinals;
int f[10];
int i,j,s=0,final=0;
printf("enter the number of states that your dfa consist of \n");
scanf("%d",&nstates); // 3
printf("enter the number of input symbol that dfa have \n");
scanf("%d",&ninputs); // 2
printf("\nenter input symbols\t");
for(i=0; i<ninputs; i++)
{
printf("\n\n %d input\t", i+1);
printf("%c",c[i]=getch()); // 01
}
printf("\n\nenter number of final states\t");
scanf("%d",&nfinals); // 1
for(i=0;i<nfinals;i++)
{
printf("\n\nFinal state %d : q",i+1);
scanf("%d",&f[i]); // 1
}
printf("-----------------------------------------------------------------------");
printf("\n\ndefine transition rule as (initial state, input symbol ) = final state\n");
for(i=0; i<ninputs; i++)
{
for(j=0; j<nstates; j++)
{
printf("\n(q%d , %c ) = q",j,c[i]);
scanf("%d",&dfa[i][j]);
// q(0,0)=0
// q(1,0)=0
// q(2,0)=2
// q(0,1)=1
// q(1,1)=2
// q(2,1)=1
}
}
do
{
i=0;
printf("\n\nEnter Input String.. ");
scanf("%s",string); // 01
while(string[i]!='\0')
{
if((s=check(string[i++],s))<0)
break;
for(i=0 ;i<nfinals ;i++)
{
if(f[i] ==s )
final=1;
if(final==1)
printf("\n valid string");
else
printf("invalid string");
getch();
printf("\nDo you want to continue.? \n(y/n) ");
}
}
}
while(getch()=='y');
getch();
}
int check(char b,int d)
{
int j;
for(j=0; j<ninputs; j++)
if(b==c[j])
return(dfa[d][j]);
return -1;
}
问题是当我输入我的字符串时,程序说它是无效的,但是它应该被机器接受......例如考虑照片中的机器并在上面测试这个字符串:01
那么代码有什么问题?
【问题讨论】:
-
你能举一个你在程序中输入的数据给出错误结果的例子吗?
-
我举了一个例子:3个状态,q1是final,字符串是01
-
是的,但是如何在程序中输入?
-
首先程序询问状态数,如果你考虑我的图片,你会看到它有 3 个状态(q0,q1,q2)所以我们输入 3。然后它询问输入的数量.我的输入是 0,1 所以我输入 2... 然后它要求输入我们输入 0 然后 1 的输入!然后它询问最终状态的数量,这里的最终状态只有 q1...所以我们输入它...然后您会看到: (q0,0) = q 这意味着 q0 进入 0 的哪个状态...例如,这里 q0 以 0 转到 q0 ...其他人就是这样。填写完这部分后,我们输入sring,它会说字符串是否有效
-
@LittleGirl 你确定这必须在
c++标签而不是c标签中吗?
标签: c visual-studio-2012 dfa