`L i=L\Ʃx ? N'i  ͭЅ?0ȱ Ѕ?iȱi lԠԠ͠ԠϠŠͮŠ SYSTEM.APPLE   L$JO^ææTEXTæ STIL.TEXTtM{ææw{ /GONG682.TEXT{æ{ /GONG782.TEXT{æ/GONG2782.TEXT{æ/GONG3082.TEXT{æ/GONG3182.TEXT{æ/GONG3881.TEXT{æ14.RUBRIK______æP.SCRIPT1.TEXT{æP.SCRIPT2.TEXT{æZAKS.LISTE.API1013.RUBRIK______æ+ GONG.DOC.TEXT{æ+3 GONG.TEXTtM{æ3K GONG.1.TEXT{æKi GONG.2.TEXT{æik GONG.CHARSETvgæko /GONG182.TEXT{æos /GONG282.TEXT{æsw /GONG382.TEXT{&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*xH&x'8*7Ixix&&  ') + &п x) ++`FG8`0($ p,&") (jJJ>L+ "?I>  N `  ` x V Nx .x- z `V0^*^*>` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`& verschieden verhalten. Das Lesen aus dem Exec File setzt bei meinem Apple den  Keyboardstrobe nicht zurueck, so dass dieser eine Tastendruck genuegt. (Keine  Sorge, er wird schon noch zurueckgesetzt.) Andere Apples nehmen pro Druck auf  die LeertasNun werden die zu lesenden Zeichen zwar aus dem Execfile genommen, der  Tastendruck muss aber von der Tastatur kommen.   Inzwischen stellte ich fest, dass sich Apples mit und ohne 80-Zeichenkarte e?; Antwort:) EXEC//GONG3881  Dann erscheint automatisch: x Execute what file? gong  Bitte auf Grafik schalten!   Wenn man auf Grafik geschaltet hat, muss man einmal eine  Leertaste druecken, denn im Programm heisst es:  IF Key THEN READ(ch);  inen der Execfiles  /GONG3881 oder aehnliche verwenden.  Es handelt sich bei diesem Beispiel um das oben aufgefuehrte Raetsel.   Voraussetzung:  GONG.CODE und GONG.CHARSET sind auf der Prefixdiskette. Man tippt  dann:  x (Rueckfrage Exec what fil portionalschrift-Charset, in dem aber die Ziffern ausnahms- weise alle gleich  viel Platz brauchen. Die Verwendung solcher Charsets ist auf API-Diskette 5  beschrieben.  Eingabe mit Exec-Files  ----------------------  Man kann zur Eingabe auch e BS (Backspace)  loescht ein eingetragenes Zeichen aus dem Kreis, NAK (Pfeil nach rechts traegt  aber vorher vorhandene Zeichen wieder ein.  Die Symbole werden aus dem Gong.Charset genommen. Es handelt sich um ein Pro- hl kann kein Zwischenraum  sein. An Stellen, wo Rechenzeichen stehen sollen, koennen nur Rechenzeichen  ('+', '-', '*' und '/') eingegeben werden. Es kann keine Luecken in Zahlen  geben.   Die Tasten BS und NAK (mit den Pfeilen) werden angenommen. ---------   Man gibt die Daten auf dem hochaufloesenden Bildschirm ein.  Alle Zahlen muessen rechtsbuendig eingegeben werden.  Es werden nur sinnvolle Daten akzeptiert. Sinnvolle Daten, das  heisst:  Das am weitesten rechts stehende Symbol einer Za:**** :**** :***  Die anderen Abkuerzungen bedeuten:  D: Dreieck, I: I, K: Kringel, O: oben, P: Punkt, (S: Schmetterling),  U: U, V: voll, Z: zweifach.   Das Programm Gong soll jeweils alle Loesungen des Problems finden.    Eingabeteil  --aus dem Heft Gong 38, 1981  !PPZ - KK = ZO #+ - * !PPD : PQ = V #= = = !DDS + OZ = DVV   Dabei habe ich an Stelle der Symbole Buchstaben gesetzt, so : 8*** 7****  an Stelle des Symbols ***** ein "S" fuer Schmetterling. abe  -----------  In der Fernsehzeitschrift Gong findet man jeweils unter der Ueberschrift  "Rechenproblem" Raetsel, in denen an Stelle der Zahlen Symbole stehen. Dabei  sind 3 * 3 Zahlen in Form eines Quadrats mit Rechenzeichen verbunden.  Beispiel nn  --------   Lehrer : Jetzt machen wir Denksport!  Schueler: Dauernd denken, dauernd denken!  Natuerlich ist es noch ein weiter Weg, bis zum Ziel: "Nie wieder  denken", aber ein wenig soll uns jetzt unser Computer abnehmen.     Zur Aufg +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 8Dokumentation zum Programm Gong ?von Michael Bauer ?(API 12.03.1983)   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++   Vorspate nur ein Zeichen aus dem Exec-File, so dass Sie am besten die  Leertaste und die Repeat-Taste gleichzeitig betaetigen. Die Eingabeanweisung  habe ich so gestaltet, weil ich bei der Eingabe einen blinkenden Cursor auf  dem Grafikbildschirm wollte.   (Zur Herstellung von Exec-Files mit dem Editor sehen Sie sich auf der Diskette  API.3: den Text DLE.DOC an - gl.)    Arbeitsweise des Programms  -------------------------- !  Die Eingabe liegt in Form eines Strings vor. Dieser wird in einen  Wenn das Programm etwa fuer a eine Zahl gesetzt hat, versucht es aus dieser  Annahme so viele Folgerungen zu ziehen, wie moeglich. Laesst sich daraus  nichts mehr mit Sicherheit herleiten, so versucht es die naechste Zahl zu  setzen, b. Die Variableegrad 0 zu. Ohne Probieren gehts aber nicht.  Das Programm versucht dann probeweise fuer a zu setzen und probiert die  Ziffern durch, die auf Grund der bisherigen Erkenntnisse noch in Frage kommen.  auswirkt, die schon dran war. Deshalb macht es so lange weiter, bis sich  waehrend 6 Gleichungen keine neuen Erkenntnisse mehr ergeben.    Jetzt wirds ernst.   Alle bisherigen Erkenntnisse sind sicher. Ihnen ordnet das Programm den  Hypothes+ vos = vpk keine Schluesse gezogen, obwohl man her-  leiten koennte, dass p mindestens 2 ist.   Bei diesen Versuchen geht das Programm die 6 Gleichungen durch. Ist etwas  gefunden worden, dann kann sein, dass diese Erkenntnis sich auf eine Gleichung sein (denn p ist ja groesser). Das Gleiche versucht es natuerlich auch bei  Zahlen mit verschieden viel Stellen, etwa op + vos = spo. Hier muss s min-  destens 2 sein. Das Programm geht aber nicht bis zum Letzten. So werden  beispielsweise aus op nden.  Beispiel: kov + sos = psd  Sollte etwa s eine gerade Zahl sein (und als fuehrende Zahl natuerlich  nicht 0), so muss p mindestens 3 sein, andererseits kann s oder k niemals 9 ndert, ist bestimmt eine  Zehnerzahl addiert worden.  Beispiel: op + vkz = vdp  Hier ist z bestimmt 0, also die anderen Zahlen von 0 verschieden.   Schliesslich versucht es ein bisschen was ueber die Anordnung der Zahlen bei  der Addition herauszufi zwei Zahlen mit gleichen Endziffern multipliziert werden, endet das  Produkt bestimmt auf 0, 1, 4, 5, 6 oder 9.  Beispiel: kk * ok = ivp  Hier gehoert p bestimmt zu den Zahlen 0, 1, 4, 5, 6 oder 9.   Wenn sich die Endziffer bei der Addition nicht ae Hier wuerde das Programm erkennen, dass p 1 sein muss und demnach kein anderer  Buchstabe 1 sein kann.   Wenn zwei Zahlen mit gleichen Endziffern addiert werden, ist die Summe gerade.  Beispiel: kk + iok = ivp  Hier ist p bestimmt gerade.   Wenns Programm versucht zuerst einiges zu erkennen.   Fuehrende Ziffern sind niemals 0.  Wenn sich bei der Addition die Stellenzahl aendert, ist die Anfangsziffer  bestimmt 1. Beispiel: kk + ov = pzo . Beim Vergleich sind die Buchstaben an den Endziffern  besser geeignet, als die Buchstaben an den vorderen Ziffern. Die Buchstaben  des Resultats bringen nicht so viel wie die der Operanden.   Der jetzt erzeugte String wird weiterverarbeitet.  Dasten brauchbare Buchstabe ist  dann 'a', der zweitbeste 'b', der seltenste 'j'. Den Zwischenraum ersetze ich  durch 'k'. So koennte aus der obigen Gleichung der Stringteil keaa-kkfbkdaa  werden, wenn a an Stelle von P steht, ...   Zur Brauchbarkeit Im String lasse ich aber die alten Rechenzeichen stehen, damit ich spaeter  problemlos die alte Form rekonstruieren kann.   Danach bewerte ich die einzelnen Buchstaben nach Brauchbarkeit und Haeufigkeit  und benenne sie um. Der haeufigste und am beString aus  6 Gleichungen umgeformt. Dieser wird weiter umgeformt zu 6 Gleichungen, in  denen nur noch addiert und multipliziert wird.   So wird etwa  SPP - KV = OPV zu OPV + KV = SPP "Niveau" gibt die Zahl der Hypothesen an. Sollte  sich etwa aus einer Annahme ein Widerspruch ergeben, so gibt das Programm die  Annahme auf und nimmt zugleich alle aus ihr hergeleiteten Folgerungen zurueck.   Beispiel: Es sei gesetzt worden a = 1 - keine Folgerungen +dann sei gesetzt worden b = 3 - hieraus habe das Programm +dann e = 5 hergeleitet. +Dann sei gesetzt worden c = 4. Hieraus sei hergeleitet +worden d = 8, g = 7 und schliesslich logisch zwingend f = +4. Das ist ein Widerspruch, d eingesetzt, da das Programm nicht in allen Faellen ohne Stack overflow com-  piliert werden konnte. Dadurch erhoeht sich allerdings die Dauer der Compi-  lation wesentlich. Versuchen Sie aber doch einmal mit Ihrer Geraetekonfigu-  ration die von Heroll mit Swapping On uebersetzt werden. Die Compilaton dauert  fast 4 Minuten. Der Platz wuerde uebrigens ohne Swapping fast reichen.   (Im Programm wurde von der Redaktion der API-Disketten die Compileroption S+ rst gering ist. Die ersten  beiden Programmteile benutzen nicht mehr als drei globale Variablen, die  Strings G, Gl und Glei. Auch der Rest hat nur sehr wenig globale Variablen  und einfache Typen.    Compilation  -----------   Das Programm s und uebergab den String Glei an den dritten Teil,  der das Programm aufloesen sollte. Dadurch wurden auch die unheimlichen  Compilezeiten verkuerzt. Diese Organisation hatte auch den Vorteil, dass die  Kommunikation zwischen den Programmteilen aeusse schliesslich dadurch geschafft, dass ich das Programm in Stuecke zerlegte.  Der erste Teil besorgte nur die Eingabe und uebergab einen String (die 42  Zeichen) an den zweiten Teil (Chainstuff). Der zweite Teil formte diesen  String um (6 Gleichungen)in erster Versuch das Problem zu loesen. Der zweite scheiterte daran, dass  schliesslich so viele Variablen, Arrays und Datentypen im Programm vorkamen,  dass ich mich ueberhaupt nicht mehr auskannte. Im dritten Anlauf habe ich es ELTERN  so stellt sich heraus, dass es unverhaeltnismaessig viel schwieriger ist. Ich  habe recht lang gebraucht, bis ich ueberhaupt verstanden hatte, wie man das  mit dem Annehmen und dem Verwerfen von Hypothesen macht. Daran scheiterte  meaber nicht so viele Variable und Alternativen.    Schwierigkeit des Programms  ---------------------------  Vergleicht man dieses Problem mit den Raetseln vom Typ  !SEND VATER  +MORE oder +MUTTER ,  ----- -------  MONEY  schirm die Loesungsziffern eingetragen werden. Im Textteil von GONG steht  noch die Procedure, die ich vorher verwendet habe und die auf dem Textbild-  schirm ausgibt. Mit geringfuegiger Modifikation koennte man auch ausdrucken  lassen. Ich wollte 82 noch 40 Sekunden  um die Loesungen zu finden, auszugeben und auf Eindeutigkeit  zu ueberpruefen.   Die Ausgabe geht so vor sich, dass an Stelle der Symbole auf dem Grafikbild- chmal findet es Loesungen schon nach  wenigen Sekunden.   Vom letzten Tastendruck der Eingabe ab braucht z.B. das  Problem GONG 39/ 1981 noch 66 Sekunden, (GONG 1 / 1982 noch 31 Sekunden, (GONG 2 / 1982 noch 2 Minuten und 14 Sekunden, (GONG 7 / 19st.  Im Mittel wird ein Hypothesegrad von 3 erreicht.   Eine gefundene Loesung wird sofort ausgegeben. Das Programm sucht weiter. Am  Schluss gibt es einen blinkenden Cursor. Meist braucht es zwischen einer  halben Minute und einigen Minuten. Man+nicht in Frage). Sollte jede Hypothese vom Niveau 3 zum +Widerspruch fuehren, so muss natuerlich auch die Annahme b += 3 samt Folgerungen zurueckgenommen werden.   Diese Leistung erbringt die Procedure Versuche_zu_setzen, die  rekursiv aufgebaut ia 4 schon fuer c verbraucht +ist. Die Annahmen c = 4, d = 8 und g = 7 werden dann +zurueckgenommen (Hypothesen vom Niveau 3) und das Programm +versucht statt dessen fuer c = 6 zu setzen (5 kommt ja rn Bauer angefuehrte Methode. Sie muessen dazu im Programm-  teil GONG.1.TEXT nur das "$" fuer die Compileroption entfernen. Dann wird der  Ausdruck in den runden Klammern als Kommentar vom Compiler interpretiert. Vor  dem Compilieren ist dann noch auf der Hauptkommandoebene mit "SY" Swapping auf  ON zu setzen, falls dies nicht schon frueher geschah. Beobachten Sie dann  einmal die Anzahl der Worte, die beim Compilieren noch frei sind. Diese wer-  den nach jedem Prozedur- oder Funktionsnamen in e ------------   Werden nicht wirkliche Rechnungen eingegeben, sondern Fantasieaufgaben, so  kann das Programm zusammenbrechen, wenn bei Rechnungen fuenf, sechs oder noch  mehrstellige Zahlen zu berechnen sind. Es kommen maximal vierstellige Zahlen s aus, falls es schon das letzte Symbol war, andernfalls versuche  gleich das naechste Symbol zu setzen.  Loesche danach die Folgerungen wieder aus und gib die Annahme auf, um auch  etwas anderes durchprobieren zu koennen.   Begrenzungen r als eingetragen.  Versuche dann so viele Folgerungen daraus herzuleiten, bis die Annahme  erschoepft ist. Ergibt sich ein Widerspruch, so radiere die Annahmen samt  Folgerungen gleich wieder aus, ergibt sich aber keiner, so gib entweder das  Ergebniauch fuer dieses  Symbol in Frage, so mache folgendes:  Mache Dir klar, dass jetzt eine neue unbewiesene Annahme folgt, erhoehe also  das Hypothesenniveau.  Zunaechst sind auch auf diesen Niveau die gleichen Zahlen noch frei.  Dann notiere diese Ziffe gib das Ergebnis aus, falls es sich schon um das letzte Symbol handelt,  andernfalls versuche gleich das naechste zu setzen. !  Falls es noch nicht gesetzt ist, so probiere die zehn Ziffern durch.  Ist eine Ziffer noch nicht verbraucht und kommt sie  Die Procedure Versuche_zu_setzen in Alltagssprache  -------------------------------------------------- !  Versuche fuer ein bestimmtes Symbol Zahlen einzusetzen, das heisst: !  Falls dieses Symbol schon gesetzt ist, so othesen bis zum momentanen Niveau seien wahr.   letztes_Symbol: Das seltenste Symbol. Wenn alle zehn Ziffern vorkommen, ist  es 'j'. Kommen beispielsweise nur 8 Symbole vor, so ist es 'g'. Man versucht  alle Ziffern bis Maxsymbol zu setzen.   n Willen nichts Neues mehr hergeleitet werden kann, $gibt es nur zwei Moeglichkeiten: Die Annahme ist vorlaeufig moeglich oder $nachgewiesenermassen widerspruechlich.   Frei: Ziffern, die noch gesetzt werden koennen, wenn man unterstellt, alle  Hyp 3. Es lassen sich andere Zuordnungen herleiten, aus denen sich kein Wider- $spruch herleiten laesst. Das nenne ich Neuigkeiten. Wenn man jedoch alle $Gleichungen durchgeht, so lange, bis sich ein Widerspruch ergibt oder aus $den Annahmen beim beste schiedene Faelle eintreten.   1. Es laesst sich nichts schlussfolgern oder es lassen sich nur laengst $angenommene Hypothesen bestaetigen. In diesem Fall gibt es nichts Neues.   2. Es laesst sich ein Widerspruch herleiten.  n Hypothesegrad 9 zu (ganz unsicher).   Wert: Das ist der Wert, der dem jeweiligen Symbol zugeordnet wird, natuerlich  nur unter Beruecksichtigung des Hypotheseniveaus.   moeglich: Wenn eine einzelne Gleichung ueberprueft wird, koennen drei ver- ymbols zu einer Ziffer beruht. Es ist klar, wenn ich beispielsweise einmal  einem Symbol eine Zahl zugeordnet habe kann ich ihm ja nicht etwa die leere  Zahl zuordnen. Wenn sich die Zuordnung als widerspruechlich herausstellt,  ordne ich dem Symbol de Gleichung. Das fuenfte Byte der Gleichung ergibt jeweils das Rechenzeichen.   Auswahl: Diese Variable gibt an, ob eine Ziffer fuer eine Variable in Frage  kommt.   Hypothese: Diese Variable gibt an, auf wie viel Annahmen die Zuordnung eines  Sckigen Klammern beim  Compilieren ausgegeben. - gl.)   Wesentliche Variablen  ---------------------   Im String Glei sind die 6 Gleichungen gespeichert, und zwar mit je 13 Byte je vor. Das Programm rechnet auch mit gewoehnlichen Integers.  Beispiel: xxxx * xxxx = xxx  fuehrt unweigerlich zum Zusammenbruch, weil das Ergebnis zu viele Stellen hat.    Nachspann  ---------   Sonst noch Fragen?  Ja, ich habe noch eine Frage.   Bitte.   Herr Bauer, kann man aus der Deklaration:  "VAR Frei: ARRAY[Zweifel] OF Sozi" schliessen, dass Sie ein Fan von  Franz Josef Strauss sind?   Nein!   Sie haben anfangs erwaehnt, sie wollten nie wieder denken. Geben Sie  zu:  {Dieses Programm ist zur privaten Benutzung und zur Herstellung kostenloser }  {Kopien davon freigegeben. Voraussetzung fuer die vorgenannte Freigabe ist, }  {dass bei Kopien - auch wenn an dem Programm Aenderungen vorgenommen wurden - }  {dieser e aus dem Textfile den DLE-Code und die Einrueckbytes entfernen. Dazu ist }  { das Programm DLE-Strip von der Diskette API.3: geeignet. (gl.)} !  {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++} - }  { zeugen. Die Eingaben fuer das Programm Gonggong erzeugen Sie am leich- }  { testen, wenn Sie sich ein Exec-File machen. Einige Beispiele sind auch auf }  { dieser Diskette enthalten. Um Ihr Exec-File lauffaehig zu machen, muessen }  { Si. Bei der }  { Grafik sehen Sie, wie Sie mit einem selbst definierten Character-Set neue }  { Symbole auf den Bildschirm bringen koennen. Die Symbole koennen Sie mit dem }  { Characterset-Editor, der auf der Diskette API.6: veroeffentlicht wurde, er{$C Michael Bauer, AUGE-M 134 }  8{PROGRAM Gonggong - Version 2 } 8{=============================}   { Mit diesem Programm von Herrn Michael Bauer koennen Sie Bilderraetsel }  { loesen, so wie sie z. B. in der Zeitschrift Gong gebracht werdenO^ææ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  Sie haben gedacht, als Sie das Programm machten!   Ich gestehe.   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  Michael Bauer (M134)  Ludwig-Thoma-Str. 32, 8830 Treuchtlingen Hinweis und Urheberrechtsvermerke mit uebertragen werden. Bei der Be- }  {nutzung von einzelnen Funktionen und Prozeduren in anderen Programmen muessen}  {alle Hinweise auf diejenigen, welche diese Programmteile erstellt und geaen- }  {dert haben, und die laufende Versionsnummer mit uebernommen werden (z.B. hin-}  {ter dem BEGIN einer Funktion oder Prozedur: M270, M384 V2 ). }  { }  {Bei Aenderungen am Programm$moeglich : BOOLEAN; {vielleicht haltbare Annahmen} $Frei : ARRAY[Zweifel] OF Sozi; {freie Ziffern} $ch : CHAR; {das ganz harmlose fuer ein READ} $letztes_Symbol: CHAR;    FUNCTION Key: BOOLEAN;  TYPE Bytes = PACKED ARRAY[0..1] OF 0..2pothesenanzahl}  G : STRING; {6 Gleichungen ohne Umformung} $Gl : STRING; {Mit Addition, Multiplikation} $Glei : STRING; {uebergebene sechs Gleichungen} $Laenge : ARRAY[1..6, 1..3] OF INTEGER; {Zahlen-} ; {An dem die Symbole stehen} $Fuehrend : SET OF Symbol; $Auswahl : ARRAY[Symbol] OF Sozi; {voellig sicher} $Wert : ARRAY[Symbol] OF Ziffer; {Hypothetisch} $Hypothese: ARRAY[Symbol] OF Zweifel; {Wertangabe} $Niveau : Zweifel; {momentane Hyl = 0..9; /{Zweifel= 0 bedeutet Sicherheit, /Zweifel = 9 bedeutet Unklarheit, /Zweifel = k bedeutet: Die Aussage ;beruht auf k Annahmen}  Ort = RECORD 1x, y: INTEGER; /END; %Arr48Ort= ARRAY[1..48] OF Ort;   VAR Pos : Arr48Ort {Include-File Gong.1 - Anfang}  {$s+}   PROGRAM Gonggong;   USES TURTLEGRAPHICS;    TYPE Ziffer = 0..9; %Sozi = SET OF Ziffer; {sehr verdaechtiger Typ} %Symbol = 'a'..'k'; %Erfolg = (nichts_Neues, Widerspruch, Neuigkeiten); %ZweifeO^ææbereits im voraus fuer Ihre Beitraege zur Programmpflege. } {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}   {$I :GONG.1}  {$I :GONG.2}  steller des Ursprungsprogramms begruessenswert. Ebenfalls sollten }  {festgestellte Fehler sowie Verbesserungen der Redaktion der API Disketten }  {mitgeteilt werden. }  {Wir danken Ihnen  {Mitgliedsnummer in der Apple User Group Europe e.V. oder sein Namenskuerzel }  {zwischen der Versionsnummer und der davorstehenden Mitgliedsnummer einfuegen.}  {Zur Fortschreibung der Programme waere eine Uebersendung der neuen Fassung an}  {den Her sollte die Versionsnummer des Programms hochge- }  {zaehlt werden und der Verfasser der Aenderung sollte bei den geaenderten }  {Funktionen und Prozeduren ebenfalls die Versionsnummer erhoehen und seine } 55; %Intzeig = RECORD CASE BOOLEAN OF 1TRUE: (int: INTEGER); 1FALSE: (Zeig: ^BYTES); /END;  VAR Kbd: Intzeig;   BEGIN { Key } { M134 V2 } "Kbd.int := -16384; "Key := Kbd.Zeig^[0] > 127;  END; { Key }    PROCEDURE Pause(i: INTEGER);  VAR h: INTEGER;   BEGIN { Pause } { M134 V2 } "FOR h := 1 TO i * 10 DO;  END; { Pause }    FUNCTION By(i, j, k: INTEGER): INTEGER;   BEGIN { By } { M134 V2 } "IF j = 1 THEN By := (i - 1) * 13 + k +ELSE By := (i - 1) * 13 + k + 1 + (j - 1) * 4; $von_bis(45, 45, 31, 4); $von_bis(46, 46, 36, 1); $von_bis(47, 47, 37, 3); $von_bis(48, 48, 38, 5); "END; { Calc_Pos } " " "PROCEDURE Information; "VAR i, j: INTEGER; " "BEGIN { Information } { M134 V2 } $Zu_Sy := ['D', 'I', 'K', 'O', 'P', 'Q',1); $von_bis(14, 14, 10, 2); $von_bis(15, 15, 6, 2); $von_bis(16, 16, 2, 2); $von_bis(17, 25, 16, 3); $von_bis(26, 29, 15, 3); $von_bis(30, 38, 29, 5); $von_bis(39, 42, 28, 5); $von_bis(43, 43, 39, 4); $von_bis(44, 44, 35, 4); $VAR i: INTEGER; $ $BEGIN { von_bis } { M134 V2 } &FOR i := von TO bis DO &BEGIN (Pos[i].x := (i - n_x) * 15; (Pos[i].y := 170 - n_y * 15; &END; $END; { von_bis } & "BEGIN { Calc_Pos } { M134 V2 } $von_bis( 1, 9, 0, 1); $von_bis(10, 13, -1, y + 9); $MOVETO(x + 1, y + 9); $MOVETO(x - 2 ,y + 6); $MOVETO(x - 2, y + 1); $MOVETO(x + 1 ,y - 2); $PENCOLOR(NONE); $MOVETO(x, y); "END; { Huelle } $ " "PROCEDURE Calc_Pos(VAR Pos: Arr48Ort); " $PROCEDURE von_bis(von, bis, n_x, n_y: INTEGER); "VAR x, y: INTEGER; " "BEGIN { Huelle } { M134 V2 } $x := Pos[i].x; y := Pos[i].y; $PENCOLOR(NONE); $MOVETO(x, y - 1); $PENCOLOR(WHITE); $MOVETO(x + 1, y - 2); $MOVETO(x + 5, y - 2); $MOVETO(x + 8, y + 1); $MOVETO(x + 8, y + 6); $MOVETO(x + 5, } " " "PROCEDURE PString(VAR i, j: INTEGER; Sperr: INTEGER; S: STRING); "VAR k: INTEGER; " "BEGIN { PString } { M134 V2 } $FOR k := 1 TO LENGTH(S) DO Pchar(i, j, Sperr, S[k]); "END; { PString } " " "PROCEDURE Huelle(i: INTEGER); R i, j: INTEGER; Sperr: INTEGER; Ch: CHAR); "VAR K: INTEGER; " "BEGIN { Pchar } { M134 V2 } $k := i + Sperr + 1 + P_set[ORD(Ch)]; $IF k > 279 THEN $BEGIN &K := K - i; i := 0; j := j - 10; $END; $MOVETO(i, j); $WCHAR(Ch); $i := K; "END; { Pchar ap.Adr := -22018; ${$I-} $RESET(Charfile, Pname); $IF IORESULT > 0 THEN EXIT(Pload); ${$I+} $Speicher.Adr := Top_of_Empty_Heap.Ptr^; $Speicher.Ptr^ := Charfile^; $P_set := Speicher.Ptr^; $CLOSE(Charfile); "END; { Pload } " " "PROCEDURE Pchar(VA1FALSE:(Ptr: ^Charset); /END; 'Izeig = RECORD /CASE BOOLEAN OF 1TRUE: (Adr: INTEGER); 1FALSE:(Ptr: ^INTEGER); /END; / "VAR Charfile: FILE OF Charset; &Speicher: Czeig; &Top_of_Empty_Heap: Izeig; " "BEGIN { Pload } { M134 V2 } $Top_of_Empty_He, Zulaess: SET OF CHAR; $Operator, Erst, Letzt: SET OF 1..42; $ "PROCEDURE Pload(Pname: STRING; VAR P_set: Charset); "{Diese Procedure laedt ein Charset mit Proportionalschrift.} "TYPE Czeig = RECORD /CASE BOOLEAN OF 1TRUE: (Adr: INTEGER);   PROCEDURE Gongein(VAR G: STRING);   TYPE Charset = PACKED ARRAY[0..1023] OF 0..255; %  VAR Pset: Charset; $i : Integer; $S : STRING; {enthaelt die 42 einzugebenden Zeichen} $GC : ARRAY[CHAR] OF CHAR; {Gong-Chars} $Zu_Sy, Zu_Sy_Sp, Zu_OpAT('0000', xs); "c := xs[k + LENGTH(xs) - 4]; "Stelle := ORD(c) - ORD('0');  END; { Stelle }    FUNCTION Fuehr_Sym(i, j: INTEGER): Symbol;   BEGIN { Fuehr_Sym } { M134 V2 } "Fuehr_Sym := Glei[By(i, j, 5) - Laenge[i, j]];  END; { Fuehr_Sym }  "gesetzt := Hypothese[s] <= Niveau;  END; { gesetzt }    FUNCTION Stelle(x, k: INTEGER): INTEGER;  VAR xs: STRING; $c: CHAR;  {Wir haben vierstellige Zahlen, vorne sind Nullen ergaenzt}   BEGIN { Stelle } { M134 V2 } "STR(x, xs); "xs := CONC END; { By }    FUNCTION bekannt(i, j, k: INTEGER): BOOLEAN;   BEGIN { bekannt } { M134 V2 } "bekannt := Hypothese[Glei[By(i, j, k)]] <= Niveau;  END; { bekannt }    FUNCTION gesetzt(s: Symbol): BOOLEAN;   BEGIN { gesetzt } { M134 V2 } 'S', 'U', 'V', 'Z']; $Zu_Sy_Sp := Zu_Sy + [' ']; $Zu_Op := ['+', '-', '*', '/']; $Operator := [5, 14, 15, 16, 21, 34]; $Erst := [1, 6, 10, 17, 22, 26, 30, 35, 39]; $Letzt := [4, 9, 13, 20, 25, 29, 33, 38, 42]; $Pload('GONG.CHARSET', PSET); $GC['D'] := CHR(16); GC['I'] := CHR(17); GC['K'] := CHR(18); $GC['O'] := CHR(19); GC['P'] := CHR(20); GC['Q'] := CHR(21); $GC['S'] := CHR(22); GC['U'] := CHR(23); GC['V'] := CHR(24); $GC['Z'] := CHR(25); GC['*'] := CHR(26); GC['/'] := CHR(27); $GC['+'] := CHR$FOR ch := ' ' TO 'Z' DO Wert[ch] := 0; $FOR i := 1 TO 6 DO $BEGIN &FOR j := 1 TO 3 DO &BEGIN (IF j = 3 THEN w := 1 ELSE w := 2; (FOR k := 1 TO 4 DO *Wert[Gl[By(i, j, k)]] := Wert[Gl[By(i, j, k)]] + w * k; &END; $END; "END; { Bewerte / Benenne uRRAY[' '..'Z'] OF INTEGER; $Zugeordnetes: ARRAY['D'..'Z'] OF 'a'..'k'; $z, q: Zeig; $Heap: ^INTEGER; $neues_Zeichen: CHAR; $i: INTEGER;  "PROCEDURE Bewerte; "VAR i, j, k: INTEGER; &w: INTEGER; &ch: CHAR; " "BEGIN { Bewerte } { M134 V2 } me um } { M134 V2 } "Gl := G; "FOR i := 1 TO 6 DO "Tausche_aus(i);  END; { Forme um }     PROCEDURE Benenne_um(Gl: STRING; VAR Glei: STRING);   TYPE Zeig = ^Baum; %Baum = Record .Zeich: Char; .links, .rechts: Zeig; ,END;   VAR Wert: Ache_aus } { M134 V2 } $Op := G[By(i, 2, 0)]; $IF Op IN ['+', '*'] THEN EXIT(Tausche_aus); $FOR j := 1 TO 4 DO $BEGIN &Gl[By(i, 1, j)] := G[By(i, 3, j)]; &Gl[By(i, 3, j)] := G[By(i, 1, j)]; $END; "END; { Tausche_aus / Forme um } "   BEGIN { For"BEGIN $MOVETO(Pos[i].x, Pos[i].y); $Wchar('='); "END; "Info; "Ein(G);  END; { Gongein }    PROCEDURE Forme_Um(G: STRING; VAR Gl: STRING);  VAR Op: CHAR; $i: INTEGER;  "PROCEDURE Tausche_aus(i: INTEGER); "VAR j: INTEGER; " "BEGIN { Taus Gongein } { M134 V2 } "WRITELN('Bitte auf Grafik schalten!'); "INITTURTLE; "calc_pos(Pos); "Information; "FOR i := 1 TO 42 DO "BEGIN $MOVETO(Pos[i].x, Pos[i].y); $IF i IN Operator $THEN Wchar('x') $ELSE Huelle(i); "END; "FOR i := 43 TO 48 DO 13), 0COPY(S, 30, 13), 0COPY(S, 1, 4), COPY(S, 14, 1), COPY(S, 17, 4), COPY(S, 30, 4), 0COPY(S, 6, 4), COPY(S, 15, 1), COPY(S, 22, 4), COPY(S, 35, 4), 0COPY(S, 10, 4), COPY(S, 16, 1), COPY(S, 26, 4), COPY(S, 39, 4)); "END; { Ein }    BEGIN {1) THEN c := S[i]; (IF c = CHR(8) (THEN IF i > 1 -THEN BEGIN 4i := i - 1; 4Zulaessig(i); 2END; &UNTIL c IN Zulaess; &S[i] := c; &MOVETO(Pos[i].x, Pos[i].y); &Wchar(GC[c]); &i := i + 1 $UNTIL i = 43; $G := CONCAT(COPY(S, 1, 13), 0COPY(S, 17, &Zulaessig(i); &REPEAT (REPEAT *Pause(10); *MOVETO(Pos[i].x, Pos[i].y); *Wchar(CHR(31)); *Pause(10); *MOVETO(Pos[i].x, Pos[i].y); *Wchar(' '); (UNTIL Key; (READ(c); (IF c IN ['a'..'z'] THEN c := CHR(ORD(c) + ORD('A') - ORD('a')); (IF c = CHR(2; $PChar(i, j, 3, GC['Z']); $PString(i, j, 2, 'Zweifach'); "END; { Info } " " " "PROCEDURE Ein(VAR G: STRING); "VAR i: INTEGER; &c: CHAR; " "BEGIN { Ein } { M134 V2 } $S := ' '; $i := 1; $REPEAT "  "BEGIN { Info } { M134 V2 } $i := 0; j := 60; $W(i, j, 'Dreieck'); $W(i, j, 'I'); $W(i, j, 'Kringel'); $W(i, j, 'Oben'); $W(i, j, 'Punkt'); $i := 0; j := j - 15; $W(i, j, 'Quer'); $W(i, j, 'Schmetterling'); $W(i, j, 'U'); $W(i, j, 'Voll')Sp 3ELSE Zulaess := Zu_Sy; "END; { Zulaessig } " " "PROCEDURE Info; "VAR i, j: INTEGER; " $PROCEDURE W(VAR i, j: INTEGER; S: STRING); $ $BEGIN { W } { M134 V2 } &Pchar(i, j, 3, GC[S[1]]); &Pstring(i, j, 2, CONCAT(S, ', ')); $END; { W / Info } "PROCEDURE Zulaessig(i: INTEGER); " "BEGIN { Zulaessig } { M134 V2 } $IF i IN Operator $THEN Zulaess := Zu_Op $ELSE IF i IN Erst )THEN Zulaess := Zu_Sy_Sp )ELSE IF i IN Letzt .THEN Zulaess := Zu_Sy .ELSE IF S[i - 1] = ' ' 3THEN Zulaess := Zu_Sy_(28); GC['-'] := CHR(29); GC[' '] := CHR(32); $i := 60; j := 183; $Pstring(i, j, 2, 'Gong-Zahlenr{tsel'); $TURN(270); MOVE(2); TURNTO(180); MOVE(6); $PENCOLOR(WHITE); MOVETO(60, 181); PENCOLOR(NONE); "END; { Information } " " m } " " "PROCEDURE Char_ein(c: CHAR; VAR q: Zeig); " "BEGIN { Char_ein } { M134 V2 } $NEW(q); $q^.links := NIL; $q^.rechts := NIL; $q^.Zeich := c; "END; { Charein / Benenne um } " " "PROCEDURE Fuege_ein(VAR z: Zeig); " "BEGIN { Fuege_ein } { M134 V2 } $IF z = NIL $THEN z := q $ELSE IF Wert[q^.Zeich] > Wert[z^.Zeich] )THEN Fuege_ein(z^.links) )ELSE Fuege_ein(z^.rechts) "END; { Fuege ein / Benenne um } " " "PROCEDURE Ausgabe(z: Zeig); " "BEGIN { Ausgabe } { M134 V2 } $IF Z <> NIL &l := 1; &WHILE Glei[By(i, j, l)] = 'k' DO l := l + 1; &Fuehrend := Fuehrend + [Glei[By(i, j, l)]]; &Fuehr := 5 - l; $END; { Fuehr / Fuehrende Symbole und Zahllaengen / Anfangserkenntnisse } $ $ "BEGIN { Symbole_fuehrende_und_Zahllaengen_ermitteln 0; "END; { Unsicherheit_am_Anfang / Anfangserkenntnisse } " " "PROCEDURE Symbole_fuehrende_und_Zahllaengen_ermitteln; "VAR i, j: INTEGER; &c: Symbol; " $FUNCTION Fuehr(i, j: INTEGER):INTEGER; $VAR l: INTEGER; $ $BEGIN { Fuehr } { M134 V2 } t symbol / Anfangserkenntnisse } " " "PROCEDURE Unsicherheit_am_Anfang; "VAR c: Symbol; " "BEGIN { Unsicherheit_am_Anfang } { M134 V2 } $FOR c := 'a' TO letztes_Symbol DO Hypothese[c] := 9; {voellig zweifelhaft} $Hypothese['k'] := 0; $Wert['k'] :=e;  "PROCEDURE last_symbol; "VAR i: INTEGER; " "BEGIN { last symbol / Anfangserkenntnisse } { M134 V2 } $letztes_Symbol := 'a'; $FOR i := 1 TO 78 DO $IF (Glei[i] > letztes_Symbol) AND (Glei[i] <> 'k') $THEN letztes_Symbol := Glei[i]; "END; { las {Include-File Gong.2 - Anfang}   PROCEDURE Trage_ein(s: Symbol; i: Ziffer);   BEGIN { Trage ein } { M134 V2 } "Wert[s] := i; "Hypothese[s] := Niveau; "Frei[Niveau] := Frei[Niveau] - [i];  END; { Trage ein }    PROCEDURE AnfangserkenntnissO^ææDO IF Gl[i] = ' ' THEN Glei[i] := 'k';  END; { Benenne_um }   {Include File Gong.1 - Ende}   ASE(Heap); "END; { Sortiere / Benenne um } " "  BEGIN { Benenne_um } { M134 V2 } "Sortiere; "Glei := Gl; "FOR i := 1 TO 78 DO "IF Gl[i] IN ['D', 'I', 'K', 'O', 'P', 'Q', 'S', 'U', 'V', 'Z'] "THEN Glei[i] := Zugeordnetes[Gl[i]]; "FOR i := 1 TO 78 "BEGIN { Sortiere } { M134 V2 } $Bewerte; $MARK(Heap); $z := NIL; $FOR c := 'D' TO 'Z' DO $IF c IN ['D', 'I', 'K', 'O', 'P', 'Q', 'S', 'U', 'V', 'Z'] $THEN $BEGIN &Char_ein(c, q); &Fuege_ein(z); $END; $neues_Zeichen := 'a'; $Ausgabe(z); $RELE$THEN $BEGIN &Ausgabe(z^.links); &Zugeordnetes[z^.Zeich] := neues_Zeichen; &neues_Zeichen := SUCC(neues_Zeichen); &Ausgabe(z^.rechts); $END; "END; { Ausgabe / Benenne um } " " "PROCEDURE Sortiere; "VAR c: CHAR; " / Anfangserkenntnisse } ({ M134 V2 } $Fuehrend := []; $FOR i := 1 TO 6 DO &FOR j := 1 TO 3 DO Laenge[i, j] := Fuehr(i, j); $FOR c := 'a' TO letztes_Symbol DO $IF c IN Fuehrend $THEN Auswahl[c] := [1..9] $ELSE Auswahl[c] := [0..9]; "END; { Symbole_fuehrende_und_Zahllaengen_ermitteln / Anfangserkenntnisse } " " "PROCEDURE Nullen_am_Schluss; "VAR i: INTEGER; &c, s: Symbol; " "BEGIN { Nullen_am_Schluss / Anfangserkenntnisse } { M134 V2 } $FOR i := 1 TO 6 DO $IF Glei[By(i, 1, 5)] IN ['+', '-']2THEN BEGIN {erste kuerzer, zweite und dritte gleich lang} 9IF limit.up[f2] >= luf3 9THEN BEGIN @limit.up[f2] := limit.up[f3] - 1; @Vergleich := TRUE; >END; 9IF limit.lo[f3] <= limit.lo[f2] 9THEN BEGIN @limit.lo[f3] := limit.lo[f2] + 1; @Vergleic ;Vergleich := TRUE; 9END; 4IF limit.lo[f3] <= limit.lo[f1] 4THEN BEGIN ;limit.lo[f3] := limit.lo[f1] + 1; ;Vergleich := TRUE; 9END; 2END {zweite kuerzer, erste und dritte gleich lang} -ELSE IF (Laenge[i, 2] = Laenge[i, 3]) AND (f2 <> f3) UE; 2END; +END {alle gleich lang} &ELSE BEGIN {unterschiedlich lang} -IF (Laenge[i, 1] = Laenge[i, 3]) AND (f1 <> f3) -THEN BEGIN {zweite kuerzer, erste und dritte gleich lang} 4IF limit.up[f1] >= luf3 4THEN BEGIN ;limit.up[f1] := limit.up[f3] - 1; luf3 - 1; 4Vergleichen := TRUE; 2END; -IF limit.lo[f3] <= limit.lo[f1] -THEN BEGIN 4limit.lo[f3] := limit.lo[f1] + 1; 4Vergleichen := TRUE; 2END; -IF limit.lo[f3] <= limit.lo[f2] -THEN BEGIN 4limit.lo[f3] := limit.lo[f2] + 1; 4Vergleichen := TR&IF (Laenge[i, 1] = Laenge[i, 2]) AND (Laenge[i, 2] = Laenge[i, 3]) &THEN BEGIN {alle 3 gleich lang} -IF limit.up[f1] >= luf3 -THEN BEGIN 4limit.up[f1] := luf3 - 1; 4Vergleichen := TRUE; 2END; -IF limit.up[f2] >= luf3 -THEN BEGIN 4limit.up[f2] :=e } { M134 V2 } &Vergleichen := FALSE; &IF Glei[By(i, 1, 5)] IN ['*', '/'] THEN EXIT(Vergleichen); &f1 := Fuehr_Sym(i, 1); &f2 := Fuehr_Sym(i, 2); &f3 := Fuehr_Sym(i, 3); &luf3 := limit.up[f3]; bol] OF Ziffer; 1END; "VAR limit: Grenzen; &i, j: INTEGER; &c: Symbol; &Alt: ARRAY[1..6] OF BOOLEAN; " $FUNCTION Vergleichen(i: INTEGER): BOOLEAN; $VAR f1, f2, f3: Symbol; (luf3: Ziffer; $ $BEGIN { Vergleichen / lokal_ordnen / Anfangserkenntniss'] &THEN Auswahl[s] := Auswahl[s] * [0, 2, 4, 6, 8] &ELSE Auswahl[s] := Auswahl[s] * [0, 1, 4, 5, 6, 9]; $END; "END; { Gerade_Zahlen_bzw_014569_erkennen / Anfangserkenntnisse } " " "PROCEDURE lokal_ordnen; "TYPE Grenzen = RECORD 3up, lo: ARRAY[Sym"VAR i: INTEGER; &s, c: Symbol; " "BEGIN { Gerade_Zahlen_bzw_014569_erkennen / Anfangserkenntnisse } { M134 V2 } $FOR i := 1 TO 6 DO $IF Glei[By(i, 1, 4)] = Glei[By(i, 2, 4)] $THEN $BEGIN &s := Glei[By(i, 3, 4)]; &IF Glei[By(i, 1, 5)] IN ['+', '-etztes_Symbol DO /IF c = s /THEN Auswahl[c] := [1] /ELSE Auswahl[c] := Auswahl[c] - [1]; -EXIT(Einsen_fuehrende_erkennen); +END; $END; "END; { Einsen_fuehrende_erkennen / Anfangserkenntnisse } " " "PROCEDURE Gerade_Zahlen_bzw_014569_erkennen; 2 } $FOR i := 1 TO 6 DO $IF Glei[By(i, 1, 5)] IN ['+', '-'] $THEN $BEGIN &IF (Laenge[i, 1] < Laenge[i, 3]) AND (Laenge[i, 2] < Laenge[i, 3]) &THEN BEGIN -s := Glei[By(i, 3, 5 - Laenge[i, 3])]; -Wert[s] := 1; -Hypothese[s] := 0; -FOR c := 'a' TO lahl[c] - [0]; -EXIT(Nullen_am_Schluss); +END; $END; "END; { Nullen_am_Schluss / Anfangserkenntnisse } " " "PROCEDURE Einsen_fuehrende_erkennen; "VAR i: INTEGER; &c, s: Symbol; " "BEGIN { Einsen_fuehrende_erkennen / Anfangserkenntnisse } { M134 V-EXIT(Nullen_am_Schluss); +END &ELSE &IF Glei[By(i, 2, 4)] = Glei[By(i, 3, 4)] &THEN BEGIN -s := Glei[By(i, 1, 4)]; -Wert[s] := 0; -Hypothese[s] := 0; -FOR c := 'a' TO letztes_Symbol DO /IF c = s /THEN Auswahl[c] := [0] /ELSE Auswahl[c] := Ausw $THEN $BEGIN &IF Glei[By(i, 1, 4)] = Glei[By(i, 3, 4)] &THEN BEGIN -s := Glei[By(i, 2, 4)]; -Wert[s] := 0; -Hypothese[s] := 0; -FOR c := 'a' TO letztes_Symbol DO /IF c = s /THEN Auswahl[c] := [0] /ELSE Auswahl[c] := Auswahl[c] - [0]; h := TRUE; >END; 7END; {erste kuerzer, zweite und dritte gleich lang} +END; {unterschiedlich lang} $END; { Vergleichen / lokal_ordnen / Anfangserkenntnisse } $ $ "BEGIN { lokal_ordnen / Anfangserkenntnisse } { M134 V2 } $FOR c := 'a' TO letztes_Symbol DO $BEGIN &limit.up[c] := 0; &limit.lo[c] := 9; &FOR i := 0 TO 9 DO &BEGIN (IF (i IN Auswahl[c]) AND (i < limit.lo[c]) (THEN limit.lo[c] := i; (IF (i IN AUSWAHL[c]) AND (i > limit.up[c]) (THEN limit.up[c] := i &END; {i} $END; {c, limits - An2END; {b} 0END; {Laenge passt, vergleichen} )END; {nicht voll1 oder nicht voll2} "END; { compare / Test } " "  BEGIN { Test } { M134 V2 } "express(i, 1, val1, len1, voll1); "IF len1 = 0 "THEN BEGIN )Test := nichts_Neues; )EXIT(Test); 'END; "E 4THEN BEGIN ;IF Stelle(valber, k) <> Wert[Glb] ;THEN neg_compare; 9END 4ELSE IF Stelle(valber, k) IN Frei[Niveau] * Auswahl[Glb] 9THEN BEGIN @Trage_ein(Glb, Stelle(valber, k)); @compare := Neuigkeiten; >END 9ELSE neg_compare; 4k := k - 1; en1 ELSE lenmin := len2; +STR(valber, str3); +IF LENGTH(str3) > Laenge[i, 3] +THEN neg_compare +ELSE BEGIN {Laenge passt, vergleichen} 2Anf := By(i, 3, 4); 2k := 4; 2FOR b := Anf DOWNTO Anf - lenmin + 1 DO 2BEGIN 4Glb := Glei[b]; 4IF gesetzt(Glb)N GTrage_ein(Glb, Stelle(valber, k)); Gcompare := Neuigkeiten; GEND @ELSE neg_compare; >END; 9k := k - 1; 7END; {b} 5END; {Laenge passt, vergleichen} .END {nicht voll 3} $ELSE BEGIN {nicht voll1 oder nicht voll2} +IF len1 < len2 THEN lenmin := l7k := 4; 7FOR b := Anf DOWNTO Anf - Laenge[i, 3] + 1 DO 7BEGIN 9Glb := Glei[b]; 9IF gesetzt(Glb) 9THEN BEGIN @IF Stelle(valber, k) <> Wert[Glb] @THEN negcompare; >END 9ELSE BEGIN @IF Stelle(valber, k) IN CFrei[Niveau] * Auswahl[Glb] @THEN BEGIl3 .THEN BEGIN 5compare := nichts_Neues; 5EXIT(compare); 3END .ELSE neg_compare )ELSE BEGIN {not Voll3} 0STR(valber, str3); 0IF LENGTH(str3) <> Laenge[i, 3] 0THEN neg_compare 0ELSE BEGIN {Laenge passt, vergleichen} 7Anf := By(i, 3, 4); g_compare; $ $BEGIN { neg_compare } { M134 V2 } &compare := Widerspruch; &EXIT(compare); $END; { neg compare / compare } ( $ "BEGIN { compare / Test } { M134 V2 } $compare := nichts_Neues; $IF voll1 and voll2 $THEN IF Voll3 )THEN IF valber = va> 'k') 4THEN BEGIN ;Value := Value + 1000 * Wert[Glb]; ;len := 4; 9END; 2END; +END; $END; $voll := len = Laenge[i, j]; "END; { express / Test } " " "FUNCTION compare: Erfolg; "VAR b, Anf: INTEGER; &Glb: CHAR; &str3: STRING; " $PROCEDURE ne&THEN BEGIN -Value := Value + 10 * Wert[Glb]; -Glb := Glei[b - 2]; -len := 2; -IF (Hypothese[Glb] <= Niveau) AND (Glb <> 'k') -THEN BEGIN 4Value := Value + 100 * Wert[Glb]; 4Glb := Glei[b - 3]; 4len := 3; 4IF (Hypothese[Glb] <= Niveau) AND (Glb < * 4; $IF j > 1 THEN b := b + 1; $Glb := Glei[b]; $IF Hypothese[Glb] > Niveau $THEN BEGIN +len := 0; +Value := 0; )END $ELSE $BEGIN &Value := Wert[Glb]; &Glb := Glei[b - 1]; &len := 1; &IF (Hypothese[Glb] <= Niveau) AND (Glb <> 'k') , len2, val3, len3, lenmin, valber: INTEGER; $voll1, voll2, voll3: BOOLEAN;  "PROCEDURE express(i, j: INTEGER; VAR Value, len: INTEGER; VAR voll: BOOLEAN); "VAR b: INTEGER; &Glb: CHAR; " "BEGIN { express / Test } { M134 V2 } $b := (i - 1) * 13 + jhlenlaengen_ermitteln; "Nullen_am_Schluss; "Einsen_fuehrende_erkennen; "Gerade_Zahlen_bzw_014569_erkennen; "lokal_ordnen;  END; { Anfangserkenntnisse }    FUNCTION Test(i: INTEGER): Erfolg;  VAR t: Erfolg; $j, k: INTEGER;  val1, len1, val2/Auswahl[c] := Auswahl[c] * [limit.lo[c]..limit.up[c]]; -EXIT(lokal_ordnen); +END; $END; "END; { lokal_ordnen / Anfangserkenntnisse } "   BEGIN { Anfangserkenntnisse } { M134 V2 } "last_symbol; "Unsicherheit_am_Anfang; "Symbole_fuehrende_und_Zafangswerte} $FOR j := 1 TO 60 DO $BEGIN &i := (j - 1) MOD 6 + 1; &Alt[i] := Vergleichen(i); &IF NOT (Alt[1] OR Alt[2] OR Alt[3] OR Alt[4] OR Alt[5] OR Alt[6]) )AND (j >= 6) &THEN BEGIN -FOR c := 'a' TO letztes_Symbol DO xpress(i, 2, val2, len2, voll2); "IF len2 = 0 "THEN BEGIN )Test := nichts_Neues; )EXIT(Test); 'END; "Express(i, 3, val3, len3, voll3); "IF Glei[By(i, 1, 5)] IN ['+', '-'] "THEN valber := val1 + val2 "ELSE valber := val1 * val2; "Test := compare;  END; { Test }    PROCEDURE Folgere(VAR moeglich: BOOLEAN);  VAR Ausgang: ARRAY[1..6] OF Erfolg; $i, j: INTEGER; $alt: BOOLEAN;  "PROCEDURE Ganz_alt; "VAR k: INTEGER; " "BEGIN { ganz alt / folgere } { M134 V2 } $alt := TRUE; $FOR k := 1 TO2ELSE Versuche_zu_setzen(SUCC(s)); + Loesche_aus(Niveau); -Senke(Niveau); +END; $END; {i} "END; {nicht gesetzt}  END; { Versuche_zu_setzen }    PROCEDURE Cursor_blinken;   BEGIN { Cursor_blinken } { M134 V2 } "MOVETO(1, 1); WCHAR('-'); "PO $BEGIN {i} &IF i IN Frei[Niveau] * Auswahl[s] &THEN BEGIN -Erhoehe(Niveau); -Frei[Niveau] := Frei[Niveau - 1]; -Trage_ein(s, i); -Folgere{ob}(moeglich); -IF NOT moeglich -THEN Loesche_aus(Niveau) -ELSE IF s = letztes_Symbol 2THEN Gib_aus Frei[Niveau - 1]; "END; { Loesche_aus / Versuche_zu_setzen }    BEGIN { Versuche_zu_setzen } { M134 V2 } "IF gesetzt(s) "THEN IF s = letztes_Symbol 'THEN Gib_aus 'ELSE Versuche_zu_setzen(SUCC(s)) "ELSE "BEGIN {nicht gesetzt} $FOR i := 0 TO 9 Dke / Versuche_zu_setzen } " " "PROCEDURE Loesche_aus(Niveau: Zweifel); "VAR c: Symbol; " "BEGIN { Loesche_aus / Versuche_zu_setzen } { M134 V2 } $FOR c := 'a' TO letztes_Symbol DO $IF Hypothese[c] = Niveau THEN Hypothese[c] := 9; $Frei[Niveau] := "PROCEDURE Erhoehe(VAR Niveau: Zweifel); " "BEGIN { Erhoehe } { M134 V2 } $Niveau := Niveau + 1; "END; { Erhoehe / Versuche_zu_setzen } " " "PROCEDURE Senke(VAR Niveau: Zweifel); " "BEGIN { Senke } { M134 V2 } $Niveau := Niveau - 1; "END; { Sen-b := By(i, j0, k); -IF i > 1 THEN b := b + 3; -MOVETO(Pos[b].x, Pos[b].y); -WCHAR(CHR(Wert[Glei[By(i, j, k)]] + ORD('0'))); +END; $END; {j0}  END; { Gib_aus }    PROCEDURE Versuche_zu_setzen(s: Symbol);  VAR i: Ziffer;  s;  VAR i, j0, j, k, b: INTEGER;   BEGIN { Gib_aus } { M134 V2 } "FOR i := 1 TO 3 DO $FOR j0 := 1 TO 3 DO $BEGIN &IF Glei[By(i, 1, 5)] IN ['-', '/'] &THEN j := 4 - j0 &ELSE j := j0; &FOR k := 1 TO 4 DO &IF Glei[By(i, j, k)] <> 'k' &THEN BEGIN --':12); "WRITELN; "ausglei(1); "WRITELN(Glei[By(4, 1, 5)]:4, Glei[By(5, 1, 5)]:7, Glei[By(6, 1, 5)]:7); "ausglei(2); "WRITELN('=':4, '=':7, '=':7); "ausglei(3); "WRITELN;  END; { Gib_aus }   Ausgabe auf dem Textschirm *)    PROCEDURE Gibau+WRITELN; )END $ELSE BEGIN +aus(i, 3); +WRITE(' ', op, ' '); +aus(i, 2); +WRITE(' = '); +aus(i, 1); +WRITELN; )END; "END; { ausglei / Gib_aus } )   BEGIN { Gib_aus } { M134 V2 } "WRITELN; "WRITELN; "WRITELN('Loesung':12); "WRITELN('-----_aus } " " "PROCEDURE ausglei(i: INTEGER); "VAR j: INTEGER; &op: CHAR; " "BEGIN { ausglei } { M134 V2 } $op := Glei[By(i, 1, 5)]; $IF op IN ['+', '*'] $THEN BEGIN +aus(i, 1); +WRITE(' ', op, ' '); +aus(i, 2); +WRITE(' = '); +aus(i, 3); auf dem Textschirm  PROCEDURE Gib_aus;  "PROCEDURE aus(i, j: INTEGER); "VAR b, k: INTEGER; " "BEGIN { aus } { M134 V2 } $b := By(i, j, 1); $FOR k := b TO b + 3 DO $IF Glei[k] = 'k' $THEN WRITE(' ') $ELSE WRITE(Wert[Glei[k]]); "END; { aus / Gib Freiheit_bestimmen;  VAR c: CHAR;   BEGIN { Freiheit_bestimmen } { M134 V2 } "Frei[Niveau] := [0..9]; "FOR c := 'a' TO letztes_Symbol DO "IF gesetzt(c) THEN Frei[Niveau] := Frei[Niveau] - [Wert[c]];  END; { Freiheit_bestimmen }    (* Ausgabe $IF Ausgang[i] = Widerspruch $THEN $BEGIN &moeglich := FALSE; &EXIT(Folgere); $END; $IF j >= 6 THEN $BEGIN &ganz_alt; &IF alt &THEN BEGIN -moeglich := TRUE; -EXIT(Folgere); +END; $END; {j >= 6} "END; {j}  END; { folgere }    PROCEDURE 6 DO $IF Ausgang[k] <> nichts_Neues $THEN BEGIN +alt := FALSE; +EXIT(Ganz_alt); )END; "END; { ganz alt / folgere }    BEGIN { folgere } { M134 V2 } "FOR j := 1 TO 60 DO "BEGIN $i := (j - 1) MOD 6 + 1; $Ausgang[i] := Test(i); ause(30); "MOVETO(1, 1); WCHAR(' '); "Pause(30);  END; { Cursor_blinken }    BEGIN { Hauptprogramm Gonggong } { M134 V2 } "Gongein(G); "IF Key THEN READ(ch); "Forme_um(G, Gl);  Benenne_um(Gl, Glei); "Anfangserkenntnisse; "Niveau := 0; "Freiheit_bestimmen; ! "Versuche_zu_setzen('a'); ! "REPEAT Cursor_blinken UNTIL Key; "Textmode;  END. { Hauptprogramm Gonggong }   {Include-File Gong.2 - Ende}  O^ææ%xgong pd* pp qpv*/* kp/ p o pvv* kkskov%%%% O^ææ    IIII7  6IIAA! !? ?     <5)!!!!?! """""""""???!!9!!!!?!!!!  !?AAAIUcAAaQIECA!!!!!"".)!!!" ""!!!!!! AcUIAAA!! !! !!?! !>AAAA>A>AAAAA ??( <12#.) *w* @ !!! ? !!  !?! ?!!!?!!!! >!! !6>6>**"AAAA"> 0`@8xx "ccccc">>>>A""A>>>>>>*U*U*U*UO^ææ%xgong vs* ko pqd++- okq+ kqi vzp oqv- kzk so%%%% O^ææ%xgong  DDP- OZP PZQ--- PZS- OV PQI OOV- OQS OO%% O^ææ%xgong vzz- svv sv+-+ dd+ spp skk vvv- kk vpp%% O^ææ%XGONG DPD/ QD OV-*+ KKV/ PO QO OZP- OKP VU%% O^ææ%XGONG POO* V SVO-+/ VK- KQ DO SP- OU KV%% O^ææ%XGONG ZIP- QV ZVV-+- OQI+ KK OVP KVK- DS KPV%%%% %xgong ppz- kk zo+-* ppd/ pq v dds+ oz dvv%% O^ææ%XGONG PSVP/ OQ KP/*/ D* P U SZO/ ZP QP%% teren in der gleichen Zeile stehen. Lange Befehle (koennen mehrere Zeilen belegen. Zusammen gehoerende Befehlszei- (len muessen durch ein Pluszeichen ( + ) an der ersten Stelle (jeder Zeile gekennzeichnet sein. Die Auftrennung darf immer annd, koennen (mehrere Befehle in der gleichen Zeile stehen. (Zum Beispiel: 0.BREAK.SKIP 2.MARGIN( L5 R65 ) (Es gibt aber auch Befehle, die den Rest der Zeile als ihren (Parameter betrachten. Deshalb duerfen nach solchen Befehlen (keine Wei(einer Zeile nicht vorkommt. (Das Kennzeichen kann geaendert (werden. Naeheres dazu weiter unten.) Ist das Anfangszeichen (gesetzt, wird die ganze Zeile nach Befehlen durchsucht. Sofern (die Befehle durch das Anfangszeichen getrennt sin diese durch ein (geeignetes Anfangszeichen markiert werden. Fuer diese Kennung (ist der Punkt in der ersten Spalte einer Zeile vorgesehen. Dies (deshalb, weil bei normalem Text der Punkt als erstes Zeichen rechten Rand und formattiert den Ausgabetext in (Seiten. Zur besseren Gestaltung des Ausgabetextes kann Prose (verschiedene Befehle verarbeiten, die in Kurzform im folgenden (Text beschrieben werden. (Damit Prose Befehle erkennen kann, muesse******************************************************** %1. Allgemeines zu den Programmbefehlen. (Ohne zusaetzliche Befehle ergaenzt Prose eine Ausgabezeile (automatisch mit der benoetigten Anzahl von Leerzeichen, setzt (den linken und ******************************************************************************* ( (Kurzbeschreibung zu P R O S E (Textformattierungsprogramm) (Frei uebersetzt von Martin Kimmig (M745) << V1.0 8.2.82 >> ( >API 12.03.1983 ***********************O^ææ (den Stellen erfolgen, wo ein Leerzeichen erlaubt ist. (Zum Beispiel: 0.FORM( [ /// L58 // #73 'PAGE' P /// ] 0+ [ /// L58 // 'PAGE' P /// ] ) (Die Beispiele in dieser Beschreibung sind alle in Grossbuchsta- (ben geschrieben. Es koennen aber Gross - und Kleinbuchstaben (verwendet werden. (Jede Anweisung an Prose beginnt mit dem Namen des Befehls. Zur (Identifikation benoetigt Prose aber nur die ersten drei Buchsta- (ben des Befehls. Die Befehle ko Beispiel: 0.MARGIN( K5 L8 R72 ) (Die Werte "L8" und "R72" sind im Buffer Nummer 5 gespeichert. (Wird kein "K" - Parameter angegeben, werden die Werte in (nummerischer Reihenfolge in den naechsten Buffer abgelegt. (Alte Parameter koennwurde, legt Prose die (neuen Werte in einem Buffer ab. Fuer jeden dieser vier Befehle (stehen zehn Buffer zur Verfuegung (Nummeriert von 0 - 9). Zur (Benutzung eines bestimmten Buffers, kann eine Zahl zur Spezifi- (zierung verwendet werden. (Zum(Der Parameter besteht dabei aus einer Bezeichnung und unter (Umstaenden einem zusaetzlichen Wert. (Zum Beispiel: 0.MARGIN( L5 R60 ) (setzt den linken Rand auf 5 und den rechten Rand auf 60. Immer (wenn einer dieser vier Befehle ausgefuehrt dieser Moeglichkeit, sind fuer jeden der vier Befehle (Buffer vorhanden. (Um die Parameter dieser vier Befehle zu setzen oder zu veraen- (dern wird folgender Syntax benutzt: 0.befehlsname( parameter ) s Befehlen duerfen die Parameter von INPUT, (MARGIN, PARAGRAPH und OPTION innerhalb des Quelltextes geaendert (werden. Es ist moeglich, urspruenglich gesetzte und dann (veraenderte Parameter erneut aufzurufen. Zur besseren Handha- (bung chem mehr. +(4) MARGIN setzt den linken und rechten Textrand. +(5) PARAGRAPH beschreibt spezielle Funktionen zum Beginn /eines neuen Absatzes. +(6) OPTION definiert den Rest der verschiedenen Optionen zur /Textformattierung. (Von diesen sech+(2) OUTPUT definiert das Ausgabegeraet (Drucker,Schirm etc.) /auf welchem der formattierte Text ausgegeben werden soll. +(3) FORM legt das Format einer Ausgabeseite fest und bestimmt /die Platzierung von Ueberschriften, Datum, Fussnoten und /aehnlilung in sechs Gruppen vorgenommen werden. Fuer jede Gruppe (stehen entsprechende Befehle: +(1) INPUT bestimmt die Bedeutung und Behandlung von definier- /ten Zeichen innerhalb des Quelltextes. ( L+5 R-5 ) %2. Allgemeines zur Formattierung. (Unter Formattierung sind alle Optionen und Spezifikationen zu (verstehen, mit denen Prose aus einem unformattierten Quelltext (einen formattierten Ausgabetext erstellt. Es kann eine Auftei- ( (Zeichen- (zahl pro Ausgabezeile damit = 60). Anschliessend wird die (Ausgabezeile durch Veraendern des linken und rechten Randes um (je 5 Stellen entsprechend verkuerzt (Zeichenzahl pro Ausgabezei- (le = 50). 0.MARGIN( L10 R70 ) 0.MARGIN(werden, der durch ein Plus- oder Minuszeichen vor der Integer- (zahl gekennzeichnet sein muss. Der alte Wert wird dann entspre- (chend erhoeht oder erniedrigt. Im folgenden Beispiel wird der (linke Rand auf 10 und der rechte Rand auf 70 gesetzt, die durch den Befehl selbst definiert /sind. (Wird ein Zahlenwert benoetigt (fuer einen Parameter oder als (Teil einer Bezeichnung), muss eine positive Integerzahl eingege- (ben werden. In vielen Befehlen kann ein relativer Wert benutzt gekuerzt 'PvP' = Programm vorgege- (bener Parameter). (Es gibt vier Parameter - Typen : +1.) Keine Parameter. +2.) Einzelner Zahlenwert. +4.) Rest der Befehlszeile. +4.) Eine in runde Klammern eingeschlossene Einzelaufstellung /von Bezeichnungenennen deshalb abgekuerzt werden. (Zum Beispiel: 0.MARGIN( L20 R60 ) 0.MAR( L20 R60 ) (Die Befehle koennen durch Parameter ergaenzt werden. Sind keine (Parameter angegeben, so benutzt Prose die eigenen vorgegebenen (Parameter. (Im folgenden aben unter Beachtung des folgenden Syntax (erneut benutzt werden: 0.befehlsname zahl (Zum Beispiel: 0.MARGIN 5 (setzt den linken und rechten Rand auf die Werte, welche im (Buffer Nummer 5 gespeichert sind. (Wird keine Zahl zur Bestimmung eines Buffers angegeben, werden (die Werte benutzt, die im vor dem zuletzt benutzten Buffer (stehen. Wird bei einem Befehl der Bufferparameter nicht spezi- (fiziert, wird die Buffernummer automatisch um ein 9 *Ln n = Anzahl der Textzeilen pro Seite *Pf P = jeweilige Seitennummer ; f = Stil der Seitennummer 3 .fuer f kann gesetzt werden: .N,n = Arabische Ziffer ('PvP')(automatisch nach Bedarf)-> X .L = Grossbuchstabe (automatisch nm Bedeutung 'PvP'-Breite *C Uhrzeit im 24 Std.Format hh.mm.ss (15.37.58) 8 *D Datum amerika yy/mm/dd (82/01/21) 8 *E Datum europa dd Mmm yy (21 Jan 82) (ausgegeben. Textzeilen werden durch den FORM - Befehl von (links nach rechts geschrieben. Sind keine Tab's gesetzt, (beginnt die Zeile in der ersten Spalte. Die folgende Tabelle (beschreibt die verfuegbaren FORM - Parameter. (Para, Datum, Zeit, obere und untere Seitengrenze. (Der Parameter besteht aus einzelnen Parametern, die durch Setzen (einer Schreibfeldbreite ergaenzt werden koennen. Zum Beispiel (wird durch "T:30" der Titel in einem Feld von 30 Zeichen in. (Zum Beispiel: 0.COUNT +1 (erhoeht die Seitennummer um eins. Ist kein Parameter angegeben, (wird die Seitennummer eins gesetzt. (FORM ( parameter ) (FORM (Dieser Befehl definiert das Seitenformat einschliesslich der (Titel, Fussnoten Befehl erlaubt die Eingabe von (Informationen in den Quelltext, der bei der Ausgabe nicht (beruecksichtigt wird. (Wie ein 'REM' im Basic) (COUNT zahl (COUNT (Der COUNT - Befehl setzt den Seitenzaehler. Der Parameter darf (relativ se(und zusammen mit dem Befehl erklaert wird. %4. Befehlsbeschreibung. (BREAK (Der BREAK - Befehl bewirkt den Beginn einer neuen Zeile. (COMMENT (Prose betrachtet die restliche Zeile nach diesem Befehl als (Kommentar. Der COMMENT - keiner * end - of - section ('*' bedeutet den Beginn einer neuen Zeile, da der entsprechende (Befehl die Formattierung beeinflusst. (( ... ) bedeutet, dass der Parameter in Klammern zu setzen ist * Leerzeile (SORTINDEX ( ... ) * sortiert und druckt Index (von INX) (SUBTITLE Rest der Zeile Untertitel (TITLE Rest der Zeile Ueberschrift (UNDENT Zahl * naechste Zeile nach links ausruecken (WEOS ert Ausgabegeraet (PAGE Zahl * neue Seite (PARAGRAPH ( ... ) o. Zahl setzt Parameter fuer einen Absatz (RESET ( ... ) * setzt 'PvP' (SELECT ( ... ) * bestimmt die zu druckende Seite (SKIP Zahl (INX Rest der Zeile speichert Index mit Seitennummer (LITERAL Rest der Zeile Steuerzeile fuer Ausgabegeraet (MARGIN ( ... ) o. Zahl * setzt Rand (OPTION ( ... ) o. Zahl * setzt Optionen (OUTPUT ( ... ) definiitennummerator (FORM ( ... ) * definiert die Form einer Seite (INDENT Zahl * naechste Zeile nach rechts einruecken (INPUT ( ... ) o. Zahl * Definition der Parameter im Quelltext f die urspruenglichen Werte (L0 und R70. %3. Tabelle der Befehle (Kurzform). (Befehl Parametertyp Bedeutung (BREAK keiner * neue Zeile (COMMENT Rest der Zeile Kommentar (COUNT Zahl setzt Ses erhoeht. (Steht der Befehl alleine, wird die Buffernummer automatisch um (eins erniedrigt. Der Buffer arbeitet wie ein Stack. (Zum Beispiel: 0.MARGIN( L0 R70 ) 2... 0.MARGIN( L10 R60 ) 2... 0.MARGIN (Das letzte MARGIN setzt den Rand auach Bedarf)-> X .I = Kleinbuchstabe (automatisch nach Bedarf)-> X .R = Grosse roemische Ziffer (automatisch nach Bedarf)-> X .r = Kleine roemische Ziffer (automatisch nach Bedarf)-> X *S Untertitel (Laenge des Untertitels )-> X *T Ueberschrift (Laenge der Ueberschrift)-> X *W Uhrzeit im 12 Std.Format hh:mm AM ( 3:37 AM) 8 Boder hh:mm PM (11:09 PM) 8 *#n Tab vor od nicht veraen- (dert. Wird nur die Bezeichnung des Parameters eingegeben, gilt (der 'PvP'. (B: Ist das feststehende Leerzeichen gesetzt, nimmt Prose zwi- +schen den entsprechenden Worten keine Veraenderung vor. Zum +Beispiel sei als festste Zahl (K+1) nein )U unterstrichenes Zeichen Char ? )W Verarbeitungsbreite Zahl 150 nein (? = Wird vom Programm nicht automatisch gesetzt. (Kein 'PvP') (Wird ein Parameter nicht gesetzt, wird sein Wert )B feststehendes Leerzeichen Char ? )C Umschaltung Gross - Kleinbuchstaben Char ? )D Kennzeichen fuer Befehlszeile Char . )H Trennzeichen fuer Worte in Silben Char ? )K Buffer aus der Bezeichnung (und einem zugehoerigen Wert oder Buchstaben. (Die folgende Aufstellung bietet einen Ueberblick auf alle (vorhandenen Parameter: (Bez. Bedeutung Typ 'PvP' Relativ l (INPUT (Der INPUT - Befehl wird zur Definition von Zeichen benutzt, die (innerhalb des Quelltextes stehen und durch Prose entsprechend (interpretiert werden. Die Parameter koennen in beliebiger (Reihenfolge gesetzt werden. Sie bestehen haette die (Seite 5 Zeilen. (INDENT zahl (INDENT (Der Befehl INDENT rueckt die naechste Zeile der Parameterzahl (entsprechend nach rechts ein. Wird kein Parameter angegeben, (nimmt Prose den 'PvP' von 5. (INPUT ( parameter ) (INPUT zah(Ohne Parameter wird keine spezielle Seitenformattierung erzeugt. (Das entspricht einem FORM - Befehl mit nur dem "L" Parameter, (der eine unbestimmte Anzahl von Zeilen pro Seite setzt. In (dieser Betriebsart arbeitet der PAGE - Befehl so, als (ungeraden und links die geraden Seitennummern stehen. Dies wird (mit einem FORM - Befehl erreicht, der zwei "[" und zwei "]" (enthaelt. 0.FORM( [ // T #62 E /// L56 // #63 'PAGE' P /// ] 0+ [ // T #62 E /// L56 // 'PAGE' P /// ] ) ausgeben, erhaelt man zwei verschiedene Seitennummern. (Es ist sehr einfach (vorausgesetzt man hat den FORM - Befehl (verstanden), ein schoenes Seitenformat zu erstellen. Zum Bei- (spiel kann ein Seitenformat erstellt werden, wo rechts dieetzt Prose (einen letzten Seitenvorschub unter Beruecksichtigung aller Para- (meter des FORM - Befehls bis zum "[". (Mit dem Zeichen fuer das Seitenende "]" erhoeht Prose die (Seitennummer. Wird vor und nach diesem Zeichen die Seitennummer ((benutzt. Beim OUTPUT - Befehl kann man mit diesem Zeichen durch (Prose einen Seitenvorschub veranlassen. Ebenfalls kann man mit (diesem Zeichen eine Pause setzen, um zum Beispiel am Drucker das (Papier zu wechseln. Am Ende der ganzen Ausgabe sE - oder SUBTITLE - Befehl geaendert, gibt Prose (auf der naechsten Seite die geaenderte Ueberschrift bzw. den (geaenderten Untertitel aus. (Das Zeichen fuer den Seitenanfang "[" wird fuer mehrere Dinge ende (Die vom Programm gesetzte Form ist: 0.FORM( [ // T #62 E /// L56 // #33 '- ' PN:1 ' -' /// ] ) (Der FORM - Befehl wird bei jeder neuen Seite erneut berueck- (sichtigt. Wird zum Beispiel einer der beiden Titelspeicher (durch den TITLer zurueck zur absoluten Spalte n ("..." Text in " " unveraendert ausgeben ('...' Text in ' ' unveraendert ausgeben */ Zeichen fuer Leerzeile ausgeben */n n Zeichen fuer Leerzeilen ausgeben *[ Zeichen fuer Seitenanfang *] Zeichen fuer Seitenhendes Leerzeichen die gekreuzte +Schraffur "#" durch den Befehl: 3.INPUT( B# ) +gewaehlt, dann werden die beiden Worte: 3Herr#Schmidt +bei der Zeilenformattierung weder auf zwei Zeilen noch durch +weitere Leerzeichen aufgetrennt. (C: Soll die Textausgabe in gemischter Gross- und Kleinschreibung +erfolgen und stehen zur Erstellung des Quelltextes nur +Grossbuchstaben zur Verfuegung, muss ein Zeichen fuer die +Umschaltung benutzt werden. Wurde ein solches Zeichen spezLeerzeichen werden mit Ausnahme der +Feststehenden nicht unterstrichen. (W: Die Verarbeitungsbreite wird zum lesen einer bestimmten +Anzahl von Zeichen des Quelltextes benutzt. Wenn die Quell- +textzeile Folgeinformationen fuer den rechten Rar Bufferparameter bestimmt, welcher Buffer zur Speicherung +von neuen INPUT - Optionen benutzt werden soll. 'PvP' +benutzt den nummerisch Naechsten. (U: Text welcher vom 'Unterstreich - Character' eingeschlossen +ist, wird unterstrichen. +kein zusaetzliches Trennzeichen einfuegen. Muesste Prose +mehr Leerzeichen zur Formattierung einfuegen, als mit dem +OPTION - Befehl gesetzt sind, wird eine Meldung mit dem Wort +ausgegeben, in welches Trennzeichen einzufuegen sind. (K: Deegen, wenn auf beiden +Seiten des Trennzeichens ein Buchstabe steht. Es kann zum +Beispiel das Wort "hyper-active" als "hyper-/active" eingege- +ben werden und Prose wird, wenn eine Trennung noetig waere, die Prose trennen soll. +Wurde als Trennzeichen der Schraegstrich ( / ) gesetzt, kann +das Wort "haengengeblieben" als "haen/gen/ge/blie/ben" einge- +geben werden. Prose wird das normale Trennzeichen ( - ) nur +dann an entsprechender Stelle einfuhen benoetigt, um bei langen +Worten eine Zeile in die entsprechende Form zu bringen. Sind +die Silben durch das Trennzeichen gekennzeichnet, kann Prose +die Worte trennen. Natuerlich brauchen nur von den Worten +die Silben gekennzeichnet werden,+die erste Spalte einer Zeile gesetzt. Prose kann dadurch +einen Befehl erkennen. (H: Das Trennzeichen wird zur Bestimmung der Trennmoeglichkeiten +innerhalb eines Wortes benutzt. Manchmal wird eine grosse +Anzahl von zusaetzlichen LeerzeicMoeglichkeit der +direkten Eingabe von Gross - und Kleinbuchstaben zur Verfue- +gung (zum Beispiel durch eine 80 - Zeichenkarte), sollte +natuerlich diese benutzt werden. (D: Zur Kennzeichnung der Befehle wird das Befehlskennzeichen in Kleinbuchstaben +beginnen, werden einfach zwei Umschaltzeichen vor die Worte +"^^AASSEN" und "^^OOGAM" gesetzt. Soll die Ausgabe keine +Mischung aus Gross - und Kleinbuchstaben enthalten, wird das +Umschaltzeichen nicht benoetigt. Steht die ng in sein Haus. +Auf den ersten Blick erscheint die 'Stottermethode' etwas +unuebersichtlich, aber die Erfahrung zeigt, dass man sich +sehr schnell daran gewoehnt. Sind Worte zu schreiben wie zum +Beispiel "aassen" oder "oogam", die mit zwei3^W^ENN ES NICHT REGNET, WIRD DIE SSONNE SCHEINEN. 3"^AHA^" SAGTE DER ALTE MMANN UND GING IN SEIN ^H^AUS. +Ausgabe durch Prose: 3Heute ist endlich schoenes Wetter. 3Wenn es nicht regnet, wird die Sonne scheinen. 3"AHA" sagte der alte Mann und gien +doppelt zu schreiben. Das folgende Beispiel demonstriert die +Umschaltung, wenn zur Eingabe nur Grossbuchstaben verfuegbar +sind: +Quelltext: 3.INPUT( C^ ) 3HHEUTE IST ENDLICH SCHOENES WWETTER. as +Zeichen zur Umschaltung zu setzen. Dies bewirkt eine Um- +schaltung zwischen Gross - und Kleinbuchstaben. Da in den +meisten Faellen der Grossbuchstabe am Anfang eines Wortes +steht, besteht die zweite Methode darin, diesen Buchstabi- +fiziert, wandelt Prose automatisch alle Grossbuchstaben in +Kleinbuchstaben um. Um dann einen Grossbuchstaben auszuge- +ben, sind zwei Moeglichkeiten vorhanden. Die erste Methode +besteht darin, vor und nach dem entsprechenden Buchstaben dnd hat, muss +die Verarbeitungsbreite angepasst werden. H- Fortsetzung des Textes in P.SCRIPT2 - O^ææ + *P 2 Leerzeichen nach Punkt Schalter + *R Rechter Rand Schalter + *S Zeilenvorschub Zahl 1 nein *U Umschaltung auf Grosschreibung Schalter - (Wird ein Parameter n Schalter + *J max. zusaetzliche Leerzeichen Zahl 3 nein *K Buffer Zahl (K+1) nein *L Linker Rand Schalter + *M mehrfach Leerzeichen Schalter (bietet die folgende Tabelle. Bei dem Typ "Schalter" entspricht ("+" = ein und "-" = aus. (Param Bedeutung Typ 'PvP' Relativ *E Ausgabe von Fehlermeldungen Schalter + *F Leerzeichen einfuegen r 'PvP'. (OPTION ( parameter ) (OPTION zahl (OPTION (Die verschiedenen Moeglichkeiten der weiteren Textformattierung (sind unter dem OPTION - Befehl zusammengefasst. Eine Uebersicht (K+1) nein )L linker Rand Zahl 0 ja )R rechter Rand Zahl 70 ja (Wird ein Parameter nicht gesetzt, wird sein Wert nicht veraen- (dert. Wird nur die Bezeichnung des Parameters eingegeben, gilt (de beliebiger (Reihenfolge gesetzt werden und bestehen aus einer Bezeichnung (und einer Zahl. Die folgende Tabelle gibt eine Liste der (Parameter wieder: (Bez. Bedeutung Typ 'PvP' Relativ )K Buffer Zahl (Zeichen gedruckt wird. Der rechte Rand ist die Spaltennummer (des letzten zu druckenden Zeichens. Wird die Zahl des linken (Randes von der des rechten Randes subtrahiert, erhaelt man die (Laenge einer Ausgabezeile. Die Parameter koennen in ro inch. (MARGIN ( parameter ) (MARGIN zahl (MARGIN (Der MARGIN - Befehl setzt den linken und rechten Seitenrand. (Der linke Rand ist die Anzahl von Leerzeichen, bevor das erste (ausgegeben, nicht mit zusaetzlichen Leerzeichen erweitert und (nicht als Ausgabezeile gezaehlt. Der LITERAL - Befehl kann zur (Druckersteuerung benutzt werden: 0.LITERAL( T ) (setzt bei einigen CDC - Druckern die Druckdichte auf 8 Zeichen (pRest der Zeile zum Ausgabegeraet. Die Behandlung von (Gross - und Kleinbuchstaben, Unterstreichungen und gesetzter (Leerzeichen hat genauso Gueltigkeit wie fuer den normalen (Quelltext. Die Zeile wird aber unabhaengig vom Seitenformat  - Fortsetzung des Textes von P.SCRIPT1 - ( (INX text (Der Rest der Zeile ergibt zusammen mit der laufenden Seitennum- (mer einen Indexeintrag. Belegt der Text mehrere Seiten, ist der (Index dadurch immer richtig. ( (LITERAL text (Sendet den icht gesetzt, wird sein Wert nicht veraen- (dert. Wird nur die Bezeichnung des Parameters eingegeben, gilt (der 'PvP'. (E: Fehlermeldungen werden -eingeschoben in den Text- auf dem +Ausgabegeraet ausgegeben. Durch setzen des E - Parameters +auf "E-" kann dies verhindert werden. (F: Ausgabezeilen werden wie in "Basic Units of Text" beschrie- +ben, formattiert und mit Leerzeichen gefuellt. (Diese Be- +schreibung ist nic, bevor Text zum Ausgabegeraet gesandt (wurde, oder direkt hinter dem ".RESET( OUTPUT )" - Befehl, (benutzt werden. ("Geraeteabhaengig" kann sein: (ASC ASCII - Terminals, ('PvP') koennen ein 'carriage return' ,fuer Zeilenvorschub und e+ausschliesslich Grossbuchstaben verwendet werden. (OUTPUT ( geraeteabhaengige parameter ) (Der OUTPUT - Befehl definiert wichtige Zeichen fuer das jeweilig (benutzte Ausgabegeraet. Der OUTPUT - Befehl darf nur einmal, (entweder ganz am Anfang+ben in Grossbuchstaben umgesetzt werden. Dies ist besonders +fuer Benutzer des CDC - Druckers von Interresse, da dieser +beim Empfang von Kleinbuchstaben zwei Buchstaben druckt. +Diese Option kann auch gut zur Ausgabe von Programmen in oder "S3" kann +ein einfacher, doppelter oder dreifacher Zeilenvorschub er- +reicht werden. (U: Da manche Ausgabegeraete keinen Text aus Gross - und Klein- +buchstaben verarbeiten, koennen durch "U+" alle Kleinbuchsta- i- +terung braechte noch die gleiche Prozedur fuer Kommas, da der +UCSD Editor in der "filling mode" diese Leerzeichen ent- +fernt.) (S: Mit dem S - Parameter wird der Zeilenvorschub fuer die +Ausgabe gesetzt. Durch setzen von "S1", "S2"er +Zeilenformatierung schon zwei Leerzeichen vorhanden waren. +Dies erleichert die Trennung von Saetzen durch zwei Leerzei- +chen, ohne dass beim Schreiben des Quelltextes besonders +darauf geachtet werden muss. (Anmerkung: Eine echte Erwe(P: Steht der Schalter fuer zwei Leerzeichen nach dem Punkt auf +"+", wird Prose in den Faellen, wo hinter einem Punkt +mindestens ein Leerzeichen steht, zwei Leerzeichen setzen. +Prose wird keine Leerzeichen hinzufuegen, wenn vor dn Worten mindestens die gleiche Anzahl Leerzeichen. +Unter Umstaenden setzt Prose zur Formattierung noch Weitere +hinzu. Steht der Schalter auf "-", werden mehrfache Leerzei- +chen auf Eines reduziert. - Rand gerade und der "-" +- Rand nicht begradigt. (M: Mehrfach Leerzeichen werden beruecksichtigt, wenn der "M" - +Schalter auf "+" steht. Sind im Quelltext zwischen zwei +Worten mehrere Leerzeichen, stehen im Ausgabetext zwischen +dieseer auf "+", werden die +Ausgabezeilen links - und rechtsbuendig ausgegeben. Stehen +beide Schalter auf "-", werden die Ausgabezeilen zwischen dem +linken und rechten Rand gemittelt. Steht einer auf "+" und +der Andere auf "-" dann ist der "+"+Fehlermeldung ausgeben. (K: Der Parameter von "K" bestimmt den Buffer zur Speicherung der +neuen Optionen. 'Pvp' nimmt immer den Naechsten. (L: (R: Die linke und rechte Randbegrenzung bestimmen zusammen die +Zeilenform. Stehen beide Schalt+aufeinanderfolgenden Worten einzufuegen waeren. Ist eine +Trennung nicht moeglich (z.B. sind keine Trennzeichen zwi- +schen den Silben gesetzt), oder Prose kann die Anzahl der +Leerzeichen nicht unter das gesetzte Limit bringen, wird eine +le mit mehr Leerzeichen versehen, als im Quelltext vorhanden +sind. Der J - Parameter bestimmt, wann ein Wort zu trennen +ist. Ist zum Beispiel "J3" gesetzt, will Prose immer dann +ein Wort trennen, wenn mehr als 3 Leerzeichen zwischen zwei ht in dieser Kurzform enthalten.) Steht der +F - Parameter auf "F-", wird Prose die Quelltextzeile +unveraendert ausgeben. Ist "F+" gesetzt, werden die Zeilen +formattiert. (J: Zur Formattierung muss Prose unter Umstaenden die Ausgabezei- in 'form feed' fuer Seitenvorschub ,verarbeiten. Ein 'teletype' wird auch als ASC - Terminal ,behandelt, auch wenn es keinen Seitenvorschub verarbeitet. ,Dies ist unproblematisch, da die Option 'Seitenvorschub' ,gesetzt werden kann. (LPT 'Line printer' brauchen ein '+' fuer Zeilenvorschub und eine ,'1' fuer den Seitenvorschub. Prose setzt automatisch den ,Zeilenvorschub und wie bei vielen anderen Terminals, ist ,Spalte 1 die erste Druckspalte. (Anmerkung: Micro - Benut- Zahl 0 nein *U Automatisches Ausruecken Zahl 0 nein (Wird ein Parameter nicht gesetzt, wird sein Wert nicht veraen- (dert. Wird nur die Bezeichnung des Parameters eingegeben, gilt (der 'PvP'. (F: Dieses Zeichen wird s Einruecken Zahl 0 nein *K Buffer Zahl (K+1) nein *N Zaehler ? *P Automatischer Seitenvorschub Zahl 0 nein *S Automatische Leerzeile (mehrere Leerzeilen, oder eine neue Seite gewaehlt werden. Prose (kann die Absaetze auch fortlaufend nummerieren. (Param Bedeutung Typ 'PvP' Relativ *F Zeichen fuer Absatz Char ? *I Automatischeas Aussehen des Absatzes wird durch die PARAGRAPH - (Parameter bestimmt. Der Absatz selbst, wird durch ein spezi- (elles Zeichen in der ersten Spalte einer neuen Zeile veranlasst. (Es kann automatisches Ein - oder Ausruecken der Zeile, eine oder durch folgende Methoden erzeugt werden: (Einfuegen von einer oder mehrerer Leerzeilen, durch Leerzeichen (zu Beginn der Zeile oder durch den BREAK - Befehl. Der (PARAGRAPH - Befehl bietet eine komfortable Loesung zur Absatzge- (staltung. Dbleiben auf der Seite weniger als durch die Zahl vereinbarte (Zeilen, wird ein Seitenvorschub veranlasst. PAGE ohne Zahl (veranlasst einen sofortigen Seitenvorschub. (PARAGRAPH ( parameter ) (PARAGRAPH zahl (PARAGRAPH (Neue Absaetze koennen(U: Laesst das verwendete Ausgabegeraet keine Unterstreichung zu, +der Quelltext enthaellt aber Unterstreichungen, sollte die +Option Unterstreichen ausgeschaltet werden, damit Prose keine +unterstrichenen Zeichen sendet. (PAGE zahl (PAGE (Vers 'car- +riage return' gewartet. (S: Die gesamte Ausgabe durch Prose kann um eine beliebige Anzahl +von Leerzeichen bis zu max. 50 nach rechts versetzt werden. +Dies macht das Ausmitteln des Drucks auf breitem Papier sehr +einfach. ben. (P: Ist die Option Pause gesetzt, wird bei Erscheinen des "[" im +FORM - Befehl eine Pause eingelegt und auf Befehle des +Benutzers gewartet. Bei einem "ASC" oder "AJ" Terminal wird +ein Klingelzeichen gesendet und auf die Eingabe eineVersetzen der Ausgabe nach rechts Zahl 0 *U Unterstreichen ist moeglich Schalter + (E: Ist die Option Seitenvorschub gesetzt, wird bei Erscheinen +des "[" im FORM - Befehl, ein 'form feed' oder eine '1' +ausgege(Param Bedeutung Typ 'PvP' *E Seitenvorschub zu Beginn einer Schalter - /neuen Seite. (siehe auch "[" /in der FORM - Beschreibung. *P Pause bei Beginn einer Seite Schalter - *S (Die Parameter spezifizieren weitere Charakteristiken der Ausga- (begeraete und einige allgemeingueltige Ausgabeoptionen. Die (Parameter duerfen in beliebiger Reihenfolge gesetzt werden. Die (folgende Tabelle gibt einen Ueberblick: igkeit langsamer. Aus diesem ,Grund wird "ASC" fuer Kontrolldrucke und "AJ" nur fuer den ,endgueltigen Druck empfohlen. Der "AJ" - Parameter kann zur ,Spezifikation des 'pitch' (in Zeichen pro inch) eine Zahl ,enthalten, zum Beispiel "AJ 10".,zer vergesst alles ueber LPT) (AJ Anderson/Jacobson Terminals brauchen zur Formattierung 1/60 ,inch Schritte. ASC kann fuer ein AJ - Terminal benutzt ,werden, aber das Ergebnis ist nicht gut. Wenn "AJ" gesetzt ,ist, wird die Druckgeschwindzur Initialisierung der Absatzbearbeitung +benoetigt. Es muss in der ersten Spalte einer Zeile stehen. +Das Zeichen muss zumindest einmal in einem PARAGRAPH - Befehl +gesetzt werden, da sonst keiner der Parameter arbeitet. (I: (U: Automatisches Ein - oder Ausruecken der ersten Zeile des +Absatzes (wie bei INDENT und UNDENT beschrieben). Bei +Benutzung des Zaehlers, wird die Absatznummer ausgegeben und +erst dann ein "I" oder "U" veranlasst. (N: Ist der Zaeheit. Die Parameter bestehen einfach aus Seiten- (nummern, die durch ein Leerzeichen getrennt sind. Um einen (ganzen Seitenbereich zu waehlen, werden die beiden Seitennummern (durch einen Doppelpunkt ( : ) getrennt. Die zweite Seitenummer (kanSELECT - Befehl kann zur Ausgabe von (unveraenderten Seiten benutzt werden. Der Quelltext wird for- (mattiert, aber nur die ausgewaehlten Seiten werden gedruckt. (Die Verarbeitungszeit wird deshalb nicht wesentlich verkuerzt, (aber die Druckz(Da FORM und OUTPUT direkt die Ausgabe beeinflussen, wird bei (diesen Befehlen mit RESET ausserdem ein Seitenvorschub erzeugt. (SELECT ( parameter ) (Bei Ueberarbeitung eines fertigen Textes wird nicht unbedingt (jede Seite geaendert. Der f "K0" gesetzt werden. (Wird COUNT zurueckgesetzt, wird die Seitennummer auf 1 gesetzt. (Wird INX zrueckgesetzt, werden alle Indexe geloescht. Wird PAGE (zurueckgesetzt, wird ein Seitenvorschub erzeugt. PTION OUTPUT PAGE 0PARAGRAPH SELECT SUBTITLE TITLE (Die Werte der Parameter vieler Befehle werden auf den 'PvP' (zurueckgesetzt (siehe Beschreibung der einzelnen Befehle) mit (Ausnahme der Buffer, die auEPT FORM OUTPUT ) (setzt alle Befehle mit Ausnahme von FORM und OUTPUT auf den ('PvP' zurueck. (Die Parameter fuer RESET sind in der folgenden Tabelle zusammen- (gefasst: 0COUNT FORM INPUT INX 0MARGIN O(auf einen Streich. Die Befehle koennen bei Benutzung der (zweiten Form einzeln zurueckgesetzt werden. 0.RESET( MARGIN OPTION ) (Dieser Befehl setzt nur die Werte von MARGIN und OPTION auf den ('PvP' zurueck. Die dritte Form 0.RESET( EXCBefehl wird zum Setzen der 'PvP' aller Befehle (verwendet. Wenn die Parameter vieler Befehle (zum Beispiel (FORM, MARGIN oder OPTION) zurueckgesetzt werden sollen, kann das (der Befehl 0.RESET ktioniert genauso wie der SKIP - Befehl (siehe +weiter unten). (K: Der "K" - Parameter bestimmt den Buffer zur Speicherung der +neuen Werte. 'PvP' benutzt den Naechsten. (RESET (RESET ( parameter ) (RESET ( EXCEPT parameter ) (Der RESET - es Absatzes noch auf der +gleichen Seite ausgegeben werden. Sind weniger Zeilen vor- +handen, wird nach dem automatischen SKIP ein Seitenvorschub +veranlasst. (S: Der automatische Zeilenvorschub wird vor einem neuen Absatz +gemacht und fun(P: Der automatische Seitenvorschub wird zur Simulation des +Befehls: 3.PAGE zahl +vor der ersten Zeile eines Absatzes benutzt. Ist der +Parameter zum Beispiel auf 4 gesetzt wird sichergestellt, +dass mindestens 4 Zeilen dies Nummerierung -N oder n arabische Zahlen -L Grossbuchstaben -l Kleinbuchstaben -R grosse roemische Zahlen -r kleine roemische Zahlen +n ist die Anzahl der Stellen und wird nach Bedarf automatisch +veraendert. der aufgerufen, steht auch der Zaehler auf dem +alten Wert. Das "F" - Zeichen wird beim formattieren der +Zeile durch die Nummerierung ersetzt. +Die Parameter des Zaehlers haben die Form : Nfn +f entscheidet ueber die Zeichen: -- blank - keineler gesetzt, werden die Absaetze durch "F" +fortlaufend mit einer Zahl (oder Buchstabe) durchnummeriert. +Der Zaehler wird auf 1 gestellt, wenn die PARAGRAPH - +Parameter neu gesetzt werden. Werden jedoch die alten +Parameter wien relativ sein. Das folgende Beispiel druckt die Seiten 3, (5, 10 - 15 und 20 - 25. 0.SELECT( 3 5 10:15 20:+5 ) (SELECT ohne Parameter gibt alle Seiten aus. (SKIP zahl (SKIP (SKIP gibt eine bestimmte Anzahl von Leerzeilen aus. Zu Beginn (einer neuen Seite bewirkt SKIP keine Leerzeilen. Um mit SKIP am (Anfang einer neuen Seite Leerzeilen auszugeben, muss auf der (neuen Seite mindestens eine echte Leerzeile dem SKIP - Befehl (vorausgehen. Wenn keine Parameter angegeben sindO^ææ Version von Prose, gibt der WEOS - Befehl ein end - of - (record - Zeichen aus. Dieser Befehl wird an der Universitaet (von Minnesota zur Ausgabe von Indexlisten verwendet. ( g- Ende - (die Zeile ganz links geschrieben. (WEOS (Sendet ein end - of - section - Zeichen zur Ausgabe. Dieser (Befehl ist bei den Systemen nuetzlich, die einen Gesamttext aus (mehreren Einzeltexten erstellen und verarbeiten koennen. In der (CDC - timmte Anzahl von (Zeichen nach links. Die Zeile kann den linken Seitenrand nicht (ueberschreiten. Zu gross angegebene Werte werden deshalb ent- (sprechend verkleinert. Werden keine Parameter eingegeben, wird er SUBTITEL (- Speicher wird vom FORM - Befehl benutzt. (TITLE text (Legt den Rest der Zeile im TITEL - Speicher ab. Der TITEL - (Speicher wird vom FORM - Befehl benutzt. (UNDENT zahl (UNDENT (Verschiebt die folgende Zeile um eine beste Spalte fuer alphabetisches Sortieren an. 7Ist der Buchstabe "P" gesetzt, wird nach der Sei- 7tennummer sortiert. (Sind keine Parameter angegeben, werden die 'PvP' benutzt. (SUBTITLE text (Legt den Rest der Zeile im SUBTITEL - Speicher ab. D*M 0 Linker Rand vor der Indexzeile *P 0 Spalte der Indexzeile, wo die Seitennumer einge- 7fuegt werden soll *R 2 Leerzeichenanzahl nach der Seitennummer *S 1 Sortieroption. Ist "S" eine Zahl, gibt diese die 7ersl und wie die Seitennummer (aussehen soll. Die Parameter koennen in beliebiger Reihenfolge (eingegeben werden. Die folgende Tabelle gibt einen Ueberblick: (Param 'PvP' Bedeutung *L 2 Breite der Seitennummer ORTINDEX - Befehl (erlaubt die Spezifizierung der zu beruecksichtigenden Spalte, (die erste Spalte die alphabetisch sortiert werden soll, wieviele (Leerzeichen der Indexzeile vorausgehen sollen, wo in der Index- (zeile die Seitennummer stehen sol, generiert (SKIP 5 Leerzeilen. (SORTINDEX ( parameter ) (SORTINDEX (Die mit dem INX - Befehl gesammelten Indexe, koennen entweder (alphabetisch oder nach Seitennummern sortiert, in unterschied- (licher Art und Weise ausgegeben werden. Der S  *******************************************************************************  * *  * Anmerkungen zu *  *  Seite 106, Block 2:  Auf das 3. END von oben muss ein Strichpunkt folgen, kein Punkt.   Seite 133, Zeile 8, Druckfehler:  richtig: Allerdings kann man ...   Seite 137, Bild 7.8, Zeile 3 bis 5 von unten:  Diese Zeilen sollten vernuenftigerweise>"-Zeichen  jeweils "<"-Zeichen stehen. Das muss ja schief gehen.   Seite 100, Bild 6.16:  Sollte hoeher gedruckt werden, es gehoert ja nicht zu case.  Seite 102, Bild 6.18, Zeile 6:  richtig sollte diese Zeile heissen: IF (MONAT < 1) OR ...    Seite 94, Tabelle:  Der Ausdruck des vorigen Programms ist fehlerhaft. Als Folge der "WRITELN"-  Anweisung sollte nach "9 x 1 = 9" eine Zeile frei sein.   Seite 99, Bild 6.15:  Dieses Programm ist dadurch voellig verdorben, dass an Stelle der "le 3 von unten, Druckfehler:  richtig: MITTEL.   Seite 92, Bild 6.9:  Die Zeile "ZAHL := 0;" ist ueberfluesig und sinnlos.   Seite 93, Bild 6.10:  Die Bemerkung "FOR" in der Kommentarklammer ist sinnlos, weil 2 Schleifen mit  "FOR" vorkommen. e 74, Zeile 2:  Vor 1, 2 und 5 sollten immer gleich viele Leerstellen stehen.   Seite 76, Zeile 3 von unten:  Die ausgedruckte Zeile sollte 9 Stellen haben, also nicht mit einer, sondern  mit zwei Leerstellen beginnen (I + 1 = 9).   Seite 89, Zeirgebnis vom  Typ Boolean kein Writeln definiert ist. Das wird erst sehr spaet erwaehnt.   Seite 72, Programm Summe:  Enthaelt diesmal keinen Doppelpunkt in Zeile 4, im Gegensatz zu den vorherigen  Auflistungen, ist dafuer aber fehlerfrei.   Seit  Seite 57, Zeile 25, Druckfehler:  richtig <=, >= und <>.   Seite 63, Zeile 9:  richtig muss es heissen: Sie besteht nur aus dem trennenden Strichpunkt.   Seite 65, Beispiel 4.6:  In UCSD Pascal druckt das Programm nichts aus, weil fuer ein EUND,  LN, AND, OR, NOT.   Seite 46, Bild 3.4:  Im unteren Kringel fehlt das Komma.   Seite 56, Zeile 31:  In Pascal muss vor dem Dezimalpunkt immer eine Ziffer stehen. Deshalb ist  .01 zwar in Basic, aber nicht in Pascal eine zulaessige Zahl.  richtig WRITELN('HALLO'); - Anfuehrungszeichen oben.   Seite 9, Zeile 23 und Seite 26, Zeile 2 von unten:  Nach GESAMT darf kein Anfuehrungszeichen stehen.   Seite 27, Bild 2.6:  Es fehlen zahlreiche Standardbezeichner unter anderem PRED, ORD, ROorliegende Liste enthaelt im wesentlichen nur die vom Verlag zuge-  gebenen Fehler, aber auch noch einige Punkte, in denen ich mit dem Verlag  nicht uebereinstimme.   Liste der Anmerkungen  ---------------------   Seite 8, Zeile 15, Druckfehler:  Bei der Durchsicht dieses Buches fielen mir zahlreiche Druckfehler und sachli-  che Fehler auf. Ich schickte dem Verlag eine achtseitige Liste. Der groesste  Teil dieser Fehler wurde anerkannt und soll in der 2. Auflage verbessert wer-  den. Die v(API 12.03.1983) * * *  *******************************************************************************     Vorbemerkung  ------------  Sybex Verlag Frankfurt * * * * von Michael Bauer *  * *  * Rodnay Zaks *  * Einfuehrung in Pascal und UCSD Pascal *  * heissen:  "WRITE('BITTE GEBEN SIE EINE POSITIVE ZAHL EIN: '); "READLN(FIBNUM);  UNTIL FIBNUM >= 0;   In Zeile 3 von unten ist naemlich das ">"-Zeichen verkehrt gedreht.   Seite 141, Zeile 35, Druckfehler:  richtig: ausserordentlich wertvoll sind ...   Seite 157, Programmzeile 12:  Hier fehlt ein Strichpunkt.   Seite 161, Zeile 11 von unten:  richtig: WRITELN( ... ); Die Schlussklammer fehlt.   Seite 182, Zeilen 19, 20:  Hier wird behauptet, be Auch gewoehnliche Integers, nicht nur lange Integers koennen durch STR in  Strings verwandelt werden.   Seite 197, Zeile 15:  Den Satz "Als zweidimensionale Felder erstellte Tabellen werden oft zur Ermitt-  lung des logischen Programmverhaltens benEX),  das sollte auf deutsch mit  INSERT(QUELLENKETTE, ZIELKETTE, INDEX)  wiedergegeben werden. Demnach muss es auf Seite 196 oben heissen:  INSERT(QUELLENKETTE, ZIELKETTE, 15);  Der einzusetzende Teil wird zuerst genannt.   Seite 197, Zeile 4:  Seite 195, Zeile 5:  Bravo! Es heisst wirklich CONCAT.   Seite 195, Zeile 9 von unten, Druckfehler:  richtig: TESTKETTE := 'DIES IST EINE ZEICHENKETTE';   Seite 195, 196, INSERT:  Die Syntax von INSERT heisst:  INSERT(SOURCE, DESTINATION, INDenn SYBEX PUBLISHING so geschrieben wird, wie auf der vorigen Seite, so werden  allerdings 17 Zeichen benoetigt.  Seite 194, Zeile 6 von unten:  Nicht CONTACT, sondern CONCAT.   Seite 194, Zeile 3 von unten:  Nicht CONTAT, sondern CONCAT.  *so liefert *SCAN(50, ='T', TEST) den Wert 8 und *SCAN(50, = 'T', TEST[8]) den Wert 0, *weil SCAN sofort auf das erste T stoesst.   Probieren Sie diese Funktion gruendlich aus, bevor Sie sie das erste mal ver-  wenden.   Seite 194, Zeile 11:  WIGENSCHAFT'; *so liefert *SCAN(50, = 'T',TEST) den WERT 7 und *SCAN(50, = 'T', TEST[8]); den Wert 7, weil es auf das zweite T *nach Durchscanen von weiteren 7 Bytes stoesst.  *Ist Test ein String und zwar *TEST := 'EINE INTERESSANTE EIGENSCHAFT';  3. Wenn SCAN irgendwo in der Mitte zu arbeiten beginnt, so werden nur die $durchscanten Buchstaben gezaehlt, nicht die davor (oder dahinter) ste- $henden.   Beispiel: Ist Test ein Packed Array[0..28] of CHAR und zwar *TEST := 'EINE INTERESSANTE En enthalten, in Strings $enthaelt Byte 0 die tatsaechliche Stringlaenge.   2. Achten Sie darauf, dass bei Strings Byte 0 nicht mitgescant wird, es $koennte je nach Stringlaenge jeweils einen Buchstaben vortaeuschen.  e Sie insbesondere auf folgende Punkte hin:   1. SCAN kann auf PACKED ARRAYs OF CHARacters oder auf STRINGs angewandt wer- $den. Dabei verhaelt es sich verschieden. Der Grund: In Packed Arrays of $Characters kann Byte 0 schon den ersten BuchstabeZeile 14 und folgende:  LENGTH gibt natuerlich nicht die Zahl 80 ab, sondern die tatsaechliche Laenge  des Strings.   Seite 193, Zu "SCAN"   Das ist eine recht komplizierte Procedure. Die Beschreibung ist bestimmt teil-  weise unrichtig. Ich weis werden die ersten 15 Bits in ein Doppelbyte gepackt, die naechsten 15 eben-  falls, die letzten 3 ebenfalls. Bit 16 kann nicht in das erste Doppelbyte ge-  packt werden, da die einzelnen Elemente nicht an Wortgrenzen zerrissen werden.   Seite 191, oegliche Anzahl von  Bits gebraucht, aber mit gewissen Einschraenkungen. So werden die Daten in  Doppelbytes gepackt. Die Grenze von zwei Bytes wird nicht ueberschritten.  Im Beispiel:  A: PACKED ARRAY[0..10] OF 0..7; nicht richtig, es soll Ausnahme-  faelle geben. ??   Seite 189, Zeile 8:  Am Anfang der Zeile sollte kein Doppelpunkt stehen, das fuehrt zur Verwirrung.   Seite 190, Zeile 24 und folgende:  Das ist nicht ganz richtig. Es wird zwar die geringstmim Bubblesort muesste immer das ganze Feld durchge-  gangen werden. Meiner Meinung nach ist das nicht so, da ja schon beim ersten  Durchgang das groesste Element an die hoechste Stelle vordringt. Nach Aus-  kunft des Uebersetzers ist meine Behauptungutzt." habe ich nicht verstanden, ob-  wohl ich einigermassen herumgeraetselt habe, was gemeint sein koennte.   Seite 197, Zeile 18:  Nicht im Sinn von verketteten Listen.   Seite 205, Zeile 25, Druckfehler:  richtig: ANGESTELLTER.GEHALT   Seite 205, Zeile 14:  Fast alle Pascal Versionen fuellen eine Zeichenkette automatisch rechts mit  Leerstellen auf (nicht links).   Seite 211, Zeile 16:  Das sollte heissen:  WITH A, B, C DO  ...  Z := 1;   Seite 214, Tabelle:  Nach Auskunf Syntaxdiagramm Bezeichner ist nicht beschriftet.   Seite 374, Zeile 8 von unten, Druckfehler:  richtig: Unit Separator  Seite 377:  In diesem Syntaxdiagramm fehlen Funktionen ganz, nicht nur die Segmentfunk-  tionen. In der grossen Schleife fueS.  Ueberschuessig erscheint mir SEPARATE, andernfalls wuerde auch INTRINSIC fehlen.   Seite 359, Tabelle:  Hier muss es natuerlich exp(x) heissen, statt escp(x).   Seite 359, Tabelle 2:  Vor NEW(P, T1...TN) gehoert keine Klammer.   Seite 368:  richtig: Proceduren und Funktionen koennen durch Segment gekennzeichnet wer-  den. Fuer Funktionen wird das hier geleugnet.  Vgl. Language Manual, Seite 74   Seite 357, unten:  Bei den reservierten Woertern in UCSD-Pascal fehlen: EXTERNAL, USE^VERBUND2;  Die Procedure NEW akzeptiert ja nur Zeiger als Parameter.   Seite 335, Zeile 3, Druckfehler:  richtig: arbeitete   Seite 336, Zeile 18 von unten:  UNIT und SEGMENT sind keine Proceduren.   Seite 338, Zeile 9 von unten:   Seite 331, Zeile 24:  Besser: Denn durch RELEASE gehen die im gesamten Bereich ...  gespeicherten Variablenwerte fuer das Programm verloren. Der Raum wird fuer  das Programm wieder gewonnen.   Seite 331, Zeile 14 von unten:  richtig: Z2: 7, Zeile 15:  In der WRITE-Anweisugn wird zwar eine Klammer geoeffnet, aber keine geschlossen.   Seite 318, Zeile 9, Zeile 18:  Dafuer wird in diesen beiden Zeilen jeweils eine Klammer geschlossen, obwohl  keine hergehoert und keine geoeffnet wurde. richtig: UNTERSUCHE(Z^.WERT); (mit Strichpunkt)   Seite 304, Bild 13.14, Bild 13.15, sowie Seite 320, Bild 13.23:  In allen diesen Bildern fehlt der Anfangszeiger, so dass auf die Listen eigent-  lich nicht zugegriffen werden kann.    Seite 31[, Position])  vgl. Language Manual, p. 43.  Seite 281, Zeile 1:  Beachten Sie die Systemmeldung "A>" nicht!   Seite 299, Zeile 13 von unten, Druckfehler:  richtig: hin vorarbeiten ...   Seite 299, Zeile 6 von unten: ls hier dargestellt. Vergleichen Sie  das Language Manual, p. 41, 42.   Seite 269, Zeile 16, 17 von unten:  Die Syntax von BLOCKREAD und BLOCKWRITE lautet richtig:  BLOCKREAD(Datei, Feld, Block [, Position])  bzw.  BLOCKWRITE(Datei, Feld, Block RITE lautet richtig:  UNITREAD(Nummer, Feld, Laenge [, [Blocknummer] [, Modus]])  bzw.  UNITWRITE(Nummer, Feld, Laenge [, [Blocknummer] ], Modus]])  vgl. Language Manual, p. 41.   Seite 269, Zeile 15 ff.:  Modus ist beim Apple anders definiert, a richtig: Kombination von Tastatur und Bildschirm.   Seite 265 ,Zeile 3, Druckfehler:  richtig: IORESULT   Seite 267, letzte Zeile, Druckfehler:  richtig: das 0 ist, ...   Seite 268, Zeile 2 und 3 von unten:  Die Syntax von UNITREAD und UNITWge2 = 120. Dann wird naemlich auf  das Element Kette[121] bezug genommen und das Programm schliesst mit einer  Fehlermeldung.   Seite 259, Zeile 7, Druckfehler:  richtig: WORTLAENGE := WORTLAENGE + 1;   Seite 261, Zeile 3: le 6 von unten:  Hier koennen unter Umstanden nicht vorhandene Arrayelemente verglichen werden.   Eine REPEAT-Schleife ist deshalb nicht angebracht, weil die Kette1 aus einem  Element bestehen kann.   Schwierigkeiten ergeben sich auch, wenn Laent von Herrn Pol koennen Artikel tatsaechlich in negativer Zahl in  einem Lager vorhanden sein: Ueberbestellungen!   Seite 232, Zeile 21:  richtig: TYPE TEXT = FILE OF CHAR;   Seite 238, Zeile 10, Druckfehler:  richtig: Wert   Seite 254, Zeir VAR fehlt nach Typ ein Strichpunkt.  Auch nach Prozedur sollten beide Male Strichpunkte stehen.   Seite 378 etwa:  Es fehlen Syntaxdiagramme fuer "Programm" und "Unit", ebenfalls fuer  "Interfaceteil" und "Implementationteil".   Seite 378, Diagramm 1:  Hier ist allerhand falsch:   1. Nach dem Programmnamen koennen in Klammern Filebezeichner genannt werden.   2. "UNIT"-Bezeichner - statt dessen sollte dort in eckigem Kaestchen Unit ste- $hen, es kann also eine Unit vor te zulaessig ist. Von Ihnen werden Regeln  ueber die aeussere Form von Programmen aufgestellt, es werden aber auch weit-  gehende Forderungen an die Qualitaet von Programmen und Programmierern erho-  ben. Hier setze ich mich mit dem Buch (Pascal mit Ssprache Pascal ist durch zwei kurze Dokumente definiert, Pascal  User Manual und Report, beide von Jensen und Wirth. Nun gibt es aber eine  Gruppe amerikanischer Programmierer, denen ein Programm noch lange nicht ge-  nuegt, das im Sinne dieser Dokumen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 ?Pascal mit Stil? ? ?von Michael Bauer ?(API 12.03.1983)   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    Die ProgrammierO^ææ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  Michael Bauer (M134)  Ludwig-Thoma-Str. 32, 8830 Treuchtlingen  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  p.198 bis 203.  Seite 387, Spalte Argumente:  Bei MARK und RELEASE: Zeiger auf Ganzzahl  Bei STR: Ganzzahl oder lange Ganzzahl  Bei UNITBUSY, UNITCLEAR, UNITWAIT: Unitnummer (ohne Anfuehrungszeichen)  =- #  4. Der untere Weg wird durchlaufen, wenn es sich um eine Unit handelt. Hier $soll wieder Unit in eckigen Klammern stehen.   Dieses Chaos ist auf die fehlenden Syntaxdiagramme zurueckzufuehren.  Vergleichen Sie das Language Reference Manual,dem eigentlichen Programm kommen.   3. Dann soll stehen: $ (------ +----------------+ - $---( USES ) -----| Unitbezeichner |-------(;)---> (------ ( +----------------+ ) - 1( - ) 2----------(,)-<-------- til) und mit den Forde-  rungen der Autoren auseinander.   Die Autoren Henry F. Ledgard, Paul A. Nagin und John F. Hueras sind nicht  nur seit Jahren mit der Sprache Pascal vertraut sind, sondern sie schreiben  auch Programme hoher Qualitaet, sie liessen sich sogar durch Andrew Singer  (!!!) anregen, den besten Programmierer und Programmdesigner, den sie je tra-  fen. Programmierer koennen und sollen Programme schreiben, die beim ersten  mal einwandfrei are auf den Seiten 64, 67 und 155 moechte ich unsere Autoren  entschuldigen. Bestimmt haben nicht sie, sondern Hilfskraefte das geschrie-  ben, die sich nicht auskannten. Sie haben die Programme bestimmt in gutem  Glauben dorthin gesetzt.  Vergleichennbricht, weil der Bereich  einer Variablen falsch deklariert ist (Seite 46).   Wenn die fehlende Variablendeklaration ergaenzt ist, werden Sie es bemerken,  wenn das Programm zusammenbricht, weil durch 0 dividiert wird (S. 67).   Fuer die Programm Merksatz 24: Lassen Sie ihr Programm mindestens einmal laufen.   Sie werden es bemerken, wenn einer Variablen vor ihrer Verwendung kein Wert  zugewiesen worden ist (beide Programme auf Seite 42).  Sie werden es bemerken, wenn das Programm zusammeg sein koennen.   Auch eine Formel fuer die Aufloesung von quadratischen Gleichungen steht  darin. An Beispiel 8 von Seite 24 kann man freilich nicht mit Sicherheit  sagen, ob hier eigentlich die Aufloesung quadratischer Gleichungen gemeint  ist.  Fehler vorhanden sind (S. 57).   Merksatz 23: Schauen Sie in der Formelsammlung nach!   In der Formelsammlung steht bestimmt eine Formel, wie man Farenheitgrade in  Celsiusgrade umrechnet. Die Programme von Seite 36 und 37 haetten dann  richtiariable (S. 67),  Variable verschieden benannt (S. 117, zwei mal),  Klammer auf vergessen (S. 118),  Variable unterschiedlich benannt (S. 157),  Strichpunkt an falscher Stelle (S. 162),  Natuerlich faellt dem Compiler nichts auf, wenn nur inhaltliche  fehlerhafte Arraydeklaration (S. 44),  Versuch, eine Konstante einzulesen (S. 46),  illegales Zeichen (" als Anfuehrungszeichen), zweimal (S. 64),  fehlenden Strichpunkt (S. 64, gleiche Zeile),  Variable verschieden benannt (S. 64),  undeklarierte Vene Klammer (S. 26 oben),  vergessene Doppelpunkte vor dem "="-Zeichen (S. 31 vier mal),  ein Anfuehrungszeichen an falscher Stelle, wenn dadurch eine neue  Variable auftaucht (S. 40 ganz unten),  undeklarierte Variablen (S. 42, zwei mal),  Programmierer zu halten hat. Reichen 21 Regeln?  Meiner Meinung fehlt da noch was:   Merksatz 22 Lassen Sie Ihr Programm durch den Compiler laufen, ,bevor Sie es in einem Buch veroeffentlichen!   Dem Compiler faellt vieles auf, z. B.  vergessze angeben, die  auch die Autoren mit Nutzen haetten verwenden koennen.   Wie werden die Autoren ihrem Anspruch gerecht?  ----------------------------------------------   Die Autoren stellen 21 Regeln auf, an die sich nach ihren Vorstellungen ein  Mitautoren bewundernd aufzuschauen.   So weit es sich bei den Edelsteinen um reine Banalitaeten handelt, will ich  sie nicht erwaehnen, ich moechte allerdings einige Merksaetze und Thesen  kritisieren, einige relativieren und einige weitere MerksaetForm von Merksaetzen  (proverbs) helfen Pascalprogrammierern tatsaechlich Programme zu schreiben,  die beim ersten mal korrekt arbeiten (Verlagswerbung). Schon bevor man das  Buch aufschlaegt, ist es daher in Wahrheit billig und recht, zu Ledgard und s Sie sicher sein koennen, dass sie zu den  best lesbaren Programmen gehoeren, die jemals irgendwo heute gesehen wurden.  Die Anleitung fuehrt ueberlegene Methoden des Programmentwurfs und der Pro-  grammkonstruktion in Pascal ein. Diese Edelsteine in beiten. So lautet einer ihrer Wahlsprueche, der immer wie-  der im Buch und zweimal auch auf der Rueckseite des Buchs auftaucht. Sie wer-  den viele Beispiele von Pascalprogrammen finden, die durch und durch gelesen  und kritisiert worden sind, so das Sie:  Merksatz 14: Machen Sie die Syntax jetzt richtig.  Merksatz 17: Kontrollieren Sie das Programm von Hand!  Merksatz 18: Bereiten Sie sich vor, den Pudding zu beweisen!  Merksatz 19: Lassen Sie einen Anderen das Werk lesen!  "Programmierer koennen und sollen Programme schreiben, die beim ersten mal  richtig arbeiten." Fuer unsere Autoren streichen wir das "koennen".    Schoen formatieren  ------------------    "Prettyprint" - Schoen formatieren - Das ist das Sp bei der Adaption eines bestehenden Pro-  gramms an eine (leicht) veraenderte Zielsetzung eher die "bottom-up"-Richtung  ueberwiegt (Niklaus Wirth, Systematisches Programmieren, S. 121). Wir sind  also unter die Fans geraten.  Warum misslingen oft draxis laesst sich ... die Entwicklung eines Programms kaum als  strikter "top-down" oder "bottom-up" Prozess durchfuehren. Immerhin darf  festgestellt werden, dass bei der Neukonzeption eines Algorithmus die "top-  down"-Methode dominant ist, waehrend "Gehen Sie von oben nach unten vor! Hueten Sie sich vor anderen Verfahren!" !  Vergleichen wir einmal mit Wirths Aussagen. Da werden erst einmal die "top-  down"- und die "bottom-up"-Methode vorgestellt, dann heisst es viel schlich-  ter: In der Pe beim ersten Pro-  grammieren. Dieses Problem trifft man praktisch bei jedem Programm mit In-  halt. Illusorisch, sich von Gliederung oder anderen Formalien etwas zu er-  hoffen.    Top-down-Methode  ---------------- ! ! aus Mathematik-, Quantenmechanik-  und Programmierlehrbuch. Wenn ich mich mit einem groben Verstaendnis zufrie-  dengebe, gehts schnell, wenn ich jeden einzelnen Schritt mit Begruendung ver-  stehen will, muss ich mir nur etwas weniger Muehe geben, wi Dann schriftliche Umformungen aller moeglichen Glei-  chungen durchfuehren, ueberlegen, wie man das am besten berechnet und warum.  Illusorisch waere es, so etwas in ein Programm schreiben zu wollen. Es ent-  staende in Kommentarklammern eine Mischung wellenfunktionen berechnet und zeichnet. Im Moment haette ich wenig Chancen  so ein Programm zu verstehen. Ich muesste mich erst einmal wieder in die  Mathematik des Themas einarbeiten, Lehrbuecher und Formelsammlungen waelzen,  eine elende Arbeit. rogrammen ab (wie etwa einem Programm, das  ueberprueft, ob Zuege bei einem Damespiel legal sind), dann ist Verstehen nie  besonders einfach. Nehmen wir als Beispiel ein Programm, das Wasserstoff- ein Programm kann - mangels Verstaend-  nis - nie sicher erkennen, was zusammengehoert und wo sinnvollerweise  gegliedert werden sollte.   Verstaendlichkeit von Programmen  -------------------------------- ! !  Sehen wir einmal von witzlosen Pegeln wie "Jede Anweisung muss auf einer eigenen Zeile be-  ginnen.", "Mindestens 3 Leerzeilen muessen vor Procedure- und Functionsde-  klarationen erscheinen." besteht kein Bedarf. Fuer ein automatisches Forma-  tierprogramm besteht kein Bedarf, denn kann die Uebersicht verlorengehen, wenn so grosszuegig gegliedert wird, dass  man nur noch Deklarations- oder Anweisungsteil einer Procedure oder noch we-  niger vor sich sieht. Auf Papier gilt aehnliches, insbesondere bei langen  Programmen. Fuer Rsichtlichkeit foerdern, wenn relativ eng ge-  schrieben wird, keine unnuetzen Zwischenraeume eingefuegt sind, zusammengehoe-  rige oder gleichartige Anweisungen in einer Zeile erscheinen. Andererseits .   Aber:  Meiner Meinung nach sind diese Regeln verfehlt.  Bei Computern mit Bildschirmen hilft es, wenn das Programm so geschrieben ist,  dass man moeglichst die wesentlichen Elemente einer Programmeinheit ueber-  sieht. Dadurch mag es die Ueberezialhobby unserer Autoren.  Sie haben auch ein siebenunddreissigseitiges Programm entwickelt, das in den  Text eines Pascalprogramms nach gewissen Regeln Zwischenraeume und Zeilenvor-  schuebe einfuegt und Zeilen einrueckt, so weit noch nicht geschehenie Versuche, so richtig "top-down" vorzugehen?   Das Problem kann beispielsweise ungleichmaessig schwierig sein. Dann ist es  eben angebracht, sich auf die Schwierigkeit zu stuerzen. Man laesst dann Ein-  und Ausgabe, alles andere ausser Acht.   Das Problem kann unzerlegbar sein.   Das Problem kann schlecht definiert sein. Fast alle selbstgestellten Probleme  sind das. Erst waehrend des Schreibens, manchmal auch noch spaeter wird klar,  was das Beste ist. Bei Input- und Outputintensiven Hueras  Hayden Book Company, Inc., Rochelle Park, New Jersey  ISBN 0-8104-5124-7, DM 38.--   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  Michael Bauer (M134)  Ludwig-Thoma-Str. 32, 8830 Treuchtlingen  +++++++dbenennungs-, Formatierungs- und Kommen-  tierungskonventionen zu fuegen, sollte erschossen werden ..." (S. 114).  Herr Generalbundesanwalt, um dieses Buch sollten Sie sich kuemmern.    PASCAL with style  Henry F. Ledgard, Paul A. Nagin, John F. ceduren mit 6 Parametern. Diese Perversitaeten haengen damit zusammen, dass  die Autoren die Rolle der globalen Variablen nicht verstanden haben.   Und diese Leute rufen auf, mich zu ermorden: "Jeder Programmierer, der  verfehlt, sich den StandarParameter haben.  Die Procedure INITIALIZE auf Seite 185 hat 15 formale Parameter von 11 ver-  schiedenen Typen. Daneben gibt es in diesem Programm noch eine Reihe von Pro- n der Deklarationsteil lang war.   Beispiel: END; {Nullen_erkennen / Anfangserkenntnisse}  wenn Nullen_erkennen Unterprogramm von Anfangserkenntnisse ist.  Auffaellig fehlende Forderungen:   Jede Procedure oder Funktion darf hoechstens 4 formale Procedure- oder  Funktionsnamen angibt."  Beispiel: END; (* EXAMPLE *)  Nach meiner Erfahrung ist es guenstig, nicht nur den Namen der Procedure an-  zugeben, sondern auch noch den Namen der hoeheren Proceduren. Das gleiche  gilt fuer das BEGIN, wen telt. Ein Programm muss eben so komplex sein, wie das zugrundeliegende Pro-  blem. Durch willkuerliche Vorschriften laesst sich die Komplexitaet eines  Problems nicht herunterdruecken.   "Dem Ende jeder Procedure muss ein Kommentar folgen, der den, WHILE, CASE und REPEAT  darf nicht mehr als vier Niveaus tief sein. Eine Ausnahme ist lediglich zur  Simulation verallgemeinerter CASE-Anweisungen erlaubt."  Aber:  Je weniger Niveaus hier, desto schlimmer sind die Unterprogramme verschach- RE EXAMPLE vorgemacht, wie sie  das meinen. Leider misslingt es ihnen zweimal, eine fehlerfreie Parameter-  liste zu schreiben (S. 118 und S. 162). Ich schlage vor, wir lassen es auch  bleiben.   "Die Verschachtelung jeder Kombination von IF, FORlls FALSE. Wertzuordnung  ueber globale Variable oder Variablenparameter.   "Die Parameter einer Procedure muessen mit Kommentaren erklaert werden, die  die logische Rolle jedes Parameters beschreiben."  Gerne haetten es die Autoren an einer PROCEDU den Wert einer globalen Variablen veraendern."  Ein besonders sinnvolles Beispiel fuer die Verletzung dieser Regel: Eine  Funktion vom Typ BOOLEAN. Sie versucht einem String einen Wert zuzuordnen.  Gelingt das, so erhaelt sie den Wert TRUE, andernfaProgrammkommentar enthal-  ten. Hier schaemen sich die Autoren nicht, einen Kommentar abzudrucken, in  dem 9 Kommentarklammern geoeffnet, aber nur 6 geschlossen werden. Pfui!   "Keine Funktion darf irgendeinen ihrer aktuellen Parameter oder re Zeit benutzt hat, wird klar, was noch nicht ideal ist, wie man es  noch verbessern koennte.   Willkuerliche Einschraenkungen und Vorschriften  -----------------------------------------------   Alle Programme sollen einen genau vorgeschriebenen Programmen ist das oft der  Fall. Meine haeufigst verwendeten Programme sind das etwa.   Ziel: Eingabe moeglichst einfach, luxurioes, bequem, sicher, ... Aber was  bedeutet denn "einfach, luxurioes, bequem, sicher"? Wenn man die Programme  laenge++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++