2

私は現在、大学で DFA および NFA オートマトンと、Java コードを使用してそれらのいくつかを実装する方法を研究しています。

この演習で問題が発生しました: 4 つの異なる実験ターン (T1、T2、T3、および T4) があり、特定の文字列 (学生の大学バッジ番号と彼の名前、たとえば123321Johnson) は T2 または T3 に対応します。

私達はことを知っています:

  • T1は「A」と「K」の間のバッジ番号と姓が奇数の人の番です
  • T2は、「A」と「K」の間の偶数のバッジ番号と姓の番です
  • T3 は、「L」と「Z」の間の奇数のバッジ番号と姓の番です。
  • T4 は、「L」と「Z」の間の偶数のバッジ番号と姓の番です。

また、文字列が少なくとも 1 つの数字と少なくとも 1 つの文字で構成されている必要があることもわかっています。

たとえば、オートマトンは or を受け入れる"1232324Gac"必要がありますが、 orは受け入れ"1232323Lum"ません。"121234Lum""121233Gac"

私が書いたコードは次のとおりです。

import java.util.Scanner;

public class Es3 {

    static Scanner sc = new Scanner(System.in);
    String s = sc.next();
    public static boolean scan(String s)
    {
        int state = 0;                      
        int i = 0;                              

        while (state >= 0 && i < s.length()) {
            final char ch = s.charAt(i++);
            switch (state) {
            case 0:
                if (ch >= 0 && ch <= 9)
                    state = 1;
                else
                    state = -1;
                break;

            case 1:
                if (ch >=0 && ch <=9)
                    state = 1;
                else if (ch >='a' && ch <='k')
                    if ((s.charAt(i--))%2==0)
                        state = 2;
                    else
                        state = -1;
                else if (ch >='l' && ch <='z')
                    if ((s.charAt(i--))%2==1)
                        state = 3;
                    else
                        state = -1;
                else
                    state = -1;
                break;

            case 2:
                if (ch >='a' && ch <='z')
                    state = 2;
                else
                    state = -1;
                break;

            case 3:
                if (ch >='a' && ch <='z')
                    state = 3;
                else 
                    state = -1;
                break;
            }
        }
        return (state == 2 || state == 3);      
    }

    public static void main(String[] args)
    {
        System.out.println(scan(args[0]) ? "OK" : "NO");
    }
}

明らかに、コードは機能していませんが、これは演習の一般的な目的を示すために重要です。

誰かが私を助けることができますか?

4

1 に答える 1