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

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

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

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

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

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

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

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

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

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

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

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

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

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

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

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

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

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

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

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

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

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

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

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

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

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

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

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

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

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

Streams Input / Output in C++ George Kastrinis

Τίτλος Μαθήματος: Εισαγωγή στον Προγραμματισμό

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Επανάληψη για τις Τελικές εξετάσεις

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

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

Η γλώσσα προγραμματισμού C

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

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

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

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

Μεθόδων Επίλυσης Προβλημάτων

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

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

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

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

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

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

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

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

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

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

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

Εισαγωγή ΕΙΣΑΓΩΓΗ. Γεώργιος Παπαϊωάννου ( )

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

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

B. Ενσωμάτωση Ιθαγενών Μεθόδων

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

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

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

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

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

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

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

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

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

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

Προγραμματισμό για ΗΜΥ

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

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

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

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

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

char name[5]; /* define a string of characters */

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Τύποι Δεδομένων Είσοδος/Έξοδος

Βαθμός Σχόλια. lab PASS 1194 PASS 1238 PASS 1239 PASS

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/09, 23:59

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

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

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

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

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

CE121 Προγραµµατισµός 2. Εισαγωγή σε Makefiles. CE121 -

Η γλώσσα προγραμματισμού C

Εισαγωγή στην επιστήμη των υπολογιστών

Μεθόδων Επίλυσης Προβλημάτων

Ενότητες στην C Τεχνική Υλοποίησης Αφαιρετικών Τύπων Δεδομένων στην C

Transcript:

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

Στόχοι εκµάθησης 4 Χρήση της έννοιας του πίνακα για αλφαριθµητικά C-strings Εργαλεία χειρισµού χαρακτήρων Character I/O get, put συναρτήσεις putback, peek, ignore Κλάση string Επεξεργασία string Εισαγωγή 5 υο τύποι αλφαριθµητικών: C-strings Πίνακας µεβασικότύποchar Το τέλος του αλφαριθµητικού σηµατοδοτείται µετο null, "\0" Παλιότερη µέθοδος που κληρονοµήθηκε από τη C Κλάση string Χρησιµοποιεί templates C-strings 6 Πίνακας µεβασικότύποchar Ένας χαρακτήρας ανά indexed µεταβλητή Ένας επιπλέον χαρακτήρας: "\0" Αποκαλείται null χαρακτήρας Χαρακτήρας τέλους 2

Μεταβλητή τύπου C-string Πίνακας χαρακτήρων: char s[10]; ήλωση µεταβλητής c-string που µπορεί να κρατήσει µέχρι 9 χαρακτήρες + τον null χαρακτήρα Συνήθως µερικώς-πλήρης πίνακας ήλωση αρκετά µεγάλου µεγέθους, ώστε να µπορεί να κρατήσει το αλφαριθµητικό του µεγαλύτερου µεγέθους που µπορεί να συναντηθεί Indicate end with null Η µοναδική διαφορά από τους τυπικούς πίνακες: Πρέπει να περιέχει τον null χαρακτήρα 7 Αποθήκευση ενός C-string 8 Τυπικός πίνακας: char s[10]; Εάν το s περιέχει το αλφαριθµητικό "Hi Mom!", θα αποθηκευτεί ως: Αρχικοποίηση ενός C-string 9 Μπορούµε να αρχικοποιήσουµε έναc-string: char mymessage[20] = "Hi there."; εν χρειάζεται να γεµίσουµε ολόκληρο τον πίνακα Η αρχικοποίηση τοποθετεί το "\0" στο τέλος Μπορούµεναπαραλείψουµε τοµέγεθος του πίνακα: char shortstring[] = "abc"; Αυτόµατα κάνει το µέγεθος του πίνακα κατά ένα µεγαλύτερο από το µήκος του αλφαριθµητικού ΕΝ είναι το ίδιο µετο: char shortstring[] = {"a", "b", "c"}; 3

C-string Indexes 10 Ένα c-string ΕΙΝΑΙ ένας πίνακας Μπορούµεναπροσπελάσουµε τιςindexed µεταβλητές του: char ourstring[5] = "Hi"; Το ourstring[0] είναι το "H" Το ourstring[1] είναι το "i" Το ourstring[2] είναι το "\0" Το ourstring[3] είναι απροσδιόριστο Το ourstring[4] είναι απροσδιόριστο 11 Χειρισµός των indexes ενός C-string Μπορούµεναχειριστούµετιςindexed µεταβλητές char happystring[7] = "DoBeDo"; happystring[6] = "Z"; Προσοχή! Εδώ, το "\0" (null) αντικαταστάθηκε από το "Z"! Εάν το null διαγραφεί, όπως εδώ, το c-string δεν συµπεριφέρεται πλέον όπως ένα c-string! Απροσδιόριστα αποτελέσµατα! Βιβλιοθήκη 12 ήλωση c-strings εν απαιτεί κάποια C++ βιβλιοθήκη Κοµµάτι της βασικής C++ Χειρισµός Απαιτούν τη βιβλιοθήκη <cstring> Τυπικά, τις συµπεριλαµβάνουµεόταν χρησιµοποιούµεταc-strings 4

Τελεστές = και == µε ταc-strings Τα C-strings δεν είναι όπως οι άλλες µεταβλητές εν επιτρέπεται η ανάθεση και η σύγκριση: char astring[10]; astring = "Hello"; //ΠΑΡΑΝΟΜΟ! Μπορούµε ναχρησιµοποιήσουµε την ανάθεση "=" ΜΟΝΟ στη δήλωση ενός c-string! Πρέπει να χρησιµοποιήσουµε συνάρτηση βιβλιοθήκης για ανάθεση: strcpy(astring, "Hello"); Ενσωµατωµένη συνάρτηση (στη βιβλιοθήκη <cstring>) Θέτει την τιµήτουastring ίση µε "Hello" ΕΝ ελέγχει για µέγεθος! Αφήνεται στον προγραµµατιστή, όπως συµβαίνει και στους πίνακες! 13 Σύγκριση δυο C-strings 14 Επίσης, δεν µπορούµε ναχρησιµοποιήσουµε τον τελεστή == char astring[10] = "Hello"; char anotherstring[10] = "Goodbye"; astring == anotherstring; // ΕΝ επιτρέπεται! Πρέπει να χρησιµοποιήσουµε συνάρτηση βιβλιοθήκης: if (strcmp(astring, anotherstring)) cout << "Strings NOT same."; else cout << "Strings are same."; Ηβιβλιοθήκη<cstring> (1/2) 15 5

Ηβιβλιοθήκη<cstring> (2/2) 16 Συναρτήσεις για C-string: strlen() 17 Μήκος αλφαριθµητικού Συχνά είναι χρήσιµο ναγνωρίζουµετοµήκος του αλφαριθµητικού: char mystring[10] = "dobedo"; cout << strlen(mystring); Επιστρέφει τον αριθµό των χαρακτήρων Το null δεν συµπεριλαµβάνεται Το αποτέλεσµα είναι: 6 Συναρτήσεις για C-string: strcat() 18 Συνένωση αλφαριθµητικών Συχνά επιθυµούµε ναενώσουµεδυοαλφαριθµητικά: char stringvar[20] = "The rain"; strcat(stringvar, "in Spain"); είτε το αποτέλεσµα: Η µεταβλητή stringvar περιέχει τώρα "The rainin Spain" Προσοχή! Προσθέστε κενά όπου χρειάζεται! 6

C-strings ως ορίσµατα, παράµετροι Θυµηθείτε: ένα c-string είναι ένας πίνακας Μια παράµετρος c-string είναι µια παράµετρος πίνακα Τα c-strings που περνιούνται σε συναρτήσεις µπορεί να αλλαχτούν από την καλούµενη συνάρτηση! Όπως όλοι οι πίνακες, είναι σύνηθες να στέλνουµε και το µέγεθος ως όρισµα Ησυνάρτησηθαµπορούσε βέβαια να βρει το χαρακτήρα "\0" καιέτσιναπροσδιορίσειτοµέγεθος του αλφαριθµητικού Έτσι, το µέγεθος δεν είναι απόλυτα απαραίτητο εάν η συνάρτηση δεν θα αλλάξει την παράµετρο c-string Χρησιµοποιήστε τον "const" modifier γιαναπροστατέψετε τα ορίσµατα c-string 19 Έξοδος για C-string 20 Η έξοδος επιτυγχάνεται µε τον τελεστή << Το έχουµε ήδη δει: cout << news << " Wow.\n"; Όπου το news είναι µια µεταβλητή c-string Είναι δυνατό, επειδή ο τελεστής << υπερφορτώνεται για τα c-strings! Είσοδος για C-string 21 Η είσοδος επιτυγχάνεται µε τοντελεστή>> Υπάρχουν βέβαια κάποια ζητήµατα Οι λευκοί χαρακτήρες θεωρούνται "delimiter" Tab, space, line breaks παραβλέπονται Η ανάγνωση εισόδου σταµατά σε έναν delimiter Παρακολουθήστε το µέγεθος του c-string Πρέπει να είναι αρκετά µεγάλο για να κρατήσει ολόκληρο το αλφαριθµητικό! Η C++ δεν παρέχει προειδοποιήσεις σε τέτοια ζητήµατα! 7

Παράδειγµα εισόδου για C-string 22 char a[80], b[80]; cout << "Enter input: "; cin >> a >> b; cout << a << b << "END OF OUTPUT\n"; Ο διάλογος που λαµβάνει χώρα είναι: Enter input: Do be do to you! DobeEND OF OUTPUT Σηµείωση: Το υπογραµµισµένο τµήµα πληκτρολογείται στο πληκτρολόγιο Το c-string a λαµβάνει το: "do" Το c-string b λαµβάνει το: "be" Είσοδος γραµµής σε C-string 23 Μπορούµεναλάβουµε ολόκληρηγραµµήωςτιµή σε ένα c-string Χρησιµοποιήστε τη getline(), µια προκαθορισµένη συνάρτηση: char a[80]; cout << "Enter input: "; cin.getline(a, 80); cout << a << "END OF OUTPUT\n"; Ο διάλογος που λαµβάνει χώρα είναι: Enter input: Do be do to you! Do be do to you!end OF INPUT Λίγα περισσότερα για τη getline() 24 Μπορούµερητάνακαθορίσουµε τοναριθµό χαρακτήρων που θα λάβει: char shortstring[5]; cout << "Enter input: "; cin.getline(shortstring, 5); cout << shortstring << "END OF OUTPUT\n"; Αποτέλεσµα: Enter input: dobedowap dobeend OF OUTPUT Εξαναγκάζει να διαβαστούν ΤΕΣΣΕΡΕΙΣ µόνο χαρακτήρες Επειδή χρειάζεται χώρο για τον χαρακτήρα null! 8

I/O χαρακτήρων 25 Είσοδος και Έξοδος δεδοµένων ΌΛΑ αντιµετωπίζονται ως χαρακτήρες π.χ., ο αριθµός 10 τυπώνεται ως "1" και "0" Η µεταροπή γίνεται αυτόµατα Χρησιµοποιεί χαµηλού επιπέδου λειτουργίες Φυσικά, µπορούµε καιεµείς να χρησιµοποιήσουµε τις ίδιες χαµηλού επιπέδου λειτουργίες Συνάρτηση get() 26 ιαβάζει ένα χαρακτήρα κάθε φορά Συνάρτηση µέλος του αντικειµένου cin: char nextsymbol; cin.get(nextsymbol); ιαβάζει τον επόµενο χαρακτήρα και τον τοποθετεί στη µεταβλητή nextsymbol Το όρισµαπρέπειναείναιτύπουchar Όχι "string"! Συνάρτηση put() 27 Τυπώνει ένα χαρακτήρα κάθε φορά Συνάρτηση µέλος του αντικειµένου cout: Παραδείγµατα: cout.put( a ); Τυπώνει το γράµµα "a" στην οθόνη char mystring[10] = "Hello"; cout.put( mystring[1] ); Τυπώνει το γράµµα "e" στην οθόνη 9

Κι άλλες συναρτήσεις 28 putback() Αφού διαβαστεί κάποιος χαρακτήρας, ίσως χρειαστεί να τοποθετηθεί πίσω στο κανάλι εισόδου cin.putback( lastchar ); peek() Επιστρέφει τον επόµενο χαρακτήρα, αλλά τον αφήνει εκεί peekchar = cin.peek(); ignore() Αγνοεί την είσοδο, µέχρι τον συγκεκριµένο χαρακτήρα cin.ignore(1000, "\n"); Αγνοεί το πολύ 1000 χαρακτήρες µέχρι τον "\n" Ηβιβλιοθήκη<ctype> (1/3) 29 Ηβιβλιοθήκη<ctype> (2/3) 30 10

Ηβιβλιοθήκη<ctype> (3/3) 31 Ηκλάσηstring Ορίζεται στη βιβλιοθήκη: #include <string> using namespace std; Μεταβλητές string και εκφράσεις Αντιµετωπίζονται όπως και οι απλοί τύποι Επιτρέπεται ανάθεση, σύγκριση, πρόσθεση: string s1, s2, s3; s3 = s1 + s2; //Concatenation s3 = "Hello Mom!" //Assignment Σηµειώστε ότι το c-string "Hello Mom!" µετατρέπεται αυτόµατα σε τύπο string! 32 Παράδειγµαχρήσηςτηςstring 33 11

I/O µε τηνκλάσηstring Όπως και για τους άλλους τύπους! string s1, s2; cin >> s1; cin >> s2; Αποτελέσµατα: Οχρήστηςπληκτρολογεί το ακόλουθο: May the hair on your toes grow long and curly! Η εξαγωγή αγνοεί τους λευκούς χαρακτήρες: Το s1 λαµβάνει την τιµή "May" Το s2 λαµβάνει την τιµή "the" 34 Η getline() µε τηνκλάσηstring 35 Για πλήρεις γραµµές: string line; cout << "Enter a line of input: "; getline(cin, line); cout << line << "END OF OUTPUT"; Ο διάλογος που λαµβάνει χώρα: Enter a line of input: Do be do to you! Do be do to you!end OF INPUT Όµοια µε τηχρήσητηςgetline() για c- strings Άλλεςεκδόσειςτηςgetline() Μπορούµε να καθορίσουµε "delimiter" χαρακτήρα: string line; cout << "Enter input: "; getline(cin, line, "?"); Λαµβάνει είσοδο µέχρι να συναντήσει το χαρακτήρα "?" Η getline() στην ουσία επιστρέφει αναφορά string s1, s2; getline(cin, s1) >> s2; Results in: (cin) >> s2; 36 12

Παγίδα: Μίξη µεθόδων εισόδου Προσοχή στη µίξη cin >> var και getline int n; string line; cin >> n; getline(cin, line); Εάν η είσοδος είναι: 42 Hello hitchhiker Η µεταβλητή n τίθεται στην τιµή 42 Η µεταβλητή line τέθηκεστοκενόαλφαριθµητικό! Η cin >> n αγνοεί τους λευκούς χαρακτήρες, αφήνοντας όµως το "\n" στο ρεύµα εισόδου για την getline()! 37 Επεξεργασία για την κλάση string 38 ιαθέσιµες οι ίδιες λειτουργίες όπως και στα c-strings Και ακόµα Πάνω από 100 µέλη της standard κλάσης string Μερικές συναρτήσεις-µέλη:.length() Επιστρέφει το µήκος της µεταβλητής string.at(i) Επιστρέφει αναφορά στο χαρακτήρα στη θέση i Συναρτήσεις-µέλη της string (1/2) 39 13

Συναρτήσεις-µέλη της string (2/2) 40 Μετατροπές µεταξύ C-string και αντικειµένων της κλάσης string 41 Αυτόµατες µετατροπές τύπων Από ένα C-string σε αντικείµενο string: char acstring[] = "My C-string"; string stringvar; stringvar=acstring; Επιτρεπτό και κατάλληλο! acstring = stringvar; Μη επιτρπτό! εν µπορεί να αυτο-µετατραπεί σε C-string Χρειάζεται ρητή µετατροπή: strcpy(acstring, stringvar.c_str()); Περίληψη 42 Μια µεταβλητή τύπου C-string είναι πίνακας χαρακτήρων Με την προσθήκη του ΚΕΝΟΥ χαρκτήρα (null character), "\0" Τα C-strings λειτουργούν όπως οι πίνακες εν επιτρέπουν ανάθεση και σύγκριση όπως οι απλές µεταβλητές Βιβλιοθήκες όπως οι <cctype> και <string> περιέχουν χρήσιµες συναρτήσεις διαχείρισης Η cin.get() διαβάζει τον επόµενο (µόνο) χαρακτήρα Οι εκδόσεις της getline() επιτρέπουν ανάγνωση ολόκληρων γραµµών Τα αντικείµενα της κλάσης String συµπεριφέρονται καλύτερα από ότι τα c-strings 14

Περιεχόµενα 43 Χωριστή µεταγλώττιση και Namespaces Στόχοι εκµάθησης 44 Χωριστή µεταγλώττιση Επανα-θεώρηση της ενθυλάκωσης Αρχεία κεφαλίδας (header) και αρχεία υλοποίησης (implementation) Namespaces Με χρήση των directives Qualifying ονόµατα Namespaces χωρίς όνοµα Απόκρυψη των βοηθητικών συναρτήσεων Φωλιασµένα namespaces Χωριστή µεταγλώττιση 45 Τµήµατα του προγράµµατος Κρατούνται σε διαφορετικά αρχεία Μεταγλωττίζονται χωριστά Συνενώνονται πριν εκτελεστεί το πρόγραµµα Ορισµοί κλάσεων Χωριστοί από τα προγράµµατα που τις χρησιµοποιούν ηµιουργία βιβλιοθηκών κλάσεων Επανα-χρησιµοποιούνται από πολλά διαφορετικά προγράµµατα Όπωςκαιοιπροκαθορισµένες βιβλιοθήκες 15

ιαχωρισµός κλάσεων 46 Ανεξαρτησία κλάσης Χωριστά ο ορισµός/προσδιορισµός της κλάσης Αποκαλείται interface Χωριστά η υλοποίηση της κλάσης Τοποθετούνται σε δυο διαφορετικά αρχεία Εάν αλλάξει η υλοποίηση µόνοαυτότο αρχείο χρειάζεται να αλλάξει Οπροσδιορισµός της κλάση δεν αλλάζει Τα προγράµµατα των χρηστών δεν αλλάζουν Επαναθεώρηση της ενθυλάκωσης 47 Αρχή της ενθυλάκωσης: ιαχωρισµός του πώς χρησιµοποιείται η κλάση από τον προγραµµατιστή από τις λεπτοµέρειες υλοποίησης της κλάσης Πλήρης διαχωρισµός Αλλαγή της υλοποίησης ΚΑΜΙΑ επίδραση στα άλλα προγράµµατα Βασική αρχή του OOP Κανόνες ενθυλάκωσης 48 Κανόνες για να εγγυηθούµε ενθυλάκωση: 1. Όλες οι µεταβλητές-µέλη πρέπει να είναι ιδιωτικές 2. Οιβασικέςλειτουργίεςτηςκλάσηςπρέπειναείναιοι: ηµόσιες συναρτήσεις-µέλη Friend ή κανονικές συναρτήσεις Υπερφορτωµένοι τελεστές Οµαδοποίηση του ορισµού της κλάσης και των δηλώσεων/πρωτότυπα των συναρτήσεων Αποκαλείται διασύνδεση ( interface ) της κλάσης 3. Κάνουµε την υλοποίηση της κλάσης µη διαθέσιµη στους χρήστες της 16

49 Περισσότερα για διαχωρισµό κλάσης Αρχείο διασύνδεσης Περιέχει τον ορισµό τηςκλάσηςµαζί µετις δηλώσεις/πρωτότυπα των συναρτήσεων και των τελεστών Οι χρήστες βλέπουν αυτό το αρχείο Χωριστή µονάδα µεταγλώττισης Αρχείο υλοποίησης Περιέχει τους ορισµούς (υλοποίηση) των συναρτήσεων-µελών Χωριστή µονάδα µεταγλώττισης Αρχεία κεφαλίδας της κλάσης 50 Η διασύνδεση της κλάσης πάντα στο header file Χρήση του.h είναι σύµβαση για το όνοµά του Τα προγράµµατα που θα χρησιµοποιήσουν την κλάση θα το κάνουν "include" #include "myclass.h" Τα ""σηµατοδοτούν ότι γράφηκε από εµάς Το εντοπίζουµε στοντοπικόφάκελοεργασίαςµας Θυµηθείτε τα include για βιβλιοθήκες, π.χ., <iostream> Τα <>σηµατοδοτούν header file προκαθορισµένης βιβλιοθήκης Τα εντοπίζουµεστοφάκελοµε τις βιβλιοθήκες Αρχεία υλοποίησης της κλάσης 51 Η υλοποίηση της κλάσης τοποθετείται σε.cpp αρχείο Συνήθως δίνουµεστοinterface αρχείο και στο αρχείο υλοποίησης το ίδιο όνοµα myclass.h και myclass.cpp Όλες οι συναρτήσεις-µέλη της κλάσης ορίζονται εδώ Το αρχείο υλοποίησης πρέπει να κάνει #include το header αρχείο της κλάσης Τα.cpp αρχεία συνήθως, περιέχουν εκτελέσιµο κώδικα π.χ., ορισµούς συναρτήσεων, περιλαµβανοµένης και της main() 17

Αρχεία της κλάσης 52 Το header αρχείο της κλάσης γίνεται #include από: Το αρχείο υλοποίησης Το αρχείο προγράµµατος Συχνά αποκαλείται αρχείο εφαρµογής ή αρχείο οδηγός Η οργάνωση των αρχείων διαφέρει από σύστηµασεσύστηµα Τα συνήθη IDE έχουν "project" ή "workspace" Τα αρχεία υλοποίησης συνδυάζονται εδώ Εξακολουθούµενακάνουµε #include τα header αρχεία Πολλαπλές µεταγλωττίσεις των αρχείων header 53 Αρχεία header Συνήθως γίνονται #include πολλές φορές π.χ., η διασύνδεσητηςκλάσηςγίνεταιinclude από την υλοποίηση της κλάσης αλλά και από το αρχείο εφαρµογής Πρέπει όµως να µεταγλωττιστεί µόνο µια φορά! εν υπάρχει εγγύηση για το ποιο "#include" σε ποιο αρχείο, θα δει πρώτο ο compiler Χρήση του προεπεξεργαστή Καθοδηγούµετονcompiler να κάνει include το header µόνο µια φορά Χρήση της #ifndef 54 οµή αρχείουheader: #ifndef FNAME_H #define FNAME_H //Contents of header file #endif Το FNAME είναι συνήθως το όνοµατου ίδιου του αρχείου για συνέπεια και ευκολία Αυτή η σύνταξη αποφεύγει τους πολλαπλούς ορισµούς του αρχείου header 18

Άλλα αρχεία βιβλιοθήκης 55 Η βιβλιοθήκες δεν είναι µόνο για τις κλάσεις Σχετικές συναρτήσεις ηλώσεις αρχείο header Ορισµοί αρχείο υλοποίησης Άλλοι ορισµοί τύπων structs, απλά typedefs αρχείο header ηλώσεις σταθερών αρχείο header Namespaces 56 Ορισµός ενός namespace: Μια συλλογή ορισµών ονοµάτων Ορισµοί κλάσεων ηλώσεις µεταβλητών Τα προγράµµατα χρησιµοποιούν πολλές συναρτήσεις, κλάσεις Συνήθως έχουν ίδια ονόµατα Τα namespaces αντιµετωπίζουναυτότοπρόβληµα Μπορεί να είναι "on" ή "off" Εάν τα ονόµατα είναι πιθανό να συγκρουστούν turn off Η directive using 57 using namespace std; Κάνει διαθέσιµους όλους τους ορισµούς στο std namespace Γιατί πιθανόν να ΜΗΝ το θέλουµε αυτό? Μπορεί να κάνει τα cout, cin να έχουν το µητυπικό τους νόηµα Ίσως ανάγκη να ξανα-ορίσουµεταcout, cin Μπορούµεναξαναορίσουµε όποιο άλλο επιθυµούµε 19

Το namespace std 58 Περιέχει όλα τα ονόµατα που ορίζονται σε πολλά αρχεία standard βιβλιοθηκών Παράδειγµα: #include <iostream> Τοποθετεί όλους τους ορισµούς των ονοµάτων (cin, cout, κ.τ.λ.) στο std namespace Το πρόγραµµά µας δεν γνωρίζει τα ονόµατα Πρέπει να καθορίσουµεαυτότοnamespace για να µπορέσει το πρόγραµµά µας να προσπελάσει τα ονόµατα Καθολικό (Global) namespace 59 Όλος ο κώδικας πηγαίνει σε κάποιο namespace Εκτός εάν το καθορίσουµε αλλιώς Global namespace εν χρειάζεται να κάνουµε χρήση κάποιας directive Το Global namespace είναι πάντα διαθέσιµο Υπάρχει µια αυτόµατη using directive για το global namespace Πολλαπλά ονόµατα 60 Πολλαπλά namespaces π.χ., συνήθως χρησιµοποιούνται το global και το std Τι θα συµβεί εάν κάποιο όνοµα ορίζεται και στα δυο? Error Μπορούµεναταχρησιµοποιήσουµε καιτα δυο, αλλά όχι ταυτόχρονα Πρέπει να καθορίσουµε ποιοαπόταδυο χρησιµοποιούµε 20

Καθορίζοντας namespaces εδοµένων των namespaces NS1 και NS2 Και τα δυο έχουν void function myfunction() ηοποίαόµως ορίζεται διαφορετικά { using namespace NS1; myfunction(); } { using namespace NS2; myfunction(); } Χρησιµοποιώντας τη directive έχει εµβέλεια block 61 ηµιουργώντας ένα namespace 62 Χρησιµοποιήστε namespace οµαδοποίηση: namespace Name_Space_Name { Some_Code } Τοποθετεί όλα τα ονόµατα που ορίζονται στο Some_Code στο namespace Name_Space_Name Κατόπιν µπορούν να γίνουν διαθέσιµα: using namespace Name_Space_Name 63 Παράδειγµαδηµιουργίας namespace ήλωση συνάρτησης: namespace Space1 { void greeting(); } Ορισµός συνάρτησης: namespace Space1 { void greeting() { cout << "Hello from namespace Space1.\n"; } } 21

using δηλώσεων 64 Μπορούµενακαθορίσουµε µεµονωµένα ονόµατα από το namespace είτε το εξής: Έστωσαν τα namespaces NS1 και NS2 Κάθε ένα έχει συναρτήσεις fun1(), fun(2) Σύνταξη δήλωσης: using Name_Space::One_Name; Καθορίζουµεποιοόνοµα απόταδυο: using NS1::fun1; using NS2::fun2; using ορισµούς και δηλώσεις 65 ιαφορές: using δήλωση Κάνει διαθέσιµο ΈΝΑµόνο όνοµα τουnamespace Εισαγάγει ονόµατα, έτσι ώστε καµία άλλη χρήση αυτών δεν επιτρέπεται using directive Κάνει διαθέσιµα ΌΛΑταονόµατα του namespace Εισαγάγει ονόµατα µόνο εν δυνάµει Qualifying ονόµατα Μπορούµενακαθορίσουµε από πού προέρχεται ένα όνοµα Χρησιµοποιούµε "qualifier" και τελεστή διάκρισης εµβέλειας (scope-resolution operator) Χρησιµοποιείται µόνο εάν πρόκειται να χρησιµοποιήσουµε τοόνοµα µια φορά (ή λίγες σχετικά) NS1::fun1(); Καθορίζει ότι η fun() προέρχεται από το namespace NS1 Ειδικά χρήσιµογιαπαραµέτρους: int getinput(std::istream inputstream); Ηπαράµετρος βρίσκεται στο std namespace της istream Εξαλείφει την ανάγκη για την directive using ή using δήλωση 66 22

Ονοµατίζοντας namespaces 67 Χρησιµοποιούµε µοναδικό string Ελαττώνει την πιθανότητα για άλλα namespaces µε τοίδιοόνοµα Συχνά πολλοί προγραµµατιστές γράφουν namespaces για το ίδιο πρόγραµµα Πρέπει να έχουν διακριτά ονόµατα Χωρίς πολλαπλοί ορισµοί του ίδιου ονόµατος στην ίδια εµβέλεια Προκύπτει error Παρ. κλάσης σε namespace (αρχείο.h) 68 Παρ. κλάσης σε namespace (αρχείο.cpp) 69 23

Ανώνυµα (unnamed) Namespaces Ορισµός µονάδας µεταγλώττισης : Ένα αρχείο, µαζί µε όλα τα αρχεία που γίνονται #include από αυτό Κάθε µονάδα µεταγλώττισης έχει unnamed namespace Γράφεται µε τον ίδιο τρόπο, αλλά χωρίς όνοµα Τότε, όλα τα ονόµατα είναι τοπικά στην µονάδα µεταγλώττισης Χρησιµοποιούµε unnamed namespaces για να κρατήσουµε τα πράγµατα τοπικά Ηεµβέλεια ενός unnamed namespace είναι η µονάδα µεταγλώττισης 70 Global vs. Unnamed Namespaces 71 εν είναι το ίδιο Global namespace: εν υπάρχει καθόλου namespace οµαδοποίηση Καθολική εµβέλεια Unnamed namespace: Έχει namespace οµαδοποίηση, απλά δεν έχει όνοµα Τοπική εµβέλεια Φωλιαµένα namespaces 72 Οφωλιασµός namespaces είναι έγκυρος namespace S1 { namespace S2 { void sample() { } } Κάνουµε qualification το όνοµαδυοφορές: S1::S2::sample(); 24

Απόκρυψη βοηθητικών συναρτήσεων 73 Θυµηθείτε τις βοηθητικές συναρτήσεις: Χαµηλού επιπέδου λειτουργίες Όχι για δηµόσια χρήση υο τρόποι να τις κρύψουµε: Τις κάνουµε ιδιωτικέςσυναρτήσεις-µέλη Εάν η συνάρτηση παίρνει calling object Τις τοποθετούµεστοunnamed namespace της υλοποίησης της κλάσης! Εάν η συνάρτηση δεν χρειάζεται calling object Φτιάχνει καθαρότερο κώδικα (χωρίς qualifiers) Περίληψη 1 74 Μπορούµεναδιαχωρίσουµε τον ορισµό απότην υλοποίηση µιας κλάσης διαφορετικά αρχεία ιαφορετικές µονάδες µεταγλώττισης Ένα namespace είναι µια συλλογή από ορισµούς ονοµάτων Τρεις τρόποι για να χρησιµοποιήσουµεέναόνοµα ενός namespace: using directive using declaration qualifying Περίληψη 2 75 Οι ορισµοί των namespace τοποθετούνται µέσα σε οµαδοποιήσεις namespace Ανώνυµο (Unnamed) namespace Χρησιµοποιείται για τοπικούς ορισµούς ονοµάτων Ηεµβέλεια είναι η µονάδα µεταγλώττισης Καθολικό (Global) namespace Τα στοιχεία (items) που δεν βρίσκονται σε καµία οµαδοποίηση namespace Καθολική εµβέλεια 25