View
7
Download
0
Category
Preview:
Citation preview
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
1
Η Γλώσσα Προγραµµατισµού C++
(The C++ Programming Language)
∆ηµήτριος Κατσαρός, Ph.D.
Χειµώνας 2005
∆ιάλεξη 7η
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
2
Ιστοσελίδα του µαθήµατος
• http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm
• Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος
• Επικοινωνία: dimitris@skyblue.csd.auth.gr
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
3
Περιεχόµενα
• Αλφαριθµητικά• Κλάση string
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
4
Στόχοι εκµάθησης
• Χρήση της έννοιας του πίνακα για αλφαριθµητικά– C-strings
• Εργαλεία χειρισµού χαρακτήρων– Character I/O– get, put συναρτήσεις– putback, peek, ignore
• Κλάση string– Επεξεργασία string
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
5
Εισαγωγή
• ∆υο τύποι αλφαριθµητικών:
• C-strings– Πίνακας µε βασικό τύπο char– Το τέλος του αλφαριθµητικού σηµατοδοτείται µε το
null, "\0"– “Παλιότερη” µέθοδος που κληρονοµήθηκε από τη C
• Κλάση string– Χρησιµοποιεί templates
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
6
C-strings
• Πίνακας µε βασικό τύπο char– Ένας χαρακτήρας ανά indexed µεταβλητή– Ένας επιπλέον χαρακτήρας: "\0"
• Αποκαλείται “null χαρακτήρας”• Χαρακτήρας τέλους
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
7
Μεταβλητή τύπου C-string• Πίνακας χαρακτήρων:
char s[10];– ∆ήλωση µεταβλητής c-string που µπορεί να κρατήσει
µέχρι 9 χαρακτήρες– + τον null χαρακτήρα
• Συνήθως “µερικώς-πλήρης” πίνακας– ∆ήλωση αρκετά µεγάλου µεγέθους, ώστε να µπορεί να κρατήσει το αλφαριθµητικό του µεγαλύτερου µεγέθους που µπορεί να συναντηθεί
– Indicate end with null
• Η µοναδική διαφορά από τους τυπικούς πίνακες:– Πρέπει να περιέχει τον null χαρακτήρα
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
8
Αποθήκευση ενός C-string
• Τυπικός πίνακας:char s[10];– Εάν το s περιέχει το αλφαριθµητικό "Hi Mom!", θα αποθηκευτεί ως:
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
9
Αρχικοποίηση ενός C-string
• Μπορούµε να αρχικοποιήσουµε ένα c-string:char myMessage[20] = "Hi there.";– ∆εν χρειάζεται να γεµίσουµε ολόκληρο τον πίνακα– Η αρχικοποίηση τοποθετεί το "\0" στο τέλος
• Μπορούµε να παραλείψουµε το µέγεθος του πίνακα:char shortString[] = "abc";– Αυτόµατα κάνει το µέγεθος του πίνακα κατά ένα
µεγαλύτερο από το µήκος του αλφαριθµητικού– ∆ΕΝ είναι το ίδιο µε το:
char shortString[] = {"a", "b", "c"};
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] είναι απροσδιόριστο
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
11
Χειρισµός των indexes ενός C-string
• Μπορούµε να χειριστούµε τις indexed µεταβλητέςchar happyString[7] = "DoBeDo";happyString[6] = "Z";– Προσοχή!– Εδώ, το "\0" (null) αντικαταστάθηκε από το "Z"!
• Εάν το null διαγραφεί, όπως εδώ, το c-string δεν συµπεριφέρεται πλέον όπως ένα c-string!– Απροσδιόριστα αποτελέσµατα!
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
12
Βιβλιοθήκη
• ∆ήλωση c-strings– ∆εν απαιτεί κάποια C++ βιβλιοθήκη– Κοµµάτι της βασικής C++
• Χειρισµός– Απαιτούν τη βιβλιοθήκη <cstring>– Τυπικά, τις συµπεριλαµβάνουµε όταν χρησιµοποιούµε τα c-strings
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
13
Τελεστές = και == µε τα C-strings• Τα C-strings δεν είναι όπως οι άλλες µεταβλητές
– ∆εν “επιτρέπεται” η ανάθεση και η σύγκριση:char aString[10];aString = "Hello"; //ΠΑΡΑΝΟΜΟ!
• Μπορούµε να χρησιµοποιήσουµε την ανάθεση "=" ΜΟΝΟ στη δήλωση ενός c-string!
• Πρέπει να χρησιµοποιήσουµε συνάρτηση βιβλιοθήκης για ανάθεση:strcpy(aString, "Hello");– Ενσωµατωµένη συνάρτηση (στη βιβλιοθήκη <cstring>)– Θέτει την τιµή του aString ίση µε "Hello"– ∆ΕΝ ελέγχει για µέγεθος!
• Αφήνεται στον προγραµµατιστή, όπως συµβαίνει και στους πίνακες!
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.";
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
15
Η βιβλιοθήκη <cstring> (1/2)
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
16
Η βιβλιοθήκη <cstring> (2/2)
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
17
Συναρτήσεις για C-string: strlen()
• “Μήκος αλφαριθµητικού”
• Συχνά είναι χρήσιµο να γνωρίζουµε το µήκος του αλφαριθµητικού:char myString[10] = "dobedo";cout << strlen(myString);– Επιστρέφει τον αριθµό των χαρακτήρων
• Το null δεν συµπεριλαµβάνεται
– Το αποτέλεσµα είναι:6
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
18
Συναρτήσεις για C-string: strcat()
• “Συνένωση αλφαριθµητικών”
• Συχνά επιθυµούµε να ενώσουµε δυο αλφαριθµητικά:char stringVar[20] = "The rain";strcat(stringVar, "in Spain");– ∆είτε το αποτέλεσµα:Η µεταβλητή stringVar περιέχει τώρα "The rainin Spain"
– Προσοχή!– Προσθέστε κενά όπου χρειάζεται!
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
19
C-strings ως ορίσµατα, παράµετροι• Θυµηθείτε: ένα c-string είναι ένας πίνακας
• Μια παράµετρος c-string είναι µια παράµετρος πίνακα– Τα c-strings που περνιούνται σε συναρτήσεις µπορεί να αλλαχτούν από την καλούµενη συνάρτηση!
• Όπως όλοι οι πίνακες, είναι σύνηθες να στέλνουµε και το µέγεθος ως όρισµα– Η συνάρτηση θα µπορούσε βέβαια να βρει το χαρακτήρα
"\0" και έτσι να προσδιορίσει το µέγεθος του αλφαριθµητικού
– Έτσι, το µέγεθος δεν είναι απόλυτα απαραίτητο εάν η συνάρτηση δεν θα αλλάξει την παράµετρο c-string
– Χρησιµοποιήστε τον "const" modifier για να προστατέψετε τα ορίσµατα c-string
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
20
Έξοδος για C-string
• Η έξοδος επιτυγχάνεται µε τον τελεστή <<
• Το έχουµε ήδη δει:cout << news << " Wow.\n";– Όπου το news είναι µια µεταβλητή c-string
• Είναι δυνατό, επειδή ο τελεστής << υπερφορτώνεται για τα c-strings!
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
21
Είσοδος για C-string
• Η είσοδος επιτυγχάνεται µε τον τελεστή >>– Υπάρχουν βέβαια κάποια ζητήµατα
• Οι “λευκοί χαρακτήρες” θεωρούνται "delimiter"– Tab, space, line breaks παραβλέπονται– Η ανάγνωση εισόδου σταµατά σε έναν delimiter
• Παρακολουθήστε το µέγεθος του c-string• Πρέπει να είναι αρκετά µεγάλο για να κρατήσει ολόκληρο το αλφαριθµητικό!
• Η C++ δεν παρέχει προειδοποιήσεις σε τέτοια ζητήµατα!
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"
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
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!
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
25
I/O χαρακτήρων
• Είσοδος και Έξοδος δεδοµένων– ΌΛΑ αντιµετωπίζονται ως χαρακτήρες– π.χ., ο αριθµός 10 τυπώνεται ως "1" και "0"– Η µεταροπή γίνεται αυτόµατα
• Χρησιµοποιεί χαµηλού επιπέδου λειτουργίες
• Φυσικά, µπορούµε και εµείς να χρησιµοποιήσουµε τις ίδιες χαµηλού επιπέδου λειτουργίες
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
26
Συνάρτηση get()
• ∆ιαβάζει ένα χαρακτήρα κάθε φορά
• Συνάρτηση µέλος του αντικειµένου cin:char nextSymbol;cin.get(nextSymbol);– ∆ιαβάζει τον επόµενο χαρακτήρα και τον τοποθετεί στη µεταβλητή nextSymbol
– Το όρισµα πρέπει να είναι τύπου char• Όχι "string"!
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
27
Συνάρτηση put()
• “Τυπώνει” ένα χαρακτήρα κάθε φορά
• Συνάρτηση µέλος του αντικειµένου cout:
• Παραδείγµατα:cout.put( “a” );– “Τυπώνει” το γράµµα "a" στην οθόνη
char myString[10] = "Hello";cout.put( myString[1] );– “Τυπώνει” το γράµµα "e" στην οθόνη
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
28
Κι άλλες συναρτήσεις
• putback()– Αφού διαβαστεί κάποιος χαρακτήρας, ίσως χρειαστεί να
“τοποθετηθεί πίσω” στο “κανάλι” εισόδου– cin.putback( lastChar );
• peek()– Επιστρέφει τον επόµενο χαρακτήρα, αλλά τον αφήνει εκεί– peekChar = cin.peek();
• ignore()– Αγνοεί την είσοδο, µέχρι τον συγκεκριµένο χαρακτήρα– cin.ignore(1000, "\n");
• Αγνοεί το πολύ 1000 χαρακτήρες µέχρι τον "\n"
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
29
Η βιβλιοθήκη <ctype> (1/3)
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
30
Η βιβλιοθήκη <ctype> (2/3)
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
31
Η βιβλιοθήκη <ctype> (3/3)
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!
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
33
Παράδειγµα χρήσης της string
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"
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
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;
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()!
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
38
Επεξεργασία για την κλάση string• ∆ιαθέσιµες οι ίδιες λειτουργίες όπως και στα c-strings
• Και ακόµα …– Πάνω από 100 µέλη της standard κλάσης string
• Μερικές συναρτήσεις-µέλη:– .length()
• Επιστρέφει το µήκος της µεταβλητής string
– .at(i)• Επιστρέφει αναφορά στο χαρακτήρα στη θέση i
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
39
Συναρτήσεις-µέλη της string (1/2)
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
40
Συναρτήσεις-µέλη της string (2/2)
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
23/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
42
Περίληψη
• Μια µεταβλητή τύπου C-string είναι “πίνακας χαρακτήρων”– Με την προσθήκη του ΚΕΝΟΥ χαρκτήρα (null character), "\0"
• Τα C-strings λειτουργούν όπως οι πίνακες– ∆εν επιτρέπουν ανάθεση και σύγκριση όπως οι απλές µεταβλητές
• Βιβλιοθήκες όπως οι <cctype> και <string> περιέχουν χρήσιµες συναρτήσεις διαχείρισης
• Η cin.get() διαβάζει τον επόµενο (µόνο) χαρακτήρα
• Οι εκδόσεις της getline() επιτρέπουν ανάγνωση ολόκληρων γραµµών
• Τα αντικείµενα της κλάσης String συµπεριφέρονται καλύτερα από ότι τα c-strings
Recommended