Klausur Programmieren 2 SS 2016 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 Beantworten Sie die folgenden Fragen. a) Welcher Fehler ist in den folgenden beiden Zeilen enthalten? int x, *px; *px=1; px wurde nicht initialisiert. Daher ist *px=1 ein Fehler b) Welcher Fehler ist in den folgenden beiden Zeilen enthalten? int x,*px; float f=2.5, *pf=&x; pf ist ein Zeiger auf float und kann daher keine Adresse auf int speichern c) Was versteht man unter einer Queue? Eine sequenzielle Liste, wo einfügen nur an einem Ende und löschen nur an dem anderen Ende möglich ist. d) Was bewirkt das flag ios::out? In eine Datei können Daten geschrieben werden. Die Datei wird ggf. neu angelegt. e) Was bewirkt die Verwendung des Schlüsselworts friend? Einer Funktion oder anderen Klasse wird der Zugriff auf die Privat- Elemente einer Klasse ermöglicht. 1/10
Nr. Punkte Text 2 15 Gegeben seien die folgenden Deklarationen: int a=3, b[]=2,4,6,8,10,*pa=&a,*pb=&b[2]; fstream file("datei.txt"); //jetzt kommen die Ausdrücke Bestimmen Sie Typ und Wert der angegebenen Ausdrücke. Ausdruck Typ Wert *(pb-1) int 4 file<<b[2] fstream file a&3 int 3 file.eof() bool false 2/10
Nr. Punkte 3 15 Die Klasse Spiel dient zum Management der Organisation der Fußball- Europameisterschaft. Dabei ist jede teilnehmende Mannschaft einer Gruppe zugeordnet. Innerhalb einer Gruppe spielen dann die zugeordneten Mannschaften gegeneinander. Die Daten (Eigenschaften) aller gespielten Spiele stehen zeilenweise in einer Datei. class Spiel private: char gruppe;//bezeichnung der Gruppe unsigned int nummer;//nummer des Spiels string team1,team2;//beteiligte Mannschaften unsigned int tore1,tore2;//jeweils erzielte Tore public: //erforderliche Konstruktoren, get- und set-methoden ; a) Geben Sie die Klassendefinition einer von der Systembasisklasse abgeleiteten Fehlerklasse an. Damit soll es möglich sein, mittels Exception-Handling folgenden Fehler zu melden: eine der beteiligten Mannschaften spielt nicht in der angegebenen Gruppe. b) Wie kann ein zu diesem Fehler gehörender Meldungstext erzeugt werden? Betroffene Mannschaft und Gruppe sollen genannt werden. c) Programmieren Sie zu diesem Fehler einen dazu passenden Exception-Handler. a) class GruppenFehler:public exception private: unsigned int nr;//nummer des falschen Teams string text;//meldungstext public: GruppenFehler(unsigned int n, Spiel s); string message();//liefert Meldungstext ; b) z.b. im Konstruktor GruppenFehler(unsigned int n, Spiel s) nr=n; stringstream ss;//meldungstext erstellen if ( nr==1 ) //Team 1 ist betroffen ss<<s.getteam1(); else ss<<s.getteam2();//team 2 ist betroffen ss<<" gehoert nicht zu Gruppe "<<s.getgruppe(); text=ss.str(); c) catch (GruppenFehler e) cout<<e.message(); exit(1); 3/10
Nr. Punkte Text 4 15 Gegeben sei die Klasse Fahrzeug class Fahrzeug public: Fahrzeug(string,int);//Konstruktor void anzeige(); //alle notwendigen get-/set-methoden //weitere bei Bedarf private: string kennzeichen; int insassen ;//Anzahl der Insassen Fahrzeug *next; ; a) Fahrzeug kann als Basisklasse einer Reihe von Spezialisierungen angesehen werden. Geben Sie die Definition einer möglichen abgeleiteten Klasse davon an. b) Geben Sie das UML-Diagramm der beiden Klassen an inkl. Beziehung. Get-/Set-Methoden können weggelassenwerden. c) Programmieren Sie für die abgeleitete Klasse einen Konstruktor (nicht Default-Konstruktor), welcher alle Werte sinnvoll belegt. d) Programmieren Sie für die abgeleitete Klasse eine Methode void anzeige() als Redefinition zur Bildschirmausgabe aller Daten. a) class LKW: public Fahrzeug private: bool anhaenger;//hat Anhaenger public: LKW(string k,int i, bool a); void anzeige();//redefinition ; b) Fahrzeug -insassen: unsigned int -kennzeichen: string -next: Fahrzeug* +Fahrzeug(unsigned int, string) +anzeige(): void LKW -anhaenger: bool +LKW(unsigned int, string, bool) +anzeige(): void 4/10
c) LKW::LKW(string k,int i, bool a): Fahrzeug(k,i) anhaenger=a; d) void LKW::anzeige() Fahrzeug::anzeige();//aus Basisklasse cout<<" mit Anhaenger "<<anhaenger<<endl; 5/10
Nr. Punkte Aufgabe 5 15 Es soll eine Studie über Staus auf einspurigen Straßen durchgeführt werden. Hierzu ist eine Klasse Stau als verkettete Liste von Fahrzeugen zu implementieren. Diese soll eine Bezeichnung (z.b. Straßenname) haben, sowie auch Angaben zu Stauanfang und Stauende. a) Geben Sie eine Klassendefinition von Stau an. Dabei sollen alle in den Aufgaben 5 bis 7 genannten Methoden aufgeführt sein. b) Programmieren Sie einen zugehörigen Konstruktor. c) Programmieren Sie eine Methode, wo ein neues Fahrzeug zum Stau dazukommt. d) Programmieren Sie eine Methode, wo ein Fahrzeug sich aus dem Stau entfernt ( wenn er sich auflöst ). a) class Stau private: string bezeichnung; Fahrzeug *stauanfang,*stauende; public: Stau(string) bool hinzufuegen(fahrzeug *); void anzeigeg(unsigned int i) void entfernen(); ; b) Stau::Stau(string b) bezeichnung=b; stauanfang=null; stauende=null; c) void Stau::hinzufuegen(Fahrzeug *w) if ( stauanfang==null )//war leer stauanfang=w; stauende=w; else stauende->setnext(w); stauende=w; w->setnext(null);//da jetzt stauende d) void entfernen(); if ( stauanfang==null )//leer return; else stauanfang=stauanfang->getnext(); if (stauanfang==null)//jetzt leer stauende=null; 6/10
Nr. Punkte Text 6 15 Formulieren Sie für die Klasse Fahrzeug eine Überladung des < Operators: Es gilt Fahrzeug a < Fahrzeug b wenn Fahrzeug a im Stau vor Fahrzeug b steht. bool Fahrzeug::operator <(Fahrzeug w) Fahrzeug*aktuell=getNext();//erstes danach while (aktuell!=null) if (aktuell->getkennzeichen()==w.getkennzeichen() ) return true;//gefunden aktuell=aktuell->getnext(); return false; Nr. Punkte Text 7/10
7 15 Programmieren Sie eine Methode, welche alle Fahrzeuge am Bildschirm anzeigt, wo die Anzahl der Insassen größer ist als ein mittels Parameter vorgegebenen Wert. Geben Sie einen zugehörigen Testplan an. void Stau::anzeigeG(unsigned int i) cout<<" Stauuebersicht "<<bezeichnung<<endl; cout<<" mehr als "<<i<<" Insassen"<<endl; Fahrzeug *aktuell=stauanfang; while (aktuell!=null) if (aktuell->getinsassen()>i )//passt aktuell->anzeige(); aktuell=aktuell->getnext(); Testplan Verwendete Fahrzeuge: f1 F-XY-14 3 f2 DA-XY-34 2 f3 MIL-XY-34 4 f4 OBB-XY-124 1 f5 DA-XY-14 4 f6 F-XY-1234 2 Nr. Text Param. Fahrzeuge Ergebnisliste 1 leer 1 / / 2.1 1 Fahrzeug passt 1 f1 f1 2.1 1 Fahrzeug nicht 4 f1 / 3.1 6 Fahrzeuge-keiner 4 f1,f2,f3,f4,f5,f6 / 3.2 6 Fahrzeuge-gemischt 2 f1,f2,f3,f4,f5,f6 f1,f3,f5 3.3 6 Fahrzeuge-alle 0 f1,f2,f3,f4,f5,f6 f1,f2,f3,f4,f5,f6 8/10
Nr. Punkte Text 8 15 Erstellen Sie ein Programm main, welches - zuerst die Daten aller im Stau befindlichen Fahrzeuge aus einer Datei liest und jeweils ein zugehöriges Objekt vom Typ Fahrzeug in den Stau einfügt. - Alle Fahrzeuge mit mehr als 2 Insassen anzeigt. Auf Plausibilitätskontrollen und das Abfangen von Fehleingaben kann verzichtet werden. void main() fstream ein("input.txt",ios::in); string kz; int in; Stau s("schoefferstrasse");//deklaration Stau ein>>kz>>in;//erste Zeile while (!ein.eof() )//kein Dateiende Fahrzeug *w=new Fahrzeug(kz,in); s.hinzufuegen(w);//neues Fahrzeug einfuegen ein>>kz>>in;//naechste Zeile lesen s.anzeigeg(2);//mehr als 2 Insassen 9/10
10/10