Morse Code mit endlicher Automat

liam

Mitglied
Hi,

ich soll ein Programm schreiben das als endlicher Automat Morsezeichen in normale Buchstaben umwandelt, nur habe ich keine Ahnung wie ich das anstellen soll.
Habe es erstmal grob auf meine Art gemacht (etwas unschön aber geht :) )
Wie könnte ich das umbauen das es so ein Automat wird? Oder wie gehe ich es am besten an?
Hier mal mein Code bis jetzt:

Code:
 public class MorseCode {
	  public static void main(String argv[]) 
	  {
		 char[] arrZeichenkette = IO.readChars("Bitte eine Morse Code Zeichenfolge"+
			"eingeben: ");
		 String sZeichen = "";
		 // durch die Zeichenkette iterieren
		 for (int i = 0;i < arrZeichenkette.length; i++)
		 {
			if (arrZeichenkette[i] != ' ')
			{
			   sZeichen = sZeichen+arrZeichenkette[i];
			}
			else
			{
			   Ausgabe(sZeichen); 
			   sZeichen = ""; 
			}
		 }
		 Ausgabe(sZeichen);
	  }
	  static void Ausgabe(String zeichen)
	  {
		 if (zeichen.length() == 0)
		 {
			IO.print(" ");
		 }
		 else if (zeichen.equals(" ")) IO.print(" ");
		 else
		 {
			IO.print(Vergleiche(zeichen)); 
		 }
	  }
	  static String Vergleiche(String zeichen)
	  {
		 String buchstabe = "";
		 if (zeichen.equals(".-")) buchstabe = "a";
		 else if (zeichen.equals("-...")) buchstabe = "b";
		 else if (zeichen.equals("-.-.")) buchstabe = "c";
		 ................
		 else buchstabe = "Zeichn ungueltig";
		 return buchstabe;
	  }
   }
 
Hi schau mal hier:

Code:
class Morse{
	int[][] states;
	final int endstate = 27;
	final int nullstate = 28;
	
	//Konstruktor baut den Zusatndsautomaten anhand des Morsecodebaums auf 
	//mit Folgezustaenden 
	//nullstate symbolisiert platzhalter
	Morse(){
		states = new int[][]{
			{20,5, nullstate},			//startzustand
			{23,18,endstate},			//A
			{nullstate, nullstate, endstate},	//B
			{nullstate, nullstate, endstate},	//C
			{24, 2, endstate},			//D
			{1, 9, endstate},			//E
			{nullstate, nullstate, endstate},	//F
			{17, 26, endstate},			//G
			{nullstate, nullstate, endstate},	//H
			{21, 19, endstate},			//I
			{nullstate, nullstate, endstate},	//J
			{25, 3, endstate},			//K
			{nullstate, nullstate, endstate},	//L
			{15, 7, endstate},			//M
			{11, 4, endstate},			//N
			{nullstate, nullstate, endstate},	//O
			{nullstate, nullstate, endstate},	//P
			{nullstate, nullstate, endstate},	//Q
			{nullstate, 12, endstate},		//R
			{22, 8, endstate},			//S
			{13, 14, endstate},			//T
			{nullstate, 6, endstate},		//U
			{nullstate, nullstate, endstate},	//V
			{10, 16, endstate},			//W
			{nullstate, nullstate, endstate},	//X
			{nullstate, nullstate, endstate},	//Y
			{nullstate, nullstate, endstate},	//Z
			{20, 5, nullstate}			//endzustand
		};
	}
	
	//Zustandsuebergangsfunktion delta
	//Aktueller Zustand x Eingabezeichem -> Neuer Zustand [x Ausgabe]
	int delta(int state, int sigma){
		if(state != nullstate){
			int ret = states[state][sigma];
			if(ret == endstate)
				System.out.println((char)(state + 64));
			return states[state][sigma];
		}
		return nullstate;
	}
	
	int getEndState(){
		return endstate;
	}
	
	public static void main(String[] args){
		int current_state = 0;
		Morse machine = new Morse();
		if(args.length != 1){
			System.out.println("Usage: java Morse code");
			System.exit(1);
		}
		for(int i = 0; i < args[0].length(); i++){
			switch(args[0].charAt(i)){
				case '-': current_state =  machine.delta(current_state, 0); break;
				case '.': current_state =  machine.delta(current_state, 1); break;
				case ' ': current_state =  machine.delta(current_state, 2); break;
			}
		}
		if(current_state != machine.getEndState())
			System.out.println("Your code was not accepted by the finite state machine, theres a syntax error in your code");
	}
}


Aufrufen kannst dus so:
Code:
java Morse "... --- ... "
musst nur drauf achten das jeder Buchstabe mit einem Leerzeichen
abschließt...

//edit: Hab es mal noch etwas "robuster" gestaltet...
Übrigens die prinzipielle Vorgehensweise sieht ungefähr so aus:
1.) Zeichne dir anhand des Morsecodebaums die Zustände auf die du
brauchst.
2.) Trage die Zustandsübergaenge ein
3.) Bilde jeden einzelnen Zustand und seine Nachfolger in Software ab
4.) Implementiere die Zustandsübergangsfunktion

Gruß

RedWing
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück