Я сейчас учусь в своем университете, на автоматах DFA и NFA, и на том, как реализовать некоторые из них с использованием кода Java.
У меня возникли некоторые проблемы с этим упражнением: у нас 4 различных лабораторных хода(T1, T2, T3 и T4), и нам нужно написать код, чтобы распознать, соответствует ли конкретная строка (состоящая из номера студенческого номера университета и его имени, например, 123321Johnson
) T2 или T3.
Мы знаем, что:
- T1 - ход тех, у кого есть нечетный номер значка и фамилия между «A» и «K»
- T2 - этоповорот четных номеров и фамилий между «A» и «K»
- T3 - поворот нечетных номеров и фамилий между «L» и «Z»
- T4 - поворотчетные номера и фамилии между «L» и «Z»
Мы также знаем, что строка должна состоять как минимум из одного числа и хотя бы из одной буквы.
Напримеравтомат должен принимать "1232324Gac"
или "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");
}
}
Очевидно, код не работает, но важно показать общую цель упражнения.
Может ли кто-нибудь мне помочь?