Automaten Aufgabe - Bitte nur einmal drüber gucken



  • Schönen guten Abend euch allen 🙂

    Die Aufgabe war folgendermaßen:

    Entwerfen Sie einen DEA, der genau die Menge der natüurlichen Zahlen akzeptiert, die 2t mal die Ziff er 7 und 3k mal die Zi ffer 9, für [t,k element N0] beliebig, beinhalten.
    Zahlen wie 7956127 sollen demnach nicht akzeptiert werden, während 678175778999 akzeptiert wird. Ferner dürfen keine Zahlen mit führenden Nullen akzeptiert werden. Geben Sie Ihren Lösungsautomaten in formaler Form und speziell die Übergangsfunktion delta in Form einer Tabelle an.

    Und das habe ich dazu bearbeiten: Bitte schaut einmal drüber, ob ich auch nichts vergessen / einen Fehler gemacht habe. Bin wirklich auf die Punkte angewiesen. Vielen Dank schonmal im voraus und noch einen schönen Abend 🙂

    // Zustände S ={0,1,2,3,4,5,6}
    // Startzustand s_0 = {0}
    // Endzustände F = {2}
    // Eingabealphabet = {0,7,9,R}(R={1,2,3,4,5,6,8}
    // Übergangsfunktion:
    // Zustand || 0 | 7 | 9 | R |
    //===========================
    // 0 ||-1 | 2 | 3 | 1 |
    // 1 || 1 | 2 | 3 | 1 |
    // 2 || 2 | 1 | 4 | 2 |
    // 3 || 3 | 4 | 5 | 3 |
    // 4 || 4 | 3 | 6 | 4 |
    // 5 || 5 | 6 | 1 | 5 |
    // 6 || 6 | 5 | 2 | 6 |

    #include "stdafx.h"
    #include <iostream>
    #include "windows.h"

    using namespace std;

    enum TokenT { _0, _7, _9, R, ERR};

    int GetState[][4]={
    {-1,2,3,1},
    { 1,2,3,1},
    { 2,1,4,2},
    { 3,4,5,3},
    { 4,3,6,4},
    { 5,6,1,5},
    { 6,5,2,6},
    };

    bool Akzeptor(char *input)
    {
    int state = 0;
    while(*input != '\0' && state != -1)
    {
    char s=*input++;
    TokenT token = ERR;
    if(s=='0') token=_0;
    if(s=='7') token=_7;
    if(s=='9') token=_9;
    if(s=='1' || s=='2' || s=='3' || s=='4' || s=='5' || s=='6' || s=='8') token = R;
    state = (token == ERR) ? -1 : GetState[state][token];
    }
    return (state==1);
    }

    //Testumgebung:

    int main()
    {
    char eingabe[100];
    cout<<"Geben Sie Eine Zahl ein: ";
    cin>>eingabe;
    while(Akzeptor(eingabe)!=true)
    {
    cout<<endl<<endl<<"Die Zahl entspricht nicht den gewuenschten Kriterien versuchen sie es erneut: ";
    cin>>eingabe;
    }
    cout<<endl<<endl<<"Ihre Eingabe war korrekt!\n\n\n\n";
    system ("pause");
    return 0;
    }



  • Ich wäre sehr vorsichtig mit Bezeichnern wie _0, _7, _9, R und ERR im globalen Namensraum; in der Tat beißen sich diese zum Beispiel mit Boost.Bind. GetState sollte const sein, die Windows-spezifischen Header brauchst du nicht, für die Eingabe wäre std::string besser geeignet, die vielen endls könnte man getrost durch \n ersetzen - eine gute Angewohnheit für den Fall, dass I/O-Performance irgendwann mal eine Rolle spielt - und bools mit == bzw. != zu vergleichen, ist ziemlich ungewöhnlich.

    Das ist alles, was mir so auf den ersten Blick an Stilproblemen auffällt. Der Automat selbst ist in Ordnung; ich würde mir allerdings überlegen, die Zustandstabelle zu kommentieren - halt kurz dranschreiben, was jeder Zustand bedeutet. Das kommt bei der Bewertung bestimmt gut an, vor allem, falls du doch irgendwo einen Tippfehler haben solltest.



  • Was ist bitte 'drüber gucken'?


Anmelden zum Antworten