Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Αγρονόµων Τοπογράφων Μηχανικών Προγραµµατιστικές Τεχνικές Βασίλειος Βεσκούκης ρ. Ηλεκτρολόγος Μηχανικός & Μηχανικός Υπολογιστών ΕΜΠ v.vescoukis@cs.ntua.gr Ρωµύλος Κορακίτης Αστροφυσικός Αναπλ. Καθηγητής ΕΜΠ romylos@survey.ntua.gr Αλφαριθµητικά (strings)( Ρεύµατα (streams) εισόδου / εξόδου και µορφοποίηση δεδοµένων εξόδου
Αλφαριθµητικά (strings) Γνωρίζουµε ότι η C++ υποστηρίζει σατθερές ή µεταβλητές τύπου char, δηλαδή αλφαριθµητικούς χαρακτήρες. Οι µεταβλητές αυτές ανήκουν στην οικογένεια των ακέραιων (integer) µεταβλητών. char a1= Y ; int c=a1; cout<<a1<<c; --> εκτυπώνεται Y 89 (κωδικός ASCII του Υ) Για αλφαριθµητικές εκφράσεις πολλών χαρακτήρων, υπάρχει ο τύπος string. Για να χρησιµοποιηθεί απαιτείται να συµπεριληφθεί η κεφαλίδα string: #include <string> string exp1= Romylos Korakitis ; Η εντολή ορίζει την µεταβλητή exp1 ως string και της αποδίδει τιµή Romylos Korakitis Η τιµή µιας µεταβλητής string αποθηκεύεται όπως ακριβώς ένας πίνακας. Στο παράδειγµα, δηλαδή, το στοιχείο [0] της exp1 είναι R, το στοιχείο [1] είναι o κ.ο.κ. Έτσι, µια µεταβλητή string µπορεί να αποθηκεύσει πολύ µεγάλη ποσότητα αλφαριθµητικών χαρακτήρων
Πράξεις µε strings Για τον τύπο string έχουν οριστεί οι τελεστές: + (πρόσθήκη) και [] (δείκτης πίνακα) st1= Romylos ; st2= teaches Astronomy ; st3=st1+ +st2; ==> Η st3 έχει τιµή Romylos teaches Astronomy Η εντολή: st1[0]= z αντικαθιστά τον χαρακτήρα R µε z στην πρώτη θέση του string st1
Συναρτήσεις ορισµένες για τα strings - 1 1. Η συνάρτηση length επιστρέφει ένα µη προσηµασµένο ακέραιο που δηλώνει τον αριθµό των χαρακτήρων που περιλαµβάνει το αλφαριθµητικό. Η συνάρτηση αυτή δεν έχει παραµέτρους. st1= Romylos ; cout << st1.length(); ==> Εκτυπώνεται 7 Προφανώς, η τιµή της συνάρτησης µπορεί να αποδοθεί σε κάποια ακέαραια µεταβλητή. Ίδια συµπεριφορά µε την length() έχει και η συνάρτηση size(). 2. Η συνάρτηση substr επιστρέφει ένα τµήµα του αλφαριθµητικού. st2= teaches Astronomy ; st3=st2.substr(5,6); Η st3 περιέχει τους χαρακτήρες es Ast Η συνάρτηση substr δέχεται δύο παραµέτρους: την θέση (δείκτη) του πρώτου χαρακτήρα και το εύρος του τµήµατος. Οι παράµετροι µπορούν να είναι σταθερές, µεταβλητές ή εκφράσεις που έχουν ακέραια τιµή.
Συναρτήσεις ορισµένες για τα strings - 2 3. Η συνάρτηση find αναζητά σε ένα string την πρώτη εµφάνιση ενός συγκεκριµένου τµήµατος, που δίνεται ως παράµετρος. Επιστρέφει ένα ακέραιο αριθµό, που δηλώνει την θέση στο string του πρώτου χαρακτήρα που ταυτίστηκε. Η αναζήτηση είναι ακριβής (exact), πρέπει δηλαδή να συµφωνούν ακριβώς όλοι οι αναζητούµενοι χαρακτήρες. Αν δεν βρεθεί ταυτιζόµενο τµήµα, η συνάρτηση επιστρέφει την ειδική τιµή npos. st2= teaches Astronomy ; cout << st2.find( rono ); ==> Επιστρέφει τιµή 11 int t=st2.find( ach ); ==> η µεταβλητή t αποκτά την τιµή 2 Προφανώς, η παράµετρος αναζήτησης της συνάρτησης µπορεί να είναι µια σταθερά ή µια µεταβλητή τύπου string ή char 4. Η συνάρτηση swap που ανταλλάσει το περιεχόµενο δύο µεταβλητών τύπου string. string exp1= Romylos ; string exp2= Korakitis ; exp1.swap(exp2); ==> Η exp1 περιέχει Korakitis και η exp2 Romylos
Ρεύµατα εισόδου / εξόδου (Ι / Ο streams) Ρεύµα εισόδου (input stream) : µια ακολουθία χαρακτήρων από µια συσκευή εισόδου (πχ. πληκτρολόγιο, αρχείο κλπ) προς το σύστηµα. Ρεύµα εξόδου (output stream) : µια ακολουθία χαρακτήρων από το σύστηµα προς µια συσκευή εξόδου (πχ. οθόνη, αρχείο κλπ). Για να χρησιµοποιηθούν τα ρεύµατα πρέπει να δηλωθεί η κεφαλίδα <iostream> Γνωρίζουµε ήδη το καθιερωµένο ρεύµα εισόδου cin και το καθιερωµένο ρεύµα εξόδου cout. Παράδειγµα : cin >> a ;
Ρεύµατα εισόδου / εξόδου - 2 char ch1, ch2; int num; cin>>ch1>>ch2>>num; Ο χρήστης πληκτρολογεί : A 25 Όταν εκτελεστεί η εντολή εισόδου, οι µεταβλητές θα έχουν τιµές: Α στην ch1, 2 στην ch2 και 5 στην num. Αιτία: ο τελεστής >> αγνοεί τα κενά Αν θέλουµε τιµή Α στην ch1, κενό στην ch2 και 25 στην num??? Χρησιµοποιούµε την συνάρτηση get, µε γενική µορφή: cin.get(varchar); cin.get(ch1); cin.get(ch2); cin>>num; Για να αποθηκεύσουµε πολλούς χαρακτήρες (µε κενά) σε αλφαριθµητικό, χρησιµοποιούµε: getline(istreamvar, strvar); getline(cin cin,mystring); Πληκτρολόγηση: bbbbhello Hello there. How are you? Αποτέλεσµα: η τιµή του mystring είναι " Hello there. How are you?"
Παράδειγµα 1 // cin with strings #include <iostream.h> int main () { char mybuffer [100]; cout << "What's your name? "; cin.getline (mybuffer,100); cout << "Hello " << mybuffer << ".\n"; cout << "Which is your favourite team? "; cin.getline (mybuffer,100); cout << "I like " << mybuffer << " too.\n"; return 0; } Οθόνη What's your name? Romylos Hello Romylos. Which is your favourite team? Bayern I like Bayern too.
Παράδειγµα 2 Πρόβληµα: Να σχεδιαστεί και να γραφεί ένα πρόγραµµα που θα δέχεται από τον χρήστη δύο strings: το πρώτο θα εκφράζει το username και το δεύτερο το password του χρήστη προς το σύστηµα. Το πρόγραµµα θα συγκρίνει τα άλφαριθµητικά που πληκτρολογούνται µε τα αντίστοιχα πρότυπα, αποθηκευµένα ήδη, και εφ όσον αυτά συµφωνούν, θα εκτυπώνεται το µήνυµα «You are now connected». Αν όχι, θα προτρέπει τον χρήστη να εισάγει πάλι τα αλφαριθµητικά έως ότου δοθούν τα σωστά. εδοµένα εισόδου: string user, passw εδοµένα εξόδου: (µήνυµα)
Μορφοποίηση δεδοµένων εξόδου - 1 Η γενική µορφή χρήσης του ρεύµατος εξόδου είναι: cout<<παράσταση ή διαµορφωτής<<παράσταση ή διαµορφωτής ; Ο απλούστερος διαµορφωτής (manipulator) που ήδη ξέρουµε είναι ο endl. Άλλοι χρήσιµοι διαµορφωτές είναι: fixed, scientific, setprecision(d), setw(n) κλπ Οι διαµορφωτές αυτοί απαιτούν την χρήση της κεφαλιδας <iomanip> #include <iostream> #include <iomanip> using namespace std; int main() { double x,y,z; x = 15.674; y = 235.73; z = 9525.9867; cout<<fixed <<setprecision(3); cout<<"x = "<<setw(9)<<x<<endl; ==> x = 15.674 cout<<"y = "<<setw(9)<<y<<endl; ==> y = 235.730 cout<<"z = "<<setw(9)<<z<<endl; ==> z = 9525.987 return 0; }
Μορφοποίηση δεδοµένων εξόδου - 2 Μπορούµε να επιτύχουµε πλήρη διαµόρφωση των δεδοµένων εξόδου χρησιµοποιώντας την συνάρτηση εξόδου printf, µε γενική µορφή: printf(formatstring, var ) Το αλφαριθµητικό µορφοποίησης (format) µπορεί να έχει ένα πλήθος από προδιαγραφές µετατροπής, που έχουν όλες το πρόθεµα % #include <iostream> #include <stdio> using namespace std; int main() { double x = 15.674; double z = 9525.9867; int a = 13; printf("\na=%3d z=%9.3f",a,z); ==> a= 13 z= 9525.987 cout<<endl; printf("\nx= %10.5e z= %12.6e",x,z); ==> x= 1.56740e+01 z= 9.525987e+03 return 0; }