URL: https://www.overclockers.at/coding-stuff/endlicher-automat_244514/page_2 - zur Vollversion wechseln!
Also meine DFSM kommt mit vier States aus. Dadurch koenntest du dein Programm stark vereinfachen.
// es reichen sogar drei States. Du kannst p3 entfernen, p1 zu deinem Finite State machen und von p2 zu p1 traversieren, wenn wieder 0-9 kommt..
Aber ich muss auch ein Vorzeichen einsetzten können, also z.B. +3,345 oder -33,123 oder 5678,1. Dann brauche ich doch auch den Zustand Vorzeichen?!
Muss ich nun meine Zustände erstmal alle am Anfang initialisieren damit ich mit dem Vergleich anfangen kann? Und wie kann ich die Werte einzeln aus dem Eingabearray und meinem Zustandsarray vergleichen? Ein ganz kleines Beispiel wäre für mich sehr hilfreich, stehe total auf dem Schlauch...
Ich verzweifel gerade total. Kann ich so anfangen:
Code:int[][] Zustaende = { {1,4,2},//1. Spalte = V, 2. Spalte = K, 3. Spalte = Z {4,4,2}, {2,3,2}, {4,4,5}, {4,4,4}, {4,4,5} } int s = 0; char[] zeile; char c; zeile = IO.readChars( "Bitte geben Sie eine Kommazahl ein: "); int i; c = zeile [i]; for( i = 0; i < zeile.length; i++){ c = zeile[i]; if( c == '+' || '-' ){ } }
Ich habe mir nochmals eine neue Tabelle erstellt um es zu minimieren.
Wie kann ich nun die eigebenen Zeichen einzeln vergleichen?
@Obermotz: Wie SeVen schon gesagt hat, fehlt bei dir das Vorzeichen. Und das weglassen von p3 wird nicht funktionieren, weil der Automat dann beliebig viele Kommazeichen akzeptieren würde. Und bei p3 fehlt noch eine Schleife mit 0-9, sonst kann die Zahl nur eine Nachkommastelle haben.
@SeVen: Die neue Tabelle schaut gut aus, so hab ichs auch.
Zu deinem letzten Code: die Zeile "c = zeile [i];" direkt vor der for-Schleife macht so keinen Sinn, vor allem weil die Variable i nicht initialisiert wurde. Was du im Endeffekt machen musst (ohne Zustandsarray und nur mit einer Variable): Mach eine Variable zustand die du vor der Schleife mit 0 initialisierst. Und eine int Variable eingabe die du ebenfalls mit 0 initialisierst. Die beiden Variablen wirst du verwenden um auf deine Übergangstabelle zuzugreifen.
In der Schleife holst du dir zuerst das aktuelle Zeichen, das machst du eh schon. Dann kommt dein if-else-Konstrukt wo du abfragst um welches Zeichen es sich handelt. Je nachdem um welche Art von Zeichen es sich handelt, weist du der Variable eingabe einen anderen Wert zu (Vorzeichen = 0, Komma = 1, Zahl = 2).
Und jetzt musst du die Variable zustand nur noch mit dem neuen Zustand aus der Übergangstabelle initialisieren. Den richtigen Wert bekommst du dabei durch die beiden Variablen zustand und eingabe, die zu diesem Zeitpunkt ja schon richtig initialisiert sind.
Danach geht die Schleife weiter. Nach dem Durchlaufen der gesamten Schleife überprüfst du dann ob die Variable zustand den Wert eines Endzustands hat.
Das klingt schon sehr gut!
Ich habe nun folgendes:
Code:char[] zeile; zeile = IO.readChars( "Bitte geben Sie eine Kommazahl ein: "); int i; int Zustand = 0; int Eingabe = 0; for( i = 0; i < zeile.length; i++){ if( zeile [i] == '+' || '-' ){ Eingabe = 0; } else if( zeile[i] == ',' ){ Eingabe = 1; } else if( zeile[i] >= 48 && zeile[i] <= 57 ){ Eingabe = 2; } else{ IO.println( "Die Eingabe ist ungueltig!"); } Zustand =
ok, da schau dir an wie man auf (mehrdimensionale) arrays zugreift, is jetzt nicht so schwerZitat von SeVenWie kann ich denn nun die Variable Zustand mit dem neuen Zustand aus der Übergangstabelle initialisieren?
kann ich dann ein Variable char c initialisieren und dann dann schreiben:
c = zeile[i];
und damit c == '+' || '-' ?
nachfolgender ausdruck wird wohl sein was du meinst:
(zeile[i] == '+') || (zeile[i] == '-')
bei logikausdrücken gibt es klammerregeln und priorisierte operationen vergleichbar zu mathematischen ausdrücken (*/ vor +- usw.). schau dir das am besten mal an. braucht man immer bei komplexeren bedingungen.
Darf ich fragen, wo man Automatentheorie lernt, ohne vorher Soft1 zu machen?
@tinker: Man kennt, dass ich schon ein paar Bier intus hatte gestern
Code:int[][] Zustaende = { {1,4,2},//1. Spalte = V, 2. Spalte = K, 3. Spalte = Z {4,4,2}, {2,3,2}, {4,4,5}, {4,4,4}, {4,4,5} } char[] zeile; zeile = IO.readChars( "Bitte geben Sie eine Kommazahl ein: "); int i; int Zustand = 0; int Eingabe = 0; for( i = 0; i < zeile.length; i++){ if(( zeile [i] == '+' ) || ( zeile[i] == '-' ){ Eingabe = 0; } else if( zeile[i] == ',' ){ Eingabe = 1; } else if( zeile[i] >= 48 && zeile[i] <= 57 ){ Eingabe = 2; } else{ Eingabe = 3; } Zustand =
So in der Richtung eventuell? Vielen Dank schoneinmal für die schnelle Hilfe. So langsam wird es etwas klarer.
Code:char[] zeile; zeile = IO.readChars( "Bitte geben Sie eine Kommazahl ein: "); int i; int Zustand = 0; int Eingabe = 0; for( i = 0; i < zeile.length; i++){ if(( zeile [i] == '+' ) || ( zeile[i] == '-' ){ Eingabe = 0; } else if( zeile[i] == ',' ){ Eingabe = 1; } else if( zeile[i] >= 48 && zeile[i] <= 57 ){ Eingabe = 2; } else{ Eingabe = 3; } new int[] Zustandar; Zustandar[i] = Eingabe;
Nun kann ich printen ob es eine Zahl ist oder auch kein Zahl. Ich weiß nicht wie ich den Zustand Kommazahl noch reinbekommen soll :-(
Hat dazu noch irgendjemand einen Tipp?
Code:char[] zeile; zeile = IO.readChars( "Bitte geben Sie eine Kommazahl ein: "); int i; int Zustand = 0; int Eingabe = 0; for( i = 0; i < zeile.length; i++){ if(( zeile[i] == '+' ) || ( zeile[i] == '-' )){ Eingabe = 0; } else if( zeile[i] == ',' ){ Eingabe = 1; } else if( zeile[i] >= 48 && zeile[i] <= 57 ){ Eingabe = 2; } else{ Eingabe = 3; } int[] Zustandar; Zustandar = new int [zeile.length]; Zustandar[i] = Eingabe; } if( Eingabe == 2 ){ IO.println( " Zahl"); } else{ IO.println ("keine Zahl");} } }
Ich bin ungern der Spielverderber, aber dein Automat funzt vorne und hinten nicht, da er auch Zahlen mit mehreren '+', '-' und ',' erkennt und die Reihenfolge, in welcher sie vorkommen, keine Rolle spielen. Er dürfte z.B. auch "9,14+,-,76,2" als Kommazahl erkennen, wenn ich mich nicht irre.
So wie ich es auf den ersten Blick sehe, ist nur wichtig, was das letzte char in deinem input ist. Sobald es eine Zahl ist, wird Eingabe 2 und er erkennt es als Zahl an. Alles was vor dem letzten char ist spielt absolut keine Rolle, so wie du es aktuell hast.
Hier hast du ein gültiges Zustandsdiagramm (insofern ich deine Angabe richtig verstanden habe):
Startzustand ist 1, gültige Endzustände 3 und 5
Du musst im Grunde nur schauen, dass die Zustände nur inkrementiert werden können (bzw. bei 3&5 nicht dekrementiert werden können) und du bei Zustand 3/5 die Eingabe beenden kannst.
Bei Zustand 3 handelt es sich um keine Kommazahl, bei Zustand 5 um eine Kommazahl.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025