125 lines
2.7 KiB
C++
125 lines
2.7 KiB
C++
// 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<zeilen; i=i+1)
|
|
if ( Qaktuell[i]==q && eingabe[i]==symbol )
|
|
{
|
|
letzteZeile = i;
|
|
letztesQ = Qaktuell[letzteZeile];
|
|
letzteEingabe = eingabe[letzteZeile];
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|