BuK-KA-RAM-Programm
Aus ProgrammingWiki
Inhaltsverzeichnis |
Registermaschine
Geben Sie mind. ein RAM-Programm zur Berechnung der Funktion w : \N \mapsto \N mit w(n) = \left\lfloor \sqrt{n} \right\rfloor an.
RAM-Programm: (Jens Heider und Daniel Tasche)
| Nr | Methode | Bemerkung |
|---|---|---|
| | 0 | R0 = 3 | R0 = n (Berechnung Wurzel von 3) |
| | 1 | R2 = 1 | R2 = fixer Wert für Inkrement/Dekrement |
| | 2 | R1 += R2 | R1 = aktuelle Testvariable |
| | 3 | R3 = R1 | R3 = dekrementierter Wert bei Multiplikation |
| | 4 | R4 = 0 | R4 = Summe bei Multiplikation |
| | 5 | IFZERO R3 GOTO 9 | Quadratzahl des aktuellen Testwerts gebildet? |
| | 6 | R4 += R1 | Aufsummierung für Multiplikation |
| | 7 | R3 -= R2 | Dekrementierung des Multiplikation-Zählers |
| | 8 | GOTO 5 | |
| | 9 | R5 = R0 | Begin des Tests, ob gebildete Quadratzahl größer als n |
| | 10 | IFZERO R5 GOTO 15 | Wenn n kleiner gleich gebildete Quadratzahl |
| | 11 | IFZERO R4 GOTO 2 | gebildete Quadratzahl noch nicht groß genug. Mit nächsten Testkandidaten fortfahren |
| | 12 | R4 -= R2 | gebildete Quadratzahl dekrementieren |
| | 13 | R5 -= R2 | n dekrementieren |
| | 14 | GOTO 10 | |
| | 15 | IFZERO R4 GOTO 17 | Ist gebildete Quadratzahl = n, dann Ergebnis direkt erreicht. |
| | 16 | R1 -= R2 | Ansonsten muss gebildete Quadratzahl "abgerundet" werden |
| | 17 | R0 = R1 | Ergebnis in Rückgaberegister schreiben. |
Test mit 4:
Test mit 5:
RAM-Programm (Stefan Scheumann)
| BNr | Methode | Bemerkung |
|---|---|---|
| | 0 | R0 = 25 | Berechnung Wurzel 25 |
| | 1 | R1 = 1 | R1 = aktueller Testwert |
| | 2 | R2 = 0 | R2 = alter Testwert |
| | 3 | R5 = 1 | Inkrement-Variable |
| | 4 | R10 = R1 | Parameter für die Berechnung des Quadrats; Beginne Quadrierung |
| | 5 | R11=R10 | Schleifenindex |
| | 6 | IFZERO R10 GOTO 10 | |
| | 7 | R12 += R10 | |
| | 8 | R11 -= R5 | |
| | 9 | GOTO 4 | |
| | 10 | R3 = R12 | R3 = Quadrat von aktuellen Testwert; Ende Quadrierung |
| | 11 | R20 =R0 | Vorbereitung Vergleich(Kopieren der Register) von gesuchten Wert mit Ergebnis der Quadrierung |
| | 12 | R21 = R3 | |
| | 13 | R20 -= R5 | Beginn Vergleich errechneten Wert <= gegebenen Wert; Aufbau: beide Variablen dekrementieren bis eine oder beide 0 sind. |
| | 14 | R21 -= R5 | |
| | 15 | IFZERO R20 GOTO 21 | R20(Gesuchter Wert) kleiner oder gleich R21(berechnetes Quadrat des aktuellen Testwertes) |
| | 16 | IFZERO R21 GOTO 18 | R21 kleiner R20 => weitermachen mit neuen Testwerten |
| | 17 | GOTO 13 | Wiederholen bis R20 oder R21 = 0 |
| | 18 | R2 = R1 | alter Testwert = aktueller Testwert |
| | 19 | R1 += R2 | aktueller Testwert + 1 |
| | 20 | GOTO 4 | Mit neuen Testwert von vorn anfangen. |
| | 21 | R0 = R2 | Ergebnis in Rückgaberegister schreiben. |
RAM-Programm: (Robert Rosenberger)
| | 1 | R0 = 25 |
| |2 | R3 = 1 |
| |3 | R1 += R3 |
| |4 | R5 = R1 |
| |5 | R5 -= R3 |
| |6 | R6 = R1 |
| |7 | FZERO R5 GOTO 11 |
| |8 | R5 -= R3 |
| |9 | R6 += R1 |
| |10 | GOTO 7 |
| |11 | R10 = R0 |
| |12 | R10 -= R6 |
| |13 | IFZERO R10 GOTO 15 |
| |14 | GOTO 3 |
| |15 | R15 = R6 |
| |16 | R16 = R0 |
| |17 | IF ZERO R16 GOTO 21 |
| |18 | R16 -= R3 |
| |19 | R15 -= R3 |
| |20 | GOTO 17 |
| |21 | IFZERO R15 GOTO 23 |
| |22 | R1 -= R3 |
| |23 | R0 = R1 |
| |24 | STOP |
RAM-Programm: (Tobias Salzmann und Ronald Krause)
- Heron-Algorithmus
Ausgehend von x=n und y=1 wiederholt man x=\left\lbrack \frac{x+y}{2}\right\rbrack und y=\left\lbrack \frac{a}{x}\right\rbrack solange wie x>y ist.
Ist nach Austritt aus dieser Schleife x\leq y, so gilt x=\left\lbrack \sqrt{n} \right\rbrack
| Befehlszähler | Befehl | Bemerkung |
|---|---|---|
| | 1 | R0 = n | |
| | 2 | R1 = RO | X |
| | 3 | R2 = 1 | Y |
| | 4 | R20 = R1 | |
| | 5 | R21 = R2 | |
| | 6 | GOTO 36 | Größer/KleinerVergleich |
| | 7 | IFZERO R23 GOTO 9 | |
| | 8 | STOP | Ergebnis x in R1 |
| | 9 | R3 = 0 | |
| | 10 | R3 += R1 | 0 + x |
| | 11 | R3 += R2 | x + y |
| | 12 | R4 = 2 | |
| | 13 | R10 = 0 | Wert zur Überprüfen des Rücksprunges |
| | 14 | GOTO 22 | Division |
| | 15 | R1 = R5 | neues x in R1 |
| | 16 | R3 = R0 | n in R3 |
| | 17 | R4 = R1 | x in R4 |
| | 18 | R10 = 1 | Wert zur Überprüfung des Rücksprunges |
| | 19 | GOTO 22 | Division |
| | 20 | R2 = R5 | neues y in R2 |
| | 21 | GOTO 36 | Größer/Kleinervergleich |
Ganzzahlige Division
| Befehlszähler | Befehl | Bemerkung |
|---|---|---|
| | 22 | R9 = 1 | |
| | 23 | R5 = 0 | |
| | 24 | R6 = R3 | Zähler für 1.Zahl |
| | 25 | R7 = R4 | Zähler für 2.Zahl |
| | 26 | IFZERO R7 GOTO 31 | |
| | 27 | R7 -= R9 | subtrahieren |
| | 28 | IFZERO R6 GOTO 34 | |
| | 29 | R6 -= R9 | subtrahieren |
| | 30 | GOTO 26 | |
| | 31 | R5 += R9 | addieren |
| | 32 | R6 -= R7 | |
| | 33 | GOTO 24 | |
| | 34 | IFZERO R10 GOTO 15 | |
| | 35 | GOTO 20 |
Größer/Kleinervergleich
| Befehlszähler | Befehl | Bemerkung |
|---|---|---|
| | 36 | IFZERO R20 GOTO 41 | x |
| | 37 | R20 -= R9 | |
| | 38 | IFZERO R21 GOTO 42 | y |
| | 39 | R21 -= R9 | |
| | 40 | GOTO 36 | |
| | 41 | R23 = 1 | |
| | 42 | GOTO 7 | Wenn R23 = 1; dann ist x <= y und wenn R23 = 0, dann x > y |

