BuK/IIm14/Studenten/s3tomack/ka/ram

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Pascal</language>
== Kreativaufgabe RAM Programm ==

=== Aufgabenstellung ===

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 1 ===

{|| border="1" cellpadding="5" cellspacing="0"
!BNr
!Befehl
!Kommenter

|-
||<div align="right">0</div>||R0 = 5|| R0 = n
|-
||<div align="right">1</div>||R3 = 1|| Inkrement-/Dekrement-Variable
|-
||<div align="right">2</div>||IFZERO R2 GOTO 6|| wenn Multiplikationszähler (R2) gleich 0, Multiplikation beendet
|-
||<div align="right">3</div>||R4 += R1|| Zwischenergebnis der Multiplikation
|-
||<div align="right">4</div>||R2 -= R3|| Multiplikationszähler dekrementieren
|-
||<div align="right">5</div>||GOTO 2|| nächster Multiplikationszyklus
|-
||<div align="right">6</div>||R4 -= R0|| Subtraktion zum Test ob das Quadrat der Testvariablen (R1) größer ist als n
|-
||<div align="right">7</div>||IFZERO R4 GOTO 9|| wenn Ergebnis der Subtraktion gleich 0 ist, Test mit inkrementierter Testvariable wiederholen
|-
||<div align="right">8</div>||GOTO 12|| Ergebnis der Subtraktion größer 0, Ergebnis gefunden
|-
||<div align="right">9</div>||R1 += R3|| Testvariable inkrementieren
|-
||<div align="right">10</div>||R2 = R1|| Multiplikationszähler gleich der Testvariable setzen
|-
||<div align="right">11</div>||GOTO 2|| nächster Testzyklus
|-
||<div align="right">12</div>||R1 -= R3|| Ergebnis dekrementieren zwecks Abrunden
|-
||<div align="right">13</div>||R0 = R1|| Ergebnis nach R0 übernehmen
|-
||<div align="right">14</div>||STOP|| Programmende
|}

<code id="558ba2eb632b7">
function monusminus(x, y: integer) : integer;
   begin
      if (x-y) >= 0 then result:= x-y
      else result:= 0
   end;

function ram(): integer;
   label l2, l6, l9, l12;
   var r0 : integer = 0;
       r1 : integer = 0;
       r2 : integer = 0;
       r3 : integer = 0;
       r4 : integer = 0;
   begin
      r0 := 5;
      writeln(intToStr(r0));
      r3 := 1;
  l2: if r2 = 0 then goto l6;
      r4 := r4 + r1;
      r2 := monusminus(r2,r3);
      goto l2;
  l6: r4 = monusminus(r4,r0);
      if r4 = 0 then goto l9;
      goto l12;
  l9: r1 := r1 + r3;
      r2 := r1;
      goto l2;
 l12: r1 := monusminus(r1,r3);
      r0 := r1;
      result := r0;
   end;
</code>

<check>
result := (monusminus(3,2) = 1) AND (monusminus(2,3) = 0);
</check>

<run id="558ba2eb6332c">
writeln(intToStr(ram()));
</run>