home *** CD-ROM | disk | FTP | other *** search
-
- program endliche_Maschine_mit_Ausgabe;
-
- uses tpcrt;
-
- type Band_Fortsetzung = ^Band_Stelle;
-
- Band_Stelle = Record
- Stelle : string[10];
- Stellen_Nr : integer;
- right : Band_Fortsetzung;
- left : Band_Fortsetzung;
- End;
-
- saetze = Record
- regel: string[3];
- afiller: string[1];
- code: char;
- bfiller: string[1];
- anweisung: char;
- cfiller: string[1];
- verzweigung: string[3]
- end;
- asaetze = array[1..100] OF saetze;
-
- str_1 = string[1];
- str_3 = string[3];
- str_10 = string[10];
- str_12 = string[12];
-
- var j,
- Stelle,
- Befehl_Nr,
- Max_Befehle : integer;
- Befehl : asaetze;
- Datei : text;
- DosDatei : str_12;
- Abbruch : boolean;
- Band_Anfang,
- Schreibkopf,
- Band_Ende,
- DruckStelle,
- Before,Next,
- Neues_Element,
- Band_Anfang2,
- Schreibkopf2,
- Band_Ende2,
- DruckStelle2,
- Before2,Next2,
- Neues_Element2 : Band_Fortsetzung;
- Laenge,
- Anzahl,
- Frequenz,
- BandStelle,
- BandStelle2,
- Band_Stellenzahl,
- Band_Stellenzahl2,
- SchreibkopfStelle : integer;
- m,
- l,
- Art_str,
- Ende : str_1;
- k,
- Regel_Nr : str_3;
- Zahl : str_10;
- Art,aa : char;
-
- { - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
-
-
- procedure Set_Color(i:integer);
- begin
- case i of
- 1 : begin TextColor(White); TextBackGround(Black); end;
- 2 : begin TextColor(Black); TextBackGround(White); end;
- end;
- end; { proc Set_Color }
-
-
- procedure set_Rahmen(x1,y1,x2,y2:integer);
- VAR j:integer;
- begin
- j:=0;
- GotoXY(x1,y1); write(chr(218));
- FOR j:=x1+1 TO x2-1 DO write(chr(196));
- write(chr(191));
- FOR j:=y1+1 TO y2-1 DO
- begin
- GotoXY(x1,j); write(chr(179));
- GotoXY(x2,j); write(chr(179));
- end;
- GotoXY(x1,y2); write(chr(192));
- FOR j:= x1+1 TO x2-1 DO write(chr(196));
- write(chr(217));
- end; { proc set_Rahmen }
-
-
- procedure install_Windows;
- var i,j:integer;
- begin
- set_Rahmen(1,1,26,23);
- GotoXY(3,1); Write(' Lese- / Schreib-Band ');
- set_Rahmen(27,1,80,17);
- GotoXY(43,1); Write(' Automaten-Zustände ');
- set_Rahmen(27,18,53,23);
- GotoXY(28,18); Write(' Neuer Maschinen-Zustand ');
- set_Rahmen(54,18,80,20);
- GotoXY(58,18); Write(' Lese-Band-Stelle ');
- set_Rahmen(54,21,80,23);
- GotoXY(57,21); Write(' Band-Lauf-Frequenz ');
- end; { proc install_Windows }
-
-
- procedure set_Window(i:integer);
- begin
- Window(1,1,80,25);
- case i of
- 0 : Window(1,1,80,25);
- 13 : Window(28,2,79,16); { Automaten - Zustände }
- 2 : begin { Neuer Maschinen-Zustand }
- Set_Color(1); Window(28,19,52,22);
- end;
- 21 : begin { Lese-Band-Stelle }
- Set_Color(1);
- Window(55,19,79,20); GotoXY(13,1);
- end;
- 23 : begin { Band-Lauf-Frequenz }
- Set_Color(1);
- Window(55,22,79,23); GotoXY(12,1);
- end;
- 3 : begin { Eingabe/Anfrage - Zeile }
- Window(1,24,80,25); Set_Color(1);
- GotoXY(1,1); Write('>> '); ClrEol;
- end;
- 4 : begin { Eingabe/Anfrage - Zeile }
- Set_Color(1);
- Window(1,24,80,25); GotoXY(1,1);
- Write('>> '); ClrEol; Set_Color(2);
- GotoXY(1,2); ClrEol;
- end;
- 5 : begin
- Window(2,2,25,22); LowVideo;
- GotoXY(1,11); Write('==> <==> <== Kopf');
- end;
- 51 : begin Window(6,2,7,22); LowVideo; end;
- 52 : begin Window(15,2,16,22); LowVideo; end;
- end;
- end; { proc set_Window }
-
-
- function Datei_einlesen(var Max_Befehle:integer;
- var Befehl:asaetze) : boolean;
- var i:integer; flag:boolean;
- begin
- Datei_einlesen:=false; flag:=false; i:=0;
- Repeat
- set_Window(4);
- GotoXY(22,2);
- Write('Datei des auszuführenden Automaten?');
- Set_Color(1); GotoXY(4,1); ReadLn(DosDatei);
- Assign(Datei,DosDatei);
- {$I-} Reset(Datei); {$I+}
- if IOresult=0 then
- begin
- While not(EOF(Datei)) Do
- begin
- Max_Befehle:=Max_Befehle+1;
- With Befehl[Max_Befehle] Do
- ReadLn(datei,regel,afiller,code,
- bfiller,anweisung,cfiller,verzweigung);
- end;
- close(Datei);
- flag:=true;
- Datei_einlesen:=true;
- end
- else begin
- set_Window(3); GotoXY(4,1);
- Write(' Automat: ',DosDatei,' ist auf Diskette/');
- Write('Platte nicht verfügbar!');
- i:=i+1;
- if i=4 then begin
- Datei_einlesen:=false;
- abbruch:=true;
- end;
- Delay(3000);
- end;
- Until flag or Abbruch;
- end; { proc Datei_einlesen }
-
-
- Procedure Automaten_Druck(Befehl:asaetze;
- Max_Befehle:integer);
- var j,Zeile,Spalte:integer;
- begin
- LowVideo; set_Window(13); Zeile:=1; Spalte:=2;
- For j:=1 TO Max_Befehle Do begin
- Delay(50);
- GotoXY(Spalte,Zeile); Zeile:=Zeile+1;
- With Befehl[j] Do if j<=75 then
- Write(regel,afiller,code,
- bfiller,anweisung,cfiller,verzweigung);
- IF Zeile=16 THEN begin Zeile:=1; Spalte:=Spalte+13; end;
- end;
- HighVideo;
- end; { proc Automaten_Druck }
-
-
- Procedure Zustand_Drucken(var Spalte,Zeile,j_Merker:integer;
- Befehl:asaetze; Befehl_Nr:integer);
- begin
- set_Window(13); GotoXY(Spalte,Zeile);
- LowVideo;
- With Befehl[j_Merker] Do
- Write(regel,afiller,code,bfiller,
- anweisung,cfiller,verzweigung);
- HighVideo;
- Case Befehl_Nr of
- 1..15 : Spalte:=2;
- 8..30 : Spalte:=15;
- 15..45 : Spalte:=28;
- 22..60 : Spalte:=41;
- 29..75 : Spalte:=56;
- end;
- Case Befehl_Nr of
- 1..15 : Zeile:=Befehl_Nr;
- 16..30 : Zeile:=Befehl_Nr-15;
- 31..45 : Zeile:=Befehl_Nr-30;
- 46..60 : Zeile:=Befehl_Nr-45;
- 61..75 : Zeile:=Befehl_Nr-60;
- end;
- set_Window(13); GotoXY(Spalte,Zeile);
- With Befehl[Befehl_Nr] Do
- Write(regel,afiller,code,bfiller,
- anweisung,cfiller,verzweigung);
- LowVideo; j_Merker:=Befehl_Nr;
- end; { proc Zustand_drucken }
-
-
- procedure BandStellenDruck(Druckstelle:Band_Fortsetzung;
- art:char);
- begin
- Case Art of
- 'r' : begin
- set_Window(51); GotoXY(1,1); InsLine;
- Write(Druckstelle^.Stelle);
- end;
- 'R' : begin
- set_Window(52); GotoXY(1,1); InsLine;
- Write(Druckstelle^.Stelle);
- end;
- '0' : begin
- set_Window(52); GotoXY(1,11);
- Write(Druckstelle^.Stelle);
- end;
- '1' : begin
- set_Window(52); GotoXY(1,11);
- Write(Druckstelle^.Stelle);
- end;
- 's' : begin
- set_Window(52); GotoXY(1,11);
- Write(Druckstelle^.Stelle);
- end;
- '■' : begin
- set_Window(51); GotoXY(1,11);
- Write(Druckstelle^.Stelle);
- end;
- 'g' : begin
- set_Window(51); GotoXY(1,1);
- InsLine; Write(Druckstelle^.Stelle);
- Delay(100);
- end;
- 'k' : begin
- set_Window(52); GotoXY(1,1);
- InsLine; Write(Druckstelle^.Stelle);
- Delay(100);
- end;
- else begin end;
- end;
- end; { proc BandStellenDruck }
-
-
- Procedure Band_Generierung(Anzahl:integer; Art_str:str_1);
- var i : integer;
- begin
- if Art_str<>Chr(254) then
- begin
- for i:=1 to Anzahl do
- begin
- new(Next);
- Schreibkopf^.Right:=Next;
- Next^.Left:=Schreibkopf;
- Schreibkopf:=Next;
- Band_Stellenzahl:=Band_Stellenzahl+1;
- Schreibkopf^.Stelle:=Art_str;
- Schreibkopf^.Stellen_Nr:=Band_Stellenzahl;
- Next:=nil;
- BandStellenDruck(Schreibkopf,'g');
- end
- end
- else begin
- for i:=1 to Anzahl do
- begin
- new(Next);
- Schreibkopf^.Right:=Next;
- Next^.Left:=Schreibkopf;
- Schreibkopf:=Next;
- Band_Stellenzahl:=Band_Stellenzahl+1;
- if i=1 then Schreibkopf^.Stelle:='s'
- else Schreibkopf^.Stelle:=Art_str;
- Schreibkopf^.Stellen_Nr:=Band_Stellenzahl;
- Next:=nil;
- BandStellenDruck(Schreibkopf,'g');
- end
- end;
- end; { proc Band_Generierung }
-
-
- Procedure Band_Eingabe;
- Begin
- Repeat
- set_Window(4); GotoXY(2,2);
- Write('Welches Zeichen: ''0'' für Nullen, ''1''');
- Write(' für Einsen bzw. ''2'' für Leerzeichen ''■''');
- set_Window(3); GotoXY(4,1); ReadLn(Art_str);
- if Art_str='2' then Art_str:=Chr(254);
- if Art_str<>Chr(254) then begin
- GotoXY(4,1); ClrEol;
- set_Window(4); GotoXY(28,2);
- Write('Anzahl dieses Zeichens?');
- set_Window(3); GotoXY(4,1); ReadLn(Anzahl);
- end
- else Anzahl:=1;
- GotoXY(4,1); ClrEol;
- Band_Generierung(Anzahl,Art_str);
- Until Art_str=Chr(254);
- set_Window(3); GotoXY(1,2); ClrEol;
-
- set_Window(4); GotoXY(22,2);
- write('Anfangszustand ist die Band-Stelle: 1 ');
- Delay(2000); SchreibkopfStelle:=1;
- set_Window(4); GotoXY(19,2);
- write('Geben Sie die Ablaufgeschwindigkeit an ');
- set_Window(3); GotoXY(4,1); ReadLn(Frequenz);
- end; { proc Band_Eingabe }
-
-
- procedure Maschinen_Lauf;
- var c,
- Spalte,Zeile,
- j_Merker : integer;
- begin
- Regel_Nr:='000'; m:='0'; c:=0;
- j_Merker:=1; Spalte:=2; Zeile:=1;
- set_Window(51); GotoXY(1,1);
- for j:=1 to 21 do DelLine; { Window-Inhalt löschen }
- Delay(500); set_Window(5);
- Delay(700); set_Window(51);
- DruckStelle:=Band_Anfang;
- DruckStelle2:=Band_Anfang2;
- BandStelle:=SchreibkopfStelle;
- BandStelle2:=SchreibkopfStelle;
- Delay(200);
-
- { Ausdrucken Leseband bis obere Window-Grenze Zeile 1 }
- for j:=DruckStelle^.Stellen_Nr to SchreibkopfStelle+9 do
- begin
- if DruckStelle^.Stellen_Nr<Band_Ende^.Stellen_Nr then
- begin
- DruckStelle:=DruckStelle^.Right;
- BandStellenDruck(DruckStelle,'g');
- end
- else if DruckStelle^.Stellen_Nr=Band_Ende^.Stellen_Nr then
- begin
- new(Next);
- Band_Ende^.Right:=Next;
- Next^.Left:=Band_Ende;
- Band_Ende:=Next;
- Band_Stellenzahl:=Band_Stellenzahl+1;
- Band_Ende^.Stellen_Nr:=Band_Stellenzahl;
- Band_Ende^.Stelle:='■';
- DruckStelle:=Next; Next:=nil;
- BandStellenDruck(DruckStelle,'g');
- end
- else begin
- set_Window(5); GotoXY(4,1);
- Write('Lauf-Fehler! Abbruch des Programms!');
- HALT;
- end;
- end;
-
- { Positionieren von Schreibkopf, Next und Before }
- Schreibkopf:=Band_Anfang;
- while SchreibkopfStelle>Schreibkopf^.Stellen_Nr do
- Schreibkopf:=Schreibkopf^.Right;
- Next:=Schreibkopf; Before:=Schreibkopf;
- for j:=1 to 10 do begin
- if not (Next^.Stellen_Nr=Band_Ende^.Stellen_Nr) then
- Next:=Next^.Right;
- end;
- for j:=1 to 10 do begin
- if not (Before^.Stellen_Nr=Band_Anfang^.Stellen_Nr) then
- Before:=Before^.Left;
- end;
-
- { Ausdrucken Schreibband bis obere Window-Grenze Zeile 1 }
- Delay(300);
- for j:=Band_Anfang2^.Stellen_Nr to 10 do
- begin
- if DruckStelle2^.Stellen_Nr<Band_Ende2^.Stellen_Nr then
- begin
- DruckStelle2:=DruckStelle2^.Right;
- BandStellenDruck(DruckStelle2,'k');
- end
- else if DruckStelle2^.Stellen_Nr=Band_Ende2^.Stellen_Nr then
- begin
- new(Next2);
- Band_Ende2^.Right:=Next2;
- Next2^.Left:=Band_Ende2;
- Band_Ende2:=Next2;
- Band_Stellenzahl2:=Band_Stellenzahl2+1;
- Band_Ende2^.Stellen_Nr:=Band_Stellenzahl2;
- Band_Ende2^.Stelle:='■';
- DruckStelle2:=Next2; Next2:=nil;
- BandStellenDruck(DruckStelle2,'k');
- end
- else begin
- set_Window(5); GotoXY(4,1);
- Write('Lauf-Fehler! Abbruch des Programms!');
- HALT;
- end;
- end;
-
- { Positionieren von Schreibkopf2, Next2 und Before2 }
- Schreibkopf2:=Band_Anfang2;
- Next2:=Schreibkopf2; Before2:=Schreibkopf2;
- for j:=1 to 10 do begin
- if not (Next2^.Stellen_Nr=Band_Ende2^.Stellen_Nr) then
- Next2:=Next2^.Right;
- end;
- for j:=1 to 10 do begin
- if not (Before2^.Stellen_Nr=Band_Anfang2^.Stellen_Nr) then
- Before2:=Before2^.Left;
- end;
-
- { Ermitteln und Setzen der Ablaufgeschwindigkeit }
- set_Window(23); GotoXY(11,1); LowVideo; Write(Frequenz);
- set_Window(21); LowVideo; Write(BandStelle);
-
- { Startbereitschaft hergestellt }
- set_Window(3); GotoXY(4,1); ClrEol;
- set_Window(4); GotoXY(25,2);
- Write(' START mit beliebiger Taste ');
- Repeat aa:=Readjez Until aa<>'?';
- set_Window(3); GotoXY(4,1); ClrEol;
- set_Window(4); GotoXY(25,2);
- Write(' ');
-
-
- Repeat
-
- Delay(Frequenz);
-
- Repeat Befehl_Nr:=Befehl_Nr+1;
- c:=c+1; if c>1000 then Abbruch:=true;
- if Befehl_Nr>Max_Befehle then Befehl_Nr:=1;
- k:=Befehl[Befehl_Nr].regel;
- l:=Befehl[Befehl_Nr].code;
- until ((Regel_Nr=k) and (Schreibkopf^.Stelle=l)) or Abbruch;
-
- if not Abbruch then begin
- Zustand_Drucken(Spalte,Zeile,j_Merker,Befehl,Befehl_Nr);
- set_Window(2); LowVideo;
- with Befehl[Befehl_Nr] do begin
- GotoXY(8,1); DelLine; GotoXY(8,4);
- Write(regel,afiller,code,bfiller,
- anweisung,cfiller,verzweigung);
- end;
- set_Window(21); LowVideo;
- BandStelle:=BandStelle+1; Write(BandStelle);
-
- { Leseband lesen + um eins nach rechts }
- if not (Schreibkopf^.Stelle='■') and
- not (Schreibkopf^.Stelle='s') then
- begin
- if (Next^.Stellen_Nr=Band_Ende^.Stellen_Nr) then
- begin
- new(Neues_Element);
- Band_Ende^.Right:=Neues_Element;
- Neues_Element^.Left:=Band_Ende;
- Band_Ende:=Neues_Element;
- Neues_Element:=nil;
- Band_Stellenzahl:=Band_Stellenzahl+1;
- Band_Ende^.Stelle:='■';
- Band_Ende^.Stellen_Nr:=Band_Stellenzahl;
- end;
- if Schreibkopf^.Stellen_Nr-10=Before^.Stellen_Nr then
- Before:=Before^.Right;
- Next:=Next^.Right; Schreibkopf:=Schreibkopf^.Right;
- art:='r'; BandStellenDruck(Next,art);
- end;
-
- { Schreibband beschreiben + um eins nach rechts }
- art:=Befehl[Befehl_Nr].Anweisung;
- Schreibkopf2^.Stelle:=Befehl[Befehl_Nr].Anweisung;
- Delay(100); BandStellenDruck(Schreibkopf2,art);
- Delay(300);
- if not (Befehl[Befehl_Nr].Anweisung='s') then
- begin
- if Next2^.Stellen_Nr=Band_Ende2^.Stellen_Nr then
- begin
- new(Neues_Element2);
- Band_Ende2^.Right:=Neues_Element2;
- Neues_Element2^.Left:=Band_Ende2;
- Band_Ende2:=Neues_Element2;
- Neues_Element2:=nil;
- Band_Stellenzahl2:=Band_Stellenzahl2+1;
- Band_Ende2^.Stelle:='■';
- Band_Ende2^.Stellen_Nr:=Band_Stellenzahl2;
- end;
- if Schreibkopf2^.Stellen_Nr-10=Before2^.Stellen_Nr then
- Before2:=Before2^.Right;
- Next2:=Next2^.Right;
- Schreibkopf2:=Schreibkopf2^.Right;
- art:='R';
- BandStellenDruck(Next2,art);
- end;
-
- Regel_Nr:=Befehl[Befehl_Nr].verzweigung;
- end;
-
- Until (Befehl[Befehl_Nr].code='s') or Abbruch;
- end; { proc Maschinen_Lauf }
-
-
- procedure Ende_Kommentar;
- begin
- if Befehl[Befehl_Nr].code='s' then
- begin
- set_Window(4); GotoXY(20,2);
- Write('Halten des endlichen Automaten im Endzustand');
- end
- else begin
- set_Window(4); GotoXY(5,2);
- Write('Vorzeitiges Halten! Das Band-Wort gehört ');
- Write('nicht zum endlichen Automaten!');
- end;
- end; { proc Ende_Kommentar }
-
-
- Procedure Cursor(i:integer);
- begin
- Case i of
- 1 : HiddenCursor;
- 2 : BlockCursor;
- else end;
- end; { proc Cursor }
-
-
- procedure initialisieren;
- begin
- abbruch:=false;
- Window(1,1,80,25); ClrScr;
- j:=0; Zahl:='0'; Max_Befehle:=0; Befehl_Nr:=0;
- end; { proc initialisieren }
-
-
- begin { - - - - - H A U P T P R O G R A M M - - - - - }
- initialisieren; install_Windows; set_Window(11); Cursor(1);
-
- if Datei_Einlesen(Max_Befehle,Befehl) then
- Automaten_Druck(Befehl,Max_Befehle)
- else begin
- Set_Window(3); GotoXY(4,1);
- Write('Keine Datei konnte eingelesen werden!');
- Delay(2000);
- end;
-
- if not Abbruch then begin
- new(Band_Anfang); Schreibkopf:=Band_Anfang;
- Band_Anfang^.Stelle:='■'; Band_Anfang^.Stellen_Nr:=0;
- new(Band_Anfang2); Schreibkopf2:=Band_Anfang2;
- Band_Anfang2^.Stelle:='■'; Band_Anfang2^.Stellen_Nr:=0;
- Band_Stellenzahl:=0; Band_Stellenzahl2:=0; art:=' ';
- SchreibkopfStelle:=0;
-
- Delay(600); Band_Eingabe;
-
- Band_Ende:=nil; Band_Ende:=Schreibkopf;
- Schreibkopf:=nil; Schreibkopf:=Band_Anfang;
- Next:=nil; Next:=Band_Anfang;
- Next:=Next^.Right;
- Band_Ende2:=nil; Band_Ende2:=Schreibkopf2;
- Schreibkopf2:=nil; Schreibkopf2:=Band_Anfang2;
- Next2:=nil; Next2:=Band_Anfang2;
- Next2:=Next2^.Right;
-
- Maschinen_Lauf;
-
- Ende_Kommentar;
- Repeat aa:=Readjez Until aa<>'?';
- end;
-
- set_Window(0); GotoXY(1,1); Cursor(2);
- end. { Programm endliche_Maschine_mit_Ausgabe }
-
-