Klausur Programmieren 2 WS 2017/18 Name Gruppe 1 Vorname Dauer 90 min Matrikelnummer Hilfsmittel keine Die Klausur ist mit 50 Punkten sicher bestanden. Hinweise: Formulieren Sie Ihre Lösungen auf dem Aufgabenblatt und nicht auf zusätzlichen Blättern. Sofern Sie die Rückseite eines Blattes verwenden vermerken sie dies auf der Vorderseite. Prüfen sie das Exemplar auf Vollständigkeit (8 Aufgaben) und Druckqualität. Lesen Sie zunächst alle Aufgaben durch und beginnen Sie dann mit der einfachsten. Schreiben Sie deutlich und sauber. Unleserlichkeiten werden nicht korrigiert!! Voraussetzung für die Zulassung zur Klausur ist das erfolgreich testierte, zugehörige Praktikum. Nr. Punkte Aufgabe 1 15 Gegeben sei die Klasse Person class Person. ; Erklären Sie die folgenden Befehlszeilen: 1) const int n=10; 2) Person pp[n+1],nobody; 3) Person *pt=&pp[1]; 4) for ( int i=0;i<n;i++) pt[i]=nobody; 1) Eine Variable vom Typ const int, initialisiert mit 10, wird deklariert. 2) Ein Array mit 11 Elementen vom Typ Person wird deklariert, sowie eine Variable vom selben Typ. Alle werden mit dem Defaultkonstruktor initialisiert 3) Eine Variable vom Typ Zeiger auf Person wird deklariert, initialisiert mit der Adresse des 2. Arrayelements. 4) Die Arrayelemente pp[1] bis pp[10] erhalten als Wert nobody. 1/9
2 15 Beantworten Sie die folgenden Fragen 1) Was versteht man unter einer Referenz? Eine Referenz ist ein anderer Name für ein existierendes Objekt. 2) Was bedeutet public-vererbung? Alle Public-Elemente der Basisklasse sind auch Public-Elemente der abgeleiteten Klasse. 3) Was versteht man unter einer queue? Eine Queue (auch Schlange, Warteschlange) ist eine sequenzielle Struktur von Objekten gleichen Typs, bei der die Operation Einfügen an einem Ende und Löschen nur an dem anderen Ende möglich sind. Prinzip: FIFO (first in first out) 12 4) Welchen Wert hat 3<<2? 5) Wozu wird catch verwendet? Kopfzeile eines Exception-Handlers 2/9
Nr. Punkte Die Klasse Person (Aufgabe 1) kann als Basisklasse für eine Vielzahl von Anwendungen dienen und ist nicht zu programmieren. class Person private: unsigned int personalnummer; string nachname,vorname; Person *next;//fuer verkettete Liste public: Person(unsigned int,string,string);// Konstruktor void anzeige(); Person* getnext(); void setnext(person*); // weitere bei Bedarf ; 3 15 a) Geben Sie die Definition einer von Person abgeleiteten Klasse Mitarbeiter an. Diese soll u.a. Angaben zur Position (z.b. Teamleiter) und zum Gehalt enthalten. Weiterhin soll die Vorgabe von Aufgabe 6 enthalten sein, sowie eine Anzeigemethode für alle Daten. b) Geben Sie das UML-Diagramm der beiden Klassen an inkl. Beziehung. Get-/Set-Methoden können weggelassen werden. c) Programmieren Sie für die abgeleitete Klasse einen Konstruktor unter Verwendung des Basisklassenkonstruktors. a) class Mitarbeiter:public Person private: unsigned int gehalt; string position; Mitarbeiter *nextm; //speziell fuer Mitarbeiterliste public: Mitarbeiter(unsigned int,string,string,unsigned int,string); void anzeige(); unsigned int getgehalt(); string getposition(); void setnext(mitarbeiter*); Mitarbeiter *getnext(); bool operator<(mitarbeiter&); ; 3/9
b) Person -personalnummer: unsigned int -vorname: string -nachname: string -next: Person* +Person(unsigned int, string, string) +anzeige(): void -bruttogehalt: unsigned int -position: string Mitarbeiter +Mitarbeiter(unsigned int, string, string, unsigned int, string) +anzeige(): void +operator<(mitarbeiter): bool c) Mitarbeiter::Mitarbeiter(unsigned int pnr,string vn, string nn,unsigned int b,string p ) :Person(pnr,vn,nn) bruttogehalt=b; position=p; 4/9
4 15 Es sollen aus einer Datei wiederholt die Daten von Objekten der Klasse Mitarbeiter gelesen werden. Zur Behandlung von Fehlern mittels Exception- Handling soll hierzu eine von der Systembasisklasse für Fehler abgeleitete Fehlerklasse definiert werden. a) Geben Sie die Klassendefinition einer derartigen Fehlerklasse an. Damit soll es möglich sein, folgenden Fehler zu melden: Personalnummer <nummer> mehrfach vorhanden. b) Formulieren Sie einen dazu passenden throw-befehl (ohne if). c) Programmieren Sie für die Fehlerklasse eine Methode, welche am Bildschirm obige Meldung erzeugt und anschließend noch die Daten der Person ausgibt. d) Programmieren Sie zu diesem Fehler einen dazu passenden Exception- Handler. a) class Mehrfach:public exception private: Mitarbeiter m; string meldung; public: Mehrfach(Mitarbeiter); void anzeigemeldung(); char* what(); ; b) throw Mehrfach(ma);// dabei ist ma ein betroffener Mitarbeiter c) void Mehrfach::anzeigeMeldung() cout<<" Personalnummer <"<<m.getpersonalnummer()<<"> mehrfach vorhanden"<<endl; m.anzeige(); d) catch (Mehrfach mf) mf.anzeigemeldung(); exit(1); 5/9
Nr. Punkte Aufgabe 5 15 Erstellen Sie eine Klasse Mitarbeiterliste als verkettete Liste von Mitarbeitern. Sie soll speziell auch die aktuelle Zahl aller Elemente der Liste als Eigenschaft enthalten. a) Geben Sie eine Klassendefinition von Mitarbeiterliste an. Dabei sollen alle in den Aufgaben 5 bis 7 genannten Methoden aufgeführt sein inkl. einer Anzeigemethode für alle Mitarbeiter in der Liste. b) Programmieren Sie einen zugehörigen Konstruktor. c) Programmieren Sie eine Methode, um einen neuen Mitarbeiter aufzunehmen. a) class Mitarbeiterliste private: Mitarbeiter* start; unsigned int anzahl; public: Mitarbeiterliste(); void einfuegen(mitarbeiter*); void anzeige(); void anzeigeposition(string); unsigned int getanzahl(); ; b) c) Mitarbeiterliste::Mitarbeiterliste() start=null; anzahl=0; void Mitarbeiterliste::einfuegen(Mitarbeiter* m) m->setnext(start); start=m; anzahl++; 6/9
6 15 Formulieren Sie für die Klasse Mitarbeiter eine Überladung des < Operators, um bequem im Bedarfsfall nach Gehalt sortierte Listen erzeugen zu können: bool Mitarbeiter::operator<(Mitarbeiter &m) return gehalt<m.getgehalt(); 7/9
7 15 a) Programmieren Sie eine Methode von Mitarbeiterliste, welche eine Liste aller Mitarbeiter mit gleicher Position (als Parameter vorzugeben) anzeigt. b) Erstellen Sie einen dazugehörigen Testplan. void Mitarbeiterliste::anzeigePosition(string p) Mitarbeiter*aktuell=start; while( aktuell!=null) if ( p == aktuell->getposition() ) aktuell->anzeige(); aktuell=aktuell->getnext(); Getestet wird mit Mitarbeitern mit folgenden Positionen M1 Assistent M2 Assistent M3 Teamleiter M4 Teamleiter M5 Teamleiter M6 Direktor Damit werden folgende Listen gebildet L1 keine Mitarbeiter L2 M6 L3 M1,M2,M3,M4,M5,M6 L4 M3,M4,M5 Fall Beschreibung Liste Parameter Erw. Ergebnis 1 Leerer Liste L1 Direktor / 2 Nur 1 MA + L2 Direktor M6 3 Nur 1 MA - L2 Assistent / 4 gemischt+ L3 Teamleiter M3,M4,M5 5 gemischt - L3 Gruppenleiter / 6 alle L4 Teamleiter M3,M4,M5 8/9
8 15 In einer Datei stehen zeilenweise (durch Zwischenraum getrennt) die Daten aller Mitarbeiter. Erstellen Sie ein Programm main, welches diese liest, entsprechende Objekte der Klasse Mitarbeiter erzeugt und diese in ein Objekt der Klasse Mitarbeiterliste einfügt. Weiterhin sind alle genannten Methoden von Mitarbeiterliste wenigstens einmal zu verwenden. Plausibilitätskontrollen bei der Eingabe können weggelassen werden. void main() Mitarbeiterliste ml; fstream ein("ein.txt",ios::in); unsigned int personalnummer,gehalt; string vorname,nachname,position; //Lesen aus Datei ein>>personalnummer>>vorname>>nachname>>gehalt>>position; while(!ein.eof()) Mitarbeiter *m=new Mitarbeiter(personalnummer,vorname,nachname,gehalt,position); ml.einfuegen(m); ein>>personalnummer>>vorname>>nachname>>gehalt>>position; //Methodenaufrufe ml.anzeige(); ml.anzeigeposition("projektleiter"); ml.anzeigeposition("pp"); 9/9