Für Vorlesungen, bitte die Webseite verwenden. https://flavigny.de/lecture
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
2.7KB

  1. // Konstruktor fuer leeres Programm
  2. Programm::Programm ()
  3. {
  4. zeilen = 0; // noch keine gueltige Zeile
  5. fertig = false;
  6. }
  7. // Fuege eine Zeile in die Zustandsuebrgangstabelle hinzu
  8. void Programm::zeile (int q_ein, char s_ein, char s_aus, R richt, int q_aus)
  9. {
  10. if (fertig) {
  11. print("Programm war schon abgeschlossen!");
  12. return;
  13. }
  14. Qaktuell[zeilen] = q_ein;
  15. eingabe[zeilen] = s_ein;
  16. ausgabe[zeilen] = s_aus;
  17. richtung[zeilen] = richt;
  18. Qfolge[zeilen] = q_aus;
  19. zeilen = zeilen+1;
  20. }
  21. // Definiere letzte Zeile in der Zustandsuebergangstabelle
  22. void Programm::zeile (int endzustand)
  23. {
  24. if (fertig) {
  25. print("Programm war schon abgeschlossen!");
  26. return;
  27. }
  28. Qaktuell[zeilen] = endzustand;
  29. zeilen = zeilen+1;
  30. fertig = true;
  31. print("Programm mit ",zeilen," Zeilen definiert",0);
  32. print("Anfangszustand ",Anfangszustand(),0);
  33. print("Endzustand ",Endzustand(),0);
  34. }
  35. // Ermittle zu schreibendes Zeichen
  36. char Programm::Ausgabe (int q, char symbol)
  37. {
  38. // wurde Zeile als letztes benutzt ?
  39. if ( letztesQ==q && letzteEingabe==symbol )
  40. return ausgabe[letzteZeile];
  41. // suche Zeile im Programm
  42. if (FindeZeile(q,symbol))
  43. return ausgabe[letzteZeile];
  44. // Fehler: es gibt keine solche Zeile
  45. print(q," , ",symbol,0);
  46. print(" nicht definiert!");
  47. return 0;
  48. }
  49. // Ermittle Richtung
  50. Programm::R Programm::Richtung (int q, char symbol)
  51. {
  52. // wurde Zeile als letztes benutzt ?
  53. if ( letztesQ==q && letzteEingabe==symbol )
  54. return richtung[letzteZeile];
  55. // suche Zeile im Programm
  56. if (FindeZeile(q,symbol))
  57. return richtung[letzteZeile];
  58. // Fehler: es gibt keine solche Zeile
  59. print(q," , ",symbol,0);
  60. print(" nicht definiert!");
  61. return links;
  62. }
  63. // Ermittle Folgezustand
  64. int Programm::Folgezustand (int q, char symbol)
  65. {
  66. // wurde Zeile als letztes benutzt ?
  67. if ( letztesQ==q && letzteEingabe==symbol )
  68. return Qfolge[letzteZeile];
  69. // suche Zeile im Programm
  70. if (FindeZeile(q,symbol))
  71. return Qfolge[letzteZeile];
  72. // Fehler: es gibt keine solche Zeile
  73. print(q," , ",symbol,0);
  74. print(" nicht definiert!");
  75. return -1;
  76. }
  77. // Gebe Anfangszustand zurueck
  78. int Programm::Anfangszustand ()
  79. {
  80. return Qaktuell[0];
  81. }
  82. // Gebe Endzustand zurueck
  83. int Programm::Endzustand ()
  84. {
  85. return Qaktuell[zeilen-1];
  86. }
  87. // Finde Zeile in der Zustandsuebergangstabelle zu gegebenem
  88. // Zustand und Symbol. Merke Eingabe und Zeilennummer damit
  89. // bei wiederholtem Zugriff nicht gesucht werden muss.
  90. bool Programm::FindeZeile (int q, char symbol)
  91. {
  92. for (int i=0; i<zeilen; i=i+1)
  93. if ( Qaktuell[i]==q && eingabe[i]==symbol )
  94. {
  95. letzteZeile = i;
  96. letztesQ = Qaktuell[letzteZeile];
  97. letzteEingabe = eingabe[letzteZeile];
  98. return true;
  99. }
  100. return false;
  101. }