Rechnerstrukturen I 4. Termin Stand : 1.3.06 Ziele: Parameterübergabetechniken Techniken der Stapelverwaltung Implementierung rekursiver Routinen und Koroutinen Einführung in die Aufgaben des Praktikum-Testats 4 Rekursive Programme und Koroutinen erfordern eine sorgfältige Handhabung der Parameter. Durch die intensive Nutzung des Stapels entsteht allerdings ein größerer Verwaltungsaufwand und damit ein höherer Zeitverlust als bei iterativen Verfahren. Die Bequemlichkeit, die rekursive Programmierung bei höheren Programmiersprachen bietet, überdeckt diesen Effekt, der bei maschinennaher Programmierung aber augenfällig wird. Die Aufgaben sind wie gewohnt den Nummern der Praktikumsgruppe zugeordnet Zu jeder Lösung gehört die formale Beschreibung Ihres Ansatzes sowie eine anschauliche Verdeutlichung Ihrer Lösung. Die Aufgaben sollen unter Verwendung der rekursiven bzw. Koroutinen Technik gelöst werden. Die Entwicklung zusätzlicher Programme basierend auf iterativen Verfahren ist durchaus zur Diskussion der Vor- und Nachteile der unterschiedlichen Techniken nützlich. Geben Sie gegebenenfalls bis zu 15 Beispielwerte in Form einer Tabelle an, die Sie nachindiziert indirekt ansprechen. Der Index lässt sich bequem über die Kippschalter variieren. AUFGABEN : I. HORNER-Schema zur Berechnung einer Potenzreihe Berechnet werden soll der Wert eines Polynoms n-ten Grades mit den Koeffizienten ai an der Stelle x : P( x) n a i 0 i x i a 0 a1 x a 2 x 2 .... a n x n Entwickeln Sie hierzu mit Hilfe zweier Koroutinen MULT und ADD ein Programm, das auf dem Horner-Schema basiert. Es seien n<6 (variabel) und ai natürliche Zahlen im ByteFormat. Beides kann elegant in einem h-Feld abgelegt werden. Um den Arbeitsaufwand zu reduzieren soll x auf den Bereich der ganzen dezimalen Zahlen von -10 bis +10 beschränkt werden. Das Ergebnis ist in einem darauf angepassten Format zu speichern. II. UPN-Rechner (Umgekehrt Polnische Notation) : Entwickeln Sie einen einfachen UPN-Rechner, der eine ähnliche Arbeitsweise hhat wie ein HP-Taschenrechner für Ganzzahlen (negative Werte im $10000-Komplement) für die Operationen +,-,*, /, mod und neg . Ziel ist hier, die Koroutinentechnik optimal einzusetzen; Hierbei werden Sie vermutlich nicht einen HP-Rechner 1.1 umsetzen können. Es gelte folgende einfache Syntax: Programm UPN-Ausdruck! UPN-Ausdruck Term Term Operator Term Ganzzahl | UPN-Ausdruck Operator | | | | mod | neg Machen Sie sich zunächst klar, wie der UPN-Ausdruck für einen aritmetrischen Ausdruck aussehen muss, z.B. für (a+b) • [(a+c) • d+b] • e + f Achtung : Der Unterschied zum HP-Rechner wird sein, dass dort erst die Zahlen eingegeben werden und dann die Operation eingegeben wird. Hier werden Sie, um die Koroutinentechnik anwenden zu können, zuerst die Information der durchzuführenden Operation benötigen und dann die Zahlen eingeben. Überlegen Sie, wie Sie den UPN-Ausdruck, der in Form einer Tabelle eingegeben wird, abarbeiten und wie Sie den Stack aufbauen müssen. Um den Arbeitsaufwand zu reduzieren können Sie sich auf eines der beiden Trippel (+ , * , mod) oder (- , / ,neg) beschränken. III. Gleitende Mittelwert-Bildung Entwickeln Sie eine Rekursionsformel zur Bildung des arithmetischen Mittelwertes <x> von n Meßwerten x0 … xn-1 in der Form <x>k+1 = f(xk+1,<x>k). Hieraus ableitbar ist eine gleitende Mittelwertberechnung, d.h. nach jedem Schritt ist der aktuelle Mittelwert von k Werten bekannt. Für die Meßwerte sind ganze Zahlen im Wortformat anzunehmen, und es sei n<256. IV. Ausgabe der kodierten Dezimalziffern einer Dualzahl Gegeben sei eine natürliche Zahl im Wort-Format. Geben Sie die dazugehörigen Dezimalziffern im gewichteten 8421-Kode byteweise aus. Sie sollten bei der Ausgabe mit der höchsten 10-er potenz beginnen. Daher sollten Sie die rekursive Programmtechnik benutzen. Die Divisionen durch 10-er Potenzen kann durch fortgesetzte Subtraktion durchgeführt werden. Neben des Ausdrucks des Speicherinhalts können Sie die Dezimalziffern auch hintereinander auf der 7-Segmentanzeige ausgeben. V. Ackermann-Funktion Die n-te Ackermann-Funktion sei wie folgt definiert : A(n, k ) kx , falls n0 , k 0 x , falls k 0 , n0 A(n 1, A(n, k 1)) , falls k, n 0 In der Literatur und im Netz finden unzterschiedliche Definitionen, insbesondere den Wert von x betreffend. Wählen Sie für x zunächst 1 und dann den sinnvolleren Wert 2. (Warum ist 2 sinnvoller ?) Implementieren Sie diese Funktion rekursiv bis einschließlich n=2 und legen Sie für k natürliche Zahlen im byte-Format zugrunde. Alle Rechnungen erfolgen mod $100 . VI. Umrechnung des Gray-Kodes in den Dualkode Der Gray-Kode zählt nicht zu den gewichteten Kodes, es gibt aber einen recht einfachen Algorithmus, den Wert der kodierten natürlichen Zahl zu berechnen. Er ist nicht nur als Blockkode auf 4 Bits beschränkt, sondern lässt sich auf eine beliebig lange Bitfolge anwenden. Neben der Bitweisen Umrechnung, die wahrscheinlich in Aufgabe 3 verwendet wurde, gibt es auch einen anderen Umrechnungsalgorithmus, der mit Hilfe der rekursiven Programmtechnik implementiert werden kann. Dieser Algorithmus entspricht im übrigen der oben erwähnten bitweisen Umwandlungsvorschriften aus der Literatur. Sei n die Anzahl der noch zu verarbeitenden Bits und x der dezimale Wert dieser noch zu verarbeitenden Bitfolge. Dann lautet die rekursive Definition : f ( x, n ) Anmerkung : , falls n 1 f ( x, n 1) , falls x 2 n 1 2 n 1 f ( x 2 n 1 , n 1) , falls x 2 n 1 x Für n=1 kann x nur die Werte 1 und 0 annehmen. Gilt x=0 schon für größere n, so wird die mittlere Formel n-1 mal angewandt bis schließlich n=1. Zur Verdeutlichung ein Beispiel auf 4 Bits (Block-Kode) bezogen : Das Graywort 1011 (Pseudodekade) bedeutet 13 ; da f(11,4) = 15 - f(3,3) = 15 - f(3,2) = 15 – (3 – f(1,1)) = 15-3+1 = 13 Gegeben sei ein Graywort im Wortformat, für das die kodierte Zahl ausgegeben werden soll.