Programmieren I für Studierende der Mathematik 2024C/C++

Java Python Programmieren I für Studierende der Mathematik

1 (8 Punkte)  Welche Ausgabe produziert das folgende Programm?

exm_expr.cpp

#include

#include

using namespace std;

double f1(int n, double x) { return n*n/2+x*x/2; }

double f2(int n, double x) { return n/(n+1)+x/(x+1); }

double f3(int n, double x) { return n/2*x+x/2*n; }

double f4(int n, double x) { return n++*--x; }

int main() {

cout

<< setw(8) << f1(3, 3) << setw(8) << f1(4, 4) << endl

<< setw(8) << f2(3, 3) << setw(8) << f2(4, 4) << endl

<< setw(8) << f3(3, 3) << setw(8) << f3(4, 4) << endl

<< setw(8) << f4(3, 3) << setw(8) << f4(4, 4) << endl;

}

2 (4 Punkte)  Formulieren Sie für die folgenden M′-Programme jeweils einen äquivalenten C++-Ausdruck. D.h. jeweils einen Ausdruck welcher zu dem vom M′-Programm ausgegebenen Wert auswertet.

Gehen Sie davon aus, dass die Werte a und b, die in den M′-Programmen eingelesen werden, in den Variablen a und b, jeweils vom Typ double, zur Verfügung stehen.

(a)

1 JUMP(4)

2 # a

3 # b

4 READ

5 STORE(2)

6 READ

7 STORE(3)

8 DIV(2)

9 STORE(3)

10 RECALL(2)

11 ADD(2)

12 SUB(3)

13 PRINT

14 STOP

(b)

1 JUMP(4)

2 # a

3 # b

4 READ

5 STORE(2)

6 READ

7 STORE(3)

8 RECALL(2)

9 MULT(2)

10 MULT(2)

11 STORE(2)

12 RECALL(3)

13 ADD(3)

14 MULT(2)

15 PRINT

16 STOP

3 (12 Punkte)  Die Funktion log1p:  (−1, ∞) → R, x  ↦→ ln(1 + x) besitzt für  |x | < 1 die Potenzreihenent- wicklung:

(a) Leiten Sie für ak und sn  = Σ =1 ak Rekursionsbeziehungen her, die sich zur Programmierung eignen.

(b)  Erstellen Sie eine C++-Funktion log1p zur Berechnung von log1p(x) unter Verwendung Ihrer Rekur- sionsbeziehung aus Aufgabenteil a. Die Bedingung |x | < 1 dürfen Sie ohne gesonderte Überprüfung annehmen. Die Iteration soll abgebrochen werden, sobald |an| ≤ ε |Sn|.

4 (16 Punkte)  Seien l  ∈ N \ {0}, p0, . . . , pl −1   ∈ Z, k0, . . . , kl −1   ∈ Z.

Verwenden Sie zur Darstellungaller Zahlenwerte Ganzzahldatentypen. In dieserAufgabe soll keine Gleit- punktarithmetik verwendet werden.

(a)  Implementieren Sie eine Funktion wert mit Parametern (pi)i=0,...,l −1 und (ki)i=0,...,l −1 welche folgende Größe berechnet und zurück gibt:

Sind die in den beiden Parametern übergebenen Folgen von Werten nicht gleichlang oder derLänge 0, so soll ein Definitionsbereichsfehler mit dem errno-Mechanismus kommuniziert werden. Geben Sie in diesem Fall den Wert 0 zurück.

Prüfen Sie vor jeder Multiplikation, durch einenVergleich mit demErgebnis einer Division mit einer geeigneten Konstante aus der Standardlibrary, ob ein Überlauf des Zahlenbereichs des verwendeten Ganzzahldatentyps zu erwarten ist. Kommunizieren Sie, wenn dem so ist, einen Wertebereichsfehler, brechen Sie die Berechnung aber nicht vorzeitig ab.

(b)  Implementieren Sie ein Hauptprogramm in dem zunächst l und dann (pi)i=0,...,l −1  und (ki)i=0,...,l −1 , mit Eingabeaufforderung, von der Konsole eingelesen werden.

Rufen Sie dann die Funktion wert mit den eingelesenen Parametern auf.

Geben sieden von wert berechneten Wert aus, oder, wenn eine Fehlerkondition kommuniziert wurde, den zur Fehlernummer gehörigen Text.

5 (24 Punkte)  Für x ∈ R ∩ [1, ∞) konvergiert die durch (Sn)n=1,... gegebene Folge gegen arcosh(x):

(a)  Implementieren Sie diese Iteration als Funktion arccosh mit einem Parameter und Rückgabetyp je- weils sinnvoll. Verwenden Sie hierbei aus den arithmetischen Funktionen der Standardlibrary höchs- tens die Implementierungen des natürlichen Logarithmus und des Absolutbetrags. Brechen Sie die  Iteration ab, sobald ak  ≤ ε |Sk|.

(b)  Fügen Sie zu Ihrer Implementierung die folgenden Spezialfälle hinzu:

i.  Für x  < 1 soll NaN zurückgegeben werden und ein Definitionsbereichsfehler mit dem errno- Mechanismus kommuniziert werden.

ii.  Für x = 1 soll direkt, ohne Iteration, 0 zurückgegeben werden.

(c)  Implementieren Sie ein Hauptprogramm welches,ausgehend von x = 0,9, fürx und danach in Schrit- ten der Größe 0,1 aufsteigend bis inklusive x = 4, 1 jeweils Ihre Funktion arccoshmit x aufruft. Geben  Sie die Ergebnisse tabellarisch aus mit jeweils einer Spalte für x und arcosh(x).

Geben Sie die Wertefürarcosh(x)jeweils in Exponentialschreibweiseundeiner an die zur Verfügung stehende Genauigkeit gut angepasster Anzahl von Stellen aus. Verwenden Sie für die Ausgabe von x jeweils die automatische Auswahl  Programmieren I für Studierende der Mathematik 2024C/C++ ;des Ausgabeformat mit 6 signifikanten Stellen, so wie es der Voreinstellung zu Programmstart entspräche.

Falls bei einer Auswertung Ihrer Funktion arccosh ein Fehler kommuniziert wird, fügen Sie in Ihre Tabelle eine zusätzliche Zeile ein, die den numerischen Wert der übermittelten Fehlerkondition und eine zur tatsächlich aufgetreten Fehlerkondition passenden Text enthält.

6 (32 Punkte)  Ziel ist es eine effiziente Kodierung einer beliebig langen Folge von jeweils beliebig großen

positiven ganzen Zahlen zu implementieren, die Fibonacci-Kodierung.

(a)  Implementieren Sie eine memoisierte Version der Fibonacci-Funktion.

Ihre Funktion soll zwei Parameter akzeptieren. Der erste Parameter soll eine Referenz auf einen Vek- tor von ganzen Zahlen vom Typ unsigned long sein. Der zweite Parameter soll der Index n der zu  berechnenden Fibonacci-Zahl F (n) sein:

F (0) = 0        F (1) = 1        F (2) = 1        F (n + 2) = F (n) + F (n + 1)

Verwenden Sie den referenzierten Vektor um berechnete Fibonacci-Zahlen zu speichern, bevor Sie sie zurück geben.

Verwenden Sie zur Berechnung noch nicht bekannter Fibonacci-Zahlen die im referenzierten Vektor zur Verfügung stehenden Werte. Tragen Sie hierfür wenn nötig zunächst die obigen Basisfälle in den  Vektor ein. Achten Sie darauf keine Annahmen über dieLänge des referenzierten Vektors zu machen.

(b)  Implementieren Sie zwei Hilfsfunktionen bits_to_uchar und uchar_to_bits die jeweils einen Vek- tor von bool zu einem unsigned char konvertieren bzw. von einem unsigned char zu einem Vektor  von bool. Der Vektor von bool soll hierbei der Binärdarstellung des jeweiligen Wertes entsprechen.  Achten Sie daraufunnötige Vektorkopien zu vermeiden.

(c)  Implementieren Sie eine Funktion decode, die, gegeben eine Referenz auf einen Vektor von unsigned long (durchzureichen an Aufrufe von fib) und eine Referenz auf einen Eingabestrom einen Vektor von unsigned long zurück liefert. Gehen Sie hierfür vor, wie folgt:

1)  Legen Sie eine Variable an um erfolgreich dekodierte Werte anzusammeln bis Sie sie zurück geben können.

2)  Legen Sie einen „Eingabepuffer“ vom Typ Vektor von bool an.

3)  Prüfen Sie ob Sie in Ihrem Eingabepuffer eine Teilfolge von zwei aufeinanderfolgenden Werten true finden.

4)  Falls Sie keine derartige Teilfolge finden, dann lesen Sie ein Zeichen vom Eingabestrom ein, konvertieren es, mithilfe von uchar_to_bits, in einen Vektor von bool und hängen dessen Ele- mente an Ihren Eingabepuffer hinten an. Falls Sie kein Zeichen einlesen konnten, geben Sie die  angesammelten dekordierten Werte zurück. Ansonsten fahren Sie wieder bei Schritt 3 fort.

5)  Falls Sie eine derartige Teilfolge finden, dekodieren Sie das Anfangsstück bis inklusive der Teil- folge zu einem Wert vom Typ unsigned char, wie folgt:

Sei b0, b 1, . . . , bl −1, bl  das gefundene Anfangsstück bis inkl. der Teilfolge. D.h. insb. bl −1   =  bl   = true.

Mit F der Fibonacci-Funktion fib ergibt sich für den dekodierten Wert w:

6)  Hängen Sie den dekodierten Wert hinten an ihre Sammlung dekodierter Werte an.

7)  Entfernen Sie das verarbeitete Anfangsstück b0, . . . , bl  vom Anfang ihres Eingabepuffers. Hier- durch verkürzt sich der Eingabepuffer um l + 1.

8)  Fahren Sie wieder bei Schritt 3 fort.

(d)  Implementieren Sie eine Funktion encode, die gegeben eine Referenz auf einen Vektor von unsigned long (durchzureichen an Aufrufe von fib), eine Referenz auf einen Ausgabestrom und einen Vektor

von unsigned long von zu kodierenden Werten die Werte in den Ausgabestrom kodiert, wie folgt:

1)  Legen Sie einen „Ausgabepuffer“ vom Typ Vektor von bool an.

2)  Für jedes Element w der zu kodierenden Werte, kodieren Sie es zunächst zu einem Vektor von bool, wie folgt:

i)  Finden Sie die größte Fibonacci-Zahlf  kleiner oder gleichgroß zu w.

ii)  Fürf  = F (i), i  ≥ 2, setzen Sie das bit mit Index i − 2 in Ihrer Kodierung.

iii)  Ersetzen Sie w durch w − f .

iv) Wiederholen Sie die obigen drei Schritte bis w = 0.

v)  Hängen Sie einen zusätzlichen Wert true hinten an Ihre Kodierung an. Es sollte sich hier- durch ergeben, dass die letzten zwei Werte in ihrem kodierten Vektor von bool stets true sind.

3)  Hängen Sie dannjeweils die Kodierung Ihrer Werte hinten an Ihren Ausgabepuffer an.

4) Wann immer dabei ihr Ausgabepuffer acht oder mehr bits enthält, kodieren Sie die ersten acht bit des Ausgabepuffers in einen Wert vom Typ unsigned char, geben Sie diesen Wert auf dem Ausgabestrom aus und entfernen Sie acht bit vom Anfang des Ausgabepuffers.

5) Wenn Ihr Ausgabepuffer nach Verarbeitung aller zu kodierender Werte nicht leer ist, so füllen Sie ihn aufLänge Acht mit Nullen aufund geben Sie ein finales Byte aus         

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值