有限状态机程序无效输出

nfg76nw0  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(487)

我正在做一个项目,我的代码不工作不知道为什么。给定测试程序和通用类,我需要一个满足以下逻辑正则表达式的程序:
l1:对于字母表{a,b},所有包含奇数个a和一个b的字符串。
测试输入:AAAAAAA,AAAAAAA,AAAAAAAB,AAAAA,AAAAA
应该是什么:
AAAAA错误
AAAAAAA真的
aabaaab假
Baaaaa假
AAAAAA真的
程序输出:(真、真、真、假、真)
我的测试程序:

  1. import java.util.Scanner;
  2. // Test Finite State Machine Class
  3. public class TestFSML1
  4. {
  5. public static void main(String[] args){
  6. String A = "ab";
  7. int[][] ST = {{1,3,0},
  8. {1,2,1},
  9. {2,2,2},
  10. {3,3,3}};
  11. int[] AS = {0,0,1,0};
  12. Scanner in = new Scanner(System.in);
  13. String inString;
  14. boolean accept1 = false;
  15. FSM FSM1 = new FSM(A, ST, AS);
  16. // Input string is command line parameter
  17. System.out.println(" Input Accepted:");
  18. for(int i=0;i<args.length;i++) {
  19. inString = args[i];
  20. accept1 = FSM1.validString(inString);
  21. System.out.printf("%10s%13s\n",inString, accept1);
  22. }
  23. } // end main
  24. } // end class

fsm类

  1. // Finite State Machine Class
  2. public class FSM
  3. {
  4. // Instance variables
  5. public String alphabet;
  6. public int stateTrans[][];
  7. public int acceptState[];
  8. private int cstate;
  9. // Constructor function
  10. public FSM(String A, int[][] ST, int[] AS)
  11. {
  12. int NSYMBOLS = A.length();
  13. int NSTATES = AS.length;
  14. // Alphabet
  15. alphabet = "" + A;
  16. // State transition table
  17. stateTrans = new int[NSTATES][NSYMBOLS];
  18. for(int r = 0; r < NSTATES; r++)
  19. for(int c = 0; c < NSYMBOLS; c++)
  20. stateTrans[r][c] = ST[r][c];
  21. // Accept states
  22. acceptState = new int[NSTATES];
  23. for(int r = 0; r < NSTATES; r++)
  24. acceptState[r] = AS[r];
  25. // Start state
  26. cstate = 0;
  27. }
  28. // Methods
  29. public int getState()
  30. {
  31. return cstate;
  32. }
  33. public void setState(int state)
  34. {
  35. cstate = state;
  36. return;
  37. }
  38. public int nextState(char symbol)
  39. {
  40. int nstate = -1;
  41. int col = alphabet.indexOf(symbol);
  42. if(col >= 0)
  43. nstate = stateTrans[cstate][col];
  44. return nstate;
  45. }
  46. public boolean accept(int state)
  47. {
  48. if(state < 0)
  49. return false;
  50. return (acceptState[state] != 0);
  51. }
  52. public boolean validString(String word)
  53. {
  54. cstate = 0;
  55. for(int k = 0; k < word.length(); k++){
  56. cstate = nextState(word.charAt(k));
  57. System.out.print(cstate);
  58. System.out.println(" " + word.charAt(k));
  59. if(cstate < 0)
  60. return false;
  61. }
  62. return accept(cstate);
  63. }
  64. } // end class

谢谢!

kb5ga3dv

kb5ga3dv1#

这里有一个简单的方法,我键入了执行您想要的任务。

  1. public static boolean validWord(String s) {
  2. int aCounter = 0;
  3. int bCounter = 0;
  4. char c;
  5. for (int i = 0; i < s.length(); i++) {
  6. c = s.charAt(i);
  7. if ((int) c == (int) 'a') {
  8. aCounter++;
  9. } else {
  10. bCounter++;
  11. }
  12. }
  13. return (aCounter % 2 == 1 && bCounter == 1);
  14. }

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

展开查看全部

相关问题