public class Dea {
/*
* Definition Deterministischer endlicher Automat
* Zustaende: [Z0, Z1, Z2, Z3, Z4]
* Startzustand: Z1
* Endzustände: [Z3]
* Eingabezeichen: [O, -, 4, i]
* (Zustand,Zeichen) -> Folgezustand;...
* (Z0,O)->Z3; (Z0,-)->Z2; (Z0,4)-> Z2; (Z0,i)->Z0;
* (Z1,O)->Z2; (Z1,-)->Z0; (Z1,4)-> Z1; (Z1,i)->Z4;
* (Z2,O)->Z2; (Z2,-)->Z3; (Z2,4)-> Z2; (Z2,i)->Z4;
* (Z3,O)->Z3; (Z3,-)->Z3; (Z3,4)-> Z3; (Z3,i)->Z3;
* (Z4,O)->Z0; (Z4,-)->Z4; (Z4,4)-> Z4; (Z4,i)->Z3;
* Eingabeworte (4 Zeichen): [iOOO, iOi4, OOOiO, 4O-4, O-O-, 4iO4]
* Der Automat arbeitet der Reihe nach die Buchstaben eines Wortes ab und wechselt abhängig vom Buchstaben den Zustand.
* Dies geschieht so lange, bis das Restwort leer ist.
* Ist der Automat dann in einem Endzustand (es muss genau einen Startzustand geben, kann aber mehrere Endzustände geben), gehört das Wort zu der Sprache.
*/
private static final char INPUT_CHAR_O = 'O';
private static final char INPUT_CHAR = '-';
private static final char INPUT_CHAR_4 = '4';
private static final char INPUT_CHAR_i = 'i';
public static void main(String[] args){
String [] entryValues = new String[] {"iOOO", "iOi4", "OOiO", "4O-4", "O-O-", "4iO4"};
for (String string : entryValues) {
if(isEntryValid(string)) {
perfomAction(string);
}
}
}
/**
* Method to check if all characters are valid
* @param entryValues
* @return
*/
private static boolean isEntryValid(String string) {
if(string == null) {
System.out.println("Variable string ist \"null\"");
return false;
}
if(string.length() < 4) {
System.out.println("Fehler: \"" + string + "\" ist keine gueltige Eingabe!");
System.out.println("Min 4 Zeichen duerfen eingegeben werden!");
return false;
}
if(string.length() > 4) {
System.out.println("Fehler: \"" + string + "\" ist keine gueltige Eingabe!");
System.out.println("Max 4 Zeichen duerfen eingegeben werden!");
return false;
}
for(char c : string.toCharArray()) {
if(c != INPUT_CHAR_O && c != INPUT_CHAR && c != INPUT_CHAR_4 && c != INPUT_CHAR_i) {
System.out.println("Fehler: \"" + string + "\" ist keine gueltige Eingabe!");
System.out.println("Erlaubt sind nur folgende Zeichen: " + INPUT_CHAR_O + ", " + INPUT_CHAR + ", " + INPUT_CHAR_4 + " oder " + INPUT_CHAR_i);
return false;
}
}
return true;
}
private static void perfomAction(String string) {
char[] chars = string.toCharArray();
int zustand = 1;
for(char c : chars) {
if(c == INPUT_CHAR_O) {
switch (zustand) {
case 0:
zustand = 3;
break;
case 1:
zustand = 2;
break;
case 2:
zustand = 2;
break;
case 3:
zustand = 3;
break;
case 4:
zustand = 0;
break;
}
}
else if(c == INPUT_CHAR) {
switch (zustand) {
case 0:
zustand = 2;
break;
case 1:
zustand = 0;
break;
case 2:
zustand = 3;
break;
case 3:
zustand = 3;
break;
case 4:
zustand = 4;
break;
}
}
else if(c == INPUT_CHAR_4) {
switch (zustand) {
case 0:
zustand = 2;
break;
case 1:
zustand = 1;
break;
case 2:
zustand = 2;
break;
case 3:
zustand = 3;
break;
case 4:
zustand = 4;
break;
}
}
else if(c == INPUT_CHAR_i) {
switch (zustand) {
case 0:
zustand = 0;
break;
case 1:
zustand = 4;
break;
case 2:
zustand = 4;
break;
case 3:
zustand = 3;
break;
case 4:
zustand = 3;
break;
}
}
}
System.out.println("Endzustand: " + zustand + "");
if(zustand == 3)
System.out.println("Das Word: \"" + string + "\" ist gueltig!");
else
System.out.println("Das Word: \"" + string + "\" ist nicht gueltig!");
}
}