Klausur im WS 2006/07 : Programmierkonzepte Lösungen Informatik III Lösungen. Medieninformatik Praktische Informatik Technische Informatik

Ähnliche Dokumente
Klausur im WS 2007/08 : Programmierkonzepte Informatik III. Medieninformatik Praktische Informatik Technische Informatik

Klausur im WS 2003/04 : Informatik III

Name: Klausur Programmierkonzepte WS 2010/11

Name: Klausur Programmierkonzepte SS 2011

Name: Klausur Programmierkonzepte WS 2010/11

Ersatzklausur im WS 2005/06 : Informatik III Lösungen

Name: Klausur Programmierkonzepte SS 2011

Name: Klausur Programmierparadigmen von C++, WS 2018/19

Name: Klausur Informatik III WS 2003/04

C++ - Objektorientierte Programmierung Polymorphie

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

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

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

Name: Klausur Programmierparadigmen von C++, WS 2018/19

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Universität zu Lübeck Institut für Telematik. Prof. Dr. Stefan Fischer

Prüfung Softwareentwicklung II (IB)

Grundkurs C++ IDE Klassenhierarchien

Grundkurs C++ IDE Klassenhierarchien

Probeklausur: Programmierung WS04/05

Languages and Tools for Object-Oriented Development Klausur Wintersemester 2007/2008

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

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

Einführung in die Programmierung und Programmiersprachen (OOP)

Klausur Programmiertechnik (Probeklausur 1)

Grundkurs C++ IDE Klassenhierarchien

hue13 January 30, 2017

Klausur Informatik WS 2012/13

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

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

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

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

Dies ist eine Probeklausur, die keine formalen Schlüsse auf die Form, die Struktur oder den Inhalt der endgültigen Klausur zulässt.

Programmierung Nachklausurtutorium

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

Übung Notendarstellung

Konstruktor/Destruktor

Klausur "C#" WS 2012/2013

Implementieren von Klassen

Schriftlicher Test (120 Minuten) VU Einführung ins Programmieren für TM. 23. Januar 2017

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

Grundlagen der Informatik

Objektorientierung Grundlagen

Kapitel 13. Definition von Klassen. OOP Thomas Klinker 1

Vorkurs Informatik WiSe 15/16

Klausur "C#" WS 2013/2014

Programmierkurs Java

Informatik 2 für Regenerative Energien

C++ - Objektorientierte Programmierung Konstante und statische Elemente

7.2 Dynamischer Speicher in Objekten/Kopierkonstruktor

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6.

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

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

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14

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

Klausur Grundlagen der Programmierung

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

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

10.4 Konstante Objekte

Ziele sind das Arbeiten mit Funktionen (Modularisierung, Parameterübergabe), sowie - Reihentyp (Array)

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Inoffizielle Lösung zur Informatik I Prüfung Frühlingssemester 2010 Freitag, 13. August May 23, 2011

Vererbung und Polymorphie

Funktionen: Rückgabewert

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Übung Programmierung WS 2007/08 - Blatt 6

Klausur: Grundlagen der Informatik I, am 27. März 2009 Gruppe: F Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Wiederholungsklausur "C#" SS 2013

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Nachholklausur zur Vorlesung: Einführung in die objektorientierte Programmierung mit Java WS1415

Programmieren in Java -Eingangstest-

Algorithmen und Datenstrukturen Sommersemester Übung Abgabe bis , 10:00 Uhr

Informatik - Übungsstunde

Algorithmen implementieren. Implementieren von Algorithmen

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Repetitorium Informatik (Java)

Test-Driven Design: Ein einfaches Beispiel

Klausur zur Lehrveranstaltung. Technische Informatik für Ingenieure WS 2009/10

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015. Musterlösung

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2018/19. Vorbereitende Aufgaben

Wiederholungsklausur "ADP" WS 2016/2017

HSR Rapperswil 2001 Markus Rigling. Programmieren: Templates Auflage

Objektorientierung. Marc Satkowski 20. November C# Kurs

Einstieg in die Informatik mit Java

SimpleStat mit Methoden

12 Abstrakte Klassen, finale Klassen und Interfaces

Wissenschaftliches Rechnen

Programmierkurs C/C++

Klausur "ADP" SS 2016

Allgemeine Hinweise:

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

Klausur Software-Entwicklung März 01

Sichtbarkeiten, Klassenmember und -methoden

HSR Rapperswil 2001 Markus Rigling. Programmieren: Smart Pointer Auflage

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Die verschiedenen Programmierparadigmen von C++ Software-Technik: Vom Programmierer zur erfolgreichen

6. Globalübung (zu Übungsblatt 8)

Transkript:

Dr.-Ing. Hartmut Helmke Fachhochschule Braunschweig/Wolfenbüttel Fachbereich Informatik Matrikelnummer: Punktzahl: Ergebnis: Freiversuch F1 F2 F3 Klausur im WS 2006/07 : Programmierkonzepte Lösungen Informatik III Lösungen Medieninformatik Praktische Informatik Technische Informatik Informatik B. Sc. Technische Informatik B. Sc. Hilfsmittel sind bis auf Computer, Handy etc. erlaubt! Bitte nblätter mit abgeben! Austausch von Hilfsmitteln mit Kommilitonen ist nicht erlaubt! Die Lösungen können in einigen Fällen hier auf dem nblatt angegeben werden. Sie dürfen aber auch Ihre Lösungen, falls erforderlich, auf separaten Blättern notieren. Bitte notieren Sie auf allen nblättern und separaten Blättern Ihren Namen bzw. Ihre Matrikelnummer. Auf eine absolut korrekte Anzahl der Blanks und Zeilenumbrüche braucht bei der Ausgabe nicht geachtet zu werden. Dafür werden keine Punkte abgezogen. Hinweis: In den folgenden Programmen wird manchmal die globale Variable datei verwendet. Hierfür kann der Einfachheit halber die Variable cout angenommen werden. Die Variable datei diente lediglich bei der Klausurerstellung dem Zweck der Ausgabeumlenkung. Geplante Punktevergabe Punktziel Hausaufgaben: 10 P. Im einzelnen Pkte A1: 12P. (3+2+2+3+2) A2: 30P. (2+8+1+4+2+2+2+5+4) A3: 15P. (1+3+2+2+1+1+1+4) A4: 15P. (2+2+2+3+1+5) A5: 28P. (9+5+5+9) Summe 100 P. 1 Lösungen V.1

1 : Klassen ca. 12 Punkte Gegeben ist die folgende Deklaration der Klasse Fliese. // quadratische Fliese class Fliese { double getbreite() const; void setbreite (double b); Fliese (double b) : breite(b) {datei << "+F" << b << " "; ~ Fliese () {datei << "-F" << breite << " "; // Kopierkonstruktor // Zuweisungsoperator; a.) Implementieren Sie zunächst die beiden Methoden getbreite und setbreite. void Fliese :: setbreite (double b) { breite = b; double Fliese:: getbreite() const { return breite ; b.) Was bedeutet das Schlüsselwort const bei der Methode getbreite? Warum fehlt es bei der Methode setbreite? getbreite verändert keine Attribute des Objektes, setbreite dagegen schon. c.) Geben Sie einen Include-Wächter für die Header- Datei an. # ifndef FlieseTapete # define FlieseTapete... #endif d.) Implementieren (cpp-datei) Sie nun den Kopierkonstruktor und Zuweisungsoperator der Klasse Fliese. Fliese :: Fliese (const Fliese & t2) { breite = t2. breite ; const Fliese & Fliese ::operator=(const Fliese& t2) { breite = t2. breite ; return *this; e.) Warum würde das folgende Codefragment beim Übersetzen einen Syntaxfehler ergeben? Fliese fliesarray [22]; Es fehlt der Default-Konstruktor bei der Klasse. 2 : Klassen, 2. Teil ca. 30 Punkte Wir betrachten nochmals die Header-Datei der Klasse Fliese mit dem gleichen Inhalt wie zuvor. // quadratische Fliese class Fliese { double getbreite() const; void setbreite (double b); Fliese (double b) : breite(b) {datei << "+F" << b << " "; ~ Fliese () {datei << "-F" << breite << " "; // Kopierkonstruktor // Zuweisungsoperator; Im Folgenden dürfen Sie Ihre Ausgaben direkt unter den Funktionen oder auf einem Extra-Blatt notieren. a.) Welche Ausgabe erzeugt der Aufruf von der Funktion funk1 in die Datei? void funk1() { Fliese f1(3); Fliese f2(4); funk1: +F3 +F4 -F4 -F3 b.) Veranschaulichen Sie die Speicherbelegung im Stack- und im Heap-Programmspeicher zu den Zeitpunkten /* 1 */, /* 2 */ und /* 3 */ im folgenden Programmfragment grafisch. void funk2() { Fliese f1(3); Fliese * pf2 = new Fliese(4); Fliese * pf3 = &f1; / 1 / *pf3 = 44.2; pf3 = new Fliese(11); / 2 / pf2 = pf3; delete pf2; / 3 / c.) Beschreiben Sie, was in der Programmzeile *pf3 = 44.2; geschieht, d.h. warum kann man eine double- Konstante einer Fliese zuweisen (1 Zeile Text reicht)? Die Klasse hat einen Umwandlungskonstruktor, der V.1 2 Lösungen

eine double-konstante in eine Instanz der Klasse umwandelt. Hierbei wird der Konstruktor auch ausgeführt! d.) Welche Ausgabe erzeugt der Aufruf von der obigen Funktion funk2 in die Datei? funk2: +F3 +F4 +F44.2 -F44.2 +F11 -F11 -F44.2 i.) Welche Ausgabe erzeugt der Aufruf von der obigen Funktion funk5 in die Datei? funk5: +F3 +Kgrau +F4 +Krot -Krot -F4 -Kgrau -F3 -Kgrau -F3 e.) Implementieren Sie die Funktion verdoppeln, die die Breite der quadratischen Fliese verdoppelt, d.h. der Aufruf der folgenden Funktion funk3 soll die Ausgabe 6 auf dem Bildschirm ausgeben. void funk3() { Fliese f1(3); verdoppeln(f1); cout << f1. getbreite() << endl; void verdoppeln( Fliese & f) { f. setbreite (f. getbreite () * 2); Gegeben ist ferner die Unterklasse Kachel. class Kachel: public Fliese { string farbe; Kachel(double b, string f): Fliese (b), farbe(f) {datei << "+K" << f << " "; ~Kachel() {datei << "-K" << farbe << " "; f.) Zeichnen Sie das UML-Klassendiagramm ohne Methoden und Attribute der beiden Klassen. g.) Welche Ausgabe erzeugt der Aufruf von der Funktion funk4 in die Datei? void funk4() { Kachel f1(3, "grau"); funk4: +F3 +Kgrau -Kgrau -F3 h.) Veranschaulichen Sie die Speicherbelegung im Stack- und im Heap-Programmspeicher zum Zeitpunkt /* 1 */ im folgenden Programmfragment grafisch. void funk5() { Kachel f1(3, "grau"); Kachel* pk2 = new Kachel(4, "rot"); Kachel* pk3 = new Kachel(f1); / 1 / datei << "\n "; delete pk2; delete pk3; ca. 15 Punkte 3 : Textfragen, Team a.) Warum beginnen viele eine Iteration an einem Dienstag und nicht an einem Montag? Montag ist ein Scheißtag. Planung ist eine Scheißarbeit. Warum soll auch noch beides zusammengelegt werden? Man schließt nicht hektisch kurz vor dem Wochenende noch schnell eine Iteration ab. b.) Das Team hatte sich in der letzten Iteration (Dauer 33 Arbeitstage) n im Umfang von 31 idealen Tagen vorgenommen. Erledigt wurden allerdings nur n im Umfang von 30 idealen Tagen. Zusätzlich wurden ungeplante n im Umfang von 3 idealen Tagen erledigt. Berechnen Sie den Load Factor (Hinweis 1 11 = ca. 0, 09)? (Rechenweg angeben) Die neue Iteration dauert 50 Arbeitstage. Wie viel n (Angabe in idealen Tagen) sollte sich das Team vornehmen, wenn der Load Factor der Iteration als Entscheidungsgrundlage verwendet wird? (Rechenweg angeben) Load Factor : 30 33 = 91%, damit kann man sich in der neuen Iteration n im Umfang von ca. (50 10 11 =) 45 Tagen vornehmen. c.) Welche Besonderheit gibt es beim sog. Wasserfallmodell gegenüber zum Beispiel einem iterativen Vorgehensmodell zur Softwareentwicklung (ein Satz)? Die einzelnen Phasen folgenden aufeinander und sie werden nur einmal nicht mehrfach durchlaufen. In Vorgängerphase müssen alle Entscheidungen, die die Nachfolgerphase benötigt, korrekt getroffen worden sein. d.) Welche andere Basistechnik von extreme Programming ermöglicht es, dass man auf ein Design des gesamten Systems zu Beginn der Software- Entwicklung weitgehend verzichten kann? Begründen Sie kurz Ihre Entscheidung. Durch Refactoring ist auch noch möglich, dass Design im Nachhinein geänderten Anforderungen anzupassen. e.) Erklären Sie kurz und knapp: Was ist Refactoring? Verbesserung des Designs, nachdem der Code 3 Lösungen V.1

geschrieben wurde, ohne dessen Verhalten zu ändern. f.) Sie entwickeln in einem Team eine Software. Paul erstellt die Klasse A, Paula die Klasse B,... und Alfons die Klasse Z. Sie haben alle Änderungen und Erweiterungen an diesen Klassen auf ihren lokalen Arbeitsplätzen durchgeführt. Mit welchem Tool / welchen Tools können Sie sicherstellen, dass jederzeit auf allen lokalen Rechnern/Arbeitsplätzen die gleiche aktuelle Version vorhanden ist? Ein Versionsverwaltungssystem, z.b. CVS oder subversion g.) Was ist die Basis-Voraussetzung, damit ein Refactoring erfolgreich durchgeführt werden kann? ausreichend Tests vorhanden h.) Welche Vorteile ergeben sich, wenn man die Tests noch vor Beginn der Implementierung der eigentlichen Funktionalität spezifiziert? Sie tragen zum Verständnis der zu implementierenden Funktionalität bei. Man verfügt sofort über Anwendungsfälle und hat auch sofort Tests, mit denen man anschließend die Korrektheit der Implementierung überprüfen kann. ca. 15 Punkte 4 : Textfragen, C++, Polymorphie a.) Geben Sie ein Beispiel für eine Klasse mit einer konstanten Methode an (Klasse, ein Attribut, die Methode mit Implementierung). class X { int x; int getx() const {return x; b.) int i = 44, j = 48; const int* pc = &i; Welche der folgenden Code-Zeilen ist syntaktisch falsch? *pc = 64; / 1 / pc = &j; / 2 / pc = 41; / 3 / Dort wo pc hinzeigt, darf der Inhalt über pc nicht verändert werden. Damit ist Zeile 1 falsch. Zeile 3 ist auch falsch, weil pc ein Zeiger ist und 41 ein int. c.) Beschreiben Sie kurz den Unterschied zwischen öffentlichen und privaten C++-Methoden? Öffentliche Methoden gehören zur Schnittstelle der Klasse. Hierauf kann von überall zugegriffen werden. Privaten Methoden können nur von innerhalb der Klasse (eigene Methoden) und von Freunden aufgerufen werden. d.) Geben Sie ein Beispiel für die Deklaration (Definition nicht erforderlich) einer Klasse mit einer minimalen Standard-Schnittstelle. class X { X(); ~X(); X(const X&); const X& operator=(const X&); e.) Geben Sie ein Beispiel für eine ganz kurze abstrakte C++-Klasse an. class X { virtual ~X() = 0 {; class A{ virtual void eins() {datei << "\neins in A"; void zwei() {datei << ", zwei in A"; class B: public A{ virtual void eins() {datei << "\neins in B"; void zwei() {datei << ", zwei in B"; f.) Welche Ausgabe erzeugt die Ausführung des folgenden Programmfragments? void poly(){ B b; b.eins(); b.zwei(); A a; a.eins(); a.zwei(); A* pa = new B; pa->eins(); pa->zwei(); A a2 = *pa; a2.eins(); a2.zwei(); A* pa2 = &a2; pa2->eins(); pa2->zwei(); eins in B, zwei in B eins in A, zwei in A eins in B, zwei in A eins in A, zwei in A eins in A, zwei in A V.1 4 Lösungen

5 : Test und Doku first ca. 28 Punkte Notieren Sie Ihre Lösung bitte auf einem Extrablatt. Sie wollen eine Software-Lösung für eine Fliesenlegerfirma erstellen, damit Sie besser kalkulieren können, wie viele Fliesen in etwa (nicht ganz genau) für das Fliesen eines gegebenen Raumes erforderlich sind. Der Raum ist jeweils durch seine Länge und Breite gegeben. Außerdem ist die Länge der quadratischen Fliesen gegeben, siehe auch nebenstehenden Code zur Veranschaulichung. Gehen Sie nun bei der Entwicklung der Software-Lösung in den folgenden Schritten vor. Achtung: Für eine andere Reihenfolge gibt es wahrscheinlich k e i n e Punkte!!! a.) und b.) dürfen Sie allerdings in beliebiger Reihenfolge durchführen. Tipp: Zeichnung anfertigen, könnte zur Klärung beitragen. a.) Definieren Sie drei wirklich verschiedene Tests für die nstellung, d.h. für den Test der Funktion berechnefliesenanzahl (Es geht hier um die Beschreibung/Auflistung von konkreten Ein- und Ausgaben der Tests noch nicht um deren Implementierung in C++). 1. Test: Fliese 1m 2, Raum 2m lang, 3m breit > 6 Fliesen 2. Test: Fliese 1m 2, Raum 2,2m lang, 3m breit > 9 Fliesen 2. Test: Fliese 1m 2, Raum 2,2m lang, 3,2m breit > 12 Fliesen b.) Falls Sie bestimmte Annahmen getroffen haben, machen Sie diese explizit. (Die nstellung war bestimmt noch nicht ganz eindeutig.) Als Software-Entwickler müssen Sie Entscheidungen fällen, die Sie schriftlich festhalten sollen, damit Sie diese mit dem Kunden ggf. diskutieren können. - Die Fugenbreite und Platz für Fussleiten wird ignoriert - Rest in der Länge und Breite werden weggeworfen - Es werden nur ganze Fliesenanzahlen ermittelt, d.h. es wird immer aufgerundet. - Es wird der gesamte Raum gefliest, der auch als rechteckig angenommen wird. c.) Implementieren Sie einen der zuvor definierten Tests Test1, Test2 und Test3 in C++. Anmerkung: Auf die Implementierung der Datei Test.h dürfen Sie verzichten. Verwenden Sie zur Testerstellung die Schnittstellen der Klassen Fliese und Raum. Legen Sie auch die Schnittstelle der zu testenden Funktion berechnefliesenanzahl fest, d.h. die Deklaration Funktion. // quadratische Fliese class Fliese { double getbreite() const; void setbreite (double b); Fliese (double b) : breite(b) {datei << "+F" << b << " "; ~ Fliese () {datei << "-F" << breite << " "; // Kopierkonstruktor // Zuweisungsoperator; class Raum { double laenge; // in m Raum(double la, double b) : laenge(la), breite(b) {datei << "+R" << la << " "; ~Raum() {datei << "-R" << laenge << " "; /... / int berechnefliesenanzahl (const Fliese & fli, const Raum& ra); / 1. Test : Fliese 1 qm, Raum 2m lang, 3m breit > 6 Fliesen / bool test1() { Fliese fli (1.0); Raum ra(2, 3); if (berechnefliesenanzahl( fli, ra) == 6) { return true; else { return false ; d.) Beschreiben Sie mit Worten, was die Funktion berechnefliesenanzahl leistet, d.h., was die Eingangs- und Ausgangsvariablen sind und wie die Funktion aus den Eingangsparametern die Ausgangsparameter ermittelt, nicht implementieren. Die Funktion ermittelt wie viele Fliesen zur kompletten Überdeckung des Raums benötigt werden. Der Funktion werden die Maße der quadratischen Fliese übergeben. Außerdem wird die Raumgröße als Breite und Länge übergeben. Die Funktion ermittelt nun zunächst, wie viele Fliesen zur Abdeckung einer kompletten Länge 5 Lösungen V.1

benötigt werden. Ein evtl. Fliesenrest wird weggeworfen. - AnzahlLänge = Aufrunden (Raumlänge durch Fliesengröße) Dann wird ermittelt, wie viele Fliesen zur Abdeckung einer kompletten Breite benötigt werden. Ein evtl. Fliesenrest wird weggeworfen. - AnzahlBreite = Aufrunden (Raumbreite durch Fliesengröße) Die gesuchte Fliesenanzahl ist das Produkt aus beiden. - Anzahl = AnzahlBreite * AnzahlLänge V.1 6 Lösungen