gpt4 book ai didi

java - 有限状态机程序无效输出

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:47 24 4
gpt4 key购买 nike

我正在开发一个项目,但我的代码无法运行,不知道为什么。给定测试程序和通用类,我需要一个满足以下逻辑正则表达式的程序:

L1:对于字母表 {a,b},包含奇数个 a 和恰好一个 b 的所有字符串。

测试输入:aabaaaa、aaabaaaa、aabaaaab、baaaaaa、aaaaabaa

它应该是什么:

aabaaaa错误

aaabaaaa 正确

aabaaaab 错误

baaaaaa假

aaaaabaa 正确

程序输出:(真,真,真,假,真)

我的测试程序:

import java.util.Scanner;

// Test Finite State Machine Class
public class TestFSML1
{
public static void main(String[] args){
String A = "ab";
int[][] ST = {{1,3,0},
{1,2,1},
{2,2,2},
{3,3,3}};
int[] AS = {0,0,1,0};
Scanner in = new Scanner(System.in);
String inString;
boolean accept1 = false;
FSM FSM1 = new FSM(A, ST, AS);

// Input string is command line parameter
System.out.println(" Input Accepted:");

for(int i=0;i<args.length;i++) {
inString = args[i];
accept1 = FSM1.validString(inString);

System.out.printf("%10s%13s\n",inString, accept1);
}
} // end main
} // end class

FSM 类

// Finite State Machine Class
public class FSM
{
// Instance variables
public String alphabet;
public int stateTrans[][];
public int acceptState[];
private int cstate;

// Constructor function

public FSM(String A, int[][] ST, int[] AS)
{
int NSYMBOLS = A.length();
int NSTATES = AS.length;
// Alphabet
alphabet = "" + A;
// State transition table
stateTrans = new int[NSTATES][NSYMBOLS];
for(int r = 0; r < NSTATES; r++)
for(int c = 0; c < NSYMBOLS; c++)
stateTrans[r][c] = ST[r][c];
// Accept states
acceptState = new int[NSTATES];
for(int r = 0; r < NSTATES; r++)
acceptState[r] = AS[r];
// Start state
cstate = 0;
}

// Methods

public int getState()
{
return cstate;
}

public void setState(int state)
{
cstate = state;
return;
}

public int nextState(char symbol)
{
int nstate = -1;
int col = alphabet.indexOf(symbol);
if(col >= 0)
nstate = stateTrans[cstate][col];
return nstate;
}

public boolean accept(int state)
{
if(state < 0)
return false;
return (acceptState[state] != 0);
}

public boolean validString(String word)
{
cstate = 0;
for(int k = 0; k < word.length(); k++){
cstate = nextState(word.charAt(k));
System.out.print(cstate);
System.out.println(" " + word.charAt(k));
if(cstate < 0)
return false;
}
return accept(cstate);
}


} // end class

谢谢!

最佳答案

这是我输入的一个简单方法,用于执行您想要的任务。

public static boolean validWord(String s) {

int aCounter = 0;
int bCounter = 0;
char c;

for (int i = 0; i < s.length(); i++) {

c = s.charAt(i);

if ((int) c == (int) 'a') {

aCounter++;
} else {

bCounter++;
}
}

return (aCounter % 2 == 1 && bCounter == 1);
}

我很难理解你是如何实现你的方法的,我认为它可以更简单。我确信您包含在 FSM 类中的实例变量还有其他用途,但您实际上并不需要它们中的任何一个来分析字符串。只需使用这样的东西,它应该很容易集成到您的代码中,因为它只需要字符串。希望这有帮助!

关于java - 有限状态机程序无效输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com