Prüfung aus PROGRAMMIEREN (2) (C++) (WS 2002/03)

Ähnliche Dokumente
Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

Lösung der OOP-Prüfung WS12/13

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

Übungen zu Programmieren 3 (C++) (4-1)

Übungen zu C++ (4-1)

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Prüfung aus PROGRAMMIEREN 3 (SS 2003)

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

Polymorphismus 179. Function.h. #include <string>

Praktikum zu OOP/C++ (4)

Objektorientierte Programmierung mit C++ SS 2007

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

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

Praktikum Betriebssysteme 1. Aufgabe (1)

Prüfung in PROGRAMMIEREN 3 WS 2006/07

Hochschulprüfung in objektorientiertes Programmieren WS 2014/15

Vokabeln. 4.1 Benutzer definierte Datentypen. Kapitel 4. Prof. Dr. Gerhard Berendt C++ oop? SS 2002 Arbeitsblatt 4

Grundlagen der Informatik

Tag 8 Repetitorium Informatik (Java)

Name: Klausur Informatik III WS 2003/04

Vorlesungsprüfung Programmiersprache 1

Einführung in das Objektorientierte Programmieren mit C++

Klassen. Kapitel Klassendeklaration

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

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

SimpleStat mit Methoden

Programmieren II Abstrakte Klassen / Virtuelle Methoden. Programmieren II Abstrakte Klassen / Virtuelle Methoden

Programmierkurs C/C++

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Vererbung I. Kfz Eigenschaften und Methoden der Klasse Kfz Lkw. Pkw. Eigenschaften und Methoden der Klasse Kfz

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

Prof.Dr. Alfred Irber Dies ist keine Musterprüfung, sondern eine Sammlung von Aufgaben aus früheren Prüfungen "Programmieren"

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

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

Computergrundkenntnisse und Programmieren, WS 07/08, Übung 11: Klassen der Standardbibliothek 2

Objektorientierung Grundlagen

Klausur Programmieren 2 SS 2016

Einführung in die Programmierung

Grundkurs C++ IDE Klassenhierarchien

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Grundkurs C++ IDE Klassenhierarchien

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

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

5. Behälter und Iteratoren. Programmieren in C++ Überblick. 5.1 Einleitung. Programmieren in C++ Überblick: 5. Behälter und Iteratoren

Programmieren in C++ Überblick

C++ - Objektorientierte Programmierung Vererbung

C++ Klassen weitere Funktionen

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

c) Zur Ausgabe der Transaktion soll statt print der Operator << verwendet werden.geben Sie die dazu nötigen Änderungen an.

Klausur Programmieren 1 SS 2017

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Grundlagen der Informatik 12. Strukturen

7. Übung Informatik II - Objektorientierte Programmierung

Umsetzung einer Klassenkarte in einer Programmiersprache

Grundlagen der Informatik

Was Mathematiker schon vor Jahrhunderten erfunden haben, gibt es jetzt endlich in ihrer Programmiersprache:

Programmierkurs C/C++

Programmieren 2 C++ Überblick

Crashkurs C++ Wiederholung

Verwendung von Klassen in C++

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: B Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

virtual Wertpapier& operator=(const Wertpapier&); // VIRTUELLE ZUWEISUNG protected: static enum {wortfeldlaenge = 20}; char* name_z; double kurs; };

Einstieg in die Informatik mit Java

Einführung in die Programmierung

Klausur: Informatik I am 06. Februar 2009 Gruppe: D Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Überladen von Operatoren

Auswahlen (Selektionen)

Klassen. C++ Übung am 02. Juni 2016

Programmieren in Java -Eingangstest-

Algorithmen und Datenstrukturen

C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.

Einstieg in die Informatik mit Java

Mikrorechentechnik II. Klassen in C++

Tag 7 Repetitorium Informatik (Java)

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Praktikum OOP/C++ - Versuch 5

Einführung in das Objektorientierte Programmieren mit C++

Klausur Software-Entwicklung März 01

Probeklausur: Programmierung WS04/05

Grundzüge der objektorientierten Programmierung

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

Java Einführung Klassendefinitionen

Überblick. Überblick. Abstrakte Klassen - rein virtuelle Funktionen Beispiele

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

6 ZEIGER UND REFERENZEN - ALLGEMEINES

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

Visuelle Kryptographie. Anwendung von Zufallszahlen

Variablen, Konstanten und Datentypen

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

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

Schriftlicher Test (120 Minuten) VU Einführung ins Programmieren für TM. 24. Juni 2016

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 12

Programmieren - C++ Templates

Informatik 1 MaVt FS Übung 10

Programmieren - C++ Templates

Informatik 1 ( ) D-MAVT F2011. Klassen, Funktionen. Yves Brise Übungsstunde 9

Vererbung und Polymorphie

Transkript:

Fachhochschule München Bereich Datentechnik Fachbereich Elektrotechnik und Informationstechnik A. Irber / R. Thomas Prüfung aus PROGRAMMIEREN (2) (C++) (WS 2002/03) Arbeitszeit 90 Minuten 27.Januar 2003 Beliebige eigene Unterlagen Aufgabenblatt bitte abgeben! **** Viel Erfolg!!! **** 1. Aufgabe (41) Die Klasse Konto, deren unvollständige Definition nachfolgend gegeben ist, dient zur Beschreibung eines einfachen Kontos. class Konto public: //siehe b).//siehe c).//siehe d).//siehe d).//siehe e) private: string m_name; unsigned m_nr; double m_stand; //Name des Kontoinhabers //Kontonummer //Kontostand Der Name des Kontoinhabers ist vom Klassen-Typ string. Diese Klasse ist Teil der ANSI-C++ Standardbibliothek. Sie ähnelt der im Praktikum erstellten Klasse MString bzw. MyString. Zu ihrer Verwendung muss die Headerdatei <string> eingebunden werden. Die Klasse verfügt unter anderem über folgende Konstruktoren : string(); Erzeugt einen leeren String (Länge 0) string(const char* s); Erzeugt einen String der mit dem C-String s initialisiert wird string(const str& str, Erzeugt einen String, der mit n Zeichen ab der Position pos aus dem String size_type pos=0, str initialisiert wird. Der Defaultwert npos bewirkt, dass bis zum letzten size_type n=npos); Zeichen von str kopiert wird. Weiterhin ist neben weiteren Operatorfunktionen auch die folgende Operatorfunktion definiert : string& operator=(const string& str); a) Was passiert beim Anlegen eines Konto-Objektes, falls die Klassendefinition überhaupt keinen Konstruktor enthält? (5) Welche Werte besitzen die 3 Datenkomponenten eines solchen Objektes? b) Deklarieren Sie in der Klassendefinition (auf dem Angabenblatt) einen Default-Konstruktor und implementieren Sie ihn (4) ausserhalb der Klassendefinition (Initialisierung : Name mit Leerstring, Kontonummer und Kontostand mit 0 bzw 0.0) Die Klasse soll über einem weiteren Konstruktor verfügen, mit dem Objekte vom Typ Konto beim Anlegen mit frei wählbaren Werten für den Namen, die Kontonummer und den Kontostand initialisiert werden können. Falls kein Kontostand angegeben wird, soll der Kontostand auf 0.0 gesetzt werden. c) Tragen Sie die benötigte Deklaration des Konstruktors in das Angabenblatt ein. (8) Implementieren Sie den Konstruktor ausserhalb der Klassendefinition. Verwenden Sie hierbei eine Initialisierungsliste.... weiter Seite 2

- 2 - Der Zugriff zu den privaten Datenkomponenten soll mit Hilfe von Methoden realisiert werden. Die Methode zur Abfrage des Kontostandes soll nur lesenden Zugriff gestatten d) Erweitern Sie auf dem Angabenblatt die Klassendefinition um je eine Methode zur Abfrage und zum Setzen des (5) Kontostandes. Beiden Methoden sollen innerhalb der Klassendefinition auch definiert werden. Zum Vergleich zweier Konten soll für die Klasse Konto der <-Operator als Memberfunktion überladen werden. Als Vergleichskriterium soll der Kontostand verwendet werden. e) Geben Sie die Deklaration (auf dem Angabenblatt in der Klassendefinition) und die Implementierung (ausserhalb der (6) Klassendefinition) des <-Operators an. In der Funktion main() wird wie nachfolgend gezeigt ein Array vom Typ Konto angelegt und mit 3 Konto-Objekten initialisiert. int main() const in anz =3; Konto kontotab[] = Konto("Maier", 1, 500.0), Konto("Huber", 2 ), Konto("Graf", 3, 1000.0) //... Konto maxkonto =...siehe g) //... } Zur Verwaltung einer Anzahl von Konten soll eine freie Funktion suchemaxkonto()realisiert werden. Die Funktion soll aus einem beliebigen Konto-Array das Konto mit dem maximalen Kontostand ermitteln und dieses Konto als Funktionswert zurückliefern. Die Anzahl der Konten (=belegten Einträge) des Arrays ist der Funktion als Parameter zu übergeben. f) Geben Sie die Implementierung der freien Funktion suchemaxkonto() an. (11) g) Ergänzen Sie in der obigen Angabe die Zuweisung an das Objekt maxkonto in der Funktion main()um einen (2) korrekten Funktionsaufruf von suchemaxkonto(). 2. Aufgabe (55) Auf dem Beiblatt ist die Definition der Klasse FGraphObj etwas unvollständig wiedergegeben (Inhalt der Headerdatei "FGraphObj.h" ) Diese Klasse soll als Basisklasse für weitere Klassen dienen, die jeweils unterschiedliche graphische Objekte modellieren (z.b. FKreis, FRechteck, FDreieck, FLinie usw). Jedes graphische Objekt besitzt einen Referenzpunkt, der seine Position in der zweidimensionalen x-y-ebene festlegt. Dieser Referenzpunkt wird in der Datenkomponente m_dref gespeichert. Der Typ Punkt zur Darstellung eines Punktes in der zweidimensionalsen Ebene ist ebenfalls in der Headerdatei "FGraphObj.h" definiert. Die als inline-funktion implementierte Funktion operator<<() zur Ausgabe des Wertes eines Punktes mittels eines Objekts der Klasse ostream ist unvollständig definiert. a) Vervollständigen Sie die Definition der freien Funktion operator<<() auf dem Beiblatt so, dass der Wert eines (3) Punktes in folgendem Format ausgegeben wird (kein Zeilenwechsel!) : (xwert,ywert) Die Datenkomponente m_pctname ist ein Pointer auf den tatsächlichen Typnamen eines Objekts. Dieser Name wird im Konstruktor der jeweiligen Klasse geeignet festgelegt, z.b. im Konstruktor der Klasse FRechteck zu "FRechteck". b) Das Zugriffsrecht der Komponente m_pctname ist in der o.a. Klassendefinition als protected festgelegt. (3) Darf das Zugriffsrecht bei sonst unverändertem public-interface der Klasse statt protected auch private sein? Begründen Sie Ihre Antwort!... weiter Seite 3

- 3 - Jedes graphische Objekt soll durch eine eindeutige Objekt-ID vom Typ unsigned int gekennzeichnet sein. Die Objekt-ID ist im Konstruktor der Klasse FGraphObj zu setzen. Beginnend mit einem geeignet festgelegten Anfangswert soll die Objekt-ID jedes neu erzeugten Objekts um 1 höher als die des zuletzt erzeugten Objekts sein. c) Ergänzen Sie auf dem Beiblatt die Definition der Klasse FGraphObj um die Datenkomponente(n), die zur Reali- (3) sierung der Object-ID im vorstehend beschriebenen Sinn benötigt wird (werden). d) Der Anfangswert der Objekt-ID sei 1001. (3) Formulieren Sie eine Programmzeile, mit der dieser Anfangswert festgelegt wird. Wo sollte diese Programmzeile sinnvollerweise stehen? Der Konstruktor FGraphObj(Punkt p) - setzt den Referenzpunkt des Objekts auf den übergebenen Parameter p, - setzt die Objekt-ID - und initialisiert die Datenkomponente m_pctname mit einem geeigneten Wert. e) Formulieren Sie diesen Konstruktor. (5) Die Memberfunktion bool sametype(const FGraphObj&) const; liefert den Wert true, falls das aktuelle Objekt und das als Parameter übergebene Objekt vom gleichen Typ sind. Andernfalls liefert sie den Wert false. f) Formulieren Sie die Memberfunktion bool sametype(const FGraphObj&) const. (4) Die Memberfunktion bool equals(const FGraphObj&) const; liefert den Wert true, falls das aktuelle Objekt und das als Parameter übergebene Objekt vom gleichen Typ sind und beide Objekte gleiche Referenz-Punkte besitzen. Andernfalls liefert sie den Wert false. g) Formulieren Sie die Memberfunktion bool equals (const FGraphObj&) const. (5) Die Memberfunktion void show(ostream&) const; dient zur Darstellung eines FGraphObj-Objektes. Sie soll hier als Ersatz für eine graphische Darstellung die Objekt-Eigenschaften mittels des als Parameter übergebenen ostream-objektes in folgendem Format ausgeben (ohne Zeilenwechsel!) : Obj-Id : i...i Type : t...t Ref-Pkt : (x..x,y..y) h) Formulieren Sie die Memberfunktion void show(ostream&) const. (6) Von der Klasse FGraphObj soll die Klasse FKreis abgeleitet werden. Diese Klasse dient zur Beschreibung von Kreisen. Kreise sind durch ihren Mittelpunkt (Referenz-Punkt) und ihren Radius eindeutig definiert. Die Klasse soll über zwei zusätzliche Datenkomponenten verfügen : - eine double-komponente zur Speicherung des Kreis-Radius - eine unsigned-komponente, die die Anzahl der jeweils aktuell existierenden FKreis-Objekte aufnimmt. Sie soll alle virtuellen Funktionen ihrer Basisklasse überschreiben, sowie zusätzlich folgende Memberfunktionen besitzen : - Konstruktor, der den Referenzpunkt und den Radius setzt (beides wird als Parameter übergeben). - Destruktor - eine Funktion unsigned getanz(), die die Anzahl der aktuell existierenden Kreis-Objekte liefert. i) Formulieren Sie die Definition der Klasse FKreis. Die Definition soll die Implementierung der Memberfunktion (10) unsigned getanz() als inline-funktion enthalten. j) Formulieren Sie den Konstruktor der Klasse FKreis. (7) Beachten Sie, dass der Konstruktor u.a. auch den Typ eines FKreis-Objektes festlegen muß (siehe oben). Die Memberfunktion bool equals(...) const, die die entsprechende Funktion der Basisklasse überschreibt, soll den Wert true liefern, wenn der ihr übergebene Parameter ein FKreis-Objekt referiert und dieses Objekt und das aktuelle Objekt den gleichen Referenz-Punkt und den gleichen Radius besitzen. Andernfalls soll sie den Wert false liefern. k) Implementieren Sie diese Funktion. (6) In der Implementierung muß die überschriebene Funktion der Basisklasse aufgerufen werden.... weiter Seite 4

- 4-3. Aufgabe (30) Nachfolgend ist die Definition der Klasse FGraphic wiedergegeben. Objekte dieser Klasse dienen zur Beschreibung von Graphiken, die aus mehreren graphischen Objekten i.a. unterschiedlichster Art zusammengesetzt sind. Die verschiedenen graphischen Objekte werden durch geeignete Klassen beschrieben, die alle von der gemeinsamen Basisklasse FGraphObj (Definition s. Beiblatt) abgeleitet sind. #define START_SIZE 10 class FGraphic public : FGraphic(unsigned = START_SIZE); ~FGraphic(); unsigned getanz() const return m_uanz;} void clear(); // Entfernen aller graph. Objekte FGraphic& operator+=(const FGraphObj&); // Hinzufügen eines neuen graph. Objekts FGraphic& operator-=(const FGraphObj&); // Entfernen eines graph. Objekts int contains(const FGraphObj&) const; // Überprüfen, ob graph. Objekt enthalten ist void show(ostream& = cout) const; // Darstellung aller graphischen Objekte private : FGraphObj** m_parts; // Pointer auf Pointer-Array zur Referierung der graph. Objekte unsigned m_uanz; // Anzahl der referierten graph. Objekte unsigned m_usize; // Größe des Pointer-Arrays Die einzelnen in einer Graphik enthaltenen graphischen Objekte werden durch ein dynamisch alloziertes Pointer-Array referiert. Die Anfangsgrösse dieses Arrays wird durch einen dem Konstruktor zu übergebenen Parameter festgelegt. Die Memberfunktion int contains(const FGraphObj&) const überprüft, ob das durch den Parameter referierte graphische Objekt bereits in der durch ein FGraphic-Objekt beschriebenen Graphik enthalten ist. Bei Enthaltensein liefert die Funktion den entsprechenden Index des Pointer-Arrays zurück, andernfalls den Wert 1. Die Memberfunktion operator+=(const FGraphObj&) dient zum Hinzufügen des durch den Parameter referierten graphischen Objekts zu der durch ein FGraphic-Objekt beschriebenen Graphik. Ein bereits enthaltenes graphisches Objekt ist nicht noch einmal hinzuzufügen Sind alle Elemente des die einzelnen graphischen Objekte referierenden Pointer-Arrays bereits belegt, muß die Funktion das Pointer-Array um den Wert START_SIZE vergrößern (Neu-Allokation!). Als Funktionswert ist eine Referenz auf das aktuelle Objekt zurückzugeben. a) Implementieren Sie die Memberfunktion operator+=(const FGraphObj&). (21) Es kann vorausgesetzt werden, dass alle anderen Memberfunktionen der Klasse bereits implementiert sind. Die Memberfunktion void show(ostream&) const dient zur Darstellung aller enthaltenen graphischen Objekte durch Ausgabe der jeweiligen Objekteigenschaften mittels des als Parameter übergebenen ostream-objektes. Jedes Objekt ist in einer neuen Zeile darzustellen. Sind keine graphischen Objekte enthalten, ist stattdessen der Hinweis "FGraphic-Objekt ist leer!" auszugeben. b) Implementieren Sie die Memberfunktion void show(ostream&) const. (9) Sie haben es geschafft!!!

Fachhochschule München Bereich Datentechnik Fachbereich Elektrotechnik und Informationstechnik A. Irber /R. Thomas Zur 2. und 3. Aufgabe Prüfung aus PROGRAMMIEREN (2) (C++) (WS 2002/03) Beiblatt Definition der Klasse FGraphObj (enthalten in der Datei "FGraphObj.h") // Header-Datei FGraphObj.h // Definition einer Basisklasse fuer graphische Objekte FGraphObj // Pruefung Programmieren 2 WS 2002/03 #ifndef _FGRAPHOBJ_H #define _FGRAPHOBJ_H #include <iostream> using namespace std; struct Punkt // beschreibt einen Punkt in einer zweidimensionalen Ebene Punkt(double xr=0, double yr=0) x=xr; y=yr;} bool operator == (Punkt v) return x==v.x && y== v.y; } double x; double y; inline ostream& operator << (ostream& out, const Punkt& p) // Ergänzung gemäss Aufgabe 2a) : } //... class FGraphObj public : virtual ~FGraphObj() } void setref(punkt ref) m_dref=ref; } // Setzen des Referenz-Punkts Punkt getref() const return m_dref; } // Rückgabe des Referenz-Punkts unsigned getid() const return m_uobjid; } // Rückgabe der Objekt-Id const char* typename() const return m_pctname; } // Rückgabe des tatsächlichen // Klassennamens bool sametype(const FGraphObj&) const; // Überprüfung auf gleiche Klasse virtual bool equals(const FGraphObj&) const; // Überprüfung auf Objekt-Gleichheit virtual void show(ostream& = cout) const; // Darstellung des Objekts // (Ausgabe der Objekteigenschaften) protected : FGraphObj(Punkt=Punkt()); // Konstruktor (Parameter ist Referenz-Punkt) const char* m_pctname; // tatsächlicher Klassenname private : FGraphObj(const FGraphObj&); // Kopieren von FGraphObj-Objekten FGraphObj& operator=(const FGraphObj&); // soll nicht möglich sein Punkt m_dref; // Referenz-Punkt für Position eines Objekts // Ergänzung gemäss Aufgabe 2c) : // ---------------------------------------------------------------- #endif