// Konstruktor fuer leeres Programm Programm::Programm () { zeilen = 0; // noch keine gueltige Zeile fertig = false; } // Fuege eine Zeile in die Zustandsuebrgangstabelle hinzu void Programm::zeile (int q_ein, char s_ein, char s_aus, R richt, int q_aus) { if (fertig) { print("Programm war schon abgeschlossen!"); return; } Qaktuell[zeilen] = q_ein; eingabe[zeilen] = s_ein; ausgabe[zeilen] = s_aus; richtung[zeilen] = richt; Qfolge[zeilen] = q_aus; zeilen = zeilen+1; } // Definiere letzte Zeile in der Zustandsuebergangstabelle void Programm::zeile (int endzustand) { if (fertig) { print("Programm war schon abgeschlossen!"); return; } Qaktuell[zeilen] = endzustand; zeilen = zeilen+1; fertig = true; print("Programm mit ",zeilen," Zeilen definiert",0); print("Anfangszustand ",Anfangszustand(),0); print("Endzustand ",Endzustand(),0); } // Ermittle zu schreibendes Zeichen char Programm::Ausgabe (int q, char symbol) { // wurde Zeile als letztes benutzt ? if ( letztesQ==q && letzteEingabe==symbol ) return ausgabe[letzteZeile]; // suche Zeile im Programm if (FindeZeile(q,symbol)) return ausgabe[letzteZeile]; // Fehler: es gibt keine solche Zeile print(q," , ",symbol,0); print(" nicht definiert!"); return 0; } // Ermittle Richtung Programm::R Programm::Richtung (int q, char symbol) { // wurde Zeile als letztes benutzt ? if ( letztesQ==q && letzteEingabe==symbol ) return richtung[letzteZeile]; // suche Zeile im Programm if (FindeZeile(q,symbol)) return richtung[letzteZeile]; // Fehler: es gibt keine solche Zeile print(q," , ",symbol,0); print(" nicht definiert!"); return links; } // Ermittle Folgezustand int Programm::Folgezustand (int q, char symbol) { // wurde Zeile als letztes benutzt ? if ( letztesQ==q && letzteEingabe==symbol ) return Qfolge[letzteZeile]; // suche Zeile im Programm if (FindeZeile(q,symbol)) return Qfolge[letzteZeile]; // Fehler: es gibt keine solche Zeile print(q," , ",symbol,0); print(" nicht definiert!"); return -1; } // Gebe Anfangszustand zurueck int Programm::Anfangszustand () { return Qaktuell[0]; } // Gebe Endzustand zurueck int Programm::Endzustand () { return Qaktuell[zeilen-1]; } // Finde Zeile in der Zustandsuebergangstabelle zu gegebenem // Zustand und Symbol. Merke Eingabe und Zeilennummer damit // bei wiederholtem Zugriff nicht gesucht werden muss. bool Programm::FindeZeile (int q, char symbol) { for (int i=0; i