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

Σχετικά έγγραφα
Προγραμματισμός Υπολογιστών με C++

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

Ανάπτυξη και Σχεδίαση Λογισμικού

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

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

Αρχεία & Ρεύματα ΑΡΧΕΙΑ & ΡΕΥΜΑΤΑ. Γεώργιος Παπαϊωάννου ( ) gepap@aueb.gr

Ανάπτυξη και Σχεδίαση Λογισμικού

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

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

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

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

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

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

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

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

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

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

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

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

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

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

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

3 η Διάλεξη C++ - Βασικοί τύποι δεδομένων. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

ΗΥ-150. Προγραμματισμός

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7) Είσοδος/ Έξοδος

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7)

Χωρική Βάση δεδοµένων Autocad

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

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

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

Περιεχόμενα. Πρόλογος... 21

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

ΗΥ-150. Προγραμματισμός

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

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

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

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

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

Streams Input / Output in C++ George Kastrinis

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

printf Οι κωδικοί (format codes) του printf για διάφορους τύπους δεδοµένων είναι:

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

Δομημένος Προγραμματισμός (ΤΛ1006)

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

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Κεφάλαιο 3.1, : Συναρτήσεις I. (Διάλεξη 11)

Εξοικ Εξ ε οικ ίωση ε με το το πρόγ ραμμα πρόγ DEV C++ Επικοι Επικ νωνία οι Χρήσ Χρήστη τη Υπολ Υπο ογισ λ τή

ΑΣΚΗΣΗ 2: ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΣΤΗ C

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

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

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

Δομημένος Προγραμματισμός

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Γ7.1 Επανάληψη ύλης Β Λυκείου. Γ Λυκείου Κατεύθυνσης

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

Δεδομένα, τελεστές, είσοδος/έξοδος

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

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

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

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 4-2

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

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

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

ιαφάνειες παρουσίασης #6 (β)

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

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

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

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Πίνακες (Arrays) Εισαγωγή στη C++

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

7. Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Τελεστές ΤΕΛΕΣΤΕΣ. Γεώργιος Παπαϊωάννου ( )

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

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα προηγούμενα ακαδημαϊκά έτη: ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Τυχαίοι αριθμοί Αλφαριθμητικά και χαρακτήρες

Προγραμματισμός Ι (ΗΥ120)

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

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

Περιεχόμενα. Πρόλογος... 17

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

ΚΑΛΟΥΠΩΜΑΤΑ & ΜΕΤΑΤΡΟΠΕΣ

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

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

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

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Προγραμματισμός Ι (ΗΥ120)

Δομημένος Προγραμματισμός (ΤΛ1006)

ΕΠΛ 032.3: Προγραµµατισµός ΜεθόδωνΕπίλυσηςΠροβληµάτων

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

Transcript:

ΣΥΜΒΟΛΟΣΕΙΡΕΣ Γεώργιος Παπαϊωάννου (2013-14) gepap@aueb.gr

Περιγραφή: Ο τύπος string Μετατροπή από και προς τον τύπο string Βασικές μέθοδοι Χρήση Ελληνικών Συναρτήσεις C εκτύπωσης και ανάγνωσης Τελευταία ενημέρωση: Ιούνιος 2013 Εισαγωγή - 2

Είδαμε ότι τα null-terminated strings (πίνακες χαρακτήρων) μπορούν να χρησιμοποιηθούν ως strings Στη C++ υπάρχει ειδική κλάση, η string που ενσωματώνει μια αντικειμενοστρεφή υλοποίηση των συμβολοσειρών και παρέχει υποστήριξη για σύνθετες αναπαραστάσεις χαρακτήρων, όπως Unicode, wide characters κλπ. Σημείωση: Εξακολουθούμε να δουλεύουμε με πίνακες χαρακτήρων όταν: Θέλουμε συμβατότητα με C (γίνεται και μετατροπή μεταξύ των 2 τύπων Επιθυμούμε μεγαλύτερη ταχύτητα (απλούστερη αναπαράσταση) 3

#include <string> #include <iostream> using namespace std; // Εδώ δηλώνεται το string // Εδώ ανήκει το string (std::string) int main() { string s1, s2; // Δε χρειάζεται να καθορίσουμε τα μεγέθη. cin >> s1; // Ο χώρος του s1 προσαρμόζεται αυτόματα. s2 = "copy of " + s1; // Πρόσθεση συμβολοσειρών. Μετατροπή // του πίνακα χαρακτήρων σε string. s1 = "new string"; // Νέα τιμή του s1. cout << s1 << endl << s2 << endl; } Πληκτρολογώ "test". Τυπώνει: new string copy of test 4

Η κλάση string είναι μέρος της βασικής βιβλιοθήκης «standard template library» (STL) η οποία είναι σπασμένη σε διάφορα αρχεία (π.χ. iostream, string κλπ) Η βιβλιοθήκη αυτή εντάσσει όλες τις κλάσεις της, τους τύπους της και τις συναρτήσεις της σε έναν κοινό χώρο ονομάτων (namespace), τον std Για να δηλώσω ένα string κανονικά ενσωματώνω και το namespace στο όνομα της κλάσης: std::string Αν δηλώσω ότι «χρησιμοποιώ» αυτό το namespace, μπορώ να το παραλείψω από τη δήλωση: using namespace std; string var = my string ; 5

Από πίνακα χαρακτήρων σε string: char buffer[20] = try me ; std::string str = buffer; Από string σε πίνακα χαρακτήρων: str.c_str(); Πρόσβαση στον εσωτερικό buffer (χαρακτήρων): str.data(); // Δεν είναι αντίγραφο και // δε μπορούμε να το αλλάξουμε (const) 6

Μέγεθος: string.size() και string.length() (ισοδύναμα) Άδεια συμβολοσειρά: string.empty() Ανατρέξτε στον οδηγό αναφοράς για τον πλήρη κατάλογο των μεθόδων του string: http://www.cplusplus.com/reference/string/string/ 7

Σύνθεση συμβολοσειρών: string str1 = try me ; string str2 = now ; string str3 = str1 + str2; str1.append(str2); srt1 += again ; Πρόσβαση σε χαρακτήρες: cout << str3[2] << endl; str3[4] = 'i'; str3[5] = 't'; cout << str3 << endl; // str3: try me now // str1: try me now // (append) try me now again // διάβασμα του 3 ου χαρ.: y // αντικατάσταση του 5 ου χαρ. // αντικατάσταση του 6 ου χαρ. // try it now 8

Σύγκριση συμβολοσειρών: string str1 = Android ; string str2 = Androids ; bool _2gt1 = str1 < str2; // _2gt1 == true str1 = Android4.2 ; str2 = Android3.2 ; _2gt1 = str1 < str2; str1 = Andro ; str2 = Andras ; _2gt1 = str1 < str2; // _2gt1 == false Ο έλεγχος γίνεται λεξικογραφικά. Το αποτέλεσμα ισοδυναμεί με τη σύγκριση των πρώτων από αριστερά ανόμοιων χαρακτήρων // _2gt1 == false 9

Εύρεση sub-string: 2 16 string str1 = "I am a healthy camel"; string str2 = "am"; size_t pos = str1.find(str2); // pos == 2 pos = str1.find(str2, pos+1); // pos == 16 10

string to_string (int val); string to_string (long val); string to_string (long long val); string to_string (unsigned val); string to_string (unsigned long val); string to_string (unsigned long long val); string to_string (float val); string to_string (double val); string to_string (long double val); 11

int stoi (const string& str, size_t* idx = 0, int base = 10); long stol (const string& str, size_t* idx = 0, int base = 10); unsigned long stoul (const string& str, size_t* idx = 0, int base = 10); long long stoll (const string& str, size_t* idx = 0, int base = 10); unsigned long long stoull (const string& str, size_t* idx = 0, int base = 10); float stof (const string& str, size_t* idx = 0); double stod (const string& str, size_t* idx = 0); long double stold (const string& str, size_t* idx = 0); 12

Για να υποστηρίξουμε Ελληνικά σε οποιαδήποτε γλώσσα προγραμματισμού, έχουμε τις ακόλουθες επιλογές, ανάλογα και με το λειτουργικό σύστημα: «Ελληνική» κωδικοποίηση του (7-bit) ASCII, όπως για παράδειγμα η ISO8859-7 Χρήση Unicode κωδικοποίησης (8- και 16-bit): UTF-8, UTF-16 Στο Linux, υποστηρίζεται UTF-8 εγγενώς Χρήση wide characters (wchar_t). Στα Windows έχουμε 16- bit wide characters (UTF-16) ενώ στο Linux έχουμε 32-bit «μεγάλους» χαρακτήρες 13

Αν επιχειρήσουμε να τυπώσουμε Ελληνικό κείμενο απευθείας, θα τυπωθεί πιθανότατα σε λάθος κωδικοποίηση (χρησιμοποιείται η default κωδικοποίηση της C++ C ) Λύση 1: Αλλάζουμε την κωδικοποίηση σε Ελληνικό locale (με την προϋπόθεση ότι το System Locale είναι Ελληνικό!): string str2 = "Ελληνικά"; setlocale(lc_all,"greek"); cout << str2; 14

Λύση 2: Χρησιμοποιούμε μεγάλους χαρακτήρες (UTF16). Για τους μεγάλους χαρακτήρες (wchar_t αντί για char), υπάρχουν οι αντίστοιχες w (wide) δηλώσεις: wstring αντί για string wcout αντί για cout κλπ Τα σταθερά strings δηλώνονται λίγο διαφορετικό τρόπο: wstring mystring = L Καλημέρα ; 15

wstring str1 (L"Ελληνικά"); wcout << str1 << endl; _cputws(str1.c_str()); Δεν τυπώνονται σωστά τα Ελληνικά από την κλάση wstring στο output stream Χρήση της C συνάρτησης εξόδου του string: Σωστή κωδικοποίηση Διάβασμα από την κονσόλα: wchar_t buffer [100] = {97}; _cgetws(buffer); _cputws(buffer); wstring str2(buffer); Κατασκευάζουμε έναν πίνακα από wide characters Δηλώνουμε στην πρώτη θέση του πίνακα τον μέγιστο αριθμό χαρακτήρων που επιτρέπεται να διαβάσουμε Χρησιμοποιούμε την αντίστοιχη συνάρτηση εισόδου συμβολοσειρών μεγάλων χαρακτήρων της C 16

Σε όλες τις τυπικές εγκαταστάσεις Linux, χρησιμοποιείται κωδικοποίηση UTF8, οπότε δε χρειάζεται να χρησιμοποιηθεί wide string Εφόσον το αρχείο που έχουμε γράψει τον κώδικα ή το αρχείο από το οποίο διαβάζουμε συμβολοσειρές είναι σε κωδικοποίηση UTF8, τυπώνονται κανονικά οι χαρακτήρες 17

Η κλάση string είναι της C++ (η C δεν είναι αντικειμενοστρεφής) Όμως, η C παρέχει ένα μεγάλο εύρος συναρτήσεων για πίνακες χαρακτήρων Πολύ βασικές συναρτήσεις για μορφοποιημένη είσοδο και έξοδο συμβολοσειρών: printf, sprintf scanf, sscanf 18

Τυπώνει παραμετρικό μορφοποιημένο κείμενο Παίρνει ως είσοδο μια συμβολοσειρά μορφοποίησης και ένα πλήθος παραμέτρων που «κουμπώνουν» σε κατάλληλες θέσεις μέσα σε αυτή Παράδειγμα: int hits = 33; long total = 1000; printf( We scored %d out of %ld points.\nthis is %.2f%%.\n, Τυπώνει: hits, total, 100.f*hits/(float)total ); We scored 33 out of 1000 points. This is 3.30%. 19

Θέση 1 Θέση 2 Θέση 3 printf( We scored %d out of %ld points.\nthis is %.2f%%.\n, hits, total, 100.f*hits/(float)total ); Παράμετρος 1 Παράμετρος 2 Παράμετρος 3 % : δηλώνει ότι ακολουθεί εκτύπωση παραμέτρου %d : εκτυπώνει δεκαδικό αριθμό (decimal) %ld: εκτυπώνει «μεγάλο» δεκαδικό (long decimal) %f: εκτυπώνει float (και double) Πλήρης λίστα: http://www.cplusplus.com/reference/cstdio/printf/ %%: δηλώνει την εμφάνιση του χαρακτήρα % %.2f: Θέλουμε να εμφανίζει 2 δεκαδικά ψηφία 20

Διαβάζει μορφοποιημένα δεδομένα από το ρεύμα εισόδου και περνάει σε μεταβλητές τα ορίσματα που εμφανίζονται στις θέσεις που υποδεικνύουμε Είναι ουσιαστικά η αντίθετη της printf char name[80]; int age; int read = scanf ( name: %s, %d ",name, &age); Αν αποτύχει η ανάγνωση γιατί η συμβολοσειρά εισόδου δεν ταιριάζει στο μορφότυπο που δώσαμε, επιστρέφει αμέσως Η τιμή επιστροφής είναι ο αριθμός των παραμέτρων που διαβάστηκαν ορθά 21

#define STATUS_CODE_PARSING -1 #define STATUS_CODE_OK 0 int parsevec2(float *v, char * text) { if (!text) return STATUS_CODE_PARSING; if ( scanf(text, "\(%f%*[,\t]%f\)", &(v[0]), &(v[1])) < 2 ) return STATUS_CODE_PARSING; else return STATUS_CODE_OK; } 22

scanf(text, "\(%f%*[,\t]%f\)", &(v[0]), &(v[1])) \(, \) : Ειδικοί χαρακτήρες ( ) %f : διάβασμα αριθμού κινητής υποδιαστολής %* : διάβασε και αγνόησε (μην αποθηκεύσεις κάπου) την επόμενη τιμή %[ ] : διάβασε έναν ή περισσότερους από τους χαρακτήρες μέσα στις αγκύλες Ενδεικτικές έγκυρες είσοδοι: (0.04 1.3) (200, 40.45) ( 1.4 50) (-200, 50) 23

Χρήσιμες συναρτήσεις για μορφοποιημένη έξοδο και είσοδο σε/από πίνακες χαρακτήρων Χρήσιμες για εύκολη επεξεργασία συμβολοσειρών (π.χ. parsing γραμμών κειμένου από αρχεία) Έχουν ένα παραπάνω όρισμα (το πρώτο), τον πίνακα χαρακτήρων εισόδου ή εξόδου (δείτε τον οδηγό αναφοράς για περισσότερες πληροφορίες) 24