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

Σχετικά έγγραφα
Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

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

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

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

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

Streams Input / Output in C++ George Kastrinis

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

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

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

S, (5, -3, 34, -23, 7) ( *, _

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

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

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

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

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

Χωρική Βάση δεδοµένων Autocad

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

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

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

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

Προγραµµατιστικές Τεχνικές

18. ΡΕΥΜΑΤΑ(STREAMS) ΚΑΙ ΑΡΧΕΙΑ (FILES)

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

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

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

Επεξεργασία Αρχείων Κειµένου

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

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

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

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

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

Εισαγωγή στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

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

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

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

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

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

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

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

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

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

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

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

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

Προγραµµατιστικές Τεχνικές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

Λογισµικό (Software SW) Γλώσσες

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

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Κλάσεις και Αντικείµενα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

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

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

Προγραμματιστικές τεχνικές

Προγραµµατιστικές τεχνικές

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

Αρχεία Ένα αρχείο αποτελείται από μία σειρά ομοειδών δεδομένων που ονομάζονται λογικές εγγραφές (logical record)

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κληρονομικότητα

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

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

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

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

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

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Βασικά της γλώσσας JAVA

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

Ενδεικτική περιγραφή μαθήματος

scanf() scanf() stdin scanf() printf() int float double %lf float

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

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

Περιεχόμενα. Λίγα λόγια για αυτή την έκδοση... 23

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

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

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Προγραµµατιστικές Τεχνικές

12. ΑΛΦΑΡΙΘΜΗΤΙΚΑ. υο είδη αλφαριθµητικών Τα αλφαριθµητικά της C πίνακες τύπου char Ta αντικείµενα της κλάσης string

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

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

Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου. ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Συναρτήσεις και Πίνακες

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

343 Ειςαγωγι ςτον Ρρογραμματιςμό

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

5. ΣΥΝΑΡΤΗΣΕΙΣ. (Πρόχειρο σχέδιο - Μαθήµατος 3) p Συναρτήσεις, που δεν επιστρέφουν κάποια τιµή

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

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

Transcript:

1 ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D. Χειµώνας 2006 ιάλεξη 8η Ιστοσελίδα του µαθήµατος 2 http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall06.htm Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος Επικοινωνία: dimitris@skyblue.csd.auth.gr etousido@uth.gr Περιεχόµενα 3 Ρεύµατα Εισόδου/Εξόδου 1

Στόχοι εκµάθησης 4 Ρεύµατα I/O I/Oαρχείων I/Oχαρακτήρων Εργαλεία για I/O ρευµάτων Ονόµατα αρχείων ως είσοδος Μορφοποίηση εξόδου, ρυθµίσεις των flags Ιεραρχίες ρευµάτων Πρώτη γνωριµία µε την κληρονοµικότητα Τυχαία προσπέλαση σε αρχεία Εισαγωγικά 5 Ρεύµατα Ειδικά αντικείµενα ιανέµουν την είσοδο/έξοδο του προγράµµατος I/Oαρχείων Χρησιµοποιεί κληρονοµικότητα (στην επόµενη διάλεξη) I/O αρχείων εξαιρετικά χρήσιµη Ρεύµατα (streams) 6 Ροή χαρακτήρων Ρεύµα εισόδου Ρέει µέσα στο πρόγραµµα Προέρχεται από το πληκτρολόγιο Προέρχεται από αρχείο Ρεύµαεξόδου Ρέει έξω από το πρόγραµµα Πηγαίνει στην οθόνη Πηγαίνει σε αρχείο 2

Χρήση των ρευµάτων 7 Έχουµε ήδηχρησιµοποιήσει ρεύµατα cin Ρεύµα εισόδου συνδεδεµένο στο πληκτρολόγιο cout Ρεύµα εξόδου συνδεδεµένο στην οθόνη Μπορούµεναορίσουµε νέαρεύµατα Προς ή από αρχεία Χρησιµοποιούνται παρόµοια µε ταcin, cout Χρήση ρευµάτων όπως των cin, cout 8 Θεωρήστε το: εδοµένο πρόγραµµαορίζειτορεύµα instream που προέρχεται από κάποιο αρχείο: int thenumber; instream >> thenumber; ιαβάζει τιµή απότορεύµα και την αναθέτει στη µεταβλητή thenumber Το πρόγραµµα ορίζειτορεύµα outstream που πηγαίνει σε κάποιο αρχείο outstream << "thenumber is " << thenumber; Γράφει τιµή στορεύµα, που πηγαίνει σε ένα αρχείο Αρχεία 9 Θα χρησιµοποιήσουµε αρχεία κειµένου (text files) Ανάγνωση από αρχείο Όταν το πρόγραµµα δέχεται είσοδο Εγγραφή σε αρχείο Όταν το πρόγραµµα στέλνει έξοδο Επεξεργασία από την αρχή µέχρι το τέλος του αρχείου Άλλες διαθέσιµες µέθοδοι θα ασχοληθούµε µε την προσπέλαση σε αυτό το απλό αρχείο 3

Σύνδεση σε αρχείο 10 Πρέπει πρώτα να συνδέσουµε τοαντικείµενο ρεύµατος (stream object) σε ένα αρχείο (file) Για είσοδο: File αντικείµενο ifstream Για έξοδο: File αντικείµενο ofstream Οι κλάσεις ifstream και ofstream Ορίζονται στη βιβλιοθήκη <fstream> Στο namespace std Βιβλιοθήκες I/O αρχείων 11 Για να επιτρέψουµε είσοδο και έξοδο από/προς αρχεία στο πρόγραµµά µας: #include <fstream> using namespace std; Ή #include <fstream> using std::ifstream; using std::ofstream; ήλωση ρευµάτων 12 Το ρεύµαπρέπειναδηλωθείόπωςκάθεάλλη µεταβλητή τύπου κλάσης: ifstream instream; ofstream outstream; Κατόπιν, πρέπει να συνδεθεί σε ένα αρχείο: instream.open("infile.txt"); Αποκαλείται άνοιγµα τουαρχείου Χρησιµοποιεί τη συνάρτηση-µέλος open Μπορούµενακαθορίσουµεόνοµα πλήρους διαδροµής (full pathname) 4

Χρήση ρευµάτων 13 Αφού δηλωθεί χρησιµοποιείται κανονικά! int onenumber, anothernumber; instream >> onenumber >> anothernumber; Όµοια για την έξοδο του ρεύµατος: ofstream outstream; outstream.open("outfile.txt"); outstream << "onenumber = " << onenumber << " anothernumber = " << anothernumber; Στέλνει τα items στοαρχείοεξόδου Ονόµατα αρχείων 14 Προγράµµατα και αρχεία Τα αρχεία έχουν δυο ονόµατα στα προγράµµατά µας Εξωτερικό όνοµα αρχείου Αποκαλείται επίσης φυσικό όνοµα αρχείου Όπως το "infile.txt" Μερικές φορές θεωρείται το πραγµατικό όνοµα αρχείου" Χρησιµοποιείται µόνο µια φορά στο πρόγραµµα (για να ανοιχτεί το αρχείο) Όνοµα ρεύµατος Αποκαλείται επίσης λογικό όνοµα αρχείου Το πρόγραµµα χρησιµοποιεί αυτό το όνοµαγιατιςλειτουργίες του Κλείσιµοαρχείων 15 Τα αρχεία πρέπει να κλείνουν When program completed getting input or sending output Disconnects stream from file Στην πράξη: instream.close(); outstream.close(); Σηµειώστε ότι δεν υπάρχουν ορίσµατα Τα αρχεία κλείνουν αυτόµατα όταν τερµατιστεί το πρόγραµµά µας 5

Άδειασµα (Flush) αρχείου 16 Συχνά η έξοδος είναι "buffered" Αποθηκεύεται προσωρινά πριν σταλεί στο αρχείο Γράφεται σε οµάδες Περιστασιακά, ίσως χρειαστεί να εξαναγκάσουµε την εγγραφή στο αρχείο, δηλ., το άδειασµατων buffers: outstream.flush(); Συνάρτηση-µέλος flush, για όλα τα ρεύµατα εξόδου Όλη η buffered output γράφεται στο αρχείο Το κλείσιµο του αρχείου καλεί αυτόµατα την flush() Παράδειγµα I/O αρχείου (1/2) 17 Παράδειγµα I/O αρχείου (2/2) 18 6

19 Προσθήκη στο τέλος (append) αρχείου Ητυπικήλειτουργίαopen ξεκινά µε άδειο αρχείο Ακόµα και εάν το αρχείο υπάρχει τα περιεχόµενα χάνονται (overwritten) Λειτουργία open για προσθήκη στο τέλος (append): ofstream outstream; outstream.open("important.txt", ios::app); Εάντοαρχείοδενυπάρχει το δηµιουργεί Εάντοαρχείουπάρχει προσθέτει στο τέλος Το 2 ο όρισµα είναιµια σταθερά ορισµένη στην κλάση ios Στη βιβλιοθήκη <iostream>, και στο namespace std Άλλη σύνταξη για άνοιγµα αρχείου 20 Μπορούµενακαθορίσουµε τοόνοµατουαρχείου στη δήλωση Περνάει ως όρισµα στονconstructor ifstream instream; instream.open("infile.txt"); ΙΣΟ ΥΝΑΜΟ ΜΕ ΤΟ: ifstream instream("infile.txt"); Έλεγχος για επιτυχές άνοιγµα αρχείου File opens θα µπορούσαν να αποτύχουν Εάντοαρχείοεισόδουδενυπάρχει εν έχουµεδικαίωµα εγγραφής στο αρχείο εξόδου Απρόβλεπτες καταστάσεις Συνάρτηση-µέλος fail() Κάνουµε κλήση στη fail() για να ελέγξουµε την επιτυχία της λειτουργίας στο ρεύµα instream.open("stuff.txt"); if (instream.fail()) { cout << "File open failed.\n"; exit(1); } 21 7

I/O χαρακτήρων µε αρχεία 22 Όλες οι λειτουργίες I/O χαρακτήρων µε cin και cout ίδιες και µε τααρχεία! Οι συναρτήσεις-µέλη δουλεύουν το ίδιο: get, getline put, putback, peek, ignore Έλεγχος τέλους αρχείου: Τρόπος 1 ος 23 Χρήση βρόχου για επεξεργασία του αρχείου µέχρι να τελειώσει Τυπική προσέγγιση υο τρόποι για να ελέγξουµε γιατέλοςαρχείου Συνάρτηση-µέλος eof() instream.get(next); while (!instream.eof()) { cout << next; instream.get(next); } ιαβάζει κάθε χαρακτήρα µέχρι να τελειώσει το αρχείο Ησυνάρτηση-µέλος eof() επιστρέφει bool 24 Έλεγχος τέλους αρχείου: Τρόπος 2 ος εύτερη µέθοδος Ηλειτουργίαread επιστρέφει τιµή bool! (instream >> next) Η έκφραση επιστρέφει true εάν η read είναι επιτυχής Επιστρέφει false εάν προσπαθήσει να διαβάσει πέρα απότοτέλοςτουαρχείου Στην πράξη: double next, sum = 0; while (instream >> next) sum = sum + next; cout << "the sum is " << sum << endl; 8

Ονόµατα αρχείων ως είσοδος 25 Λειτουργία open για ρεύµα Το όρισµαστηνopen() είναι τύπου string Μπορεί να είναι literal (όπως µέχρι τώρα) ή µεταβλητή char filename[16]; ifstream instream; cout << "Enter file name: "; cin >> filename; instream.open(filename); Παρέχει ευελιξία 26 Μορφοποίηση εξόδου µε συναρτήσεις Έχουµε χρησιµοποιήσει σε παράδειγµατα: cout.setf(ios::fixed); cout.setf(ios::showpoint); cout.precision(2); Τυπώνει τους αριθµούς σε µορφή χρήµατος (12.52) Μπορεί να χρησιµοποιηθεί σε οποιοδήποτε ρεύµα εξόδου Τα ρεύµατα αρχείων (file streams) έχουν τις ίδιες συναρτήσεις-µέλη µετοαντικείµενο cout Συναρτήσεις-µέλη για έξοδο (1/2) 27 Θεωρήστε τα: outstream.setf(ios::fixed); outstream.setf(ios::showpoint); outstream.precision(2); Ησυνάρτηση-µέλος precision(x) Οι δεκαδικοί γράφονται µε "x" ψηφία µετά την υποδιαστολή Ησυνάρτηση-µέλος setf() Επιτρέπει πολλές από τις flags εξόδου να τεθούν σε κάποια τιµή 9

Συναρτήσεις-µέλη για έξοδο (2/2) 28 Θεωρήστε το: outstream.width(5); Ησυνάρτηση-µέλος width(x) Θέτει το πλάτος σε "x" για την τιµήεξόδου Επηρεάζει µόνο την επόµενη τιµήστηνέξοδο Πρέπει να θέτουµε τοwidth πριν από κάθε τιµή ώστε να επηρεαστούν όλες Είναι τυπικό να έχουµε µεταβλητά widths Για να φτιάξουµε στήλες Flags 29 Θυµηθείτε: ησυνάρτηση-µέλος setf() Θέτει την κατάσταση των flags εξόδου Όλαταρεύµατα εξόδου έχουν µέλος τη setf() Οι flags είναι σταθερές στην κλάση ios Στη βιβλιοθήκη <iostream>, στο namespace std Παραδείγµατα µε τηsetf() 30 Συνήθεις σταθερές flag: outstream.setf(ios::fixed); Θέτει τον συµβολισµό fixed-point (δεκαδική αναπαράσταση) outstream.setf(ios::showpoint) Να περιλαµβάνεται πάντα η υποδιαστολή outstream.setf(ios::right); Θέτει δεξιά στοίχιση Θέτουµε πολλές flags µε µια κλήση: outstream.setf(ios::fixed ios::showpoint ios::right); 10

ιαχειριστές (Manipulators) 31 Ως διαχειριστής (manipulator) ορίζεται: Μια συνάρτηση που καλείται µε µη-παραδοσιακό τρόπο Μπορεί να έχει ορίσµατα Τοποθετείται µετά τον τελεστή εισαγωγής Κάνουν τα ίδια πράγµατα όπως και οι συναρτήσεις-µέλη! Με διαφορετικό τρόπο Είναι σύνηθες να τους χρησιµοποιούµε µαζί Οι setw() και setprecision() βρίσκονται στη βιβλιοθήκη <iomanip>, στο namespace std Παράδειγµα διαχειριστή: setw() 32 Ο διαχειριστής setw(): cout << "Start" << setw(4) << 10 << setw(4) << 20 << setw(6) << 30; Προκύπτει το: Start 10 20 30 Σηµειώστε ότι: η setw() επηρεάζει µόνο την επόµενη τιµήεξόδου Πρέπει να περιλαµβάνουµετηνsetw() πριν από κάθε item εξόδου, ώστε να επηρεαστούν όλα Ο διαχειριστής setprecision() 33 Ο διαχειριστής setprecision(): cout.setf(ios::fixed ios::showpoint); cout << "$" << setprecision(2) << 10.3 << " " << "$" << 20.5 << endl; Προκύπτει το: $10.30 $20.50 11

Αποθήκευση των τιµών των Flag 34 Οι τιµές των flags παραµένουν µέχρι να αλλαχτούν Οι flags precision και setf µπορούν να αποθηκευτούν και να ανακτηθούν Ησυνάρτησηprecision() επιστρέφει την τρέχουσα τιµή, εάν κληθεί χωρίς ορίσµατα Ησυνάρτηση-µέλος flags() παρέχει παρόµοια λειτουργικότητα Παράδειγ. αποθήκευσης τιµών flag 35 void outputstuff(ofstream& outstream) { int precisionsetting = outstream.precision(); long flagsettings = outstream.flags(); outstream.setf(ios::fixed ios::showpoint); outstream.precision(2); outstream.precision(precisionsetting); outstream.flags(flagsettings); } Συνάρτηση για αποθήκευση και ανάκτηση τυπικών ρυθµίσεων Κλήση: outputstuff(mystream); Ανακτώντας τις εξ ορισµού τιµές 36 Μπορούµεναανακτήσουµε τιςεξ ορισµού ρυθµίσεις: cout.setf(0, ios::floatfield); εν είναι αναγκαστικά οι τελευταίες ρυθµίσεις! Οι εξ ορισµού ρυθµίσεις εξαρτώνται από την υλοποίηση εν κάνει reset τις ρυθµίσεις της precision Μόνο τις ρυθµίσεις της setf 12

Ιεραρχίες ρευµάτων 37 Σχέσεις κλάσεων Παράγεται από Μια κλάση προέρχεται από άλλη κλάση Κατόπιν προστίθονται χαρακτηριστικά Παράδειγµα: ηλ.: το ifstream παράγεται από το istream 38 Κληρονοµικότητα κλάσεων ρευµάτων Θεωρήστε το: Εάν η D είναι παραγόµενη κλάση της B Όλατααντικείµενα τύπου D είναι επίσης αντικείµενα τύπου B Σε ότι αφορά τα ρεύµατα: Ένα αντικείµενο ifstream είναι επίσης ένα αντικείµενο istream Θα πρέπει να χρησιµοποιούµεαντικείµενα istream ως παραµέτρους Έτσι περισσότερα αντικείµενα µπορούν να περαστούν ως παράµετροι! 39 Παράδειγµα κληρονοµικότητας κλάσεων ρευµάτων 13

Κληρονοµικότητα κλάσεων ρευµάτων: Παραδείγµατα κλήσεων 40 Θεωρώντας τις προηγούµενες συναρτήσεις: twosumversion1(filein); // Νόµιµο! twosumversion1(cin); // Παράνοµο! Επειδή η cin δεν είναι τύπου ifstream! twosumversion2(filein); // Νόµιµο! twosumversion2(cin); // Νόµιµο! Πιο ευέλικτο Ηπαράµετρος istream δέχεται και τα δυο αντικείµενα Τυχαία προσπέλαση σε αρχεία 41 Σειριακή προσπέλαση Ηπιοσυχνάχρησιµοποιούµενη µέθοδος Τυχαία προσπέλαση Γρήγορηπροσπέλασηστιςεγγραφές Για µεγάλες βάσεις Προσπελάζει τυχαία οποιοδήποτε µέρος του αρχείου Χρήση των αντικειµένων fstream Είσοδος και έξοδος Εργαλεία τυχαίας προσπέλασης 42 Ανοίγει όµοια µε istream ή ostream Έχει δεύτερο όρισµα fstream rwstream; rwstream.open("stuff", ios::in ios:: out); Ανοίγει µε δυνατότηταread και write Μετακίνηση µέσα σε ένα αρχείο rwstream.seekp(1000); Τοποθετεί τον put-pointer στο 1000 th byte rwstream.seekg(1000); Τοποθετεί τον get-pointer στο 1000 th byte 14

Μεγέθη για τυχαία προσπέλαση 43 Για να µετακινούµαστε πρέπει να γνωρίζουµε τα µεγέθη Οτελεστήςsizeof() προσδιορίζει τον αριθµό τωνbytes που απαιτούνται για ένα αντικείµενο: sizeof(s) //Where s is string s = "Hello" sizeof(10) sizeof(double) sizeof(myobject) Τοποθετεί τον put-pointer στην 100 th εγγραφή των αντικειµένων: rwstream.seekp(100*sizeof(myobject) 1); Περίληψη 1 44 Τα ρεύµατα συνδέονται σε αρχεία µετη λειτουργία open Ησυνάρτηση-µέλος fail() ελέγχει την επιτυχία ιάφορες συναρτήσεις-µέλη µορφοποιούν την έξοδο π.χ., width, setf, precision Ίδια χρήση της cout (οθόνη) ήαρχεία Οι τύποι ρευµάτων (stream) µπορεί να είναι παράµετροι Πρέπει να περνάνε ως call-by-reference Περίληψη 2 45 istream (χωρίς f ) παράµετροι δέχονται αντικείµενα cin ήαντικείµενα ifstream ως ορίσµατα ostream (χωρίς f ) παράµετροι δέχονται αντικείµενα cout ήαντικείµενα ofstream ως ορίσµατα Συνάρτηση-µέλος eof Χρησιµοποιείται για να ελέγξει για το τέλος του αρχείου εισόδου 15

Περιεχόµενα 46 Κληρονοµικότητα (Inheritance) Στόχοι εκµάθησης 47 Τα βασικά της κληρονοµικότητας Παραγόµενες κλάσεις,µε constructors protected: qualifier Ξανα-ορίζοντας συναρτήσεις-µέλη Μη-κληρονοµούµενες συναρτήσεις Προγραµµατισµός µε κληρονοµικότητα Τελεστής ανάθεσης και copy constructors Destructors σε παραγόµενες κλάσεις Πολλαπλή κληρονοµικότητα Εισαγωγή στην κληρονοµικότητα 48 Αντικειµενοστραφής προγραµµατισµός Ισχυρή τεχνική προγραµµατισµού Παρέχει συνιστώσα αφαίρεσης, την κληρονοµικότητα Ορίζεται γενική µορφή µιας κλάσης Εξειδικευµένες εκδόσεις κατόπιν κληρονοµούν ιδιότητες της γενικής κλάσης Και προσθέτουν/τροποποιούν τη λειτουργικότητά της για κατάλληλη χρήση 16

Τα βασικά της κληρονοµικότητας 49 Μια νέα κλάση κληρονοµείται από µια άλλη ΒασικήήΜητρικήήΓονικήκλάση(Base class) Γενική κλάση από την οποία γεννιούνται άλλες Παραγόµενη κλάση (Derived class) Νέα κλάση Αυτόµατα έχει από τη βασική κλάση τις: Μεταβλητές-µέλη Συναρτήσεις-µέλη Μπορούµε κατόπιν να προσθέσουµεσυναρτήσεις-µέλη και µεταβλητές-µέλη Παραγόµενες κλάσεις 50 Θεωρήστε το παράδειγµα: Κλάση από "Employees" Αποτελείται από: Salaried employees Hourly employees Κάθε οµάδα είναι υποσύνολο από employees Μια άλλη οµάδα µπορεί να είναι εκείνη που περιλαµβάνει εκείνους που πληρώνονται µε σταθερό µισθό κάθε µήνα ή εβδοµάδα Παραγόµενες κλάσεις 51 εν χρειάζεται τύπο για τον γενικό "employee" Αφού κανένας δεν είναι απλώς "employee" Η γενική ιδέα του employee είναι χρήσιµη! Όλοι έχουν ονόµατα Όλοι έχουν αριθµό ταυτότητας Οι συναρτήσεις οι σχετιζόµενες µεαυτάταβασικά στοιχείαείναιοιίδιεςγιαόλουςτουςemployees Έτσι η γενική κλάση µπορεί να περιέχει όλα αυτά τα στοιχεία για τους employees 17

Κλάση Employee 52 Πολλά µέλη της κλάσης "employee" εφαρµόζονται για όλους τους τύπους των employees Συναρτήσεις προσπέλασης (Accessor functions) Συναρτήσεις τροποποίησης (Mutator functions) Τα περισσότερα δεδοµένα: SSN Name Pay Όµως δεν θα έχουµεαντικείµενα αυτής της κλάσης Κλάση Employee 53 Θεωρήστε τη συνάρτηση printcheck(): Πάνταθαξανα-ορίζεται στις παραγόµενες κλάσεις Έτσι διαφορετικoί τύποιεmployees θα έχουν διαφορετικά checks εν έχει νόηµα ναυπάρχει µη-διαφοροποιηµένος Employee Έτσι η συνάρτηση printcheck() στην κλάση Employee απλά λέει ότι Μήνυµα λάθους δηλώνοντας ότι "printcheck called for undifferentiated employee!! Aborting " Παράγοντας από την κλάση Employee 54 Παραγόµενες κλάσεις από την κλάση Employee: Αυτόµατα έχουν όλες τις µεταβλητές-µέλη Αυτόµατα έχουν όλες τις συναρτήσεις-µέλη Θα λέµεότιηπαραγόµενη κλάση κληρονοµεί τα µέλη της βασικής κλάσης Κατόπιν, µπορούµεναξανα-ορίσουµε τα υπάρχοντα µέλη και/ήναπροσθέσουµε νέαµέλη 18

ήλωση παραγόµενης κλάσης HourlyEmployee (1/2) 55 ήλωση παραγόµενης κλάσης HourlyEmployee (2/2) 56 Interface της HourlyEmployee 57 Παρατηρήστε ότι ο ορισµόςαρχίζειτοίδιοόπως κάθε άλλη #ifndef δοµή Περιλαµβάνει τις απαιτούµενες βιβλιοθήκες Επίσης, περιλαµβάνει την employee.h! Και, το heading: class HourlyEmployee : public Employee { } Καθορίζει publicly inherited από την κλάση Employee 19

Προσθήκες στην HourlyEmployee 58 Το interface της παραγόµενης κλάσης περιλαµβάνει µόνο τα νέα µέληήόποιαµέλη πρόκειται να ξανα-οριστούν Αφού όλα τα άλλα που κληρονοµούνται έχουν ήδη οριστεί δηλ., όλοι οι employees έχουν ssn, name, κ.τ.λ. Η HourlyEmployee προσθέτει: Constructors Τις µεταβλητές: wagerate, hours member Τις συναρτήσεις-µέλη: setrate(), getrate(), sethours(), gethours() Επαν-ορισµοί στη HourlyEmployee 59 Η HourlyEmployee ξανα-ορίζει: Τη συνάρτηση-µέλος printcheck() Αυτή "overrides" την υλοποίηση της συνάρτησης printcheck() της κλάσης Employee Οορισµός της πρέπει να είναι στην υλοποίηση της HourlyEmployee Όπωςκαιοιάλλεςσυναρτήσεις-µέλη που δηλώνονται στο interface της HourlyEmployee Νέες και ξανα-οριζόµενες Ορολογία κληρονοµικότητας 60 Γονική κλάση (Parent class) Αναφέρεται στη βασική κλάση (base class) Κλάση-παιδί (child class) Αναφέρεται στην παραγόµενη κλάση (derived class) Προγονική κλάση (ancestor class) Κλάση που είναι πατέρας του πατέρα της Απογονική κλάση (descendant class) Αντίθετη της ancestor 20

61 Constructors παραγόµενων κλάσεων Οι constructors τωνγονικώνκλάσεων ΕΝ κληροδοτούνται στις παραγόµενες κλάσεις! Αλλά µπορούν να εκκινηθούν µέσα στους constructors των παραγόµενων κλάσεων Το οποίο είναι αυτό που επιζητούµε! Ο constructor της γονικής κλάσης πρέπει να εκκινεί όλες τις µεταβλητές-µέλη της γονικής κλάσης Αυτές που κληροδοτούνται Έτσι ο constructor της παραγόµενης κλάσης απλά τον καλεί Το οποίο είναι το πρώτο πράγµαπουκάνειοconstructor constructor παραγόµενης κλάσης Θεωρήστε τη σύνταξη για τον constructor της HourlyEmployee: HourlyEmployee::HourlyEmployee(string thename, string thenumber, double thewagerate, double thehours) : Employee(theName, thenumber), wagerate(thewagerate), hours(thehours) { //Ίσως κενό } Το τµήµα µετά το: είναι το τµήµα εκκίνησης Περιλαµβάνει την invocation του Employee constructor 62 constructor παραγόµενης κλάσης 63 εύτερος constructor: HourlyEmployee::HourlyEmployee() : Employee(), wagerate(0), hours(0) { //Deliberately empty } Καλείται ο εξ ορισµού (default) constructor της γονικής κλάσης Πάνταθαπρέπεινακαλούµε έναναπότους constructors της γονικής κλάσης 21

64 Μη κλήση του γονικού constructor Ο constructor της παραγόµενης κλάσης θα πρέπει πάντα να καλεί έναν από τους constructors της γονικής κλάσης Εάνδεντονκαλέσουµε: Καλείται αυτόµατα ο default constructor της γονικής κλάσης Ισοδύναµος ορισµός του constructor: HourlyEmployee::HourlyEmployee() : wagerate(0), hours(0) { } Παγίδα: Ιδιωτικά δεδοµένα της γονικής κλάσης 65 Η παραγόµενη κλάση κληρονοµεί τις ιδιωτικές µεταβλητές-µέλη Αλλά δεν µπορούµε να τις προσπελάσουµε Ούτε διαµέσου των συναρτήσεων-µελών της παραγόµενης κλάσης! Οι ιδιωτικές µεταβλητές-µέλη µπορούν να προσπελαστούν µεόνοµα ΜΟΝΟ από συναρτήσεις-µέλη της κλάσης όπου αυτές ορίζονται Παγίδα: Ιδιωτικές συναρτήσεις-µέλη της γονικής κλάσης 66 Το ίδιο ισχύει για τις συναρτήσεις-µέλη της γονικής κλάσης εν µπορούν να προσπελαστούν εκτός του interface και της υλοποίησης της γονικής κλάσης Ούτε και στους ορισµούς των συναρτήσεων- µελών της παραγόµενης κλάσης 22

Παγίδα: Επίδραση των ιδιωτικών συναρτήσεων-µελών γονικής κλάσης 67 Μεγαλύτερη επίδραση εδώ vs. µεταβλητές-µέλη Οι µεταβλητές-µέλη µπορούν να προσπελαστούν έµµεσα διαµέσου των accessor ή mutator συναρτήσεων-µελών Οι συναρτήσεις-µέλη απλά δεν είναι διαθέσιµες Είναι λογικό Οι ιδιωτικές συναρτήσεις-µέληθαπρέπειαπλάναείναι βοηθητικές συναρτήσεις Θα πρέπει να χρησιµοποιούνται µόνο στην κλάση όπου ορίζονται Ο προσδιοριστής protected 68 Νέα κατηγοριοποίηση των µελών µιας συνάρτησης Επιτρέπει προσπέλαση µεόνοµα στην παραγόµενη κλάση Αλλά πουθενά αλλού Όχι προσπέλαση µεόνοµα σε άλλες κλάσεις Στην κλάση όπου ορίζεται ενεργεί ως ιδιωτικό Θεωρούνται "protected" στην παραγόµενη κλάση Για να επιτρέψει µελλοντικές παραγόµενες κλάσεις Με πρώτη µατιά, φαίνεται να παραβιάζει την αρχή της απόκρυψης πληροφορίας Επαν-ορισµοί συναρτήσεων-µελών 69 Θυµηθείτε το interface της παραγόµενης κλάσης: Περιέχει δηλώσεις για νέες συναρτήσεις-µέλη Επίσης, περιέχει δηλώσεις για κληρονοµούµενες συναρτήσεις-µέλη που θα τροποποιηθούν Οι κληρονοµούµενες συναρτήσεις-µέλη που ΕΝ δηλώνονται: Αυτόµατα κληρονοµούνται αµετάβλητες Η υλοποίηση της παραγόµενης κλάσης θα: Ορίσει νέες συναρτήσεις-µέλη Θα ξανα-ορίσει κληρονοµούµενες συναρτήσεις 23

Επαν-ορισµός vs. Υπερφόρτωση 70 Εντελώς διαφορετικές έννοιες και µηχανισµοί! Επαν-ορισµός στην παραγόµενη κλάση: Ι ΙΑ λίστα παραµέτρων Ουσιαστικά, ξαναγράφεται ηίδιασυνάρτηση Υπερφόρτωση: ιαφορετική λίστα παραµέτρων Η νέα συνάρτηση παίρνει διαφορετικές παραµέτρους Οι υπερφορτωµένες συναρτήσεις θα πρέπει να έχουν διαφορετικές υπογραφές Υπογραφή συνάρτησης 71 Θυµηθείτε τον ορισµό της υπογραφής µιας συνάρτησης: Όνοµα της συνάρτησης Ακολουθία των τύπων στη λίστα των παραµέτρων Περιλαµβάνοντας τη σειρά, αριθµό, τύπους Ηυπογραφή ΕΝπεριλαµβάνει: Τύπο επιστροφής Τη λέξη-κλειδί const & Προσπελάζοντας τη ξανα-ορισµένη συνάρτηση µιας γονικής κλάσης 72 Όταν µια συνάρτηση ξανα-ορίζεται σε µια παραγόµενη κλάση, ο ορισµός της στη γονική κλάση, δεν χάνεται Μπορούµενακαθορίσουµε τηχρήσητης: Employee JaneE; HourlyEmployee SallyH; JaneE.printCheck(); calls Employee s printcheck function SallyH.printCheck(); calls HourlyEmployee printcheck function SallyH.Employee::printCheck(); Calls Employee s printcheck function! εν είναι σύνηθες, αλλά χρήσιµο µερικές φορές 24

73 Συναρτήσεις που δεν κληρονοµούνται Όλες οι κανονικές συναρτήσεις µιας γονικής κλάσης κληροδοτούνται στις παραγόµενες Εξαιρέσεις: Constructors Destructors Copy constructor Αλλά εάν δεν οριστεί, γεννά έναν εξ ορισµού Θυµηθείτεότιπρέπειναορίζουµεένανγιατουςpointers! Assignment operator If not defined default Τελεστές ανάθεσης και copy constructors 74 Θυµηθείτε: οι υπερφορτωµένοι τελεστές ανάθεσης και οι copy constructors ΕΝ κληρονοµούνται Αλλά µπορούν να χρησιµοποιηθούν στον ορισµός της παραγόµενης κλάσης Τυπικά ΠΡΕΠΕΙ να χρησιµοποιηθούν! Όµοια µετοπώςοconstructor µιας παραγόµενης κλάσης εκκινεί τον constructor της γονικής κλάσης Παράδειγµα τελεστή ανάθεσης 75 Έστω ότι η "Derived" κλάση παράγεται από τη "Base": Derived& Derived::operator =(const Derived & rightside) { Base::operator =(rightside); } Προσέξτε τη γραµµή του κώδικα Καλεί τον τελεστής ανάθεσης της γονικής κλάσης Αυτό τακτοποιεί όλες τις κληρονοµούµενες µεταβλητές Κατόπιν, θα θέσει τις νέες µεταβλητές της παραγόµενης κλάσης 25

Παράδειγµα copy constructor 76 Θεωρήστε το: Derived::Derived(const Derived& Object) : Base(Object), { } Μετά το : είναι η invocation του γονικού copy constructor Θέτει τις κληρονοµούµενες µεταβλητές-µέλη του αντικειµένου της παραγόµενης κλάσης που δηµιουργείται Παρατηρήστε ότι το Object είναι τύπου Derived; Αλλά είναι επίσης και τύπου Base, έτσι το όρισµα είναι έγκυρο 77 Destructors σε παραγόµενες κλάσεις Εάν ο destructor της βασικής κλάσης λειτουργεί κανονικά Είναι εύκολο να γραφεί ο destructor της παραγόµενης Όταν ενεργοποιηθεί ο destructor της παραγόµενης: Καλεί αυτόµατα τον destructor της βασικής κλάσης! Έτσι, δεν υπάρχει η ανάγκη σαφούς κλήσης Έτσι, οι destructors των παραγόµενων κλάσεων χρειάζεται να ανησυχούν µόνο για τις µεταβλητές της παραγόµενης κλάσης Και για όποια δεδοµένα στα οποία δείχνουν Ο destructor της βασικής κλάσης χειρίζεται αυτόµατα τα κληρονοµούµενα δεδοµένα Σειρά κλήσης των destructors 78 Θεωρήστε το: ηκλάσηb παράγεται από την κλάση A ηκλάσηc παράγεται από την κλάση B A B C Όταν ένα αντικείµενο της κλάσης C βγεί out of scope : Καλείται πρώτα ο destructor της κλάσης C Κατόπιν, καλείται ο destructor της κλάσης B Τελικά, καλείται ο destructor της κλάσης A Αντίθετα από τη σειρά κλήσης των constructors Γενικότερη αρχή: Resource acquisition is Initialization 26

Σχέσεις "Is a" vs. "Has a" 79 Κληρονοµικότητα Θεωρείται ως µια σχέση Is a µεταξύ των κλάσεων π.χ., Ένας HourlyEmployee "is a" Employee Μια κλάση περιέχει αντικείµενα άλλης κλάσης ως δικά της µέλη Θεωρείται ως µια σχέση Has a µεταξύ των κλάσεων π.χ., Μια κλάση "has a" αντικείµενο άλλης κλάσης ως δεδοµένα της Protected & private κληρονοµικότ. 80 Νέες µορφές κληρονοµικότητας Χρησιµοποιούνται σπάνια Protected κληρονοµικότητα: class SalariedEmployee : protected Employee { } Τα public µέλη της βασικής κλάσης γίνονται protected µέλη στην παραγόµενη κλάση Private κληρονοµικότητα: class SalariedEmployee : private Employee { } Όλα τα µέλητηςβασικήςκλάσηςγίνονται private στην παραγόµενη κλάση Πολλαπλή κληρονοµικότητα 81 Μια παραγόµενη κλάση µπορεί να έχει περισσότερες από µια βασικές κλάσεις! Η σύνταξη απαιτεί ότι απαριθµούνται όλες οι βασικές κλάσεις διαχωριζόµενες µε κόµµα: class derivedmulti : public base1, base2 { } Πιθανότητες για ambiguity είναι ατελείωτες! Επικίνδυνη η αξιοποίησή της! Αρκετοί πιστεύουν ότι δεν πρέπει να χρησιµοποιείται καθόλου Σίγουρα χρειάζεται αρκετή εµπειρία για τη χρήση της! 27

Περίληψη 1 82 Ηκληρονοµικότητα παρέχει επαναχρησιµοποίηση κώδικα Επιτρέπει µια κλάσης να παραχθεί από κάποια άλλη µε την προσθήκη χαρακτηριστικών Τα αντικείµενα παραγόµενων κλάσεων κληρονοµούν τα µέλη της µητρικής κλάσης Και µπορούν να προσθέτουν µέλη Οι ιδιωτικές µεταβλητές της µητρικής κλάσης δεν µπορούν να προσπελαστούν µετοόνοµα από τις παραγόµενές της Οι ιδιωτικές συναρτήσεις-µέλη δεν κληρονοµούνται Περίληψη 2 83 Μπορούµεναξανα-ορίσουµε τις κληρονοµούµενες συναρτήσεις-µέλη Για να εκτελούν διαφορετικές λειτουργίες στη παραγόµενη κλάση Τα protected µέλη στη µητρική κλάση: Μπορούν να προσπελαστούν µετοόνοµα στις συναρτήσεις-µέλη της παραγόµενης κλάσης Ουπερφορτωµένος τελεστής ανάθεσης δεν κληρονοµείται Αλλά µπορεί να εκκινηθεί από την παραγόµενη κλάση Οι constructors δεν κληρονοµούνται Εκκινούνται από τον constructor της παραγόµενης κλάσης 28