Lösung zur Klausur C++ und Data Mining 16. Juli 2004 (SS 2004)

Ähnliche Dokumente
Klausur zu Objektorientierter Softwareentwicklung in C++ 4. Februar 2003 (WS 2002/2003) Beispiellösung

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Probeklausur: Programmierung WS04/05

Objektorientierung Grundlagen

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Überladen von Operatoren

11.3 Virtuelle Methoden

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Vererbung & Schnittstellen in C#

Probeklausur: Programmierung WS04/05

3. Semester : 1. Prüfung

Praktikum Betriebssysteme 1. Aufgabe (1)

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen

Vererbung und Polymorphie

4 Schleifen und Dateien

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

3D Programmierpraktikum: Einführung in C++ - Teil 2

Theorie zu Übung 8 Implementierung in Java

Klausur in Programmieren

Die abgeleiteten Klassen Kreis und Viereck erben die Elemente des Basisklasse und verfügen über zusätzliche Eigenschaften (Seitenlänge,

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Nachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.

Quiz und Übungen. C++ Übung am 19. Mai 2016

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Klausurvorbereitung Lösung

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Klausur zur Vorlesung Grundlagen der C++-Programmierung

Der C++ Crashkurs v1.0

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Einführung in C++ Vererbung und Polymorphismus

Programmierung und Angewandte Mathematik

Assoziative Container in C++ Christian Poulter

Programmierkurs C++ Abstrakte Klassen und Methoden

Informatik I. Übung 2 : Programmieren in Eclipse. 5. März Daniel Hentzen

Angewandte Mathematik und Programmierung

Hochschule München, FK 03 SS Masterstudiengang Technische Berechnung und Simulation. Programmierung von CAx-Systemen Teil 1

Einstieg in die Informatik mit Java

Beziehungen zwischen Objekten

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

7 Vererbung. Modul Programmieren mit C++ Kapitel Vererbung

01. Grundprinzipien der Vererbung

Übungen zur Vorlesung EidP (WS 2015/16) Blatt 6

Klausur in Programmieren

Objektorientiertes Programmieren für Ingenieure

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Aufbau von Klassen. class punkt {...

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Programmieren - Vererbung & Polymorphie

1. Von der Idee zur Software 2. Funktionen und Datenstrukturen Lehrbuch: Organisation des Quellcodes 4. Werte- und Referenzsemantik

Klausur zur Einführung in die objektorientierte Programmierung mit Java

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Präsentation Interfaces

Universität Augsburg, Institut für Informatik Sommersemester 2005 Prof. Dr. Werner Kießling 15. Oktober 2005 Dr. Alfons Huhn, Timotheus Preisinger

Ein- und Ausgabe (I/O)

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Allgemeine Informatik II SS :30-13:30 Uhr

Kapitel 8: Abstrakte Datentypen. Inhalt. Definition ADT Keller ADT Schlange

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

FB Informatik. Fehler. Testplan

Javakurs für Anfänger

Einleitung. Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ Kurzeinführung in C/C++

Programmierung mit C Zeiger

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung mit C++ Vector und List

C++ - Eine Ubersicht fur Java-Programmierer

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Einführung in die Programmierung (EPR)

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Vergleich verschiedener OO-Programmiersprachen

Programmieren - C++ Funktions-Templates

Kurzeinführung in C/C++ Elementare Datentypen in C++

Kapitel 6. Vererbung

Übung HP Beispielaufgaben 3

Zeiger, Arrays und Strings in C und C++

Angewandte Mathematik und Programmierung

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Verwendung von Klassen in C++

Inhalt Streams Eingabe / Ausgbe in C Dateizugriff in C Eingabe / Ausgabe in C++ Dateizugriff in C++ Error Handling

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Klassenbeziehungen & Vererbung

Elementare Datentypen in C++

HS Ravensburg-Weingarten Schriftlich Prüfung Programmieren

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Einführung in C++ Operatoren überladen (Klassen)

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Java I Vorlesung 6 Referenz-Datentypen

13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

Lösungsvorschlag zum Übungsblatt 1 zur Vorlesung Informatik II / WS2001/02

Einstieg in die Informatik mit Java

1 Polymorphie (Vielgestaltigkeit)

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Vererbung. Was versteht man unter dem Begriff Vererbung?

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Transkript:

Lösung zur Klausur C++ und Data Mining 16. Juli 2004 (SS 2004) Bearbeitungszeit: 120 Minuten NICHT MIT BLEISTIFT SCHREIBEN!!! Name: Vorname: Matrikelnummer: E-Mail: Aufgabe 1 2 3 a 3 b 4 5 6 7 8 9 a 9 b Summe (max. 50 Punkte) Muster Helga Punkte Bitte benutzen Sie für die Lösungen den freigelassenen Platz nach der jeweiligen Angabe oder die Rückseite unter Angabe der Aufgabe. Nennen Sie möglichst alle Annahmen, die Sie für die Lösung einer Aufgabe treffen! Bitte kontrollieren Sie, ob Ihre Klausur alle 9 Aufgaben enthält!! Vollen Erfolg!!!

Aufgabe 1 (10 Punkte 1 Punkt je Antwort) Bitte jeweils eine Antwort ankreuzen (je nach Fragestellung die richtige oder falsche): A sei die Oberklasse und B die (abgeleitete) Unterklasse. Welche Aussage stimmt: A) A besitzt meistens mehr Methoden und weniger Variablen als B B) A besitzt meistens weniger Methoden und dafür aber mehr Variablen als B C) Im UML-Diagramm zeigt die Spitze des Pfeils zwischen A und B auf A D) Im UML-Diagramm muss am Ende der Verbindungslinie zwischen A und B eine Raute sein In welchem Zusammenhang taucht das Konzept der virtuellen Klassen in der Vorlesung auf: A) Mehrfachvererbung B) Polymorphie C) Virtuelle Funktionen D) Online-Campus Wenn Sie beabsichtigen, eine Klasse A als Basisklasse für andere Klassen einzusetzen, dann gilt: A) die abgeleitete Klasse muss unbedingt einen eigenen Konstruktor definieren B) mindestens ein Element von A sollte protected sein C) der Destruktor von A sollte als virtual deklariert sein. D) die Klasse muss via class parent A deklariert werden Was ist richtig? Eine statische Klassenvariable... A)... heißt statisch, weil sie nicht verändert werden kann B)... heißt statisch, weil sie auch dann existiert, wenn kein Objekt der Klasse angelegt ist C)... kann immer direkt bei der Deklaration in der Klassendefinition vorinitialisiert werden D)... kann nur als private deklariert werden Was ist hier richtig: A) Jede Mehrfachvererbung kann mit zwei IS-A-Beziehungen simuliert werden. B) Pointer und Referenzen auf Objekte verhalten sich im Kontext der Polymorphie gleich. C) zwischen Pointer und Referenzen gibt es überhaupt keine Unterschiede im Verhalten D) eine Referenz kann man mit ++ erhöhen, einen Pointer nicht Eine Klasse heißt abstrakt, wenn A) sich niemand etwas in Wirklichkeit darunter vorstellen kann B) sie mindestens eine rein virtuelle Methode besitzt C) sie einen generischen Algorithmus enthält D) sie einen abstrakten Vektorraum aufspannt

Polymorphie tritt nicht auf bei Verwendung von A) Objektvariablen, B) Objektreferenzen, C) Objektzeigern, D) Zeigern auf Objekte von abgeleiteten Klassen. Die Schnittstelle ( Interface ) einer Klasse besteht aus A) polymorphen Ringen, B) den protected-elementen einer Klasse oder C) den public-elementen einer Klasse oder D) zwei konzentrischen Kreisen. Welches der folgenden Statements läßt der Compiler nach der Deklaration von const int p[3] = {1,2,3; sicher noch zu: A) *p = 3, B) p++, C) (*p)++, D) int q = *p. Sie haben eine Klasse A geschrieben und wollen A in einer Map als Index verwenden: map<a, string> carpenter; Welche Methode muss dafür in der Klasse A implementiert werden: A) operator<() B) operator==() C) operator[] D) operator()(a &a, A &B)

Aufgabe 2 (4 Punkte) Gegeben sei das folgende Programm check1.cc #include <iostream> using namespace std; void ausgabe(int &a) { cout <<"1"<<endl; int ausgabe(const int &a) { cout <<"2"<<endl; return 0; int main() { const int pi = 3; ausgabe(pi); Was wird bei der folgenden Shell-Kommandozeile ausgegeben? g++ check1.cc && a.out A) 1 B) Eine Syntaxfehlermeldung des Compilers für das Programm C) Eine Fehlermeldung, dass der Compiler beim Aufruf von ausgabe(3) nicht weiss, welche Funktion er nehmen soll D) 2 -- Das const in ausgabe() gehört zur Signatur!!

Aufgabe 3 (2 + 2 = 4 Punkte) a) Sie sitzen an der Thales und bei Eingabe von g++ check2.cc erhalten sie 977 Zeilen Fehlermeldung. Sie haben keine Möglichkeit, im Ausgabefenster nach oben zu scrollen. Wie können Sie sich trotzdem die ersten 10 Zeilen der Fehlermeldungen ansehen? g++ check2.cc 2>&1 head 10 Sie haben eine eigene Klasse class selfish geschrieben und wollen verhindern, dass im direkt im Hauptprogramm Objekte dieser Klasse angelegt werden können. Dies soll erst über den Umweg von abgeleiteten Klassen möglich sein. Nennen Sie mindestens zwei Möglichkeiten, wie Sie das erreichen können. a) deklariere mindestens eine Methode rein virtuell b) mache den Konstruktor von selfish protected

Aufgabe 4 (4 Punkte) Ergänzen Sie die Klassendefinition von shellfish so, dass als Ausgabe des Programms fishi, fishi! auf dem Bildschirm erscheint: #include <string> #include <sstream> #include <iostream> using namespace std; class shellfish { string fishi; shellfish(string i = "Dr.No") : fishi(i) { ; friend ostream &operator<<(ostream &out, const shellfish &f) { return out <<f.fishi; int main() { shellfish fish("fishi"); ostringstream o; o<<fish; cout <<o.str()<<", "<<fish<<"!"<<endl;

Aufgabe 5 (4 Punkte) Gegeben sei das folgende Programm car.cc (auf Include-Anweisungen wird verzichtet!): int main(int argc, char **argv) { map<string, int> cars; ifstream fp(argv[1]); string line; if (!fp) exit(1); getline(fp, line); while (!fp.eof()) { int pos = line.find(":"); string car = line.substr(0, pos); cars[car] += atoi((line.substr(pos+1).c_str())); getline(fp, line); for (map<string,int>::iterator i=cars.begin(); i!=cars.end(); i++){ cout <<i->first<<":"<<i->second<<endl; return 0; Eingabedatei input: merkedes:17 folkswagen:19 merkedes:16 bmv:14 folkswagen:19 folkswagen:5 Geben Sie bitte die genaue Ausgabe des Programms beim Aufruf von g++ car.cc && a.out input an: bmv:14 folkswagen:43 merkedes:33 Das Programm summiert die Werte in der zweiten Spalte pro PKW-Marke auf. Die Ausgabe erscheint ALFABETISCH SORTIERT, da dies durch die interne Sortierung in der Map so gegeben ist.

Aufgabe 6 (6 Punkte) Gegeben seien die Klasse N der natürlichen Zahlen und die Klasse Q der rationalen Zahlen. Die Klasse Q sei eine Erweiterung der Klasse N: class N{ protected: int zaehler; //Nenner ist hier immer 1 N(int z=0):zaehler(z) { virtual ~N() { int getzaehler(){return zaehler; /*...*/ ; class Q : public N{ int nenner; Q(int z=0, int n=1):n(z),nenner(n) { int getnenner(){return nenner; /*...*/ ; Implementieren Sie eine Funktion, die überprüft, ob zwei Zahlen den gleichen Wert haben. Die Funktion soll den folgenden Kopf haben: bool equals(n*, N*); Dabei gilt folgendes: - Eine natürliche Zahl ist gleich einer rationalen mit Nenner 1 und gleichem Zähler. - Zwei natürliche Zahlen sind gleich, wenn sie denselben Zähler haben. - Zwei rationale Zahlen seien für diese Aufgabe gleich, wenn sie denselben Zähler und Nenner haben.

(diese Seite wurde absichtlich leer gelassen! sie können hier die Funktion equals implementieren!) bool equals(n *a, N *b) { if (a->getzaehler()!=b->getzaehler()) { return false; // Zaehler muss IMMER gleich sein! int anenner, bnenner; Q *hlp = dynamic_cast<q*>(a); if (hlp) // ich bin ein Q-Objekt anenner = hlp->getnenner(); else // ich bin ein N-Objekt anenner = 1; hlp = dynamic_cast<q*>(b); if (hlp) // ich bin ein Q-Objekt bnenner = hlp->getnenner(); else // ich bin ein N-Objekt bnenner = 1; return anenner == bnenner;

Aufgabe 7 (5 Punkte) Gegeben sei das folgende Programm: class diplom { ofstream fp; diplom(char *name = "DiplArbeit") { fp.open(name); if (!fp) { throw "Auauau: not open can file!"; fp << "Einleitung"<<endl; void hauptteil() { fp <<"Hauptteil"<<endl; ~diplom() { fp <<"Zusammenfassung"<<endl; fp.close(); ; int main() { diplom * arbeit = new diplom(); arbeit->hauptteil(); Was genau wird beim Ausführen des Programms in die Datei DiplArbeit geschrieben? Geben Sie eine kurze Begründung! Einleitung Hauptteil Da kein explizites delete arbeit aufgerufen wird, wird der Destruktor nicht aufgerufen und somit die Zeile Zusammenfassung nicht in die Datei geschrieben. (Das implizite _exit() des Prozesses schliesst alle Dateiverbindungen die Puffer werden aber bereits beim jeweiligen Newline geleert und in die Datei geschrieben.)

Aufgabe 8 (6 Punkte) Schreiben Sie eine allgemeine Templatefunktion B sum(map<a,b> &add); die die Summe aller B-Objekte aus der übergebenen map add berechnet und zurückgibt. Der Operator+ sei für je zwei B-Objekte definiert. Mit Ihrer Funktion soll z.b. (aber nicht ausschließlich!) das untenstehende Programmfragment lauffähig sein: #include <iostream> #include <string> #include <map> using namespace std; // bitte den kompletten Header und die Implementierung // der Funktion B sum(map<a, B> &add) angeben! template <class A, class B> B sum(map<a, B> &add) { map<a,b>::iterator i=add.begin(); if (i == add.end()) throw "add ist ja leer..."; B sum = i->second; for (i++; i!=add.end(); i++) { sum = sum + i->second; return sum; int main() { map<string, float> punkte; punkte["anton"] = punkte["berti"] = punkte["puenktchen"] = 5; punkte["carlos"] = 3; cout <<"Sum = "<<sum(punkte)<<endl; return 0; thales$ g++ addmap.cc && a.out

Aufgabe 9 (5 + 2 = 7 Punkte) Gegeben sei das folgende Programm class.cc: #include <iostream> using namespace std; class A{ A(){cout << "Creating A" << endl; ~A(){cout << "Destroying A" << endl; ; class B : public A{ B(){cout << "Creating B" << endl; ~B(){cout << "Destroying B" << endl; ; class C: public A{ C(){cout << "Creating C" << endl; ~C(){cout << "Destroying C" << endl; ; class D: public C, public B{ D(){cout << "Creating D" << endl; ~D(){cout << "Destroying D" << endl; ; int main(){ { A a; D d; cout << jetzt iss aber schluss!!! <<endl;

a) Geben Sie bitte die genaue Ausgabe des Programms beim Aufruf von g++ class.cc && a.out input an: Creating A -- Objekt a der Klasse A wird erzeugt Creating A -- Initialisierung von Innen nach Aussen, Skript S.62 Creating C -- A>C>A>B>D oder A>B>A>C>D beides wird akzeptiert Creating A Creating B Creating D -- zuletzt der eigentliche Datentyp D Destroying D -- Geltungsbereich von d ist beendet! Destroying B -- Zerstörung von Aussen nach Innen Destroying A -- D>B>A>C>A oder D>C>A>B>A beides ok! Destroying C Destroying A Destroying A jetzt iss aber schluss!!! b) Das Programm gibt leider nicht das gewollte Ergebnis aus. Zwei wichtige Regeln für die Vererbung wurden nicht beachtet wurden. Erklären Sie kurz, was Sie an dem Programm verbessern würden. a) Destruktoren virtuell machen! (Hat hier aber keinen Einfluss!) b) virtuelle Vererbung einsetzen ( public virtual ), da Mehrfachvererbung - dann wäre die Ausgabe (Konstruktor von A wird nur einmal aufgerufen!): Creating A Creating A Creating C Creating B Creating D Destroying D Destroying B Destroying C Destroying A Destroying A jetzt iss aber schluss!!!