You are on page 1of 137

Ελληνική Δημοκρατία

Τεχνολογικό Εκπαιδευτικό
Ίδρυμα Ηπείρου

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

Ιωάννης Τσούλος

Ενότητα 1 : Εισαγωγικές έννοιες και βασική δομή

2
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Σχετικά με τη C++
• Μια συνηθισμένη γλώσσα προγραμματισμού (π.χ. C, C++, PASCAL)
μεταγλωττίζει τον πηγαίο κώδικα του προγράμματος σε εκτελέσιμη
μορφή που να καταλαβαίνει ο επεξεργαστής.
• Η μορφή αυτή είναι η γλώσσα μηχανής, και διαφέρει για κάθε
επεξεργαστή, αρχιτεκτονική και λειτουργικό σύστημα.
• Η εκτελέσιμη μορφή ενός προγράμματος για μια συγκεκριμένη
αρχιτεκτονική, δεν είναι δυνατό να χρησιμοποιηθεί σε διαφορετική
αρχιτεκτονική, δηλαδή δε μπορούμε να χρησιμοποιήσουμε το εκτελέσιμο
πρόγραμμα για Windows σε έναν υπολογιστή Macintosh.
• Έτσι, είναι απαραίτητη η εκ νέου μεταγλώττιση του πηγαίου κώδικα
(source code) για κάθε αρχιτεκτονική στην οποία θέλουμε να τρέξουμε το
πρόγραμμα. 5
5

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Σχετικά με τη C++
• Μεταγλώττιση (compile) & Σύνδεση (link)

Διαδικασία
μεταγλώττισης ενός
προγράμματος C++
και ενός
προγράμματος Java

6
6
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Σχετικά με τη C++
• Διαδικαστικός ή Δομημένος Προγραμματισμός (Procedural
ή Structured Programming)
• Οι παλαιότερες γλώσσες προγραμματισμού όπως οι C, PASCAL,
FORTRAN έδιναν έμφαση στην διαδικασία και στα στάδια που
ακολουθούνται για την επίτευξη κάποιου στόχου.
• Το αντικείμενο ήταν ο κώδικας (code-centric γλώσσες
προγραμματισμού).
• Ο προγραμματισμός γινόταν ορίζοντας τη ροή εκτέλεσης (από το
στάδιο Α, στο στάδιο Β) και τις αντίστοιχες υπορουτίνες.

7
7

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Σχετικά με τη C++
• Αντικειμενοστραφής προγραμματισμός (Object-Oriented
Programming)
• Οι αντικειμενοστραφείς γλώσσες προγραμματισμού (Java, Eiffel, Smalltalk
και φυσικά C++) δίνουν έμφαση στα δεδομένα παρά στον κώδικα.
• Το πρόγραμμα αναπτύσσεται γύρω από τα δεδομένα (data-centric) τα
οποία ορίζουν από μόνα τους τον τρόπο με τον οποίο μπορούμε να τα
διαχειριστούμε.
• Ο φυσικός και ο τεχνητός κόσμος που ζούμε είναι πιο κοντά στη
φιλοσοφία του Αντικειμενοστραφή προγραμματισμού παρά του
Δομημένου προγραμματισμού.

8
8
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Σχετικά με τη C++
• Αντικειμενοστραφής προγραμματισμός (Object-Oriented
Programming)
• Πχ. Κάθε αυτοκίνητο είναι ένα αντικείμενο που ανήκει σε μια κλάση που ορίζει τα
βασικά χαρακτηριστικά του αυτοκινήτου.
• Αυτά μπορεί να διαφέρουν ανάμεσα στους κατασκευαστές αλλά όλα θα
παρέχουν τα βασικά χαρακτηριστικά που ορίζει η κλάση “αυτοκίνητο” για τη
χρήση του (τιμόνι, γκάζι, φρένο, συμπλέκτης, ταχύτητες).
• Αυτά είναι τα δεδομένα. Κάθε ένα από αυτά ορίζει τον τρόπο χρήσης του.
• Το τιμόνι στρίβει αριστερά/δεξιά, τα πεντάλ πιέζονται ή αφήνονται και οι
ταχύτητες αλλάζουν διακριτά έχοντας μηχανισμό ασφαλείας - δε μπορούμε να
αλλάξουμε ταχύτητα σε όπισθεν ενώ το αυτοκίνητο κινείται με ταχύτητα.
9
9

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Σχετικά με τη C++
• Αντικειμενοστραφής προγραμματισμός (Object-Oriented
Programming)
• Η υλοποίηση καθενός από αυτούς τους μηχανισμούς διαφέρει σε κάθε
κατασκευαστή, αλλά η χρήση τους είναι η ίδια για όλους.
• Δηλαδή η χρήση του τιμονιού και των ταχυτήτων γίνεται με τον ίδιο
τρόπο ανεξαρτήτως κατηγορίας, κατασκευαστή και μοντέλου του
αυτοκινήτου.
• Επίσης, ο μηχανισμός με τον οποίο γίνεται η χρήση των δεδομένων αυτών
είναι κρυμμένος από τον χρήστη (δηλαδή τον οδηγό).

10
1
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Σχετικά με τη C++
• Αντικειμενοστραφής προγραμματισμός (Object-Oriented
Programming)
• Σημαντικότερα χαρακτηριστικά αντικειμενοστραφούς προγραμματισμού:
o Encapsulation (): Η διαδικασίες κρύβονται από το χρήστη και τα ίδια τα
δεδομένα προσδιορίζουν τους τρόπους διαχείρισης τους.
o Polymorphism (πολυμορφισμός): Αντικείμενα που ανήκουν σε παρόμοιες
κλάσεις μπορούν να έχουν κοινό τρόπο προσπέλασης, με αποτέλεσμα ο
χρήστης να μπορεί να τα χειριστεί με τον ίδιο τρόπο χωρίς να χρειάζεται να
μάθει νέες διαδικασίες.
o Inheritance (κληρονομικότητα): Μπορούμε να δημιουργήσουμε ένα νέο
αντικείμενο παίρνοντας ως βάση ένα άλλο ήδη υπάρχον. Το νέο αντικείμενο
θα έχει τα χαρακτηριστικά του παλιού ενώ θα μπορεί να τα τροποποιήσει, να
τα επεκτείνει και να προσθέσει καινούρια για να καλύψει συγκεκριμένες
ανάγκες. 11
1

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


ΜΕΤΑΒΛΗΤΕΣ
• Ονομασμένη θέση μνήμης που μπορεί να περιέχει δεδομένα
οποιουδήποτε είδους.
• Το περιεχόμενο της μεταβλητής μπορεί να μεταβάλλεται με δεδομένα
παρόμοιου είδους.
type var;
type: είδος της μεταβλητής.
var: όνομά της μεταβλητής.
Eίδος: Ένας από τους διαθέσιμους τύπους δεδομένων της C++ ή το όνομα
μιας κλάσης αντικειμένων.
12
1
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


Έυρος μεταβλητών Παράδειγμα:
type var1;
• Μια μεταβλητή θεωρείται if (συνθήκη) {
// Επεξεργασία της var1 (σωστό).
έγκυρη, μόνο μέσα στο πλαίσιο
// Επεξεργασία της var2 (λάθος).
στο οποίο ορίζεται. type var2;
// Επεξεργασία της var2 (σωστό)
• Το πλαίσιο μπορεί να είναι μια }
κλάση, μια συνάρτηση ή // Επεξεργασία της var1 (σωστό)
μέθοδος, το πεδίο ισχύος ενός // Επεξεργασία της var2 (λάθος)
loop for/while/do ή των εντολών
if/else/switch.

13
1

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


Τύποι δεδομένων Όνομα Μέγεθος (σε bytes) Όρια
Char 1 -128 έως 127
Παράδειγμα: short
int an_integer; Short 2 -32,768 έως 32,767
an_integer = 10;
long a_long = an_integer *1000; int/long 4 -2,147,483,648 έως -2,147,483,647
double verysmallnumber = long long 8 -9,223,372,036,854,775,808 έως
0.000000000003; -9,223,372,036,854,775,807
bool am_i_hungry = false; float 4 1.4 * 10-45 έως 3.4 * 1038
char alpha = 'a'; double 8 4.9 * 10-324 έως 1.8 * 10308
string text = “this is a text”;
bool 1 true / false
wchar 2 -
string μεταβλητό -

14
1
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


unsigned μεταβλητές
• Μπορούμε να διαμορφώσουμε το εύρος των μεταβλητών char, short, int,
long, long long ώστε να περιέχουν μόνο θετικούς αριθμούς.
• Οι τύποι αυτοί διαχωρίζονται με τους απλούς με τη λέξη unsigned πριν
από το όνομα του τύπου.
Όνομα Μέγεθος Όρια
(σε bytes)
unsigned char 1 -128 έως 127
short
unsigned short 2 -32,768 έως 32,767
unsigned int/ 4 -2,147,483,648 έως -2,147,483,647
unsigned long
unsigned long long 8 -9,223,372,036,854,775,808 έως
-9,223,372,036,854,775,807 15
1

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


Σταθερές (constants)
• Μπορούμε να δηλώσουμε μια μεταβλητή ως σταθερά (δηλαδή που να μη
μεταβάλλεται) με τη λέξη const.
const double pi = 3.1415;

16
1
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


Τελεστές (operators)
• 4 είδη τελεστών στη C++
– Αριθμητικοί τελεστές
– Σχεσιακοί Τελεστές
– Λογικοί Τελεστές
– Τελεστές καταχώρησης

17
1

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++ Σύμβολο


+ Πρόσθεση
Είδος

- Αφαίρεση
Τελεστές (operators) * Πολλαπλασιασμός
• 4 είδη τελεστών στη C++ / Διαίρεση

– Αριθμητικοί τελεστές % Υπόλοιπο Διαίρεσης


++ Αυξητικός τελεστής
– Σχεσιακοί Τελεστές
-- Αφαιρετικός τελεστής
– Λογικοί Τελεστές
int x = 10;
– Τελεστές καταχώρησης
x++; // τώρα η τιμή x έχει την τιμή 11
x--; // και πάλι την τιμή 10
int x = 10; // το x έχει την τιμή 10
int y = x++; // y έχει την τιμή 10, αλλά το x την τιμή 11
x = 10; // το x έχει πάλι την τιμή 10
int z = ++x; // το z έχει την τιμή 11, όπως και το x)

18
1
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


Τελεστές (operators) Σύμβολο Είδος
== Ισότητα
• 4 είδη τελεστών στη C++
!= Ανισότητα
– Αριθμητικοί τελεστές > Μεγαλύτερο από
– Σχεσιακοί Τελεστές < Μικρότερο από
– Λογικοί Τελεστές >= Μεγαλύτερο από ή ίσο με
<= Μικρότερο από ή ίσο με
– Τελεστές καταχώρησης

19
1

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


Τελεστές (operators) Σύμβολο Είδος
Λογικό AND
• 4 είδη τελεστών στη C++ &&
|| Λογικό OR
– Αριθμητικοί τελεστές
! NOT (Άρνηση)
– Σχεσιακοί Τελεστές
(alpha == true) && (beta == 1)
– Λογικοί Τελεστές
– Τελεστές καταχώρησης

20
2
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++ Σύμβολο Είδος


x += y το ίδιο με x = x + y
Τελεστές (operators)
x -= y το ίδιο με x = x - y
• 4 είδη τελεστών στη C++ x *= y το ίδιο με x = x * y
– Αριθμητικοί τελεστές x /= y το ίδιο με x = x / y
x %= y το ίδιο με x = x % y
– Σχεσιακοί Τελεστές
x &= y το ίδιο με x = x & y
– Λογικοί Τελεστές
x |= y το ίδιο με x = x | y
– Τελεστές καταχώρησης ^= το ίδιο με x = x ^ y

int x = 4;
x = 10;
x += 20; (είναι το ίδιο με την εντολή x = x + 20, τελικό αποτέλεσμα 30)
x /= 10; (το ίδιο με x = x / 10, αποτέλεσμα 3).
21
2

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


Παραστάσεις (Expressions)
• Οποιοσδήποτε έγκυρος συνδυασμός μεταβλητών, σταθερών,
αριθμών και τελεστών καλείται μια παράσταση.
• Το αποτέλεσμα της παράστασης μπορεί να είναι κάποιος από
τους τύπους δεδομένων της C++ (int, long, double, bool, κλπ)
ή κάποιο αντικείμενο (π.χ. string).
int b = 10, i;
i = 2*b*b; (παράδειγμα παράστασης)
if (b * b <= 100 && i > 0)
cout << “The expression is true” << endl;
string a = "ena, dyo";
string b = a + string(", testing"); 22
2
Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Δομή της C++


Pointers & References
• Δυνατότητα άμεσης προσπέλασης στα περιεχόμενα της περιοχής της μνήμης που
περιέχει κάποια μεταβλητή.
• Αν έχουμε μια μεταβλητή a τύπου string, το &a δείχνει στη διεύθυνση μνήμης
της a.
• Αντίστροφα, αν μια μεταβλητή b είναι τύπου pointer ενός string, τότε έχουμε
πρόσβαση στο περιεχόμενο της με τη χρήση του τελεστή *, ώστε το *b να
επιστρέφει το ίδιο το string, ενώ το b μόνο του να επιστρέφει τη διεύθυνση
μνήμης του string.
string a(“Hello”), *b;
b = &a;
cout << a << endl;
cout << *b << endl; 23
2

Αντικειμενοστραφής Προγραμματισμός – Εισαγωγικές Έννοιες & Βασική δομή, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Βιβλιογραφία
1. Εγχειρίδιο της C++, 2η Ελληνική έκδοση, Jesse Liberty, Γκιούρδας.
2. Μάθετε τη C++, 2η Ελληνική έκδοση, Jesse Liberty , Γκιούρδας.
3. Προγραμματισμός με τη γλώσσα C++ Μέρος Α, Αλεβίζος Θ., Έκδοση ΤΕΙ Καβάλας
4. C++ Αντικειμενοστραφής Προγραμματισμός Υπολογιστών Τομαράς Α., , Εκδόσεις Νέων
Τεχνολογιών.
5. Ανακαλύψτε τη γλώσσα C, J. Purdum, Εκδόσεις Δίαυλος.
6. Εισαγωγή στο Συστηματικό Προγραμματισμό και στη γλώσσα C++, Σ. Μπαλτζής, εκδόσεις
πανεπιστημίου Ιωαννίνων.
7. C++ From the beginning, Jan Skansholm, Addison Wesley.
8. The design and analysis of computer algorithms, A.V. AHO, J.E. HOPCROFT, J.D. ULLMANN,
Addison Wesley 1974.
9. Structure and Interpretation of Computer Programs, H. ABELSON, G.J. SUSSMAN, J.
SUSSMAN, MIT Press, Mc Graw Hill Book Company, 1985
10. The art of computer programming, D.E. KNUTH, Addison-Wesley.
2
Ενότητα 2 : Ελεγχόμενη ροή προγράμματος

Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Εισαγωγικά
• Σε κάθε πρόγραμμα είναι απαραίτητο να ελέγχουμε
τη ροή του αναλόγως κάποιες συνθήκες και να την
ανακατευθύνουμε κατάλληλα.
• Υπάρχουν πολλοί τρόποι να κατευθύνουμε τη ροή
του προγράμματος και ο κάθε ένας εξυπηρετεί
συγκεκριμένο σκοπό.

5
5
Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Η εντολή if
• Η εντολή if χρησιμοποιείται όταν θέλουμε να εκτελέσουμε
κάποιες εντολές μόνο όταν ικανοποιείται κάποια συνθήκη:
if if (x == 1) {
{ cout << “x is one.” << endl;
εντολές; } else if (x == 2) {
cout << “x is two.” << endl;
}
} else if (x == 3) {
else cout << “x is three.” << endl;
{ } else if (x == 4) {
εντολές; cout << “x is four.” << endl;
} } else {
cout << “x is not between 1-4.” << endl;
}

6
6

Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Η εντολή switch
switch (x) {
• Η εντολή switch case 1;
cout << “x is one.” << endl;
χρησιμοποιείται όταν break;
έχουμε πολλαπλές case 2;
cout << “x is two.” << endl;
επιλογές ή τιμές για break;
μια μεταβλητή και case 3:
cout << “x is three.” << endl;
θέλουμε να break;
εκτελεστούν case 4:
cout << “x is four.” << endl;
διαφορετικές εντολές break;
για κάθε τιμή. default:
cout << “x is not between 1-4.” << endl;
break;
} 7

7
Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Η εντολή switch
switch (x) {
Χωρίς την break η εκτέλεση του προγράμματος
case 1;
case 2; θα συνεχίσει μέχρι την επόμενη break ή μέχρι το
case 3; τέλος της εντολής switch.
case 4;
cout << “x is between one and four.” << endl;
break;
case 5;
case 6;
case 7;
case 8;
cout << “x is between five and eight.” << endl;
break;
default:
cout << “x is not between one and eight.” << endl;
break;
} 8

Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Η εντολή for
• Η εντολή for χρησιμοποιείται για επανάληψη (loop) υπό
συνθήκη κάποιων εντολών.

for (εντολή αρχικοποίησης; συνθήκη; εντολή επανάληψης)


{
εντολές;
}

9
9
Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Η εντολή for
• Η εντολή αρχικοποίησης (initialization) εκτελείται στην αρχή
του loop και στη συνέχεια ελέγχεται αν είναι αληθής ή
ψευδής η συνθήκη (condition).
• Αν είναι αληθής, εκτελούνται οι εντολές και στο τέλος
εκτελείται η εντολή επανάληψης (iteration) και ελέγχεται και
πάλι αν είναι αληθής η συνθήκη. Αν είναι αληθής
εκτελούνται οι εντολές, κ.ο.κ.
147
for (int i = 1; i < 20; i += 3) { 10
cout << i << endl; 13
} 16
19 10
1

Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Η εντολή for
• Κάθε μία από τις εντολές αρχικοποίησης, επανάληψης και η συνθήκη
μπορεί να παραλειφθεί αλλάζοντας τη συμπεριφορά της εντολής for.
int x = 10;
for (; x < 5; x++) {
cout << x << endl;
}
double y = 20000; // (y = pi)
for (; y >= 10.0;) {
// υπολογίζει την τετραγωνική του y και τοποθετεί
// το αποτέλεσμα πάλι στο y.
// Το for loop θα εκτελείται όσο το y είναι μεγαλύτερο από 10.0
cout << y);
y = sqrt(y);
}
for (;;) { // infinite loop
wait_for_signal();
} 11
1
Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Η εντολή while
• Η εντολή while while (συνθήκη) {
χρησιμοποιείται αντί της εντολές;
for όταν δε μπορούμε να }
προβλέψουμε εύκολα bool exit_from_loop = false;
πόσες φορές θέλουμε να while (exit_from_loop == false) {
εκτελεστούν οι εντολές, ή // υποθετική ρουτίνα που διαβάζει
δεδομένα από ένα αρχείο
όταν δεν έχει σημασία ο read_bytes(file1);
αριθμός των // άλλη ρουτίνα που γράφει δεδομένα σε
επαναλήψεων αλλά η ένα άλλο αρχείο
write_bytes(file2);
ικανοποίηση ή όχι της if (file_empty(file1) == true)
συνθήκης. exit_from_loop = true;
}
12
1

Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Η εντολή do/while
• Η εντολή do/while είναι do {
παρόμοια με την while, εντολές;
με μία διαφορά, οι } while (συνθήκη);
εντολές εντός του loop int x = 10;
θα εκτελεστούν do { Aποτέλεσμα:
τουλάχιστον μια φορά cout << x << endl;
x++; 10
ανεξαρτήτως αν είναι } while (x <10);
αληθής η συνθήκη ή όχι.

13
1
Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Οι εντολές break/continue
• Πολλές φορές θέλουμε να διακόψουμε την εκτέλεση των
εντολών σε ένα loop πρίν από τη προκαθορισμένη στιγμή.
π.χ. να φύγουμε από ένα infinite loop, ή όταν το πρόγραμμα
λάβει κάποιο σήμα (signal) για έξοδο (π.χ. Control-C).

for (int i = 1; i < 20; i += 3) { Aποτέλεσμα:


if ( i*i > 100) 1
break; 4
cout << i << endl; 7
} 10

14
1

Αντικειμενοστραφής Προγραμματισμός – Ελεγχόμενη ροή προγράμματος, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά
Μαθήματα στο ΤΕΙ Ηπείρου

Οι εντολές break/continue
• Η εντολή break χρησιμοποιείται σε όλα τα loops, for, while,
do/while.
• Αντίστοιχη με την break είναι η continue, η οποία όμως
διακόπτει την εκτέλεση μόνο του τρέχοντος iteration και όχι
ολόκληρου του loop. Συνεχίζει από το επόμενο iteration.
for (int i = 1; i < 20; i++) { Aποτέλεσμα:
// να μην τυπωθούν οι άρτιοι(ζυγοί) αριθμοί 1
if ( i % 2 == 0) 7
continue; 13
cout << i << endl; 19
}
15
1
Ενότητα 3 : Κλάσεις

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Εισαγωγικά
• Η αντικειμενοστραφής πλευρά της C++ φαίνεται με
την χρήση των αντικειμένων και των κλάσεων στις
οποίες ανήκουν τα αντικείμενα.
• Όλα τα αντικείμενα που έχουν κοινά χαρακτηριστικά
ανήκουν στην ίδια κλάση και κάθε ένα από αυτά
λέγεται ότι είναι “στιγμιότυπο” (instance) της
κλάσης.

5
5
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Παράδειγμα κλάσης
• Κλάση “αυτοκίνητο”: Θεωρεί μια γενική εικόνα του αυτοκινήτου
με κάποια χαρακτηριστικά που υπάρχουν σε όλα τα στιγμιότυπα.
• Συγκεκριμένα, η κλάση αυτοκίνητο πιθανώς να ορίζει ότι είναι
τετράτροχο, έχει τιμόνι, ταχύτητες, πεντάλ και καθίσματα για τους
οδηγούς αλλά δεν ορίζει με σαφήνεια το σχήμα ή τους
μηχανισμούς όλων των εξαρτημάτων, ούτε τα χαρακτηριστικά της
μηχανής (κυβικά, ίπποι, κύλινδροι, κλπ).
• Αυτά είναι χαρακτηριστικά που αφορούν το κάθε αντικείμενο
ξεχωριστά (ή κάποια υποκατηγορία/υποκλάση της κλάσης
“αυτοκίνητο”).
6
6

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Παράδειγμα κλάσης
• Στη C++ η κλάση δηλώνεται με τη λέξη class. Στο παράδειγμα του
αυτοκινήτου, έστω ότι θέλουμε να δηλώσουμε μια κλάση με το όνομα Car:
class Car
{
(δεδομένα/μεταβλητές)
(συναρτήσεις/μέθοδοι)
};

7
7
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

member variables
• Τα χαρακτηριστικά του αντικειμένου είναι τα δεδομένα γύρω
από τα οποία πρέπει να αναπτύξουμε το πρόγραμμά μας.
• Στο παράδειγμα με το αυτοκίνητο, τα δεδομένα αυτά είναι η
γωνία στρέψης του τιμονιού, η πίεση που ασκούμε στα
πεντάλ, η θέση του μοχλού ταχυτήτων και άλλα.
• Στον προγραμματισμό, αυτά τα δεδομένα θα πρέπει να
μοντελοποιηθούν, δηλαδή να γίνει η αντιστοιχία τους σε
μεταβλητές τις οποίες μπορούμε να επεξεργαστούμε στο
πρόγραμμά μας.

8
8

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

member variables
class Car
{
// Γωνία στρέψης του τιμονιού
float steering_angle;
// Ποσοστό πατήματος του γκαζιού (0 = καθόλου, 100 = τερματισμένο!)
float gas_pedal;
// Ποσοστό πατήματος του φρένου (0 = καθόλου, 100 = τερματισμένο!)
float break_pedal;
// Ποσοστό πατήματος του συμπλέκτη (0 = καθόλου,
// 100 = τερματισμένο!)
float clutch;
// θέση της τρέχουσας ταχύτητα (πιθανές τιμές: 0, 1,2,3,4,5,
// 0 = νεκρό, -1 = όπισθεν)
int gear;
// μεταβλητές που καθορίζουν την επιτάχυνση, την ταχύτητα του
// αυτοκινήτου και τις στροφές του κινητήρα
float acceleration, speed, rpm;
} 9
9
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

member variables
• Εδώ πρέπει να σημειωθεί ότι οι μεταβλητές της κλάσης έχουν
διαφορετικές τιμές για κάθε αντικείμενο, και κάθε αντικείμενο έχει
πρόσβαση μόνο στις δικές του μεταβλητές.
• Επίσης, ο τύπος δεδομένων που επιλέχθηκε για κάθε μεταβλητή εξαρτάται
από το είδος της πληροφορίας που θα κρατάει αυτή η μεταβλητή. Για
παράδειγμα, εφόσον η γωνία στρέψης του τιμονιού θα είναι σε μοίρες,
είναι λογικό να χρησιμοποιήσουμε ένα τύπο που θα μπορεί να κρατήσει
δεκαδικούς αριθμούς, όπως ο float.
• Αυτά, λοιπόν, είναι τα δεδομένα μας ομαδοποιημένα υπό την έννοια της
κλάσης “Car”.
• Αυτή τη στιγμή δεν είναι τίποτε παραπάνω από μια ομάδα μεταβλητών
χωρίς να έχουμε ορίσει τον τρόπο επεξεργασίας τους. Γι' αυτό είναι
απαραίτητη η ύπαρξη του κατάλληλου interface (member methods) των
δεδομένων με τον χρήστη. 10
1

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

member methods
• Οι μέθοδοι (methods) σε μια κλάση, δεν είναι παρά συναρτήσεις
(υπορουτίνες) που προσφέρουν πρόσβαση στα δεδομένα του
εκάστοτε αντικειμένου της κλάσης.
• Η αλληλεπίδραση του χρήστη με κάθε αντικείμενο γίνεται μέσω
των μεθόδων της κλάσης, οι οποίες καθορίζουν και τον τρόπο
χειρισμού των μεταβλητών του αντικειμένου.
• Στο παράδειγμά μας, οι μέθοδοι θα καθορίζουν με ποιον τρόπο θα
στρίβουμε το τιμόνι, θα αυξάνουμε τη το γκάζι ή το φρένο, θα
αλλάζουμε ταχύτητες αλλά και πώς θα μπορούμε να γνωρίζουμε
την ταχύτητα του αυτοκινήτου, τις στροφές του κινητήρα δηλαδή
πληροφορίες που δε μπορούμε να ελέγξουμε άμεσα.
11
1
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

member methods
Πιθανές μέθοδοι για την κλάση “Car”
// Αλλαγή της γωνία στρέψης του τιμονιού, <relative_angle> μοίρες
// σε σχέση με την τρέχουσα γωνία.
void turn_wheel(float relative_angle);
// Πάτημα πεντάλ γκαζιού
void press_gas_pedal(float amount);
// Πάτημα πεντάλ φρένου
void press_break_pedal(float amount);
// Πάτημα πεντάλ συμπλέκτη
void press_clutch_pedal(float amount);
// Αλλαγή της ταχύτητας. Επιστρέφει true αν η αλλαγή ήταν επιτυχής
// ή false αν ήταν ανεπιτυχής (π.χ. από 5 σε όπισθεν).
bool change_gear(int new_gear);
// προβολή της τρέχουσας ταχύτητας, επιτάχυνσης και στροφών του
// κινητήρα
float get_acceleration();
float get_speed();
float get_rpm(); 12
1

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

member methods
• Οι παραπάνω μέθοδοι, όπου κρίνεται αναγκαίο επιστρέφουν
κάποιο αποτέλεσμα, είτε ως δεκαδικό αριθμό (float) στην
περίπτωση των μεθόδων get_*(), ή ως bool στην
change_gear().
• Ο τύπος void είναι ειδική περίπτωση που δεν επιστρέφει
κάποιο αποτέλεσμα. Χρησιμοποιείται όταν μας ενδιαφέρει η
εκτέλεση κάποιας διαδικασίας χωρίς όμως να είναι
απαραίτητο να γνωρίζουμε το αποτέλεσμά της, ή μπορεί να
μην επιστρέφει κάποιο αποτέλεσμα εξ' αρχής.

13
1
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Υλοποίηση μιας μεθόδου


• Οι παραπάνω είναι απλώς οι δηλώσεις των μεθόδων, δηλαδή
δεν περιέχουν καθόλου κώδικα και πρέπει να τις
συμπεριλαμβάνουμε στον ορισμό της κλάσης.
• Για να είναι ολοκληρωμένος ο ορισμός μιας μεθόδου θα
πρέπει να συνοδεύεται και από την υλοποίησή της
(implementation).
• Η υλοποίηση συνιστάται να γίνεται σε ξεχωριστό αρχείο (το
implementation αρχείο, με κατάληξη .cpp) , για παράδειγμα η
υλοποίηση της turn_wheel() θα μπορούσε να είναι στο
αρχείο car.cpp:
14
1

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Υλοποίηση void Car::turn_wheel(float relative_angle)


{
μιας steering_angle += relative_angle;
if (steering_angle <= -720.0)
μεθόδου steering_angle = -720.0;
if (steering_angle >= 720.0)
steering_angle = 720.0;
}

• Προσθέσαμε και επιπλέον κώδικα ασφαλείας, ο οποίος


απαγορεύει στο τιμόνι να κάνει περισσότερες από 2 στροφές
αριστερά ή δεξιά.
• Το κάθε αντικείμενο πρέπει να θέσει τους δικούς του
περιορισμούς και δικλείδες ασφαλείας με τη μορφή κώδικα
στις μεθόδους. 15
1
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Υλοποίηση μιας μεθόδου


• Στη C++, συνήθως η δήλωση μιας κλάσης, μεταβλητής ή
συνάρτησης γίνεται σε ξεχωριστό αρχείο, το αρχείο κεφαλίδας
του οποίου το όνομα λήγει σε .h ή .hpp, ενώ το αρχείο
ορισμού -δηλαδή το αρχείο που περιέχει τον πηγαίο κώδικα
ορισμού της αντίστοιχης κλάσης, μεταβλητής ή συνάρτησης-
λήγει σε .cpp ή .cxx.
• Δηλαδή για την κλάση Car θα έχουμε δύο αρχεία, το αρχείο
κεφαλίδας Car.h και το αρχείο ορισμού Car.cpp.
• Αυτός ο διαχωρισμός εξυπηρετεί τη γρήγορη χρήση της
κλάσης μέσα σε άλλες κλάσεις ή συναρτήσεις.
16
1

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Δημιουργία αντικειμένων
• Δημιουργία με δύο τρόπους, στατικά και δυναμικά.
• Η στατική δημιουργία γίνεται όπως και ο ορισμός κάποιας
μεταβλητής ενώ η δυναμική γίνεται με τη χρήση της εντολής
new της C++.
new: δημιουργεί μια φυσική αναπαράσταση της κλάσης, ένα
μοναδικό στιγμιότυπο, και αν είναι επιτυχής επιστρέφει ένα
δείκτη (pointer) σε αυτό, διαφορετικά επιστρέφει μηδέν (0).
• Με αυτό το δείκτη μπορούμε να προσπελάσουμε το
αντικείμενο με οποίον τρόπο θέλουμε (και εφόσον το
επιτρέπει το ίδιο το αντικείμενο).
17
1
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Δημιουργία αντικειμένων
• Για την κλάση Car η δημιουργία ενός αντικειμένου στατικά
και δυναμικά γίνεται ως εξής (το αντικείμενο acar
δημιουργείται στατικά, ενώ το anothercar δημιουργείται
δυναμικά):
Car acar();
Car *anothercar = new Car();

• Αν ο constructor δεν παίρνει παραμέτρους μπορούμε να


αποφύγουμε τις παρενθέσεις, δηλαδή το ακόλουθο είναι
ισοδύναμο:
Car acar;
Car *anothercar = new Car;

18
1

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Δημιουργία αντικειμένων
• Όσον αφορά το αντικείμενο anothercar, η δημιουργία του
δεν είναι αναγκαίο να γίνει κατά την δήλωσή του. Το ίδιο
αποτέλεσμα μπορούμε να έχουμε και με τις εντολές:
Car *anothercar;
anothercar = new Car;

19
1
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Δημιουργία αντικειμένων
• Τα δεδομένα του κάθε αντικειμένου (οι μεταβλητές) αλλά και οι
μέθοδοι της κλάσης που αντιστοιχούν στο αντικείμενο, μπορούν να
προσπελλαστούν ως εξής:
// Η γωνία στρέψης του τιμονιού του acar
acar.steering_angle
// Η γωνία στρέψης του τιμονιού του anothercar
anothercar->steering_angle
// Εντολή στο acar να στρίψει δεξιά 13.4 μοίρες.
acar.turn(13.4);
// Επιστρέφει την τρέχουσα ταχύτητα του acar
float speed = acar.get_speed();
// Εντολή στο anothercar να στρίψει αριστερά 32 μοίρες
anothercar->turn(-32.0);
// Εντολή στο anοthercar να βάλει όπισθεν
bool result = anothercar->ghange_gear(-1); 20
2

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Constructors
• Όταν δημιουργείται ένα αντικείμενο (στατικά ή δυναμικά με την
εντολή new), στην πραγματικότητα η C++, αφού δεσμεύσει την
απαραίτητη μνήμη για το αντικείμενο, εκτελεί μια συγκεκριμένη
μέθοδο της κλάσης, τον δημιουργό (constructor).
• Ο δημιουργός πραγματοποιεί τις απαραίτητες ενέργειες για να
καταστεί κάποιο αντικείμενο έτοιμο προς χρήση. Αυτές μπορεί να
είναι κάτι απλό (ρύθμιση μεταβλητών με αρχικές τιμές), ή πιο
περίπλοκο (δημιουργία σύνδεσης με μια βάση δεδομένων,
αρχικοποίηση των πινάκων SQL).
• Ο δημιουργός έχει τη μορφή μιας μεθόδου με το όνομα της κλάσης
και χωρίς τύπο.
21
2
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Constructors
• πχ. πιθανός δημιουργός
Car::Car()
− Ο δημιουργός πραγματοποιεί {
την αρχικοποίηση steering_wheel = 0.0;
(initialization) των μεταβλητών gas_pedal = 0.0;
του αντικειμένου ώστε αυτό break_pedal = 0.0;
να είναι έτοιμο προς χρήση. float clutch = 0.0;
int gear = 0;
− Μπορούμε να έχουμε acceleration = 0.0;
περισσότερους από έναν speed = 0.0;
δημιουργούς, οι οποίοι να rpm = 0.0;
δέχονται διαφορετικές }
παραμέτρους ο καθένας.
22
2

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Constructors
• Αν μπορούσαμε να Car::Car(int cc, int hp)
ορίσουμε χαρακτηριστικά {
του κινητήρα (engine_cc: engine_cc = cc;
κυβικά, engine_hp: ίπποι) engine_hp = hp;
// υπόλοιπες εντολές
στη δημιουργία του
αρχικοποίησης του αντικειμένου
αντικειμένου, θα }
μπορούσαμε να έχουμε
έναν επιπλέον δημιουργό

constructor overloading
23
2
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Destructors
• Ό,τι αντικείμενο δημιουργούμε δυναμικά πρέπει να το
καταστρέφουμε (εντολή delete) ελευθερώνοντας όλους τους
πόρους που δεσμεύσαμε κατά την ύπαρξή του (κλείσιμο
αρχείων, αποσύνδεση από βάσεις δεδομένων, τερματισμός
threads, αποδέσμευση μνήμης, κλπ).
• Η καταστροφή του αντικειμένου γίνεται καλώντας μια μέθοδο
που καλείται καταστροφέας (destructor).
• Το όνομα του destructor είναι το ίδιο με της κλάσης
προπορευόμενο από τον τελεστή ~. Δηλαδή για την κλάση Car,
το όνομα του καταστροφέα είναι ~Car().
24
2

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Ο δείκτης αναφοράς this


• Μέσα σε μια μέθοδο, μπορούμε να χρησιμοποιήσουμε μια
μεταβλητή της κλάσης απλώς με το όνομά της, αναφερόμενοι
στην τιμή που έχει η μεταβλητή για το συγκεκριμένο
αντικείμενο.
• Για το σκοπό αυτό μπορούμε να χρησιμοποιήσουμε τη
μεταβλητή this που επιστρέφει πάντα ένα δείκτη στο τρέχον
αντικείμενο (δηλαδή αυτό που καλεί την μέθοδο).

25
2
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Ο δείκτης αναφοράς this


• Με το δείκτη this, η μέθοδος turn_wheel() που είδαμε
παραπάνω μετασχηματίζεται ως εξής:
void turn_wheel(float relative_angle)
{
this->steering_angle += relative_angle;
if (this->steering_angle <= -720.0)
this->steering_angle = -720.0;
if (this->steering_angle >= 720.0)
this->steering_angle = 720.0;
}

• Δείκτης this, ιδιαίτερα χρήσιμος ειδικά σε περιπτώσεις


διαχείρισης περισσότερων από ένα όμοιων αντικειμένων στην
ίδια μέθοδο. 26
2

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Method Overloading
• Σε ένα πρόγραμμα, υπάρχει περίπτωση να χρειαστεί να
εκτελέσουμε την ίδια διαδικασία με ελαφρώς διαφορετικά
δεδομένα.
• Αυτό συνήθως σημαίνει ότι θα χρειαστεί να έχουμε
διαφορετικές συναρτήσεις/μεθόδους για κάθε διαφορετική
παράμετρο που δίνουμε.
• Για παράδειγμα, ας υποθέσουμε ότι ο χρήστης καλεί την
μέθοδο turn_wheel() με παράμετρο ένα int αντί για float.
Σε μια γλώσσα όπως η C θα έπρεπε να έχουμε δύο
συναρτήσεις/μεθόδους, μια για κάθε διαφορετική παράμετρο
και μάλιστα με διαφορετικό όνομα… 27
2
Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Method Overloading
void Car::turn_wheel_int(int relative_angle)
{
this->steering_angle += (float) relative_angle;
if (this->steering_angle <= -720.0)
this->steering_angle = -720.0;
if (this->steering_angle >= 720.0)
this->steering_angle = 720.0;
}
void Car::turn_wheel_float(float relative_angle)
{
steering_angle += relative_angle;
if (steering_angle <= -720.0)
steering_angle = -720.0;
if (steering_angle >= 720.0)
steering_angle = 720.0;
} 28
2

Αντικειμενοστραφής Προγραμματισμός – Κλάσεις, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Method Overloading
• Η τεχνική του method overloading, επιτρέπει τον ορισμό διάφορων
παραλλαγών μιας μεθόδου αναλόγως τις ζητούμενες παραμέτρους
που δέχεται αυτή.
void Car::turn_wheel(float relative_angle)
{
steering_angle += relative_angle;
if (steering_angle <= -720.0)
steering_angle = -720.0;
if (steering_angle >= 720.0)
steering_angle = 720.0;
}
void Car::turn_wheel(int relative_angle)
{
turn_wheel((float) relative_angle);
} 29
2
Ενότητα 4 : Πίνακες

Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Εισαγωγικά
• Οι πίνακες υλοποιούνται είτε ως παραδοσιακοί πίνακες (όπως στη
C) είτε ως αντικείμενα.
• Μπορούν να είναι μίας ή πολλών διαστάσεων και ο τρόπος
προσπέλασης των στοιχείων είναι ο ίδιος με αυτόν της C.
type table[size];

• Ως type θεωρούμε τον τύπο δεδομένων των αντικειμένων του


πίνακα (bool, char, short, int, long, float, double,
char) είτε το όνομα μιας κλάσης αντικειμένων.
• Το size απεικονίζει το μέγεθος του πίνακα table.

5
5
Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Εισαγωγικά
• Mπορούμε να προσπελλάσουμε τα στοιχεία του πίνακα με την
σύνταξη table[i], όπου i η θέση του στοιχείου που μας
ενδιαφέρει.
• Αν έχουμε έναν πίνακα A με 10 στοιχεία το πρώτο στοιχείο είναι το
A[0] και το τελευταίο το A[9].
• Λαμβάνουμε το μέγεθος του με χρήση της συνάρτησης sizeof()
(επιστρέφει το μέγεθος σε bytes και όχι σε στοιχεία του πίνακα).

6
6

Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Εισαγωγικά
• Mπορούμε να προσπελλάσουμε τα στοιχεία του πίνακα με την
σύνταξη table[i], όπου i η θέση του στοιχείου που μας
ενδιαφέρει.
• Αν έχουμε έναν πίνακα A με 10 στοιχεία το πρώτο στοιχείο είναι το
A[0] και το τελευταίο το A[9].
• Λαμβάνουμε το μέγεθος του με χρήση της συνάρτησης sizeof()
(επιστρέφει το μέγεθος σε bytes και όχι σε στοιχεία του πίνακα).

7
7
Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Εισαγωγικά
int data[10];
int datasize = sizeof(data) / sizeof(int);
int i;
cout << “Size of array data: “ << sizeof(data) / sizeof(int) << endl;
for (i = 0; i < datasize; i++) {
data[i] = i*i;
cout << “data[“ << i << “] = “ << data[i] << endl;
}

o Σε περίπτωση που θέλουμε να αρχικοποιήσουμε ένα


Size of array data: 10
πίνακα, δηλαδή να ορίσουμε αρχικές τιμές για τα data[0] = 0
στοιχεία του, αυτό μπορούμε να το πετύχουμε με την data[1] = 1
εξής συντακτική δομή: data[2] = 4
data[3] = 9
int dataset[] = data[4] = 16
{22,3,54,43,199,20,20,67,7,80 }; data[5] = 25
data[6] = 36
data[7] = 49
data[8] = 64
data[9] = 81 8
8

Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Πολυδιάστατοι πίνακες
• Ένας δισδιάστατος πίνακας μπορεί να δηλωθεί ως εξής:
int twodim[4][4];
int arraysize = 4;
int i, j, counter = 1;
1 2 3 4
for (i = 0; i < arraysize; i++) {
5 6 7 8
for (j = 0; j < arraysize; j++) {
9 10 11 12
twodim[i][j] = counter;
13 14 15 16
counter++;
cout << twodim[i][j] << “ “;
}
cout << endl;
}

9
9
Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Περισσότερα για τα Strings


• Αντίθετα με τα strings σε άλλες γλώσσες προγραμματισμού
(C, PASCAL) που είναι απλώς πίνακες χαρακτήρων, στη C++ τα
strings είναι κανονικά αντικείμενα, που υλοποιούνται με την
κλάση string (στο namespace std).
• Για λόγους συμβατότητας με τη C, υπάρχει πλήρης
υποστήριξη των strings υπό την μορφή πινάκων χαρακτήρων
(char * ή char []).

10
1

Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Περισσότερα για τα Strings


• Πέρα από την απευθείας χρήση τους (που είδαμε στην cout), μπορούμε
να δημιουργήσουμε αντικείμενα string, με τον ίδιο τρόπο όπως και με
κάθε άλλο αντικείμενο, δηλαδή στατικά ή δυναμικά (με τη χρήση της
new).
std::string str(“Hello”);
std::string str2 = “ there”;
std::string *str3 = new
std::string(“Hello there”);
cout << str << str2 << endl;
cout << *str2 << endl;

• Η κλάση string παρέχει ορισμένες μεθόδους, οι οποίες είναι αρκετά


χρήσιμες για επεξεργασία του κειμένου μέσα στο string.
11
1
Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

Περισσότερα για τα Strings


Όνομα Λειτουργία
int length() Επιστρέφει το μήκος (σε χαρακτήρες) του string.

reference operator[](int index) Επιστρέφει ένα δείκτη αναφοράς (reference) στον


χαρακτήρα που βρίσκεται στη θέση index του string.
int compare(string &str) Συγκρίνει δύο αντικείμενα string. Αν το καλόν
αντικείμενο (δηλ. αυτό που καλεί την compare()) είναι
μικρότερο από το str, τότε επιστρέφει αρνητικό
αποτέλεσμα, μηδέν αν έχουν το ίδιο περιεχόμενο, ή
θετικό αποτέλεσμα αν το καλόν string είναι
μεγαλύτερο από το str.
int find(string &str) Αναζητά το str μέσα στο καλόν αντικείμενο string.
Αν βρεθεί επιστρέφει τη θέση της πρώτης εμφάνισής
του, αλλιώς -1.
int find_last_of(string str) Αναζητά το str μέσα στο καλόν αντικείμενο string.
Αν βρεθεί επιστρέφει τη θέση της τελευταίας
εμφάνισής του, αλλιώς -1.
12
1

Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

string str1(“Hello there, from C++!”); 1/2


string str2 = “One two three four”;
string str3 = “C++ strings are cool!”;
string *str4 = new string(str3);
int index, result;
cout << “str1 is “ << str1.length() << “ characters long.”);
for (int i=0; i < str1.length(); i++)
cout << str1[i] << “|“; else 2/2
cout << endl; cout << “'C++' does not exist in str1“ <<
if (str3 == *str4) endl;
cout << “str3 == str4” << endl; index = str2.find(“C++”);
else if (index != -1)
cout << “str3 != str4” << endl; cout << “'C++' exists in str2 in position “
if (str3 == str2) << index << endl;
cout << “str3 == str2” << endl; else
else cout << “'C++' does not exist in str2“ <<
cout << “str3 != str2” << endl; endl;
result = str3.compare(str1); index = str3.find(“C++”);
if (result < 0) if (index != -1)
cout << “str3 < str1” << endl; cout << “'C++' exists in str3 in position “
else if (result == 0) << index << endl;
cout << “str3 == str1” << endl; else
else cout << “'C++' does not exist in str3“ <<
cout << “str3 > str1” << endl; endl;
index = str1.find(“C++”);
if (index != -1)
cout << “'C++' exists in str1 in position “ << index << endl;

13
1
Αντικειμενοστραφής Προγραμματισμός – Πίνακες, Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου

• Αποτέλεσμα
str1 is 22 characters long.
H|e|l|l|o| |t|h|e|r|e|,| |f|r|o|m|
|C|+|+|!|
str3 == str4
str3 != str2
str3 < str1
'C++' exists in str1 in position 18
'C++' does not exist in str2
'C++' exists in str3 in position 0

14
1

Ενότητα 5 : Δομή Προγράμματος C++


Αντικειμενοστραφής Προγραμματισμός – Δομή Προγράμματος , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Η ρουτίνα main()
• Η ρουτίνα main() μπορεί να βρίσκεται σε οποιοδήποτε αρχείο πηγαίου
κώδικα του προγράμματός μας, αλλά μπορεί να είναι μόνο μία για κάθε
εκτελέσιμο πρόγραμμα. #include <iostream>
int main(int argc, char *argv[]) {
std::cout << “hello everyone” << std::endl;
}

• Με την εντολή #include εισάγουμε την κεφαλίδα iostream που δηλώνεται η


χρήση των βασικών stream εισόδου και εξόδου της C++, των cin, cout και cerr
αντίστοιχα.
• Όσον αφορά την int αναφέρεται στο ότι η ρουτίνα main() επιστρέφει στο
λειτουργικό σύστημα έναν κωδικό επιτυχίας ή αποτυχίας εκτέλεσης του
προγράμματος. O κωδικός αυτός είναι μηδέν (0) για επιτυχή εκτέλεση του
προγράμματος και μή μηδενικό (5, 10, ή άλλο) σε περίπτωση ελεγχόμενου
τερματισμού του προγράμματος.
5
5

Αντικειμενοστραφής Προγραμματισμός – Δομή Προγράμματος , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Η ρουτίνα main()
• Οι παράμετροι argc,argv περιέχουν τις παραμέτρους με τις οποίες
καλείται το πρόγραμμα από την γραμμή εντολών.
• Ο λόγος που έχουμε δύο παραμέτρους είναι ότι ένας πίνακας στη C/C++
δεν παρέχει κάποιο εύκολο τρόπο πληροφόρησης του μεγέθους του.
• Έτσι ενώ ο πίνακας argv[] περιέχει τις παραμέτρους σε strings της C
(ακολουθίες χαρακτήρων char και όχι αντικείμενα string), δεν είναι
δυνατό να γνωρίζουμε το πλήθος αυτών των παραμέτρων χωρίς την argc.

6
6
Αντικειμενοστραφής Προγραμματισμός – Δομή Προγράμματος , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Η ρουτίνα main()
• Το cout είναι το stream που αντιστοιχεί στη πρότυπη έξοδο
(standard output) όπου τυπώνονται τα μηνύματα (την ίδια
λειτουργία σε άλλες γλώσσες έχουν εντολές όπως print, printf,
write, κλπ).
• Το endl συμβολίζει το χαρακτήρα νέας γραμμής (new line) και έχει
ακριβώς την ίδια λειτουργία με την εκτύπωση του χαρακτήρα “\n”
(για την ακρίβεια κάνει και flush το stream εξόδου).

7
7

Αντικειμενοστραφής Προγραμματισμός – Δομή Προγράμματος , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Η ρουτίνα main()
• Tο cout και το endl έχουν το πρόθεμα std με διπλές άνω και κάτω
τελείες “::”.
• Το πρόθεμα αυτό συμβολίζει το namespace στο οποίο ανήκει το
αντικείμενο stream cout και το endl, δηλαδή το πεδίο ισχύος τους.
• Αν ο κώδικάς μας ανήκε στο ίδιο namespace std, δε θα ήταν αναγκαία η
χρήση του προθέματος “std::”, αλλά το συγκεκριμένο namespace είναι
ήδη καθορισμένο και δεν συνιστάται η τροποποίηση ή προσθήκη άλλων
κλάσεων ή αντικειμένων.
• Οποιαδήποτε χρήση αντικειμένου εκτός κάποιου namespace απαιτεί το
πρόθεμα του ονόματος του namespace (στην προκειμένη περίπτωση το
std) ακολουθούμενο από '::'.
8
8
Αντικειμενοστραφής Προγραμματισμός – Δομή Προγράμματος , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Η ρουτίνα main()
• Εναλλακτικά, θα μπορούσαμε να χρησιμοποιήσουμε στην αρχή του
προγράμματος (εκτός της ρουτίνας main()) την εντολή
using namespace std;

ώστε να μετασχηματιστεί το πρόγραμμά μας στο εξής:

using namespace std;


#include <iostream>
int main(int argc, char *argv[]) {
cout << “hello everyone” << endl;
}

• Τα δύο προγράμματα είναι απολύτως ισοδύναμα.


9
9

Αντικειμενοστραφής Προγραμματισμός – Δομή Προγράμματος , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Παράμετροι της main()


#include <iostream>
C:\> ArgsExample hello mate “what's up?”
using namespace std;
ArgsExample
int main(int argc, char *argv[]) {
hello
for (int i=0; i < argc; i++)
mate
cout << argv[i] << endl;
what's up?
}

• 4 παράμετροι (ArgsExample, hello, mate και “what's up?”) τις οποίες


τυπώνει μία σε κάθε γραμμή. Στη C/C++ η πρώτη παράμετρος (argv[0])
είναι πάντα το όνομα του προγράμματος που εκτελείται.
• Οι παράμετροι γενικά χωρίζονται με κενούς χαρακτήρες (space, tab) εκτός
αν περικλείονται ανάμεσα σε εισαγωγικά “”, οπότε θεωρούνται και οι
κενοί χαρακτήρες μέρος της παραμέτρου (όπως και με τη παράμετρο
“what's up?” πιο πάνω).
10
1
Ενότητα 6 : Προχωρημένα θέματα (1/2)

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Encapsulation
• Ας ορίσουμε μια κλάση Person η οποία θα περιέχει
ορισμένες πληροφορίες για ένα άτομο, όπως π.χ. το όνομά
του, την ηλικία του, το τηλέφωνό του και τη διεύθυνση email
του.
• Μια τέτοια κλάση μπορεί να χρησιμοποιηθεί π.χ. σε ένα
πρόγραμμα ατζέντας ή ακόμη και ως βάση σε πρόγραμμα
πελατολογίου, ασθενών, κλπ.

5
5
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Encapsulation
class Person
{
public:
// οι μεταβλητές της κλάσης
string Firstname_, Lastname_;
int Age_;
string Telephone_;
string Email_;
// ο constructor
Person(string fname, string lname, int age, string tel, string email)
{
Firstname_ = fname;
Lastname_ = lname;
Age_ = age;
Telephone_ = tel; Παρατήρηση: Tα ονόματα των μεταβλητών της κλάσης λήγουν σε
Email_ = email; “_”. Kάτι τέτοιο δεν είναι αναγκαίο, είναι όμως μια συνηθισμένη
} πρακτική και βοηθάει στην αναγνώριση και διαχωρισμό των
απλών μεταβλητών από τις μεταβλητές μέλη μιας κλάσης.
} 6
6

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Encapsulation
• Αφού ορίσαμε την κλάση, μπορούμε να προχωρήσουμε στην δημιουργία
κάποιων αντικειμένων της κλάσης:
Person bilbo(“Bilbo”, “Baggins”, 111, “+306970123456”,
“bilbobaggins@theshire.net”);
• Με αυτόν τον τρόπο, δημιουργήσαμε το αντικείμενο bilbo που
αντιστοιχεί στο άτομο Bilbo Baggins, 111 ετών με τηλ. 306970123456 και
email bilbobaggins@theshire.net.
• Όπως είναι οι πληροφορίες που περιγράφουν το άτομο, είναι
προσβάσιμες σε όλους.
• Αυτό σημαίνει ότι αν με κάποιον τρόπο αποκτήσουμε πρόσβαση στο
αντικείμενο bilbo, θα μπορούμε να αλλάξουμε οποιαδήποτε πληροφορία
θελήσουμε και με οποιονδήποτε τρόπο.
7
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Encapsulation
• Και μάλιστα με πολύ απλό τρόπο:
bilbo.Firstname_ = “μπίλμπο”;
bilbo.Lastname_ = “μπαγκινσόπουλος”;
bilbo.Age_ = 3;
bilbo.Email_ = “this is definitely not a valid email address”;
bilbo.Telephone_ = “yeah, try to call this”;

Πρόκειται για τρανή παραβίαση των προσωπικών δεδομένων!!!

• Πώς μπορούμε να αποφύγουμε τέτοιου είδους μη προβλεπόμενη


μετατροπή των δεδομένων ενός αντικειμένου;

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Encapsulation
• Η C++ έχει σχεδιαστεί γύρω από το μοντέλο του αντικειμενοστραφούς
προγραμματισμού, προβλέπει τον περιορισμό της πρόσβασης των
δεδομένων σε επίπεδα.
• Ένα από τα επίπεδα πρόσβασης είναι η πρόσβαση χωρίς περιορισμό σε
όλους, που ορίζεται με τη λέξη public  ορίζει μια περιοχή δηλώσεως
μεθόδων ή μεταβλητών (γενικότερα μέλη της κλάσης).
• Κάθε μέλος που βρίσκεται στην περιοχή public θα είναι προσβάσιμο από
οπουδήποτε μέσα στην ίδια κλάση ή εκτός της κλάσης.
• Το αντίστροφο, δηλαδή ο περιορισμός της πρόσβασης γίνεται με τη χρήση
της λέξης private. Η private περιορίζει την πρόσβαση των μεταβλητών
ή των μεθόδων που βρίσκονται στην αντίστοιχη περιοχή, μόνο στην
συγκεκριμένη κλάση (και φυσικά σε αντικείμενα αυτής).
9
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Encapsulation
• Η κλάση Person, με τη χρήση της private, θα μετασχηματιστεί ως εξής:
class Person
{
private:
// οι μεταβλητές της κλάσης
private string Firstname_, Lastname_;
private int Age_;
private string Telephone_;
private string Email_;
public:
...

• Αυτό όμως σημαίνει ότι δεν θα είναι πλέον δυνατή η πρόσβαση σε


οποιαδήποτε πληροφορία του ατόμου ακόμη και για απλή ανάγνωση!
• Κάτι τέτοιο δεν είναι επιθυμητό και πρέπει να βρεθεί τρόπος να επιτραπεί
έστω και ελεγχόμενη πρόσβαση στα δεδομένα.
1

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Encapsulation
• Aυτό επιτυγχάνουμε με την χρήση των μεθόδων της κλάσης.
• Ελεγχόμενη πρόσβαση για ανάγνωση αλλά και μετατροπή των
δεδομένων.
• Συνήθως και για τις περισσότερες περιπτώσεις κλάσεων, αρκεί ο
ορισμός ενός ζεύγους μεθόδων για κάθε μεταβλητή της κλάσης,
μία για ανάγνωση και μια για μετατροπή της τιμής της μεταβλητής
(ένα ζεύγος getter/setter όπως λέγονται συχνά).

1
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Encapsulation
Για την κλάση Person παραθέτουμε πιθανές μεθόδους get/set για ορισμένες από τις
μεταβλητές (Age_ και Email_)
// Return the age } else
int Person::getAge() return false;
{ }
return Age_; // method to set the email address
} bool Person::setEmail(string Email)
// return the Email address {
string Person::getEmail() // call a helper method to check the validity of the
{ email
return Email_; // address (if it's in the form x@y.z).
} // Ideally, the email address should be a class on its
// method to set the age of the person own.
bool Person::setAge(int Age) if (isValid(Email) == true)
{ {
// check if given Age is non-negative (> 0) Email_ = Email;
if (Age > 0) return true;
{ } else
Age_ = Age; return false;
return true; }

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Encapsulation
• Βλέπουμε πώς ελέγχεται πλέον η πρόσβαση στις μεταβλητές.
• Η μεταβλητή που κρατά τη διεύθυνση email του ατόμου, για παράδειγμα,
αλλάζει μόνο αν έχουμε δώσει μια έγκυρη διεύθυνση email (της μορφής
x@y.z).
• Με τον ίδιο τρόπο που περιορίζουμε την πρόσβαση σε μεταβλητές
μπορούμε να περιορίσουμε την πρόσβαση και σε μεθόδους.
• Θα μπορούσαμε π.χ. να έχουμε μια μέθοδο που να ελέγχει αν ο αριθμός
τηλεφώνου του ατόμου είναι έγκυρος, πραγματοποιώντας αναζήτηση σε
κάποια βάση δεδομένων.
• Μια τέτοια μέθοδος δεν θα θέλαμε να είναι προσβάσιμη από
οποιονδήποτε εκτός της κλάσης, παρά μόνο σε άλλες μεθόδους της ίδιας
της κλάσης (π.χ. στην μέθοδο setTelephone()).
1
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Inheritance
• Στην κληρονομικότητα μια κλάση κληρονομεί τα χαρακτηριστικά μιας
υπάρχουσας κλάσης και προσθέτει καινούρια ή τροποποιεί τα ήδη
υπάρχοντα.
• Η κλάση Person ορίζει χαρακτηριστικά που περιγράφουν ένα άτομο αλλά
δεν προβλέπει επιπλέον πληροφορίες (φύλο, δουλειά, διεύθυνση
εργασίας κλπ).
• Πρόβλημα: Δεν μπορούμε να προβλέψουμε όλες τις πιθανές
πληροφορίες και να τις εισάγουμε στην κλάση Person γιατί οι
περισσότερες θα έμεναν αναπάντητες και κάτι τέτοιο θα οδηγούσε σε
σπατάλη χώρου (αφού θα έπρεπε να καταχωρήσουμε όλες τις
πληροφορίες που θα ήταν κενές).

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Inheritance
• Χρήσιμο να έχουμε μια κοινή βάση και να κρατάμε επιπλέον
πληροφορίες μόνο όταν τις χρειαζόμαστε.
• Έστω ότι η κοινή βάση είναι η κλάση Person και θέλουμε να
μελετήσουμε τις περιπτώσεις να είναι κάποιος υπάλληλος (Clerk) ή
δάσκαλος (Teacher).
• Και οι δύο κατηγορίες ατόμων μοιράζονται κοινά χαρακτηριστικά
που θεωρούμε ότι περιέχονται στην κλάση Person.
• Μπορούμε δηλαδή να ορίσουμε δύο νέες κλάσεις που θα
κληρονομούν την κλάση Person.

1
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα

{ στο ΤΕΙ Ηπείρου


private:

Inheritance string JobTitle_;


string CompanyName_;
string JobAddress_;
string JobEmail_;
string JobTel_;
string JobFax_;
• Η δήλωση της public:
string JobDescription_;

κληρονομικότητας μιας Clerk(string fname, string lname, int age, string tel,
string email, string jobtitle, string companyname,
κλάσης γίνεται ως εξής string jobaddress, string jobemail,
string jobtel, string jobfax,
(ορίζουμε ταυτόχρονα και {
string jobdescription)

την πρόσβαση στις Firstname_ = fname;


Lastname_ = lname;
μεταβλητές και τον Age_ = age;
Telephone_ = tel;
δημιουργό της κλάσης) Email_ = email;
JobTitle_ = jobtitle;
CompanyName_ = companyname;
JobAddress_ = jobaddress;
JobEmail_ = jobemail;
JobTel_ = jobtel;
JobFax = jobfax;
JobDescription_ = jobdescription;
}
// ακολουθούν οι μέθοδοι get/set για κάθε μεταβλητή με τους απαραίτητους ελέγχους...
// η ακόλουθη μέθοδος δίνει συνοπτικές πληροφορίες για τον υπάλληλο.
string getInfo() {
return (getFirstname()+” “+getLastname()
+” works at “+CompanyName_
+”, at “+JobAddress_
+”.\n Email: “+getEmail()+”\n”
+”Tel: “+JobTel_);
}
} 1

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ :Ηπείρου
class Teacher public Person
{

Inheritance private:
string Title_;
string School_;
string SchoolAddress_;
string SchoolTel_;
string CourseName_;

• Αντίστοιχα, ορίζουμε την public:


string CourseDescription_;

κλάση Teacher: Teacher(string fname, string lname, int age, string tel,
string email, string title, string school,
string schooladdress, string schooltel,
{
Firstname_ = fname;
Lastname_ = lname;
Age_ = age;
Telephone_ = tel;
Email_ = email;
Title_ = title;
School_ = school;
SchoolAddress_ = schooladdress;
SchoolTel_ = jobtel;
CourseName_ = coursename;
CourseDescription_ = coursedescription;
}
// ακολουθούν οι μέθοδοι get/set για κάθε μεταβλητή με τους απαραίτητους ελέγχους...
...
// Η ακόλουθη μέθοδος δίνει συνοπτικές πληροφορίες για τον
// καθηγητή.
string getInfo() {
return (getFirstname()+” “+getLastname()
+” teaches “+CourseName_+” at “+School_
+”, “+SchoolAddress_+”.\n”
+”Email: “+getEmail()+”\n”
+”Tel: “+SchoolTel_);
}
}

1
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Inheritance
• Παρατήρηση
– Χρησιμοποιήσαμε τις μεθόδους get() της κλάσης Person για την
πρόσβαση στις μεταβλητές της (εφόσον είναι δηλωμένες private).
• Xρησιμότητα
Person bilbo(“Bilbo”, “Baggins”, 111, “+306970123456”, “bilbobaggins@theshire.net”);

Clerk sam( “Samwise”, “Gamgee”, 33, “+30697654321”, “samgamgee@theshire.net”,


“Gardener”, “Baggins Inc.”, “Bag End, Hobbiton, The Shire”, “gardener@baggins.com”,
“+302103456789”, “+302103456780”, “Garden Dept. Director”);

Teacher pippin( “Peregrin”, “Took”, 27, “+30690090090”, “pippin@theshire.net”, “Dr.”,


“King's College”, “Hobbiton”, “+30210000001”, “Philosophy”, “Deal with the important
matters of life, eg. what do we eat?”);

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Inheritance
• Μπορούμε να χρησιμοποιήσουμε για κάθε ένα από αυτά τα αντικείμενα,
πέρα από τις μεθόδους της κλάσης στην οποία ανήκει, και τις μεθόδους
της γονικής κλάσης:
cout << “bilbo has email address: ” << bilbo.getEmail()) << endl;

αυτή η εντολή θα τυπώσει:


bilbo has email address: bilbobaggins@shire.net

• Ενώ η εντολή:
cout << “sam works as a “ << sam.getJobTitle() << “ at “
<< sam.getCompanyΝame()) << endl;

θα τυπώσει:
sam works as a Gardener at Baggins Inc.
1
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Inheritance
• Παράλληλα, η εντολή:
cout << “pippin teaches “ << pippin.getCourseName() << “ at “
<< pippin.getSchool()) << endl;

θα τυπώσει:
pippin teaches Philosophy at King's College

• Τέλος, οι εντολές:
cout << “sam's private telephone is “ << sam.getTel() << endl;
cout << “pippin is “ << pippin.getAge() << “ years old” << endl;

• θα τυπώσουν:
sam's private telephone is +30697654321
pippin is 27 years old

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (1/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Inheritance
• Καλέσαμε μεθόδους της κλάσης Person και από τα τρία
αντικείμενα Κληρονομικότητα κλάσεων!
• Επαναχρησιμοποίηση κώδικα με απλή επέκταση (code
reusability).
• Έχοντας μερικές κλάσεις με ορισμένα μόνο τα βασικά
χαρακτηριστικά, μπορούμε αναλόγως το πρόγραμμα που
πρέπει να υλοποιήσουμε να προσθέσουμε ή να
τροποποιήσουμε χαρακτηριστικά κατά βούληση, ώστε να
επιτύχουμε το επιθυμητό αποτέλεσμα.

2
Ενότητα 7 : Προχωρημένα θέματα (2/2)

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Τί γίνεται όμως αν θέλουμε να αλλάξουμε τη λειτουργία μιας
μεθόδου στην νέα κλάση που υπάρχει και στην παλιά;
• Στο προηγούμενο μάθημα, η νέες κλάσεις ορίζουν μια
μέθοδο την getInfo(), η οποία επιστρέφει πληροφορίες για
τον υπάλληλο ή τον δάσκαλο αντίστοιχα.
• Όπως είναι δηλωμένη, η κάθε κλάση προσφέρει τη δική της
εκδοχή αλλά η αρχική Person, δεν έχει ορισμένη μια τέτοια
μέθοδο getInfo().

5
5
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Αν η getInfo() οριστεί και για την κλάση Person, π.χ. ως εξής:
string Person::getInfo() {
return (getFirstname()+” “+getLastname()
+”is “+getAge()+” years old”);
}

τότε δημιουργείται το εξής ερώτημα:


ποια εκδοχή της getInfo() θα καλείται για κάθε αντικείμενο;

6
6

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Στη συγκεκριμένη περίπτωση θα είναι αδύνατη η μεταγλώττιση των
κλάσεων Clerk και Teacher.
• Η C++ δεν επιτρέπει το override των μεθόδων χωρίς ειδική άδεια.
• Η άδεια αυτή δίνεται με τη λέξη virtual, δηλαδή η μέθοδος ορίζεται ως
δυνητική, και ο ορισμός της θα μετατραπεί ως εξής:
virtual string getInfo() {
return (getFirstname()+” “+getLastname()
+”is “+getAge()+” years old”);
}

7
7
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Με την αλλαγή αυτή, θα καλείται κάθε φορά η getInfo() της κλάσης
που ανήκει το αντικείμενο από το οποίο καλούμε την μέθοδο.
• Για παράδειγμα, ο ακόλουθος κώδικας:
cout << bilbo.getInfo() << endl;
cout << sam.getInfo() << endl;
cout << pippin.getInfo() << endl;

θα παράγει
Bilbo Baggins is 111 years old
Samwise Gamgee works at Baggins Inc., at Bag End, Hobbiton, The Shire.
Email: gardener@baggins.com
Tel: +302103456789
Peregrin Took teaches Philosophy at King's College, Hobbiton.
Email: pippin@theshire.net
Tel: +30210000001
8
8

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Καλέσαμε την ίδια μέθοδο και για τα τρία αντικείμενα (getInfo()) η
οποία όμως ορίζεται και στις τρεις κλάσεις.
• Η γονική κλάση Person ορίζει την getInfo() με έναν απλό τρόπο (“Bilbo
Baggins is 111 years old”) και η ίδια θα χρησιμοποιούνταν στις
κλάσεις Clerk και Teacher αν δεν ορίζονταν και εκεί.
• Aν δεν ορίζαμε την getInfo() στην κλάση Clerk, η getInfo() για το
αντικείμενο sam θα επέστρεφε “Samwise Gamgee is 33 year old”.
• Επειδή όμως η κλάση Clerk περιέχει περισσότερες πληροφορίες που
πρέπει να απεικονιστούν με την getInfo(), η τελευταία επαναορίστηκε,
αποκτώντας νέα λειτουργία.

9
9
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Η τεχνική αυτή καλείται Method Overriding και είναι το
θεμελιώδες χαρακτηριστικό του πολυμορφισμού.
• Η κλάσεις στις οποίες ορίζουμε virtual methods λέγονται
virtual (virtual classes).
• Ο πολυμορφισμός μας δίνει τη δυνατότητα δημιουργίας
αφηρημένων εννοιών/κλάσεων/μεθόδων στις οποίες θα
κολλάμε κάθε φορά τη σωστή υλοποίηση αναλόγως τις
ανάγκες μας.

10
1

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Το ακόλουθο παράδειγμα έχει σκοπό να δείξει πώς ακριβώς
χρησιμοποιούμε τον πολυμορφισμό. Θεωρούμε τα αντικείμενα που
έχουμε ορίσει πριν (bilbo, sam, pippin).
Person* who[3];
who[0] = &bilbo;
who[1] = &sam;
who[2] = &pippin;
for (int i=0; i < who.length; i++)
cout << who[i]->getInfo() << endl;

• Το παραπάνω παράδειγμα θα τυπώσει ό,τι και το προηγούμενο μόνο που


τώρα χρησιμοποιήσαμε έναν πίνακα αντικειμένων Person για να
οργανώσουμε την πληροφορία. Αλλά το αντικείμενο sam είναι τύπου
Clerk και το pippin ανήκει στην κλάση Teacher. Πώς τα καταχωρήσαμε
στον πίνακα who;
11
1
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Απάντηση: Ένα αντικείμενο Clerk είναι ταυτόχρονα και αντικείμενο
Person, όπως και ένα αντικείμενο Teacher είναι επίσης Person. Ένας
Clerk δεν είναι όμως ταυτόχρονα Teacher.
• Έτσι μπορούμε να τα αντιμετωπίζουμε κατά βούληση ως Clerk και
Teacher ή Person, αναλόγως τις ανάγκες μας.
• Ακόμη όμως και αν τα προσπελάσουμε ως Person, η getInfo() του
καθενός θα είναι αυτή που ορίζει η κλάση του.
• Τί γίνεται όμως αν χρειάζεται να καλέσουμε και την γονική μέθοδο
(δηλαδή αυτή που επαναορίζουμε στη νέα κλάση); Στην περίπτωση αυτή
χρησιμοποιούμε την αναφορά στη γονική κλάση καλώντας τον δημιουργό
της.
12
1

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Παράδειγμα: Μετασχηματίζουμε το δημιουργό και τη μέθοδο getInfo()
της κλάσης Teacher στα εξής:
Teacher(string fname, string lname, int age, string tel,
string email, string title, string school,
string schooladdress, string schooltel,
string coursename, string coursedescription)
{
Person(fname, lname, age, tel, email);
Title_ = title;
School_ = school;
SchoolAddress_ = schooladdress;
SchoolTel_ = jobtel;
CourseName_ = coursename;
CourseDescription_ = coursedescription;
}
string getInfo() {
return (Person.getInfo()
+” and teaches “+CourseName_+” at “+School_
+”, “+SchoolAddress_+”.\n”
+”Email: “+getEmail()+”\n”
+”Tel: “+SchoolTel_);
13
}
1
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• Στον δημιουργό αρκεί πλέον να αρχικοποιούμε (initialize) μόνο τα
χαρακτηριστικά που είναι νέα στην κλάση χωρίς να κάνουμε διπλό κόπο
που έχει ήδη γίνει στην γονική κλάση.
• Στην getInfo(), χρησιμοποιούμε την πληροφορία που επιστρέφεται από
τη γονική κλάση και συμπληρώνουμε με τα νέα στοιχεία.
• Παράδειγμα
Αν αλλάζαμε το κείμενο που επιστρέφει η getInfo() της κλάσης Person,
θα άλλαζε αυτόματα και το κείμενο που επέστρεφε η getInfo() της κλάσης
Teacher, εφόσον χρησιμοποιούμε την αναφορά στη κλάση Person.

14
1

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Polymorphism και Virtual Methods


• ΣΗΜΕΙΩΣΗ
– Έχουμε method overriding μόνο όταν η δήλωση της μεθόδου είναι
η ίδια στη γονική και στην θυγατρική κλάση. Δηλαδή ίδιο όνομα,
επιστρεφόμενα δεδομένα και παραμέτρους.
– Αν ένα από αυτά είναι διαφορετικά (εκτός από το όνομα φυσικά) τότε
έχουμε υπερφόρτωση μεθόδου (method overloading).

15
1
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Pure Virtual Classes


• Μερικές φορές μπορεί να θέλουμε να ορίσουμε απλώς μια γενική
δομή κάποιων κλάσεων, χωρίς όμως να προσφέρουμε μια ακριβή
υλοποίηση.
• Να ορίσουμε μια “αφηρημένη” κλάση, που να παρέχει απλώς ένα
πλαίσιο που θα συμπληρώνουν οι θυγατρικές κλάσεις μέσω της
τεχνικής method overriding.
• Αυτό σημαίνει ότι στον ορισμό της κλάσης απλώς θα δηλώνονται
ορισμένες μέθοδοι ως “αφηρημένες” αλλά δεν θα παρέχεται
κάποιος ορισμός γι' αυτές.

16
1

Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Pure Virtual Classes


• Στη C++ οι κλάσεις αυτές καλούνται pure.
• Παράδειγμα αφηρημένης κλάσης η κλάση του αυτοκινήτου.
– Ο μηχανισμός που αλλάζει ταχύτητες σε κάθε αυτοκίνητο είναι
διαφορετικός και διαφέρει ανάμεσα στους κατασκευαστές και
στα διάφορα μοντέλα.
– Όμως ο τρόπος αλληλεπίδρασης (δηλαδή μέσω του μοχλού
ταχυτήτων) είναι καλά ορισμένος έστω και με κάποια
περιθώρια παραλλαγών.

17
1
Αντικειμενοστραφής Προγραμματισμός – Προχωρημένα θέματα (2/2), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Pure Virtual Classes


• Tρόπος ορισμού κλάσης
class Car {
...
// Αλλαγή της ταχύτητας. Επιστρέφει true αν η αλλαγή
ήταν επιτυχής
// ή false αν ήταν ανεπιτυχής (π.χ. από 5 σε όπισθεν).
virtual bool change_gear(int new_gear) = 0;
...
}
class FerrariModena extends Car {
...
bool change_gear(int new_gear) {
// Η συγκεκριμένη υλοποίηση βρίσκεται εδώ
}
...
}
18
1

Ενότητα 8 : Αρχεία και Streams


Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Εισαγωγικά
• Αρχεία: Aκολουθίες χαρακτήρων.
• H C προσφέρει ορισμένες δομές δεδομένων FILE (struct, ο
πρόγονος της κλάσης) και ανεξάρτητες συναρτήσεις που έχουν
πρόσβαση στα αρχεία.
• Η όλη διαδικασία του προγραμματισμού γίνεται με pointers στις
δομές FILE και είναι αρκετά εύκολο να γίνει κάποιο λάθος κατά τη
χρήση τους.
• Επιπλέον δε προσφέρουν καμία από τις ευκολίες του
αντικειμενοστραφούς προγραμματισμού (κληρονομικότητα,
πολυμορφισμό, κλπ).
5
5

Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Εισαγωγικά
• Για το σκοπό αυτό η C++, υιοθέτησε τη χρήση των streams.
• Δεν παρέχεται απευθείας πρόσβαση των δεδομένων των
αρχείων, παρά μόνο ως ανταλλαγή bytes από το πρόγραμμα
προς το αρχείο και αντίστροφα.
• Η χρήση των streams ως ροές δεδομένων από και προς το
αρχείο, έχει το άμεσο όφελος ότι δεν είναι πλέον σημαντικό
το μέσον στο οποίο βρίσκεται το αρχείο αλλά μόνο η
εναλλαγή της πληροφορίας από και πρός το πρόγραμμα.

6
6
Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Εισαγωγικά
• Τέτοιες κλάσεις είναι η fstream και οι πιο συγκεκριμένες
ifstream, ofstream.
– ifstream: αναφέρεται στο άνοιγμα αρχείου μόνο για
ανάγνωση (input file stream)
– ofstream: χρησιμοποιείται μόνο για εγγραφή στο αρχείο
(output file stream)
– fstream: προσφέρει ταυτόχρονα δυνατότητα για
ανάγνωση και εγγραφή

7
7

Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Η κλάση fstream
• Η κλάση fstream (δηλώνεται στο αντίστοιχο αρχείο
κεφαλίδας), προσφέρει αρκετές μεθόδους για:
– ανάγνωση, εγγραφή και μετακίνηση στο αρχείο
– αρκετά flags για τροποποίηση των δεδομένων κατά την
εγγραφή ή την ανάγνωση.

8
8
Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Η κλάση fstream
Όνομα Λειτουργία
bool good() Η good() επιστρέφει true αν το αρχείο είναι σε καλή
bool bad() κατάσταση (αν δεν έχει συμβεί κάποιο σφάλμα
εισόδου/εξόδου) ή false διαφορετικά. Η bad() έχει
την αντίθετη συμπεριφορά.
bool eof() Επιστρέφει true αν έχουμε φτάσει στο τέλος του
αρχείου κατά την ανάγνωση.
void flush() Αποθηκεύει όλες τις αλλαγές που έχουν γίνει στο
αρχείο και δεν βρίσκονται στους buffers του
συστήματος.
int get() Επιστρέφει τον επόμενο χαρακτήρα του αρχείου.
istream & Αντιγράφει από το αρχείο στο πίνακα χαρακτήρων
getline(char *buf, int buf, το μέγιστο num χαρακτήρες εκτός αν φτάσει στο
num) τέλος της γραμμής ή του αρχείου. Επιστρέφει μια
αναφορά στο αρχείο. 9
9

Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

int gcount()
Όνομα
Η κλάση fstream Λειτουργία
Επιστρέφει τον αριθμό των χαρακτήρων που
αναγνώστηκαν κατά την προηγούμενη εκτέλεση των
μεθόδων get(), read().
istream &read(char Αντιγράφει από το αρχείο στο πίνακα χαρακτήρων
*buf, int buf, το μέγιστο num χαρακτήρες εκτός αν φτάσει στο
num) τέλος του αρχείου. Επιστρέφει μια αναφορά στο
αρχείο.
ostream &write(char Αντιγράφει από το πίνακα χαρακτήρων buf στο
*buf, int αρχείο, το μέγιστο num χαρακτήρες. Επιστρέφει μια
num) αναφορά στο αρχείο.
void seekg(int offset, Ορίζει τη τρέχουσα θέση του δρομέα για ανάγνωση
origin) (seekg) ή για εγγραφή (seekp). Τα streams στη C++
void seekp(int offset, χρησιμοποιούν δύο διαφορετικούς δείκτες, ένα για
origin)
ανάγνωση δεδομένων και ένα για εγγραφή.
int tellg() Επιστρέφει την αντίστοιχη θέση του δρομέα για
int tellp() ανάγνωση (tellg) ή για εγγραφή (tellp). 10
1
Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Η κλάση fstream
• Απλό παράδειγμα προγράμματος αντιγραφής δύο αρχείων,
σε δύο εκδοχές:
A. Παράδειγμα προγράμματος αντιγραφής δύο αρχείων
ανά χαρακτήρα (byte)
B. Παράδειγμα προγράμματος αντιγραφής δύο αρχείων
αντιγράφοντας blocks των 256KB κάθε φορά

11
1

Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Η κλάση fstream
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
// Έλεγχος για το αν το πρόγραμμα δέχεται 3 παραμέτρους.
// Σημειώνουμε ότι στη C++ η πρώτη παράμετρος argv[0] είναι
// πάντα το ίδιο το εκτελέσιμο πρόγραμμα.
if (argc != 3) {
cout << "Usage: CopyFile <from> <to>" << endl;
return 0;
}
// Δοκιμάζουμε να ανοίξουμε το αρχείο <from> για ανάγνωση (παράμετρος
// argv[1]).
// Η διαδικασία θα αποτύχει αν το αρχείο δεν υπάρχει ή αν δεν έχουμε
1/2 // πρόσβαση σε αυτό.
ifstream fin(argv[1]);
if (fin == 0) {
cout << "Error: Input file cannot be opened for reading!" << endl;
return 10;
}
// Δοκιμάζουμε να ανοίξουμε το αρχείο <to> για εγγραφή (παράμετρος
// argv[2]).
// Η διαδικασία θα αποτύχει αν δεν έχουμε πρόσβαση ή αν δεν υπάρχει
// χώρος στο δίσκο.
ofstream fout(argv[2]);
if (fout == 0) {
cout << "Error: Output file cannot be opened for writing!" << endl;
return 10; 12
} 1
Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου
// Για να μάθουμε το τέλος του αρχείου, χρησιμοποιούμε τις μεθόδους

Η κλάση fstream
// seekg() και tellg(). Η seekg() αλλάζει την τρέχουσα θέση του αρχείου,
// ενώ η tellg() επιστρέφει αυτή τη θέση.
// Πρακτικά αυτό που κάνουμε είναι να πάμε το δρομέα (cursor) στη θέση που
// έχει offset 0 από το τέλος του αρχείου (ios::end) και να διαβάσουμε τη
// θέση που επιστρέφει η tellg(). Αυτό είναι και το μέγεθος του αρχείου.
fin.seekg(0, ios::end);
size_t finsize = fin.tellg();
cout << "Input file size: " << finsize << endl;
// Επειδή θέλουμε να αντιγράψουμε το αρχείο, επιστρέφουμε τον δρομέα στην
// αρχή του αρχείου, offset 0 bytes από τη θέση ios::beg).
fin.seekg(0, ios::beg);
// Επειδή θέλουμε να αντιγράψουμε το αρχείο, επιστρέφουμε τον δρομέα στην
// αρχή του αρχείου, offset 0 bytes από τη θέση ios::beg).
fin.seekg(0, ios::beg);
2/2 // Θα αντιγράψουμε τώρα τα περιεχόμενα του αρχείου fin στο fout.
// Η αντιγραφή θα γίνει byte προς byte και θα τυπώνουμε την πρόοδο
int c;
int percent = 0;
while (fin.eof() == false) { // έχουμε φτάσει στο τέλος του αρχείου;
c = fin.get(); // διάβασε ένα byte
if (fin.eof() == false) // αν δεν έχουμε φτάσει στο τέλος
fout.put(c); // γράψε το byte
cout << "Copy Completed : " << 100*percent/finsize << "\r";
percent++;
}
fin.close();
fout.close();
return 0; 13
} 1

Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Η κλάση fstream
• Η αντιγραφή ενός αρχείο περίπου 40MB διήρκεσε 20 δευτερόλεπτα. Με
μια μικρή αλλαγή στον κώδικα θα δείξουμε πώς η ίδια διαδικασία μπορεί
να διαρκέσει μόλις 4 δευτερόλεπτα στον ίδιο υπολογιστή και για το ίδιο
αρχείο! Συγκεκριμένα θα αλλάξουμε τον κωδικά του βρόχου while:
// Θα αντιγράψουμε τώρα τα περιεχόμενα του αρχείου fin στο fout.
// Η αντιγραφή θα γίνει ανά block και θα τυπώνουμε την πρόοδο
size_t bufsize = 262144; // το μέγεθος του block
char buf[bufsize]; // ορίζουμε το buffer από bytes
int count; // ο μετρητής των bytes που γράφονται
int total = 0;
while (fin.eof() == false) { // έχουμε φτάσει στο τέλος του αρχείου;
fin.read(buf, bufsize); // διάβασε το πολύ bufsize bytes
count = fin.gcount(); // μέτρα πόσα πραγματικά διαβάστηκαν
if (count) // αν έχει διαβαστεί έστω και 1 byte
fout.write(buf,count); // γράψε τα στο αρχείο fout
cout << "Copy Completed : " << 100*total/finsize << "\r";
total += count;
}
14
1
Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Οι τελεστές <<, >>


• Η fstream προσφέρει έναν πολύ εύχρηστο τρόπο ανταλλαγής
δεδομένων με το αρχείο, μέσω των τελεστών << και >> που
δηλώνουν την κατεύθυνση από (>>) και προς (<<) το αρχείο.
• Τους έχουμε ήδη χρησιμοποιήσει με την πρότυπη έξοδο (κονσόλα)
cout. Αυτό ισχύει γιατί και η cout είναι ένα προκαθορισμένο
αντικείμενο ostream (η γονική κλάση της ofstream) που
αντιστοιχεί στην πρότυπη έξοδο (stdout).
• Αντίστοιχα η πρότυπη είσοδος cin είναι ένα istream (η γονική
κλάση της ifstream) που δίνει πρόσβαση στην stdin, και η πρότυπη
έξοδος λαθών cerr που αντιστοιχεί στην stderr.
15
1

Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Οι τελεστές <<, >>


• Τρόπος χρήσης. Έστω fin,fout δύο αντικείμενα ifstream
και ofstream αντίστοιχα:
#include <fstream> // Δήλωση των μεταβλητών που θα χρησιμοποιηθούν.
#include <iostream> string name;
using namespace std; double age;
int main() { // όσο δεν έχουμε φτάσει στο τέλος του αρχείου
ifstream fin("data.txt"); while (fin.eof() == false) {
if (fin == 0) { // διάβασε κάθε στήλη στην αντίστοιχη μεταβλητή
cout << "Error: could not open file data.txt" fin >> name >> age;
<< endl; if (fin.eof() == false) {
return 10; // τύπωσε τα στην κονσόλα
} cout << "Ο " << name << " είναι " << age << "
ofstream fout("output.txt"); ετών." << endl;
if (fout == 0) { // και γράψε το ίδιο κείμενο στο αρχείο
cout << "Error: could not open file output.txt" output.txt
<< endl; fout << "Ο " << name << " είναι " << age << "
return 10; ετών." << endl;
} }
}
} 16
1
Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Οι τελεστές <<, >>


• Αν το αρχείο data.txt έχει π.χ. τα εξής δεδομένα:
Κώστας 29.7
Νίκος 34.4
Γιαννάκης 6.5
Μαθουσάλας 803.4
• Το αποτέλεσμα του προγράμματος θα αποθηκευτεί στο
αρχείο output.txt και θα είναι:
Ο Κώστας είναι 29.7 ετών.
Ο Νίκος είναι 34.4 ετών.
Ο Γιαννάκης είναι 6.5 ετών.
Ο Μαθουσάλας είναι 803.4 ετών.

17
1

Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Stringstreams
• Στη γλώσσα C, η μορφοποίηση ενός string μέσω
παραμέτρων γίνεται με την εντολή sprintf, που λειτουργεί
με τον ίδιο τρόπο όπως η printf για την πρότυπη έξοδο
(stdout) ή η fprintf για την έξοδο σε αρχείο.
• Αντίστοιχα, η λειτουργία των streams και η ευκολία των
τελεστών << και >> παρέχεται στη C++ και για strings.
• Για το σκοπό αυτό έχει υλοποιηθεί η κλάση stringstream
(στο αρχείο κεφαλίδας sstream), και χρησιμοποιείται όπως
ακριβώς ένα fstream.

18
1
Αντικειμενοστραφής Προγραμματισμός – Αρχεία και , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ
Ηπείρου

Stringstreams
#include <string>
#include <sstream>
#include <iostream> cout << formatted.str();
using namespace std;
int main() {
stringstream formatted;
// Δήλωση των μεταβλητών που θα χρησιμοποιηθούν. Name: one, value: 10
int data[] = {10, 5, 4, 3, 8, 11}; Name: two, value: 5
string names[] = {"one", "two", "three", "four", Name: three, value: 4
"five", "six"};
for (int i=0; i < 6; i++) { Name: four, value: 3
formatted << "Name: " << names[i] << ", value: " Name: five, value: 8
<< data[i] << endl; Name: six, value: 11
}
cout << formatted.str();
}

• Η μέθοδος str() του stringstream “παγώνει” τα περιεχόμενά του και


επιστρέφει ένα αντικείμενο string το οποίο μπορούμε να τυπώσουμε.
19
• Δεν είναι αποδεκτό να τυπώσουμε ένα αντικείμενο stringstream απευθείας.

Ενότητα 9 : Τα πρότυπα (templates)


Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Εισαγωγικά
• Πρότυπα (templates): αποτελεί τη βάση της STL, καθώς επιτρέπουν
τη χρήση πολυμορφισμού κατά τη μεταγλώττιση (compile-time)
αντί κατά την εκτέλεση (runtime), γεγονός που αυξάνει κατά πολύ
την απόδοσή τους, αφού ο μεταγλωττιστής μπορεί να
πραγματοποιήσει αρκετές βελτιστοποιήσεις κατά την
μεταγλώττιση.
• Πρότυπα μπορούν να οριστούν για συναρτήσεις ή για κλάσεις.
• Η λειτουργία είναι ή ίδια, με τη διαφορά ότι αν οριστεί μια κλάση
πρότυπο, η προτυποποίηση ισχύει για κάθε μέθοδο/συνάρτηση
της κλάσης.
5
5

Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Εισαγωγικά
• Σκοπός προτύπων
– Αν σε κάποιο πρόγραμμα χρειαζόμαστε την ταξινόμηση δύο
διαφορετικών συνόλων δεδομένων (π.χ. ένα πίνακα από int και ένα
πίνακα από string) θα χρειαστούμε δύο συναρτήσεις που θα
πραγματοποιήσουν την ταξινόμηση στους πίνακες.
– Κάτι τέτοιο είναι περιττό, επιρρεπές σε λάθη και αιτία αύξησης του
μεγέθους του προγράμματος.
– Αν το πρόγραμμα εξελιχθεί να υποστηρίζει και άλλους τύπους
δεδομένων, ακόμη και κλάσεις, θα χρειαστούμε μια συνάρτηση
ταξινόμησης για κάθε τύπο! Οπωσδήποτε πρέπει να υπάρχει μια
καλύτερη λύση.
6
6
Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Εισαγωγικά
• Λύση
– Nα οριστεί ένα πλαίσιο, ή πρότυπο, το οποίο θα περιγράφει
τον αλγόριθμο, χρησιμοποιώντας μια αφηρημένη κλάση, ο
τύπος της οποίας δε μας ενδιαφέρει παρά μόνο ορισμένα
χαρακτηριστικά που είναι απαραίτητα.
– Π.χ. για τη ταξινόμηση χρειαζόμαστε απλώς μια μέθοδο
σύγκρισης ανάμεσα σε δύο τυχαία αντικείμενα.
Η δήλωση ενός τέτοιου πλαισίου γίνεται με την λέξη-κλειδί
template ακολουθούμενη από το όνομα της αφηρημένης
κλάσης κλεισμένης σε <>.
7
7

Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
#include <iostream> ΤΕΙ Ηπείρου
Παράδειγμα using namespace std;
// Ορίζουμε την κλάση list ως template που θα χρησιμοποιεί την αφηρημένη κλάση
1/3
κλάσης λίστας // data_t (δεν υπάρχει πραγματικά, απλώς
// υποδηλώνει μια οποιαδήποτε κλάση).

αντικειμένων
template<class data_t> class list {
// το item θα είναι κάθε φορά τύπου data_t
data_t item;
// το next είναι δείκτης στο επόμενο αντικείμενο
// της λίστας
list *next;
public:
// ο δημιουργός (δέχεται ένα αντικείμενο data_t)
list(data_t d);
// για να προσθέσουμε ένα αντικείμενο στη λίστα χρησιμοποιούμε την add()
void add(list *node) {
node->next = this;
return;
}
// η get_next() επιστρέφει το επόμενο αντικείμενο στη λίστα
list *get_next() {
return next;
}
// η get_data επιστρέφει το αντικείμενο item. Ο τύπος θα είναι πάντα σωστός
(π.χ. // θα επιστρέφει char αν η data_t είναι char, string, κλπ.
data_t get_data() {
return item;
}
}; 8
8
Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
// Στον ορισμό της κλάσης, απλώς δηλώσαμε τον δημιουργό
ΤΕΙ Ηπείρου

Παράδειγμα // Με τον παρακάτω τρόπο τον ορίζουμε κιόλας. Σημειώστε


// τη χρήση της λέξης template και των brackets <data_t>
2/3
κλάσης λίστας // στο όνομα της κλάσης
template<class data_t> list<data_t>::list(data_t d) {

αντικειμένων
// ορισμός του item στην παράμετρό d
item = d;
// δεν έχουμε επόμενο αντικείμενο (πρώτο στοιχείο
next = 0;
}
int main() {
// Ορισμός ενός αρχικού αντικειμένου list.
// Το ρόλο της αφηρημένης κλάσης data_t παίρνει ο τύπος char
list<char> start('a');
// Δηλώνουμε και δύο δείκτες (pointers) της ίδιας κλάσης
list<char> *p, *last;
// θα χρησιμοποιήσουμε τον δείκτη last για να μετακινούμαστε
// στη λίστα, όσο μεγαλώνει
last = &start;
for (int i=1; i < 26; i++) {
// δημιούργησε ένα καινούριο κόμβο της λίστας με
// αντικείμενο το χαρακτήρα 'a' + i.
// Η δημιουργία είναι δυναμική (προσέξτε τη χρήση της new.
p = new list<char>('a' +i);
// πρόσθεσε το νέο αντικείμενο στον προηγούμενο κόμβο.
p->add(last);
// ο προηγούμενος κόμβος δεν είναι πλέον τελευταίος.
// όρισε τον τρέχοντα κόμβο να φαίνεται τελευταίος.
last = p; 9
} 9

Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Παράδειγμα // ξεκίνα από την αρχή


p = &start;
3/3
κλάσης λίστας
while (p) {
// όσο έχουμε κόμβους στη λίστα (δηλαδή όσο η get_next()
// θα επιστρέφει μη μηδενικό αποτέλεσμα, τύπωσε το αντικείμενο
αντικειμένων // που περιέχεται στον κόμβο.
cout << p->get_data() << ", ";
// προχώρα στον επόμενο κόμβο.
p = p->get_next();
}
cout << endl;
return 0;
}

Το πρόγραμμα αυτό θα τυπώσει το εξής αποτέλεσμα.

a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z,

10
1
Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Standard Template Library (STL)


• Βιβλιοθήκη STL: Σύνολο από έτοιμες κλάσεις και συναρτήσεις
γενικής χρήσης που γλυτώνουν σημαντικό χρόνο από το
προγραμματιστή καθώς προσφέρουν έναν εύκολο τρόπο να
αντιμετωπιστούν τα περισσότερα θέματα γενικής φύσεως σε ένα
πρόγραμμα.
• Έτσι ο προγραμματιστής έχει πλέον τη δυνατότητα να ασχοληθεί
με την ουσία του προβλήματός του, παρά με το ποια ρουτίνα θα
χρησιμοποιήσει για να ταξινομήσει ένα πίνακα από strings.
• Aποτελείται από τρεις κατηγορίες κλάσεων και μεθόδων: τους
containers, τους αλγόριθμους και τους iterators.
11
1

Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Οι κλάσεις containers
• Containers: Αντικείμενα που χρησιμοποιούνται ως “δοχεία” για
άλλα αντικείμενα (οποιουδήποτε είδους) και προσφέρουν
συγκεκριμένα χαρακτηριστικά όσον αφορά το τρόπο πρόσβασης
των αντικειμένων, τον τρόπο αποθήκευσης των αντικειμένων στη
μνήμη, την αντιστοίχιση αντικειμένων σε “κλειδιά” (σχεσιακοί
containers), κλπ.
• Βασικοί containers: vector, list, queue, stack και set, ενώ ορίζονται
και οισχεσιακοί containers οι map, multimap.
• Οι containers επειδή είναι βασισμένοι στα πρότυπα, μπορούν να
περιέχουν αντικείμενα οποιασδήποτε κλάσης.
12
1
Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Οι μέθοδοι algorithms
• Οι containers από μόνοι τους δε θα ήταν ιδιαίτερα χρήσιμοι, όχι
περισσότερο από την ξεχωριστή υλοποίηση κάποιου
προγραμματιστή.
• Αυτό που κάνει την STL να αποδεικνύεται αξεπέραστο εργαλείο
είναι ο συνδυασμός των containers με τους αλγόριθμους
(algorithms).
• Οι αλγόριθμοι είναι απλώς μέθοδοι που έχουν σχεδιαστεί να
λειτουργούν πάνω στα αντικείμενα που περιέχονται στους
containers, χωρίς όμως να απαιτούν κάποιο συγκεκριμένο τύπο,
μόνο κάποια γενικά χαρακτηριστικά.
13
1

Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Οι μέθοδοι algorithms
• Π.χ. για να ταξινομήσουμε τα αντικείμενα ενός container, δεν είναι
ανάγκη να απαιτήσουμε ο container να περιέχει string, απλώς να
ορίζεται η πράξη της σύγκρισης για τα αντικείμενα αυτά (δηλαδή
οι τελεστές <, ==, >).
• Η STL προσφέρει έτοιμους αλγόριθμους για πολλές διαδικασίες,
όπως ταξινόμηση (sort, stable_sort), αντιγραφή αντικειμένων από
τον container με ή χωρίς συνθήκη που πρέπει να πληρείται (copy,
copy_backward, unique_copy, unique_copy_if), ορισμός κάποιας
τιμής στα αντικείμενα (fill, fill_n), εύρεση αντικειμένων στο
container (find, find_end, find_first_of, find_if), καταμέτρηση
αντικειμένων με ή χωρίς συνθήκη (count, count_if), εκτέλεση
κάποιας ρουτίνας για συγκεκριμένα αντικείμενα. 14
1
Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Οι μέθοδοι algorithms
• Αλγόριθμοι διαδικασιών στην STL:
ταξινόμηση (sort, stable_sort), αντιγραφή αντικειμένων από τον container
με ή χωρίς συνθήκη που πρέπει να πληρείται (copy, copy_backward,
unique_copy, unique_copy_if), ορισμός κάποιας τιμής στα αντικείμενα (fill,
fill_n), εύρεση αντικειμένων στο container (find, find_end, find_first_of,
find_if), καταμέτρηση αντικειμένων με ή χωρίς συνθήκη (count, count_if),
εκτέλεση κάποιας ρουτίνας για συγκεκριμένα αντικείμενα (for_each,
transform), πράξεις συνόλων (set_union, set_intersection), εύρεση μεγίστων
και ελαχίστων (max_element, min_element), διαγραφή ή αντικατάσταση
αντικειμένων στο container με ή χωρίς συνθήκη και με ή χωρίς αντιγραφή σε
νέο container (remove, remove_if, remove_copy, remove_copy_if, replace,
replace_if, replace_copy, replace_copy_if), κτλ.
15
1

Αντικειμενοστραφής Προγραμματισμός – Τα πρότυπα ( , Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα στο
ΤΕΙ Ηπείρου

Οι δείκτες iterators
• Κάθε αλγόριθμος δέχεται το αρχικό και το τελικό αντικείμενο του
container στο οποίο θα πραγματοποιηθεί η εργασία ως
παραμέτρους.
• Τα αντικείμενα αυτά δίνονται ως iterators, το τελικό στοιχείο της
STL για να ολοκληρωθεί ως εργαλείο.
• Πρακτικά οι iterators είναι pointers αλλά με κάποια ιδιαίτερη
συμπεριφορά, π.χ. υπάρχουν forward και backward iterators για
μετακίνηση στα αντικείμενα ενός container μόνο προς τη μία
κατεύθυνση, input και output iterators για χρήση σε streams κλπ.

16
1
Ενότητα 10 : Επαναληπτικές Ασκήσεις (1/3)

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση 1
Να δημιουργηθεί μια κατηγορία με το όνομα Author για συγγραφείς. Στα
ιδιωτικά της πεδία να περιλαμβάνονται τα ακόλουθα:
1. Επίθετο συγγραφέα
2. ΄Έτος γέννησής
3. ΄Έτος θανάτου (αν υπάρχει, αλλιώς 0)
Στα δημόσιά πεδία θα περιλαμβάνονται
1. Μια μέθοδος δημιουργίας
2. Μέθοδοι set, get
3. Μια μέθοδος με το όνομα details() που θα εμφανίζει τα στοιχεία του
συγγραφέα. (ΣΥΝΕΧΕΙΑ) 5
5
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση 1
Να δημιουργηθεί μια κατηγορία για την περιγραφή βιβλίων με το όνομα
Book. Η μέθοδος να περιλαμβάνει τα ακόλουθα ιδιωτικά πεδία:
1. ΄Όνομα βιβλίου
2. Συγγραφέας
3. Σελίδες
Στα δημόσιά πεδία να υπάρχουν:
1. Δύο μέθοδοι δημιουργίας της επιλογής σας
2. Μέθοδοι set() και get()
3. Μια μέθοδος με το όνομα details() που θα εμφανίζει πληροφορίες για το
βιβλίο (ΣΥΝΕΧΕΙΑ) 6
6

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση 1
Στην συνέχεια να γραφεί κατηγορία με το όνομα Library. Η κατηγορία αυτή
θα έχει στα ιδιωτικά της πεδία τα ακόλουθα
1. ΄Έναν πίνακα από 100 δείκτες σε Book
2. ΄Έναν μετρητή που θα καταγράφει πόσα βιβλία υπάρχουν (το πολύ 100)
Στα δημόσιά πεδία θα υπάρχουν τα ακόλουθα
1. Μια μέθοδος δημιουργίας της επιλογής σας
2. Μια μέθοδος με το όνομα int Register( har *title,Author *a,int npages), η
οποία θα εισάγει ένα νέο βιβλίο στην βιβλιοθήκη. Αν μπορεί να γίνει
εισαγωγή η μέθοδος θα επιστρέφει 1, αλλιώς 0. (ΣΥΝΕΧΕΙΑ)

7
7
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση 1
3. Μια μέθοδος με το όνομα int nbooks( har *a), η οποία θα εμφανίζει
πόσα βιβλία έχουν γραφεί από τον συγκεκριμένο συγγραφέα.
4. Μια μέθοδος με το όνομα int lend( har *title), η οποία θα δανείζει το
βιβλίο. Αν το βιβλίο δεν μπορεί να δανειστεί, τότε η μέθοδος θα
επιστρέφει 0. Για να επιστρέψει πάλι το βιβλίο πίσω θα πρέπει να
χρησιμοποιηθεί η μέθοδος register.
5. Μια μέθοδος με το όνομα details(), η οποία θα εμφανίζει όλα τα βιβλία
της βιβλιοθήκης.

8
8

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

9
9
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

10
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

11
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

12
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

13
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

14
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση 1
Να γραφεί κατηγορία με το όνομα File για την περιγραφή αρχείων. Στα ιδιωτικά πεδία
της κατηγορίας θα περιλαμβάνονται τα ακόλουθα:
1. ΄Όνομα αρχείου
2. Φάκελος του αρχείου (Δείκτης σε File)
Στα δημόσιά πεδία
1. Μία μέθοδος δημιουργίας
2. Μέθοδοι set() και get()
3. Μια αφηρημένη μέθοδος με το όνομα copy(File *other) για την αντιγραφή των
περιεχομένων του other στο τρέχων αρχείο
4. Μια μέθοδος με το όνομα printPath() που θα εκτυπώνει την διαδρομή του αρχείου
5. Μια αφηρημένη μέθοδος details() που θα εκτυπώνει λεπτομέρειες για το αρχείο.

15
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση 1
Να γίνουν δύο νέες κατηγορίες που κληρονομούν την File με ονόματα TextFile και Folder.
Στο πρώτο θα υπάρχει στα ιδιωτικά πεδία το αλφαριθμητικό πεδίο Data και στο δεύτερο
θα υπάρχει ο πίνακας Contents, ο οποίος θα είναι τα αρχεία στον φάκελο και θα
αποτελείται από δείκτες σε File. Κάθε κατηγορία θα υλοποιεί διαφορετικά τις
αφηρημένες μεθόδους.

16
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

17
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

18
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

19
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

20
2

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις (1/ ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Βιβλιογραφία
1. Εγχειρίδιο της C++, 2η Ελληνική έκδοση, Jesse Liberty, Γκιούρδας.
2. Μάθετε τη C++, 2η Ελληνική έκδοση, Jesse Liberty , Γκιούρδας.
3. Προγραμματισμός με τη γλώσσα C++ Μέρος Α, Αλεβίζος Θ., Έκδοση ΤΕΙ Καβάλας
4. C++ Αντικειμενοστραφής Προγραμματισμός Υπολογιστών Τομαράς Α., , Εκδόσεις Νέων
Τεχνολογιών.
5. Ανακαλύψτε τη γλώσσα C, J. Purdum, Εκδόσεις Δίαυλος.
6. Εισαγωγή στο Συστηματικό Προγραμματισμό και στη γλώσσα C++, Σ. Μπαλτζής, εκδόσεις
πανεπιστημίου Ιωαννίνων.
7. C++ From the beginning, Jan Skansholm, Addison Wesley.
8. The design and analysis of computer algorithms, A.V. AHO, J.E. HOPCROFT, J.D. ULLMANN,
Addison Wesley 1974.
9. Structure and Interpretation of Computer Programs, H. ABELSON, G.J. SUSSMAN, J.
SUSSMAN, MIT Press, Mc Graw Hill Book Company, 1985
10. The art of computer programming, D.E. KNUTH, Addison-Wesley.
2
Ενότητα 12 : Επαναληπτικές Ασκήσεις (2/3)

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Πίνακες)
Να γραφεί κατηγορία για τον χειρισμό πινάκων ακεραίων με τα εξής
ιδιωτικά πεδία:
1. ΄Έναν δείκτη σε ακέραιο (πίνακας)
2. ΄Έναν ακέραιο αριθμό Ν (μέγεθος πίνακα)
Στα δημόσιά πεδία πρέπει να υπάρχουν τα ακόλουθα
1. Μια μέθοδος δημιουργίας που θα δέχεται σαν παράμετρο έναν
ακέραιο αριθμό Μ (μέγεθος πίνακα). Κάθε στοιχείο του πίνακα θα
αρχικοποιείται στο διάστημα [10,20] με τυχαίο τρόπο
2. Μια μέθοδος δημιουργίας που δεν θα δέχεται σαν όρισμά τίποτα
και θα διαβάζει από το πληκτρολόγιο τόσο το μέγεθος του πίνακα
όσο και τα στοιχεία του.
3. Μεθόδους set() και get()
5
5
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Πίνακες)
4. Μια μέθοδο με το όνομα reverse() που θα αντιστρέφει τα στοιχεία
του πίνακα
5. Μια μέθοδο με το όνομα cut(int Μ), η οποία θα περικόπτει τα
στοιχεία του πίνακα σε Μ αν και εφόσον Μ<N
6. Μια μέθοδο με το όνομα details() η οποία θα εμφανίζει τα στοιχεία
του πίνακα στην οθόνη

6
6

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

7
7
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

8
8

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

9
9
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Χειρισμός CSV αλφαριθμητικών)


Να γραφεί κατηγορία για το χειρισμό CSV αλφαριθμητικών. Σε
κάθε τέτοιο αλφαριθμητικό υπάρχουν τα εξής στοιχεία:
ΚΩΔΙΚΟΣ ΣΠΟΥΔΑΣΤΗ, ΕΤΟΣ ΕΙΣΑΓΩΓΗΣ, ΒΑΘΜΟΣ ΑΠΟΦΟΙΤΗΣΗΣ.

Στην κατηγορία θα πρέπει να υπάρχουν στα ιδιωτικά πεδία:


ένας πίνακας ακεραίων code για τους κωδικούς των σπουδαστών,
ένας πίνακας ακεραίων με το όνομα year για το έτος εισαγωγής
και ένας πίνακας δεκαδικών με το όνομα grade για την
βαθμολογία. Κάθε πίνακας έχει μέγεθος 100 (μέγιστος αριθμός
σπουδαστών).
10
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Χειρισμός CSV αλφαριθμητικών)


Η κατηγορία θα πρέπει να έχεις τις εξής μεθόδους:
1. bool isValid( har *x). Η μέθοδος επιστρέφει true αν το Χ είναι
έγκυρο CSV αλφαριθμητικό και false αν δεν είναι
2. bool addValue( har *x). Η μέθοδος ελέγχει αν το Χ είναι
έγκυρο και αν είναι βάζει τα αντίστοιχα δεδομένα στους 3
πίνακες
3. int total() Επιστρέφει το σύνολο των σπουδαστών που πήρε
πτυχίο
4. int ountYear(int y) Επιστρέφει το σύνολο των σπουδαστών με
έτος εισαγωγής y που πήραν πτυχίο
5. double meangrade() Επιστρέφει τον μέσο βαθμό πτυχίου
11
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

12
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

13
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Κληρονομικότητα)
Να γραφεί κατηγορία με το όνομα Rectangle. Στα ιδιωτικά της
πεδία θα είναι:
1. Πλευρά1
2. Πλευρά2
3. Στατικό πεδίο count για την καταμέτρησή των αντικειμένων
Στα δημόσιά πεδία:
1. Μια μέθοδος δημιουργίας
2. Μια μέθοδος με το όνομα area() για υπολογισμό εμβαδού
3. Μια μέθοδος με το όνομα volume() για υπολογισμό όγκου
που θα επιστρέφει 0 και θα είναι υπερβατική
14
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Κληρονομικότητα)
4. Μια μέθοδος με το όνομα details() η οποία θα εμφανίζει το
εμβαδόν και τον όγκο
Στην συνέχεια να φτιαχτεί η κατηγορία Box που θα κληρονομεί
την Rectangle με επιπλέον πεδίο την τρίτη πλευρά

15
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

16
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

17
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Βιβλιογραφία
1. Εγχειρίδιο της C++, 2η Ελληνική έκδοση, Jesse Liberty, Γκιούρδας.
2. Μάθετε τη C++, 2η Ελληνική έκδοση, Jesse Liberty , Γκιούρδας.
3. Προγραμματισμός με τη γλώσσα C++ Μέρος Α, Αλεβίζος Θ., Έκδοση ΤΕΙ Καβάλας
4. C++ Αντικειμενοστραφής Προγραμματισμός Υπολογιστών Τομαράς Α., , Εκδόσεις Νέων
Τεχνολογιών.
5. Ανακαλύψτε τη γλώσσα C, J. Purdum, Εκδόσεις Δίαυλος.
6. Εισαγωγή στο Συστηματικό Προγραμματισμό και στη γλώσσα C++, Σ. Μπαλτζής, εκδόσεις
πανεπιστημίου Ιωαννίνων.
7. C++ From the beginning, Jan Skansholm, Addison Wesley.
8. The design and analysis of computer algorithms, A.V. AHO, J.E. HOPCROFT, J.D. ULLMANN,
Addison Wesley 1974.
9. Structure and Interpretation of Computer Programs, H. ABELSON, G.J. SUSSMAN, J.
SUSSMAN, MIT Press, Mc Graw Hill Book Company, 1985
10. The art of computer programming, D.E. KNUTH, Addison-Wesley.
1

Ενότητα 12 : Επαναληπτικές Ασκήσεις (3/3)


Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Κατηγορία χρονικών στιγμών )


Να γραφεί κατηγορία για την αναπαράστασή χρονικών
στιγμών (δευτερόλεπτο, λεπτό, ώρα). Να έχει και
τελεστές μοναδιαίας αύξησής δευτερολέπτων και
μείωσής καθώς και έναν φιλικό τελεστή > για την
σύγκρισή δύο χρονικών στιγμών.

5
5

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

6
6
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

7
7

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

8
8
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

9
9

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Μάντρα οχημάτων)


Δημιουργήστε μια κατηγορία για την περιγραφή οχημάτων με
ιδιωτικά πεδία μάρκα και τιμή.

Να προστεθεί μια υπερβατική μέθοδος για την περιγραφή του


οχήματος, ένας φιλικός τελεστής σύγκρισής > ανάμεσά σε δύο
οχήματα που επιστρέφει αληθές αν το πρώτο όχημα είναι πιο
ακριβό από το δεύτερο και ένα στατικό πεδίο για την
καταμέτρησή των οχημάτων.

10
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Μάντρα οχημάτων)


Στην συνέχεια δημιουργήστε την κατηγορία για την περιγραφή ΙΧ
με πρόσθετο ιδιωτικό πεδίο το όνομα του μοντέλου καθώς και
μια κατηγορία για την περιγραφή φορτηγών με πρόσθετο
ιδιωτικό πεδίο το φορτίο.

Στη main() φτιάξτε έναν πίνακα οχημάτων και διαβάστε από το


πληκτρολόγιο το είδος του οχήματος, τιμή μάρκα και αν
απαιτείται μοντέλο ή φορτίο.

Τα οχήματα να μπουν σε έναν δυναμικό πίνακα vector.


11
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Μάντρα οχημάτων)


Το πρόγραμμα να διαγράφει από τον πίνακα όσα αυτοκίνητα
έχουν τιμή κάτω από 1000 ευρώ (λανθασμένη είσοδος) και να
εμφανίζεται στο τέλος το πλήθος των συνολικών οχημάτων.

12
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

13
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

14
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

15
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Άσκηση (Αρχείο δύο στηλών )


Στο αρχείο in.txt υπάρχουν δύο στήλες αριθμών. Στην πρώτη
στήλη είναι ο μισθός ενός υπαλλήλου και στην δεύτερη το bonus
που θα πάρει για την νέα χρονιά. Στην τελευταία γραμμή υπάρχει
η καταχώρηση 0 0. Οι δύο αριθμοί χωρίζονται μεταξύ τους με
κενό.
Να γραφεί πρόγραμμα το οποίο θα διαβάζει αυτά τα αρχεία, θα
αποθηκεύει αυτές τις καταχωρήσεις σε ένα vector από
αντικείμενα της κατηγορίας Employee, θα ταξινομεί αυτόν τον
πίνακα με βάση τις συνολικές αποδοχές των υπαλλήλων και θα
εμφανίζει στο τέλος τους δύο υπαλλήλους με τις υψηλότερες
αποδοχές.
16
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

17
1

Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Λύση

18
1
Αντικειμενοστραφής Προγραμματισμός – Επαναληπτικές Ασκήσεις ( ), Τμήμα Μηχανικών Πληροφορικής, ΤΕΙ ΗΠΕΙΡΟΥ Ανοιχτά Ακαδημαϊκά Μαθήματα
στο ΤΕΙ Ηπείρου

Βιβλιογραφία
1. Εγχειρίδιο της C++, 2η Ελληνική έκδοση, Jesse Liberty, Γκιούρδας.
2. Μάθετε τη C++, 2η Ελληνική έκδοση, Jesse Liberty , Γκιούρδας.
3. Προγραμματισμός με τη γλώσσα C++ Μέρος Α, Αλεβίζος Θ., Έκδοση ΤΕΙ Καβάλας
4. C++ Αντικειμενοστραφής Προγραμματισμός Υπολογιστών Τομαράς Α., , Εκδόσεις Νέων
Τεχνολογιών.
5. Ανακαλύψτε τη γλώσσα C, J. Purdum, Εκδόσεις Δίαυλος.
6. Εισαγωγή στο Συστηματικό Προγραμματισμό και στη γλώσσα C++, Σ. Μπαλτζής, εκδόσεις
πανεπιστημίου Ιωαννίνων.
7. C++ From the beginning, Jan Skansholm, Addison Wesley.
8. The design and analysis of computer algorithms, A.V. AHO, J.E. HOPCROFT, J.D. ULLMANN,
Addison Wesley 1974.
9. Structure and Interpretation of Computer Programs, H. ABELSON, G.J. SUSSMAN, J.
SUSSMAN, MIT Press, Mc Graw Hill Book Company, 1985
10. The art of computer programming, D.E. KNUTH, Addison-Wesley.
1
Αντικειμενοστραφής Προγραμματισμός

Ενδεκτικές ασκήσεις-απαντήσεις

Τσούλος Ιωάννης, Επίκουρος Καθηγητής Τμ. Μηχανικών Πληροφορικής Τ.Ε.

Άρτα, Μάιος 2015


Πρώτο σvετ Ασvκήσvεων C++
Ιωάννης Γ. Τσvούλος
2015

Στο σvημερινό σvετ ασvκήσvεων θα παρουσvιασvτούν μια σvειρά από ασvκήσvεις εισ-
vαγωγής σvτην C++, σvτις δομές ελέγχου και σvτους πίνακες της γλώσvσvας

1 Πρόγραμμα επεξεργασvίας μισvθοδοσvίας


Να γραφεί πρόγραμμα το οποίο θα διαβάζει από το πληκτρολόγιο τους μισvθούς
Ν προσvώπων, όπου Ν ακέραιος αριθμός που θα εισvάγεται προηγουμένως. Το
πρόγραμμα να εμφανίζει τον μέσvο όρο της μισvθοδοσvίας.
1 #in lude <i o s t r e a m>
2 using namespa e s t d ;
3 int main ( )
4 {
5 double s a l a r y ;
6 double avg_salary = 0 . 0 ;
7 int o u n t e r ;
8 int N;
9 out<<" Doste N? " ;
10 i n >>N;
11 for ( o u n t e r =1; ounter <=N; o u n t e r= o u n t e r +1)
12 {
13 out<<" Doste mistho "<< ounter <<" " ;
14 i n >>s a l a r y ;
15 avg_salary=avg_salary+s a l a r y ;
16 }
17 avg_salary=avg_salary /N;
18 out<<" Mesos m i s t h o s : "<<avg_salary<<e n d l ;
19 return 0;
20 }
Να γίνουν οι ακόλουθες διορθώσvεις προσvθήκες σvτο παραπάνω πρόγραμμα (με την
σvειρά που παρουσvιάζεται παρακάτω):
1. Το πρόγραμμα διαβάζει από το πληκτρολόγιο τους μισvθούς αλλά δεν κάνει
κάποιο έλεγχο για το αν οι μισvθοί είναι αρνητικοί. Να γίνει αλλαγή σvτο

1
πρόγραμμα ώσvτε αν κάποιος μισvθός είναι αρνητικός δεν θα υπολογίζεται σvτο
άθροισvμα.
2. Αφού γίνει η παραπάνω αλλαγή να αλλάξετε το πρόγραμμά σvας, ώσvτε αν
κάποιος μισvθός είναι αρνητικός να γίνεται επαναληπτικά ανάγνωσvή του μέχρι
ο χρήσvτης να εισvάγει θετική μισvθοδοσvία.
3. Η εταιρεία αποφάσvισvε να δώσvει μπόνους 100 ευρώ σvε όσvους μισvθωτούς λαμ-
βάνουν λιγότερα από 1000 ευρώ. Διορθώσvτε το πρόγραμμά σvας, ώσvτε να
γίνεται αύξησvη της μισvθοδοσvίας κατά 100 ευρώ σvε όσvους λαμβάνουν λιγότερα
από 1000 ευρώ.
4. Το πρόγραμμά σvας να απαντά σvτην ερώτησvη: πόσvοι δεν πήραν αύξησvη από
την εταιρεία;

2 Πρόγραμμα επιλογής σvυνάρτησvης


Να γραφεί πρόγραμμα το οποίο θα διαθέτει τις ακόλουθες σvυναρτήσvεις:
1. Μια σvυνάρτησvη υπολογισvμού της δύναμης X Y , όπου Χ και Υ ορίσvματα της
σvυνάρτησvης.
2. Μια σvυνάρτησvη υπολογισvμού του παραγοντικού X!
Στην κυρίως σvυνάρτησvη ο χρήσvτης εισvάγει έναν ακέραιο σvτο διάσvτημα [0,2℄ υπ-
οχρεωτικά. Αν ο χρήσvτης δώσvει 0 το πρόγραμμα σvταματά, διαφορετικά αν δώσvει
1 εισvάγει πρώτα έναν δεκαδικό αριθμό Χ και μετά έναν δεκαδικό αριθμό Υ και
υπολογίζεται η δύναμη με την βοήθεια της πρώτης σvυνάρτησvης. Αν δώσvει τον αρ-
ιθμό 2 εισvάγει ένα ακέραιο Χ και εμφανίζεται το παραγοντικό του αριθμού Χ. Στο
τέλος το πρόγραμμα εμφανίζει πόσvες φορές έγινε κλήσvη της πρώτης σvυνάρτησvης
και πόσvες φορές της δεύτερης.
1 # in lude <i o s t r e a m >
2 using namespa e s t d ;
3
4 double power ( double x , double y)
5 {
6 double p = 1 . 0 ;
7 int i ;
8 for ( i =1; i <=y ; i ++)
9 p=p ∗ x ;
10 return p ;
11 }
12
13 int fa torial ( int x)
14 {
15 int p=1;
16 int i;

2
17 for ( i =1; i <=x ; i ++) p=p ∗ i ;
18 return p ;
19 }
20
21 int readOption ( )
22 {
23 int option ;
24 do
25 {
26 out<<"Dose e p i l o g i " ;
27 i n >>o p t i o n ;
28 }while ( o p t i o n <0 | | o p t i o n >2);
29 return option ;
30 }
31
32 int main ( )
33 {
34 int myoption ;
35 double x , y ;
36 int i x ;
37 double mypower ;
38 int m y f a t o r i a l ;
39 int o u n t e r 1 =0, o u n t e r 2 =0;
40 while ( ( myoption=readOption ( ) ) ! = 0 )
41 {
42 swit h ( myoption )
43 {
44 ase 1 :
45 o u n t e r 1 ++;
46 out<<" Dose x k a i Y " ;
47 i n >>x>>y ;
48 mypower=power ( x , y ) ;
49 out<<"Dynami = "<<mypower<<e n d l ;
50 break ;
51 ase 2:
52 out<<" Dose x " ;
53 i n >>i x ;
54 m y f a t o r i a l=f a t o r i a l ( i x ) ;
55 out<<" P a r a g o n t i k o = "<<m y f a t o r i a l<<e n d l ;
56 o u n t e r 2 ++;
57 break ;
58 }
59 }
60 out<<" Counter1 : "<< ounter1 <<e n d l ;
61 out<<" Counter2 : "<< ounter2 <<e n d l ;
62 return 0;

3
63 }
Να γίνουν οι ακόλουθες διορθώσvεις/προσvθήκες σvτο παραπάνω πρόγραμμα:

1. Η σvυνάρτησvη του παραγοντικου να γίνει αναδρομική.


2. Η σvυνάρτησvη της δύναμης να επισvτρέφει -1 αν κάποιο από τα Χ ή Υ είναι
αρνητικό.

3 Χρήσvη πινάκων
Να γραφεί πρόγραμμα για την ανάγνωσvη και αποθήκευσvη βαθμολογιών για 5
σvπουδασvτές σvε έναν πίνακα δεκαδικών αριθμών. Το πρόγραμμα να εμφανίζει
1. Μέσvο όρο σvτο σvυγκεκριμένο μάθημα.
2. Πλήθος σvπουδασvτών που έχουν προβιβάσvιμο βαθμό.

1 # in lude <i o s t r e a m >


2 using namespa e s t d ;
3
4 double readGrade ( )
5 {
6 double b ;
7 do
8 {
9 out<<"Dose bathmo (0 − 10) " ;
10 i n >>b ;
11 }while ( b<0 | | b >10);
12 return b;
13 }
14
15 void readLesson ( double ∗x , int n)
16 {
17 int i ;
18 for ( i =0; i <n ; i ++)
19 x [ i ℄= readGrade ( ) ;
20 }
21
22 double average ( double ∗x , int n)
23 {
24 double s = 0 . 0 ;
25 int i ;
26 for ( i =0; i <n ; i ++)
27 s=s+x [ i ℄ ;
28 return s /n ;
29 }

4
30
31 int passed ( double ∗x , int n)
32 {
33 int ount =0;
34 int i ;
35 for ( i =0; i <n ; i ++)
36 if ( x [ i ℄>=5) ount++;
37 return ount ;
38 }
39
40 int main ( )
41 {
42 onst int s t u d e n t s =5;
43 double l e s s o n [ s t u d e n t s ℄ ;
44 double mesos ;
45 int p e r a s a n ;
46 readLesson ( lesson , students ) ;
47 mesos=a v e r a g e ( l e s s o n , s t u d e n t s ) ;
48 p e r a s a n=p a s s e d ( l e s s o n , s t u d e n t s ) ;
49 out<<" Mesos o r o s : "<<mesos<<e n d l ;
50 out<<" Perasan : "<<perasan<<e n d l ;
51 return 0;
52 }
Να γίνουν οι ακόλουθες διορθώσvεις/προσvθήκες σvτο παραπάνω πρόγραμμα:
1. Να προσvτεθεί μια ακόμα σvυνάρτησvη για την επισvτροφή του αριθμού σvπουδασvτή
(θέσvη σvτον πίνακα) με τον μεγαλύτερο βαθμό.
2. Αν θέλουμε να καταγράψουμε τις επιδόσvεις των 5 σvπουδασvτών σvε 3 μαθήματα
τι αλλαγές χρειάζονται;

5
Δεύτερο σvετ Ασvκήσvεων C++
Ιωάννης Γ. Τσvούλος
2015

Στο σvημερινό σvετ ασvκήσvεων θα παρουσvιασvτούν μια σvειρά από ασvκήσvεις για
χρήσvη κατηγοριών σvε προγράμματα.

1 Πρόγραμμα ημερομηνίας
Η επόμενη δήλωσvη της κατηγορίας date μπορεί να χρησvιμοποιηθεί για αναπαράσv-
τασvη ημερομηνιών:
#ifndef
#define
1 DATE_H_

2 DATE_H_

lass
3

private
4 date {

int
5 :

publi
6 day , month , y e a r ;

7 :

void int int int


8 date ( ) ;

bool int
9 initDate ( d, m, y);

bool int
10 setDay ( d);

bool int
11 setMonth ( m) ;

int
12 setYear ( y);

int
13 getDay ( ) ;

int
14 getMonth ( ) ;

void
15 getYear ( ) ;

virtual
16 printDate ( ) ;

17 ~date ( ) ;

18 };

#endif
19

20 / ∗ DATE_H_ ∗ /
Η υλοποίησvη της παραπάνω κατηγορίας έχει ως εξής:
#in lude
using namespa e
1 <i o s t r e a m >

#in lude
2 std ;

3 " d a t e . h"

4 date : : date ( )

1
5 {

6 day = 1 ;

7 month = 1 ;

8 y e a r =1;

9 }

void int int int


10

11 date : : i n i t D a t e ( d, m, y)

if
12 {

if
13 ( ! setDay ( d ) ) day = 1 ;

if
14 ( ! s e t M o n t h (m) ) month = 1 ;

15 ( ! setYear ( y ) ) y e a r =1;

16 }

bool int
17

18 date : : setDay ( d)

if return false
19 {

20 ( d<0 || d >31) ;

return true
21 day=d ;

22 ;

23 }

bool int
24

25 d a t e : : setMonth ( m)

if return false
26 {

27 (m<0 || m>12) ;

return true
28 month=m;

29 ;

30 }

bool int
31

32 date : : setYear ( y)

if return false
33 {

34 ( y e a r <0) ;

return true
35 y e a r=y ;

36 ;

37 }

int
38

39 d a t e : : getDay ( )

return
40 {

41 day ;

42 }

int
43

44 d a t e : : getMonth ( )

return
45 {

46 month ;

47 }

int
48

49 date : : getYear ( )

50 {

2
51 return year ;

52 }

void
53

54 date : : printDate ( )

55 {

56 o u t <<day<<" / "<<month<<" / "<<y e a r <<e n d l ;

57 }

58

59 date : : ~ date ( )

60 {

61

62 }

΄Ενα απλό πρόγραμμα - οδηγός που αρχικοποιεί δύο αντικείμενα ημερομηνίας και
τα εμφανίζει είναι το επόμενο:
#in lude
#in lude
1 " d a t e . h"

using namespa e
2 <i o s t r e a m >

3 std ;

int
4

5 main ( )

6 {

7 date d1 ;

8 date d2 ;

9 d1 . i n i t D a t e ( 1 0 , 1 1 , 2 0 0 1 ) ;

10 d2 . i n i t D a t e ( 2 2 , 2 4 , −1);
11 d1 . p r i n t D a t e ( ) ;

return
12 d2 . p r i n t D a t e ( ) ;

13 0;

14 }

Αφού εκτελέσvετε με προσvοχή το παραπάνω πρόγραμμα κάνετε τις απαραίτητες


τροποποιήσvεις ώσvτε:
1. Τα σvτοιχεία των ημερομηνιών d1 και d2 να διαβάζονται από το πληκτρολόγιο
2. Να προσvτεθεί μια ακόμα μέθοδος isLeap() σvτην κατηγορία date, που να
επισvτρέφει true αν η το έτος είναι δίσvεκτο και false αν δεν είναι
3. Να προσvτεθεί και να δοκιμασvτεί (μέσvω της main) μια μέθοδος σvτην κατη-
γορία date με όνομα void nextDay(). Αυτή η μέθοδος θα υπολογίζει την
επόμενη ημέρα και οι υπολογισvμοί της θα αποθηκεύονται σvτα ιδιωτικά πεδία
day, month, year.

2 Πρόγραμμα για σvημεία


Η επόμενη κατηγορία δηλώνει ένα σvημείο σvτον χώρο R2 με σvυντεταγμένες Χ και
Υ.

3
#ifndef
#define
1 POINT_H_

2 POINT_H_

lass
3

private
4 Point {

double
5 :

publi
6 x,y;

7 :

double double
8 Point ( ) ;

double
9 Point ( mx , my ) ;

double
10 getx ( ) ;

void double double


11 gety ( ) ;

void
12 move ( dx , dy ) ;

virtual
13 print ( ) ;

14 ~Point ( ) ;

15 };

#endif
16

17 / ∗ POINT_H_ ∗ /
Ο κώδικας για την υλοποίησvη της κατηγορίας έχει ως ακολούθως:

#in lude
1

# in lude
2 " Point . h"

using namespa e
3 <i o s t r e a m >

4 std ;

6 Point : : Point ( )

7 {

8 x =0.0;

9 y =0.0;

10 }

11

double double
12

13 Point : : Point ( mx , my)

14 {

15 x = mx ;

16 y = my ;

17 }

18

double
19

20 Point : : getx ( )

return
21 {

22 x;

23 }

24

double
25

26 Point : : gety ( )

27 {

4
28 return y;

29 }

void double double


30

31 P o i n t : : move ( dx , dy )

32 {

33 x=x+dx ;

34 y=y+dy ;

35 }

void
36

37 Point : : p r i n t ( )

38 {

39 o u t <<" ( "<<x<<" , "<<y<<" ) "<<e n d l ;

40 }

41

42 Point : : ~ Point ( )

43 {

44

45 }

Μια ενδεικτική main() σvυνάρτησvη όπου αρχικοποιούμε δύο αντικείμενα Point και
τα εμφανίζουμε σvτην οθόνη είναι η επόμενη. Με βάσvη τα παραπάνω προσvθέσvτε
μια ακόμα μέθοδο σvτην κατηγορία Point
bool e q u a l s ( Point other )

Η μέθοδος θα επισvτρέφει true αν το τρέχον σvημείο (σvυντεταγμένες x,y) και το


other σvημείο έχουν τις ίδιες σvυντεταγμένες και false σvε άλλη περίπτωσvη.

5
Τρίτο σvετ Ασvκήσvεων C++
Ιωάννης Γ. Τσvούλος
2015

1 Κατηγορία προσvώπων
Να γραφεί κατηγορία για την περιγραφή προσvώπων. Στα ιδιωτικά πεδία της κατη-
γορίας πρέπει να περιλαμβάνονται τα ακόλουθα:
1. ΄Ονομα
2. Επίθετο
3. Τηλέφωνο
4. Ηλικία
Στα δημόσvια πεδία θα πρέπει να υπάρχουν οι μέθοδοι set και get για τα ιδιωτικά
πεδία καθώς και δύο βοηθητικές μέθοδοι:
1. Μια μέθοδος που θα επισvτρέφει αληθές αν το πρόσvωπο είναι ενήλικο
2. Μια μέθοδος που θα τυπώνει σvτην οθόνη τα σvτοιχεία το προσvώπου
Η κατηγορία Person έχει ως ακολούθως:
1 #ifndef PERSON_H_
2 #define PERSON_H_
3 # in lude <s t r i n g >
4 using namespa e s t d ;
5
6 lass Person {
7 private :
8 s t r i n g name , lastname , t e l e p h o n e ;
9 int age ;
10 publi :
11 Person ( ) ;
12 void setName ( s t r i n g n ) ;
13 void setLastname ( s t r i n g l ) ;
14 bool s e t T e l e p h o n e ( s t r i n g t ) ;
15 bool setAge ( int a ) ;
1
16 bool i s A d u l t ( ) ;
17 void p r i n t D e t a i l s ( ) ;
18 virtual ~Person ( ) ;
19 };
20
21 #endif / ∗ PERSON_H_ ∗ /
Η υλοποίησvη της κατηγορίας είναι:
1 #in lude " Person . h"
2 #in lude <i o s t r e a m>
3 using namespa e s t d ;
4
5 Person : : Person ( )
6 {
7 name="" ;
8 lastname="" ;
9 t e l e p h o n e=" 2681050500" ;
10 age =18;
11 }
12
13
14 void Person : : setName ( s t r i n g n )
15 {
16 name = n ;
17 }
18
19 void Person : : setLastname ( s t r i n g l )
20 {
21 lastname = l ;
22 }
23
24 bool Person : : s e t T e l e p h o n e ( s t r i n g t )
25 {
26 int i;
27 // f i r s t r u l e
28 if ( t . length ()!=10) return false ;
29 // se ond r u l e
30 if ( t [0℄== ' 0 ' ) return false ;
31 for ( i =0; i <t . l e n g t h ( ) ; i ++)
32 {
33 // t h i r d r u l e
34 if ( ! ( t [ i ℄>= ' 0 ' && t [ i ℄<= ' 9 ' ) ) return false ;
35 }
36 telephone = t ;
37 return true ;
38 }

2
39
40 bool int a )
Person : : setAge (
41 {
42 if ( age <0) return false ;
43 age=a ;
44 return true ;
45 }
46
47 bool Person : : i s A d u l t ( )
48 {
49 if ( age >=18) return true ;
50 else return false ;
51 }
52
53 void Person : : p r i n t D e t a i l s ( )
54 {
55 out<<" Person d e t a i l s "<<e n d l ;
56 out<<"Name : \ t "<<name<<e n d l ;
57 out<<" Lastname : \ t "<<lastname<<e n d l ;
58 out<<" Telephone : \ t "<<t e l e p h o n e <<e n d l ;
59 out<<"Age : \ t "<<age<<e n d l ;
60 }
61
62 Person : : ~ Person ( )
63 {
64
65 }
Τέλος μια ενδεικτική main για την προηγούμενη κατηγορία έχει ως ακολούθως:
1 # in lude " Person . h"
2 # in lude <s t d l i b . h>
3 int main ( )
4 {
5 Person g i a n n i s ;
6 g i a n n i s . setName ( " G i a n n i s " ) ;
7 g i a n n i s . setLastname ( " T s o u l o s " ) ;
8 g i a n n i s . s e t T e l e p h o n e ( " aaa2111 " ) ;
9 g i a n n i s . setAge ( 3 8 ) ;
10 giannis . printDetails () ;
11 system ( "PAUSE" ) ;
12 return 0;
13 }
Με βάσvη τα παραπάνω κάνετε τις επόμενες αλλαγές:
1. Προσvθέσvτε ακόμα ένα ιδιωτικό πεδίο για το email του προσvώπου. Δημιουργήσvτε
τις απαραίτητες set και get μεθόδους. Στην μέθοδο setEmail() να γίνει

3
έλεγχος αν το όρισvμα που θα μπει σvτο πεδίο email είναι έγκυρο email (έχει
μόνο ένα σvύμβολο  και αυτό δεν βρίσvκεται ούτε σvτην αρχή ούτε σvτο τέλος
του email).
2. Αλλάξτε την σvυνάρτησvη δημιουργίας της κατηγορίας ώσvτε να διαβάζει και
τα 5 πεδία από το πληκτρολόγιο.
3. Αλλάξτε την main() σvυνάρτησvη ώσvτε να υπάρχουν τρία διαφορετικά αντικεί-
μενα της κατηγορίας Person. Κάνετε τις αρχικοποιήσvεις κάθε αντικειμένου
και εμφανίσvτε τα σvτοιχεία του αντικειμένου με την μεγαλύτερη ηλικία.

2 Κατηγορία κύκλος
Να γραφεί κατηγορία για την περιγραφή κύκλων με τα ακόλουθα ιδιωτικά πεδία:
1. Κέντρο κύκλου (σvημείο Χ0,Υ0)
2. Ακτίνα κύκλου
Στα δημόσvια πεδία να περιλαμβάνονται τα ακόλουθα:
1. Συνάρτησvη δημιουργίας
2. Μέθοδος επισvτροφής του εμβαδού του κύκλου πR2


3. Μέθοδος επισvτροφής της περιμέτρου του κύκλου (4πR)


4. Μέθοδος κλιμάκωσvης του κύκλου. Η μέθοδος αυτή δέχεται σvαν όρισvμα έναν
παράγοντα Χ και πολλαπλασvιάζει την ακτίνα με αυτόν τον παράγοντα.
Η δήλωσvη της κατηγορίας έχει ως ακολούθως:
1 #ifndef CIRCLE_H_
2 #define CIRCLE_H_
3
4 lass C i r l e {
5 private :
6 double x0 , y0 , r a d i o u s ;
7 publi :
8 C i r l e ( double x , double y , double r ) ;
9 void s a l e ( double f a t o r ) ;
10 bool p o i n t I n ( double x , double y ) ; // t o be implemented
11 double getArea ( ) ;
12 double g e t P e r i m e t e r ( ) ;
13 ~Cir le ( ) ;
14 };
15
16 #endif / ∗ CIRCLE_H_ ∗ /
Η υλοποίησvη της κατηγορίας:

4
1 #in lude " C i r l e . h"
2 # in lude <math . h>
3 C i r l e : : C i r l e ( double x , double y , double r)
4 {
5 x0=x ;
6 y0=y ;
7 radious = fabs ( r ) ;
8 }
9
10 void Cir le : : s ale ( double fa tor )
11 {
12 radious = fabs ( fa tor ) ∗ radious ;
13 }
14
15 bool Cir le : : pointIn ( double x , double y)
16 {
17 // t o be implemented
18 }
19
20 double C i r l e : : getArea ( )
21 {
22 return M_PI ∗ radious ∗ radious ;
23 }
24
25 double Cir le : : getPerimeter ()
26 {
27
28 return 4 . 0 ∗ M_PI ∗ r a d i o u s ;
29 }
30
31 Cir le ::~ Cir le ()
32 {
33
34 }
Και τέλος μια ενδεικτική main:
1 # in lude " C i r l e . h"
2 # in lude <i o s t r e a m >
3 using namespa e s t d ;
4 # in lude <s t d l i b . h>
5 int main ( )
6 {
7 C i r l e 1 ( 1 0 , 1 0 , 2 0 ) ;
8 out<<"C1 Area "<< 1 . getArea()<< e n d l ;
9 out<<"C1 P e r i m e t e r "<< 1 . g e t P e r i m e t e r ()<< e n d l ;
10 1 . s a l e ( 2 . 0 ) ;

5
11 out<<"C1 Area "<< 1 . getArea()<< e n d l ;
12 out<<"C1 P e r i m e t e r "<< 1 . g e t P e r i m e t e r ()<< e n d l ;
13 system ( "PAUSE" ) ;
14 return 0;
15 }
Με βάσvη τα παραπάνω υλοποιήσvτε την μέθοδο bool pointIn(double x,double y);
έτσvι ώσvτε να επισvτρέφει αληθές αν το σvημείο x,y είναι μέσvα σvτον κύκλο και ψευδές
αλλιώς. Δοκιμάσvτε την μέθοδό σvας σvτην main, όπου θα διαβάζετε δύο αριθμούς
Χ,Υ και θα ελέγχετε αν αυτό το σvημείο (Χ,Υ) είναι μέσvα σvτον κύκλο C1 που
υπάρχει σvτην main. Υπενθυμίζεται πως ένα σvημείο (x, y) είναι μέσvα σvτον κύκλο
με κέντρο (x0 , y0 ) και ακτίνα R αν ισvχύει η σvχέσvη

(x − x0 )2 + (y − y0 )2 ≤ R2

6
Τέταρτο σvετ Ασvκήσvεων C++
Ιωάννης Γ. Τσvούλος
2015

1 Κατηγορία Ημερομηνίας
Να γραφεί κατηγορία για την πλήρη περιγραφή ημερομηνιών. Στα ιδιωτικά πεδία
πρέπει να περιλαμβάνονται τα ακόλουθα:
1. Ημέρα
2. Μήνας
3. ΄Ετος
4. Πίνακας ακεραίων με τις μέρες κάθε μήνα.
Στα δημόσvια πεδία τα ακόλουθα:
1. Τρεις υπερφορτωμένες σvυναρτήσvεις δημιουργίας
2. Μέθοδοι set και get για ημέρα, μήνα, έτος με έλεγχο τιμών
3. Μια μέθοδος εμφάνισvης της ημερομηνίας σvτην οθόνη
4. Μια μέθοδος που θα αλλάζει την ημερομηνία σvτην επόμενη ημέρα.
5. Μια μέθοδος που θα δέχεται σvαν όρισvμα αναφορά σvε αντικείμενο Date και
θα ελέγχει αν η τρέχουσvα ημερομηνία και η ημερομηνία σvτην αναφορά είναι
ίδιες.
Η περιγραφή της κατηγορίας έχει ως ακολούθως:
1 #ifndef DATE_H_
2 #define DATE_H_
3
4 l a s s Date {
5 private :
6 int monthdays [ 1 2 ℄ ;
7 void f i l l T a b l e ( ) ;
8 int day , month , y e a r ;
9 publi :
10 // o n s t r u t o r s

1
11 Date ( ) ;
12 Date ( int y);
13 Date ( int d,int m, int y);
14
15 // s e t methods
16 bool setYear ( int y ) ;
17 b o o l setMonth ( int m) ;
18 b o o l setDay ( int d ) ;
19
20 // g e t methods
21 int getDay ( ) ;
22 int getMonth ( ) ;
23 int getYear ( ) ;
24
25 // u t i l i t y methods
26 bool sameDate ( Date &o t h e r ) ;
27 void nextDay ( ) ;
28 void printDate ( ) ;
29 v i r t u a l ~Date ( ) ;
30 };
31
32 #endif / ∗ DATE_H_ ∗ /
Η υλοποίησvη της κατηγορίας:
1 #in lude " Date . h"
2 # in lude <i o s t r e a m >
3 using namespa e s t d ;
4
5 Date : : Date ( )
6 {
7 fillTable ();
8 day =1;
9 month =1;
10 y e a r =1;
11 }
12
13 Date : : Date ( int
y)
14 {
15 fillTable ();
16 day =1;
17 month =1;
18 setYear ( y ) ;
19 }
20
21
22 Date : : Date ( int d, int m, int y)

2
23 {
24 fillTable ();
25 setDay ( d ) ;
26 setMonth (m) ;
27 setYear ( y ) ;
28 }
29
30 void Date : : f i l l T a b l e ( )
31 {
32 // o i meres t o u mina g i a k a t h e mina
33 monthdays [ 0 ℄ = 3 1 ;
34 monthdays [ 1 ℄ = 2 8 ;
35 monthdays [ 2 ℄ = 3 1 ;
36 monthdays [ 3 ℄ = 3 0 ;
37 monthdays [ 4 ℄ = 3 1 ;
38 monthdays [ 5 ℄ = 3 0 ;
39 monthdays [ 6 ℄ = 3 1 ;
40 monthdays [ 7 ℄ = 3 1 ;
41 monthdays [ 8 ℄ = 3 0 ;
42 monthdays [ 9 ℄ = 3 1 ;
43 monthdays [ 1 0 ℄ = 3 0 ;
44 monthdays [ 1 1 ℄ = 3 1 ;
45 }
46
47 bool Date : : s e t Y e a r ( int y)
48 {
49 if ( y<0) { y e a r =1; return false ; }
50 else
51 {
52 y e a r=y ;
53 return true ;
54 }
55 }
56
57 bool Date : : setMonth ( int m)
58 {
59 if (m<0 | | m>12) {month =1; return false ; }
60 else
61 {
62 month=m;
63 return true ;
64 }
65 }
66
67 bool Date : : setDay ( int d)
68 {

3
69 if ( d<0 | | d>31 | | d>monthdays [ month − 1℄) { day =1; return false ; }
70 else
71 {
72 day=d ;
73 return true ;
74 }
75 }
76
77 int Date : : getDay ( )
78 {
79 return day ;
80 }
81
82 int Date : : getMonth ( )
83 {
84 return month ;
85 }
86
87 int Date : : getYear ( )
88 {
89 return year ;
90 }
91
92 void Date : : nextDay ( )
93 {
94 ++day ;
95 if( day>monthdays [ month − 1℄)
96 {
97 month++;
98 day =1;
99 if
( month>12)
100 {
101 month =1;
102 y e a r++;
103 }
104 }
105 }
106
107 void Date : : p r i n t D a t e ( )
108 {
109 out<<day<<"/"<<month<<"/"<<year<<e n d l ;
110 }
111
112 bool Date : : sameDate ( Date &o t h e r )
113 {
114 if ( day==o t h e r . getDay ( ) && month==o t h e r . getMonth ( ) && y e a r==o t h e r . getY

4
115 return true ;
116 else
117 return false ;
118 }
119
120 Date : : ~ Date ( )
121 {
122
123 }
Τέλος μια ενδεικτική main σvυνάρτησvη είναι η επόμενη:
1 # in lude " Date . h"
2 # in lude <i o s t r e a m >
3 using namespa e s t d ;
4
5 int main ( )
6 {
7 Date d1 ;
8 Date d2 ( 1 9 8 7 ) ;
9 Date d3 ( 1 9 , 1 1 , 1 9 2 2 ) ;
10 d1 . p r i n t D a t e ( ) ;
11 d2 . p r i n t D a t e ( ) ;
12 d3 . p r i n t D a t e ( ) ;
13 return 0;
14 }
Με βάσvη τα παραπάνω κάνετε τις ακόλουθες αλλαγές:
1. Αλλάξτε την υπερφορτωμένη σvυνάρτησvη δημιουργίας Date() ώσvτε να δια-
βάζει την ημερομηνία από το πληκτρολόγιο. Αν δίνεται λανθασvμένη είσvοδος
(πχ αρνητικό έτος) να γίνεται επαναληπτικά ανάγνωσvη.
2. Προσvθέτε μια μέθοδο prevDay() που θα μειώνει την ημέρα κατά 1.
3. Προσvθέσvτε μια μέθοδο με το όνομα bool before(Date &other), η οποία θα
επισvτρέφει αληθές αν η τρέχουσvα ημερομηνία είναι πριν την ημερομηνία other
και ψευδές αλλιώς.
4. Διορθώσvτε τον κώδικα όπου χρειάζεται ώσvτε να λαμβάνεται υπόψιν σvας τα
δίσvεκτα έτη. Πιθανόν να χρειασvτεί να αλλάξετε πάνω από 3 μεθόδους.

5
Πέμπτο σvετ Ασvκήσvεων C++
Ιωάννης Γ. Τσvούλος
2015

1 Κατηγορία μαθητών με δείκτες


Η επόμενη κατηγορία υλοποιεί μια κατηγορία για την αποθήκευσvη μαθητών ενός
εξαμήνου με χρήσvη δεικτών. Στην σvυνέχεια δημιουργεί 5 μαθητές δυναμικά σvαν
δυναμικά πεδία πίνακα. Στα ιδιωτικά πεδία της κατηγορίας Student περιλαμβάνον-
ται τα ακόλουθα:
1. ΄Ονομα μαθητή
2. Επίθετο μαθητή
3. Αριθμός μαθημάτων
4. Πίνακας βαθμολογίας
Στα δημόσvια πεδία περιλαμβάνονται
1. Μέθοδος δημιουργίας
2. Μέθοδοι set και get
3. Μέθοδος εμφάνισvης του μαθητή
4. Μέθοδος διαγραφής
Η main() σvυνάρτησvη θα δημιουργήσvει 5 δυναμικά αντικείμενα της κατηγορίας
Student και σvτην σvυνέχεια θα τα εμφανίσvει σvτην οθόνη. Η δήλωσvη της κατηγορίας
έχει ως ακολούθως:
1 #ifndef STUDENT_H_
2 #define STUDENT_H_
3
4 lass Student {
5 private :
6 har ∗ name , ∗ lastname ;
7 double ∗ l e s s o n s ;
8 int o u n t L e s s o n s ;
9 publi :
1
10 Student ( har ∗ n , har ∗ l , int ) ;
11 void s e t L e s s o n ( int index , double value ) ;
12 double g e t L e s s o n ( int i n d e x ) ;
13 void p r i n t D e t a i l s ( ) ;
14 har ∗ getName ( ) ;
15 har ∗ getLastname ( ) ;
16 void setName ( har ∗ n ) ;
17 void setLastname ( har ∗ l ) ;
18 ~Student ( ) ;
19 };
20
21 #endif
Η υλοποίησvη της κατηγορίας έχει ως ακολούθως:
1 #in lude " Student . h"
2 # in lude <s t r i n g . h>
3 # in lude <i o s t r e a m >
4 using namespa e s t d ;
5
6 Student : : Student ( har ∗n , har ∗l , int )
7 {
8 setName ( n ) ;
9 setLastname ( l ) ;
10 if ( <0) o u n t L e s s o n s =1; else
o u n t L e s s o n s= ;
11 new double
l e s s o n s= [ ountLessons ℄ ;
12 }
13
14 void Student : : s e t L e s s o n ( int index , double value )
15 {
16 if ( index <0 | | index>= o u n t L e s s o n s )
17 return ;
18 if ( value <0 | | value >10)
19 l e s s o n s [ index ℄=0;
20 else
21 l e s s o n s [ i n d e x ℄= v a l u e ;
22 }
23
24 double Student : : g e t L e s s o n ( int index )
25 {
26 if ( index <0 | | index>= o u n t L e s s o n s ) return 0;
27 return l e s s o n s [ i n d e x ℄ ;
28 }
29
30 void Student : : p r i n t D e t a i l s ( )
31 {
32 int i;

2
33 out<<" ∗∗ Student D e t a i l s ∗∗∗ "<<e n d l ;
34 out<<"Name : "<<name<<e n d l ;
35 out<<" Lastname : "<<lastname<<e n d l ;
36 for( i =0; i < o u n t L e s s o n s ; i ++)
37 out<<" Lesson : "<<( i +1)<<" Grade : "<<l e s s o n s [ i ℄<<e n d l ;
38 }
39
40 har ∗ Student : : getName ( )
41 {
42 return name ;
43 }
44
45 har ∗ Student : : getLastname ( )
46 {
47 return lastname ;
48 }
49
50 void Student : : setName ( har ∗n )
51 {
52 name= new har [ strlen (n)+1℄;
53 s t r p y ( name , n ) ;
54 }
55
56 void Student : : setLastname ( har ∗l)
57 {
58 lastname= new har [ strlen ( l )+1℄;
59 s t r p y ( lastname , l ) ;
60 }
61
62 Student : : ~ Student ( )
63 {
64 delete [ ℄ name ;
65 delete [ ℄ lastname ;
66 delete [ ℄ lessons ;
67 }
Τέλος η σvυνάρτησvη main() έχει ως εξής:
1 # in lude " Student . h"
2 # in lude <i o s t r e a m >
3 using namespa e s t d ;
4 int main ( )
5 {
6 har myname [ 1 0 0 ℄ ;
7 har mylastname [ 1 0 0 ℄ ;
8 Student ∗ m y l a s s [ 5 ℄ ;
9 int i , j , n l e s s o n s ;
3
10 for ( i =0; i <5; i ++)
11 {
12 out<<" Give d e t a i l s f o r s t u d e n t "<<( i +1)<<e n d l ;
13 out<<" Give name "<<e n d l ;
14 i n >>myname ;
15 out<<" Give lastname "<<e n d l ;
16 i n >>mylastname ;
17 out<<" Give number o f l e s s o n s "<<e n d l ;
18 i n >>n l e s s o n s ;
19 m y l a s s [ i ℄=new Student (myname , mylastname , n l e s s o n s ) ;
20 for ( j =0; j <n l e s s o n s ; j ++)
21 {
22 double grade ;
23 out<<" Give grade f o r l e s s o n "<<( j +1)<<e n d l ;
24 i n >>grade ;
25 m y l a s s [ i ℄−> s e t L e s s o n ( j , grade ) ;
26 }
27
28 }
29 for ( i =0; i <5; i ++)
30 {
31 m y l a s s [ i ℄−> p r i n t D e t a i l s ( ) ;
32 delete my lass [ i ℄ ;
33 }
34 return 0;
35 }
Με βάσvη τα παραπάνω κάνετε τις επόμενες τροποποιήσvεις:
1. Να προσvτεθεί σvτα ιδιωτικά πεδία της Student και ο αριθμός μητρώου του
σvπουδασvη. Να κάνετε όλες τις απαραίτητες αλλαγές σvτην μέθοδο δημιουργίας
και να προσvθέσvετε και μεθόδους set και get για αυτό το πεδίο
2. Να προσvτεθεί μέθοδος average() σvτην κατηγορία Student που να υπολογίζει
και να επισvτρέφει τον μέσvο όρο βαθμολογίας του σvπουδασvτή
3. Εμφανίσvτε σvτην main() σvυνάρτησvη τους μέσvους όρους βαθμολογίας για κάθε
σvπουδασvτή
4. Εμφανίσvτε σvτην main() σvυνάρτησvη τα σvτοιχεία του σvπουδασvτή (΄Ονομα, Επί-
θετο) με τον καλύτερο μέσvο όρο
5. Να προσvτεθεί η μέθοδος bool isBetter(Student *other); Η μέθοδος αυτή
δέχεται σvαν όρισvμα έναν δείκτη σvε αντικείμενο Student και επισvτρέφει αληθές
αν ο τρέχων σvπουδασvτής έχει καλύτερο μέσvο όρο από τον other και false σvε
άλλη περίπτωσvη.
6. Αλλάξτε τις δηλώσvεις των πεδίων name,lastname από har * σvε string

4
΄Εκτο σvετ Ασvκήσvεων C++
Ιωάννης Γ. Τσvούλος
2015

1 Κατηγορία βιβλίων
Να δημιουργηθεί κατηγορία βιβλίων με τα εξής ιδιωτικά πεδία:
1. Τίτλο βιβλίου
2. Συγγραφέα
3. Κωδικό
4. Αριθμό σvελιδών
Στα δημόσvια πεδία να υπάρχουν τα ακόλουθα
1. Δύο μέθοδοι δημιουργίας της επιλογής σvας
2. Μέθοδοι set και get
3. Μέθοδος εκτύπωσvης των σvτοιχείων
4. Μέθοδος διαγραφής που εμφανίζει τον τίτλο του βιβλίου που θα διαγραφεί.
Η κατηγορία βιβλίου είναι η ακόλουθη:
1 # in lude <s t r i n g >
2 using namespa e s t d ;
3
4 lass Book
5 {
6 private :
7 s t r i n g author , t i t l e ;
8 int pages ;
9 int ode ;
10 publi :
11 Book ( ) ;
12 Book ( int , s t r i n g a , s t r i n g t, int p);
13 s t r i n g getAuthor ( ) ;
14 string getTitle ();

1
15 int getPages ( ) ;
16 int getCode ( ) ;
17 void setAuthor ( s t r i n g s ) ;
18 void setTitle ( string s );
19 void setPages ( int p);
20 void setCode ( int );
21 void printDetails ();
22 ~Book ( ) ;
23 };
Η υλοποίησvη της κατηγορίας βιβλίου είναι η ακόλουθη:
1 # in lude " book . h"
2 # in lude <i o s t r e a m >
3 using namespa e std ;
4 Book : : Book ( )
5 {
6 setCode ( 0 ) ;
7 setPages ( 0 ) ;
8 s e t A u t h o r ( "" ) ;
9 s e t T i t l e ( "" ) ;
10 }
11
12 Book : : Book ( int , string a , string t , int p)
13 {
14 setCode ( ) ;
15 setPages (p ) ;
16 setAuthor ( a ) ;
17 setTitle ( t );
18 }
19
20 s t r i n g Book : : getAuthor ( )
21 {
22 return author ;
23 }
24
25 s t r i n g Book : : g e t T i t l e ( )
26 {
27 return title ;
28 }
29
30 int Book : : g e t P a g e s ( )
31 {
32 return pages ;
33 }
34
35 int Book : : getCode ( )

2
36 {
37 return ode ;
38 }
39
40 void Book : : s e t A u t h o r ( s t r i n g s )
41 {
42 author=s ;
43 }
44
45 void Book : : s e t T i t l e ( s t r i n g s )
46 {
47 t i t l e =s ;
48 }
49
50 void Book : : s e t P a g e s (int p )
51 {
52 if ( p<0) pages =0; else pages=p ;
53 }
54
55 void Book : : setCode ( int )
56 {
57 if ( <0) ode =0; else ode= ;
58 }
59
60 void Book : : p r i n t D e t a i l s ( )
61 {
62 out<<" T i t l e : "<<t i t l e <<" Author : "<<author<<"\n"<<
63 "Code : "<< ode<<" Pages : "<<pages<<e n d l ;
64 }
65
66
67 Book : : ~ Book ( )
68 {
69 out<<" D e l e t i n g book "<<t i t l e <<e n d l ;
70 }
Μια ενδεικτική main σvυνάρτησvη σvτην οποία γίνεται χρήσvη δεικτών και δυναμικών
αντικειμένων βιβλίου είναι η ακόλουθη:
1 # in lude " book . h"
2 # in lude <i o s t r e a m >
3 using namespa e s t d ;
4
5 int main ( )
6 {
7 Book a ( 1 0 0 , " King" , "The Stand " , 8 0 0 ) ;
8 Book ∗ pa=&a ;

3
9 Book ∗ b= new Book ( 2 0 0 , " K a z a n t z a k i s " , " Zorbas" , 5 0 0 ) ;
10 pa−>p r i n t D e t a i l s ( ) ;
11 pa−>s e t P a g e s ( 1 0 0 0 ) ;
12 a . printDetails ();
13 b−>p r i n t D e t a i l s ( ) ;
14 delete b;
15 return 0;
16 }
Με βάσvη τα παραπάνω κάνετε τις επόμενες προσvθήκες:
1. Προσvθέσvτε μια ακόμα σvυνάρτησvη δημιουργίας Book(Book &other), σvτην
οποία να γίνεται αντιγραφή κάθε πεδίου του αντικειμένου other σvτο τρέχον
αντικείμενο. Για παράδειγμα θα οι σvελίδες θα πρέπει να γίνουν ίσvες με τις
σvελίδες του αντικειμένου Other.
2. Να προσvτεθεί η μέθοδος bool sameAuthor(Book *other) Η μέθοδος επισvτρέφει
αληθές αν το τρέχον βιβλίο και το other ανήκουν σvτον ίδιο σvυγγραφέα.

3. Να προσvτεθεί η μέθοδος bool equals(Book *other), που επισvτρέφει αληθές


αν το τρέχον βιβλίο και το other είναι πανομοιότυπα σvε όλα τα πεδία της.

2 Βιβλιοθήκη
Με βάσvη την προηγούμενη κατηγορία να γίνει κατηγορία Library η οποία θα δια-
θέτει σvτα ιδιωτικά της πεδία
1. ΄Εναν πίνακα δέκα δεικτών σvε βιβλία Book
Στα δημόσvια πεδία θα περιλαμβάνει
1. Μια μέθοδο δημιουργίας
2. Μια μέθοδο εισvαγωγής νέου βιβλίου
3. Μια μέθοδο εμφάνισvης όλων των βιβλίων
4. Μια μέθοδο διαγραφής βιβλίου με βάσvη τον κωδικό του
5. Μια μέθοδο αναζήτησvης βιβλίου με βάσvη τον κωδικό του
Η δήλωσvης της κατηγορίας έχει ως ακολούθως:
1 # in lude " book . h"
2 # define NBOOKS 10
3 lass L i b r a r y
4 {
5 private :
6 Book ∗ mybooks [NBOOKS℄ ;
7 publi :
4
8 Library ( ) ;
9 bool addBook ( Book ∗ b ) ;
10 void delBook ( int
ode ) ;
11 Book ∗ sear hBook ( int
ode ) ;
12 void showBooks ( ) ;
13 ~Library ( ) ;
14 };
Η υλοποίησvη της κατηγορίας είναι:
1 # in lude " l i b r a r y . h"
2 # in lude <i o s t r e a m >
3 using namespa e s t d ;
4
5
6 Library : : Library ()
7 {
8 int i;
9 for( i =0; i <NBOOKS; i ++) mybooks [ i ℄=NULL;
10 }
11
12 bool L i b r a r y : : addBook ( Book ∗ b )
13 {
14 int i ;
15 for ( i =0; i <NBOOKS; i ++)
16 if ( mybooks [ i ℄==NULL)
17 {
18 mybooks [ i ℄=new Book ( b−>getCode ( ) ,
19 b−>getAuthor ( ) , b−>g e t T i t l e ( ) ,
20 b−>g e t P a g e s ( ) ) ;
21 return true ;
22 }
23 return false ;
24 }
25
26 void L i b r a r y : : delBook ( int ode )
27 {
28 int i ;
29 for ( i =0; i <NBOOKS; i ++)
30 {
31 if ( mybooks [ i ℄ ! =NULL)
32 {
33 if ( mybooks [ i ℄−>getCode()== ode )
34 {
35 delete mybooks [ i ℄ ;
36 mybooks [ i ℄=NULL ;
37 return ;
5
38 }
39 }
40 }
41 }
42
43 Book ∗ L i b r a r y : : sear hBook (int ode )
44 {
45 int i;
46 for ( i =0; i <NBOOKS; i ++)
47 {
48 if ( mybooks [ i ℄ ! =NULL)
49 {
50 if ( mybooks [ i ℄−>getCode()== ode )
51 return mybooks [ i ℄ ;
52 }
53 }
54 return NULL;
55 }
56
57
58 void L i b r a r y : : showBooks ( )
59 {
60 int i;
61 for ( i =0; i <NBOOKS; i ++)
62 if ( mybooks [ i ℄ ! =NULL)
63 mybooks [ i ℄−> p r i n t D e t a i l s ( ) ;
64 }
65
66 L i b r a r y : : ~ L i b r a r y ( )
67 {
68 int i;
69 for ( i =0; i <NBOOKS; i ++)
70 if ( mybooks [ i ℄ ! =NULL) delete mybooks [ i ℄ ;
71 }
Τέλος μια ενδεικτική main σvυνάρτησvη με χρήσvη μενού είναι η επόμενη:
1 # in lude " l i b r a r y . h"
2 # in lude <i o s t r e a m >
3 using namespa e s t d ;
4
5 int menu ( )
6 {
7 int o p t i o n ;
8 do{
9 out<<"1−ADD BOOK \n" ;
10 out<<"2−SEARCH FOR A BOOK\n" ;

6
11 out<<"3−SHOW BOOKS\n" ;
12 out<<"4−DELETE BOOK\n" ;
13 out<<"5−QUIT\n" ;
14 i n >>o p t i o n ;
15 }
16 while ( o p t i o n <1 | | o p t i o n >5);
17 return o p t i o n ;
18 }
19
20 int main ( )
21 {
22 L i b r a r y mylib ;
23 s t r i n g author , t i t l e ;
24 int pages , ode ;
25 int option ;
26 do
27 {
28 o p t i o n=menu ( ) ;
29 if( o p t i o n==1)
30 {
31 out<<" Enter author \n" ;
32 i n >>author ;
33 out<<" Enter t i t l e \n" ;
34 i n >> t i t l e ;
35 out<<" Enter ode \n" ;
36 i n >> ode ;
37 out<<" Enter number o f pages \n" ;
38 i n >>pages ;
39 Book p ( ode , author , t i t l e , pages ) ;
40 mylib . addBook(&p ) ;
41 }
42 else
43 if ( o p t i o n==2)
44 {
45 out<<" Enter ode \n" ;
46 i n >> ode ;
47 Book ∗ p=mylib . sear hBook ( ode ) ;
48 if ( p!=NULL) p−>p r i n t D e t a i l s ( ) ;
49 else out<<"Book not found \n" ;
50 }
51 else
52 if ( o p t i o n==3)
53 {
54 mylib . showBooks ( ) ;
55 }
56 else
7
57 if ( o p t i o n==4)
58 {
59 out<<" Enter ode \n" ;
60 i n >> ode ;
61 mylib . delBook ( ode ) ;
62 }
63 }while ( o p t i o n ! = 5 ) ;
64 return 0 ;
65 }
Με βάσvη τα παραπάνω να γίνουν οι επόμενες αλλαγές:

1. Να προσvθέσvετε μια μέθοδο int ountBooks(string author) που θα επισvτρέφει


το πλήθος των βιβλίων του author
2. Να διορθώσvετε την μέθοδο addBook(Book *p) ώσvτε αν υπάρχει ήδη το
βιβλίο με κωδικό ίδιο με του βιβλίου p, να μην γίνεται προσvθήκη του βιβλίου

8
Κληρονομικότητα και τελεσvτές

Ιωάννης Γ. Τσvούλος
May 16, 2015

1 Το παράδειγμα των σvχημάτων


Η κατηγορία Shape υλοποιεί αφηρημένα σvχήματα. Στα δημόσvια πεδία υπάρχουν οι
υπερβατικές μέθοδοι area() και perimeter() για εμβαδό και περίμετρο αντίσvτοιχα
καθώς και η μέθοδος printDetails() που εμφανίζει σvτοιχεία του σvχήματος. Η
δήλωσvη της κατηγορίας έχει ως ακολούθως:
1 # ifndef __SHAPE__H
2 # define __SHAPE__H
3 lass Shape
4 {
5 publi :
6 virtual double a r e a ( ) = 0 ;
7 virtual double p e r i m e t e r ( ) = 0 ;
8 void p r i n t D e t a i l s ( ) ;
9 friend bool operator <=(Shape &a , Shape &b ) ;
10 };
11 # endif
Ο κώδικας της κατηγορίας Shape έχει ως ακολούθως:
1 # in lude " shape . h"
2 # in lude <i o s t r e a m >
3 using namespa e s t d ;
4 void Shape : : p r i n t D e t a i l s ( )
5 {
6 out<<" Area i s "<<a r e a ()<<e n d l ;
7 out<<" P e r i m e t e r i s "<<p e r i m e t e r ()<<e n d l ;
8 }
9
10 bool operator <=(Shape &a , Shape &b )
11 {
12 if ( a . a r e a ()<=b . a r e a ( ) ) return true ;
13 else return false ;
14 }

1
Με βάσvη την κατηγορία Shape ορίζουμε τις κατηγορίες Cir le και Re tangle για
την υλοποίησvη κύκλων και ορθογωνίων αντίσvτοιχα. Η δήλωσvη της κατηγορίας
Cir le έχει ως ακολούθως:
1 # ifndef __CIRCLE__H
2 # define __CIRCLE__H
3 # in lude " shape . h"
4
5 lass C i r l e : publi Shape
6 {
7 private :
8 double X, Y,R;
9 publi :
10 C i r l e ( double a , double b , double ) ;
11 virtual double a r e a ( ) ;
12 virtual double p e r i m e t e r ( ) ;
13 double g e t x ( ) ;
14 double g e t y ( ) ;
15 double g e t r ( ) ;
16 void s e t C e n t e r ( double a , double b ) ;
17 double setR ( double a ) ;
18 };
19 # endif
Η υλοποίησvη της κατηγορίας Cir le είναι η επόμενη:
1 # in lude <math . h>
2 # in lude " i r l e . h"
3 C i r l e : : C i r l e ( double a , double b , double )
4 {
5 setCenter (a , b ) ;
6 setR ( ) ;
7 }
8
9 double C i r l e : : area ( )
10 {
11 return M_PI∗R∗R;
12 }
13
14 double Cir le : : perimeter ()
15 {
16 return 2 . 0 ∗ M_PI ∗ R;
17 }
18
19 double C i r l e : : getx ( )
20 {
21 return X;
2
22 }
23
24 double C i r l e : : gety ( )
25 {
26 return Y;
27 }
28
29 double Cir le : : getr ()
30 {
31 return R;
32 }
33
34 void Cir le : : setCenter ( double a , double b)
35 {
36 X=a ;
37 Y=b ;
38 }
39
40 double C i r l e : : setR ( double a)
41 {
42 if ( a<0)
43 R= 1 . 0 ;
44 else
45 R=a ;
46 }
Η κατηγορία Re tangle ορίζεται ως εξής:
1 # ifndef __RECTANGLE__H
2 # define __RECTANGLE__H
3 # in lude " shape . h"
4 lass R e t a n g l e : publi Shape
5 {
6 private :
7 double a ;
8 publi :
9 R e t a n g l e ( double ma ) ;
10 virtual double a r e a ( ) ;
11 virtual double p e r i m e t e r ( ) ;
12 double g e t a ( ) ;
13 void s e t a ( double ma ) ;
14 };
15 # endif
και η υλοποίησvή της είναι:
1 # in lude " r e t a n g l e . h"
2 Re tangle : : Re tangle ( double ma)
3
3 {
4 s e t a (ma ) ;
5 }
6
7 double Re tangle : : area ( )
8 {
9 return a∗a ;
10 }
11
12 double Re tangle : : perimeter ( )
13 {
14 return 4∗ a ;
15 }
16
17 double Re tangle : : geta ( )
18 {
19 return a;
20 }
21
22 void Re tangle : : seta ( double ma)
23 {
24 if (ma<0)
25 a=1;
26 else
27 a=ma ;
28 }
Τέλος μια ενδεικτική main() σvυνάρτησvη που δημιουργεί έναν πίνακα σvχημάτων και
εμφανίζει τα σvτοιχεία ταξινομημένα ως προς το εμβαδόν (φιλικός τελεσvτής <=)
είναι η επόμενη:
1 # in lude " i r l e . h"
2 # in lude " r e t a n g l e . h"
3 # in lude <i o s t r e a m >
4 using namespa e s t d ;
5
6 int main ( )
7 {
8 Shape ∗ s h a p e s [ 1 0 ℄ ;
9 int i,j;
10 double a,b, ;
11 for( i =0; i <10; i ++)
12 {
13 if
( i %2==0)
14 {
15 //make i r l e
16 out<<" Enter e n t e r o f i r l e " ;

4
17 i n >>a>>b ;
18 out<<" Enter R " ;
19 i n >> ;
20 s h a p e s [ i ℄=new
Cir le (a ,b , );
21 }
22 else
23 {
24 //make r e t a n g l e
25 out<<" Enter a " ;
26 i n >>a ;
27 s h a p e s [ i ℄=newRe tangle ( a ) ;
28 }
29 }
30 // s o r t s h a p e s
31 for ( i =0; i <10; i ++)
32 {
33 for ( j =0; j <9; j ++)
34 {
35 if ( ( ∗ s h a p e s [ j ℄) <=( ∗ s h a p e s [ j + 1 ℄ ) )
36 {
37 Shape ∗ t=s h a p e s [ j ℄ ;
38 s h a p e s [ j ℄= s h a p e s [ j + 1 ℄ ;
39 s h a p e s [ j +1℄= t ;
40 }
41 }
42 }
43 // p r i n t s h a p e s
44 for ( i =0; i <10; i ++)
45 {
46 out<<" Shape : "<<i <<e n d l ;
47 s h a p e s [ i ℄−> p r i n t D e t a i l s ( ) ;
48 }
49 // d e l e t e s h a p e s
50 for ( i =0; i <10; i ++)
51 delete shapes [ i ℄ ;
52 return 0;
53 }
Με βάσvη τα παραπάνω υλοποιήσvτε τα επόμενα:
1. Εμφανίσvτε σvτην σvυνάρτησvη main() το μικρότερο σvχήμα
2. Να προσvτεθεί η σvυνάρτησvη δημιουργίας Cir le(), σvτην οποία ο χρήσvτης
εισvάγει από το πληκτρολόγιο Χ, Υ,R
3. Να προσvτεθεί η σvυνάρτησvη δημιουργίας Re tangle(), σvτην οποία ο χρήσvτης
είσvαγει από το πληκτρολόγιο την πλευρά a

5
4. Να χρησvιμοποιήσvτε τις παραπάνω σvυναρτήσvεις δημιουργίας σvτην main()

2 Χρονικές σvτιγμές
Στην σvυνέχεια δημιουργείται μια κατηγορία για την περιγραφή χρονικών σvτιγμών
(Time) Εκτός των άλλων πεδίων η κατηγορία περιλαμβάνει και δύο τελεσvτές μονα-
διαίας αύξησvης και μείωσvης της χρονικής σvτιγμής. Η δήλωσvη της κατηγορίας Time
έχει ως ακολούθως:
1 # ifndef __TIME__H
2 lass Time
3 {
4 private :
5 int hour , minute , se ond ;
6 publi :
7 Time ( int h , int m, int s ) ;
8 void d e t a i l s ( ) ;
9 Time& operator ++();
10 Time& operator − − ();
11 };
12
13 # define __TIME__H
14 # endif
Η υλοποίησvη της κατηγορίας είναι:
1 # in lude <s t r i n g . h>
2 # in lude " time . h"
3 # in lude <i o s t r e a m >
4 using namespa e std ;
5
int int
6 Time : : Time ( h, m, int s)
7 {
8 hour=h ;
9 minute=m;
10 se ond=s ;
11 }
12
13 void Time : : d e t a i l s ( )
14 {
15 out<<hour<<" : "<<minute<<" : "<<se ond<<e n d l ;
16 }
17
18 Time& Time : : operator ++()
19 {
20 ++se ond ;
21 if
( se ond ==60)

6
22 {
23 minute ++;
24 se ond =0;
25 if( minute ==60)
26 {
27 minute =0;
28 ++hour ;
29 if
( hour==24) hour =0;
30 }
31 }
32 return ∗ this ;
33 }
34
35 Time& Time : : operator −−()
36 {
37 −−se ond ;
38 if
( se ond <0)
39 {
40 se ond =59;
41 minute −−;
42 if
( minute <0)
43 {
44 minute =59;
45 hour −−;
46 if
( hour <0) hour =23;
47 }
48 }
49 return this
∗ ;
50 }
Τέλος μια ενδεικτική main() σvυνάρτησvη είναι η επόμενη:
1 # in lude " time . h"
2 int main ( )
3 {
4 Time t 1 ( 2 3 , 5 9 , 5 9 ) ;
5 t1 . d e t a i l s ( ) ;
6 ++t 1 ;
7 t1 . d e t a i l s ( ) ;
8 Time t 2 ( 0 , 0 , 0 ) ;
9 t2 . d e t a i l s ( ) ;
10 −−t 2 ;
11 t2 . d e t a i l s ( ) ;
12 return 0;
13 }
Με βάσvη τα παραπάνω να κάνετε τα ακόλουθα:

7
1. Να προσvτεθεί σvυνάρτησvη δημιουργίας Time() σvτην οποία ο χρήσvτης θα
εισvάγει από το πληκτρολόγιο τα σvτοιχεία της χρονικής σvτιγμής. ΄Ακυρες
τιμές πχ. αρνητική ώρα δεν θα επιτρέπονται και ο χρήσvτης θα πρέπει να τις
εισvάγει ξανά.
2. Να δημιουργηθεί φιλικός τελεσvτής - ανάμεσvα σvε αντικείμενα Time. Το
αποτέλεσvμα θα είναι η διαφορά των δύο χρονικών σvτιγμών σvε δευτερόλεπτα

You might also like