Εισαγωγή στη γλώσσα προγραμαμτισμού C++


180 76 657KB

Greek Pages [153] Year 2010

Report DMCA / Copyright

DOWNLOAD PDF FILE

Recommend Papers

Εισαγωγή στη γλώσσα προγραμαμτισμού C++

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

Τµηµα Επιστηµης και Τεχνολογιας Υλικων Πανεπιστηµιο Κρητης

Εισαγωγή στη γλώσσα προγραµµατισµού C++ Σηµειώσεις ∆ιαλέξεων

Σταµατης Σταµατιαδης

c 2004–2010 Σταµάτης Σταµατιάδης, [email protected]. Copyright ˆ

gr

Η στοιχειοθεσία έγινε από το συγγραφέα µε τη χρήση του LaTEX2ε. c Τµήµα Μαθηµατικών, ΠανεΧρησιµοποιήθηκε η σειρά χαρακτήρων ‘Κέρκης’ (ˆ πιστήµιο Αιγαίου).

Τελευταία τροποποίηση του κειµένου έγινε την 4 Νοεµβρίου 2010. Η πιο πρόσφατη έκδοση ϐρίσκεται στο http://www.materials.uoc.gr/el/undergrad/

courses/ETY215

Περιεχόµενα Περιεχόµενα

i

1 Εισαγωγή 1.1 Παράδειγµα . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Ασκήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Τύποι και Τελεστές 2.1 Εισαγωγή . . . . . . . . . . . . . . . 2.1.1 Σχόλια . . . . . . . . . . . . . 2.1.2 Ονόµατα . . . . . . . . . . . . 2.2 Θεµελιώδεις Τύποι . . . . . . . . . . 2.2.1 Λογικός τύπος . . . . . . . . . 2.2.2 Τύπος χαρακτήρα . . . . . . . 2.2.3 Εκτεταµένος τύπος χαρακτήρα 2.2.4 Ακέραιοι τύποι . . . . . . . . 2.2.5 Πραγµατικοί τύποι . . . . . . 2.2.6 void . . . . . . . . . . . . . . 2.2.7 Enumeration . . . . . . . . . 2.3 Μιγαδικός τύπος . . . . . . . . . . . 2.4 Σχεσιακοί και Λογικοί Τελεστές . . . 2.5 Γενικές Παρατηρήσεις . . . . . . . . 2.5.1 typedef . . . . . . . . . . . . 2.5.2 Σταθερές ποσότητες . . . . . . 2.5.3 ∆ηλώσεις και απόδοση αρχικής 2.5.4 Εµβέλεια . . . . . . . . . . . . 2.6 Σύνθετοι Τύποι . . . . . . . . . . . . 2.6.1 Πίνακες . . . . . . . . . . . . 2.6.2 ∆οµή (struct) . . . . . . . . . 2.7 Αριθµητικοί Τελεστές . . . . . . . . . 2.7.1 ΄Αλλοι τελεστές . . . . . . . . . 2.8 Χώρος Ονοµάτων (namespace) . . . . 2.9 Ροές (streams) . . . . . . . . . . . . 2.9.1 Ροές Αρχείων . . . . . . . . . 2.9.2 Ροές Strings . . . . . . . . . . 2.9.3 Είσοδος–έξοδος δεδοµένων . . 2.9.4 ∆ιαµορφώσεις . . . . . . . . . 2.10 Ασκήσεις . . . . . . . . . . . . . . . i

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . τιµής . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1 1 4 5 5 5 6 6 6 7 8 9 10 10 11 11 13 14 14 15 15 16 17 17 20 21 25 26 28 28 29 29 31 32

ΠΕΡΙΕןΟΜΕΝΑ

ii 3 Εντολές Ελέγχου–Βρόχοι 3.1 Εντολές Ελέγχου . . . 3.1.1 if . . . . . . . . 3.1.2 ?: . . . . . . . . 3.1.3 switch . . . . . 3.1.4 goto . . . . . . 3.1.5 assert() . . . . 3.2 Βρόχοι . . . . . . . . 3.2.1 while . . . . . . 3.2.2 do while . . . . 3.2.3 for . . . . . . . 3.2.4 continue . . . . 3.2.5 break . . . . . 3.3 Γενικές Παρατηρήσεις 3.4 Ασκήσεις . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

37 37 37 38 39 40 40 41 41 41 42 43 43 43 43

4 Συναρτήσεις 4.1 Εισαγωγή . . . . . . . . . . . . . 4.2 Αναφορά . . . . . . . . . . . . . 4.3 ∆είκτης . . . . . . . . . . . . . . 4.4 Ορισµός και κλήση συνάρτησης . 4.4.1 Ορισµός και δήλωση . . . 4.4.2 Επιστροφή . . . . . . . . . 4.4.3 Κλήση . . . . . . . . . . . 4.4.4 Οργάνωση κώδικα . . . . . 4.4.5 ∆είκτης σε συνάρτηση . . . 4.5 main() . . . . . . . . . . . . . . . 4.6 overloading . . . . . . . . . . . . 4.7 Συναρτήσεις template . . . . . . 4.7.1 Εξειδίκευση . . . . . . . . 4.8 inline . . . . . . . . . . . . . . . 4.9 Στατικές ποσότητες . . . . . . . . 4.10 Μαθηµατικές συναρτήσεις της C++ 4.11 Ασκήσεις . . . . . . . . . . . . . 4.11.1Αναζήτηση–Ταξινόµηση . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

49 49 50 51 54 55 56 56 59 61 63 64 65 67 67 68 68 70 75

. . . . . . . . . . . . . . . . . . . . . . . . . . . και εναλλαγής . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

77 . 78 . 78 . 78 . 79 . 81 . 81 . 86 . 92 . 93 . 97 . 101 . 105 . 114

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

5 Standard Library 5.1 Βοηθητικές ∆οµές και Συναρτήσεις . . 5.1.1 Ζεύγος (Pair) . . . . . . . . . . 5.1.2 Αντικείµενο–Συνάρτηση . . . . . 5.1.3 Συναρτήσεις ελαχίστου, µεγίστου 5.2 Συλλογές (containers) . . . . . . . . . 5.2.1 Εισαγωγή . . . . . . . . . . . . 5.2.2 vector . . . . . . . . . . . . . . 5.2.3 deque . . . . . . . . . . . . . . 5.2.4 list . . . . . . . . . . . . . . . . 5.2.5 set και multiset . . . . . . . . . 5.2.6 map και multimap . . . . . . . 5.3 Αλγόριθµοι (algorithms) . . . . . . . . 5.4 Ασκήσεις . . . . . . . . . . . . . . . .

ΠΕΡΙΕןΟΜΕΝΑ 6 Κλάσεις 6.1 Εισαγωγή . . . . . . . . . . . . . . . . . . . . 6.1.1 Αρχικό στάδιο οργάνωσης . . . . . . . . 6.1.2 Ενθυλάκωση (encapsulation) . . . . . . 6.1.3 Κληρονοµικότητα – Πολυµορφισµός . . 6.2 Ορισµός κλάσης . . . . . . . . . . . . . . . . 6.2.1 Εσωτερική αναπαράσταση – συναρτήσεις 6.2.2 Constructor—Copy constructor . . . . 6.2.3 Destructor . . . . . . . . . . . . . . . . 6.2.4 assignment operator . . . . . . . . . . 6.3 Κλάση template . . . . . . . . . . . . . . . . Α΄ Παραδείγµατα προς . . . αποφυγή !

iii

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . πρόσβασης . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

115 . 115 . 115 . 117 . 119 . 120 . 121 . 123 . 125 . 126 . 126 127

Β΄ ∆ιασύνδεση µε κώδικες σε Fortran και C 131 Β΄.1 Κώδικας σε C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Β΄.2 Κώδικας σε Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Γ΄ Λύσεις επιλεγµένων ασκήσεων

135

Βιβλιογραφία

143

Κατάλογος Πινάκων

145

Ευρετήριο

146

Πρόλογος Στις παρούσες σηµειώσεις γίνεται µια προσπάθεια να παρουσιαστεί συνοπτικά ένα σηµαντικό τµήµα της γλώσσας προγραµµατισµού ISO C++, µε έµφαση σε ό,τι χρειάζεται για την ανάπτυξη κωδίκων στις ϕυσικές επιστήµες. Η γλώσσα C++ είναι, κατά γενική οµολογία, ιδιαίτερα πλούσια στις δυνατότητες έκφρασης που παρέχει στον προγραµµατιστή αλλά ταυτόχρονα σηµαντικά πιο δύσκολη στην κατανόησή της, σε σχέση µε απλές γλώσσες όπως η Fortran και η C. Οι παρούσες σηµειώσεις δεν έχουν στόχο να υποκαταστήσουν την ήδη υπάρχουσα σχετική ϐιβλιογραφία (υπερτερούν ωστόσο έναντι ορισµένων σχετικών εγχειριδίων) ούτε και να καλύψουν τη γλώσσα προγραµµατισµού C++ σε όλες τις επιµέρους δυνατότητές της. Φιλοδοξία µου είναι να αποδοθεί µια όσο το δυνατόν πιο άρτια και πλήρης περιγραφή-περίληψη υποσυνόλου της C++, όπως αυτή διαµορφώθηκε µε το Standard του 1998, και ταυτόχρονα να δηµιουργηθεί µια στέρεη ϐάση πάνω στην οποία ο κάθε αναγνώστης, µε δική του πλέον πρωτοβουλία, ϑα µπορέσει να αναπτύξει περαιτέρω τη απαιτούµενη δεξιότητα του προγραµµατισµού στις υπολογιστικές επιστήµες. Καθώς οι σηµειώσεις απευθύνονται σε αρχάριους προγραµµατιστές, επιλέχθηκε να γίνει παρουσίαση της C++ ως µιας ϐελτιωµένης C· δίνεται προτεραιότητα στη χρήση έτοιµων δοµών και εννοιών έναντι των µηχανισµών δηµιουργίας τους, το κεφάλαιο για την STL προηγείται αυτού για τις κλάσεις, κ.α. ΄Ισως αυτή η προσέγγιση ϐοηθήσει στο να ανατραπεί η εικόνα που έχουν πολλοί για τη C++ ως γλώσσα αποκλειστικά για αντικειµενοστρεφή1 προγραµµατισµό (‘‘κάτι προχωρηµένο που δε µας χρειάζεται’’).

1

http://www.dmst.aueb.gr/dds/faq/academic.html#oo

v

Κεφάλαιο 1

Εισαγωγή ΄Ενας ηλεκτρονικός υπολογιστής έχει τη δυνατότητα να προγραµµατιστεί ώστε να εκτελέσει µια συγκεκριµένη διαδικασία. Προγραµµατισµός είναι η λεπτοµεϱής περιγραφή, σε κάποια γλώσσα προγραµµατισµού, των ϐηµάτων που πρέπει να ακολουθήσει ώστε να ολοκληρώσει την επιθυµητή διεργασία. Το σύνολο των ϐηµάτων, το πρόγραµµα δηλαδή, συνήθως απαιτεί δεδοµένα που πρόκειται να επεξεργαστεί ώστε να παράγει κάποιο αποτέλεσµα· σχεδιάζεται, όµως, ανεξάρτητα από συγκεκριµένες τιµές των δεδοµένων αυτών. Οι πιο διαδεδοµένες γλώσσες προγραµµατισµού στις εφαρµοσµένες επιστήµες (Fortran, C, C++) χρησιµοποιούν σταθερές και µεταβλητές ποσότητες, δηλαδή, ϑέσεις στη µνήµη του υπολογιστή, για την αποθήκευση των ποσοτήτων (δεδοµένων και αποτελεσµάτων) του προγράµµατος. Ο υπολογιστής επιδρά στις τιµές αυτών των ποσοτήτων ακολουθώντας διαδοχικά τις εντολές που περιλαµβάνονται στο πρόγραµµα. Υπάρχει η δυνατότητα ανάθεσης τιµής στις µεταβλητές, επιλογής της εντολής που ϑα εκτελεστεί στο επόµενο ϐήµα, ανάλογα µε κάποια συνθήκη, καθώς και η δυνατότητα επανάληψης µιας ή περισσότερων εντολών. Η ϐασική δοµή και ο τρόπος λειτουργίας ενός προγράµµατος στις προαναφερθείσες γλώσσες δε διαφέρει ουσιαστικά από τη µία στην άλλη. Αυτό δεν σηµαίνει ότι κάποιες γλώσσες προγραµατισµού δεν είναι πιο εξελιγµένες από άλλες—παρέχουν, δηλαδή, περισσότερες δυνατότητες—ή είναι πιο κατάλληλες για συγκεκριµένες εφαρµογές. Παρακάτω ϑα παραθέσουµε ένα τυπικό κώδικα σε C++ και ϑα περιγράψουµε τη λειτουργία του. Στα επόµενα κεφάλαια ϑα αναφερθούµε στις εντολές και δοµές της C++ που χρειάζονται για να αναπτύξουµε σχετικά πολύπλοκους κώδικες.

1.1 Παράδειγµα Ας εξετάσουµε µία απλή εργασία που ϑέλουµε να εκτελεστεί από ένα ηλεκτρονικό υπολογιστή : να µας Ϲητά έναν πραγµατικό αριθµό και να τυπώνει το τετράγωνό του. ΄Ενα πλήρες πρόγραµµα C++ που εκτελεί την παραπάνω εργασία και µας δίνει την ευκαιρία να δούµε στοιχεία της δοµής του κώδικα, είναι το ακόλουθο :

1

ΚΕ֟ΑΛΑΙΟ 1. ΕΙΣΑΓΩΓ΄Η

2 #include /*

main: Takes no arguments. Prompts for a real number and prints its square. Returns 0.

*/ int main() { double a;

// Declare a real variable

// Print text on screen std::cout > a; // Get value from keyboard // Print text on screen std::cout b; std::cout