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>||R4 = 0|| Zurücksetzen des Multiplikatioszwischenergebnisses
|-
||<div align="right">3</div>||IFZERO R2 GOTO 7|| wenn Multiplikationszähler (R2) gleich 0, Multiplikation beendet
|-
||<div align="right">4</div>||R4 += R1|| Zwischenergebnis der Multiplikation
|-
||<div align="right">5</div>||R2 -= R3|| Multiplikationszähler dekrementieren
|-
||<div align="right">6</div>||GOTO 3|| nächster Multiplikationszyklus
|-
||<div align="right">7</div>||R5 = R4|| Quadrat der Testvariable in R5 zwischenspeichern
|-
||<div align="right">8</div>||R6 = R0|| n in R6 zwischenspeichern
|-
||<div align="right">9</div>||IFZERO R6 GOTO 17|| wenn R6 gleich 0, Quadrat der Testvariable >= n
|-
||<div align="right">10</div>||IFZERO R5 GOTO 14|| wenn R5 gleich 0, Quadrat der Testvariable <= n
|-
||<div align="right">11</div>||R5 -= R3|| temp-Quadrat dekrementieren
|-
||<div align="right">12</div>||R6 -= R3|| temp-n dekrementieren
|-
||<div align="right">13</div>||GOTO 9|| nächster Testzyklus
|-
||<div align="right">14</div>||R1 += R3|| Testvariable inkrementieren
|-
||<div align="right">15</div>||R2 = R1|| Multiplikationszähler gleich der Testvariable setzen
|-
||<div align="right">16</div>||GOTO 2|| nächster Zyklus mit inkrementierter Testvariable
|-
||<div align="right">17</div>||IFZERO R5 GOTO 19|| wenn Quadrat der Testvariable = n, dann kein Abrunden nötig
|-
||<div align="right">18</div>||R1 -= R3|| Ergebnis dekrementieren zwecks Abrunden
|-
||<div align="right">19</div>||R0 = R1|| Ergebnis nach R0 übernehmen
|-
||<div align="right">20</div>||STOP|| Programmende
|}
=== Programm Beispiel für RAM Programm 1 ===
<code id="558bd7e42dd42">
var monusminus = function(x,y){
if((x-y) > 0){
return x-y;
}else{
return 0;
}
};
var ram = function(n) {
var r0 = 0;
var r1 = 0;
var r2 = 0;
var r3 = 0;
var r4 = 0;
var r5 = 0;
var r6 = 0;
var befehlszähler = 0;
$("div#ausgabe1 > table").remove();
$("div#ausgabe1").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("R5"),
$('<td>').text("R6"),
$('<td>').text("Next")
),
$('<tr>').append(
$('<td>').text("PRE"),
$('<td>').text(r0),
$('<td>').text(r1),
$('<td>').text(r2),
$('<td>').text(r3),
$('<td>').text(r4),
$('<td>').text(r5),
$('<td>').text(r6),
$('<td>').text(befehlszähler)
)
).attr("id", "tableAusgabe1").attr("border", "1.0")
);
while(true){
var aktBefehl = befehlszähler;
switch(befehlszähler){
case 0:
r0 = n;
befehlszähler++;
break;
case 1:
r3 = 1;
befehlszähler++;
break;
case 2:
r4 = 0;
befehlszähler++;
break;
case 3:
if(r2 == 0){
befehlszähler = 7;
}else{
befehlszähler++;
}
break;
case 4:
r4 += r1;
befehlszähler++;
break;
case 5:
r2 = monusminus(r2,r3);
befehlszähler++;
break;
case 6:
befehlszähler = 3;
break;
case 7:
r5 = r4;
befehlszähler++;
break;
case 8:
r6 = r0;
befehlszähler++;
break;
case 9:
if(r6 == 0){
befehlszähler = 17;
}else{
befehlszähler++;
}
break;
case 10:
if(r5 == 0){
befehlszähler = 14;
}else{
befehlszähler++;
}
break;
case 11:
r5 = monusminus(r5,r3);
befehlszähler++;
break;
case 12:
r6 = monusminus(r6,r3);
befehlszähler++;
break;
case 13:
befehlszähler = 9;
break;
case 14:
r1 += r3;
befehlszähler++;
break;
case 15:
r2 = r1;
befehlszähler++;
break;
case 16:
befehlszähler = 2;
break;
case 17:
if(r5 == 0){
befehlszähler = 19;
}else{
befehlszähler++;
}
break;
case 18:
r1 = monusminus(r1,r3);
befehlszähler++;
break;
case 19:
r0 = r1;
befehlszähler++;
break;
case 20:
return r0;
break;
}
$("table#tableAusgabe1").append(
$('<tr>').append(
$('<td>').text(aktBefehl),
$('<td>').text(r0),
$('<td>').text(r1),
$('<td>').text(r2),
$('<td>').text(r3),
$('<td>').text(r4),
$('<td>').text(r5),
$('<td>').text(r6),
$('<td>').text(befehlszähler)
)
);
}
};
var reset = function(){
$("div#ausgabe1 > table").remove();
};
</code>
<run id="558bd7e42dde3">
ram(5);
</run>
<run id="558bd7e42de60">
reset();
</run>
<div id="ausgabe1"></div>
=== RAM Programm 2 ===
{|| 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
|}
=== Programm Beispiel für RAM Programm 2 ===
<code id="558ba2eb632b7">
var monusminus = function(x,y){
if((x-y) > 0){
return x-y;
}else{
return 0;
}
};
var ram = function(n) {
var r0 = 0;
var r1 = 0;
var r2 = 0;
var r3 = 0;
var r4 = 0;
var befehlszähler = 0;
$("div#ausgabe2 > table").remove();
$("div#ausgabe2").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")
),
$('<tr>').append(
$('<td>').text("PRE"),
$('<td>').text(r0),
$('<td>').text(r1),
$('<td>').text(r2),
$('<td>').text(r3),
$('<td>').text(r4),
$('<td>').text(befehlszähler)
)
).attr("id", "tableAusgabe2").attr("border", "1.0")
);
while(true){
var aktBefehl = befehlszähler;
switch(befehlszähler){
case 0:
r0 = n;
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#tableAusgabe2").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)
)
);
}
};
var reset = function(){
$("div#ausgabe2 > table").remove();
};
</code>
<run id="558ba2eb6332c">
ram(5);
</run>
<run id="558bcacd7afbd">
reset();
</run>
<div id="ausgabe2"></div>