Objektorientierte Programmierung mit C++ (WS 2010)

Ähnliche Dokumente
Interaktive Simulationen Lektion 1/3: Event-Driven Design und Signals

Einführung in die Programmierung

Interaktive Simulationen Lektion 3/3: Grafische Ausgabe

GUI Programmierung mit Qt

Was ist QT? Beispiele: KDE Google Earth Mathematika

Praxisorientierte Einführung in C++ Lektion: Einführung in das GUI-Toolkit Qt

Einführung in die Programmierung Wintersemester 2011/12

Einführung in die Programmierung mit Qt

Praktikum IKT 3. Semester

GUI Programmierung mit GTK

Grundlagen der Informatik Entwicklung von Anwendungen mit dem Qt-Framework

5. Programmierung von Benutzerschnittstellen

Der Goopax Compiler GPU-Programmierung in C++ ZKI AK-Supercomputing, Münster, , Ingo Josopait

Nun haben wir alle Programmierwerkzeuge zusammen und können das Gelernte in einer Synthese-Übung vereinigen.

C++, STL und Qt. C++, STL und Qt. Dipl.Ing. Christoph Stockmayer, Schwaig,

Praxisorientierte Einführung in C++ Lektion: "Einführung in das GUI-Toolkit Qt"

Einführung in Qt. Im Rahmen der Vorlesung Objektorientierte Softwareentwicklung mit C++ (WS 2002/2003)

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

Qt Programmierung Teil 1 Fenster erstellen by NBBN ( CrashKurs-Artig. Was brauche ich? -Einige C++ Kenntnisse

Auswahlen (Selektionen)

Einstieg in die Informatik mit Java

Übersicht GUI PyQT TU Dresden, Sommerkurs Python GUI Folie 1 von XYZ

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

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

Einführung in die Programmierung Wintersemester 2010/11

Bildverarbeitung mit C++

Bildverarbeitung mit C++

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

MVC Ein wichtiges Konzept der Software-Architektur

Java - Webapplikationen

1. Vom Sourcecode zum Programm

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 7. Grafische Benutzeroberflächen 1

0. Einführung & Motivation

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++ Buildsysteme

1. Übung zu "Numerik partieller Differentialgleichungen"

Einstieg in die Informatik mit Java

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Workshop: Entwickeln mit Qt 4. Daniel Molkentin

Einführung in die Informatik

Klausurvorbereitung Lösung

Das Model/View/Controller Paradigma

Qt ist ein plattformübergreifendes Entwicklungs-Framework, geschrieben in C++ Framework für C++, Bindings für andere Programmiersprachen

Einführung in die Programmierung (EPR)

Programmentwicklung mit C++ (unter Unix/Linux)

Überblick. 5. Objekt und Klasse, Elementfunktionen

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

Der C++ Crashkurs v1.0

Klausur Grundlagen der Programmierung

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

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

Programmierkurs C++ Abstrakte Klassen und Methoden

d:\c++\semesterarbeit\lottosix\lottosix.cpp /* ======================================================================== Dateiname: lottosix.

Workshop: Entwickeln mit Qt 4. Daniel Molkentin

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Probeklausur: Programmierung WS04/05

Übungspaket 23 Mehrdimensionale Arrays

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

Kapitel 6. Vererbung

Algorithmen zur Datenanalyse in C++

Design Patterns MVC. Marcus Köhler Markus Merath Axel Reusch. Design Patterns MVC Marcus Köhler Markus Merath Axel Reusch Seite 1

Tutoraufgabe 1 (Überladen von Methoden):

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

Algorithmen und Datenstrukturen

Kapitel 6. Vererbung

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

2. Semester, 2. Prüfung, Lösung

Einstieg in die Informatik mit Java

Sommersemester Implementierung III: GUI und Verhalten (Teil 2)

Grundlagen der Programmierung WS 15/16 (Vorlesung von Prof. Bothe)

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

Kurze Einführung in die Programmiersprache C++ und in Root

1 Abstrakte Klassen, finale Klassen und Interfaces

Erste Schritte der Programmierung in C

Repetitorium Informatik (Java)

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Design Patterns 2. Model-View-Controller in der Praxis

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

Informatik II Übung, Woche 17

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

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

Objektorientierte Programmierung

Objektorientierung Grundlagen

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

Kapitel 6. Vererbung

Vorkurs C++ Programmierung

WEBAPPLIKATIONEN MIT PHP. Wo gibt es Hilfe? Wie fang ich an?

Übungspaket 23 Mehrdimensionale Arrays

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

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

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Praktikum Ingenieurinformatik. Termin 4. Funktionen, numerische Integration

Created by Angelo Maron

Ein- und Ausgabe mit Dateien

Graphische Benutzungsoberflächen

FAKULTÄT FÜR INFORMATIK

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

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck

Klausur Informatik I WS 2006/2007

Delegatesund Ereignisse

Transkript:

Objektorientierte Programmierung mit C++ (WS 2010) Dr. Andreas F. Borchert, Tobias Brosch Institut für Angewandte Informationsverarbeitung Universität Ulm Blatt 11: Abgabetermin 19. Januar 2011 11 Uhr Mandelbrotmenge Interaktiv (Teil 1) Ziel dieses und der nächsten Übungsblätter ist es, die Mandelbrotmenge interaktiv darzustellen. Dabei werden wir unsere bereits kennengelernten Techniken vertiefen und nochmals üben. Model-View-Controller-Pattern View 1..* Controller 1 1 Model Ein häufig verwendetes Design-Pattern, insbesondere im Zusammenhang mit GUIs (Graphical User Interfaces), ist das MVC-Pattern. Es strukturiert den Code in drei Komponenten: 1. Model: Repräsentiert die Daten. 2. View: Visualisiert das Modell. 3. Controller: Stellt Methoden zur Manipulation des Modells bereit. Multiarray Im Übungsblatt zur Mandelbrotmenge, hatten wir ein Verfahren gesehen, welches uns zu jedem Bildpunkt einen Wert zwischen 0 und 1 bestimmt. Das Ergebnis dieser Berechnung, wollen wir zunächst in einem zweidimensionalen Array abspeichern, welches Teil unseres Modells sein wird. Hierzu verwenden wir die multi_array-klasse aus der boost-bibliothek. Für die Zwecke dieses Beispiels, werden folgende Methoden ausreichend sein: #include <boost / multi_array. hpp> int main ( ) { Institut für Angewandte Informationsverarbeitung 1

// i n i t i a l i z e 2 dimensional matrix o f type double // and s i z e 300 times 200 boost : : multi_array<double, 2> mat( boost : : e x t e n t s [ 3 0 0 ] [ 2 0 0 ] ) ; // can be r e s i z e d mat. r e s i z e ( boost : : e x t e n t s [ 1 0 0 ] [ 5 0 ] ) ; const std : : s i z e _ t dims = mat. shape ( ) ; int width = dims [ 0 ] ; int h e i g h t = dims [ 1 ] ; // a c c e s s and a s s i g n elements for ( int i = 0 ; i < width ; ++i ) for ( int j = 0 ; j < height ; ++j ) mat [ i ] [ j ] = 0 ; Model Unser Model wird durch die Klasse MBSet dargestellt. Dabei kapseln wir die Parameter dieser Klasse in ihrer inneren Klasse MBSetParams. QObject MBSet - _params: MBSetParams - _mat: boost::multi_array<double, 2> + MBSet(width = 400: int, height = 200: int, parent: QObject*) + updatemodel() signals: viewchanged(mat: const boost::multi_array<double, 2>*) MBSet::MBSetParams - _width: int - _height: int - _center_x = 0: double - _center_y = 0: double - _scale = 1./100: double - _maxiter: int + MBSetParams(width: int, height: int) + scr2world(x: double&, y: double&) + get_num_iter(x_pos: double, y_pos: double) + getwidth(): int + getheight(): int + getcenterx(): double + getcentery(): double + getscale(): double + int getmaxiter() Dabei implementiert MBSet::MBSetParams::get_num_iter die bekannte Mandelbrotiteration double MBSet : : get_num_iter ( double x_pos, double y_pos ) const { double x = 0 ; double y = 0 ; int maxiter = params. getmaxiter ( ) ; for ( int i = 0 ; i < maxiter ; ++i ) { Institut für Angewandte Informationsverarbeitung 2

double x_tmp = x x y y + x_pos ; y = 2 x y + y_pos ; x = x_tmp ; i f ( x x + y y > 32) { return std : : pow ( ( double ) i / maxiter, 0. 2 ) ; return 0 ; und MBSet::MBSetParams::scr2World rechnet Bildschirm- bzw. Array-Koordinaten in Zahlen der komplexen Ebene um. Dabei dienen die Parameter x und y sowohl als Ein- als auch als Ausgabeparameter. Beim Aufruf beinhalten die Variablen die Arraykoordinaten, nach Beendigung, die Koordinaten in der Welt der komplexen Ebene: void MBSet : : MBSetParams : : scr2world ( double &x, double &y ) const { x = ( x _width / 2) _scale + _center_x ; y = ( _height / 2 y ) _scale + _center_y ; Die Methode updatemodel verwendet diese beiden Methoden, um unser Array _mat mit den entsprechenden Werten unserer Mandelbrotiteration zu füllen. Die Methode viewchanged(...), definiert ein Qt-Signal. Diese muss nicht implementiert werden und wird analog zu private oder public-methoden mit dem Schlüsselwort signals gekennzeichnet. Damit der Meta-Object-Kompiler von Qt entsprechenden Code für den Signal- Slot-Mechanismus generiert, muss zusätzlich das Makro Q_OBJECT in die Klassendefinition mit aufgenommen werden: class MBSet : public QObject { Q_OBJECT class MBSetParams {... ; MBSet( int width = 400, int height = 200, QObject parent = 0 ) ; void updatemodel ( ) ; s i g n a l s : void viewchanged ( const boost : : multi_array<double, 2> mat ) ; private :... ; Am Ende der Methode updatemodel schickt Ihr das Signal mit emit viewchanged(&_mat); an alle verbundenen Slots. Institut für Angewandte Informationsverarbeitung 3

Aufgabe: Implementiert die Klasse MBSet und ihre innere Klasse MBSetParams wie im UML-Diagramm angegeben in den Dateien MBSet.h und MBSet.cpp. View QWidget MBViewer + MBViewer(parent = 0: QWidget*) public slots: + updateview(mat: const boost::multi_array<double, 2>*) Um den Signal-Slot-Mechanismus zu ermöglichen, muss hier ebenfalls das Makro Q_OBJECT mit in die Klassendefinition mit aufgenommen werden: #include <boost / multi_array. hpp> c l a s s MBViewer : public QLabel { Q_OBJECT MBViewer(QWidget parent = 0 ) ; public s l o t s : void updateview ( const boost : : multi_array<double, 2> mat ) ; ; Die Methode updateview, wird hierbei als public slot gekennzeichnet (kann aber wie jede public Methode auch normal aufgerufen werden). Der Hintergrund der Klasse MBViewer ist, dass ein Label in der Lage ist, eine QPixmap darzustellen. Da für den direkten Pixelzugriff die Klasse QImage jedoch besser geeignet ist, erstellen wir zunächst ein QImage, weisen die Pixelwerte zu, und setzen die Pixmap unserer von QLabel abgeleiteten Klasse auf eine Pixmap von unserem QImage: // main part o f updateview ( ) : QImage image ( width, height, QImage : : Format_RGB32 ) ; // t r a n s l a t e double v a l u e s to c o l o r s for ( int i = 0 ; i < width ; ++i ) { for ( int j = 0 ; j < h e i g h t ; ++j ) { image. s e t P i x e l ( i, j, qrgb( 0, ( mat ) [ i ] [ j ] 255, 0 ) ) ; setpixmap (QPixmap : : fromimage ( image ) ) ; a d j u s t S i z e ( ) ; // makes sure, t h a t out QLabel f i t s to i t s c o n t e n t s Institut für Angewandte Informationsverarbeitung 4

Aufgabe: Implementiert die Klasse MBViewer wie im UML-Diagramm angegeben in den Dateien MBViewer.h und MBViewer.cpp. Controller Die Interaktion mit Unserem Modell, werden wir im nächsten Blatt betrachten. Jetzt wollen wir ersteinmal etwas auf unserem Bildschirm sehen. Main Nach so viel Text, bekommt Ihr zur Belohnung unser Hauptprogramm mit dazu. Wie Ihr seht, ist das Verdrahten unserer Komponenten nun sehr einfach: // main. cpp : #include " MBViewer. h " // View #include "MBSet. h " // Model int main ( int argc, char argv [ ] ) { QApplication a ( argc, argv ) ; MBViewer mbviewer ; MBSet mbset (400, 2 0 0 ) ; // make view update on model change QObject : : connect ( &mbset, SIGNAL( viewchanged ( const boost : : multi_array<double, 2 > )), &mbviewer, SLOT( updateview ( const boost : : multi_array<double, 2 > ))); // g e n e r a t e i n i t i a l content, which w i l l emit the s i g n a l // viewchanged, so t h a t our S l o t updateview i s c a l l e d mbset. updatemodel ( ) ; mbviewer. show ( ) ; return a. exec ( ) ; Submission Einreichen der Lösung mit: submit cpp 11 main. cpp MBSet. h MBSet. cpp MBViewer. h MBViewer. cpp Viel Spaß! Institut für Angewandte Informationsverarbeitung 5