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

Σχετικά έγγραφα
Προγραμματισμός Υπολογιστών με C++

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

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

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

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

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

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

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

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

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

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

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

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

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

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

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

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

Γ7.2 Συμβολοσειρές (Strings) Γ Λυκείου Κατεύθυνσης

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

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

Πίνακες (Arrays) Εισαγωγή στη C++

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

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

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Φροντιςτήριο. Linked-List

Προγραμματισμός Ι (ΗΥ120)

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στον Προγραμματισμό

2 η Διάλεξη C++ Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Ανάπτυξη και Σχεδίαση Λογισμικού

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΡΑΞΕΙΣ ΜΕΤΑΒΛΗΤΕΣ. Ακέραιοι αριθμοί (int) Πράξεις μεταξύ ακεραίων αριθμών

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

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

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

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

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

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

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

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι περιλαμβάνει μια μεταβλητή; ΔΕΙΚΤΕΣ. Διεύθυνση μεταβλητής. Δείκτης

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

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

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

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

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Γ7.1 Επανάληψη ύλης Β Λυκείου. Γ Λυκείου Κατεύθυνσης

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

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

Εισαγωγή στην πληροφορική

είκτες και Πίνακες (2)

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

Διαδικασιακός Προγραμματισμός

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

Δισδιάστατοι Πίνακες (2D Arrays) Εισαγωγή στη C++

Εισαγωγή στην πληροφορική

ΗΥ-150. Προγραμματισμός

ΗΥ-150. Προγραμματισμός

Εισαγωγή στην πληροφορική

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Τύποι δεδομένων, μεταβλητές, πράξεις. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Standard Template Library (STL)

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

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου. Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης)

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

Δομές Επανάληψης. Εισαγωγή στη C++

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

3 η Διάλεξη C++ - Βασικοί τύποι δεδομένων. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

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

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

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

Το πρόγραμμα θα τυπώνει και τους τρεις πίνακες.

Εισαγωγή στην πληροφορική

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

Κλάσεις και αντικείμενα #include <iostream.h<

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Διάλεξη 11η: Δείκτες, μέρος 1

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

Transcript:

Προγραμματισμός Υπολογιστών με C++ ( 2012-13 ) 17η διάλεξη Ίων Ανδρουτσόπουλος http://www.aueb.gr/users/ion/ 1

Τι θα ακούσετε σήμερα Προσθήκη ελέγχου ορίων σε πίνακες χρησιμοποιώντας σχεδιότυπα τάξεων και εξαιρέσεις. Στις βιβλιοθήκες της C++11 υπάρχει παρόμοιο σχεδιότυπο array. Π.χ: array<int,6> a = { 1, 2, 3 ; Εξαιρέσεις κατά τη δυναμική καταχώριση μνήμης. Εισαγωγή στην υλοποίηση διπλά συνδεδεμένης λίστας. 2

Πίνακες με έλεγχο ορίων template <typename Type = int, int size = 2> class Array { Type arr[size]; public: Type& operator[](int i); ; Προεπιλεγμένος τύπος. template <typename Type, int size> Type& Array<Type, size>::operator[](int i) { if(i >= size) { cerr << "Illegal array index: " << i << endl; exit(1); return arr[i]; Θεωρείται σταθερά. Επιτρέπονται μόνο ακέραιοι, δείκτες και αναφορές. Προεπιλεγμένη τιμή: 2. Τερματισμός προγράμματος. int main() { Επιστρέφει 1 στο λειτουργικό. Array<string, 3> a; // Τρεις θέσεις για string. a[0] = "one"; a[1] = "two"; a[2] = "three"; Array<> b; // Δύο θέσεις για int (προεπιλογές). b[0] = 1; b[1] = 2; b[2] = 3; // Λάθος! Τερματίζεται το πρόγραμμα. cout << "test" << endl; // Δεν εκτελείται αυτή η γραμμή. 3

Χρήση εξαίρεσης Ι template <typename Type, int size> Type& Array<Type, size>::operator[](int i) { try { if(i >= size) { throw i; return arr[i]; catch(int j) { // Μπορεί να χειριστεί εξαιρέσεις int. cerr << "Ιllegal index: " << j << endl; exit(1); int main() { Array<string> strarr; // Δύο θέσεις για string. strarr[0] = "one"; strarr[1] = "two"; strarr[2] = "three"; // Τυπώνεται: «Illegal index: 2» cout << "test" << endl; // Δεν εκτελείται. 4

Χρήση εξαίρεσης ΙΙ template <typename Type, int size> Type& Array<Type, size>::operator[](int i) { if(i >= size) { throw i; return arr[i]; int main() { try { Array<string> strarr; // Δύο θέσεις για string. strarr[0] = "one"; strarr[1] = "two"; strarr[2] = "three"; // Προκαλεί throw. cout << "Never printed" << endl; catch(int j) { cerr << "Illegal index:" << j << endl; cout << "Program finished." << endl; Το throw τώρα δεν βρίσκεται μέσα σε try. Ψάχνει να βρει try που να περικλείει την κλήση της μεθόδου μέσα στην οποία βρίσκεται το throw. Η εκτέλεση του προγράμματος συνεχίζεται με τις εντολές της αντίστοιχης catch και κατόπιν με τις εντολές μετά την catch. 5

Χρήση εξαίρεσης ΙΙΙ int main() { try { Array<string> strarr; // Δύο θέσεις για string. strarr[0] = "one"; strarr[1] = "two"; strarr[2] = "three"; // Προκαλεί throw. cout << "Never printed" << endl; catch(string s) { Αν δεν βρεθεί catch ικανό να cerr << "Illegal string:" << s << endl; χειριστεί την εξαίρεση, το catch(int j) { πρόγραμμα cerr << "Illegal index:" << j << endl; τερματίζεται. cout << "Program finished." << endl; Χρησιμοποιείται η catch που ταιριάζει με τον τύπο της εξαίρεσης. Εδώ η catch για string δεν χρησιμοποιείται ποτέ, γιατί το throw της operator[] δημιουργεί εξαίρεση int. 6

Δημιουργία δικών μας τύπων εξαιρέσεων class Exception { // Δεν είναι απαραίτητο να λέγεται «Exception». public: string message; Exception(const string& messagein): message(messagein) { ; class UpperBoundaryException : public Exception { public: unsigned index; UpperBoundaryException(const string& messagein, unsigned indexin): Exception(messageIn), index(indexin) { ; Το όρισμα της throw μπορεί να είναι τιμή ή αντικείμενο οποιουδήποτε τύπου/τάξεως. Συχνά χρησιμοποιούμε αντικείμενα δικών μας τάξεων, που αντιστοιχούν η κάθε μία σε διαφορετική κατηγορία λαθών. 7

Δημιουργία δικών μας τύπων εξαιρέσεων template <typename Type, int size> Type& Array<Type, size>::operator[](int i) { if(i < 0) { throw Exception("Negative index in Array::operator[]."); else if(i >= size) { throw UpperBoundaryException( "Index too large in Array::operator[].", i); return arr[i]; 8

Χειρισμός εξαιρέσεων πολλών τύπων int main() { try { Array<string> strarr; strarr[0] = "one"; strarr[1] = "two"; strarr[2] = "three"; strarr[-1] = "negative"; cout << "Never printed" << endl; catch(upperboundaryexception e) { cerr << e.message << " Index:" << e.index << endl; catch(exception e) { cerr << e.message << endl; cout << "Program finished." << endl; Εδώ εμφανίζεται πρώτα εξαίρεση UpperBoundaryException, που τη χειρίζεται το πρώτο catch. Αν δεν υπήρχε το πρώτο catch, θα την χειριζόταν το δεύτερο, γιατί η UpperBoundaryException είναι υποτάξη της Exception. Αν η σειρά των catch ήταν αντίστροφη, θα χειριζόταν την εξαίρεση το catch(exception e). Αν δεν υπήρχε η εκχώρηση στο strarr[2], θα εμφανιζόταν εξαίρεση Exception στην εκχώρηση στο strarr[-1], που θα τη χειριζόταν το 9 δεύτερο catch.

Δήλωση δυνατών εξαιρέσεων προς τα έξω template <typename Type, int size> Type& Array<Type, size>::operator[](int i) throw(exception, UpperBoundaryException) { if(i < 0) { throw Exception("Negative index in Array::operator[]."); else if(i >= size) { throw UpperBoundaryException( "Index too large in Array::operator[].", i); return arr[i]; Δηλώνουμε ότι οι μόνες εξαιρέσεις που είναι δυνατόν να προκληθούν κατά την εκτέλεση της operator[] και που δεν θα μπορέσει να τις χειριστεί η ίδια η operator[] είναι εξαιρέσεις τύπων Exception και UpperBoundaryException. Στη C++11 μπορούμε να γράψουμε noexcept, για να δηλώσουμε ότι μια 10 συνάρτηση δεν μπορεί να χειριστεί καμία εξαίρεση.

Εξαιρέσεις δυναμικής καταχώρισης μνήμης #include <iostream> #include <new> using namespace std; int main() { unsigned long size; int* ptr; while(true) { cin >> size; try { ptr = new int[size]; cout << "Memory allocated." << endl; delete []ptr; cout << "Memory freed." << endl; catch(bad_alloc e) { cout << "Not enough memory. Try later." << endl; Αν η new δεν καταφέρει να δεσμεύσει την απαιτούμενη χωρητικότητα μνήμης, προκαλεί μια εξαίρεση τύπου bad_alloc. 11 (.< new > (Για να χρησιμοποιήσουμε αυτή τη δυνατότητα, απαιτείται #include

DLList list first last Διπλά συνδεδεμένη λίστα DLList::Node n1 value 10 next prev DLList::Node n2 value 30 next prev 0 DLList::Node n3 value 20 next prev 0 12

Παράδειγμα χρήσης της DLList #include "dllist.h"... int main(int argc, char* argv[]) { DLList list; try { list.putatback(30); list.putatback(40); list.putatfront(20); list.putatfront(10); catch (bad_alloc e) { cerr << argv[0] << ": Could not add some data to the list." << endl; Θα μπορούσαμε να έχουμε και μεθόδους για αφαίρεση στοιχείων από την αρχή ή το τέλος. Επίσης, να δοκιμάσουμε να αντιγράψουμε μια λίστα, να χρησιμοποιήσουμε τον τελεστή εκχώρησης κλπ. Καλές ασκήσεις... 13