Abschlußtest Programmieren 30. Juni 2017 Name: Punkte von 32: Gruppe: Haase-Di Haase-Do Stanek-Di Stanek-Do 1. (6 P) Schreiben Sie die folgenden mathematischen Ausdrücke als korrekte C++- Anweisungen (Variablendeklarationen, Speicherallokierungen und Fileinkludierungen sind nicht nötig): x2 ( (a) e 2 ) (b) sin 2 (2πx) + 4y3 y (M PI ist vordefiniert) (c) Test, ob x [a, b] (d) d = min(a, b, c) ohne Verwendung der Funktion min (e) Schreiben Sie die Folgenglieder von (x n ) n N0 für n = 0,..., 10 in einen STL-Vektor x. Die Folge wird gebildet durch x k+1 = 3x k + x k 1. Zu Beginn enthält x zwei Einträge mit x(0) = 1 und x(1) = 1. Verwenden Sie die Methode push back.
2. (4 P) Welche Ausgaben liefert das folgende Programm in den zwei cout Anweisungen? Begründen Sie Ihre Antwort jeweils stichwortartig! 1 # include < iostream > 2 using namespace std ; 3 4 int myfun ( int &a, int b) 5 { 6 while (a < b) 7 { 8 a *= 2; 9 b /= 2; 10 } 11 12 return b - a; 13 } 14 15 int main () 16 { 17 int x = 2; 18 int b = 7; 19 int c = 0; 20 21 cout << x << " " << b << " " << c << endl ; 22 23 c = myfun (x, b); 24 25 cout << x << " " << b << " " << c << endl ; 26 27 return 0; 28 }
3. (4 P) Die Eulersche Zahl kann folgendermaßen berechnet werden: 1 k!. (a) Schreiben Sie eine Funktion e(const double epsilon), die die Eulersche Zahl e mit Genauigkeit epsilon berechnet, d.h. berechnen Sie n 1 für so ein n, dass k! n n 1 1 k! 1 k! epsilon gilt. Gehen Sie dabei davon aus, dass eine Funktion double fakt(const int k) zur Berechung von k! bereits deklariert und definiert wurde. Verwenden Sie diese Funktion bei Ihrer Lösung! (b) Lesen Sie eine positive Zahl epsilon von Tastatur ein. Sichern Sie die Eingabe so ab, dass nur Zahlen größer Null akzeptiert werden, d.h., die Eingabe wird solange wiederholt bis dies der Fall ist. (c) Berechnen Sie e für die eingelesene Zahl epsilon mittels Ihrer Funktion und geben Sie den erhaltenen Wert aus. Hierbei sind keine break, continue, goto erlaubt. Es darf in der Funktion nur genau ein return-statement auftreten, dieses darf sich nicht innerhalb eines Zyklus oder einer Alternative befinden.
4. (10 P = 2.5 + 2 + 2.5 + 1 + 1 + 1) Für beliebige x, y R und n N soll (x + y) n berechnet werden. Dabei gilt (x + y) n = n ( ) n x n k y k (1) k Die Binomialkoeffizienten ( n k) sollen dabei mithilfe der Rekursion ( ) ( ) ( ) n n 1 n 1 = + k = 1,..., n 1 (2) k k k 1 berechnet werden. Dabei gilt ( ) n = 0 ( ) n = n ( ) 0 = 1 0 Folgender C++-Code ist aufzuschreiben: (a) Schreiben Sie eine Funktion binom, die für gegebene n und k den Binomialkoeffizienten ( n k) rekursiv durch (2) berechnet. (b) Schreiben Sie eine Funktion binom koeff, die für gegebenes n alle Binomialkoeffizienten ( ( n 0), n ( 1),..., n n) berechnet, indem binom aufgerufen wird, und diese als STL-Vektor an das aufrufende Programm zurückgibt. (c) Schreiben Sie eine Funktion eval xy, die (x + y) n für gegebenes n, x und y mit (1) berechnet, indem binom koeff aufgerufen wird, und das Result an das aufrufende Programm zurückgibt. (d) Lesen Sie im dazugehörigen Hauptprogramm Werte für n, x und y ein; dabei muss n 0 eine ganze Zahl sein. (e) Berechnen Sie im Hauptprogramm (x + y) n mithilfe der Funktion eval xy. (f) Geben Sie anschließend x, y und n sowie Ihr Resultat mittels cout aus. Die Teile (d), (e) und (f) können auch ohne vorhandenen Code zu (a), (b) oder (c) angegeben werden. Ebenso kann (b) ohne Code zu (a) angegeben werden und (c) ohne Code zu (b) oder (a). Hierbei sind keine break, continue, goto erlaubt. Es darf in der Funktion nur genau ein return-statement auftreten, dieses darf sich nicht innerhalb eines Zyklus oder einer Alternative befinden.
5. (8 P) Deklarieren und definieren Sie eine Klasse House sodaß das unten gegebene Hauptprogramm unverändert funktioniert. In folgenden Codezeilen werden Methoden/Konstruktoren Ihrer Klasse benötigt: Zeile 12: num gibt die variable Anzahl der Fenster an. Zeile 13: Alle Fenster werden geöffnet. Zeile 15: Secure() genau dann true wenn alle Fenster geschlossen sind. Zeile 17: Kopie. Zeile 18: Anzahl der noch offenen Fenster. Zeile 19: Gesamtanzahl der Fenster. Zeile 21: Schließe das Fenster mit Nummer idx. Zeile 4: Welche Includes werden zusätzlich benötigt? Sie können die Methodendefinitionen gleich in den -deklarationen unterbringen. Pointer werden nicht benötigt und sind daher nicht erlaubt. 1 #include <iostream> // cout, endl, cin 2 #include <cstdlib> // rand() 3 //... #include?? 4 using namespace std; 5 // ---------------------- class House --------------------- 6 //... Ihre Klasse 7 // --------------------------------------------------------- 8 int main() 9 { 10 int num; cout << "Fensteranzahl: "; cin >> num; 11 12 House a(num); // Baue das Haus 13 a.openallwindows(); // Oeffne alle Fenster 14 15 while (! a.secure() ) // Solange noch mindestens ein Fenster offen ist. 16 { 17 const House b(a); 18 cout << "Noch " << b.numberopen() << "Fenster offen." << endl; 19 int idx = rand() % b.numberwindows(); // idx aus [0, Fensteranzahl[ 20 21 a.closewindow(idx); // Schliesse Fenster idx 22 } 23 24 return 0; 25 }