
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
' =========================================================================== ' 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 "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 |