私は現在、大学で 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");
}
}
明らかに、コードは機能していませんが、これは演習の一般的な目的を示すために重要です。
誰かが私を助けることができますか?