Δρ. Γιάννης Χαμόδρακας. Μέλος ΕΔΙΠ του Τμήματος Πληροφορικής και Τηλεπικοινωνιών

Σχετικά έγγραφα
Τεχνολογίες Υλοποίησης Αλγορίθµων

Δομές Δεδομένων Standard Template Library (STL) 23/3/2017 ΜΠΟΜΠΟΤΑΣ ΑΓΟΡΑΚΗΣ

Standard Template Library (STL) C++ library

Boost - Boost Graph Library C++ library

Τεχνολογίες Υλοποίησης Αλγορίθµων

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

Γλώσσα Προγραμματισμού C++ Εισαγωγή - Μια πρώτη ματιά

Δομές Δεδομένων Boost C++ Libraries. 23/3/2017 ΜΠΟΜΠΟΤΑΣ ΑΓΟΡΑΚΗΣ

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειμενοστραφής Προγραμματισμός

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αντισταθμιστική ανάλυση

Οντοκεντρικός Προγραμματισμός

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

Προχωρημένα Θέματα ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ. Γεώργιος Παπαϊωάννου ( )

Αντικειμενοστρεφής Προγραμματισμός

ΠΡΟΤΥΠΑ. ΠΑΡΑ ΕΙΓΜΑ ηµιουργία πρότυπου στοίβας (stack) και στη συνέχεια δηµιουργία µιας στοίβας σηµείων.

Αντικειμενοστραφής Προγραμματισμός

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 6/5/2006

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Standard Template Library (STL)

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 11/3/2006

Συλλογές ΣΥΛΛΟΓΕΣ. Γεώργιος Παπαϊωάννου ( )

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

TMA4115 Matematikk 3

HY150a Φροντιστήριο 3 24/11/2017

a-shapes στη βιολογία

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Δομές Δεδομένων & Αλγόριθμοι

Οντοκεντρικός Προγραμματισμός

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007

Αρχεία & Ρεύματα ΑΡΧΕΙΑ & ΡΕΥΜΑΤΑ. Γεώργιος Παπαϊωάννου ( ) gepap@aueb.gr

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

Instruction Execution Times

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Προγραμματισμός Υπολογιστών με C++

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

Section 8.2 Graphs of Polar Equations

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 133: ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΕΡΓΑΣΤΗΡΙΟ 3 Javadoc Tutorial

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Ερώτημα Α 1. Να γράψετε τις εντολές που πραγματοποιούν τα ακόλουθα:

Αναφορές, είκτες και Αλφαριθμητικά

3.4 SUM AND DIFFERENCE FORMULAS. NOTE: cos(α+β) cos α + cos β cos(α-β) cos α -cos β

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. ΕΡΓΑΣΤΗΡΙΟ C++ ΕΞΑΜΗΝΟ Γ Ακαδηµαϊκό Έτος

Προγραμματισμός Υπολογιστών με C++

Εισαγωγή στην Python C++ Java. Python. Το πρόγραμμα Hello world σε τρείς γλώσσες προγραμματισμού

Απάντηση. // We write in a header file named my_header.h #ifndef my_header_h #define my_header_h #define divides(x,y) (((y)%(x)==0)?

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

Υπερφόρτωση τελεστών

Διαδικασίες ΙI. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 5

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 24/3/2007

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Πληροφορική 2. Γλώσσες Προγραμματισμού

Οντοκεντρικός Προγραμματισμός

ΣΧΕΔΙΟΤΥΠΑ (TEMPLATES)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Assalamu `alaikum wr. wb.

02 Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Συστήματα Διαχείρισης Βάσεων Δεδομένων

Προαπαιτούμενες Ασκήσεις 5 ου Εργαστηρίου. Dose stoixeio (integer) : 25 Found stoixeio in position 7 Dose stoixeio (integer) :94 Value not found

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

17TimeThis.h function returns reference pointer to same object { return *this; }

Αντικειμενοστρεφής Προγραμματισμός

Δυναμική μνήμη με πίνακες και λίστες

(C) 2010 Pearson Education, Inc. All rights reserved.

19. ΠΡΟΤΥΠΑ (TEMPLATES)

Εισαγωγή στην Γλώσσα Προγραμματισμού Python. 12/10/16 1

Ενδεικτικές Λύσεις σε Επιλεγμένα Θέματα της C++

derivation of the Laplacian from rectangular to spherical coordinates

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

Δομημένος Προγραμματισμός (ΤΛ1006)

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Τµήµα Πληροφορικής. Δοµές Δεδοµένων - Εργασία 1. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης. Στοίβες και Ουρές. Οικονοµικό Πανεπιστήµιο Αθηνών

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Στοιχειώδης προγραμματισμός σε C++

Προγραμματισμός Ι. Πίνακες, Δείκτες, Αναφορές και Δυναμική Μνήμη. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Code Breaker. TEACHER s NOTES

Διδάσκων: Παναγιώτης Ανδρέου

Συµβολοσειρές - Strings

Wrapper Classes, Abstract Classes and Interfaces

Transcript:

Δρ. Γιάννης Χαμόδρακας Μέλος ΕΔΙΠ του Τμήματος Πληροφορικής και Τηλεπικοινωνιών e-mail: ihamod@di.uoa.gr

Βιβλιοθήκη αναφοράς για αλγορίθμους Υπολογιστικής Γεωμετρίας στην C++ Real RAM Model Οι πράξεις μεταξύ πραγματικών αριθμών δίνουν ακριβή αποτελέσματα Ο(1) το υπολογιστικό κόστος των βασικών πράξεων Η CGAL αποτελεί προσέγγιση του μοντέλου μέσω του Exact Geometric Computing Paradigm Γενικευμένος αντικειμενοστραφής προγραμματισμός (Traits, Concepts, Models)

Τα σημεία πάνω στην ευθεία x=y, όταν x και y είναι συνήθεις floating point δεν είναι απαραίτητα συνευθειακά(!)

Υπάρχουν υλοποιήσεις που υποστηρίζουν όλους τους πραγματικούς αριθμούς εξαιρούνται οι υπερβατικοί (βιβλιοθήκες CORE και LEDA) Το υπολογιστικό κόστος είναι μεγάλο Η ακρίβεια περιορίζεται μόνο από το μέγεθος της μνήμης

Έλεγχος κατηγορημάτων με απλούς floating point αριθμούς Αν το αποτέλεσμα είναι αβέβαιο: Χρήση multiple precision floating point αριθμών

Templates στην C++, Generics στην Java Στόχος: μοναδική υλοποίηση αλγορίθμων για πολλαπλούς τύπους Template κλάσεων: Πρότυπα για την παραγωγή κλάσεων βάσει παραμέτρων τύπου Template συναρτήσεων: Πρότυπα για την παραγωγή συναρτήσεων βάσει παραμέτρων τύπου Ρητές εξειδικεύσεις προτύπων: όταν η περιγραφή του προτύπου δεν είναι συμβατή με συγκεκριμένο τύπο

//Πρότυπο Στοίβας template <typename T> class Stack { public:... private: int size; int top; T *stackptr; }; template <typename T> Stack<T>::Stack(int s) :size(s), top(-1), stackptr(new T[size]) {} //Ρητή εξειδίκευση για τύπο Point template <> class Stack<Point> {...}; template <> Stack<Point>::Stack(int s) :size(s), top(-1), stackptr(new Point[size]) {}

template <class InputIterator, class T> InputIterator find(inputiterator first, InputIterator last, const T &value); Χρήση κλάσης που παράγεται από template: std::vector<int> v; for(std::vector<int>::iterator it=v.begin();it!=v.end();++it){} Input iterators can move only forward, can move only one step at a time, can only read what they point to, and can read what they re pointing to only once. They re modeled on the read pointer into an inputfile; the C++ library s istream_iterators are representative of this category. Output iterators are analogous, but for output: they move only forward, move only one Step at a time, can only write what they point to, and can write it only once. They re modeled on the write pointer into an output file; ostream_iterators epitomize this category A more powerful iterator category consists of forward iterators. Such iterators can do everything input and output iterators can do, plus they can read or write what they point to more than once. Bidirectional iterators add to forward iterators the ability to move backward as well as forward. Iterators for the STL s list are in this category. The most powerful iterator category is that of random access iterators. These kinds of iterators add to bidirectional iterators the ability to perform iterator arithmetic, i.e., to jump forward or backward an arbitrary distance in constant time. Such arithmetic is analogous to pointer arithmetic, which is not surprising, because random access iterators are modeled on built in pointers, and built in pointers can act as random access iterators. Iterators for vector, deque, and string are random access iterators. (Scott Meyers, Effective C++, 3 rd edition)

Containers: Πρότυπα κλάσεων των οποίων «στιγμιότυπα» αποθηκεύουν συλλογές αντικειμένων συγκεκριμένου τύπου Iterators: Γενίκευση των δεικτών: αντικείμενα που «δείχνουν» σε άλλα αντικείμενα Functors: Κλάσεις για τις οποίες είναι ορισμένος ο τελεστής () και επομένως μπορούν να χρησιμοποιηθούν όπως οι συναρτήσεις μέσω των πεδίων έχουν το πλεονέκτημα να αποθηκεύουν κατάσταση Allocators: Αντικείμενα που αποδίδουν μνήμη Adaptors: Τύποι που μετασχηματίζουν τη διεπαφή άλλων τύπων

#include <iostream> #include <vector> typedef std::vector<double> dvector; typedef std::vector<double>::iterator dveciterator; int main() { //construct a vector dvector p; //insert elements into vector p.pushback(0); p.pushback(10); p.pushback(10); p.pushback(6); p.pushback(4); //iterate through vector's elements and print them for(dveciterator it=p.begin();it!=p.end();++it) std::cout << *it << std::endl; return 0; }

Concept: Σύνολο απαιτήσεων που πρέπει να καλύπτει μία κλάση Model: Κλάση που συμμορφώνεται με ένα Concept Traits: Δομές που παρέχουν πληροφορίες για έναν τύπο κατά το χρόνο μεταγλώττισης /Models που περιγράφουν συμπεριφορά Refinement: επέκταση των απαιτήσεων ενός Concept Generalization: μείωση απαιτήσεων ενός Concept

Template <typename T> void swap(t&a, T&b) {T tmp(a); a=b; b=tmp;} ΟτύποςT πρέπει να διαθέτει: Copy constructor Copy assignment operator O τύπος T είναι Model του Concept CopyConstructible O τύπος T είναι Model του Concept Assignable Π.χ. Οτύποςint είναι model και των 2concepts int a=2, b=4; std::swap(a,b);

Υλοποίηση στη C++ από το 1995 ~10 6 γραμμές κώδικα Χειρίζεται ρητά τις εκφυλισμένες γεωμετρικές περιπτώσεις (π.χ. όταν η διάσταση γεωμετρικών δεδομένων είναι μικρότερη από την αναμενόμενη)

Γεωμετρικοί Αλγόριθμοι και Δομές Δεδομένων (ΚΠ2, ΚΠ3, Τριγωνοποίηση, κλπ) Kernels: Στοιχειώδη Γεωμετρικά Αντικείμενα και Υπολογισμοί Βιβλιοθήκη Υποστήριξης: Number Types, Ρυθμίσεις, Assertions, Οπτικοποίηση, Αρχεία, I/O, κλπ.

Στοιχείωδη γεωμετρικά αντικείμενα (2D, 3D, dd): Point, Vector, Triangle, Circle, κλπ. Στοιχειώδεις γεωμετρικές λειτουργίες (έλεγχος κατηγορημάτων (προσανατολισμού, σύγκρισης, κλπ), κατασκευές (εύρεση τομής, μέσου σημείου, κλπ). point origin vector point point vector point + vector point point + point Illegal Αναπαράσταση συντεταγμένων: cartesian double, exact predicates inexact constructions, exact predicates exact constructions

typedef CGAL::Cartesian<double> Kernel; typedef CGAL::Exact_predicates_exact_constructions_kernel K2; typedef Kernel::Point_2 Point_2; typedef K2::Point_2 Point_2EX; typedef std::vector<point 2> Points; Το κατάλληλο Kernel επιλέγεται ανάλογα με το είδος του προβλήματος. Αν π.χ. γίνεται μόνο έλεγχος κατηγορημάτων καλύτερα να χρησιμοποιείται το: typedef CGAL::Exact_predicates_inexact_constructions_kernel K;

Σε συστήματα Ubuntu: sudo apt get install libcgal dev (απαιτείται ο μεταγλωττιστής g++ και το cmake, examples: sudo apt get install libcgal demo) $CGAL_HOME: /usr/lib/cgal Σε άλλα συστήματα: http://doc.cgal.org/latest/manual/installation.html

cd /path/to/program cgal_create_cmakelists -s <desired_name_of_executable> cmake -DCGAL_DIR=/usr/lib/CGAL. make (Αν έχει εγκατασταθεί με το apt get σε Debian/Ubuntu, διαφορετικά το CGAL_DIR μπορεί να βρίσκεται αλλού)

#include <iostream> #include <CGAL/Simple_cartesian.h> typedef CGAL::Simple_cartesian<double> Kernel; typedef Kernel::Point_2 Point_2; int main() { { Point_2 p(0, 0.3), q(1, 0.6), r(2, 0.9); std::cout << (CGAL::collinear(p,q,r)? "collinear\n" : "not" "collinear\n"); } { Point_2 p(0, 0.4), q(1, 0.8), r(2, 1.2); std::cout << (CGAL::collinear(p,q,r)? "collinear\n" : "not" "collinear\n"); } { Point_2 p(0,0), q(1, 1), r(2, 2); std::cout << (CGAL::collinear(p,q,r)? "collinear\n" : "not" "collinear\n"); } return 0; }

non collinear non collinear Collinear Γιατί; Προτείνετε διορθώσεις.

#include <iostream> #include <CGAL/Exact_predicates_exact_constructions_kernel.h> #include <sstream> typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; typedef Kernel::Point_2 Point_2; int main() { Point_2 p, q, r; { std::istringstream input("0 0.3 1 0.6 2 0.9"); input >> p >> q >> r; std::cout << (CGAL::collinear(p,q,r)? "collinear\n" : "not" " collinear\n"); } { std::istringstream input("0 0.4 1 0.8 2 1.2"); input >> p >> q >> r; std::cout << (CGAL::collinear(p,q,r)? "collinear\n" : "not" " collinear\n"); } { Point_2 p(0,0), q(1, 1), r(2, 2); std::cout << (CGAL::collinear(p,q,r)? "collinear\n" : "not" "collinear\n"); } return 0; }

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/convex_hull_2.h> #include <fstream> typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef K::Point_2 Point_2; typedef std::istream_iterator< Point_2 > point2_iterator; typedef std::vector<point_2> Points; typedef std::vector<point_2>::iterator pveciterator; int main() { Points result; std::ifstream in("data.in"); point2_iterator begin(in); point2_iterator end; } CGAL::convex_hull_2( begin, end, std::back_inserter(result) ); std::cout << result.size() << " points on the convex hull" << std::endl; for (pveciterator iter=result.begin(); iter!=result.end(); ++iter) std::cout << *iter << std::endl; return 0;