Endlicher Automat

Folgende Aufgabe
Gegeben sei folgender endlicher Automat. Der Startzustand ist S, die Endzuständen sind A, B,
C und die Symbole der Sprache sind {'0', '1', '.'}.

zwischen.jpg



Schreiben Sie ein Java-Programm namens Automat.java, welches als Eingabe eine Zeichenfolgen
erhält, die das Programm auf Zugehörigkeit zu der durch den Automaten
repräsentierten Sprache überprüft. Gehört die Zeichenfolge zur Sprache, soll eine entsprechende
Meldung ausgegeben werden. Gleiches gilt für Eingaben, die nicht zur Sprache
gehören.
Verwenden Sie bei der Implementierung für die Fallunterscheidung ein switch-Konstrukt.

Soweit bin ich mit dem Quellcode: Zur Erklärung: Ich möchte, dass wenn eine Zeichenfolge mit '00' oder '01' beginnt, dass dann "Folge gehört nicht zur Sprache" ausgegeben wird.

Java:
import IOulm.*;

public class Automat {
public static void main(String[] args) {
		char ch = ' ';
		
		
		while (Urc.readChar()) {
         ch = Urc.getChar();
		 case'1' = "00":
		 case'2' = "01":
            
		if ((ch=='0') ||(ch=='1') ||(ch=='.'))
		System.out.println("Folge gehört zur Sprache");
		
		else
		switch (ch) {
		case'1':
		System.out.println("Folge gehört nicht zur Sprache");break;
		case'2':
		System.out.println("Folge gehört nicht zur Sprache");break;
		default:
		System.out.println("Folge gehört nicht zur Sprache");break;
		}
		}
		}
		}

Es kommt folgende Fehlermeldung:
Automat.java:10: orphaned case
case'1' = "00":
 
S

SlaterB

Gast
wie an Zeile 17 und 18 zu sehen, gehört ein case zu einem switch,
und wie sieht es in Zeile 10 aus?
 

XHelp

Top Contributor
Weil das auch kein Sinn ergibt, weil
Code:
'00'
ungültig ist, das soll ein einziges Zeichen.

Ich kann auch so in deinem Programm kein System erkennen, so dass es nicht wirklich nachvollziehbar ist, was du versuchst bzw. wie das denn funktionieren sollte
 
S

SlaterB

Gast
> kommen noch mehr Fehlermeldungen.
zurecht, solange du falsche Dinge machst, ein char ist halt nur ein char, kein Doppelchar

ein durchgebrannter Herd ist keine Erlaubnis, ein Lagerfeuer im Wohnzimmer zu machen
 
Ich kann auch so in deinem Programm kein System erkennen, so dass es nicht wirklich nachvollziehbar ist, was du versuchst bzw. wie das denn funktionieren sollte

Java:
if ((ch=='0') ||(ch=='1') ||(ch=='.'))
        System.out.println("Folge gehört zur Sprache");

Wenn die eingegebene Folge aus '0' und/oder '1' und/oder '.' besteht, soll sie akzeptiert werden.

Java:
  else
        switch (ch) {
        case'1':
        System.out.println("Folge gehört nicht zur Sprache");break;

Wenn die Folge mit '00' beginnt, soll sie nicht akzeptiert werden.
Java:
case'2':
        System.out.println("Folge gehört nicht zur Sprache");break;
Wenn die Folge mit '01' beginnt, soll sie nicht akzeptiert werden.
Java:
  default:
        System.out.println("Folge gehört nicht zur Sprache");break;
Andere Eingabe, wie z.B. '2', sollen nicht akzeptiert werden.
 

XHelp

Top Contributor
Doch, mit einem switch kannst du schon was anfangen, aber ich würde an deiner Stelle mit switch den Zustand auswerten und nicht das Zeichen.
 

XHelp

Top Contributor
Konkret heißt es, dass du dein Programm umbauen sollst, sodass da noch ein Zustand beachtet werden muss. Und je nach Zustand und Zeichen dann, gemäß deinem DFA, den Übergang vornehmen
 

SimonMo

Neues Mitglied
Hi,

Also du könntest sowas machen. Machst ein Switch für den Status indem du dich befindest und ein anderen für das aktuelle Zeichen. Könntest für den Status noch ein enum bauen oder es auch ganz anders aufbauen. Soll dir nur mal zeigen, wie die Switchies funktionieren. Habs auch net getestet oder überhaupt kompiliert. Nur mal so als Anregung.

Java:
StringBuffer strBuf=new StringBuffer(Urc); //Wo dieses Urc bei dir auch immer herkommen mag
char aktChar;
char state='s';

while((strBuf.length()>0)&&(state!='f') //f fuer Fehler
{
  aktChar=strBuf.getChatAt(0);
  strBuf.deleteCharAt(0);

  switch(state)
  {
    case 's':
      switch(aktChar)
      {
        case '0':
          state='b';break;
        case '1':
          state='a';break;
        default:
          state='f';
      }
      break;
    case 'a':
      switch(aktChar)
      {
        case '0':
        case '1':
          state='a';break;
        case '.':
          state='c';break;
        default:
          state='f';
      }
      break;
    case 'c':
      switch(aktChar)
      {
        case '0':
        case '1':
          state='c';break;
        default:
          state='f';
      }
      break;
    case 'b':
      switch(aktChar)
      {
        case '.':
          state='c';break;
        default:
          state='f';
      }
      break;
  }
}
if(state=='f')
{
  System.out.println("Gehört nicht zur Sprache");
}else{
  System.out.println("Gehört zur Sprache");
}

Gruß Simon
 
Danke für eure Hilfe, hier übrigens die Lösung:

Java:
import IOulm.*;

public class Automat{
   public static void main(String[] args) {
      char c = ' ';
      boolean belongsTo = true;
      char zustand = 'S';

      while (Urc.readChar() && belongsTo) {
         c = Urc.getChar();

         //Newline wegen Einleseende extra behandeln
         if (c == '\n') {
            break;
         }

         switch (zustand) {
            case ('S'):
	       if (c == '0') {
	          zustand = 'B';
	       } else if (c == '1') {
	          zustand = 'A';
	       } else {
	          belongsTo = false;
	       }
	       break;
	    case ('A'):
	       if (c == '.') {
	          zustand = 'C';
	       } else if ((c != '0') && (c != '1')) {
	          belongsTo = false;
	       }
	       break;
	    case ('B'):
	       if (c == '.') {
	          zustand = 'C';
	       } else {
	          belongsTo = false;
	       }
	       break;
	    case ('C'):
	       if ((c != '0') && (c != '1')) {
	          belongsTo = false;
	       }
	       break;
	    default:
	       System.err.println("undefinierter Zustand");
	       System.out.println("Wort gehoert nicht zur Sprache!");
	       System.exit(1);
         }
      }
   
      if (belongsTo &&
        ((zustand == 'A') || (zustand == 'B') || (zustand == 'C'))) {
         System.out.println("Wort gehoert zur Sprache!");
      } else {
         System.out.println("Wort gehoert nicht zur Sprache!");
      }
   }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Deterministischer endlicher Automat Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben