Übung: Algorithmen und Datenstrukturen SS 2007 Prof. Lengauer Sven Apel, Michael Claÿen, Christoph Zengler, Christof König Blatt 1 Votierung in der Woche vom 23.04.0727.04.07 Aufgabe 1 Von-Neumann-Modell Welche Funktion wird vom folgenden Programm berechnet? Verwenden Sie für diese Aufgabe den Befehlssatz für Von-Neumann-Rechner, wie angegeben auf Folie 29 Befehle in Kapitel 1 der Vorlesungsfolien. 01 read 02 store(0) 03 addAbs(1) 04 mult(0) 05 divAbs(2) 06 print Überlegen Sie sich welchen Nutzen diese Funktion hat. Lösung: Diese Funktion berechnet die Summe der natürlichen Zahlen von m, wobei m die Eingabe ist: f (m) = 1 bis m(m+1) . 2 01 read akk = m 02 store(0) speichere Eingabe in Speicherregister 0 03 addAbs(1) addiere 1 zu Akkumulator -> akk=m+1 04 mult(0) multipliziere Akkumulator mit Register 0 -> akk=m*(m+1) 05 divAbs(2) dividiere Akkumulator durch 2 -> akk=m*(m+1)/2 06 print Ausgabe des Ergebnisses 1 Aufgabe 2 Die Fakultät n! Von-Neumann-Modell einer natürlichen Zahl n ist wie folgt deniert: n! = 1 · 2 · . . . · (n − 1) · n für n≥0 und 0! = 1 Schreiben Sie unter Verwendung des Befehlssatzes für Von-Neumann-Rechner (Folie 29 Befehle) ein Programm, das die Fakultät einer gegebenen Zahl berechnet und mittels n mittels read print n ausgibt. Am Anfang soll das Programm den Wert einlesen. Folgende Dinge sind zu beachten: • Ein Test auf sinnvolle Werte (nicht negativ) ist nicht notwendig. • Der Sonderfall • Überlegen Sie sich wie man den Akkumulator von einem undenierten 0! = 1 ist zu beachten. Zustand auf Null setzen kann. Lösung: Folgende Bedeutungen sind den verwendeten Registern zugeordnet: Adresse Wert 0 Zähler 1 Fakultät Das Programm speichert die Eingabe in die Speicherzelle 1. Nach einem Test auf Eingabe gleich Null beginnt die Schleife zur Berechnung der Fakultät. Am Ende wird das Zwischenergebnis aus Register 01 read 1 in den Akkumulator geladen. Eingabe in den Akkumulator 02 jumpzero(13) Springe an das Ende für Eingabe x = 0 03 store(1) Speichern der Eingabe in Speicherzelle 1 (Fakultät = 1) 04 subAbs(1) Dekrementieren des Zählers (Beginn der Schleife) 05 jumpzero(11) Falls Zähler = 1 springe an das Ende (Abbruch der Schleife) 06 store(0) Speichern des Zählers in Speicherzelle 0 07 mult(1) Multiplizieren: Akkumulator = Zähler * Fakultät 08 store(1) Produkt merken in Speicherzelle 1 (Fakultät = Akkumulator) 09 load(0) Laden des Zählers in den Akkumulator 10 jumpgtz(4) Unbedingter Sprung nach 4 (der Akkumulator ist hier niemals 0) 11 load(1) Ergebnis in den Akkumulator laden (Akkumulator = Fakultät) 12 jumpgtz(14) Sprung an das Ende 13 addAbs(1) Sonderfall: für die Eingabe x=0 ist das Ergebnis '1' 14 print Ausgabe des Ergebnisses 2