”Informatik - Grundlagen” MB 2005 1. Programmanalyse (6 Punkte) Gegeben sei folgendes C++-Programm: #include <iostream> using namespace std; int l(int a, int b) { int c; c = a + 7 % b - 6; return c; } int main() { int a = 3; int b = 2; cout << l(b,a) << endl; b *= 3 + 2; cout << b << endl; b = a++; cout << ++a << " " << b << endl; cout << a << endl; } Welche Ausgabe liefert das C++-Programm? 1 2. Dynamische Datenstrukturen (23 Punkte) Gegeben sei folgendes C++-Programm: #include <iostream> using namespace std; struct lelem{ int a; lelem * pNext; }; main() { lelem * pAnker = new lelem; lelem * pNeu; lelem * pLast; int i,j; cin >> j; pAnker -> a = j % 5; pAnker -> pNext = NULL; pLast = pAnker; for ( i = 1; i < 12; i++) { pNeu = new lelem; cin >> j; pNeu -> a = j % 5; pNeu -> pNext = NULL; pLast -> pNext = pNeu; pLast = pNeu; } } a. Stellen Sie die Datenstruktur grafisch dar, die in diesem Programm aufgebaut wird (inklusive aller vorkommenden Zeiger nach Abarbeitung des Programms) bei folgender Eingabefolge: 2 3 5 7 11 13 17 19 23 29 31 37. (die Reihenfolge des Aufbaus der dynamischen Datenstruktur muß erkennbar sein). 4 Punkte b. Ergänzen Sie das Programm um eine Funktion int alarm (int & anzahl, int wert,lelem * pAnker1) mit folgender Funktionalität: In der Funktion alarm wird die Anzahl der a-Instanzen (Datenelemente) der Datenstruktur, die durch den Parameter pAnker1 adressiert wird, die den Wert wert haben, ermittelt. Die Anzahl wird der rufenden Funktion 2 über den Referenzparameter anzahl übermittelt. Die Funktion liefert als Rückgabewert den Wert 1, wenn mehr als die Hälfte der a-Instanzen der Elemente der durch den Parameter pAnker1 adressierten Datenstruktur den Wert wert besitzen, sonst den Wert 0. Es ist nicht davon auszugehen, daß die Anzahl der Elemente bekannt ist. . 5 Punkte c. Ergänzen Sie das Programm um eine Funktion int delete_item (int wert, lelem *& pAnker1) mit folgender Funktionalität: In der Funktion delete item wird das erste Element aus der Datenstruktur, die durch den Zeiger pAnker1 adressiert wird, gelöscht, dessen Datenelement a gleich dem Parameter wert ist. Wenn das Löschen erfolgreich war, soll der Wert 1 zurückgegeben werden, sonst der Wert 0. 5 Punkte Demonstrieren Sie die Verwendung von alarm und delete item im Hauptprogramm wie folgt: Wenn in der Datenstruktur, die durch den Zeiger pAnker adressiert wird, mehr als 50% Elemente enthalten sind, deren Datenwert a gleich einem vom Nutzer einzugegeben Wert ist, so ist das erste Element aus der Datenstruktur zu löschen. Dies soll solange wiederholt werden, bis weniger als 50 % der Elemente mit dem angegebenen Datenwert in der durch pAnker adressierten Datenstruktur enthalten sind. 5 Punkte d. Ergänzen Sie das Hauptprogramm derart, daß alle a-Instanzen durch Tabulatoren getrennt auf dem Bildschirm angezeigt werden. Dabei sollen 5 Elemente auf einer Bildschirmzeile ausgegeben werden (in der letzten Zeile sind möglicherweise weniger als 5 Elemente auszugeben). Es ist nicht davon auszugehen, daß die Anzahl der Elemente bekannt ist. 2 Punkte e. Ergänzen Sie das Hauptprogramm derart, daß der gesamte dynamisch angeforderte Speicherplatz freigegeben wird. Es ist nicht davon auszugehen, daß die Anzahl der Elemente bekannt ist. 2 Punkte 3. Objektorientierte Programmierung (15 Punkte) Geben Sie eine Klassendefinition für eine Klasse kugel an, welche einen privaten Member (Datenelement) radius vom Typ float verwaltet. Folgende Methoden sollen in der Klasse enthalten sein: 3 – Konstruktor mit keinem Parameter, der Member soll mit 0 initialisiert werden (Standardkonstruktor) – Konstruktor mit einem Parameter vom Typ float. Der Member soll mit dem Werten des Parameters initialisert werden – Methode set mit einem Parameter. Diese Methode setzt den Wert des Members mit dem Wert des Parameters. – Methode oberflaeche. Diese Methode gibt den Wert der Oberfläche der durch den privaten Member beschriebenen Kugel zurück. – Methode volumen. Diese Methode gibt den Wert des Volumens der durch den privaten Member beschriebenen Kugel zurück. – Methode volumen abschnitt mit einem Parameter vom Typ float. Diese Methode gibt den Wert des Volumens des durch den privaten Member und dem Parameter, die als Höhe h des Kugelabschnittes interpretiert werden sollen, beschriebenen Kugelabschnittes zurück. – Methode print. Diese Methode gibt den Wert des Members auf den Bildschirm aus. Geben Sie die Implementierung der Methoden an (gegebenenfalls inline-Code). Demonstrieren Sie die Verwendung der Klasse kugel in einem kurzen Hauptprogramm, in dem alle Methoden verwendet werden. Hinweis: Es gelten folgende Formeln: Kugeloberfläche: f = 4πr 2 Kugelvolumen: v = 34 πr 3 Kugelabschnittvolumen: va = 31 πh2 (3r − h) Pi: π = 3.141592653589793 4. Matrixoperationen (10 Punkte) Gegeben sei eine Integermatrix 6 x 12 (6 Zeilen mit je 12 Zahlen). Implementieren Sie ein C++-Programm mit folgendem Ablauf: a. Einlesen der Zahlen der Matrix b. Ermitteln der zwölf Spalten-Minimalwerte (Minimalwert aus allen Zahlen in einer Spalte) c. Ausgabe der Elemente der Matrixspalte mit dem größten Minimalwert und des zugehörigen Minimalwertes in übersichtlicher Form (die Matrixelemente sollen jeweils mit einer Breite von 8 Zeichen dargestellt werden). 5. Funktionen (6 Punkte) Eine Rehpopulation in einem Erzgebirgswald wird am 1.1. des ersten Jahres gezählt. Es ergibt sich eine Zahl von 15 Rehen. Die Population ändert sich nach Beobachtungen von Naturfreunden wie folgt: – Im Laufe eines Jahres verdoppelt sich die Zahl der Rehe durch Vermehrung 4 – Zur Sicherung des Silversterbratens der umliegenden Dörfer werden am Jahresende 8 Rehe geschoßen. Zum Schutz des Waldes vor Wildverbiß werden am Ende des Jahres zusätzlich 70% der verbliebenen Rehe geschossen, wenn deren Zahl größer als 40 ist. Schreiben Sie eine C++-Funktion int rehe r(int n) die rekursiv die Zahl der Rehe am 1.1. des n-ten Jahres berechnet. D 5