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

42
23/11/2005 Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήμιο Θεσσαλίας 1 Η Γλώσσα Προγραμματισμού C++ (The C++ Programming Language) ∆ημήτριος Κατσαρός, Ph.D. Χειμώνας 2005 ∆ιάλεξη 7η

Transcript of Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming...

Page 1: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

1

Η Γλώσσα Προγραµµατισµού C++

(The C++ Programming Language)

∆ηµήτριος Κατσαρός, Ph.D.

Χειµώνας 2005

∆ιάλεξη 7η

Page 2: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

2

Ιστοσελίδα του µαθήµατος

• http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm

• Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος

• Επικοινωνία: [email protected]

Page 3: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

3

Περιεχόµενα

• Αλφαριθµητικά• Κλάση string

Page 4: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

4

Στόχοι εκµάθησης

• Χρήση της έννοιας του πίνακα για αλφαριθµητικά– C-strings

• Εργαλεία χειρισµού χαρακτήρων– Character I/O– get, put συναρτήσεις– putback, peek, ignore

• Κλάση string– Επεξεργασία string

Page 5: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

5

Εισαγωγή

• ∆υο τύποι αλφαριθµητικών:

• C-strings– Πίνακας µε βασικό τύπο char– Το τέλος του αλφαριθµητικού σηµατοδοτείται µε το

null, "\0"– “Παλιότερη” µέθοδος που κληρονοµήθηκε από τη C

• Κλάση string– Χρησιµοποιεί templates

Page 6: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

6

C-strings

• Πίνακας µε βασικό τύπο char– Ένας χαρακτήρας ανά indexed µεταβλητή– Ένας επιπλέον χαρακτήρας: "\0"

• Αποκαλείται “null χαρακτήρας”• Χαρακτήρας τέλους

Page 7: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

7

Μεταβλητή τύπου C-string• Πίνακας χαρακτήρων:

char s[10];– ∆ήλωση µεταβλητής c-string που µπορεί να κρατήσει

µέχρι 9 χαρακτήρες– + τον null χαρακτήρα

• Συνήθως “µερικώς-πλήρης” πίνακας– ∆ήλωση αρκετά µεγάλου µεγέθους, ώστε να µπορεί να κρατήσει το αλφαριθµητικό του µεγαλύτερου µεγέθους που µπορεί να συναντηθεί

– Indicate end with null

• Η µοναδική διαφορά από τους τυπικούς πίνακες:– Πρέπει να περιέχει τον null χαρακτήρα

Page 8: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

8

Αποθήκευση ενός C-string

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

Page 9: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

9

Αρχικοποίηση ενός C-string

• Μπορούµε να αρχικοποιήσουµε ένα c-string:char myMessage[20] = "Hi there.";– ∆εν χρειάζεται να γεµίσουµε ολόκληρο τον πίνακα– Η αρχικοποίηση τοποθετεί το "\0" στο τέλος

• Μπορούµε να παραλείψουµε το µέγεθος του πίνακα:char shortString[] = "abc";– Αυτόµατα κάνει το µέγεθος του πίνακα κατά ένα

µεγαλύτερο από το µήκος του αλφαριθµητικού– ∆ΕΝ είναι το ίδιο µε το:

char shortString[] = {"a", "b", "c"};

Page 10: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

10

C-string Indexes

• Ένα c-string ΕΙΝΑΙ ένας πίνακας

• Μπορούµε να προσπελάσουµε τις indexed µεταβλητές του:char ourString[5] = "Hi";– Το ourString[0] είναι το "H"– Το ourString[1] είναι το "i"– Το ourString[2] είναι το "\0"– Το ourString[3] είναι απροσδιόριστο– Το ourString[4] είναι απροσδιόριστο

Page 11: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

11

Χειρισµός των indexes ενός C-string

• Μπορούµε να χειριστούµε τις indexed µεταβλητέςchar happyString[7] = "DoBeDo";happyString[6] = "Z";– Προσοχή!– Εδώ, το "\0" (null) αντικαταστάθηκε από το "Z"!

• Εάν το null διαγραφεί, όπως εδώ, το c-string δεν συµπεριφέρεται πλέον όπως ένα c-string!– Απροσδιόριστα αποτελέσµατα!

Page 12: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

12

Βιβλιοθήκη

• ∆ήλωση c-strings– ∆εν απαιτεί κάποια C++ βιβλιοθήκη– Κοµµάτι της βασικής C++

• Χειρισµός– Απαιτούν τη βιβλιοθήκη <cstring>– Τυπικά, τις συµπεριλαµβάνουµε όταν χρησιµοποιούµε τα c-strings

Page 13: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

13

Τελεστές = και == µε τα C-strings• Τα C-strings δεν είναι όπως οι άλλες µεταβλητές

– ∆εν “επιτρέπεται” η ανάθεση και η σύγκριση:char aString[10];aString = "Hello"; //ΠΑΡΑΝΟΜΟ!

• Μπορούµε να χρησιµοποιήσουµε την ανάθεση "=" ΜΟΝΟ στη δήλωση ενός c-string!

• Πρέπει να χρησιµοποιήσουµε συνάρτηση βιβλιοθήκης για ανάθεση:strcpy(aString, "Hello");– Ενσωµατωµένη συνάρτηση (στη βιβλιοθήκη <cstring>)– Θέτει την τιµή του aString ίση µε "Hello"– ∆ΕΝ ελέγχει για µέγεθος!

• Αφήνεται στον προγραµµατιστή, όπως συµβαίνει και στους πίνακες!

Page 14: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

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.";

Page 15: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

15

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

Page 16: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

16

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

Page 17: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

17

Συναρτήσεις για C-string: strlen()

• “Μήκος αλφαριθµητικού”

• Συχνά είναι χρήσιµο να γνωρίζουµε το µήκος του αλφαριθµητικού:char myString[10] = "dobedo";cout << strlen(myString);– Επιστρέφει τον αριθµό των χαρακτήρων

• Το null δεν συµπεριλαµβάνεται

– Το αποτέλεσµα είναι:6

Page 18: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

18

Συναρτήσεις για C-string: strcat()

• “Συνένωση αλφαριθµητικών”

• Συχνά επιθυµούµε να ενώσουµε δυο αλφαριθµητικά:char stringVar[20] = "The rain";strcat(stringVar, "in Spain");– ∆είτε το αποτέλεσµα:Η µεταβλητή stringVar περιέχει τώρα "The rainin Spain"

– Προσοχή!– Προσθέστε κενά όπου χρειάζεται!

Page 19: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

19

C-strings ως ορίσµατα, παράµετροι• Θυµηθείτε: ένα c-string είναι ένας πίνακας

• Μια παράµετρος c-string είναι µια παράµετρος πίνακα– Τα c-strings που περνιούνται σε συναρτήσεις µπορεί να αλλαχτούν από την καλούµενη συνάρτηση!

• Όπως όλοι οι πίνακες, είναι σύνηθες να στέλνουµε και το µέγεθος ως όρισµα– Η συνάρτηση θα µπορούσε βέβαια να βρει το χαρακτήρα

"\0" και έτσι να προσδιορίσει το µέγεθος του αλφαριθµητικού

– Έτσι, το µέγεθος δεν είναι απόλυτα απαραίτητο εάν η συνάρτηση δεν θα αλλάξει την παράµετρο c-string

– Χρησιµοποιήστε τον "const" modifier για να προστατέψετε τα ορίσµατα c-string

Page 20: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

20

Έξοδος για C-string

• Η έξοδος επιτυγχάνεται µε τον τελεστή <<

• Το έχουµε ήδη δει:cout << news << " Wow.\n";– Όπου το news είναι µια µεταβλητή c-string

• Είναι δυνατό, επειδή ο τελεστής << υπερφορτώνεται για τα c-strings!

Page 21: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

21

Είσοδος για C-string

• Η είσοδος επιτυγχάνεται µε τον τελεστή >>– Υπάρχουν βέβαια κάποια ζητήµατα

• Οι “λευκοί χαρακτήρες” θεωρούνται "delimiter"– Tab, space, line breaks παραβλέπονται– Η ανάγνωση εισόδου σταµατά σε έναν delimiter

• Παρακολουθήστε το µέγεθος του c-string• Πρέπει να είναι αρκετά µεγάλο για να κρατήσει ολόκληρο το αλφαριθµητικό!

• Η C++ δεν παρέχει προειδοποιήσεις σε τέτοια ζητήµατα!

Page 22: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

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"

Page 23: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

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

Page 24: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

24

Λίγα περισσότερα για τη getline()

• Μπορούµε ρητά να καθορίσουµε τον αριθµό χαρακτήρων που θα λάβει:char shortString[5];cout << "Enter input: ";cin.getline(shortString, 5);cout << shortString << "END OF OUTPUT\n";

– Αποτέλεσµα:Enter input: dobedowapdobeEND OF OUTPUT

– Εξαναγκάζει να διαβαστούν ΤΕΣΣΕΡΕΙΣ µόνο χαρακτήρες

• Επειδή χρειάζεται χώρο για τον χαρακτήρα null!

Page 25: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

25

I/O χαρακτήρων

• Είσοδος και Έξοδος δεδοµένων– ΌΛΑ αντιµετωπίζονται ως χαρακτήρες– π.χ., ο αριθµός 10 τυπώνεται ως "1" και "0"– Η µεταροπή γίνεται αυτόµατα

• Χρησιµοποιεί χαµηλού επιπέδου λειτουργίες

• Φυσικά, µπορούµε και εµείς να χρησιµοποιήσουµε τις ίδιες χαµηλού επιπέδου λειτουργίες

Page 26: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

26

Συνάρτηση get()

• ∆ιαβάζει ένα χαρακτήρα κάθε φορά

• Συνάρτηση µέλος του αντικειµένου cin:char nextSymbol;cin.get(nextSymbol);– ∆ιαβάζει τον επόµενο χαρακτήρα και τον τοποθετεί στη µεταβλητή nextSymbol

– Το όρισµα πρέπει να είναι τύπου char• Όχι "string"!

Page 27: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

27

Συνάρτηση put()

• “Τυπώνει” ένα χαρακτήρα κάθε φορά

• Συνάρτηση µέλος του αντικειµένου cout:

• Παραδείγµατα:cout.put( “a” );– “Τυπώνει” το γράµµα "a" στην οθόνη

char myString[10] = "Hello";cout.put( myString[1] );– “Τυπώνει” το γράµµα "e" στην οθόνη

Page 28: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

28

Κι άλλες συναρτήσεις

• putback()– Αφού διαβαστεί κάποιος χαρακτήρας, ίσως χρειαστεί να

“τοποθετηθεί πίσω” στο “κανάλι” εισόδου– cin.putback( lastChar );

• peek()– Επιστρέφει τον επόµενο χαρακτήρα, αλλά τον αφήνει εκεί– peekChar = cin.peek();

• ignore()– Αγνοεί την είσοδο, µέχρι τον συγκεκριµένο χαρακτήρα– cin.ignore(1000, "\n");

• Αγνοεί το πολύ 1000 χαρακτήρες µέχρι τον "\n"

Page 29: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

29

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

Page 30: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

30

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

Page 31: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

31

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

Page 32: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

32

Η κλάση string• Ορίζεται στη βιβλιοθήκη:

#include <string>using namespace std;

• Μεταβλητές string και εκφράσεις– Αντιµετωπίζονται όπως και οι απλοί τύποι

• Επιτρέπεται ανάθεση, σύγκριση, πρόσθεση:string s1, s2, s3;s3 = s1 + s2; //Concatenations3 = "Hello Mom!" //Assignment– Σηµειώστε ότι το c-string "Hello Mom!"

µετατρέπεται αυτόµατα σε τύπο string!

Page 33: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

33

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

Page 34: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

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"

Page 35: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

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

Page 36: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

36

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

• Η getline() στην ουσία επιστρέφει αναφορά– string s1, s2;

getline(cin, s1) >> s2;– Results in: (cin) >> s2;

Page 37: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

37

Παγίδα: Μίξη µεθόδων εισόδου• Προσοχή στη µίξη cin >> var και getline

– int n;string line;cin >> n;getline(cin, line);

– Εάν η είσοδος είναι: 42Hello hitchhiker

• Η µεταβλητή n τίθεται στην τιµή 42• Η µεταβλητή line τέθηκε στο κενό αλφαριθµητικό!

– Η cin >> n “αγνοεί” τους λευκούς χαρακτήρες, αφήνοντας όµως το "\n" στο ρεύµα εισόδου για την getline()!

Page 38: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

38

Επεξεργασία για την κλάση string• ∆ιαθέσιµες οι ίδιες λειτουργίες όπως και στα c-strings

• Και ακόµα …– Πάνω από 100 µέλη της standard κλάσης string

• Μερικές συναρτήσεις-µέλη:– .length()

• Επιστρέφει το µήκος της µεταβλητής string

– .at(i)• Επιστρέφει αναφορά στο χαρακτήρα στη θέση i

Page 39: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

39

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

Page 40: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

40

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

Page 41: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

41

• Αυτόµατες µετατροπές τύπων– Από ένα C-string σε αντικείµενο string:

char aCString[] = "My C-string";string stringVar;stringVar = aCstring;

• Επιτρεπτό και κατάλληλο!

– aCString = stringVar;• Μη επιτρπτό!• ∆εν µπορεί να αυτο-µετατραπεί σε C-string

– Χρειάζεται ρητή µετατροπή:strcpy(aCString, stringVar.c_str());

Μετατροπές µεταξύ C-string και αντικειµένων της κλάσης string

Page 42: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures... · 2005-11-21 · Η Γλώσσα Προγραµµατισµού

23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

42

Περίληψη

• Μια µεταβλητή τύπου C-string είναι “πίνακας χαρακτήρων”– Με την προσθήκη του ΚΕΝΟΥ χαρκτήρα (null character), "\0"

• Τα C-strings λειτουργούν όπως οι πίνακες– ∆εν επιτρέπουν ανάθεση και σύγκριση όπως οι απλές µεταβλητές

• Βιβλιοθήκες όπως οι <cctype> και <string> περιέχουν χρήσιµες συναρτήσεις διαχείρισης

• Η cin.get() διαβάζει τον επόµενο (µόνο) χαρακτήρα

• Οι εκδόσεις της getline() επιτρέπουν ανάγνωση ολόκληρων γραµµών

• Τα αντικείµενα της κλάσης String συµπεριφέρονται καλύτερα από ότι τα c-strings