home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 08 / grdlagen / hanoi_hk.bas next >
Encoding:
BASIC Source File  |  1989-04-06  |  34.2 KB  |  306 lines

  1. 1 '****************************************************************************
  2. 2 '
  3. 3 '  Hanoi_HK.BAS      :Nicht-rekursiver ( iterativer ) Algorithmus, der zeigt,   '  wie die Umsetzung  des   TURMs VON HANOI   der Erzeugung eines  einschrit-   '  tigen, binären und zyklischen  Codes äquivalent  ist.(C) W.D.Meisel, 1986.   '
  4. 4 '  Eine  Arbeit über  die Struktur und Erzeugung derartiger Algorithmen wird    '  an anderer Stelle  veröffentlicht werden.                                    '
  5. 5 '  Hierarchisches Programm  in    WHILE-BASIC ( ohne GOTO  und GOSUB nur mit    '  Zielzeile 100  -- (mit zwei,   die Iteration zeitoptimierenden Ausnahmen).   '  Die Ausgaben sind  zusätzlich  durch Umstellen beschleunigt.                 '
  6. 6 '  Verschiedene Tips  und Tricks  sind im Quelltext knapp dokumentiert.  U.a.   '  finden Sie Verfahren zum Abbruch auch beim EXE-File, für "standfeste" Ein-   '  gaben, zur BOOLE-Algebra bei BASIC, zur  Kombination von Bewegungsabläufen   '  usw.
  7. 7 '
  8. 8 '****************************************************************************   '                                                                               '
  9. 9                                                         '=========='
  10. 10   WHILE NOT          PROGRAMM%  :PROGRAMM%  =-1        'Einleitung'
  11. 11   KEY   OFF         :WIDTH 80   :CLS                   '=========='
  12. 12   DEFINT   A - Z    :TRUE= -1   :FALSE= 0   :DEF   SEG                                              'Besitzt 'ne INTEGER-Variable  x%  =-1  als Wert, so ist                        'while x%   "wahr" und   für   x%  = 0 "falsch"
  13. 13   KEY 17,  CHR$(4)  +CHR$(70)   'Key 11 - 14 sind  von  BASIC definiert !!!!
  14. 15   IF NOT   K12       THEN        K12=TRUE   :ON KEY(12) GOSUB  15                                    ELSE        LINKSPFEIL =TRUE      :GOSUB 100:    RETURN
  15. 16   IF NOT   K13       THEN        K13=TRUE   :ON KEY(13) GOSUB  16                                    ELSE        RECHTSPFEIL=TRUE      :GOSUB 100:    RETURN
  16. 17   IF NOT   K17       THEN        K17=TRUE   :ON KEY(17) GOSUB  17                                    ELSE        ABBRUCH    =TRUE
  17. 18   IF    ABBRUCH      THEN Z$  = "Abbruch des Programms  durch Benutzer !"    :       IF A.NR =2      THEN CLS   :END         ELSE LOCATE 21,1 :PRINT Z$ :END :          LOCATE 21, 1:PRINT       SPACE$(40) :PRINT"  " :PRINT"     ";:RETURN
  18. 19         ERSTMALS    =TRUE
  19. 20   WEND 'Vorbereitung:Programm% als implizite  Definition ist notwendig, weil      '     noch   keine explizite Definition erfolgt ist  - wie z.B. DEFINT A-Z      '
  20. 21   '     KEY 17 weist dem  CTRL+BREAK nach    KEY(17) ON eine neue Rolle zu :      '     Das Programm wird sofort beendet  -- Mit   CONT kann bei  GW - BASIC      '     nach END fortgesetzt werden !!!!,    im compilierten Programm  nicht      '
  21. 99   '                                                                               '-------------------------------------------------------------------------      '
  22. 100  :                 'Unterprogramm-Sprünge erfolgen (fast) immer auf   100 !                        'Ausgeführt wird dann der durch <Name> =TRUE aktivierte                         'WHILE..WEND-Block und dort Desaktivierung sowie RETURN
  23. 109  '                                                                               '-------------------------------------------------------------------------      '
  24. 110  WHILE PROGRAMM    :PROGRAMM                                         =FALSE
  25. 111  IF    ERSTMALS     THEN        A.EIN= 1 :T.EIN= 3 :S.EIN$="A":Z.EIN$=  "C" :                       DL   =256           ' Setzen von  Parametervorschlägen                                              ' dl steuert Bildausgabeverzögerung
  26. 112                                 LOCATE ,, 1
  27. 113    MENUE    =TRUE  :GOSUB 100  :LOCATE ,, 0
  28. 114    HANOI    =TRUE  :GOSUB 100  :LOCATE ,, 1
  29. 115    ABSCHLUSS=TRUE  :GOSUB 100
  30. 116  WEND 'Programm    :Die 3 Aufrufe MENUE, HANOI und ABSCHLUSS beinhalten die      '                  g e s a m t e Programmsteuerung                              '
  31. 119  '                                                                               '----------------- Nun folgen Hilfsprogramme zur Cursorsteuerung ---------      '
  32. 150  WHILE LINKSPFEIL  :LINKSPFEIL =FALSE    :Z.ALT=CSRLIN:S.ALT=POS(0)
  33. 151  IF DL>1 THEN  DL  =DL\2 :DY   =DL+(DL=1)'schneller, da  weniger  verzögert
  34. 152  LOCATE 25,71      -(A.NR=2)   :PRINT DY;:LOCATE Z.ALT,S.ALT
  35. 153  RETURN
  36. 154  WEND
  37. 155  WHILE RECHTSPFEIL :RECHTSPFEIL=FALSE    :Z.ALT=CSRLIN:S.ALT=POS(0)
  38. 156  IF DL<16384        THEN  DL   =DL*2     'langsamer, da  m e h r  verzögert
  39. 157  LOCATE 25,71      -(A.NR=2)   :PRINT DL;:LOCATE Z.ALT,S.ALT
  40. 158  RETURN
  41. 159  WEND              'Geschwindigkeitssteuerung durch  Tasten                      '
  42. 160  '                  BOOLE'sche Algebra in BASIC mit INTEGER-Funktionen:          '                  (Z=X) ist  -1, falls "wahr" sonst  0    und ebenso           '                  (Z)   ist  -1, falls  Z<>0  sonst  0    usw.
  43. 161  '                  Ausserdem  ist NOT Z% als  -1-Z% zu berechnen, was           '                  für "wahr" die Festlegung Z%=-1  erfordert !!!!!!!           '
  44. 199  '                                                                               '----------------- Nun folgt   die Menue-Maske ---------------------------      '
  45. 200  WHILE MENUE       :MENUE                                            =FALSE
  46. 201    CLS
  47. 202    PRINT"              E i n g a b e n ,  um den TURM VON HANOI umzusetzen.
  48. 203    PRINT
  49. 204    PRINT" Das Programm schlägt Ihnen ein MENUE vor. Wenn Sie daran etwas" ;
  50. 205    PRINT" ändern  wollen,"     :PRINT" geben Sie bitte"                   ;
  51. 206    PRINT" den Anfangsbuchstaben des betroffenen Parameters und die dafür
  52. 207    PRINT" zulässigen Werte ein (  z.B.   T=7   oder P:C,B  ).
  53. 208    LOCATE  8, 7    :COLOR 15,0 :PRINT"A";:COLOR 7,0:PRINT"usgabeformen   ";
  54. 209                     COLOR 15,0 :PRINT"1";:COLOR 7,0
  55. 210                                 PRINT"  T e x t g r a f i k
  56. 211    LOCATE  9,23    :COLOR 15,0 :PRINT"2";:COLOR 7,0
  57. 212                                 PRINT"  Liste => Bildschirm
  58. 213    LOCATE 10,23    :COLOR 15,0 :PRINT"3";:COLOR 7,0
  59. 214                                 PRINT"  Liste =>    Drucker
  60. 215    LOCATE 11,23    :COLOR 15,0 :PRINT"4";:COLOR 7,0
  61. 216                                 PRINT"  kombiniert `1'und`3'
  62. 217    LOCATE 13, 7    :COLOR 15,0 :PRINT"T";:COLOR 7,0:PRINT"urmhöhe        ";
  63. 218                                 PRINT"zwischen       "                    ;
  64. 219                     COLOR 15,0 :PRINT"1";:COLOR 7,0:PRINT" und "          ;
  65. 220                     COLOR 15,0 :PRINT"9"
  66. 221    LOCATE 16, 7    :COLOR 15,0 :PRINT"P";:COLOR 7,0:PRINT"lätze          ";
  67. 222                                 PRINT"Start,Ziel  ε { "                   ;
  68. 223                     COLOR 15,0 :PRINT"A,B,C"      ;:COLOR 7,0   :PRINT  " }
  69. 224    LOCATE  8,57                :PRINT"Vorschlag A ="       ;          A.EIN
  70. 225    LOCATE  9,57                :PRINT"Ihre Wahl ?  "
  71. 226    LOCATE 13,57                :PRINT"Vorschlag T ="       ;          T.EIN
  72. 227    LOCATE 14,57                :PRINT"Ihre Wahl ?  "
  73. 228    LOCATE 16,57                :PRINT"Vorschlag P : "      ;S.EIN$","Z.EIN$
  74. 229    LOCATE 17,57                :PRINT"Ihre Wahl ?  "
  75. 230    LOCATE 20, 7                :PRINT"Mit der Eingabe "                   ;
  76. 231                     COLOR 15,0 :PRINT"E";:COLOR 7,0:PRINT"nde wird der V" ;
  77. 232                                 PRINT"orschlag   durch   Ihre Wahl ergänzt.
  78. 233    LOCATE 22, 2                :PRINT"Bitte wählen Sie .. :"              ;
  79. 234    LOCATE 22,49                :PRINT"und drücken Sie die Taste ENTER
  80. 235    AUSWAHL=TRUE    :A.MAX  = 4                        :     GOSUB       100 :                                                                        RETURN
  81. 239  WEND 'Menue  ruft  jeweils     Auswahl samt anschließender Auswertung  auf      '     End.Auswahl  setzt dann  die restlichen Programmparameter   und ruft      '     den zweiten  Hauptteil   HANOI  im    PROGRAMM                            '
  82. 250  WHILE END.AUSWAHL :END.AUSWAHL  =  FALSE  : UNZULAESSIG             =FALSE
  83. 251    IF  ERSTMALS     THEN    DIM   HOEHE%(2), FUNDAMENT%(9)  ,WEGWEISER% (9)                        ,HOCH%(2)     ,PLATZ$(2), DREHUNG%(1)    ,ZEILE$(18)
  84. 252        N     =T.EIN:START$       =  S.EIN$ : ZIEL$    =      Z.EIN$
  85. 253        A.NR  =A.EIN:START  =ASC(START$)-65 : ZIEL     =  ASC(ZIEL$)  -   65
  86. 255    FOR J=0 TO 2    :HOEHE%   (J) =0:NEXT   : HOEHE%         (START)  =    N
  87. 256                     ECHTZEIT.LFD!=0
  88. 257        KEY (12) ON :KEY (13) ON  :KEY (17)   ON
  89. 258        DEF SEG = 0 :POKE 1050   ,PEEK(1052): DEF SEG  :              RETURN           'Tastaturpuffer jetzt leer :vergleiche hierzu die  Zeilen 5018 - 5019
  90. 259  WEND 'End.Auswahl  und Anpassung an Ausgabe und Algorithmus                     '     Dim Platz$   hier (statt in 6000 ff.) für konsekutive Compilation !!      '
  91. 299  '                                                                               '----------------- Nun folgt  der nichtrekursive Algorithmus -------------      '                  zum Umsetzen des  Turm's von  HANOI                          '
  92. 300  WHILE HANOI       :HANOI                                            =FALSE
  93. 310        STOCKWERK=9 :ANFANG   = 3-ZIEL+START: MITTE    = 3 - ZIEL   -  START :          DREHUNG%(1) =ANFANG   *(1     +N MOD  2)                             :          DREHUNG%(0) =ANFANG   *(2     -N MOD  2)'abhängig v. Ziel,Start u. N
  94. 320    FOR J=1 TO N    :FUNDAMENT%(J)    =START: WEGWEISER%(J)= 1        : NEXT
  95. 330                     BESCHRIFTUNG           = TRUE     :     GOSUB 100
  96. 335                    'Abwechselnd werden immer das ursprünglich N -te  Stock-                        'werk und dann  dasjenige umgesetzt, dessen übergeordne-                        'tes eine gerade Zahl von Umsetzungen hinter sich hat.
  97. 340                     ECHTZEIT!              = TIMER
  98. 350    FOR SCHRITT  =1  TO   2^N - 1
  99. 351    IF  STOCKWERK>1  THEN       STOCKWERK=1 : ELSE           STOCKWERK=    2 :          WHILE        WEGWEISER%(STOCKWERK-1)> 0                              :                       STOCKWERK= STOCKWERK+1 :                           WEND
  100. 352        DREHUNG     =DREHUNG%  (STOCKWERK     MOD 2)
  101. 353        VON         =FUNDAMENT%(STOCKWERK)  : NACH     =(VON+DREHUNG)MOD   3
  102. 354                     FUNDAMENT%(STOCKWERK)  = NACH
  103. 355                     WEGWEISER%(STOCKWERK)  =-WEGWEISER%    (STOCKWERK)
  104. 356                     AUSGABE                = TRUE     :     GOSUB       900
  105. 357    NEXT
  106. 360                     ECHTZEIT!              = TIMER    -     ECHTZEIT!
  107. 370                     END.AUSGABE            = TRUE     :     GOSUB 100
  108. 380                                                                      RETURN
  109. 389  WEND 'Hanoi        Zeit-Optimierung mit     GOSUB 900  in  Zeile 356            '                  Die Wegweiser ergeben den in Zeile  3   erwähnten            '                  einschrittigen, binären  zyklischen Code !!!!!!!!
  110. 399  '                                                                               '----------------- Das Ausgabeende führt zurück nach PROGRAMM ------------      '                  und dort in den 3.Hauptabschnitt ABSCHLUSS                   '
  111. 400  WHILE ABSCHLUSS   :ABSCHLUSS                                        =FALSE
  112. 401        KEY (12)OFF :KEY (13)  OFF:KEY (17)OFF  :ERSTMALS             =FALSE
  113. 402     IF A.NR=3       THEN      LOCATE 4,1
  114. 403  PRINT"Noch ein Durchlauf erwünscht ( J/N ) "; :COLOR 23:PRINT "?"        ; :          ZLPOS       =CSRLIN   :SPOS  =POS(0)    :COLOR  7                    :          WUNSCH  = 1
  115. 404  WHILE WUNSCH <= 1 :WUNSCH$  =INKEY$:WUNSCH    =INSTR("#NnJj",WUNSCH$):WEND           'Beachte:Mit  Wunsch$  ="" ist Wunsch    =1,also # eingefügt !!
  116. 405     IF WUNSCH  > 3  THEN      PROGRAMM=TRUE    :JA      =TRUE                                       ELSE IF   WUNSCH>1    THEN  JA      =FALSE
  117. 406     IF NOT JA THEN  LOCATE    ZLPOS,SPOS-1     :PRINT  ": NEIN ----> Ende"; :          IF   A.NR=2  OR A.NR=3                                                                 THEN  LOCATE    ZLPOS-3   ,1      ELSE     LOCATE      1,1
  118. 407                     LFD.     =FALSE                     :            RETURN
  119. 409  WEND 'Abschluss   (lfd. vereinfacht  die Ausgabeform    A.Nr.4 (s.4000ff.)      '                                                                               '
  120. 499  '*************************************************************************      '----------------- Nun folgt die  E I N G A B E  der Parameter -----------      '                  und deren Prüfung auf Zulässigkeit lt.MENUE                  '
  121. 500  WHILE AUSWAHL   :     AUSWAHL                                      =FALSE
  122. 501     OK=  FALSE   :     EINGABE             = TRUE       :GOSUB 100
  123. 502       ZEICHEN$   =     LEFT$(EINGABE$,1)
  124. 503    IF ZEICHEN$   > "`" THEN  ZEICHEN$      = CHR$(ASC(ZEICHEN$)-32)
  125. 504    IF ZEICHEN$ < > "E" THEN  LOCATE 22,23  : PRINT SPACE$(21)               :                                LOCATE 23, 1  : PRINT SPACE$(79)
  126. 505    IF ZEICHEN$   = "A" THEN AUSGABEFORM=     TRUE       :OK =  TRUE
  127. 506    IF ZEICHEN$   = "T" THEN TURMHOEHE  =     TRUE       :OK =  TRUE
  128. 507    IF ZEICHEN$   = "P" THEN PLAETZE    =     TRUE       :OK =  TRUE
  129. 508    IF ZEICHEN$   = "E" THEN END.AUSWAHL=     TRUE       :GOSUB 100 : RETURN
  130. 509    IF  NOT OK          THEN UNZULAESSIG=     TRUE                                                      ELSE UNZULAESSIG=     FALSE
  131. 510    GOSUB 100     :     AUSWAHL                                     = TRUE
  132. 519  WEND 'Auswahl         End.Auswahl  führt zu PROGRAMM,   nachdem                 '                     die Parameter notiert worden sind                         '
  133. 600  WHILE EINGABE        :E$="" :Z= 0 :ZZ =-1 : EINGABE$="":LOCATE      22, 23
  134. 601   WHILE  ZZ
  135. 602    WHILE E$=""        :E$=INKEY$   :IF      (E$ ="E" OR E$="e")  AND Z  = 0                                         THEN     E  =-1 ELSE E= 0
  136. 603       IF E   THEN      EINGABE = 0 :LOCATE   22 ,49     :PRINT   SPACE$(31) :         LOCATE 22,23    :COLOR 0 , 7 :PRINT   "Eingabeende"                 ; :                          COLOR 7 , 0 :         EINGABE$="E"           :RETURN
  137. 604    WEND :E.=-ASC(E$) *(LEN(E$) = 1)        : IF E.= 8    THEN  IF     Z > 0        THEN  Z = Z - 1    :OL      =    CSRLIN : OS=POS(0)   : LOCATE  OL,OS -1 :      PRINT" ";:EINGABE$= LEFT$(EINGABE$,  LEN (EINGABE$)-1): LOCATE  OL,OS -1
  138. 605       IF 32< E. AND E.<127                   THEN                                     IF Z < 5         THEN  EINGABE$  =     EINGABE$+E$:PRINT E$;   :Z=Z+1                            ELSE  BEEP
  139. 606          E$=""        :IF    E.=13           THEN                                     IF Z > 0         THEN  PRINT CHR$(13): ZZ= 0      :EINGABE     =FALSE                            ELSE  BEEP
  140. 607   WEND'Vor Compilation bitte in 603          For hz= 0   to  7000 :   next:           'vor color 7,0   einfügen, um das Eingabeende etwas länger anzuzeigen
  141. 608                                                                      RETURN
  142. 609  WEND 'Eingabe         zeichenweise   und    zwischenraumfrei                    '     mit             Steuerung     durch   backspace und  carriage-return      '    (LEN(E$) = 1)    hat den Wert  -1,     falls WAHR, sonst 0                 '
  143. 610  WHILE UNZULAESSIG    :UNZULAESSIG     =     FALSE
  144. 611    LOCATE 22,23       :PRINT SPACE$(21);
  145. 612    LOCATE 23, 2       :PRINT"U N Z U L Ä S S I G !! - Bitte neue Eingabe  " ; :    PRINT"  statt   "; :COLOR 0,7           : PRINT" "EINGABE$" ";:COLOR 7,0
  146. 613                                                                      RETURN
  147. 619  WEND 'Unzulässig                                                                '
  148. 700  WHILE AUSGABEFORM    :AUSGABEFORM     =     FALSE 'liefert A aus (1,2,3,4)
  149. 701        A              =VAL (MID$(EINGABE$,3))
  150. 702  IF  A<1 OR  A>A.MAX   THEN UNZULAESSIG=     TRUE       :GOSUB 100 : RETURN
  151. 703  IF  0<A AND A<A.MAX+1 THEN LOCATE  9,67   : PRINT"A =" ;A         :A.EIN=A
  152. 704                                                                      RETURN
  153. 709  WEND 'Ausgabeform                                                               '
  154. 710  WHILE TURMHOEHE      :TURMHOEHE       =     FALSE 'liefert      0 < T < 10
  155. 711        T              =VAL (MID$(EINGABE$,3))
  156. 712    IF  T<1 OR  T>9     THEN UNZULAESSIG=     TRUE       :GOSUB 100 : RETURN                            ELSE LOCATE 14,67   : PRINT"T =" ;T         :T.EIN=T
  157. 713                                                                      RETURN
  158. 719  WEND 'Turmhoehe                                                                 '
  159. 720  WHILE PLAETZE        :PLAETZE         =     FALSE 'liefert s$<>z$ε (A,B,C)
  160. 721        P$             =     MID$(EINGABE$,3)
  161. 722    IF  LEN(P$) <>3     THEN UNZULAESSIG=     TRUE       :GOSUB 100 : RETURN
  162. 723        S$             =LEFT$ (P$,1):IF S$>"`"THEN S$    =CHR$ (ASC(S$) -32)
  163. 724        Z$             =RIGHT$(P$,1):IF Z$>"`"THEN Z$    =CHR$ (ASC(Z$) -32)
  164. 725        IF   S$ = Z$    OR   S$<"A"  OR S$>"C"  OR Z$<"A" OR        Z$> "C"                             THEN UNZULAESSIG=     TRUE       :GOSUB 100 : RETURN                            ELSE LOCATE 17,67   : PRINT   "P : "        S$"," Z$
  165. 726                                              S.EIN$ =S$ :Z.EIN$        = Z$
  166. 727                                                                      RETURN
  167. 729  WEND 'Plaetze                                                                   '                                                                               '
  168. 899  '*************************************************************************      '---- Ab hier beginnt die Zusammenstellung der A U S G A B E N -----------      '     aufgeteilt in AUSGABE A(uswahl).Nr und BESCHRIFTUNG A.Nr                  '
  169. 900  WHILE AUSGABE AND     NOT A.NR.ABHAENGIG  : A.NR.ABHAENGIG          = TRUE
  170. 901                        ECHTZEIT.LFD!       = TIMER    -     ECHTZEIT.LFD!
  171. 902        SCHRITT$       =STR$     (SCHRITT)                                   :          VON$           =CHR$     (VON +65)  : NACH$         =CHR$  (NACH+65)
  172. 903                                                             GOSUB  1000
  173. 904        HOEHE%(VON)    =HOEHE%   (VON)-1    : HOEHE%(NACH)  =HOEHE%(NACH)+1
  174. 905                        ECHTZEIT.LFD!       = TIMER    -     ECHTZEIT.LFD!
  175. 906                                              A.NR.ABHAENGIG          =FALSE
  176. 907                                                                      RETURN
  177. 909  WEND 'gemeinsame      Ausgabe             ( z.B. Zeitmessung für Ausgaben)      '                     Zeit-Optimierung   mit     GOSUB 1000 in  Zeile 903       '
  178. 999  '-------------------------------------------------------------------------      '     Ausgabe 1  zeigt ein textgrafisches   Umsetzen des   Turm's               '-------------------------------------------------------------------------      '
  179. 1000 WHILE AUSGABE         AND A.NR=1          : AUSGABE                 =FALSE
  180. 1001   FOR J=12 TO 17                          ' *************  Schiebefenster
  181. 1002                                             ZEILE$(J-1)   =ZEILE$(J)
  182. 1003   LOCATE         J -1,66                  : PRINT          ZEILE$(J-1)
  183. 1004   NEXT
  184. 1005   STOCKWERK0   = STOCKWERK                                                 :      STOCKWERK1   = STOCKWERK+INV            *(N+1 -STOCKWERK-STOCKWERK)
  185. 1006   ZEILE$(17)   = SCHRITT$                 + SPACE$  (5-LEN(SCHRITT$))                          + STR$(STOCKWERK1)         + "   "   +VON$+"  "+NACH$
  186. 1007   LOCATE 17,66 : COLOR 31,0               : PRINT ZEILE$(17)  :COLOR   7,0
  187. 1010   '**************************************** Optimierung der Überflughöhe !
  188. 1011   IF HOEHE%(0) <=HOEHE%(1) AND HOEHE%(2)<=HOEHE%(1) AND VON<>1 AND NACH<>1        THEN UEBERFLUG=HOEHE%(1)+1   ELSE    IF HOEHE%(NACH)     <   HOEHE%(VON)        THEN UEBERFLUG=HOEHE%(VON)   ELSE       UEBERFLUG=HOEHE%(NACH)+1         '
  189. 1021                  SP.NR=1+22*VON      : Z.NR=18-HOEHE%(VON)   'aufwärts ***
  190. 1022   WHILE  Z.NR  > 18   -UEBERFLUG
  191. 1023   LOCATE Z.NR  , SP.NR:PRINT ZEILE$(0)
  192. 1024   LOCATE Z.NR-1, SP.NR:PRINT ZEILE$(STOCKWERK1)           :Z.NR  =  Z.NR-1
  193. 1025   WEND                                                                     '
  194. 1031          BETRAG= ABS(NACH-VON)*22    : VZ = SGN(NACH-VON) 'seitwärts *****
  195. 1032                                        SP.ANF= 9+22 *VON-( STOCKWERK0)* VZ :                                           SP.END=10+22 *VON+( STOCKWERK0)* VZ
  196. 1033   FOR J= 1 TO    BETRAG
  197. 1034   LOCATE         18   -UEBERFLUG     , SP.ANF+(J- 1)*VZ + 1                :             PRINT   " "                                                     ;
  198. 1035   LOCATE         18   -UEBERFLUG     , SP.END+ J    *VZ                    :             PRINT   CHR$ (STOCKWERK1+48)
  199. 1036                                        FOR V=2  TO   DL              :NEXT
  200. 1037   NEXT                                                                     '
  201. 1041              J =  1                  : SP.NR=SP.NR+VZ*BETRAG 'abwärts ****
  202. 1042   WHILE          16   -UEBERFLUG +J  < 17-HOEHE%(NACH)
  203. 1043   LOCATE         16   -UEBERFLUG +J  , SP.NR:PRINT      ZEILE$(0)
  204. 1044   LOCATE         17   -UEBERFLUG +J  , SP.NR:PRINT      ZEILE$(STOCKWERK1)
  205. 1045              J = J+1
  206. 1046   WEND
  207. 1047                                                                     RETURN
  208. 1049 WEND   'Ausgabe       für A.Nr.1                                                '
  209. 1999 '-------------------------------------------------------------------------      '     Ausgabe 2  listet Umsetzungen und deren zyklischen Binärcode              '-------------------------------------------------------------------------      '
  210. 2000 WHILE   AUSGABE       AND A.NR=2     : AUSGABE                      =FALSE
  211. 2001         PLATZ$(NACH) =PLATZ$(NACH)   + CHR$(N-STOCKWERK+49)                :            PLATZ$(VON)  =LEFT$(PLATZ$(VON),LEN(PLATZ$(VON))-1)                :            IF     NOT    INV2  THEN       LOCATE  7
  212. 2002 '       PRINT USING"   ###";SCHRITT; : PRINT TAB(12)PLATZ$(0)                                                                TAB(25)PLATZ$(1)                                                                TAB(38)PLATZ$(2)     TAB(51);
  213. 2003         PRINT USING"   ###";SCHRITT; : PRINT TAB(12)PLATZ$(START)                                                            TAB(25)PLATZ$(MITTE)                                                            TAB(38)PLATZ$(ZIEL ) TAB(51);
  214. 2004         FOR J=N TO 1  STEP -1        : PRINT WEGWEISER%(J);:NEXT    :PRINT
  215. 2005         FOR J=2 TO DL:NEXT           :                              RETURN
  216. 2009 WEND   'Ausgabe       für A.Nr.2       2002  u. 6005 anstelle 2003 u. 6006      '       ordnen    die Plätze als A,B,C statt nach    Start, Mitte und Ziel      '       Die Wegweiser sind der in Zeile 3 erwähnte   Binärcode !!!!!!!!!!!      '
  217. 2999 '-------------------------------------------------------------------------      '     Ausgabe 3  druckt Umsetzungen und deren zyklischen Binärcode              '-------------------------------------------------------------------------      '
  218. 3000 WHILE   AUSGABE       AND A.NR=3     : AUSGABE                      =FALSE
  219. 3001  FOR J=0  TO  2:HOCH%(J)      =HOEHE%(J)    :NEXT                          :                    HOCH%(VON)    =HOEHE%(VON)-1:HOCH%(NACH)=HOEHE(NACH)+1
  220. 3002  DRUCKZEILE$   =      SPACE$(6-LEN   ( SCHRITT$))       +SCHRITT$+"      "                     +CHR$ (STOCKWERK+48)  +"   " +VON$+"   " +NACH$+ "        "
  221. 3003  DRUCKZEILE$   =DRUCKZEILE$+STR$     ( HOCH%(0)) +" "   +STR$(HOCH%(1))                        +      " "  +STR$     ( HOCH%(2))
  222. 3004  DRUCKZEILE$   =DRUCKZEILE$+"        "     +STR$((DREHUNG+3)MOD 3)+"     "
  223. 3005  FOR J=1 TO  N :DRUCKZEILE$=DRUCKZEILE$+" "+STR$((1-WEGWEISER%(J))\2)      :     NEXT  'Die Wegweiser sind der durch die Umsetzung erzeugte Binärcode !!!!             'Vergleiche Programmzeile 3
  224. 3006          LPRINT DRUCKZEILE$
  225. 3007                                                                     RETURN
  226. 3009 WEND   'Ausgabe       für A.Nr 3     Anstelle Hoch%(..)  kann  man  ebenso      '                     in  3001 Hoehe%(..) ändern und in  3007  rücksetzen!      '
  227. 3999 '-------------------------------------------------------------------------      'Ausgabe 4  kombiniert die Ausgaben 1 und 3 : ÜBERSICHT durch  WHILE Basic      '-------------------------------------------------------------------------      '
  228. 4000 WHILE  (BESCHRIFTUNG OR AUSGABE)   AND  A.NR=4
  229. 4001                                         A.NR=3                 :GOSUB  100
  230. 4002 IF NOT  LFD. THEN BESCHRIFTUNG=TRUE  :  LFD.=TRUE                                            ELSE AUSGABE     =TRUE
  231. 4003                                         A.NR=1                 :GOSUB  100                                           :  A.NR=4
  232. 4004                                                                     RETURN
  233. 4009 WEND   'Beschriftung o. Ausgabe    für  A.Nr.4                                  '
  234. 4999 '-------------------------------------------------------------------------      '  Die Beschriftungen sind aus Zeitoptimierungsgründen hintenangestellt         '-------------------------------------------------------------------------      '
  235. 5000 WHILE   BESCHRIFTUNG  AND A.NR=1 :CLS: BESCHRIFTUNG                 =FALSE
  236. 5001   LOCATE  3, 1 : PRINT STRING$(79,42) '*************  Beschriftung  ******
  237. 5002   LOCATE  4, 1 : PRINT"*      Umsetzung des " CHR$(N+48) "-stöckigen "           "TURMs VON HANOI vom Fundament "      START$"  nach "ZIEL$ "      *
  238. 5003   LOCATE  5, 1 : PRINT STRING$(79,42)
  239. 5004   LOCATE 19, 1 : PRINT"=== Fundament A ===   === Fundament B ===   "     ;
  240. 5005                  PRINT"=== Fundament C ===   Schritt
  241. 5006   LOCATE  7,71 : PRINT"Stockwerk"    : LOCATE  8,74 : PRINT"von
  242. 5007   LOCATE  9,76 : PRINT"nach"         : LOCATE 18,67 : PRINT STRING$(3,24)  :      LOCATE 25, 5 : PRINT"Mit Tasten "    " <- / -> "                                             " schneller/langsamer   :   Verzögerungsfaktor "DL+(DL=1) ;
  243. 5008                                        ZEILE$(0)    ="                   "
  244. 5009                  FOR J =10 TO 18     : ZEILE$(J)    =""    :          NEXT                                            'ASCII 27/26 statt <-/-> ändern  die                                            'Druckersteuerung bei Shift + PrtScr
  245. 5010                  INV   =1   -INV      '--von Durchlauf zu Durchlauf hat---                                            'abwechselnd das unterste  Stockwerk                                            '------die Nummer 1 bzw N !!--------
  246. 5011   FOR J= 1 TO N: INV.T =INV *(N+1-J-J)'*************  Turmerzeugung  *****
  247. 5012   ZEILE$(J)    = SPACE$(9-(J+INV.T)) + STRING$(2*(J+INV.T)+1,J+48)                             + SPACE$(9-(J+INV.T))
  248. 5013   NEXT                                                                     '
  249. 5015   FOR J= 1 TO N: INV.T =INV *(N+1-J-J)'*************  Turmaufbau    ******
  250. 5016   LOCATE         18-J,1+22*START     : PRINT ZEILE$(N+1-J-INV.T)
  251. 5017   NEXT
  252. 5018   LOCATE         22  ,1:COLOR   0,7  : PRINT"    Start durch ENTER    "  ; :      WHILE INKEY$<>"":WEND:COLOR   7,0  : E$= ""   :WHILE NOT   E$ = CHR$(13) :      E$  = INKEY$    :WEND:LOCATE 22,1  : PRINT     SPACE$(25)     : RETURN
  253. 5019 WEND   'Beschriftung  für A.Nr.1       Anstelle  ENTER auch  CONT+chr$(13)      '       Zeile  5018   löscht den Tastaturpuffer  adreßunabhängig  !!!!!!!!      '
  254. 6000 WHILE   BESCHRIFTUNG  AND A.NR=2     :CLS   :BESCHRIFTUNG           =FALSE
  255. 6001         PLATZ$(START)=S.EIN$+": "    :PLATZ$(ZIEL)=Z.EIN$+": "             :            PLATZ$(MITTE)=CHR$(MITTE+65)                     +": "             :     FOR    J=1 TO N     :PLATZ$(START)  =PLATZ$(START)      +CHR$(J+48): NEXT
  256. 6002         PRINT  " Umsetzung des "CHR$(N+48)"-stöckigen Turms von START ( "               START$ " )   nach ZIEL ( "ZIEL$" )"                         :PRINT
  257. 6003         PRINT  " Schritt   ⌐----------- Teil - Türme ----------¬"                       TAB(51)" Stockwerksmarkierungen"                                        'Diese  Markierungen ergeben den erzeugten Binärcode (vgl. Zeile 3) !!!!!!      '
  258. 6004         MARKE$=" "   :FOR J=1 TO N   :MARKE$=MARKE$+"1  "           : NEXT :            LOCATE 25, 2 :PRINT          "Mit Tasten  "        "<- / ->"                    "    schneller // langsamer  :  Verzögerungsfaktor ="  DL+(DL=1) ;
  259. 6005         LOCATE  5, 1 :INV2 = -1-INV2 '--- von Durchlauf zu Durchlauf -----                                           '------- Wechsel zwischen -----------                                           '- laufender und ortsfester Ausgabe -
  260. 6006 '       PRINT  "     0"   TAB(12)     PLATZ$(0)                                                           TAB(25)     PLATZ$(1)                                                           TAB(38)     PLATZ$(2)           TAB(51)   MARKE$
  261. 6007         PRINT  "     0"   TAB(12)     PLATZ$(START)                                                       TAB(25)     PLATZ$(MITTE)                                                       TAB(38)     PLATZ$(ZIEL )       TAB(51)   MARKE$
  262. 6008                                                                     RETURN
  263. 6009 WEND   'Beschriftung  für A.Nr.2       2002  u. 6006 anstelle 2003 u. 6007             'ordnen    d.  Plätze als A,B,C statt nach    Start, Mitte und Ziel             '
  264. 7000 WHILE   BESCHRIFTUNG  AND A.NR=3     : BESCHRIFTUNG                 =FALSE
  265. 7001         LPRINT
  266. 7002         LPRINT " #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#"                    :       LPRINT" -"SPACE$(77)"-"
  267. 7003         LPRINT " #                           T U R M  VON  H A N O I                           #"                    :       LPRINT" -"SPACE$(77)"-"
  268. 7004         LPRINT " #             Umsetzung der ";N" Stockwerke vom Fundament  ";START$" auf ";ZIEL$"             #"    :       LPRINT" -"SPACE$(77)"-"
  269. 7005         LPRINT " #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#"             :LPRINT:       LPRINT
  270. 7010         LPRINT "  Schritt   Stockwerk     Stockwerkshöhe   Drehung   Wegweiser   -   Positionen" 'Die Wegweiser sind der  erzeugte Binärcode (vgl.Zeile  3)                      '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  271. 7011         LPRINT "               von              auf                  (1  2  3  4     usw.     )
  272. 7012         LPRINT "                 nach         A  B  C"     :        LPRINT
  273. 7013         LPRINT "     0"SPACE$(23)HOEHE(0); HOEHE(1);HOEHE(2)SPACE$(15)   ; :            FOR J=1 TO N          :LPRINT    1-WEGWEISER%(J)  ;:          NEXT
  274. 7014                                                                     RETURN
  275. 7019 WEND   'Beschriftung  für A.Nr.3                                                '
  276. 8999 '-------------------------------------------------------------------------      '  Das Ende der Ausgabe berichtet über Zeitmessung und führt zu ABSCHLUSS       '-------------------------------------------------------------------------      '
  277. 9000 WHILE END.AUSGABE:END.AUSGABE                                       =FALSE
  278. 9001   IF  A.NR=4 THEN                                  ZEIT =TRUE  :GOSUB  100 :                      LPRINT:LPRINT" >> Text-Grafik    u n d   Listendruck <<" :                      LPRINT                         : DRUCK=TRUE  :GOSUB  100
  279. 9002   IF  A.NR=4 THEN LOCATE 21,1                                              :                             PRINT " >> Text-Grafik    u n d   Listendruck <<" :      LOCATE 17,66   : PRINT ZEILE$(17):LOCATE 23,1  : BILD =TRUE  :GOSUB  100
  280. 9003   IF  A.NR=3 THEN LPRINT:LPRINT    :CLS          : ZEIT =TRUE  :GOSUB  100 :                                                       DRUCK=TRUE  :GOSUB  100
  281. 9004   IF  A.NR=2 THEN  PRINT                         : ZEIT =TRUE  :GOSUB  100 :                                                       BILD =TRUE  :GOSUB  100
  282. 9005   IF  A.NR=1 THEN                                  ZEIT =TRUE  :GOSUB  100 :      LOCATE 17,66   : PRINT ZEILE$(17):LOCATE 21,1  : BILD =TRUE  :GOSUB  100
  283. 9006                                                                     RETURN
  284. 9009 WEND 'End.Ausgabe                                                               '
  285. 9010 WHILE ZEIT        :     ZEIT                                        =FALSE
  286. 9011                     ECHTZEIT!         =INT (ECHTZEIT!      *10+.5)  /   10
  287. 9012                     ECHTZEIT.LFD!     =INT (ECHTZEIT.LFD!  *10+.5)  /   10
  288. 9013       ECHTZEIT.H! = ECHTZEIT!         -     ECHTZEIT.LFD!
  289. 9014       PZEIT.AUSG! =(ECHTZEIT.LFD!     *100)/ECHTZEIT!
  290. 9015       PZEIT.HANOI!= 100               -     PZEIT.AUSG!
  291. 9016                                                                     RETURN
  292. 9019 WEND 'Zeit-Messung  für den Algorithmus                                         '
  293. 9020 WHILE DRUCK       : DRUCK                                           =FALSE
  294. 9021      LPRINT USING " Laufzeiten in sec. :####.# (für Berechnung ≈ ## %)"  ;                          ECHTZEIT.H!            ,PZEIT.HANOI!                 ;
  295. 9022      LPRINT USING ",####.# (für Ausgabe ≈### %)"                         ;                          ECHTZEIT.LFD!          ,PZEIT.AUSG!
  296. 9023      LPRINT USING " insgesamt  ####.#      "                             ;                          ECHTZEIT!
  297. 9024                                                                     RETURN
  298. 9029 WEND 'Druck-Ausgabe Zeit-Messung                                                '
  299. 9030 WHILE BILD        : BILD                                            =FALSE
  300. 9031       PRINT USING " Laufzeiten in sec   :###.# (für Berechnung ≈ ## %)"  ;                          ECHTZEIT.H!            ,PZEIT.HANOI!                 ;
  301. 9032       PRINT USING ",####.# (für Ausgabe ≈### %)"                         ;                          ECHTZEIT.LFD!          ,PZEIT.AUSG!
  302. 9033       PRINT USING " insgesamt   ###.#      "                             ;                          ECHTZEIT!                                            ;
  303. 9034                                                                     RETURN
  304. 9039 WEND 'Bild -Ausgabe Zeit-Messung                                                '                                                                               '
  305. 9999 END  'Programm      H A N O I  für  Helmut Karzel zum 22.01.1988
  306.