BuK/IIm14/Studenten/s3tomack/ka/ram

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Javascript</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">
var monusminus = function(x,y){
	if((x-y) > 0){
		return x-y;
	}else{
		return 0;
	}
}

var ram = function() {

	$("div#ausgabe").append(
		$('<table>').append(
			$('<tr>').append(
				$('<td>').text("BNr"),
				$('<td>').text("R0"),
				$('<td>').text("R1"),
				$('<td>').text("R2"),
				$('<td>').text("R3"),
				$('<td>').text("R4"),
				$('<td>').text("Next")
			)
		).attr("id", "tableAusgabe").attr("border", "1.0")
	);

	var r0 = 0;
	var r1 = 0;
	var r2 = 0;
	var r3 = 0;
	var r4 = 0;
	var befehlszähler = 0;

	$("table#tableAusgabe").append(
		$('<tr>').append(
			$('<td>').text("PRE"),
			$('<td>').text(r0),
			$('<td>').text(r1),
			$('<td>').text(r2),
			$('<td>').text(r3),
			$('<td>').text(r4),
			$('<td>').text(befehlszähler)
		)
	);
	while(true){
		var aktBefehl = befehlszähler;
		switch(befehlszähler){
			case 0:
				r0 = 5;
				befehlszähler++;
				break;
			case 1:
				r3 = 1;
				befehlszähler++;
				break;
			case 2:
				if(r2 == 0){
					befehlszähler = 6;
				}else{
					befehlszähler++;
				}
				break;
			case 3:
				r4 += r1;
				befehlszähler++;
				break;
			case 4:
				r2 = monusminus(r2,r3);
				befehlszähler++;
				break;
			case 5:
				befehlszähler = 2;
				break;
			case 6:
				r4 = monusminus(r4,r0);
				befehlszähler++;
				break;
			case 7:
				if(r4 == 0){
					befehlszähler = 9;
				}else{
					befehlszähler++;
				}
				break;
			case 8:
				befehlszähler = 12;
				break;
			case 9:
				r1 += r3;
				befehlszähler++;
				break;
			case 10:
				r2 = r1;
				befehlszähler++;
				break;
			case 11:
				befehlszähler = 2;
				break;
			case 12:
				r1 = monusminus(r1,r3);
				befehlszähler++;
				break;
			case 13:
				r0 = r1;
				befehlszähler++;
				break;
			case 14:
				return r0;
				break;
		}
		$("table#tableAusgabe").append(
			$('<tr>').append(
				$('<td>').text(aktBefehl),
				$('<td>').text(r0),
				$('<td>').text(r1),
				$('<td>').text(r2),
				$('<td>').text(r3),
				$('<td>').text(r4),
				$('<td>').text(befehlszähler)
			)
		);
	}
};
</code>

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

<div id="ausgabe"></div>