343 Ειςαγωγι ςτον Ρρογραμματιςμό Τμιμα Μακθματικϊν Ρανεπιςτιμιο Ιωαννίνων Ακαδθμαϊκό Ζτοσ 2017-2018 Χάρθσ Ραπαδόπουλοσ 207δ, B όροφοσ e-mail: charis@cs.uoi.gr Ωρεσ Γραφείου: Ρζμπτθ 11-13
Θ: διάλεξη (θεωρία) Ε: Εργαστήριο Ημερολόγιο Μακιματοσ Q: Σεστ quiz Οκτώβριος 2017 Δ Σ Σ Π Π 9 10 11 12 13 Θ 16 17 18 19 20 Θ 23 E 24 E 25 26 27 Θ 30 Ε 31 Ε Εβδομάδα Θζματα Ύλη βιβλιογραφίας Πα, 13 Οκτωβρίου Πα, 20 Οκτωβρίου Δε, Σρ, 23-24 Οκτ Πα, 27 Οκτωβρίου Εισαγωγικά μαθήματος & Δυαδική αναπαράσταση, Είσοδος/Έξοδος δεδομένων Σύποι δεδομένων & μεταβλητών, Αριθμητικοί & Λογικοί τελεστές, Ροή ελέγου if/else 1 ο Εργαστήριο Ροή επαναληπτικού ελέγχου: for, while, do-while [1]: 1.1, 2.1, Ραραρτιματα 2 & 3 [2+: Κεφ. 1, Β, Δ, 4.11, 4.12, Α, ΣΤ *1+: 1.2, 1.3, 1.4, 1.5, Ραράρτθμα 1 *2+: Κεφ. 2, Γ [1]: 2.2, 2.3 *2+: Κεφ. 4, Κεφ. 5 Νοέμβριος 2017 Δ Σ Σ Π Π 1 2 3 Θ 6 Ε 7 Ε 8 9 10 Θ 13 Q 14 15 16 17 20 21 22 23 24 Θ 27 Ε 28 Ε 29 30 Δεκέμβριος 2017 Δ Σ Σ Π Π 1 Θ 4 E 5 Ε 6 7 8 Θ 11 Q 12 13 14 15 Θ 18 E 19 20 21 22 Ιανουάριος 2018 Δ Σ Σ Π Π 1 2 3 4 5 8 9 10 11 12 Θ Δε, Σρ, 30-31 Οκτ Πα, 3 Νοεμβρίου Δε, Σρ, 6-7 Νοε Πα, 10 Νοεμβρίου Δε, 13 Νοε Πα, 24 Νοεμβρίου Δε, Σρ, 27-28 Νοε Πα, 1 Δεκεμβρίου Δε, Σρ, 4-5 Δεκ Πα, 8 Δεκεμβρίου Δε, 11 Δεκ Πα, 15 Δεκεμβρίου Δε, 18 Δεκ Πα, 12 Ιανουαρίου 2 ο Εργαστήριο υναρτήσεις, εμβέλεια μεταβλητών και αναδρομή 3 ο Εργαστήριο Επανάληψη με Παραδείγματα 1 ο Quiz Πίνακες (μονοδιάστατοι και πολυδιάστατοι) 4 ο Εργαστήριο Εφαρμογές σε ταξινομήσεις και αναζήτηση στοιχείων 5 ο Εργαστήριο Αλφαριθμητικά και υμβολοσειρές 2 ο Quiz Εγγραφές, δομές και χρήση αρχείων Προαιρετικό Εργαστήριο (χωρίς παρουσίες) Επανάληψη [1]: 3.1, 3.2, 3.3, 4.1, 4.2, 13.1, 13.2 *2+: Κεφ. 6 [1]: 5.1, 5.2, 5.4 *2+: Κεφ. 7 [1]: 5.1, 5.2, 5.4 *2+: Κεφ. 7 *1+: Ραράρτθμα 4, 9.1, 9.2, 9.3 *2+: 6.7, 6.8, Κεφ. 18 [1]: 6.1, 12.1, 12.2, 12.4 [2]: Κεφ. 21, 17.1-17.10 [1]: 5.3, 13.3 *2+: 7.7, 7.8, 8.6, Κεφ. 19
Θ: διάλεξη (θεωρία) Ε: Εργαστήριο Ημερολόγιο Μακιματοσ Q: Σεστ quiz Οκτώβριος 2017 Δ Σ Σ Π Π 9 10 11 12 13 Θ 16 17 18 19 20 Θ 23 E 24 E 25 26 27 Θ 30 Ε 31 Ε Εβδομάδα Θζματα Ύλη βιβλιογραφίας Πα, 13 Οκτωβρίου Πα, 20 Οκτωβρίου Δε, Σρ, 23-24 Οκτ Πα, 27 Οκτωβρίου Εισαγωγικά μαθήματος & Δυαδική αναπαράσταση, Είσοδος/Έξοδος δεδομένων Σύποι δεδομένων & μεταβλητών, Αριθμητικοί & Λογικοί τελεστές, Ροή ελέγου if/else 1 ο Εργαστήριο Ροή επαναληπτικού ελέγχου: for, while, do-while [1]: 1.1, 2.1, Ραραρτιματα 2 & 3 [2+: Κεφ. 1, Β, Δ, 4.11, 4.12, Α, ΣΤ *1+: 1.2, 1.3, 1.4, 1.5, Ραράρτθμα 1 *2+: Κεφ. 2, Γ [1]: 2.2, 2.3 *2+: Κεφ. 4, Κεφ. 5 Νοέμβριος 2017 Δ Σ Σ Π Π 1 2 3 Θ 6 Ε 7 Ε 8 9 10 Θ 13 Q 14 15 16 17 20 21 22 23 24 Θ 27 Ε 28 Ε 29 30 Δεκέμβριος 2017 Δ Σ Σ Π Π 1 Θ 4 E 5 Ε 6 7 8 Θ 11 Q 12 13 14 15 Θ 18 E 19 20 21 22 Ιανουάριος 2018 Δ Σ Σ Π Π 1 2 3 4 5 8 9 10 11 12 Θ Δε, Σρ, 30-31 Οκτ Πα, 3 Νοεμβρίου Δε, Σρ, 6-7 Νοε Πα, 10 Νοεμβρίου Δε, 13 Νοε Πα, 24 Νοεμβρίου Δε, Σρ, 27-28 Νοε Πα, 1 Δεκεμβρίου Δε, Σρ, 4-5 Δεκ Πα, 8 Δεκεμβρίου Δε, 11 Δεκ Πα, 15 Δεκεμβρίου Δε, 18 Δεκ Πα, 12 Ιανουαρίου 2 ο Εργαστήριο υναρτήσεις, εμβέλεια μεταβλητών και αναδρομή 3 ο Εργαστήριο Επανάληψη με Παραδείγματα 1 ο Quiz Πίνακες (μονοδιάστατοι και πολυδιάστατοι) 4 ο Εργαστήριο Εφαρμογές σε ταξινομήσεις και αναζήτηση στοιχείων 5 ο Εργαστήριο Αλφαριθμητικά και υμβολοσειρές 2 ο Quiz Εγγραφές, δομές και χρήση αρχείων Προαιρετικό Εργαστήριο (χωρίς παρουσίες) Επανάληψη [1]: 3.1, 3.2, 3.3, 4.1, 4.2, 13.1, 13.2 *2+: Κεφ. 6 [1]: 5.1, 5.2, 5.4 *2+: Κεφ. 7 [1]: 5.1, 5.2, 5.4 *2+: Κεφ. 7 *1+: Ραράρτθμα 4, 9.1, 9.2, 9.3 *2+: 6.7, 6.8, Κεφ. 18 [1]: 6.1, 12.1, 12.2, 12.4 [2]: Κεφ. 21, 17.1-17.10 [1]: 5.3, 13.3 *2+: 7.7, 7.8, 8.6, Κεφ. 19
Ενότθτα 20 ΑΛΦΑΡΙΘΜΗΣΙΚΑ (C-STRING) 9-4
Αλφαρικμθτικά και Συμβολοςειρζσ Δφο ειδϊν ςυμβολοςειρζσ: C-string: πίνακασ από χαρακτιρεσ (char) το τζλοσ τθσ ςυμβολοςειράσ μαρκάρεται με το ςφμβολο '\0' κλαςικόσ τρόποσ και ςτθν απλι C χρθςιμοποιεί ζτοιμεσ βιβλιοκικεσ Η τυποποιθμζνθ κλάςθ string: χρθςιμοποιεί ζτοιμεσ βιβλιοκικεσ με περιςςότερεσ δυνατότθτεσ 9-5
C-string Ρίνακεσ από χαρακτιρεσ (τφπου char) Ζνασ χαρακτιρασ για κάκε μεταβλθτι τφπου char Ζνασ επιπλζον χαρακτιρασ '\0' (κάθετος μηδζν) καλείται null χαρακτιρασ ςθματοδοτεί το τζλοσ τθσ ςυμβολοςειράσ Ζχουμε ιδθ χρθςιμοποιιςει C-string Η φράςθ "Γεια" αποκθκεφεται ςε ζνα C-string s: char s[10] = "Γεια"; 9-6
C-string μεταβλθτι Ρίνακασ από χαρακτιρεσ: char s[10]; Δθλϊνει μια C-string μεταβλθτι για να αποκθκεφςει μζχρι 9 χαρακτιρεσ + ζναν null χαρακτιρα Τυπικά είναι "μερικϊσ ςυμπλθρωμζνοσ" πίνακασ Δθλϊνουμε αρκετά μεγάλο μζγεκοσ για να αποκθκεφςουμε μζχρι το μζγιςτο μικοσ ςυμβολοςειράσ Σθματοδοτοφμε το τζλοσ με null Η μοναδικι διαφορά με τουσ κλαςικοφσ πίνακεσ: Ρρζπει να περιζχουν null χαρακτιρεσ 9-7
Ζνασ κλαςικόσ πίνακασ: char s[10]; Αποκικευςθ C-string Αν το s περιζχει τθν ςυμβολοςειρά " Hi Mom!", αποκθκεφεται ωσ: 9-8
Αρχικοποίθςθ Αρχικοποίθςθ C-string: char mymessage[20] = "Hi there."; Δεν χρειάηεται να γεμίςουμε ολόκλθρο τον πίνακα Η αρχικοποίθςθ τοποκετεί το '\0' ςτο τζλοσ (αυτόματα) Μποροφμε να αποφφγουμε το μζγεκοσ του πίνακα: char shortstring[] = "abc"; Αυτόματα μετατρζπει το μζγεκοσ +1 από το μζγεκοσ τθσ ςυμβολοςειράσ μζςα ςε " " ΔΕΝ είναι το ίδιο με: char shortstring[] = {'a', 'b', 'c'}; 9-9
Δείκτεσ ςε C-string Ζνα C-string ΕΙΝΑΙ ζνασ πίνακασ Ρρόςβαςθ ςτισ δεικτοδοτοφμενεσ μεταβλθτζσ: char ourstring[5] = "Hi"; ourstring[0] είναι 'H' ourstring[1] είναι 'i' ourstring[2] είναι '\0' ourstring[3] είναι άγνωςτο ourstring[4] είναι άγνωςτο 9-10
Χειριςμόσ δεικτϊν C-string Μποροφμε να χειριςτοφμε δεικτοδοτοφμενεσ μεταβλθτζσ char happystring[7] = "DoBeDo"; happystring[6] = 'Z'; Θζλει προςοχι!! Εδϊ, το '\0' (null) αντικαταςτάκθκε από ζνα 'Z'! Αν το null αντικακίςταται, τότε το C-string δεν "ςυμπεριφζρεται" ωσ C-string! Άγνωςτα αποτελζςματα! 9-11
char outstring[5] = "Γεια"; int index = 0; Ραραδείγματα while( outstring[index]!= '\0' ) { outstring[index] = 'A'; index++; } char outstring[5] = "Γεια"; int index = 0; προκακοριςμζνθ ςτακερά ίςθ με το μζγιςτο μζγεκοσ του πίνακα while( (outstring[index]!= '\0') && (index < SIZE) ) { outstring[index] = 'A'; index++; } 9-12
Διλωςθ C-strings Βιβλιοκικεσ Δεν απαιτεί κάποια C++ βιβλιοκικθ Υπάρχει ςτθν standard C++ Χειριςμοί: Απαιτεί τθν βιβλιοκικθ <cstring> #include <cstring> Συνικωσ τθν καλοφμε όταν χρθςιμοποιοφμε C-strings Πταν κζλουμε να τισ χειριςτοφμε με μεγάλθ ευκολία 9-13
"=" και "==" με C-strings Τα C-strings δεν λειτουργοφν όπωσ άλλεσ μεταβλθτζσ Δεν μποροφμε να ανακζςουμε ι να ςυγκρίνουμε: char astring[10]; astring = "Hello"; Χριςθ του "=" ΜΟΝΟ ςτθ διλωςθ του C-string! Ρρζπει να χρθςιμοποιιςουμε ςυναρτιςεισ από βιβλιοκικεσ για ανάκεςθ: char astring[10]; strcpy(astring, "Hello"); // ΛΑΘΟΣ!! strcpy: Συνάρτθςθ ςτθ βιβλιοκικθ <cstring> Θζτει τθν τιμι του astring ίςθ με "Hello" ΔΕΝ ελζγχει για μζγεκοσ! Ο ζλεγχοσ γίνεται από τον προγραμματιςτι, όπωσ ςτουσ υπόλοιπουσ πίνακεσ! 9-14
Σφγκριςθ C-strings Επίςθσ δεν μποροφμε να κάνουμε χριςθ του τελεςτι == char astring[10] = "Hello"; char anotherstring[10] = "Goodbye"; if( astring == anotherstring ) // NOT allowed! {... } Ρρζπει να κάνουμε χριςθ ςυνάρτθςθσ: char astring[10] = "Hello"; char anotherstring[10] = "Goodbye"; if ( strcmp(astring, anotherstring) ) cout << "Strings NOT same."; else cout << "Strings are same."; 9-15
Η βιβλιοκικθ <cstring> (1/2) 9-16
Η βιβλιοκικθ <cstring> (2/2) 9-17
Η ςυνάρτθςθ strlen() Επιςτρζφει το μικοσ τθσ ςυμβολοςειράσ Είναι ςυχνά χριςιμο να γνωρίηουμε το μζγεκοσ: και για να μθν ξεφεφγουμε από τα όρια του πίνακα char mystring[10] = "dobedo"; cout << strlen(mystring); Επιςτρζφει το πλικοσ των χαρακτιρων Χωρίσ να περιζχει τον null ('\0') χαρακτιρα Το πάνω αποτζλεςμα κα είναι: 6 9-18
strcat(s1,s2) Η ςυνάρτθςθ strcat() ςυνενϊνει τθν ςυμβολοςειρά s2 ςτο τζλοσ τθσ s1 char stringvar[20] = "The rain"; strcat(stringvar, "in Spain"); Στο αποτζλεςμα: θ stringvar τϊρα κα είναι "The rainin Spain" Χρειάηεται προςοχι: Χριςθ των κενϊν! Δεν επιβεβαιϊνει αν θ s1 είναι αρκετά μεγάλθ για να δεχκεί τθν s2 9-19
Ραράμετροι και Ορίςματα των C-strings Θυμθκείτε: το C-string είναι πίνακασ Επομζνωσ ωσ παράμετροσ C-string είναι παράμετροσ πίνακα Τα C-strings που περνάμε ςτισ ςυναρτιςεισ μποροφν να αλλάξουν τιμι (παράμετροι με αναφορά)! Ππωσ ςτουσ πίνακεσ, ςυνικωσ ςτζλνουμε και το μζγεκοσ του πίνακα Η ςυν/ςθ "μπορεί" να κάνει χριςθ του '\0' για να βρει το τζλοσ Δθλαδι το μζγεκοσ δεν είναι απαραίτθτο αν θ ςυνάρτθςθ δεν αλλάηει τθν παράμετρο C-string Χριςθ του "const" για προςταςία των οριςμάτων C-string 9-20
Ραραδείγματα Ροια είναι ιςοδφναμα μεταξφ τουσ; char stringvar[10] = "Γεια"; char stringvar[10] = {'Γ', 'ε', 'ι', 'α', '\0'}; char stringvar[10] = {'Γ', 'ε', 'ι', 'α'}; char stringvar[5] = "Γεια"; char stringvar[] = "Γεια"; Υπάρχει κάποιο λάκοσ; char stringvar[] = "Γεια"; strcat(stringvar," και ανηίο."); cout << stringvar ; Ροιο είναι το αποτζλεςμα: char song[10] = "I did it "; char fsong[20]; strcpy(fsong,song); strcat(fsong,"my way!"); cout << fsong << endl ; 9-21
Ενότθτα 21 ΕΙΟΔΟ/ΕΞΟΔΟ ΜΕ ΑΛΦΑΡΙΘΜΗΣΙΚΑ (C-STRING) 9-22
Ζξοδοσ με C-string Μποροφμε να τα εκτυπϊςουμε με τον τελεςτι ειςαγωγισ << Ήδθ το χρθςιμοποιοφμε: cout << news << " Γεια.\n"; Ππου news είναι μια μεταβλθτι C-string Ρροςοχι ςτον τελεςτι << : ςαν να ςυνενϊνουμε C-strings! 9-23
Είςοδοσ με C-string Μποροφμε να ειςάγουμε με τον τελεςτι εξαγωγισ >> Ωςτόςο υπάρχουν οριςμζνα κζματα Το κενό " " κεωρείται ωσ "τζλοσ διαβάςματοσ" Στθλοκζτθσ, κενό, ειςαγωγι γραμμισ: "παραλείπονται" Το διάβαςμα ςτθν είςοδο ςταματά ςτο "τζλοσ διαβάςματοσ" Ρροςοχι ςτο μζγεκοσ του C-string Ρρζπει να είναι μεγάλο ϊςτε να μπορεί να αποκθκεφςει τθν ςυμβολοςειρά που ειςάγεται! Η C++ δεν δίνει κάποια "προειδοποίθςθ" ςε τζτοια κζματα! 9-24
Ραράδειγμα ειςαγωγισ char a[80], b[80]; cout << "Δώζηε κάποια είζοδο: \n"; cin >> a >> b; cout << a << b << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n"; Παράδειγμα Δώζηε κάποια είζοδο: Γεια και ταρά ζοσ! ΓειακαιΤΕΛΟΣ ΕΙΣΟΔΟΥ! Η C-string a αποκθκεφει: "Γεια" Η C-string b αποκθκεφει: "και" 9-25
Διάβαςμα ολόκλθρθσ γραμμισ Μποροφμε να αποκθκεφςουμε ολόκλθρθ γραμμι (με κενά) ςε ζνα C-string Χριςθ του getline(): μια προκακοριςμζνθ ςυνάρτθςθ ςτθν κλάςθ cin το δεφτερο όριςμα : μζγιςτο αρικμό χαρακτιρων που κα διαβάςει char a[80]; cout << "Δώζηε κάποια είζοδο: \n"; cin.getline(a, 80); cout << a << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n"; Παράδειγμα1 Δώζηε κάποια είζοδο: Γεια και ταρά ζοσ! Γεια και ταρά ζοσ!τελοσ ΕΙΣΟΔΟΥ! 9-26
Ρεριςςότερα για τθν getline() Μπορεί να αναφζρει το πλικοσ των χαρακτιρων που κζλει να διαβάςει: char a[5]; cout << "Δώζηε κάποια είζοδο: \n"; cin.getline(a, 5); cout << a << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n"; Παράδειγμα2 Δώζηε κάποια είζοδο: Γειαταρά ΓειαΤΕΛΟΣ ΕΙΣΟΔΟΥ! Αναγκάηει ΤΕΣΣΕΙΣ χαρακτιρεσ μόνο να διαβάςει Θυμθκείτε τθν ανάγκθ για τον null ('\0') χαρακτιρα! 9-27
Ραραδείγματα char a[80], b[80]; cout << "Δώζηε κάποια είζοδο: \n"; cin >> a >> b; cout << a << b << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n"; Παράδειγμα1 Δώζηε κάποια είζοδο: Έθηαζε η ώρα!????????????????????????? char mystring[80]; cout << "Δώζηε κάποια είζοδο: \n"; cin.getline(mystring,6); cout << mystring << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n"; Παράδειγμα2 Δώζηε κάποια είζοδο: Όζα δε θέρνει ο τρόνος,????????????????????????? 9-28
Ενότθτα 22 ΧΕΙΡΙΜΟΙ ΧΑΡΑΚΣΗΡΩΝ 9-29
Χαρακτιρεσ Ε/Ε Είςοδοσ και Ζξοδοσ δεδομζνων ΟΛΑ τα χειριηόμαςτε ωσ δεδομζνα χαρακτιρων π.χ., ο αρικμόσ 10 εκτυπϊνεται ωσ '1' και '0' Η μετατροπι γίνεται αυτόματα Χρθςιμοποιεί χαμθλοφ-επιπζδου χαρακτθριςτικά Μποροφμε να χρθςιμοποιιςουμε χαμθλοφεπιπζδου ςτοιχεία 9-30
Η ςυνάρτθςθ get() Διαβάηει ζναν χαρακτιρα (char) τθ φορά Είναι ςυνάρτθςθ του αντικειμζνου cin: char nextsymbol; cin.get(nextsymbol); Διαβάηει τον επόμενο χαρακτιρα και τον ανακζτει ςτθ μεταβλθτι nextsymbol Το όριςμα πρζπει να είναι τφπου char ΠΧΙ "ςυμβολοςειρά"! 9-31
Η ςυνάρτθςθ put() Εκτυπϊνει ζναν χαρακτιρα τθ φορά Ανικει ςτο αντικείμενο cout : cout.put('a'); Εκτυπϊνει το γράμμα "a" char mystring[10] = "Hello"; cout.put(mystring[1]); Εκτυπϊνει το γράμμα "e" 9-32
Ραράδειγμα (1/2) cout << "Δώζηε μια γραμμή ειζόδου: \n"; char symbol; do { cin.get(symbol); cout << symbol; } while( symbol!= '\n'); Παράδειγμα Δώζηε μια γραμμή ειζόδοσ: Τρα λα λα 1 2 22 Τρα λα λα 1 2 22 9-33
#include <iostream> using namespace std; void newline( ); void getint(int& number); int main( ) { int n; } getint(n); cout << n "; return 0; Παράδειγμα Εnter input: 57 57 correct? (yes/no): no no! Εnter input: 75 75 correct? (yes/no): yes 75 Ραράδειγμα (2/2) void newline( ) { char symbol; do { cin.get(symbol); } while (symbol!= '\n'); } void getint(int& number) { char ans; do { cout << "Enter input: "; cin >> number; cout <<number<<" correct? (yes/no):"; cin >> ans; newline( ); } while ((ans == 'N') (ans == 'n')); } 9-34
Ρεριςςότερεσ ςυν/ςεισ χαρακτιρων putback() Πταν διαβάηει τοποκετεί πάλι τον χαρακτιρα ςτθν είςοδο cin.putback(lastchar); peek() Επιςτρζφει τον επόμενο χαρακτιρα που κα διαβαςτεί, αλλά τον αφινει ςτθν είςοδο peekchar = cin.peek(); ignore() Ραράλειψθ τθσ ειςόδου, μζχρι ζναν ςυγκεκριμζνο χαρακτιρα cin.ignore(1000, "\n"); Ραραλείπει το πολφ 1000 χαρακτιρεσ μζχρι "\n" 9-35
Συναρτιςεισ χειριςμοφ χαρακτιρων (1/3) Βρίςκονται ςτθν βιβλιοκικθ cctype: #include <cctype> 9-36
Συναρτιςεισ χειριςμοφ χαρακτιρων (2/3) 9-37
Συναρτιςεισ χειριςμοφ χαρακτιρων (3/3) 9-38
Ραραδείγματα char next; do { cin.get(next); if( isspace(next) ) cout << '-'; else cout << next; } while( next!= '.'); Παράδειγμα Εεεεε γεια και ταρά ζας. Εεεεε--γεια-και-ταρά-ζας. char next; do { cin.get(next); cout << next; } while(!isdigit(next) && (next!='\n') ); Παράδειγμα Θα ζε δω ζηις 10:30μμ.????????????????????????? char next; do { cin.get(next); if(!isupper(next) ) cout << next; } while( next!= '\n'); 9-39
Ενότθτα 23 Η ΚΛΑΗ STRING 9-40
Η κλαςικι string ςτθ C++ Ορίηεται ςτθ βιβλιοκικθ: #include <string> using namespace std; Μεταβλθτζσ τφπου String και εκφράςεισ Ππωσ οι απλοί τφποι μεταβλθτϊν Μπορεί να ανακζτει, να ςυγκρίνει, να προςκζτει: string s1, s2, s3; s3 = s1 + s2; //ςυνζνωςθ s3 = "Hello Mom!" //ανάκεςθ Σθμειϊςτε ότι το C-string "Hello Mom!" μετατρζπεται αυτόματα ςε τφπου string! 9-41
#include <iostream> #include <string> using namespace std; int main( ) { string phrase; Ραράδειγμα Αρχικοποιείται ςτο κενό αλφαρικμθτικό string adjective("ηηγανιηά"), noun("μυρμήγκια"); string wish = "Bon appetite!"; Δφο ιςδφναμοι τρόποι για απόδοςθ αρχικϊν τιμϊν phrase = "Μ αρέζοουν " + adjective + " " + noun + "!"; cout << phrase << endl << wish << endl; } return 0; Παράδειγμα Μ' αρέζοσν ηα ηηγανιηά μσρμήγκια! Bon appetite! 9-42
Ε/Ε με τθν κλάςθ String Ακριβϊσ όπωσ και ςε άλλουσ τφπουσ! string s1, s2; cin >> s1; cin >> s2; Αποτζλεςμα: Ο χριςτθσ πλθκτρολογεί: May the hair on your toes grow long and curly! Η εξαγωγι ακόμα παραβλζπει κενά: s1 ζχει τιμι "May" s2 ζχει τιμι "the" 9-43
getline() με τθν κλάςθ String Για ολόκλθρεσ γραμμζσ: string line; cout << "Enter a line of input: "; getline(cin, line); cout << line << "END OF OUTPUT"; Παράδειγμα Enter a line of input: Γεια και ταρά ζοσ!! Γεια και ταρά ζοσ!!end OF OUTPUT Ακριβϊσ όπωσ θ getline() του C-string 9-44
Άλλεσ εκδόςεισ τθσ getline() Μποροφμε να ορίςουμε χαρακτιρα τζλουσ: string line; cout << "Enter input: "; getline(cin, line, "?"); Διαβάηει τθν είςοδο μζχρι να εμφανιςτεί το "?" 9-45
Ρροςοχι ςτον ςυνδυαςμό Ρροςοχι όταν αναμειγνφουμε cin >> var και getline() int n; string line; cin >> n; getline(cin, line); Αν θ είςοδοσ είναι: 42 Hello hitchhiker. Η μεταβλθτι n ζχει τιμι 42 Η line είναι θ κενι ςυμβολοςειρά!!!!! cin >> n παραλείπει κενοφσ χαρακτιρεσ, αφινοντασ τον χαρακτιρα "\n" ςτθν είςοδο για τθν getline()! 9-46
Επεξεργαςία μεταβλθτϊν τφπου string Κδιεσ λειτουργίεσ με τισ C-strings και παραπάνω! Ρεριςςότερεσ από 100 ςυναρτιςεισ τθσ κλάςθσ string Οριςμζνεσ ςυναρτιςεισ:.length() επιςτρζφει το μικοσ τθσ ςυμβολοςειράσ.at(i) επιςτρζφει αναφορά ςτον χαρακτιρα τθσ κζςθσ i 9-47
Συναρτιςεισ τθσ κλάςθσ string (1/2) 9-48
Συναρτιςεισ τθσ κλάςθσ string (2/2) 9-49
Μετατροπι από C-string ςε string Αυτόματεσ μετατροπζσ τφπων Από C-string ςε string : char acstring[] = "My C-string"; string stringvar; stringvar = acstring; Ζγκυρο και κατάλλθλο!! acstring = stringvar; ΜΗ ΝΟΜΙΜΟ! Δεν μπορεί να μετατραπεί αυτόματα ςε C-string Ρρζπει να κάνουμε χριςθ μετατροπϊν: strcpy(acstring, stringvar.c_str()); 9-50
Σφνοψθ Η μεταβλθτι C-string είναι "πίνακασ από χαρακτιρεσ" Με επιπλζον τον κενό χαρακτιρα '\0' Τα C-strings ςυμπεριφζρονται όπωσ οι πίνακεσ Δεν μποροφν να ανακζςουν, να ςυγκρίνουν όπωσ οι απλζσ μεταβλθτζσ Οι βιβλιοκικεσ <cctype> & <string> ζχουν χριςιμεσ ςυν/ςεισ χειριςμοφ cin.get() διαβάηει τον επόμενο χαρακτιρα getline() επιτρζπουν διάβαςμα ολόκλθρθσ γραμμισ Τα αντικείμενα string ςυμπεριφζρονται καλφτερα από τα απλά C-strings 9-51
Ενότθτα 24 ΔΟΜΕ 10-52
Δομζσ 2 θ ομαδοποιθμζνθ δομι δεδομζνων: struct Θυμίηουμε: "ομαδοποίθςθ" Ρίνακεσ: ςυλλογι από τιμζσ ίδιου τφπου Δομι: ςυλλογι από τιμζσ διαφορετικϊν τφπων Τισ χειριηόμαςτε ωσ ζνα αντικείμενο, όπωσ τουσ πίνακεσ Βαςικι διαφορά: Ρρζπει πρϊτα να "ορίςουμε" τθν δομι Ρριν από τθν διλωςθ οποιαςδιποτε μεταβλθτισ 10-53
Τφποι δομϊν Ορίηουμε τθν δομι κακολικά (ςυνικωσ) Δεν δεςμεφουμε μνιμθ Απλά δίνουμε ζναν "τφπο" για το πϊσ θ δομι κα μοιάηει Οριςμόσ: struct CDAccountV1 { double balance; double interestrate; int term; }; όνομα τθσ νζασ δομισ (ετικζτα) ονόματα για τα μζλθ 10-54
Διλωςθ μεταβλθτϊν δομισ struct CDAccountV1 { double balance; double interestrate; int term; }; Με τον οριςμό τθσ δομισ μποροφμε τϊρα να ορίςουμε νζεσ μεταβλθτζσ αυτοφ του τφπου: CDAccountV1 account; Ακριβϊσ όπωσ δθλϊνουμε για απλοφσ τφπουσ Η μεταβλθτι account τϊρα είναι τφπου CDAccountV1 Ρεριζχει "τιμζσ για τα μζλθ" Για κάκε "τμιμα" τθσ δομισ 10-55
Ρρόςβαςθ ςτα μζλθ τθσ δομισ Ο τελεςτισ τελεία. ζχει πρόςβαςθ ςτα μζλθ: account.balance account.interestrate account.term struct CDAccountV1 { double balance; double interestrate; int term; }; CDAccountV1 account; Καλοφνται "μεταβλθτζσ για τα μζλθ" Τα "τμιματα" τθσ μεταβλθτισ δομισ Διαφορετικζσ δομζσ μποροφν να ζχουν το ίδιο όνομα για τισ μεταβλθτζσ για τα μζλθ Δεν ζχουμε ςφγκρουςθ 10-56
#include <iostream> using namespace std; struct CDAccountV1 { double balance; double interestrate; int term; }; } void getdata(cdaccountv1& theaccount); int main( ) { CDAccountV1 account; getdata(account); void getdata(cdaccountv1& theaccount) { cout << "Δώζε λογαριαζμό: "; cin >> theaccount.balance; cout << "Δώζε επιηόκιο "; cin >> theaccount.interestrate; cout << "Δώζε αριθμό μηνών"; cin >> theaccount.term; } double ratefraction, interest; ratefraction = account.interestrate/100.0; interest = account.balance*(ratefraction*(account.term/12.0)); account.balance = account.balance + interest; cout << "When your CD matures in " << account.term << " months,\n" << "it will have a balance of $" << account.balance << endl; 10-57
Ραραδείγματα struct StudentRecord { int studentnumber; char grade; }; int main() { StudentRecord yourrecord; yourrecord.studentnumber = 10002; yourrecord.grade = 'A'; } struct Automobile { int year; int doors; double horsepower; char model[30]; }; int main() { Automobile my; my.year = 2004; my.doors = 2; my.horsepower = 122; strcpy(my.model,"mini"); } 10-58
Ραράλειψθ ερωτθματικοφ ςτο τζλοσ Δεν επιτρζπεται θ παράλειψθ ερωτθματικοφ ςτο τζλοσ struct WeatherData { double temperature; double windvelocity; }; Είναι απαραίτθτο γιατί μπορείτε να δθλϊςετε μεταβλθτζσ δομισ ςτο ςθμείο αυτό struct WeatherData { double temperature; double windvelocity; } high, low; 10-59
Χριςθ ιεραρχικϊν δομϊν struct Date { int day; int month; int year; }; struct PersonInfo { double height; double weight; Date birthdate; }; Δομζσ που μπορεί τα μζλθ να είναι μικρότερεσ δομζσ Ζχει ςθμαςία θ ςειρά που δθλϊνουμε τισ δομζσ πρϊτα δθλϊνεται θ μικρότερθ δομι Αν ζχουμε μια μεταβλθτι: PersonInfo person1; Τότε εμφανίηουμε ςτθν ζξοδο: cout << person1.birthdate.day; 10-60
Οι δομζσ ςε ορίςματα ςε ςυναρτιςεισ Τα περνάμε όπωσ τα απλά δεδομζνα Ραράμετροσ με τιμι Ραράμετροσ με αναφορά Ή ςυνδυαςμόσ Μποροφν επίςθσ να είναι ο επιςτρεφόμενοσ τφποσ μιασ ςυνάρτθςθσ Επιςτρεφόμενοσ Τφποσ είναι μια δομι Η εντολι return ςτον οριςμό τθσ ςυνάρτθςθσ ςτζλνει μια μεταβλθτι δομισ ςε αυτόν που τθν κάλεςε 10-61
Απόδοςθ αρχικϊν τιμϊν ςε δομζσ Μποροφν να αρχικοποιθκοφν κατά τθ διλωςθ struct Date { int day; int month; int year; }; Date duedate = {12, 31, 2003}; Η διλωςθ παρζχει αρχικά δεδομζνα ςε όλα τα τρία μζλθ τθσ δομισ 10-62
Ραραδείγματα struct Shoetype { char style; double price; }; Shoetype shoe1, shoe2; shoe1.style = 'A'; shoe1.price = 9.99; cout << shoe1.style << shoe1.price << endl; shoe2 = shoe1; shoe2.price = shoe2.price / 9; cout << shoe2.style << shoe2.price << endl; Shoetype discount(shoetype oldshoe) { Shoetype temp; temp.style = oldshoe.style; temp.price = 0.9 * oldshoe.price; return temp; } void readshoetype(shoetype& newshoe1) { cout << "Δώζε ζηυλ:"; cin >> newshoe1.style; cout << "Δώζε ηιμή:"; cin >> newshoe1.price; } 10-63
Ενότθτα 25 ΧΡΗΗ ΑΡΧΕΙΩΝ 10-64
οζσ (streams) Τυπικά: διαβάηουμε δεδομζνα από το πλθκτρολόγιο και εκτυπϊνουμε ςε ζνα τερματικό παράκυρο. Ωςτόςο: Μποροφμε να διαβάηουμε από αρχεία Μποροφμε να εκτυπϊνουμε ςε αρχεία Stream: Μια ροι από χαρακτιρεσ οι ειςόδου (Input stream) Μπορεί να ζρκει από το πλθκτρολόγιο Μπορεί να ζρκει από αρχείο οι εξόδου (Output stream) Μπορεί να ςταλκεί ςτθν οκόνθ Μπορεί να ςταλκεί ςε αρχείο 10-65
Ήδθ χρθςιμοποιοφμε ροζσ cin cout Χριςθ οϊν Η ροι ειςόδου ενϊνεται με το πλθκτρολόγιο Η ροι εξόδου ενϊνεται με τθν οκόνθ Μποροφμε να ορίςουμε άλλεσ ροζσ Από ι προσ αρχεία Ραρόμοια χριςθ όπωσ με τα cin, cout 10-66
Θεωρείςτε: Χριςθ ροϊν όπωσ με cin, cout Το πρόγραμμα ορίηει μια ροι (stream) instream που ζρχεται από κάποιο αρχείο: int thenumber; instream >> thenumber; Διαβάηει τιμι από τθν ροι stream, και τθν ανακζτει ςτο thenumber Το πρόγραμμα ορίηει μια ροι (stream) outstream που ςτζλνεται ςε κάποιο αρχείο outstream << "thenumber is " << thenumber; Γράφει τθν τιμι ςτθ ροι stream, που πάει ςε κάποιο αρχείο 10-67
Αρχεία Θα χρθςιμοποιιςουμε αρχεία text Διάβαςμα από αρχείο Πταν το πρόγραμμα δζχεται κάποια είςοδο Εγγραφι ςε αρχείο Πταν το πρόγραμμα ςτζλνει κάποια ζξοδο Ξεκινάει από τθν αρχι του αρχείου και καταλιγει προσ το τζλοσ του αρχείου Υπάρχουν και άλλοι τρόποι Θα επεκτακοφμε ςτο τζλοσ ςε άλλουσ τρόπουσ προςπζλαςθσ 10-68
Σφνδεςθ με αρχείο Ρρϊτα πρζπει να ςυνδζςουμε το αρχείο με μια ροή Για είςοδο: Αρχείο ifstream αντικείμενο Για ζξοδο: Αρχζιο ofstream αντικείμενο Οι κλάςεισ ifstream και ofstream Ορίηονται ςτθ βιβλιοκικθ <fstream> #include <fstream> 10-69
Βιβλιοκικεσ αρχείων Ε/Ε Για να επιτρζψουμε τόςο για είςοδο από αρχείο όςο και για ζξοδο ςε αρχείο : #include <fstream> using namespace std; ι #include <fstream> using std::ifstream; using std::ofstream; 10-70
Διλωςθ ροϊν Η ροι πρζπει πρϊτα να δθλωκεί όπωσ μια τυπικι μεταβλθτι: ifstream instream; ofstream outstream; Μετά πρζπει να ςυνδεκεί με το αρχείο: instream.open("infile.txt"); Καλείται "άνοιγμα αρχείου" Χρθςιμοποιεί τθν ςυνάρτθςθ open Μποροφμε να ορίςουμε τθν ακριβι διαδρομι του αρχείου 10-71
Χριςθ οϊν Μόλισ δθλωκεί χρθςιμοποιείται κανονικά! int onenumber, anothernumber; instream >> onenumber >> anothernumber; Η ροι εξόδου γίνεται παρόμοια: ofstream outstream; outstream.open("outfile.txt"); outstream << "onenumber = " << onenumber << " anothernumber = " << anothernumber; Στζλνει τα αντικείμενα ςτο αρχείο εξόδου "outfile.txt" 10-72
Ονοματολογία αρχείων Ρρογράμματα και αρχεία Τα αρχεία ζχουν δφο ονόματα ςτα προγράμματά μασ Εξωτερικό όνομα αρχείου Επίςθσ καλείται "φυςικό όνομα" Ππωσ το "infile.txt" Μερικζσ φορζσ λζγεται και "πραγματικό όνομα" Χρθςιμοποιείται μόνο μια φορά (ςτο άνοιγμα/ςφνδεςθ) Πνομα ροισ Καλείται επίςθσ και "λογικό όνομα" instream.open("infile.txt"); Το πρόγραμμα χρθςιμοποιεί το όνομα αυτό για όλα τα αρχεία που επεξεργάηεται ifstream instream; ofstream outstream; 10-73
Κλείςιμο αρχείων Τα αρχεία που ανοίγουν πρζπει να κλείνουν Πταν το πρόγραμμα ςταματάει να δζχεται είςοδο ι να ςτζλνει ςτθν ζξοδο Απελευκερϊνει τθ ροι από το αρχείο ifstream instream; ofstream outstream; instream.close(); outstream.close(); Δεν παίρνουν ορίςματα Τα αρχεία κλείνουν αυτόματα όταν το πρόγραμμα τερματίηει Ωςτόςο πρζπει εμείσ να τα κλείνουμε για να αποφεφγουμε λάκθ εγγραφισ/ανάγνωςθσ 10-74
Η ςυνάρτθςθ flush() Η ζξοδοσ ςυνικωσ "ενταμιεφεται (buffered)" αποκθκεφεται προςωρινά πριν τθν εγγραφι τθσ ςε αρχείο Η εγγραφι γίνεται ςε "ομάδεσ" Συχνά μπορεί να κζλουμε να εξαναγκάςουμε τθν εγγραφι: outstream.flush(); Η ςυνάρτθςθ flush, για όλεσ τισ ροζσ εξόδου Πλα τα δεδομζνα εξόδου (buffered) γράφονται Πταν κλείνουμε το αρχείο τότε καλείται αυτόματα θ ςυνάρτθςθ flush() 10-75
#include <fstream> using namespace std; int main( ) { ifstream instream; ofstream outstream; instream.open("infile.txt"); outstream.open("outfile.txt"); infile.txt 1 2 3 4 outfile.txt The sum of the first 3 numbers in infile.txt is 6 } int first, second, third; instream >> first >> second >> third; outstream << "The sum of the first 3\n" << "numbers in infile.txt\n" << "is " << (first + second + third) << endl; instream.close( ); outstream.close( ); return 0; 10-76
Ρροςάρτθςθ ςε αρχείο Ο τυπικόσ τρόποσ που ανοίγουμε αρχείο ξεκινάνει με κενό αρχείο Ακόμα και όταν το αρχείο υπάρχει ιδθ τα δεδομζνα χάνονται Άνοιγμα για προςάρτθςθ: ofstream outstream; outstream.open("important.txt", ios::app); Αν το αρχείο δεν υπάρχει το δθμιουργεί Αν το αρχείο υπάρχει προςαρτά ςτο τζλοσ το 2 ο όριςμα είναι θ κλάςθ ios που ορίηεται ωσ ςτακερά ςτθ βιβλιοκικθ <iostream>, std namespace 10-77
Εναλλακτικόσ τρόποσ για άνοιγμα αρχείου Μποροφμε να δθλϊςουμε το όνομα του αρχείου ςτθ διλωςθ Το περνάμε ωσ ζνα όριςμα ifstream instream; instream.open("infile.txt"); Ιςοδφναμο με: ifstream instream("infile.txt"); 10-78
Ραράδειγμα #include <fstream> #include <iostream> using namespace std; int main( ) { cout << "Opening data.txt for appending.\n"; ofstream fout; fout.open("data.txt", ios::app); data.txt (πριν) 1 2 bucket my shoe. 3 4 shut the door. data.txt (μετά) 1 2 bucket my shoe. 3 4 shut the door. 5 6 pick up sticks. 7 8 ain t C++ great! fout << "5 6 pick up sticks.\n" << "7 8 ain t C++ great!\n"; fout.close( ); cout << "End of appending to file.\n"; } return 0; 10-79
Ζλεγχοσ για φπαρξθ αρχείου Το άνοιγμα αρχείου μπορεί να μθν λειτουργιςει Αν το αρχείο ειςόδου δεν υπάρχει Δεν υπάρχει άδεια εγγραφισ ςτο αρχείο εξόδου Άγνωςτα αποτελζςματα Η ςυνάρτθςθ fail() Κάλεςμα τθσ fail() για ζλεγχο ςωςτό ροϊν instream.open("stuff.txt"); if (instream.fail()) { cout << "File open failed.\n"; exit(1); } 10-80
Ζλεγχοσ για το τζλοσ αρχείου (EOF) Χριςθ βρόχου για επεξεργαςία ζωσ ότου το τζλοσ αρχείου Συνικθσ πρακτικι Δφο τρόποι για ζλεγχο ΕΟF: Η ςυνάρτθςθ eof() Διαβάηει κάκε χαρακτιρα ζωσ EOF eof() ςυν/ςθ επιςτρζφει bool Η διαδικαςία διαβάςματοσ επιςτρζφει bool τιμι! (instream >> next) Η ζκφραςθ επιςτρζφει true αν το διάβαςμα ζγινε επιτυχϊσ Επιςτρζφει false αν επιχειριςει να διαβάςει πζρα από το τζλοσ του αρχείου instream.get(next); while (!instream.eof()) { cout << next; instream.get(next); } double next, sum = 0; while (instream >> next) sum = sum + next; cout << "sum:" << sum; 10-81
Τα ονόματα αρχείων ωσ μεταβλθτζσ Η διαδικαςία ανοίγματοσ ροισ Το όριςμα ςτθ ςυνάρτθςθ open() είναι τφπου string Μπορεί να είναι ςτακερά " " ι μεταβλθτι char filename[16]; ifstream instream; cout << "Enter file name: "; cin >> filename; instream.open(filename); Ραρζχει περιςςότερθ ευελιξία ςτο πρόγραμμα 10-82
#include <fstream> #include <iostream> #include <cstdlib> //for exit using namespace std; int main( ) { ifstream instream; ofstream outstream; instream.open("infile.txt"); if (instream.fail( )) { cout << "Error.\n"; exit(1); } outstream.open("outfile.txt"); if (outstream.fail( )) { cout << " Error.\n"; exit(1); } int first, second, third; instream >> first >> second >> third; outstream << "The sum of the first 3\n" << "numbers in infile.txt\n" << "is " << (first + second + third) << endl; instream.close( ); outstream.close( ); } 10-83
#include <fstream> #include <iostream> #include <cstdlib> //for exit using namespace std; void addplusplus(ifstream& instream, ofstream& outstream); int main( ) cad.txt { ifstream fin; ofstream fout; } fin.open("cad.txt"); if (fin.fail( )) { cout << "Error.\n"; exit(1); } fout.open("cppad.txt"); if (fout.fail( )) { cout << " Error.\n"; exit(1); } addplusplus(fin, fout); fin.close( ); fout.close( ); void addplusplus( ifstream& instream, ofstream& outstream ) { char next; } instream.get(next); while (! instream.eof( )) { if (next == 'C') outstream << "C++"; else outstream << next; } C is one of the world s most modern programming languages. There is no language as versatile as C, and C is fun to use. instream.get(next); 10-84
Σφνοψθ Οι ροζσ ςυνδζονται με αρχεία με τθν λειτουργία open() H ςυνάρτθςθ fail() ελζγχει για επιτυχθμζνθ ανάγνωςθ/εγγραφι Οι τφποι ροϊν μποροφν να είναι παράμετροι ςε ςυναρτιςεισ Ρρζπει να είναι παράμετροι με αναφορά 10-85
Βιβλιογραφία Καλι Μελζτθ [1] W. Savitch, Ρλιρθσ C++, Εκδόςεισ Τηιόλα, 2011 [2+ Η. Deitel and P. Deitel, C++ Ρρογραμματιςμόσ 6θ Εκδοςθ, Εκδόςεισ Μ. Γκιοφρδασ, 2013 Ύλη βιβλιογραφίας [1]: 9.1, 9.2, 9.3 *2+: 6.7, 6.8, Κεφ. 18 9-86