Περιεχόμενα Λίγα λόγια για αυτή την έκδοση...... 23 Κεφάλαιο 1 Εισαγωγή... 25 O στόχος του βιβλίου και σε ποιους απευθύνεται... 27 Πώς να διαβάσετε αυτό το βιβλίο... 27 Εκπαίδευση από απόσταση... 29 Ιστορική αναδρομή... 30 Τα χαρακτηριστικά της C++... 30 Η κληρονομιά από τη C... 30 C++, μια αντικειμενοστρεφής γλώσσα... 32 C++, μια μεταγλωττίσιμη γλώσσα... 32 Γιατί να μάθω C++;... 34 Βασικές έννοιες του προγραμματισμού... 35 Μεταβλητές... 35 Σταθερές... 37 Παραστάσεις... 37 Εντολές... 38 Αναγνωριστικά... 38 Φιλοσοφίες και τεχνικές προγραμματισμού... 38 Μη δομημένος προγραμματισμός... 39 Δομημένος διαδικαστικός προγραμματισμός... 39 Τμηματικός προγραμματισμός... 40 Αντικειμενοστρεφής προγραμματισμός... 40 Κλάσεις και αντικείμενα... 42 Ενθυλάκωση... 44 Αφαιρετικότητα... 45 Κληρονομικότητα... 47 Πολυμορφισμός... 48 Και όμως είναι αντικείμενα!... 50 Σχεδιασμός και ανάπτυξη προγραμμάτων... 51 Λογικό διάγραμμα... 51 Αντικειμενοστρεφής σχεδιασμός UML... 51
10 H γλώσσα C++ σε βάθος Κεφάλαιο 2 Μια πρώτη ματιά στη C++... 55 Η δομή ενός προγράμματος της C++... 57 Το πρώτο σας πρόγραμμα στη C++... 59 Ας ξαναγράψουμε το πρώτο μας πρόγραμμα... 60 Προγράμματα με περισσότερες συναρτήσεις... 61 Σχόλια προγράμματος... 62 Τρόπος γραφής... 63 Δηλώσεις μεταβλητών... 64 Ανάθεση τιμής σε μεταβλητή... 65 Αρχικές τιμές μεταβλητών... 66 Μεταβλητές μόνο για ανάγνωση... 66 Παραστάσεις... 66 Παραστάσεις με μέλη διαφορετικού τύπου... 70 Λογικές παραστάσεις... 70 Αλφαριθμητικές παραστάσεις... 72 Είδη προτάσεων... 73 Παραδείγματα κώδικα με παραστάσεις... 74 Μετατροπή τύπου κατά την ανάθεση τιμής σε μεταβλητή... 75 Η C++ και οι αγκύλες της... 76 Σύνθετη πρόταση (compound statement)... 76 Ο προ-μεταγλωττιστής της C++... 77 Η οδηγία #include... 77 Η οδηγία #define... 77 Κεφάλαιο 3 Προετοιμασία για αργότερα... 85 Η C++ και η μνήμη... 86 Ο τελεστής &... 87 Ο τελεστής sizeof... 87 Δύο αντικείμενα, μια συνάρτηση και μια εντολή... 88 Είσοδος/έξοδος... 88 Το αντικείμενο cout... 88 Το αντικείμενο cin... 91 Η συνάρτηση exit()... 93 Ολίγη if παρακαλώ... 94 Χώροι ονομάτων... 96 Χώροι ονομάτων (namespaces) της C++... 97 Η καθιερωμένη βιβλιοθήκη της C++... 99
Περιεχόμενα 11 Κεφάλαιο 4 Οι βασικοί τύποι δεδομένων της C++... 107 Ο τύπος δεδομένων int... 108 Σταθερές τύπου int... 108 Μεταβλητές τύπου int... 108 Ακέραιοι αριθμοί χωρίς πρόσημο (unsigned)... 109 Αριθμητικοί τελεστές... 109 Προτεραιότητα τελεστών... 116 Οι τύποι δεδομένων float και double... 120 Σταθερές τύπου float και double... 120 Μεταβλητές τύπου float και double... 120 Χρήση δεδομένων τύπου κινητής υποδιαστολής... 120 Η χρήση του αντικειμένου cout για μορφοποιημένη έξοδο... 121 Οι συναρτήσεις pow() και sqrt()... 123 Ο τύπος δεδομένων char... 126 Σταθερές τύπου char... 126 Μεταβλητές τύπου char... 127 Ο πίνακας ASCII... 128 Ο τύπος wchar_t... 129 Συμβολοσειρές (character strings)... 129 Οι συμβολοσειρές έχουν τιμή... 129 Μια πρώτη ματιά στη κλάση string... 130 Ο τύπος δεδομένων bool... 136 Σταθερές τύπου bool... 136 Μεταβλητές τύπου bool... 136 Σταθερές και αυτόματη μετατροπή τύπου... 137 Απόλυτος προσδιορισμός τύπου αριθμητικών σταθερών... 138 Αυτόματη μετατροπή τύπου... 140 Προσθήκες προτύπου C++11... 141 Αυτόματος τύπος δεδομένων... 141 Κεφάλαιο 5 Εντολές συνθήκης... 151 Η εντολή if με μια δεύτερη ματιά... 152 H απλή πρόταση if... 152 Η πρόταση if-else... 153 Η πρόταση if-else if... 153 Η εντολή switch-case... 155 Ο τελεστής συνθήκης?:... 157
12 H γλώσσα C++ σε βάθος Κεφάλαιο 6 Δομές επανάληψης... 167 Ο βρόχος while... 169 O βρόχος do-while... 170 Ο βρόχος for... 171 Χορεύοντας με τη for!... 174 Απλά παραδείγματα... 174 Ένθετοι βρόχοι for... 176 Κλιμακωτή γραφή... 178 Ο τελεστής «κόμμα» (,)... 180 Η εντολή break... 181 Η εντολή continue... 182 Καταμέτρηση και άθροιση σε επαναλαμβανόμενες διαδικασίες... 182 Κεφάλαιο 7 Συναρτήσεις... 195 Oρισμός μιας συνάρτησης... 197 Συναρτήσεις χωρίς παραμέτρους... 197 Συναρτήσεις με παραμέτρους... 198 Συναρτήσεις που επιστρέφουν τιμή... 200 Συναρτήσεις που δεν επιστρέφουν τιμή: Ο τύπος void... 201 Η κλήση μιας συνάρτησης... 202 Παράμετροι συνάρτησης... 203 Ορίσματα και μεταβίβαση παραμέτρων... 204 Συναρτήσεις χωρίς παραμέτρους, με ρητή δήλωση... 205 Χρήση συναρτήσεων βιβλιοθήκης... 206 Πρωτότυπα συναρτήσεων... 207 Μετατροπή τύπου (type casting)... 208 Αυτόματη μετατροπή τύπου... 209 Υπερφόρτωση συναρτήσεων... 213 Συναρτήσεις με προκαθορισμένες τιμές παραμέτρων... 215 Υπερφόρτωση συναρτήσεων και ασάφεια... 217 Κεφάλαιο 8 Εμβέλεια μεταβλητών... 235 Τοπικές μεταβλητές (local variables)... 236 Δήλωση τοπικών μεταβλητών σε σύνθετη πρόταση... 239 Δήλωση τοπικής μεταβλητής σε βρόχο for... 239 Καθολικές μεταβλητές (global variables)... 240 Χρόνος ζωής καθολικών και τοπικών μεταβλητών... 242 Στατικές τοπικές μεταβλητές (static local variables)... 243
Περιεχόμενα 13 Κεφάλαιο 9 Δείκτες... 255 Η C++ και οι δείκτες... 257 Μεταβλητές δείκτη (pointer variables)... 257 Δήλωση μιας μεταβλητής δείκτη... 257 Οι τελεστές & και *... 258 Αριθμητική δεικτών... 262 Δείκτες τύπου void... 264 Δείκτης NULL... 265 Δείκτες και συμβολοσειρές... 265 Δείκτες σε δείκτες... 268 Κεφάλαιο 10 Προχωρημένα θέματα συναρτήσεων... 281 Κλήση συνάρτησης με τιμή, δείκτη και αναφορά... 282 Κλήση συνάρτησης με δείκτη... 283 Κλήση συνάρτησης με αναφορά... 284 Συναρτήσεις που επιστρέφουν ως τιμή έναν δείκτη... 286 Συναρτήσεις που επιστρέφουν ως τιμή μια αναφορά... 288 Παραστάσεις αριστερής τιμής (lvalue) και δεξιάς τιμής (rvalue)... 289 Δείκτες σε συναρτήσεις... 289 Δήλωση δείκτη σε συνάρτηση... 290 Ανάθεση τιμής σε μεταβλητή δείκτη σε συνάρτηση... 290 Κλήση συνάρτησης με δείκτη σε συνάρτηση... 291 Έλεγχος των περιεχομένων ενός δείκτη σε συνάρτηση... 292 Δείκτες σε συναρτήσεις ως παράμετροι... 292 Δείκτες σε συναρτήσεις και αντικείμενα της C++... 293 Εμβόλιμες συναρτήσεις (inline functions)... 293 Προσθήκες προτύπου C++11... 295 Η λέξη-κλειδί nullptr... 295 Κεφάλαιο 11 Πίνακες... 303 Πίνακες μίας διάστασης... 305 Χειρισμός πινάκων μίας διάστασης... 307 Πίνακες χαρακτήρων μίας διάστασης και συμβολοσειρές... 309 Αρχικές τιμές πίνακα μίας διάστασης... 311 Οι πίνακες χαρακτήρων και τα αντικείμενα cin και cout... 311 Πίνακες μίας διάστασης και δείκτες... 313 Μεταβίβαση πίνακα μίας διάστασης σε συνάρτηση... 316 Χειρισμός πινάκων μίας διάστασης μέσω συναρτήσεων... 318
14 H γλώσσα C++ σε βάθος Συναρτήσεις και συμβολοσειρές... 319 Συναρτήσεις βιβλιοθήκης που εφαρμόζονται σε συμβολοσειρές... 321 Μεταβίβαση πινάκων χωρίς δυνατότητα τροποποίησης... 324 Αντικείμενα string και πίνακες... 325 Η συνάρτηση getline()... 326 Πίνακες από αντικείμενα string... 327 Πίνακες πολλών διαστάσεων... 328 Πίνακες δύο διαστάσεων... 328 Χειρισμός πινάκων δύο διαστάσεων... 330 Συμπλήρωση πίνακα δύο διαστάσεων με τυχαίους αριθμούς... 330 Άθροισμα στοιχείων πίνακα δύο διαστάσεων... 331 Εύρεση της μεγαλύτερης και της μικρότερης τιμής σε πίνακα δύο διαστάσεων... 331 Επεξεργασία πίνακα δύο διαστάσεων ανά γραμμή και ανά στήλη... 332 Αρχικές τιμές πινάκων δύο διαστάσεων... 333 Πίνακες δύο διαστάσεων και δείκτες... 334 Μεταβίβαση πινάκων δύο διαστάσεων σε συναρτήσεις... 335 Πίνακες με περισσότερες διαστάσεις... 335 Μεταβίβαση πινάκων πολλών διαστάσεων σε συναρτήσεις... 337 Μέγεθος πίνακα... 337 Πότε χρησιμοποιούμε πίνακες πολλών διαστάσεων... 338 Ειδικοί πίνακες... 339 Πίνακες δεικτών... 339 Δείκτες σε πίνακες... 340 Πίνακες δεικτών σε πίνακες... 341 Πίνακες δεικτών σε συναρτήσεις... 342 Κεφάλαιο 12 Τύποι δεδομένων οριζόμενοι από τον χρήστη... 357 Δομές... 359 Αναφορά στα μέλη μιας δομής... 363 Απόδοση αρχικών τιμών στα μέλη μιας δομής... 364 Πίνακες από δομές... 365 Μεταβίβαση δομής σε συνάρτηση... 366 Δείκτες σε δομές... 367 Σύνθετες δομές... 369 Πίνακες ως μέλη δομών... 370 Χρήση του τελεστή ανάθεσης τιμής με δομές του ίδιου τύπου... 371 Μέλη εύρους ενός ή περισσότερων bit (bit fields)... 371 Συναρτήσεις ως μέλη δομής... 372 Δομές και κλάσεις (classes)... 374
Περιεχόμενα 15 Ενώσεις (unions)... 375 Απαριθμήσεις (Enumerations)... 376 Η χρήση της typedef... 378 Χρήση της typedef για πιο σύντομες και ευανάγνωστες δηλώσεις... 379 Κεφάλαιο 13 Κλάσεις και αντικείμενα... 391 Παίζοντας με αντικείμενα... 392 Τι είναι κλάση και τι αντικείμενο... 394 Ορισμός μιας κλάσης... 396 Ορισμός και χρήση αντικειμένων... 397 Δημόσια και ιδιωτικά μέλη κλάσης... 401 Μέθοδοι δόμησης και αποδόμησης... 406 Προκαθορισμένες μέθοδοι δόμησης και αποδόμησης... 407 Μέθοδοι δόμησης με παραμέτρους... 408 Υπερφόρτωση μεθόδων... 411 Υπερφόρτωση μεθόδων δόμησης... 411 Ανάθεση τιμών σε αντικείμενα... 412 Πίνακες από αντικείμενα... 413 Μεταβλητές μέλη με αρχικές τιμές... 415 Προκαθορισμένες τιμές στις παραμέτρους μεθόδων... 416 Κλάσεις και δομές... 418 Σκεφτείτε αντικειμενοστρεφώς... 419 Διαδικαστική αντιμετώπιση... 420 Αντικειμενοστρεφής αντιμετώπιση... 421 Απεικόνιση κλάσεων με τη UML... 423 Κεφάλαιο 14 Επιπρόσθετα θέματα κλάσεων και αντικειμένων... 443 Μεταβίβαση αντικειμένων σε συναρτήσεις... 444 Μεταβίβαση κατ' αξία... 444 Μεταβίβαση κατ' αναφορά... 446 Συναρτήσεις που επιστρέφουν αντικείμενα... 447 Φίλιες συναρτήσεις και κλάσεις... 448 Φίλιες κλάσεις... 450 Δείκτες σε αντικείμενα... 451 Ο δείκτης this... 453 Μέθοδοι δόμησης αντιγράφου... 454 Στατικά μέλη μιας κλάσης... 455 Στατικές μεταβλητές-μέλη... 455 Στατικές μέθοδοι κλάσης... 459 Στατικές μεταβλητές-μέλη μόνο για ανάγνωση (const)... 460
16 H γλώσσα C++ σε βάθος Η κλάση string με μια δεύτερη ματιά... 461 Διαχείριση αντικειμένων της κλάσης string... 462 Σύνθετες κλάσεις... 467 Ένθετες κλάσεις... 471 Προκαταβολική δήλωση κλάσης... 473 Συσχέτιση κλάσεων... 474 Απεικόνιση συσχέτισης σύνθεσης με UML... 474 Λίστες αρχικοποίησης... 475 Πρόσθετα προτύπου C++11... 480 Άμορφες συμβολοσειρές... 480 Το προσδιοριστικό constexpr... 481 Κεφάλαιο 15 Υπερφόρτωση τελεστών... 499 Υπερφόρτωση τελεστών με χρήση μεθόδων της κλάσης... 501 Υπερφόρτωση διμελών τελεστών... 503 Υπερφόρτωση μονομελών τελεστών... 508 Υπερφόρτωση του τελεστή ανάθεσης =... 510 Υπερφόρτωση του τελεστή κλήσης συνάρτησης ()... 511 Υπερφόρτωση του τελεστή πίνακα []... 516 Υπερφόρτωση τελεστών με τη χρήση συναρτήσεων που δεν είναι μέλη κλάσης... 519 Υπερφόρτωση μεθόδων και συναρτήσεων υπερφόρτωσης τελεστών... 521 Κεφάλαιο 16 Κληρονομικότητα... 535 Δημιουργία παράγωγης κλάσης... 537 Προστατευμένα μέλη κλάσης... 539 Παράδειγμα κληρονομικότητας... 539 Δημόσια πρόσβαση σε βασική κλάση... 541 Ιδιωτική πρόσβαση σε βασική κλάση... 546 Προστατευμένη πρόσβαση σε βασική κλάση... 546 Αλλαγή προσδιοριστικού πρόσβασης για συγκεκριμένα μέλη... 550 Επίπεδα κληρονομικότητας... 551 Υποσκέλιση μεθόδων βασικής κλάσης (method override)... 554 Κληρονομικότητα και μέθοδοι δόμησης και αποδόμησης... 556 Λίστες αρχικοποίησης στην κληρονομικότητα... 558 Πού χρησιμεύει η κληρονομικότητα... 561
Περιεχόμενα 17 Κεφάλαιο 17 Προλυμορφισμός και συσχέτιση κλάσεων... 573 Πολυμορφισμός... 574 Δείκτες σε παράγωγες κλάσεις... 574 Αριθμητική δεικτών σε βασικές κλάσεις... 576 Εικονικές μέθοδοι... 576 Γιατί χρειάζονται οι εικονικές μέθοδοι;... 578 Εικονικές και μη εικονικές μέθοδοι... 580 Γνήσιες εικονικές μέθοδοι (pure virtual methods)... 581 Αφηρημένες κλάσεις (abstract classes)... 583 Κληρονομικότητα πολλών επιπέδων και εικονικές μέθοδοι... 583 Αναπαράσταση εικονικών μεθόδων και αφηρημένων κλάσεων στη UML 584 Πολλαπλή κληρονομικότητα... 586 Εικονικές κλάσεις (virtual classes)... 589 Πολλαπλή κληρονομικότητα και μέθοδοι δόμησης... 592 Τι γίνεται με τις μεθόδους αποδόμησης;... 594 Συσχέτιση κλάσεων... 599 Συσχέτιση σύνθεσης... 601 Συσχέτιση συνάθροισης... 603 Συσχέτιση σύνδεσης... 605 Κλάσεις σύνδεσης... 607 Προσθήκες προτύπου C++11... 612 Τα προσδιοριστικά override και final... 612 Το προσδιοριστικό final... 613 Κεφάλαιο 18 Ρεύματα εισόδου και εξόδου της C++... 621 Προκαθορισμένα αντικείμενα ρευμάτων... 625 Οι τελεστές εισαγωγής << και εξαγωγής >>... 625 Μνήμη προσωρινής αποθήκευσης... 627 Μορφοποιημένη είσοδος/έξοδος (formatted Ι/Ο)... 628 Σημαίες μορφοποίησης... 628 Χειριστές... 631 Μορφοποίηση με χρήση μεθόδων... 635 Προσαρμοσμένοι χειριστές... 636 Οι μέθοδοι getline() και ignore()... 638 Υπερφόρτωση τελεστών εισαγωγής και εξαγωγής... 640 Χειρισμός αρχείων... 643 Σειριακή και τυχαία προσπέλαση... 643 Άνοιγμα και κλείσιμο αρχείων... 645 Μορφοποιημένη είσοδος/έξοδος σε αρχεία κειμένου... 648
18 H γλώσσα C++ σε βάθος Σφάλματα ρευμάτων... 651 Ανάγνωση και εγγραφή αντικειμένων κλάσης string... 654 Ανακεφαλαίωση... 656 Μη μορφοποιημένη είσοδος/έξοδος σε δυαδικά αρχεία... 658 Η μέθοδος put()... 658 Η μέθοδος get()... 658 Οι μέθοδοι write() και read()... 660 Οι μέθοδοι peek(), putback() και flush()... 663 Αρχεία και αντικείμενα... 665 Υπερφόρτωση των τελεστών << και >> για ρεύματα αρχείων... 665 Διαχείριση αρχείων από τις μεθόδους κλάσεων... 667 Εγγραφή και ανάγνωση αντικειμένων με χρήση των μεθόδων write() και read()... 669 Τυχαία προσπέλαση αρχείων... 672 Οι μέθοδοι seekg(), seekp(), tellg() και tellp()... 672 Η λογική της τυχαίας προσπέλασης... 676 Συμβολοσειρές ως ρεύματα εισόδου/εξόδου... 682 Παράμετροι γραμμής εντολών... 684 Κεφάλαιο 19 Αναδρομή, αναζήτηση και ταξινόμηση... 701 Αναδρομή... 702 Αναζήτηση και ταξινόμηση... 706 Σειριακή αναζήτηση... 706 Δυαδική αναζήτηση... 708 Ταξινόμηση φυσαλίδας... 711 Ταξινόμηση quick sort... 714 Ταξινόμηση πίνακα με αντικείμενα string... 718 Αντικειμενοστρεφής προσέγγιση... 719 Ταξινόμηση πίνακα αντικειμένων... 721 Κεφάλαιο 20 Δυναμική διαχείριση μνήμης... 731 Δυναμική κατανομή μνήμης... 734 Ο τελεστής new... 734 Ο τελεστής delete... 737 Αλλαγή στο μέγεθος ενός πίνακα... 738 Μέθοδοι δόμησης και αποδόμησης και δυναμική κατανομή μνήμης... 739 Εικονικές μέθοδοι αποδόμησης... 742 Μέθοδοι δόμησης αντιγράφου... 744 Ο παλιός μηχανισμός δυναμικής κατανομής μνήμης... 749
Περιεχόμενα 19 Κεφάλαιο 21 Δυναμικές δομές δεδομένων... 755 Συνδεδεμένες λίστες... 757 Απλά συνδεδεμένη λίστα... 757 Κυκλικά συνδεδεμένη λίστα... 758 Διπλά συνδεδεμένη λίστα... 758 Προσθήκη νέου κόμβου σε λίστα... 759 Υλοποίηση συνδεδεμένης λίστας στη C++... 761 Υλοποίηση της δομής στοίβας... 766 Υλοποίηση της δομής ουράς... 772 Συνοψίζοντας... 776 Δυαδικά δένδρα... 777 Δυαδικά δένδρα αναζήτησης... 778 Χειρισμός ενός δυαδικού δένδρου αναζήτησης... 780 Διάσχιση δυαδικού δέντρου αναζήτησης... 783 Διαγραφή κόμβου από δυαδικό δέντρο αναζήτησης... 785 Υλοποίηση της δομής δυαδικού δένδρου αναζήτησης... 787 Κεφάλαιο 22 Πρότυπα, εξαιρέσεις, και χώροι ονομάτων... 801 Πρότυπα συναρτήσεων και κλάσεων... 802 Πρότυπα συναρτήσεων... 802 Ρητή υπερφόρτωση προτύπου συνάρτησης... 808 Υπερφόρτωση πρότυπου συνάρτησης... 808 Πρότυπα συναρτήσεων με περισσότερες παραμέτρους... 809 Πρότυπα κλάσεων... 810 Δημιουργία προτύπου κλάσης στοίβας... 813 Πρότυπα κλάσεων με περισσότερες παραμέτρους... 818 Άτυπες παράμετροι στον ορισμό πρότυπων κλάσεων... 819 Εξαιρέσεις... 821 Πώς αντιμετωπίζονταν οι εξαιρέσεις μέχρι τώρα... 821 Η φιλοσοφία του χειρισμού εξαιρέσεων... 821 Ο χειρισμός εξαιρέσεων της C++... 822 Εξαιρέσεις που συμβαίνουν στα... βαθιά... 827 Κλάσεις εξαιρέσεων... 829 Αντικείμενα εξαίρεσης που μεταφέρουν πληροφορίες... 832 Εξαιρέσεις με παράγωγες κλάσεις... 832 Ενσωματωμένες κλάσεις εξαιρέσεων... 833 Επανακατάθεση εξαίρεσης... 834
20 H γλώσσα C++ σε βάθος Χώροι ονομάτων... 836 Προγράμματα με περισσότερα αρχεία κεφαλίδας... 839 Η χρησιμότητα των χώρων ονομάτων... 840 Ο χώρος ονομάτων std... 841 Ανώνυμοι χώροι ονομάτων... 842 Κεφάλαιο 23 Ο μεταγλωτιστής GCC... 855 Προγράμματα με πολλά πηγαία αρχεία... 856 Μεταγλώττιση και σύνδεση μεμονωμένων αρχείων... 856 Μεταγλώττιση και σύνδεση ξεχωριστών αρχείων... 858 Δημιουργία δικών μας βιβλιοθηκών... 860 Ο προμεταγλωττιστής της C++... 866 Οι οδηγίες του προμεταγλωττιστή... 866 Η οδηγία #include... 866 Η οδηγία #define... 867 Χρήση της #define για ορισμό μακροεντολών... 868 Η οδηγία #undef... 870 Οι οδηγίες #if, #else, #elif και #endif... 870 Οι οδηγίες #ifdef και #ifndef... 873 Η οδηγία #error... 875 Αποσφαλμάτωση... 875 Η μακροεντολή assert()... 877 Κεφάλαιο 24 Μια ματιά στη καθιερωμένη βιβλιοθήκη προτύπων... 889 Τι είναι η καθιερωμένη βιβλιοθήκη προτύπων STL;... 890 Αποδέκτες, αλγόριθμοι και επαναλήπτες... 890 Αποδέκτες... 892 Ακολουθιακοί αποδέκτες... 892 Συνειρμικοί αποδέκτες... 894 Προσαρμογείς αποδεκτών... 895 Επαναλήπτες... 897 Εμπρόσθιοι επαναλήπτες... 897 Επαναλήπτες διπλής κατεύθυνσης... 897 Επαναλήπτες τυχαίας προσπέλασης... 897 Επαναλήπτες εξόδου... 897 Επαναλήπτες εισόδου... 898
Περιεχόμενα 21 Αλγόριθμοι... 898 Ο αλγόριθμος find()... 899 O αλγόριθμος sort()... 900 O αλγόριθμος count()... 900 Ο αλγόριθμος copy()... 901 Αλγόριθμοι και αντικείμενα συναρτήσεων... 902 Ο αλγόριθμος count_if... 904 Ο αλγόριθμος for_each()... 904 Συνδυάζοντας όλα τα προηγούμενα... 905 Διανύσματα... 905 Ορισμός διανύσματος... 906 Χρήση μεθόδων στη διαχείριση διανυσμάτων... 906 Πρόσβαση στα στοιχεία ενός διανύσματος... 907 Μέγεθος και χωρητικότητα διανύσματος... 907 Χρήση επαναληπτών με αποδέκτες της κλάσης vector... 908 Εφαρμογή αλγορίθμων σε διανύσματα... 910 Διανύσματα με αντικείμενα προσαρμοσμένων κλάσεων... 911 Λίστες... 915 Μέθοδοι της κλάσης list... 915 Χρήση επαναληπτών και αλγορίθμων με αποδέκτες λίστας... 915 Αντιστοιχίες... 918 Αντιστοιχίες και επαναλήπτες... 919 Μέθοδοι και αλγόριθμοι σε αντιστοιχίες... 920 Η χρήση του υπερφορτωμένου τελεστή [ ]... 921 Χρήση της μεθόδου insert()... 922 Αντιστοιχίες με αντικείμενα προσαρμοσμένων κλάσεων... 922 Συμβατότητα αλγορίθμων, επαναληπτών και αποδεκτών... 924 Για κάτι περισσότερο...... 926 Πρόσθετα προτύπου C++11... 929 Οι συναρτήσεις begin() και end()... 929 Βρόχος for βασισμένος σε εύρος... 930 Παράρτημα Α... 937 Επιλεγμένες συναρτήσεις βιβλιοθήκης της C++... 937 Αρχείο κεφαλίδας <cctype>... 938 Αρχείο κεφαλίδας <cstdlib>... 939 Αρχείο κεφαλίδας <cstring>... 940 Αρχείο κεφαλίδας <cmath>... 942
22 H γλώσσα C++ σε βάθος Παράρτημα Β... 945 Το ολοκληρωμένο περιβάλλον του Code::Blocks... 946 Εγκατάσταση του Code::Blocks... 946 Οι βασικές λειτουργίες του Code::Blocks... 947 Παραμετροποίηση του περιβάλλοντος για χρήση ελληνικών χαρακτήρων 947 Παραμετροποίηση του περιβάλλοντος για χρήση του πρότυπου C++11... 947 Δημιουργία νέου πηγαίου αρχείου ή έργου... 948 Σύνταξη του κώδικα... 948 Αποθήκευση του πηγαίου αρχείου... 949 Μεταγλώττιση και εκτέλεση του πηγαίου αρχείου... 949 Μηνύματα μεταγλωττιστή... 950 Αντιστοίχιση ελληνικών και αγγλικών όρων... 951 Βιβλιογραφία... 959 Ευρετήριο... 963
Λίγα λόγια για αυτή την έκδοση... Η συγγραφή της πρώτης έκδοσης του βιβλίου ξεκίνησε το 2006, αμέσως μετά από την έκδοση του πρώτου μου βιβλίου Η γλώσσα C σε βάθος που αφορούσε τον διαδικαστικό προγραμματισμό και τη γλώσσα C. Το κίνητρο για τη συγγραφή αυτού του βιβλίου ήταν το ίδιο με αυτό της συγγραφής του πρώτου μου βιβλίου: διδάσκοντας τη γλώσσα C++ δεν μπορούσα να εντοπίσω βιβλία που να δίνουν περισσότερο βάρος στο εκπαιδευτικό έργο αντί να είναι βιβλία αναφοράς και «εγχειρίδια» της γλώσσας. Το 2009 άρχισα να διδάσκω αντικειμενοστρεφή προγραμματισμό στο τμήμα Πολιτισμικής Τεχνολογίας και Επικοινωνίας του Πανεπιστημίου Αιγαίου. Η διαδικασία της διδασκαλίας σε τόσους πολλούς φοιτητές μου έδωσε την ευκαιρία να εντοπίσω τα σημεία που τους δυσκόλευαν περισσότερο και να δοκιμάσω διάφορες εκπαιδευτικές προσεγγίσεις. Η προσπάθεια αυτή αποτυπώνεται στην παρούσα έκδοση του βιβλίου, όπου έχουν γίνει σημαντικές προσθήκες και αλλαγές στα υπάρχοντα κεφάλαια ενώ προστέθηκε α- κόμη ένα. Η δεύτερη αυτή έκδοση δίνει ακόμα μεγαλύτερο βάρος στο εκπαιδευτικό ύφος του βιβλίου και πλαισιώνεται από περισσότερα παραδείγματα και ασκήσεις, προσανατολισμένα στην εμβάθυνση των εννοιών και των ιδιαίτερων χαρακτηριστικών της γλώσσας. Έχει καταβληθεί ιδιαίτερη προσπάθεια ώστε ο αναγνώστης να αποκτήσει «αντικειμενοστρεφή» τρόπο σκέψης, να μάθει να σχεδιάζει τα προγράμματα του με αυτόν τον τρόπο και όχι απλά να χρησιμοποιεί τα αντικειμενοστρεφή χαρακτηριστικά της γλώσσας. Σε αυτή την έκδοση έχουν ενσωματωθεί κάποια από τα στοιχεία που προτείνονται στο τελευταίο πρότυπο της γλώσσας (C++11). Το πρότυπο αυτό εισάγει πολλά νέα στοιχεία και δυνατότητες, τα περισσότερα από τα οποία είναι ιδιαίτερα εξειδικευμένα. Όμως, η ενσωμάτωση όλων των νέων στοιχείων θα ξέφευγε από τον καθαρά εκπαιδευτικό προσανατολισμό του βιβλίου. Η έκδοση αυτή άρχισε να γράφεται τον Σεπτέμβριο του 2012 και, με δεδομένο ότι θα αποτελούσε μια βελτίωση της πρώτης έκδοσης, νόμιζα ότι θα ήταν μια εύκολη και γρήγορη υπόθεση. Όμως ο πήχης ήδη είχε τεθεί πολύ ψηλά και θεώρησα ότι αρκετά πράγματα έπρεπε να αλλάξουν ριζικά. Έτσι, ενώ υπολόγιζα ότι θα ασχοληθώ με τη νέα έκδοση για λίγους μήνες, συμπλήρωσα χωρίς να το καταλάβω δύο ολόκληρα χρόνια καθημερινής δουλειάς. Νίκος Μ. Χατζηγιαννάκης
Κεφάλαιο Εισαγωγή
26 H γλώσσα C++ σε βάθος Εισαγωγή Ξεκίνησα τη "θητεία" μου ως προγραμματιστής όταν ακόμα τα προγράμματα γράφονταν σε διατρητικές μηχανές και όχι με το πληκτρολόγιο. Σε όλα αυτά τα χρόνια ασχολήθηκα με διάφορες γλώσσες προγραμματισμού, ξεκινώντας από τις γλώσσες της εποχής εκείνης, όπως η θρυλική FORTRAN, η ακαδημαϊκή PASCAL, η επαναστατική ALGOL και η συναρπαστική γλώσσα μηχανής ASSEMBLY. Αργότερα, ως μεταπτυχιακός φοιτητής πια, χρησιμοποίησα τη BCPL και την κλασική C για τον προγραμματισμό συστημάτων, ενώ αργότερα ασχολήθηκα με γλώσσες οπτικού προγραμματισμού, όπως η VISUAL BASIC, αλλά και με γλώσσες 4ης γενιάς, όπως η PL-SQL. Δεν πέρασε πολύς καιρός και βρέθηκα αντιμέτωπος με μια νέα πρόκληση: μια γλώσσα αντικειμενοστρεφούς προγραμματισμού η οποία δεν ήταν άλλη από τη C++. Δεν άργησα να καταλάβω ότι θα έπρεπε να ξεχάσω όλα όσα ήξερα, να μπω σε μια διαφορετική λογική και να αλλάξω τη φιλοσοφία του σχεδιασμού και της ανάπτυξης των προγραμμάτων μου. Η πρόκληση ήταν μεγάλη, η προσπάθεια συνεχής, αλλά το αποτέλεσμα πάντα το ίδιο: επέστρεφα πάντα στις «κλασικές» γλώσσες προγραμματισμού αρνούμενος να υιοθετήσω τη νέα αυτή λογική. Τελικά βρήκα τη λύση στη φράση που γνωρίζει πολύ καλά ο κάθε εκπαιδευτικός: "Αν θες να πιστέψεις σε κάτι και να το μάθεις σε βάθος, θα πρέπει πρώτα να το διδάξεις". Έτσι λοιπόν άρχισα να διδάσκω τη C++ και τις αρχές του αντικειμενοστρεφούς προγραμματισμού, χωρίς μέχρι τότε να τις έχω υιοθετήσει ούτε εγώ ο ίδιος. Πολύ γρήγορα συνειδητοποίησα ότι ο αντικειμενοστρεφής προγραμματισμός είναι η πιο συναρπαστική, αλλά και μυστηριώδης, καινοτομία στην ανάπτυξη λογισμικού στην ι- στορία της επιστήμης των υπολογιστών. Παρόλο που διατηρεί αρκετά από τα χαρακτηριστικά των "παραδοσιακών" γλωσσών προγραμματισμού, εισάγει πρωτόγνωρες έννοιες και τεχνικές, οι οποίες όμως τις περισσότερες φορές δύσκολα γίνονται κατανοητές. Ο αρχικός δισταγμός μου και η δυσκολία που αντιμετώπισα στην πρώτη μου επαφή με μια αντικειμενοστρεφή γλώσσα ήταν το βασικό μου κίνητρο για την συγγραφή αυτού του βιβλίου. Το βιβλίο αυτό δεν προϋποθέτει γνώσεις προγραμματισμού. Απευθύνεται τόσο στον αρχάριο σπουδαστή όσο και στον έμπειρο προγραμματιστή που θέλει να γνωρίσει τις αρχές και τη φιλοσοφία του αντικειμενοστρεφούς προγραμματισμού, μέσα από μια ευέλικτη και χωρίς όρια γλώσσα όπως η C++. Αν όμως ο αναγνώστης γνωρίζει μια άλλη γλώσσα προγραμματισμού, και ιδιαίτερα τη C, θα μπορέσει να κατανοήσει γρηγορότερα τις βασικές έννοιες ώστε να επικεντρωθεί στα αντικειμενοστρεφή χαρακτηριστικά της γλώσσας.
Κεφάλαιο 1: Εισαγωγή 27 Μεγάλο βάρος έχει δοθεί στη διδακτική σειρά αυτού του βιβλίου ώστε η ανάγνωση και η κατανόηση ενός κεφαλαίου να προϋποθέτει μόνο τις γνώσεις που αποκτήθηκαν στα προηγούμενα κεφάλαια. O στόχος του βιβλίου και σε ποιους απευθύνεται Μέσα από αυτό το βιβλίο προσπαθώ να δώσω στον ανυποψίαστο αναγνώστη αυτό που θα ήθελα να είχα εγώ όταν ήλθα για πρώτη φορά σε επαφή με μια γλώσσα αντικειμενοστρεφούς προγραμματισμού: Ένα βιβλίο το οποίο, χωρίς να πλατειάζει με τις αναμφισβήτητα αμέτρητες δυνατότητες μιας γλώσσας, να εισάγει με απλό και κατανοητό τρόπο τον αναγνώστη στις βασικές αρχές της φιλοσοφίας και της χρήσης του αντικειμενοστρεφούς προγραμματισμού. Το παρόν βιβλίο δεν αποτελεί ένα ακόμη εγχειρίδιο της γλώσσας, αλλά ένα εργαλείο εκπαίδευσης στις αρχές και τη φιλοσοφία του αντικειμενοστρεφούς προγραμματισμού μέσα από την πιο δημοφιλή σήμερα γλώσσα, τη C++. Το βιβλίο απευθύνεται κυρίως σε όσους διδάσκονται τη C++ ως πρώτη ή ως μεταγενέστερη γλώσσα προγραμματισμού σε εκπαιδευτικά ιδρύματα κάθε βαθμίδας, αλλά και σε όσους θα ήθελαν να μάθουν και να κατανοήσουν μόνοι τους τη γλώσσα C++ και τη φιλοσοφία του αντικειμενοστρεφούς προγραμματισμού. Πώς να διαβάσετε αυτό το βιβλίο Αν γνωρίζετε οποιαδήποτε άλλη γλώσσα προγραμματισμού, μπορείτε να ρίξετε μια γρήγορη ματιά σε αυτό το κεφάλαιο και μετά να προχωρήσετε κατευθείαν στο επόμενο. Η C++, όπως υποδηλώνει και το όνομά της αλλά και όπως θα γίνει αντιληπτό και αργότερα, έχει στενή συγγένεια με τη γλώσσα C. Η C++ έχει δανειστεί πολλά από τα χαρακτηριστικά της C, οπότε ένας αναγνώστης που έχει έστω και μικρή γνώση της γλώσσας C ξεκινά με σαφές πλεονέκτημα. Το Κεφάλαιο 2 είναι μια μικρή "περιοδεία" στη γλώσσα. Γίνεται μια πρώτη γνωριμία, ώστε να αποκτήσετε μια σφαιρική εικόνα για τη δομή και τα χαρακτηριστικά της για να μπορέσετε να δημιουργήσετε τα πρώτα σας απλά προγράμματα. Τα Κεφάλαια 3 έως 12 αναλύουν τα μη αντικειμενοστρεφή χαρακτηριστικά της γλώσσας, δίνοντας έμφαση στην παρουσίαση των βασικών, αλλά και των περισσότερο πολύπλοκων, εννοιών, με απλό, εποπτικό και κατανοητό τρόπο. Αν έχετε λίγες γνώσεις της γλώσσας C, μπορείτε να κάνετε μια γρήγορη ανάγνωση των Κεφαλαίων 3-6 και να δώσετε βάρος στα επόμενα κεφάλαια. Αν είστε έμπειρος χρήστης της γλώσσας C, μπορείτε να κάνετε μια γρήγορη ανάγνωση των Κεφαλαίων 3-11 ώστε
28 H γλώσσα C++ σε βάθος να γνωρίσετε τα λιγοστά αντικειμενοστρεφή στοιχεία της γλώσσας C++ που χρησιμοποιούνται σε αυτά τα κεφάλαια. Αρκετές ενότητες σε αυτά τα πρώτα κεφάλαια του βιβλίου είναι παρόμοιες με τις αντίστοιχες ενότητες του βιβλίου μου Η γλώσσα C σε βάθος. Αυτό είναι μάλλον αναμενόμενο αφού αναφέρονται σε κοινές δυνατότητες των δύο γλωσσών. Στόχος του παρόντος βιβλίου είναι να ρίξει το βάρος στα αντικειμενοστρεφή χαρακτηριστικά της C++ και στη φιλοσοφία του αντικειμενοστρεφούς προγραμματισμού. Έτσι, σε αρκετά σημεία του βιβλίου όπου απαιτείται περισσότερη εμβάθυνση σε έννοιες και τεχνικές διαδικαστικού προγραμματισμού, παρέχονται παραπομπές προς το βιβλίο Η γλώσσα C σε βάθος. Τα επόμενα κεφάλαια, από το 13 και μετά, είναι μια βαθιά "βουτιά" στα αντικειμενοστρεφή χαρακτηριστικά της γλώσσας, σε τεχνικές προγραμματισμού και σε δομές δεδομένων. Το Παράρτημα Α περιέχει μια συνοπτική αναφορά στις πιο συχνά χρησιμοποιούμενες συναρτήσεις της C++. Στο Παράρτημα Β θα βρείτε λεπτομέρειες για το περιβάλλον α- νάπτυξης Code::Blocks 1. Το Code::Blocks είναι ένα ολοκληρωμένο περιβάλλον ανάπτυξης (Integrated Development Environment IDE) για τις γλώσσες C και C++, το οποίο διατίθεται κάτω από τη γενική άδεια χρήσης GNU 2 GPL v3.0 το οποίο σημαίνει ότι διατίθεται δωρεάν στον οποιονδήποτε. Όλα τα προγράμματα που υπάρχουν σε αυτό το βιβλίο έχουν δοκιμαστεί στο περιβάλλον του Code::Blocks. Στο συνοδευτικό CD θα βρείτε το πρόγραμμα εγκατάστασης για το ολοκληρωμένο περιβάλλον του Code::Blocks, τον κώδικα των περισσοτέρων προγραμμάτων που βρίσκονται σε αυτό το βιβλίο, καθώς και τις απαντήσεις όλων των ασκήσεων. επίσης, αποκλειστικά για το βιβλίο αυτό, έχει δημιουργηθεί ένας δικτυακός τόπος στη διεύθυνση http://cpp.bytes.gr με πλήθος αναφορών για τον αντικειμενοστρεφή προγραμματισμό και τη γλώσσα C++. Σας συνιστώ να εγκαταστήσετε άμεσα το περιβάλλον του Code::Blocks ώστε να μπορείτε να δοκιμάζετε τα παραδείγματα του βιβλίου, αλλά και τα δικά σας προγράμματα. Το σύμβολο δίπλα από τον τίτλο μιας ενότητας σημαίνει ότι η ενότητα αυτή περιγράφει εξειδικευμένα θέματα και μπορεί να παραλειφθεί αρχικά αν δεν επιθυμούμε ιδιαίτερη εμβάθυνση. 1 http://www.codeblocks.org 2 http://www.gnu.org
Κεφάλαιο 1: Εισαγωγή 29 Στο μαύρο πλαίσιο που υπάρχει δίπλα από τα περισσότερα παραδείγματα αυτού του βιβλίου, αναφέρεται το όνομα του αρχείου στο οποίο arxeio.cpp υπάρχει ο κώδικας του παραδείγματος. Αν έχετε εγκαταστήσει το Code::Blocks, ένα διπλό κλικ επάνω στο αρχείο του παραδείγματος είναι αρκετό για να ανοίξει το συγκεκριμένο αρχείο μέσα στο ολοκληρωμένο περιβάλλον του Code::Blocks. Στο τέλος μερικών κεφαλαίων υπάρχουν ιδιαίτερες αναφορές σε προσθήκες που έχουν γίνει στο πρότυπο C++11 και αφορούν το συγκεκριμένο κεφάλαιο. Επίσης, στο τέλος του βιβλίου υπάρχει μια λίστα αντιστοίχισης των ελληνικών όρων που χρησιμοποιούνται με τους αγγλικούς. Εκπαίδευση από απόσταση Ακόμα και το πιο καλό βιβλίο δεν αντικαθιστά την δια ζώσης εκπαίδευση. Θα ήταν ευχής έργο κάθε αναγνώστης του βιβλίου να έχει τη δυνατότητα να παρακολουθήσει μαθήματα προγραμματισμού, με την ίδια εκπαιδευτική σειρά και την ίδια φιλοσοφία αυτού του βιβλίου. Αυτό είναι μάλλον ανέφικτο για τους περισσότερους από εσάς, εκτός αν αποφασίσετε να μας επισκεφτείτε στη Μυτιλήνη! Εδώ όμως έρχονται η τεχνολογία, το Internet και οι πλατφόρμες ηλεκτρονικής μάθησης για να γεφυρώσουν αυτή την απόσταση. Έτσι, εδώ και αρκετό καιρό άρχιζε να χτίζεται σιγά-σιγά ένα σύστημα εκπαίδευσης από απόσταση βασισμένο στη πλατφόρμα ηλεκτρονικής μάθησης Moodle. Η πλατφόρμα αυτή είναι ανοιχτού κώδικα, έχει το μεγαλύτερο μερίδιο χρήσης παγκοσμίως και χρησιμοποιείται από τα περισσότερα εκπαιδευτικά ι- δρύματα. Το εκπαιδευτικό υλικό που αναπτύσσεται για την πλατφόρμα περιλαμβάνει μαθήματα με βίντεο, διαφάνειες μαθημάτων, εργαστηριακές ασκήσεις και ερωτήσεις αξιολόγησης. Φιλοδοξεί να αποτελέσει ένα ολοκληρωμένο σύστημα εκπαίδευσης από απόσταση, ακολουθώντας τη διδακτική σειρά του βιβλίου. Τα πλεονεκτήματα της εξ' αποστάσεως εκπαίδευσης είναι προφανή: Δεν χρειάζεται η φυσική παρουσία του εκπαιδευτή. Ο εκπαιδευόμενος μπορεί να παρακολουθεί τα μαθήματα όποτε θέλει και όσες φορές θέλει. Ο εκπαιδευόμενος μπορεί να ελέγχει τις γνώσεις του μέσα από ερωτήσεις αυτοαξιολόγησης. Πολλά πανεπιστήμια διεθνώς, αλλά και στην Ελλάδα, χρησιμοποιούν πλατφόρμες ηλεκτρονικής μάθησης, είτε ως υποστηρικτικό είτε ως αποκλειστικό σύστημα διδασκαλίας. Πληροφορίες για τη πλατφόρμα ηλεκτρονικής μάθησης θα βρείτε στην ιστοσελίδα του βιβλίου στη διεύθυνση http://cpp.bytes.gr/elessons
30 H γλώσσα C++ σε βάθος Ιστορική αναδρομή Η C++ αναπτύχθηκε με βάση τη C από τον Bjarne Stroustrup στα εργαστήρια Bell, την περίοδο 1983-1985. Πριν το 1983, ο Bjarne Stroustrup δανείστηκε τα αντικειμενοστρεφή χαρακτηριστικά της Simula (η οποία θεωρείται η πρώτη αντικειμενοστρεφής γλώσσα προγραμματισμού) και, συνδυάζοντάς τα με την αποδοτικότητα και την ευελιξία της C, δημιούργησε μια έκδοση της C που ονομάστηκε "C with Classes" (C με κλάσεις). Αυτή αποτέλεσε την πρώτη "πειραματική" έκδοση της C++, η οποία πήρε την τελική της ονομασία το 1983. Αρχικά, η C++ σχεδιάστηκε για το περιβάλλον του λειτουργικού συστήματος UNIX. Με τη C++ οι προγραμματιστές μπορούσαν να βελτιώσουν την ποιότητα των προγραμμάτων τους και ο κώδικας που παρήγαγαν μπορούσε να επαναχρησιμοποιηθεί πιο εύκολα. Tη δεκαετία του 90 η C++ αποτέλεσε την κυρίαρχη γλώσσα προγραμματισμού σε απαιτητικές εφαρμογές και σε εφαρμογές μεγάλης κλίμακας. Οι συνεχείς βελτιώσεις και προσθήκες στη γλώσσα συνεχίστηκαν μέχρι το 1997, οπότε οριστικοποιήθηκε το πρότυπο της γλώσσας και πιστοποιήθηκε από διεθνείς οργανισμούς (ANSI, ISO κ.λπ.). Σήμερα οι διαφορετικές εκδόσεις της γλώσσας καλύπτουν όλα τα λειτουργικά συστήματα και αποτελούν αναμφίβολα την επιλογή των περισσότερων επαγγελματιών προγραμματιστών για την ανάπτυξη πολύπλοκων εφαρμογών. Τα χαρακτηριστικά της C++ Παρά το γεγονός ότι η C++ θεωρείται μια γλώσσα υψηλού επιπέδου (high-level), έχει αρκετά χαρακτηριστικά που συναντώνται μόνο σε γλώσσες χαμηλού επιπέδου και στη γλώσσα μηχανής. Τα χαρακτηριστικά αυτά της προσδίδουν εκπληκτική ευελιξία και τη δυνατότητα προγραμματισμού σε "χαμηλό επίπεδο". Ο βασικός κορμός της C++, όπως και της προγόνου της C, είναι λιτός. Η γλώσσα διαθέτει λίγες εντολές και μόνο τους βασικούς τύπους δεδομένων. Αξιοσημείωτο είναι ότι η C++ δεν έχει ενσωματωμένες εντολές εισόδου και εξόδου, ούτε και αρκετές εντολές που συναντώνται σε άλλες γλώσσες προγραμματισμού. Για τον λόγο αυτό, η C++ περιλαμβάνει μια καθιερωμένη βιβλιοθήκη (standard library) με κάθε είδους συναρτήσεις και αντικείμενα για είσοδο-έξοδο, χειρισμό χαρακτήρων, χειρισμό αρχείων κ.λπ. Η "προίκα" αυτή την κάνει να θεωρείται μια από τις πιο πλούσιες γλώσσες με μεγάλη ευελιξία και δυνατότητες επέκτασης. Η κληρονομιά από τη C Η C++ ξεκίνησε ως μια επέκταση της C, προσθέτοντας στην πλέον δημοφιλή αυτή γλώσσα αντικειμενοστρεφείς δυνατότητες. Όμως η βάση της γλώσσας και οι «παραδοσιακές» δομές της παραμένουν ίδιες με αυτές της C.
Κεφάλαιο 1: Εισαγωγή 31 Μπορούμε λοιπόν να ισχυριστούμε ότι η C αποτελεί ένα υποσύνολο της C++. Ένα πρόγραμμα γραμμένο σε C, με ελάχιστες ή καθόλου αλλαγές, θα μεταγλωττιστεί χωρίς πρόβλημα από οποιονδήποτε μεταγλωττιστή της C++. Η C++, όπως και η C, είναι μια ισχυρά δομημένη γλώσσα που επιτρέπει την αρθρωτή (τμηματική) οργάνωση (modularity) του προγράμματος, με τρόπο τέτοιο ώστε κάθε τμήμα να μπορεί να «κρύβει» τον κώδικα και τις πληροφορίες που περιέχει από το υπόλοιπο πρόγραμμα. Η C++ ενθαρρύνει τη χρήση ξεχωριστών συναρτήσεων (υποπρογραμμάτων) για κάθε συγκεκριμένη λειτουργία του προγράμματος. Κάθε συνάρτηση (function) μπορεί να έχει τα δικά της τοπικά δεδομένα, τα οποία είναι κρυμμένα από το υπόλοιπο πρόγραμμα. Τόσο στη C όσο και στη C++, η έλλειψη περιορισμών και το γεγονός ότι υπάρχει μικρός βαθμός ελέγχου λαθών, αναγκάζουν τον προγραμματιστή να είναι πολύ προσεκτικός και να ελέγχει, μέσα από τον κώδικα του προγράμματος, πράγματα που ελέγχονται αυτόματα από άλλες γλώσσες προγραμματισμού. Όμως, σε αυτή την «αδυναμία» της γλώσσας οφείλεται η ευελιξία, η ελευθερία, και η απόδοση που τη χαρακτηρίζουν. Σχήμα 1.1 Η σχέση των γλωσσών C και C++
32 H γλώσσα C++ σε βάθος C++, μια αντικειμενοστρεφής γλώσσα Η C++ μαζί με την Java και τη C# αποτελούν τις πλέον δημοφιλείς και χαρακτηριστικές γλώσσες αντικειμενοστρεφούς προγραμματισμού (Object Oriented Programming OOP). Οι αντικειμενοστρεφείς γλώσσες προγραμματισμού δίνουν περισσότερη έμφαση στα δεδομένα παρά στον κώδικα. Το πρόγραμμα αναπτύσσεται με βάση αντικείμενα που σχετίζονται με ένα πρόβλημα, και διαδικασίες (τον κώδικα) που επενεργούν σε αυτά τα αντικείμενα. Για παράδειγμα, αν θέλαμε να αναπτύξουμε ένα πρόγραμμα διαχείρισης ενοικιαζόμενων αυτοκινήτων, κάθε αυτοκίνητο προς ενοικίαση θα αποτελούσε ένα αντικείμενο. Η ενοικίαση ενός αυτοκινήτου θα γινόταν με την εφαρμογή μιας διαδικασίας (μεθόδου) σε αυτό το αντικείμενο. Αντίστοιχα, η επιστροφή ενός αυτοκινήτου από έναν πελάτη θα γινόταν με την εφαρμογή μιας άλλης μεθόδου κ.ο.κ. Η C++ υποστηρίζει πλήρως τα βασικά χαρακτηριστικά του αντικειμενοστρεφούς προγραμματισμού: την αφαιρετικότητα (abstraction), την ενθυλάκωση (encapsulation), τον πολυμορφισμό (polymorphism) και την κληρονομικότητα (inheritance). Οι έννοιες αυτές θα περιγραφούν συνοπτικά αργότερα σε αυτό το κεφάλαιο, και θα αναλυθούν διεξοδικά σε επόμενα κεφάλαια του βιβλίου. C++, μια μεταγλωττίσιμη γλώσσα Όλες οι γλώσσες προγραμματισμού (εκτός από τη γλώσσα μηχανής) μεταφράζουν το πηγαίο πρόγραμμα σε γλώσσα μηχανής είτε με έναν ερμηνευτή (interpreter) είτε με έναν μεταγλωττιστή (compiler). Για παράδειγμα, η BASIC είναι μια ερμηνευόμενη γλώσσα ενώ η C++ είναι μια μεταγλωττίσιμη γλώσσα. Στο σχήμα που ακολουθεί βλέπετε με απλοποιημένο τρόπο τη διαδικασία μεταγλωττισμού μέσω ενός μεταγλωττιστή (compiler). Το αρχείο που περιέχει τον πηγαίο κώδικα του προγράμματος (source code) μπορεί να δημιουργηθεί με οποιονδήποτε επεξεργαστή κειμένου ή μέσα από ένα ολοκληρωμένο περιβάλλον ανάπτυξης (IDE), εφόσον διατίθεται για τη συγκεκριμένη έκδοση της γλώσσας. Κατά τον χρόνο μεταγλώττισης (compile time), ο μεταγλωττιστής ε- ντοπίζει τυχόν συντακτικά λάθη που υπάρχουν στον πηγαίο κώδικα. Αν ο μεταγλωττιστής δεν εντοπίσει κανένα λάθος, θα δημιουργήσει ένα αρχείο που περιέχει τον εκτελέσιμο κώδικα (executable code), δηλαδή ένα πρόγραμμα σε γλώσσα μηχανής που μπορεί να εκτελεστεί απευθείας από τον Η/Υ.
Κεφάλαιο 1: Εισαγωγή 33 Στην πραγματικότητα, η διαδικασία της μεταγλώττισης είναι λίγο διαφορετική και αρκετά πιο πολύπλοκη. Μας επιτρέπει να χρησιμοποιούμε έτοιμο κώδικα που βρίσκεται σε βιβλιοθήκες προγραμμάτων τις οποίες αγοράζουμε, αλλά και να μεταγλωττίζουμε το πρόγραμμά μας τμηματικά. Στη διαδικασία αυτή θα αναφερθούμε αναλυτικά σε επόμενο κεφάλαιο. Η C++ είναι μια φορητή (portable) γλώσσα. Ο κώδικας που γράφεται σε C++ μπορεί να μεταγλωττιστεί σε σχεδόν οποιονδήποτε τύπο Η/Υ και λειτουργικό σύστημα, πρακτικά χωρίς καμία αλλαγή. Υπάρχουν μεταγλωττιστές της γλώσσας για όλα σχεδόν τα λειτουργικά συστήματα και τους τύπους επεξεργαστών. Αυτό το χαρακτηριστικό της γλώσσας, σε συνδυασμό με τις τεράστιες δυνατότητες που παρέχει, την ευελιξία της και την απόδοσή της, την καθιστούν σήμερα την πρώτη επιλογή των προγραμματιστών για την κατασκευή μεγάλων και απαιτητικών εφαρμογών. Αν δεν το έχετε κάνει ήδη, θα πρέπει τώρα να εγκαταστήσετε το ολοκληρωμένο περιβάλλον του Code::Blocks (Σχήμα 1.2) ώστε να μπορείτε να πειραματίζεστε με τα προγράμματα που υπάρχουν σε αυτό το βιβλίο αλλά και να γράφετε τα δικά σας. Το Παράρτημα Β περιγράφει τη διαδικασία εγκατάστασης και τη βασική χρήση του ο- λοκληρωμένου περιβάλλοντος Code::Blocks. Σχήμα 1.2 Το ολοκληρωμένο περιβάλλον ανάπτυξης Code::Blocks
34 H γλώσσα C++ σε βάθος Γιατί να μάθω C++; Όταν αποφασίσει κάποιος να ασχοληθεί με τον αντικειμενοστρεφή προγραμματισμό (ΑΠ), ή όταν αποφασίσει να τον διδάξει, έρχεται αντιμέτωπος με ένα δίλημμα: ποια γλώσσα να επιλέξει! Οι πιο διαδεδομένες αντικειμενοστρεφείς γλώσσες που χρησιμοποιούνται σήμερα είναι η C++, η Java και η C#. Γιατί όμως να επιλέξει τη C++ και όχι κάποια από τις άλλες δύο; Τόσο η Java όσο και η C# δεν είναι γλώσσες που παράγουν ένα άμεσα εκτελέσιμο πρόγραμμα, αλλά έναν ενδιάμεσο κώδικα ο οποίος εκτελείται από μια εικονική μηχανή (virtual machine). Αυτό τις κάνει πολύ φορητές και ιδανικές για διαδικτυακές εφαρμογές και εφαρμογές μικροσυσκευών, αλλά παράγουν προγράμματα που εκτελούνται πιο αργά και διαθέτουν λιγότερες δυνατότητες ελέγχου στο σύστημα όπου εκτελούνται. Αν επομένως θέλουμε προγράμματα στα οποία μας ενδιαφέρει η υψηλή απόδοση και ο πλήρης έλεγχος του συστήματος, η C++ αποτελεί μονόδρομο. Εξάλλου, ένα μεγάλο μέρος των δημοφιλέστερων προγραμμάτων και λειτουργικών συστημάτων που χρησιμοποιούμε σήμερα, όπως τα Windows και όλες οι εφαρμογές του Office, είναι γραμμένα σε C++ 3. Ας έλθουμε τώρα στην εκπαίδευση του αντικειμενοστρεφούς προγραμματισμού. Εκεί, κατά τη γνώμη μου, η C++ έχει αδιαφιλονίκητο προβάδισμα. Η C++ είναι μια «συσκευασία» δύο γλωσσών σε μία! Διαθέτει όλα τα διαδικαστικά χαρακτηριστικά της C και επιπλέον δικά της αντικειμενοστρεφή χαρακτηριστικά. Με τη C++ μπορούμε να ξεκινήσουμε φτιάχνοντας απλές διαδικαστικές εφαρμογές και να προσθέτουμε βήμα-βήμα τα αντικειμενοστρεφή στοιχεία της γλώσσας. Αυτό κάνει τη διαδικασία μάθησης της αντικειμενοστρεφούς λογικής σταδιακή και λιγότερο επίπονη. Τόσο η Java όσο και η C# μας ρίχνουν κατευθείαν σε βαθιά νερά. Για να φτιάξουμε το απλούστερο προγραμματάκι θα πρέπει να έχουμε κατανοήσει πολύπλοκες αρχές του α- ντικειμενοστρεφούς προγραμματισμού. Είναι σαν να μας ρίχνουν στο λιμάνι για να μάθουμε να κολυμπάμε. Το πιθανότερο είναι ότι, αν δεν πνιγούμε, θα πάρουμε από φόβο το νερό και δεν θα μάθουμε ποτέ σωστό κολύμπι. Αρκετά εκπαιδευτικά ιδρύματα του εξωτερικού, σε μια προσπάθεια να επιβάλουν από την αρχή την αντικειμενοστρεφή λογική στον σχεδιασμό προγραμμάτων, έβαλαν στο πρόγραμμα σπουδών τους ως πρώτο μάθημα προγραμματισμού τη γλώσσα Java. Τα α- ποτελέσματα ήταν απογοητευτικά και τα περισσότερα ιδρύματα γύρισαν πίσω στις πιο κλασικές γλώσσες. Η C++ βοηθάει στη σταδιακή κατανόηση των αρχών του αντικειμενοστρεφούς προγραμματισμού, που είναι απαραίτητες για τη μετέπειτα μετάβαση σε πιο «καθαρόαιμες» γλώσσες αντικειμενοστρεφούς προγραμματισμού, όπως η Java και η C#. 3 Πηγή: The Programming Languages Beacon, http://www.lextrait.com/vincent/implementations.html
Κεφάλαιο 1: Εισαγωγή 35 Βασικές έννοιες του προγραμματισμού Η ενότητα αυτή απευθύνεται στους αρχάριους στον προγραμματισμό. Αναφέρει και εξηγεί βασικές έννοιες του προγραμματισμού, απαραίτητες για τον αναγνώστη που έρχεται για πρώτη φορά σε επαφή με μια γλώσσα προγραμματισμού. Κάθε πρόγραμμα, σε όποια γλώσσα προγραμματισμού και αν έχει γραφεί, επεξεργάζεται δεδομένα και δίνει αποτελέσματα. Η επεξεργασία των δεδομένων γίνεται πάντα με έναν προκαθορισμένο τρόπο (αλγόριθμο). Ας μην ξεχνάμε ότι ένας Η/Υ είναι ένα μηχάνημα το οποίο ουσιαστικά εκτελεί μόνο τρείς λειτουργίες: Πρόσθεση. Στη πραγματικότητα ο Η/Υ εκτελεί μόνο την πράξη της πρόσθεσης. Όλες οι άλλες πράξεις ανάγονται σε προσθέσεις. Σύγκριση. Για παράδειγμα, συγκρίνει δύο αριθμούς και αποφασίζει ποιος είναι μεγαλύτερος. Μεταφορά δεδομένων. Ο Η/Υ μπορεί να αποθηκεύσει στη μνήμη του δεδομένα τα οποία μπορεί να είναι σταθερές ή να προέρχονται από αποτελέσματα πράξεων. Όπως διαπιστώνουμε, ο Η/Υ εκτελεί πολύ απλές και βασικές λειτουργίες στις οποίες όμως βασίζονται πολύπλοκοι αλγόριθμοι. Συνηθίζω να λέω στους φοιτητές ότι πρέπει να αντιμετωπίζουμε τον Η/Υ σαν έναν ασθενή που έχει τη νόσο Αλτσχάιμερ σε προχωρημένο στάδιο! Όσοι νοσούν από Αλτσχάιμερ έχουν απώλεια μνήμης και πιθανόν να μην θυμούνται τι έκαναν το προηγούμενο δευτερόλεπτο. Οι ασθενείς αυτοί καταφεύγουν σε διάφορα τεχνάσματα για να μπορούν να ζουν όσο πιο φυσιολογικά γίνεται. Για παράδειγμα, μπορεί να χρησιμοποιούν χαρτάκια ή κουτάκια για να σημειώνουν ό,τι κάνουν ώστε αργότερα να μπορούν να το ελέγχουν. Π.χ., όταν τρώνε πρωινό, γράφουν σε έναν κουτάκι τη φράση «έφαγα πρωινό». Έτσι, όταν το δούνε αργότερα θα ξέρουν ότι έφαγαν πρωινό και δεν θα ξαναφάνε. Οτιδήποτε θέλουν να θυμούνται θα πρέπει να το σημειώνουν κάπου! Μεταβλητές Ο «ασθενής» μας, ο Η/Υ, έχει στη διάθεσή του δισεκατομμύρια τέτοια κουτάκια, που δεν είναι τίποτε άλλο από τις θέσεις μνήμης της μνήμης RAM του κάθε συστήματος. Τα δεδομένα, καθώς και τα αποτελέσματα των πράξεων, αποθηκεύονται στα κουτάκια της κύριας μνήμης (RAM) του Η/Υ. Σε διαφορετική περίπτωση, ο «ασθενής» μας με Αλτσχάιμερ θα τα είχε ξεχάσει.
36 H γλώσσα C++ σε βάθος Η διαχείριση της μνήμης RAM είναι βασικό μέλημα μιας γλώσσας προγραμματισμού. Για να χρησιμοποιηθεί μια θέση μνήμης από μια γλώσσα προγραμματισμού, πρέπει να της δοθεί ένα όνομα. Σε κάθε θέση μνήμης που χρησιμοποιείται σε ένα πρόγραμμα, ανατίθεται (αντιστοιχίζεται, αποδίδεται) ένα όνομα, ενώ το περιεχόμενο της θέσης μνήμης αποτελεί την τιμή της. Για να αναφερθεί το πρόγραμμα στη συγκεκριμένη θέση μνήμης, χρησιμοποιεί α- πλώς το όνομά της. Φανταστείτε την κάθε θέση μνήμης που χρησιμοποιούμε σαν ένα κουτί, στο εξωτερικό του οποίου είναι γραμμένο το όνομα του. Το περιεχόμενο του κουτιού αποτελεί την τιμή αυτής της θέσης μνήμης. Ας θεωρήσουμε τη θέση μνήμης ab η ο- ποία περιέχει αρχικά τον αριθμό 23, και έστω ότι με μια κατάλληλη εντολή αλλάζουμε το περιεχόμενό της σε 18. Παρατηρούμε ότι το κουτί (θέση μνήμης) παραμένει το ίδιο (ab), αλλά το περιεχόμενό του μεταβάλλεται. Το όνομα, λοιπόν, που αντιστοιχεί σε μία θέση μνήμης μπορεί να πάρει διαφορετικές τιμές. Γι αυτό τον λόγο, κάθε όνομα θέσης μνήμης καλείται μεταβλητή (variable). Στο παραπάνω παράδειγμα η μεταβλητή ab είχε αρχικά την τιμή 23 και μετά την τιμή 18. Ένα πρόγραμμα χρησιμοποιεί μεταβλητές για να αποθηκεύει τα δεδομένα και τα αποτελέσματα τα οποία παράγει. Κατά την εκτέλεση του προγράμματος, οι τιμές των μεταβλητών μπορεί να αλλάζουν. Μεταβλητή είναι μια θέση μνήμης την οποία έχουμε δεσμεύσει και της έχουμε δώσει ένα όνομα. Το περιεχόμενο αυτής της θέσης μνήμης αποτελεί την τιμή αυτής της μεταβλητής. Αν πάμε σε ένα κατάστημα και ζητήσουμε να αγοράσουμε ένα κουτί, το πρώτο πράγμα που θα μας ρωτήσουν είναι το τι θέλουμε να βάλουμε μέσα. Από την απάντησή μας θα εξαρτηθεί το μέγεθος του κουτιού που θα μας δώσουν. Παρόμοια, οι θέσεις μνήμης (μεταβλητές) που χρησιμοποιεί ένα πρόγραμμα διαφέρουν ανάλογα με το τι σκοπεύουμε να αποθηκεύσουμε σε αυτές. Τα δεδομένα που χειρίζεται ένας Η/Υ μπορεί να είναι διαφορετικών τύπων (αριθμοί, χαρακτήρες κ.λπ.), οπότε θα πρέπει να υπάρχουν και οι αντίστοιχες κατηγορίες μεταβλητών για την καταχώρισή τους. Έτσι έχουμε ακέραιες μεταβλητές για την αποθήκευση ακέραιων αριθμών, μεταβλητές χαρακτήρων για την αποθήκευση χαρακτήρων, κ.λπ.
Κεφάλαιο 1: Εισαγωγή 37 Μια γλώσσα προγραμματισμού μπορεί να υποστηρίζει διάφορους τύπους δεδομένων (data types). Ανάλογα με τους τύπους δεδομένων που υποστηρίζει, υπάρχουν και αντίστοιχα είδη (τύποι) μεταβλητών. Στις περισσότερες γλώσσες προγραμματισμού, όπως και στη C++, πριν χρησιμοποιήσουμε μια μεταβλητή πρέπει να δηλώσουμε τον τύπο της. Η C++ υποστηρίζει διάφορους τύπους δεδομένων, οι βασικότεροι από τους οποίους είναι οι εξής: Ο ακέραιος τύπος δεδομένων: Αναφέρεται σε δεδομένα που είναι ακέραιοι αριθμοί. Στη C++ o τύπος αυτός συμβολίζεται με int ή long int. Ο πραγματικός τύπος δεδομένων: Αναφέρεται σε δεδομένα που είναι αριθμοί κινητής υποδιαστολής με μικρή ή μεγάλη ακρίβεια. Στη C++ o τύπος αυτός συμβολίζεται, αντίστοιχα, με float ή double. Ο τύπος δεδομένων χαρακτήρα: Αναφέρεται σε μεμονωμένους χαρακτήρες. Στη C++ o τύπος αυτός συμβολίζεται με char. Ο τύπος δεδομένων συνόλου χαρακτήρων (συμβολοσειρών): Αναφέρεται σε σύνολα χαρακτήρων. Η C++ δεν υποστηρίζει άμεσα αυτό τον τύπο δεδομένων και χειρίζεται διαφορετικά τα σύνολα χαρακτήρων. Όμως με τη χρήση της καθιερωμένης βιβλιοθήκης προτύπων της C++ υπάρχει έμμεση υποστήριξη του συνόλου χαρακτήρων μέσω της κλάσης string. Ο λογικός τύπος δεδομένων: Αναφέρεται σε δεδομένα με τιμή «αληθές» (true) ή «ψευδές» (false). Στη C++ o τύπος αυτός συμβολίζεται με bool. Πέρα από τις μεταβλητές, ένα απλό πρόγραμμα μπορεί να αποτελείται από σταθερές, παραστάσεις, και εντολές. Σταθερές Οι σταθερές είναι προκαθορισμένες τιμές που δε μεταβάλλονται κατά τη διάρκεια εκτέλεσης ενός προγράμματος. Υπάρχουν αντίστοιχες σταθερές για κάθε τύπο δεδομένων. Για παράδειγμα, μια ακέραια σταθερά είναι ένας ακέραιος αριθμός. Αριθμοί όπως το 10, το 20, το 17 κ.λπ. είναι παραδείγματα ακέραιων σταθερών (τύπου int), ενώ το 3.14 είναι μία πραγματική σταθερά (τύπου double). Παραστάσεις Οι παραστάσεις είναι πράξεις μεταξύ διάφορων μεγεθών. Μια παράσταση έχει ένα αποτέλεσμα. Για παράδειγμα η παράσταση 4+5 έχει ως αποτέλεσμα τον αριθμό 9. Στις παραστάσεις μπορούν να μετέχουν σταθερές και μεταβλητές. Οι πράξεις υλοποιούνται με τη χρήση μαθηματικών τελεστών (+,-,*,>,<, κλπ).
38 H γλώσσα C++ σε βάθος Εντολές Εντολή είναι μια φράση της γλώσσας προγραμματισμού που υποδεικνύει στον Η/Υ να εκτελέσει μια συγκεκριμένη λειτουργία. Κάθε εντολή μιας γλώσσας προγραμματισμού έχει μια αυστηρά καθορισμένη σύνταξη, η οποία ορίζεται από την ίδια τη γλώσσα. Οι εντολές επιτελούν διάφορες λειτουργίες. Μια εντολή μπορεί να κάνει μια απλή πράξη ή έναν έλεγχο, να επιβάλλει μια επαναληπτική διαδικασία, να εμφανίζει κάτι στην οθόνη, να γράφει κάτι στον δίσκο του Η/Υ κ.λπ. Σε κάθε περίπτωση, ένα πρόγραμμα αποτελείται από έναν αριθμό εντολών που εκτελούνται η μία μετά την άλλη (εκτός αν κάποια εντολή ορίζει μια διαφορετική σειρά εκτέλεσης). Ένα πρόγραμμα μπορεί να είναι ενιαίο ή να αποτελείται από περισσότερα τμήματα (υποπρογράμματα-διαδικασίες). Οι περισσότερες γλώσσες ενθαρρύνουν τον προγραμματιστή να χωρίζει το πρόγραμμα σε μικρότερα τμήματα, τα οποία ονομάζονται υποπρογράμματα. Η δομή της γλώσσας C++ σχεδόν επιβάλλει τον τμηματικό (αρθρωτό) προγραμματισμό. Ένα τμήμα προγράμματος (υποπρόγραμμα) στη C++ ονομάζεται συνάρτηση (function). Οι συναρτήσεις καλούνται απλώς με το όνομά τους. Μια συνάρτηση μπορεί να εκτελεί απλώς μια λειτουργία, αλλά και να επιστρέφει κάποια τιμή στον κώδικα που την κάλεσε. Αναγνωριστικά Αναγνωριστικά (identifiers) καλούνται τα ονόματα που χρησιμοποιεί μια γλώσσα για να αναφέρεται στα επί μέρους στοιχεία της. Για παράδειγμα, το όνομα μιας μεταβλητής, το όνομα μιας συνάρτησης (υποπρογράμματος), ή το όνομα ενός αντικειμένου αποτελούν αναγνωριστικά της γλώσσας. Κάθε γλώσσα έχει τους δικούς της κανόνες για τη σύνταξη των αναγνωριστικών της. Οι κανόνες αυτοί καθορίζουν το πλήθος και το είδος των επιτρεπτών χαρακτήρων. Οι κανόνες για τα αναγνωριστικά της C++ αναφέρονται στο επόμενο κεφάλαιο. Φιλοσοφίες και τεχνικές προγραμματισμού Όσοι ασχολούνται σοβαρά με τον προγραμματισμό έχουν σίγουρα περάσει από τα παρακάτω στάδια μάθησης που αντανακλούν διαφορετικές φιλοσοφίες και τεχνικές προγραμματισμού. Μη δομημένος προγραμματισμός (unstructured programming) Δομημένος διαδικαστικός προγραμματισμός (structured procedural programming) Τμηματικός προγραμματισμός (modular programming) Αντικειμενοστρεφής προγραμματισμός (Object Oriented Programming)
Κεφάλαιο 1: Εισαγωγή 39 Μη δομημένος προγραμματισμός Συνήθως, όταν κάποιος ξεκινάει να μαθαίνει προγραμματισμό, τα πρώτα προγράμματα που κατασκευάζει είναι μικρά και α- ποτελούνται από ένα μοναδικό ενιαίο σύνολο εντολών (ένα κύριο πρόγραμμα). Όλα τα δεδομένα είναι διαθέσιμα στο πρόγραμμα, το οποίο έχει πλήρη πρόσβαση σε αυτά από κάθε σημείο, ακόμα και από σημεία που δε χρειάζεται να έχουν πρόσβαση σε συγκεκριμένα δεδομένα. Ο μη δομημένος προγραμματισμός οδηγεί σε δυσανάγνωστα προγράμματα, με μεγάλο κόστος συντήρησης, με μηδενικές δυνατότητες επαναχρησιμοποίησης και επέκτασης, τα οποία είναι γνωστά και ως «προγράμματα σπαγγέτι» (spaggetti programs). Δομημένος διαδικαστικός προγραμματισμός Στον δομημένο διαδικαστικό προγραμματισμό το πρόγραμμα χωρίζεται σε ξεχωριστές ενότητες-διαδικασίες (υποπρογράμματα), κάθε μία από τις οποίες επιτελεί μια ξεχωριστή λειτουργία του προγράμματος. Μία από αυτές τις διαδικασίες είναι και το κύριο πρόγραμμα (main), που σκοπό έχει να «συνδέει» τις υπόλοιπες ενότητες του προγράμματος καλώντας τις αντίστοιχες διαδικασίες (Σχήμα 1.3). Σχήμα 1.3 Δομημένος διαδικαστικός προγραμματισμός