Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Demoprogramm: Turm von Hanoi - Iterativer Algorithmus Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 29.01.2022 11:20)
 Als Antwort auf Turm von Hanoi von Dietmar - 29.01.2022 11:17
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station
' ===========================================================================
' Demoprogramm: Turm von Hanoi - Iterativer Algorithmus
' In OCBASIC 1.12a_e1 f├╝r Open-Maxi von Dietmar Harlos am 28. Januar 2022
' ===========================================================================

' Dieses Programm nutzt einen Algorithmus aus der folgenden PDF-Datei:

' https://www.klinger.nrw/wp-content/uploads/2021/01/306_T├╝rme-von-Hanoi-2.pdf

' Dieses Beispielprogramm demonstriert, wie mit Hilfe von PEEK und POKE
' Felder und Strukturen auf der Open-Maxi realisiert werden k├Ânnen.

' Bei 12 Scheiben und 4095 n├Âtigen Verschiebungen ben├Âtigt dieses Programm in
' der interpretierten Variante 1,4 Sekunden. Wird es mit dem echten BASIC-
' Compiler OCBASR32 kompiliert, ben├Âtigt es nur noch 0,6 Sekunden.

' An dieser Stelle m├Âchte ich mich bei Dirk von "das |_ Team" und bei Norbert
' f├╝r ihre Unterst├╝tzung bedanken. In Memoriam Norbert Klein.

' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"               'Definitionen f├╝r die Open-Maxi

DEFINE turma &h2aa               'Buffer an 1. Adresse hinter dem USER-RAM
DEFINE turmb turma+65            'L├Ąngenbyte und 64 Byte-Elemente
DEFINE turmc turmb+65

DIM bitarray BYTE                'ein Bitarray
DIM debug    BIT[1] OF bitarray  'ist HIGH, wenn Debugging aktiv

DIM a,b,c BYTE                   'tempor├Ąre Bytevariablen
DIM n BYTE                       'Anzahl Scheiben
DIM lenvon BYTE                  'Anzahl Scheiben auf dem "Von"-Turm
DIM lennach BYTE                 'Anzahl Scheiben auf dem "Nach"-Turm
DIM scheibevon BYTE              'Oberste Scheibe auf dem "Von"-Turm
DIM scheibenach BYTE             'Oberste Scheibe auf dem "Nach"-Turm

DIM von WORD                     'Turm, von dem verschoben wird
DIM nach WORD                    'Turm, zu dem verschoben wird
DIM t WORD                       'Ben├Âtigte Zeit messen
DIM anzahl WORD                  'Anzahl Verschiebungen

' --- Hauptprogramm ---------------------------------------------------------

' Titel:

PRINT
PRINT "Turm von Hanoi"
PRINT "=============="

' Initialisierungen:

PrintSpc=ON    'Bei PRINT dezimale Zahlen mit f├╝hrendem Leerzeichen ausgeben
End2Host=ON    'Bei Programmende (siehe END) gleich in den Host-Modus wechseln

debug=OFF 'ON 'OFF               'Anzeige aller Schritte

' Das Hauptprogramm:

n=12 '3 '8                       'n ist die Anzahl der Scheiben

POKE turma,n                     'L├Ąngenbytes initialisieren
POKE turmb,0
POKE turmc,0

FOR a=0 TO n-1                   'Turm A mit n Scheiben initialisieren
  POKE turma+a+1,n-a
NEXT a

?:?"Ausgangslage:"               'Ausgangslage ausgeben
anzeigen

IF debug THEN ?

anzahl=0

t=TIMER

hanoi n                          'Aufruf der Subroutine

t=TIMER-t

?:?"Ergebnis:"                   'Ergebnis ausgeben
anzeigen

?:?"Ich habe"t"*20 ms Zeit f├╝r die"anzahl" Verschiebungen ben├Âtigt."

END            'Zur├╝ck in den Hostmodus. Neustart mit RETURN-Taste.

' --- Subroutinen und Funktionen --------------------------------------------

' Turm von Hanoi - Iterativer Algorithmus

PROCEDURE hanoi(n) 'COMPILE

  ' HANOI(n)                       'n ist die Anzahl der Scheiben
  '   WENN n mod 2 = 0 DANN
  '     SOLANGE HOHE(C)<>n
  '       BEWEGE_LEGAL(A, B)
  '       BEWEGE_LEGAL(A, C)
  '       BEWEGE_LEGAL(B, C)
  '   WENN n mod 2 = 1 DANN
  '     SOLANGE HOHE(C)<>n
  '       BEWEGE_LEGAL(A, C)
  '       BEWEGE_LEGAL(A, B)
  '       BEWEGE_LEGAL(C, B)
  ' RETURN 0

  IF n MOD 2=0 THEN
    WHILE PEEK(turmc)<>n
      bewege_legal turma, turmb
      IF debug THEN GOSUB anzeigen
      bewege_legal turma, turmc
      IF debug THEN GOSUB anzeigen
      bewege_legal turmb, turmc
      IF debug THEN GOSUB anzeigen
    WEND
  ELSE
    WHILE PEEK(turmc)<>n
      bewege_legal turma, turmc
      IF debug THEN GOSUB anzeigen
      bewege_legal turma, turmb
      IF debug THEN GOSUB anzeigen
      bewege_legal turmc, turmb
      IF debug THEN GOSUB anzeigen
    WEND
  END IF

  RETURN

END PROCEDURE

' Verschiebungen durchf├╝hren

PROCEDURE bewege_legal(von,nach) 'COMPILE

  IF PEEK(turmc)=n THEN RETURN

  lenvon=PEEK(von)
  lennach=PEEK(nach)
  scheibevon=PEEK(von+lenvon)
  scheibenach=PEEK(nach+lennach)

  IF lennach=0 THEN
    ADD lennach,1
    POKE nach+lennach,scheibevon
    SUB lenvon,1
    IF debug THEN ?"gemacht1"
  ELSE IF lenvon=0 THEN
    ADD lenvon,1
    POKE von+lenvon,scheibenach
    SUB lennach,1
    IF debug THEN ?"gemacht4"
  ELSE IF scheibevon<scheibenach THEN
    ADD lennach,1
    POKE nach+lennach,scheibevon
    SUB lenvon,1
    IF debug THEN ?"gemacht2"
  ELSE
    ADD lenvon,1
    POKE von+lenvon,scheibenach
    SUB lennach,1
    IF debug THEN ?"gemacht3"
  END IF

  POKE von,lenvon
  POKE nach,lennach

  ADD anzahl,1

  RETURN

END PROCEDURE

' Die drei T├╝rme auf der Seriellen Schnittstelle anzeigen

PROCEDURE anzeigen 'COMPILE

  ?"Turm A:";
  a=0
  WHILE a<PEEK(turma)
    ?PEEK(turma+a+1);
    ADD a,1
  WEND
  ?

  ?"Turm B:";
  a=0
  WHILE a<PEEK(turmb)
    ?PEEK(turmb+a+1);
    ADD a,1
  WEND
  ?

  ?"Turm C:";
  a=0
  WHILE a<PEEK(turmc)
    ?PEEK(turmc+a+1);
    ADD a,1
  WEND
  ?

  RETURN

END PROCEDURE

' --- Programmende ---------------------------------------------------------


Passender Link: Offizielle Infosite zu den OM-Mikrocontrollern

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten: