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

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

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

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

Η Γλώσσα Προγραµµατισµού 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++ (The C++ Programming Language)

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

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

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

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

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

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

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

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

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

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

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

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

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

Streams Input / Output in C++ George Kastrinis

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

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

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

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

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός Υπολογιστών με 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

4 Στόχοι εκµάθησης Χρήση της έννοιας του πίνακα για αλφαριθµητικά C-strings Εργαλεία χειρισµού χαρακτήρων Character I/O get, put συναρτήσεις putback, peek, ignore Κλάση string Επεξεργασία string

5 Εισαγωγή υο τύποι αλφαριθµητικών: C-strings Πίνακας µε βασικότύποchar Το τέλος του αλφαριθµητικού σηµατοδοτείται µε το null, "\0" Παλιότερη µέθοδος που κληρονοµήθηκε από τη C Κλάση string Χρησιµοποιεί templates

6 C-strings Πίνακας µε βασικότύποchar Ένας χαρακτήρας ανά indexed µεταβλητή Ένας επιπλέον χαρακτήρας: "\0" Αποκαλείται null χαρακτήρας Χαρακτήρας τέλους

7 Μεταβλητή τύπου C-string Πίνακας χαρακτήρων: char s[10]; ήλωση µεταβλητής c-string που µπορεί να κρατήσει µέχρι 9 χαρακτήρες + τον null χαρακτήρα Συνήθως µερικώς-πλήρης πίνακας ήλωση αρκετά µεγάλου µεγέθους, ώστε να µπορεί να κρατήσει το αλφαριθµητικό του µεγαλύτερου µεγέθους που µπορεί να συναντηθεί Indicate end with null Η µοναδική διαφορά από τους τυπικούς πίνακες: Πρέπει να περιέχει τον null χαρακτήρα

8 Αποθήκευση ενός C-string Τυπικός πίνακας: char s[10]; Εάν το s περιέχει το αλφαριθµητικό "Hi Mom!", θα αποθηκευτεί ως:

9 Αρχικοποίηση ενός C-string Μπορούµε να αρχικοποιήσουµε έναc-string: char mymessage[20] = "Hi there."; εν χρειάζεται να γεµίσουµε ολόκληρο τον πίνακα Η αρχικοποίηση τοποθετεί το "\0" στο τέλος Μπορούµεναπαραλείψουµετοµέγεθος του πίνακα: char shortstring[] = "abc"; Αυτόµατα κάνει το µέγεθος του πίνακα κατά ένα µεγαλύτερο από το µήκος του αλφαριθµητικού ΕΝ είναι το ίδιο µε το: char shortstring[] = {"a", "b", "c"};

10 C-string Indexes Ένα c-string ΕΙΝΑΙ ένας πίνακας Μπορούµεναπροσπελάσουµε τιςindexed µεταβλητές του: char ourstring[5] = "Hi"; Το ourstring[0] είναι το "H" Το ourstring[1] είναι το "i" Το ourstring[2] είναι το "\0" Το ourstring[3] είναι απροσδιόριστο Το ourstring[4] είναι απροσδιόριστο

Χειρισµός των indexes ενός C-string 11 Μπορούµεναχειριστούµε τις indexed µεταβλητές char happystring[7] = "DoBeDo"; happystring[6] = "Z"; Προσοχή! Εδώ, το "\0" (null) αντικαταστάθηκε από το "Z"! Εάν το null διαγραφεί, όπως εδώ, το c-string δεν συµπεριφέρεται πλέον όπως ένα c-string! Απροσδιόριστα αποτελέσµατα!

12 Βιβλιοθήκη ήλωση c-strings εν απαιτεί κάποια C++ βιβλιοθήκη Κοµµάτι της βασικής C++ Χειρισµός Απαιτούν τη βιβλιοθήκη <cstring> Τυπικά, τις συµπεριλαµβάνουµε όταν χρησιµοποιούµε ταc-strings

13 Τελεστές = και == µεταc-strings Τα C-strings δεν είναι όπως οι άλλες µεταβλητές εν επιτρέπεται η ανάθεση και η σύγκριση: char astring[10]; astring = "Hello"; //ΠΑΡΑΝΟΜΟ! Μπορούµεναχρησιµοποιήσουµετηνανάθεση"=" ΜΟΝΟ στη δήλωση ενός c-string! Πρέπει να χρησιµοποιήσουµεσυνάρτηση βιβλιοθήκης για ανάθεση: strcpy(astring, "Hello"); Ενσωµατωµένη συνάρτηση (στη βιβλιοθήκη <cstring>) Θέτει την τιµήτουastring ίση µε "Hello" ΕΝ ελέγχει για µέγεθος! Αφήνεται στον προγραµµατιστή, όπως συµβαίνει και στους πίνακες!

14 Σύγκριση δυο C-strings Επίσης, δεν µπορούµεναχρησιµοποιήσουµε τον τελεστή == char astring[10] = "Hello"; char anotherstring[10] = "Goodbye"; astring == anotherstring; // ΕΝ επιτρέπεται! Πρέπει να χρησιµοποιήσουµε συνάρτηση βιβλιοθήκης: if (strcmp(astring, anotherstring)) cout << "Strings NOT same."; else cout << "Strings are same.";

15 Ηβιβλιοθήκη<cstring> (1/2)

16 Ηβιβλιοθήκη<cstring> (2/2)

17 Συναρτήσεις για C-string: strlen() Μήκος αλφαριθµητικού Συχνά είναι χρήσιµοναγνωρίζουµε τοµήκος του αλφαριθµητικού: char mystring[10] = "dobedo"; cout << strlen(mystring); Επιστρέφει τον αριθµό των χαρακτήρων Το null δεν συµπεριλαµβάνεται Το αποτέλεσµα είναι: 6

18 Συναρτήσεις για C-string: strcat() Συνένωση αλφαριθµητικών Συχνά επιθυµούµεναενώσουµε δυοαλφαριθµητικά: char stringvar[20] = "The rain"; strcat(stringvar, "in Spain"); είτε το αποτέλεσµα: Η µεταβλητή stringvar περιέχει τώρα "The rainin Spain" Προσοχή! Προσθέστε κενά όπου χρειάζεται!

19 C-strings ως ορίσµατα, παράµετροι Θυµηθείτε: ένα c-string είναι ένας πίνακας Μια παράµετρος c-string είναι µια παράµετρος πίνακα Τα c-strings που περνιούνται σε συναρτήσεις µπορεί να αλλαχτούν από την καλούµενη συνάρτηση! Όπως όλοι οι πίνακες, είναι σύνηθες να στέλνουµε και το µέγεθος ως όρισµα Ησυνάρτησηθαµπορούσε βέβαια να βρει το χαρακτήρα "\0" και έτσι να προσδιορίσει το µέγεθος του αλφαριθµητικού Έτσι, το µέγεθος δεν είναι απόλυτα απαραίτητο εάν η συνάρτηση δεν θα αλλάξει την παράµετρο c-string Χρησιµοποιήστε τον "const" modifier γιαναπροστατέψετε τα ορίσµατα c-string

20 Έξοδος για C-string Η έξοδος επιτυγχάνεται µε τοντελεστή<< Το έχουµεήδηδει: cout << news << " Wow.\n"; Όπου το news είναι µια µεταβλητή c-string Είναι δυνατό, επειδή ο τελεστής << υπερφορτώνεται για τα c-strings!

21 Είσοδος για C-string Η είσοδος επιτυγχάνεται µετοντελεστή>> Υπάρχουν βέβαια κάποια ζητήµατα Οι λευκοί χαρακτήρες θεωρούνται "delimiter" Tab, space, line breaks παραβλέπονται Η ανάγνωση εισόδου σταµατά σε έναν delimiter Παρακολουθήστε το µέγεθος του c-string Πρέπει να είναι αρκετά µεγάλο για να κρατήσει ολόκληρο το αλφαριθµητικό! Η C++ δεν παρέχει προειδοποιήσεις σε τέτοια ζητήµατα!

22 Παράδειγµα εισόδου για C-string 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"

23 Είσοδος γραµµής σε C-string Μπορούµεναλάβουµε ολόκληρηγραµµήωςτιµή σε ένα 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

24 Λίγα περισσότερα για τη getline() Μπορούµε ρητά να καθορίσουµε τοναριθµό χαρακτήρων που θα λάβει: char shortstring[5]; cout << "Enter input: "; cin.getline(shortstring, 5); cout << shortstring << "END OF OUTPUT\n"; Αποτέλεσµα: Enter input: dobedowap dobeend OF OUTPUT Εξαναγκάζει να διαβαστούν ΤΕΣΣΕΡΕΙΣ µόνο χαρακτήρες Επειδή χρειάζεται χώρο για τον χαρακτήρα null!

25 I/O χαρακτήρων Είσοδος και Έξοδος δεδοµένων ΌΛΑ αντιµετωπίζονται ως χαρακτήρες π.χ., οαριθµός 10 τυπώνεται ως "1" και "0" Η µεταροπή γίνεται αυτόµατα Χρησιµοποιεί χαµηλού επιπέδου λειτουργίες Φυσικά, µπορούµεκαιεµείς να χρησιµοποιήσουµε τις ίδιες χαµηλού επιπέδου λειτουργίες

26 Συνάρτηση get() ιαβάζει ένα χαρακτήρα κάθε φορά Συνάρτηση µέλος του αντικειµένου cin: char nextsymbol; cin.get(nextsymbol); ιαβάζει τον επόµενο χαρακτήρα και τον τοποθετεί στη µεταβλητή nextsymbol Το όρισµα πρέπει να είναι τύπου char Όχι "string"!

27 Συνάρτηση put() Τυπώνει ένα χαρακτήρα κάθε φορά Συνάρτηση µέλος του αντικειµένου cout: Παραδείγµατα: cout.put( a ); Τυπώνει το γράµµα "a" στην οθόνη char mystring[10] = "Hello"; cout.put( mystring[1] ); Τυπώνει το γράµµα "e" στην οθόνη

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

29 Ηβιβλιοθήκη<ctype> (1/3)

30 Ηβιβλιοθήκη<ctype> (2/3)

31 Ηβιβλιοθήκη<ctype> (3/3)

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

33 Παράδειγµα χρήσηςτηςstring

34 I/O µε την κλάση string Όπως και για τους άλλους τύπους! string s1, s2; cin >> s1; cin >> s2; Αποτελέσµατα: Οχρήστηςπληκτρολογεί το ακόλουθο: May the hair on your toes grow long and curly! Η εξαγωγή αγνοεί τους λευκούς χαρακτήρες: Το s1 λαµβάνει την τιµή "May" Το s2 λαµβάνει την τιµή "the"

35 Η getline() µετηνκλάσηstring Για πλήρεις γραµµές: 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

36 Άλλες εκδόσεις της getline() Μπορούµενακαθορίσουµε "delimiter" χαρακτήρα: string line; cout << "Enter input: "; getline(cin, line, "?"); Λαµβάνει είσοδο µέχρι να συναντήσει το χαρακτήρα "?" Η getline() στην ουσία επιστρέφει αναφορά string s1, s2; getline(cin, s1) >> s2; Results in: (cin) >> s2;

37 Παγίδα: Μίξη µεθόδων εισόδου Προσοχή στη µίξη cin >> var και getline int n; string line; cin >> n; getline(cin, line); Εάν η είσοδος είναι: 42 Hello hitchhiker Η µεταβλητή n τίθεται στην τιµή 42 Η µεταβλητή line τέθηκε στο κενό αλφαριθµητικό! Η cin >> n αγνοεί τους λευκούς χαρακτήρες, αφήνοντας όµως το "\n" στο ρεύµα εισόδου για την getline()!

38 Επεξεργασία για την κλάση string ιαθέσιµες οι ίδιες λειτουργίες όπως και στα c-strings Και ακόµα Πάνω από 100 µέλη της standard κλάσης string Μερικές συναρτήσεις-µέλη:.length() Επιστρέφει το µήκος της µεταβλητής string.at(i) Επιστρέφει αναφορά στο χαρακτήρα στη θέση i

39 Συναρτήσεις-µέλη της string (1/2)

40 Συναρτήσεις-µέλη της string (2/2)

Μετατροπές µεταξύ C-string και 41 αντικειµένων της κλάσης string Αυτόµατες µετατροπές τύπων Από ένα 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

43 Περιεχόµενα Χωριστή µεταγλώττιση και Namespaces

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

45 Χωριστή µεταγλώττιση Τµήµατα του προγράµµατος Κρατούνται σε διαφορετικά αρχεία Μεταγλωττίζονται χωριστά Συνενώνονται πριν εκτελεστεί το πρόγραµµα Ορισµοί κλάσεων Χωριστοί από τα προγράµµατα που τις χρησιµοποιούν ηµιουργία βιβλιοθηκών κλάσεων Επανα-χρησιµοποιούνται από πολλά διαφορετικά προγράµµατα Όπωςκαιοιπροκαθορισµένες βιβλιοθήκες

46 ιαχωρισµός κλάσεων Ανεξαρτησία κλάσης Χωριστά ο ορισµός/προσδιορισµός της κλάσης Αποκαλείται interface Χωριστά η υλοποίηση της κλάσης Τοποθετούνται σε δυο διαφορετικά αρχεία Εάν αλλάξει η υλοποίηση µόνοαυτότο αρχείο χρειάζεται να αλλάξει Ο προσδιορισµός της κλάση δεν αλλάζει Τα προγράµµατα των χρηστών δεν αλλάζουν

47 Επαναθεώρηση της ενθυλάκωσης Αρχή της ενθυλάκωσης: ιαχωρισµός του πώς χρησιµοποιείται η κλάση από τον προγραµµατιστή από τις λεπτοµέρειες υλοποίησης της κλάσης Πλήρης διαχωρισµός Αλλαγή της υλοποίησης ΚΑΜΙΑ επίδραση στα άλλα προγράµµατα Βασική αρχή του OOP

48 Κανόνες ενθυλάκωσης Κανόνες για να εγγυηθούµε ενθυλάκωση: 1. Όλες οι µεταβλητές-µέλη πρέπει να είναι ιδιωτικές 2. Οι βασικές λειτουργίες της κλάσης πρέπει να είναι οι: ηµόσιες συναρτήσεις-µέλη Friend ή κανονικές συναρτήσεις Υπερφορτωµένοι τελεστές Οµαδοποίηση του ορισµού της κλάσης και των δηλώσεων/πρωτότυπα των συναρτήσεων Αποκαλείται διασύνδεση ( interface ) της κλάσης 3. Κάνουµε την υλοποίηση της κλάσης µηδιαθέσιµη στους χρήστες της

49 Περισσότερα για διαχωρισµόκλάσης Αρχείο διασύνδεσης Περιέχει τον ορισµό τηςκλάσηςµαζί µε τις δηλώσεις/πρωτότυπα των συναρτήσεων και των τελεστών Οι χρήστες βλέπουν αυτό το αρχείο Χωριστή µονάδα µεταγλώττισης Αρχείο υλοποίησης Περιέχει τους ορισµούς (υλοποίηση) των συναρτήσεων-µελών Χωριστή µονάδα µεταγλώττισης

50 Αρχεία κεφαλίδας της κλάσης Η διασύνδεση της κλάσης πάντα στο header file Χρήση του.h είναι σύµβαση για το όνοµά του Τα προγράµµατα που θα χρησιµοποιήσουν την κλάση θα το κάνουν "include" #include "myclass.h" Τα ""σηµατοδοτούν ότι γράφηκε από εµάς Το εντοπίζουµε στον τοπικό φάκελο εργασίας µας Θυµηθείτε τα include για βιβλιοθήκες, π.χ., <iostream> Τα <>σηµατοδοτούν header file προκαθορισµένης βιβλιοθήκης Τα εντοπίζουµεστοφάκελοµε τις βιβλιοθήκες

51 Αρχεία υλοποίησης της κλάσης Η υλοποίηση της κλάσης τοποθετείται σε.cpp αρχείο Συνήθως δίνουµε στοinterface αρχείο και στο αρχείο υλοποίησης το ίδιο όνοµα myclass.h και myclass.cpp Όλες οι συναρτήσεις-µέλη της κλάσης ορίζονται εδώ Το αρχείο υλοποίησης πρέπει να κάνει #include το header αρχείο της κλάσης Τα.cpp αρχεία συνήθως, περιέχουν εκτελέσιµο κώδικα π.χ., ορισµούς συναρτήσεων, περιλαµβανοµένης και της main()

52 Αρχεία της κλάσης Το header αρχείο της κλάσης γίνεται #include από: Το αρχείο υλοποίησης Το αρχείο προγράµµατος Συχνά αποκαλείται αρχείο εφαρµογής ή αρχείο οδηγός Η οργάνωση των αρχείων διαφέρει από σύστηµα σεσύστηµα Τα συνήθη IDE έχουν "project" ή "workspace" Τα αρχεία υλοποίησης συνδυάζονται εδώ Εξακολουθούµε νακάνουµε #include τα header αρχεία

Πολλαπλές µεταγλωττίσεις των 53 αρχείων header Αρχεία header Συνήθως γίνονται #include πολλές φορές π.χ., η διασύνδεση της κλάσης γίνεται include από την υλοποίησητηςκλάσηςαλλάκαιαπότοαρχείοεφαρµογής Πρέπει όµως να µεταγλωττιστεί µόνο µια φορά! εν υπάρχει εγγύηση για το ποιο "#include" σε ποιο αρχείο, θα δει πρώτο ο compiler Χρήση του προεπεξεργαστή Καθοδηγούµε τονcompiler να κάνει include το header µόνο µια φορά

54 Χρήση της #ifndef οµή αρχείουheader: #ifndef FNAME_H #define FNAME_H //Contents of header file #endif Το FNAME είναι συνήθως το όνοµατου ίδιου του αρχείου για συνέπεια και ευκολία Αυτή η σύνταξη αποφεύγει τους πολλαπλούς ορισµούς του αρχείου header

55 Άλλα αρχεία βιβλιοθήκης Η βιβλιοθήκες δεν είναι µόνο για τις κλάσεις Σχετικές συναρτήσεις ηλώσεις αρχείο header Ορισµοί αρχείο υλοποίησης Άλλοι ορισµοί τύπων structs, απλά typedefs αρχείο header ηλώσεις σταθερών αρχείο header

56 Namespaces Ορισµός ενός namespace: Μια συλλογή ορισµών ονοµάτων Ορισµοί κλάσεων ηλώσεις µεταβλητών Τα προγράµµατα χρησιµοποιούν πολλές συναρτήσεις, κλάσεις Συνήθως έχουν ίδια ονόµατα Τα namespaces αντιµετωπίζουν αυτό το πρόβληµα Μπορεί να είναι "on" ή "off" Εάν τα ονόµατα είναι πιθανό να συγκρουστούν turn off

57 Η directive using using namespace std; Κάνει διαθέσιµους όλους τους ορισµούς στο std namespace Γιατί πιθανόν να ΜΗΝ το θέλουµε αυτό? Μπορεί να κάνει τα cout, cin να έχουν το µητυπικό τους νόηµα Ίσως ανάγκη να ξανα-ορίσουµε ταcout, cin Μπορούµεναξαναορίσουµε όποιο άλλο επιθυµούµε

58 Το namespace std Περιέχειόλαταονόµατα που ορίζονται σε πολλά αρχεία standard βιβλιοθηκών Παράδειγµα: #include <iostream> Τοποθετεί όλους τους ορισµούς των ονοµάτων (cin, cout, κ.τ.λ.) στο std namespace Το πρόγραµµά µας δεν γνωρίζει τα ονόµατα Πρέπει να καθορίσουµε αυτότοnamespace για να µπορέσει το πρόγραµµά µας να προσπελάσει τα ονόµατα

59 Καθολικό (Global) namespace Όλος ο κώδικας πηγαίνει σε κάποιο namespace Εκτός εάν το καθορίσουµε αλλιώς Global namespace εν χρειάζεται να κάνουµε χρήσηκάποιας directive Το Global namespace είναι πάντα διαθέσιµο Υπάρχει µια αυτόµατη using directive για το global namespace

60 Πολλαπλά ονόµατα Πολλαπλά namespaces π.χ., συνήθως χρησιµοποιούνται το global και το std Τι θα συµβεί εάν κάποιο όνοµαορίζεταικαι στα δυο? Error Μπορούµεναταχρησιµοποιήσουµε και τα δυο, αλλά όχι ταυτόχρονα Πρέπει να καθορίσουµεποιοαπόταδυο χρησιµοποιούµε

61 Καθορίζοντας namespaces εδοµένων των namespaces NS1 και NS2 Και τα δυο έχουν void function myfunction() ηοποίαόµως ορίζεται διαφορετικά { using namespace NS1; myfunction(); } { using namespace NS2; myfunction(); } Χρησιµοποιώντας τη directive έχει εµβέλεια block

62 ηµιουργώντας ένα namespace Χρησιµοποιήστε namespace οµαδοποίηση: namespace Name_Space_Name { Some_Code } Τοποθετεί όλα τα ονόµατα που ορίζονται στο Some_Code στο namespace Name_Space_Name Κατόπιν µπορούν να γίνουν διαθέσιµα: using namespace Name_Space_Name

Παράδειγµα δηµιουργίας namespace ήλωση συνάρτησης: namespace Space1 { void greeting(); } Ορισµός συνάρτησης: namespace Space1 { void greeting() { cout << "Hello from namespace Space1.\n"; } } 63

64 using δηλώσεων Μπορούµε να καθορίσουµε µεµονωµένα ονόµατα από το namespace είτε το εξής: Έστωσαν τα namespaces NS1 και NS2 Κάθε ένα έχει συναρτήσεις fun1(), fun(2) Σύνταξη δήλωσης: using Name_Space::One_Name; Καθορίζουµε ποιοόνοµα απόταδυο: using NS1::fun1; using NS2::fun2;

65 using ορισµούς και δηλώσεις ιαφορές: using δήλωση Κάνει διαθέσιµο ΈΝΑµόνο όνοµα τουnamespace Εισαγάγει ονόµατα, έτσι ώστε καµία άλλη χρήση αυτών δεν επιτρέπεται using directive Κάνει διαθέσιµα ΌΛΑ τα ονόµατα του namespace Εισαγάγει ονόµατα µόνο εν δυνάµει

66 Qualifying ονόµατα Μπορούµε να καθορίσουµε από πού προέρχεται ένα όνοµα Χρησιµοποιούµε "qualifier" και τελεστή διάκρισης εµβέλειας (scope-resolution operator) Χρησιµοποιείται µόνο εάν πρόκειται να χρησιµοποιήσουµε τοόνοµα µια φορά (ή λίγες σχετικά) NS1::fun1(); Καθορίζει ότι η fun() προέρχεται από το namespace NS1 Ειδικά χρήσιµο γιαπαραµέτρους: int getinput(std::istream inputstream); Ηπαράµετρος βρίσκεται στο std namespace της istream Εξαλείφει την ανάγκη για την directive using ή using δήλωση

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

68 Παρ. κλάσης σε namespace (αρχείο.h)

69 Παρ. κλάσης σε namespace (αρχείο.cpp)

70 Ανώνυµα (unnamed) Namespaces Ορισµός µονάδας µεταγλώττισης : Ένα αρχείο, µαζί µε όλα τα αρχεία που γίνονται #include από αυτό Κάθε µονάδα µεταγλώττισης έχει unnamed namespace Γράφεται µε τον ίδιο τρόπο, αλλά χωρίς όνοµα Τότε, όλαταονόµατα είναι τοπικά στην µονάδα µεταγλώττισης Χρησιµοποιούµε unnamed namespaces για να κρατήσουµε τα πράγµατα τοπικά Ηεµβέλεια ενός unnamed namespace είναι η µονάδα µεταγλώττισης

71 Global vs. Unnamed Namespaces εν είναι το ίδιο Global namespace: εν υπάρχει καθόλου namespace οµαδοποίηση Καθολική εµβέλεια Unnamed namespace: Έχει namespace οµαδοποίηση, απλά δεν έχει όνοµα Τοπική εµβέλεια

72 Φωλιαµένα namespaces Ο φωλιασµός namespaces είναι έγκυρος namespace S1 { namespace S2 { void sample() { } } Κάνουµε qualification το όνοµαδυοφορές: S1::S2::sample();

73 Απόκρυψη βοηθητικών συναρτήσεων Θυµηθείτε τις βοηθητικές συναρτήσεις: Χαµηλού επιπέδου λειτουργίες Όχι για δηµόσια χρήση υο τρόποι να τις κρύψουµε: Τις κάνουµε ιδιωτικές συναρτήσεις-µέλη Εάν η συνάρτηση παίρνει calling object Τις τοποθετούµε στοunnamed namespace της υλοποίησης της κλάσης! Εάν η συνάρτηση δεν χρειάζεται calling object Φτιάχνει καθαρότερο κώδικα (χωρίς qualifiers)

74 Περίληψη 1 Μπορούµεναδιαχωρίσουµετονορισµόαπότην υλοποίηση µιας κλάσης διαφορετικά αρχεία ιαφορετικές µονάδες µεταγλώττισης Ένα namespace είναι µια συλλογή από ορισµούς ονοµάτων Τρεις τρόποι για να χρησιµοποιήσουµε έναόνοµα ενός namespace: using directive using declaration qualifying

75 Περίληψη 2 Οι ορισµοί των namespace τοποθετούνται µέσα σε οµαδοποιήσεις namespace Ανώνυµο (Unnamed) namespace Χρησιµοποιείται για τοπικούς ορισµούς ονοµάτων Ηεµβέλεια είναι η µονάδα µεταγλώττισης Καθολικό (Global) namespace Τα στοιχεία (items) που δεν βρίσκονται σε καµία οµαδοποίηση namespace Καθολική εµβέλεια