Institut für Geometrie und Praktische Mathematik Dipl. Math. Wolfram Rosenbaum 2. Übung zum Kompaktkurs Einführung in C++“ ” Dienstag, 28.09.2004 Aufgabe 1: Schreiben Sie ein Programm, welches eine formatierte Wertetabelle der Funktionen f1 (x) = 2x, f2 (x) = 4x2 , f3 (x) = 4x3 , f4 (x) = x4 − x3 − x2 − x im Bereich [−1, 1] mit einer Schrittweite von 0.1 ausgibt. Aufgabe 2: Die Fibonaccizahlen sind rekursiv definiert durch fib(0) := 1, fib(1) := 1, fib(x) := fib(x − 1) + fib(x − 2). Schreiben Sie ein Programm zur Berechnung der ersten n Fibonaccizahlen. Die Zahl n soll dabei eingelesen werden. Schreiben Sie sowohl eine rekursive als auch eine iterative Variante. Aufgabe 3: Schreiben Sie eine Funktion ggT, die den größten gemeinsamen Teiler zweier ganzer Zahlen p und q mit Hilfe des Euklidischen Algorithmus berechnet und testen Sie Ihre Funktion. Der Euklidische Algorithmus beruht auf der Division mit Rest und ist wie folgt definiert: Setze r−1 := p, r0 := q. Solange ri nicht verschwindet, bestimme für i = 1, 2, . . . ganze Zahlen ai und ri+1 , so daß ri−1 = ai ri + ri+1 , |ri+1 | < |ri |, gilt. Der Algorithmus bricht nach endlich vielen Schritten ab, d. h. daß rn+1 = 0 für ein n ∈ N gilt. Der vorletzte Rest rn ist der größte gemeinsame Teiler der Zahlen p und q. Aufgabe 4: Erweitern Sie das Programm aus Aufgabe 3 so, daß es beliebig viele Zahlenpaare von der Standardeingabe liest und deren größte gemeinsame Teiler auf der Standardausgabe wieder ausgibt. Sollte die Eingabe nicht Ihren Erwartungen entsprechen, geben Sie eine Fehlermeldung auf dem Standardfehlerkanal aus und beenden Sie das Programm. blatt˙02,20040928–0806 70 Seite 2 2. Übung zum Kompaktkurs Einführung in C++“ ” In der folgenden Tabelle enthält jeder Kasten Operatoren gleicher Priorität, und die Kästen sind nach fallender Priorität sortiert. Alle einstelligen Operatoren und die Zuweisungen sind rechts– assoziativ, die übrigen Operatoren sind links–assoziativ. Zum Beispiel bedeutet a=b=c a=(b=c), aber p->q->r steht für (p->q)->r. :: . -> [] () --, ++ typeid typeid dynamic cast<typ> static cast<typ> reinterpret cast<typ> const cast<typ> sizeof ++ -~ ! + & * new delete delete [] () .* ->* * / % + << >> < <= > >= == != & ^ | && || ? : = += -= *= /= %= <<= >>= &= |= ^= , Bereichs–Auflösung Elementauswahl Elementauswahl Indizierung/Feldzugriff Funktionsaufruf Postinkrement/–dekrement Typidentifikation Laufzeit–Typinformation zur Laufzeit geprüfte Konvertierung bei der Übersetzung geprüfte Konvertierung ungeprüfte Konvertierung const–Qualifizierer entfernen Objekt–/Typegröße Präinkrement/–dekrement Komplement, bitweise Invertierung Negation Unäres Plus/Minus Adresse Dereferenzierung Speicherallokation mit Initialisierung Speicherdeallokation Deallokation eines Arrays Typkonvertierung (Cast) Elementselektion Elementselektion Multiplikation/Division Rest der Division (modulo) Addition/Subtraktion Shift nach links/rechts Kleiner/größer (gleich) Gleich/ungleich Bitweises AND Bitweises exklusives OR Bitweises inklusives OR Logisches AND Logisches inklusives OR Bedingte Zuweisung Einfache Zuweisung Operation und Zuweisung Hintereinanderausführung vektor::Norm1 object.member pointer->member array[expr], a[5] fct(args), sin(x) a++, b-typeid(typename) typeid(expr) sizeof(object), sizeof type ++a, --b ~a !ok +a, -3 &object *pointer new int[10] new complex(0,1) delete pointer delete [] pointer (int)x obj.*ptr-to-element ptr->*ptr-to-element a*b, a/b 5%3 1+3, a-b a<<2, b>>x a<1, b>=x a==1, b!=x a&b a^b a|b a&&b a||b a < b ? a : b a=1 b=x a+=1 a <<= 1 a |= b a=1, a++