# Endlicher Automat



## Carlos Valderra (7. Jun 2012)

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', '.'}.
> 
> 
> ...



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.


```
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":


----------



## XHelp (7. Jun 2012)

Was soll die Zeile 10 denn auch sein?


----------



## SlaterB (7. Jun 2012)

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


----------



## Carlos Valderra (7. Jun 2012)

Das Problem ist, wenn ich Zeilen 10 und 11 streiche und in 18/20 stattdessen case '00' und case '01' schreibe, kommen noch mehr Fehlermeldungen.


----------



## XHelp (7. Jun 2012)

Weil das auch kein Sinn ergibt, weil 
	
	
	
	





```
'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


----------



## SlaterB (7. Jun 2012)

> 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


----------



## Final_Striker (7. Jun 2012)

[c]'00'[/c] ist kein [c]char[/c]


----------



## Carlos Valderra (8. Jun 2012)

XHelp hat gesagt.:


> 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




```
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.


```
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.

```
case'2':
        System.out.println("Folge gehört nicht zur Sprache");break;
```
Wenn die Folge mit '01' beginnt, soll sie nicht akzeptiert werden.

```
default:
        System.out.println("Folge gehört nicht zur Sprache");break;
```
Andere Eingabe, wie z.B. '2', sollen nicht akzeptiert werden.


----------



## XHelp (8. Jun 2012)

In den else Zweig kommst du gar nicht, weil JEDES Zeichen entweder 0 1 oder . ist


----------



## Carlos Valderra (8. Jun 2012)

XHelp hat gesagt.:


> In den else Zweig kommst du gar nicht, weil JEDES Zeichen entweder 0 1 oder . ist



Gibt es denn trotzdem noch eine Möglichkeit, die Aufgabe, wie gefordert, mit einem switch-Konstrukt zu lösen oder muss man das anders angehen?


----------



## XHelp (8. Jun 2012)

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.


----------



## Carlos Valderra (8. Jun 2012)

XHelp hat gesagt.:


> 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.



Was heist das konkret?


----------



## XHelp (8. Jun 2012)

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 (8. Jun 2012)

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.


```
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


----------



## Carlos Valderra (15. Jun 2012)

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


```
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!");
      }
   }
}
```


----------

