343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343...

86
343 – Εισαγωγή στον Προγραμματισμό Τμήμα Μαθηματικών Πανεπιστήμιο Ιωαννίνων Ακαδημαϊκό Έτος 2019-2020 Χάρης Παπαδόπουλος 207δ, B’ όροφος e-mail: [email protected] Ωρες Γραφείου: Τρίτη 11-13

Transcript of 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343...

Page 1: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

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

Τμήμα Μαθηματικών Πανεπιστήμιο Ιωαννίνων

Ακαδημαϊκό Έτος 2019-2020

Χάρης Παπαδόπουλος

207δ, B’ όροφος

e-mail: [email protected]

Ωρες Γραφείου:Τρίτη 11-13

Page 2: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Θ: διάλεξη (θεωρία)

Ε: Εργαστήριο

Q: Τεστ quiz

Εβδομάδα Θέματα Ύλη βιβλιογραφίας

Τρ, 8 Οκτωβρίου Εισαγωγικά μαθήματος, Δυαδική

αναπαράσταση, Είσοδος/Έξοδος δεδομένων

[1]: 1.1, Παράρτημα 3

[2]: Κεφ. 1, Β, Δ

Τρ, 15 Οκτωβρίου Τύποι δεδομένων & μεταβλητών, Αριθμητικοί και

Λογικοί Τελεστές, Ροή ελέγχου if/else

[1]: 1.2-1.5, 2.1, Παράρτημα 1

[2]: Κεφ. 2, Γ, 4.11, 4.12, Α, ΣΤ

Δε, Τε., Πε

21-23-24 Οκτ1ο Εργαστήριο

Τρ, 22 Οκτωβρίου Ροή επαναληπτικού ελέγχου: for, while, do-while[1]: 2.2, 2.3

[2]: Κεφ. 4, Κεφ. 5

Τρ, 29 ΟκτωβρίουΣυναρτήσεις, εμβέλεια μεταβλητών και

αναδρομή

[1]: Κεφ. 3, Κεφ. 4, 13.1, 13.2, Παρ. 4

[2]: Κεφ. 6

Δε, Τε, Πε

4-6-7 Νοε2ο Εργαστήριο

Τρ, 5 Νοεμβρίου Επανάληψη Εργαστηρίων

Δε, Τε, Πε,

11-13-14 Νοε3ο Εργαστήριο

Τρ, 12 Νοεμβρίου Πίνακες (μονοδιάστατοι και πολυδιάστατοι)[1]: 5.1, 5.2, 5.4

[2]: Κεφ. 7

Πε, 21 Νοε 1ο Τεστ (Ανάπτυξη κώδικα στο Εργαστήριο)

Τρ, 19 ΝοεμβρίουΕφαρμογές σε ταξινομήσεις και αναζήτηση

στοιχείων

[1]: 5.3, 13.3

[2]: 7.7, 7.8, 8.6, Κεφ. 19

Δε, Τε, Πε

25-27-28 Νοε4ο Εργαστήριο

Τρ, 26 Νοεμβρίου Επανάληψη με Παραδείγματα [1]: 9.1, 9.2, 9.3

[2]: 6.7, 6.8, Κεφ. 18

Δε, Τε, Πε

2-4-5 Δεκ5ο Εργαστήριο

Τρ, 3 Δεκεμβρίου Συναρτήσεις με χειρισμό πινάκων[1]: 5.1, 5.2, 5.3, 5.4, 13.3

[2]: Κεφ. 7, 8, 19

Πε, 12 Δεκ 2ο Quiz (Ερωτήσεις πολλαπλών επιλογών)

Τρ, 10 Δεκεμβρίου Αλφαριθμητικά, συμβολοσειρές[1]: 9.1, 9.2, 9.3, 6.1, 12.1, 12.2, 12.4

[2]: 6.7, 6.8, Κεφ. 18, 21, 17.1-17.10

Δε, 16 Δεκ 6ο Προαιρετικό Εργαστήριο (χωρίς παρουσίες)

Τρ, 17 Δεκεμβρίου Εγγραφές, δομές και χρήση αρχείων[1]: 9.1, 9.2, 9.3, 6.1, 12.1, 12.2, 12.4

[2]: 6.7, 6.8, Κεφ. 18, 21, 17.1-17.10

Τρ, 14 Ιανουαρίου Επανάληψη

Οκτώβριος 2019

Δ Τ Τ Π Π

1 2 3 4

7 8 Θ 9 10 11

14 15 Θ 16 17 18

21 Ε 22 Θ 23 Ε 24 Ε 25

28 29 Θ 30 Ε 31 Ε

Νοέμβριος 2019

Δ Τ Τ Π Π

1

4 Ε 5 Θ 6 Ε 7 Ε 8

11 E 12 Θ 13 E 14 E 15

18 19 Θ 20 21 Q 22

25 Ε 26 Θ 27 Ε 28 Ε 29

Δεκέμβριος 2019

Δ Τ Τ Π Π

2 E 3 Θ 4 E 5 E 6

9 10 Θ 11 12 Q 13

16 E 17 Θ 18 19 20

Ιανουάριος 2020

Δ Τ Τ Π Π

6 7 8 9 10

13 14 Θ 15 16 17

Page 3: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Θ: διάλεξη (θεωρία)

Ε: Εργαστήριο

Q: Τεστ quiz

Εβδομάδα Θέματα Ύλη βιβλιογραφίας

Τρ, 8 Οκτωβρίου Εισαγωγικά μαθήματος, Δυαδική

αναπαράσταση, Είσοδος/Έξοδος δεδομένων

[1]: 1.1, Παράρτημα 3

[2]: Κεφ. 1, Β, Δ

Τρ, 15 Οκτωβρίου Τύποι δεδομένων & μεταβλητών, Αριθμητικοί και

Λογικοί Τελεστές, Ροή ελέγχου if/else

[1]: 1.2-1.5, 2.1, Παράρτημα 1

[2]: Κεφ. 2, Γ, 4.11, 4.12, Α, ΣΤ

Δε, Τε., Πε

21-23-24 Οκτ1ο Εργαστήριο

Τρ, 22 Οκτωβρίου Ροή επαναληπτικού ελέγχου: for, while, do-while[1]: 2.2, 2.3

[2]: Κεφ. 4, Κεφ. 5

Τρ, 29 ΟκτωβρίουΣυναρτήσεις, εμβέλεια μεταβλητών και

αναδρομή

[1]: Κεφ. 3, Κεφ. 4, 13.1, 13.2, Παρ. 4

[2]: Κεφ. 6

Δε, Τε, Πε

4-6-7 Νοε2ο Εργαστήριο

Τρ, 5 Νοεμβρίου Επανάληψη Εργαστηρίων

Δε, Τε, Πε,

11-13-14 Νοε3ο Εργαστήριο

Τρ, 12 Νοεμβρίου Πίνακες (μονοδιάστατοι και πολυδιάστατοι)[1]: 5.1, 5.2, 5.4

[2]: Κεφ. 7

Πε, 21 Νοε 1ο Τεστ (Ανάπτυξη κώδικα στο Εργαστήριο)

Τρ, 19 ΝοεμβρίουΕφαρμογές σε ταξινομήσεις και αναζήτηση

στοιχείων

[1]: 5.3, 13.3

[2]: 7.7, 7.8, 8.6, Κεφ. 19

Δε, Τε, Πε

25-27-28 Νοε4ο Εργαστήριο

Τρ, 26 Νοεμβρίου Επανάληψη με Παραδείγματα [1]: 9.1, 9.2, 9.3

[2]: 6.7, 6.8, Κεφ. 18

Δε, Τε, Πε

2-4-5 Δεκ5ο Εργαστήριο

Τρ, 3 Δεκεμβρίου Συναρτήσεις με χειρισμό πινάκων[1]: 5.1, 5.2, 5.3, 5.4, 13.3

[2]: Κεφ. 7, 8, 19

Πε, 12 Δεκ 2ο Quiz (Ερωτήσεις πολλαπλών επιλογών)

Τρ, 10 Δεκεμβρίου Αλφαριθμητικά, συμβολοσειρές[1]: 9.1, 9.2, 9.3, 6.1, 12.1, 12.2, 12.4

[2]: 6.7, 6.8, Κεφ. 18, 21, 17.1-17.10

Δε, 16 Δεκ 6ο Προαιρετικό Εργαστήριο (χωρίς παρουσίες)

Τρ, 17 Δεκεμβρίου Εγγραφές, δομές και χρήση αρχείων[1]: 9.1, 9.2, 9.3, 6.1, 12.1, 12.2, 12.4

[2]: 6.7, 6.8, Κεφ. 18, 21, 17.1-17.10

Τρ, 14 Ιανουαρίου Επανάληψη

Οκτώβριος 2019

Δ Τ Τ Π Π

1 2 3 4

7 8 Θ 9 10 11

14 15 Θ 16 17 18

21 Ε 22 Θ 23 Ε 24 Ε 25

28 29 Θ 30 Ε 31 Ε

Νοέμβριος 2019

Δ Τ Τ Π Π

1

4 Ε 5 Θ 6 Ε 7 Ε 8

11 E 12 Θ 13 E 14 E 15

18 19 Θ 20 21 Q 22

25 Ε 26 Θ 27 Ε 28 Ε 29

Δεκέμβριος 2019

Δ Τ Τ Π Π

2 E 3 Θ 4 E 5 E 6

9 10 Θ 11 12 Q 13

16 E 17 Θ 18 19 20

Ιανουάριος 2020

Δ Τ Τ Π Π

6 7 8 9 10

13 14 Θ 15 16 17

Page 4: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

ΑΛΦΑΡΙΘΜΗΤΙΚΑ (C-STRING)Ενότητα 20

9 - 4

Page 5: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Αλφαριθμητικά και Συμβολοσειρές

• Δύο ειδών συμβολοσειρές:

• C-string:

– πίνακας από χαρακτήρες (char)

– το τέλος της συμβολοσειράς μαρκάρεται με το σύμβολο '\0'

– κλασικός τρόπος και στην απλή C

– χρησιμοποιεί έτοιμες βιβλιοθήκες

• Η τυποποιημένη κλάση string:

– χρησιμοποιεί έτοιμες βιβλιοθήκες με περισσότερες δυνατότητες

9 - 5

Page 6: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

C-string

• Πίνακες από χαρακτήρες (τύπου char)

• Ένας χαρακτήρας για κάθε μεταβλητή τύπου char

• Ένας επιπλέον χαρακτήρας '\0' (κάθετος μηδέν)– καλείται null χαρακτήρας

– σηματοδοτεί το τέλος της συμβολοσειράς

• Έχουμε ήδη χρησιμοποιήσει C-string – Η φράση "Γεια" αποθηκεύεται σε ένα C-string s:

char s[10] = "Γεια";

9 - 6

Page 7: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

C-string μεταβλητή

• Πίνακας από χαρακτήρες:char s[10];

– Δηλώνει μια C-string μεταβλητή για να αποθηκεύσει μέχρι 9 χαρακτήρες

– + έναν null χαρακτήρα

• Τυπικά είναι "μερικώς συμπληρωμένος" πίνακας– Δηλώνουμε αρκετά μεγάλο μέγεθος για να

αποθηκεύσουμε μέχρι το μέγιστο μήκος συμβολοσειράς

– Σηματοδοτούμε το τέλος με null

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

9 - 7

Page 8: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

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

• Ένας κλασικός πίνακας:

char s[10];

– Αν το s περιέχει την συμβολοσειρά " Hi Mom!", αποθηκεύεται ως:

9 - 8

Page 9: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Αρχικοποίηση

• Αρχικοποίηση C-string:char myMessage[20] = "Hi there.";

– Δεν χρειάζεται να γεμίσουμε ολόκληρο τον πίνακα

– Η αρχικοποίηση τοποθετεί το '\0' στο τέλος (αυτόματα)

• Μπορούμε να αποφύγουμε το μέγεθος του πίνακα:char shortString[] = "abc";

– Αυτόματα μετατρέπει το μέγεθος +1 από το μέγεθος της συμβολοσειράς μέσα σε " "

– ΔΕΝ είναι το ίδιο με:char shortString[] = {'a', 'b', 'c'};

9 - 9

Page 10: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Δείκτες σε C-string

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

• Πρόσβαση στις δεικτοδοτούμενες μεταβλητές:

char ourString[5] = "Hi";– ourString[0] είναι 'H'

– ourString[1] είναι 'i'

– ourString[2] είναι '\0'

– ourString[3] είναι άγνωστο

– ourString[4] είναι άγνωστο

9 - 10

Page 11: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Χειρισμός δεικτών C-string

• Μπορούμε να χειριστούμε δεικτοδοτούμενες μεταβλητές

– Θέλει προσοχή!!

– Εδώ, το '\0' (null) αντικαταστάθηκε από ένα 'Z'!

• Αν το null αντικαθίσταται, τότε το C-string δεν "συμπεριφέρεται" ως C-string!

– Άγνωστα αποτελέσματα!

char happyString[7] = "DoBeDo";happyString[6] = 'Z';

9 - 11

Page 12: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παραδείγματα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

Page 13: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Βιβλιοθήκες

• Δήλωση C-strings

– Δεν απαιτεί κάποια C++ βιβλιοθήκη

– Υπάρχει στην standard C++

• Χειρισμοί:

– Απαιτεί την βιβλιοθήκη <cstring>

– Συνήθως την καλούμε όταν χρησιμοποιούμε C-strings• Όταν θέλουμε να τις χειριστούμε με μεγάλη ευκολία

#include <cstring>

9 - 13

Page 14: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

"=" και "==" με C-strings• Τα C-strings δεν λειτουργούν όπως άλλες μεταβλητές

– Δεν μπορούμε να αναθέσουμε ή να συγκρίνουμε:

• Χρήση του "=" ΜΟΝΟ στη δήλωση του C-string!

• Πρέπει να χρησιμοποιήσουμε συναρτήσεις από βιβλιοθήκες για ανάθεση:

– strcpy: Συνάρτηση στη βιβλιοθήκη <cstring>– Θέτει την τιμή του aString ίση με "Hello"– ΔΕΝ ελέγχει για μέγεθος!

• Ο έλεγχος γίνεται από τον προγραμματιστή, όπως στους υπόλοιπους πίνακες!

char aString[10];aString = "Hello"; // ΛΑΘΟΣ!!

char aString[10];strcpy(aString, "Hello");

9 - 14

Page 15: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Σύγκριση 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

Page 16: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

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

9 - 16

Page 17: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

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

9 - 17

Page 18: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Η συνάρτηση strlen()

• Επιστρέφει το μήκος της συμβολοσειράς

• Είναι συχνά χρήσιμο να γνωρίζουμε το μέγεθος:

– και για να μην ξεφεύγουμε από τα όρια του πίνακα

– Επιστρέφει το πλήθος των χαρακτήρων

• Χωρίς να περιέχει τον null ('\0') χαρακτήρα

– Το πάνω αποτέλεσμα θα είναι:6

char myString[10] = "dobedo";cout << strlen(myString);

9 - 18

Page 19: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Η συνάρτηση strcat()

• strcat(s1,s2)– συνενώνει την συμβολοσειρά s2 στο τέλος της s1

• Στο αποτέλεσμα:η stringVar τώρα θα είναι "The rainin Spain"

• Χρειάζεται προσοχή:– Χρήση των κενών!

– Δεν επιβεβαιώνει αν η s1 είναι αρκετά μεγάλη για να δεχθεί την s2

char stringVar[20] = "The rain";strcat(stringVar, "in Spain");

9 - 19

Page 20: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παράμετροι και Ορίσματα των C-strings

• Θυμηθείτε: το C-string είναι πίνακας

• Επομένως ως παράμετρος C-string είναι παράμετρος πίνακα– Τα C-strings που περνάμε στις συναρτήσεις μπορούν να

αλλάξουν τιμή (παράμετροι με αναφορά)!

• Όπως στους πίνακες, συνήθως στέλνουμε και το μέγεθος του πίνακα– Η συν/ση "μπορεί" να κάνει χρήση του '\0' για να βρει το

τέλος

– Δηλαδή το μέγεθος δεν είναι απαραίτητο αν η συνάρτηση δεν αλλάζει την παράμετρο C-string

– Χρήση του "const" για προστασία των ορισμάτων C-string

9 - 20

Page 21: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παραδείγματα

• Ποια είναι ισοδύναμα μεταξύ τους;

• Υπάρχει κάποιο λάθος;

• Ποιο είναι το αποτέλεσμα:

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

Page 22: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ ΜΕ ΑΛΦΑΡΙΘΜΗΤΙΚΑ (C-STRING)

Ενότητα 21

9 - 22

Page 23: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Έξοδος με C-string

• Μπορούμε να τα εκτυπώσουμε με τον τελεστή εισαγωγής <<

• Ήδη το χρησιμοποιούμε:cout << news << " Γεια.\n";

– Όπου news είναι μια μεταβλητή C-string

• Προσοχή στον τελεστή << :σαν να συνενώνουμε C-strings!

9 - 23

Page 24: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Είσοδος με C-string

• Μπορούμε να εισάγουμε με τον τελεστή εξαγωγής >>– Ωστόσο υπάρχουν ορισμένα θέματα

• Το κενό " " θεωρείται ως "τέλος διαβάσματος"– Στηλοθέτης, κενό, εισαγωγή γραμμής: "παραλείπονται"

– Το διάβασμα στην είσοδο σταματά στο "τέλος διαβάσματος"

• Προσοχή στο μέγεθος του C-string– Πρέπει να είναι μεγάλο ώστε να μπορεί να αποθηκεύσει την

συμβολοσειρά που εισάγεται!

– Η C++ δεν δίνει κάποια "προειδοποίηση" σε τέτοια θέματα!

9 - 24

Page 25: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παράδειγμα εισαγωγής

• Η C-string a αποθηκεύει: "Γεια"

• Η C-string b αποθηκεύει: "και"

char a[80], b[80];cout << "Δώστε κάποια είσοδο: \n";cin >> a >> b;cout << a << b << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n";

Παράδειγμα

Δώστε κάποια είσοδο:

Γεια και χαρά σου !

ΓειακαιΤΕΛΟΣ ΕΙΣΟΔΟΥ!

9 - 25

Page 26: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Διάβασμα ολόκληρης γραμμής

• Μπορούμε να αποθηκεύσουμε ολόκληρη γραμμή (με κενά) σε ένα C-string

• Χρήση του getline():

– μια προκαθορισμένη συνάρτηση στην κλάση cin

– το δεύτερο όρισμα : μέγιστο αριθμό χαρακτήρων που θα διαβάσει

char a[80];cout << "Δώστε κάποια είσοδο: \n";cin.getline(a, 80);cout << a << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n";

Παράδειγμα1

Δώστε κάποια είσοδο:

Γεια και χαρά σου !

Γεια και χαρά σου !ΤΕΛΟΣ ΕΙΣΟΔΟΥ!

9 - 26

Page 27: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Περισσότερα για την getline()

• Μπορεί να αναφέρει το πλήθος των χαρακτήρων που θέλει να διαβάσει:

• Αναγκάζει ΤΕΣΣΕΡΙΣ χαρακτήρες μόνο να διαβάσει– Θυμηθείτε την ανάγκη για τον null ('\0') χαρακτήρα!

char a[5];cout << "Δώστε κάποια είσοδο: \n";cin.getline(a, 5);cout << a << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n";

Παράδειγμα2

Δώστε κάποια είσοδο:

Γειαχαρά

ΓειαΤΕΛΟΣ ΕΙΣΟΔΟΥ!

9 - 27

Page 28: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παραδείγματα

Παράδειγμα1

Δώστε κάποια είσοδο:

Έφτασε

η ώρα!

?????????????????????????

char a[80], b[80];cout << "Δώστε κάποια είσοδο: \n";cin >> a >> b;cout << a << b << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n";

Παράδειγμα2

Δώστε κάποια είσοδο:

Όσα δε φέρνει ο χρόνος,

?????????????????????????

char mystring[80];cout << "Δώστε κάποια είσοδο: \n";cin.getline(mystring,6);cout << mystring << "ΤΕΛΟΣ ΕΙΣΟΔΟΥ\n";

9 - 28

Page 29: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

ΧΕΙΡΙΣΜΟΙ ΧΑΡΑΚΤΗΡΩΝΕνότητα 22

9 - 29

Page 30: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Χαρακτήρες Ε/Ε

• Είσοδος και Έξοδος δεδομένων

– ΟΛΑ τα χειριζόμαστε ως δεδομένα χαρακτήρων

– π.χ., ο αριθμός 10 εκτυπώνεται ως '1' και '0'

– Η μετατροπή γίνεται αυτόματα• Χρησιμοποιεί χαμηλού-επιπέδου χαρακτηριστικά

• Μπορούμε να χρησιμοποιήσουμε χαμηλού-επιπέδου στοιχεία

9 - 30

Page 31: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

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

• Διαβάζει έναν χαρακτήρα (char) τη φορά

• Είναι συνάρτηση του αντικειμένου cin:

– Διαβάζει τον επόμενο χαρακτήρα και τον αναθέτει στη μεταβλητήnextSymbol

– Το όρισμα πρέπει να είναι τύπου char

• ΌΧΙ "συμβολοσειρά"!

char nextSymbol;cin.get(nextSymbol);

9 - 31

Page 32: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Η συνάρτηση put()• Εκτυπώνει έναν χαρακτήρα τη φορά

• Ανήκει στο αντικείμενο cout :

– Εκτυπώνει το γράμμα "a"

– Εκτυπώνει το γράμμα "e"

cout.put('a');

char myString[10] = "Hello";cout.put(myString[1]);

9 - 32

Page 33: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παράδειγμα (1/2)

cout << "Δώστε μια γραμμή εισόδου: \n";char symbol;do{

cin.get(symbol);cout << symbol;

} while( symbol != '\n');

Παράδειγμα

Δώστε μια γραμμή εισόδου:

Τρα λα λα 1 2 22

Τρα λα λα 1 2 22

9 - 33

Page 34: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παράδειγμα (2/2)#include <iostream>using namespace std;

void newLine( );

void getInt(int& number);

int main( ){

int n;

getInt(n);cout << n ";

return 0;}

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'));}

Παράδειγμα

Εnter input: 57

57 correct? (yes/no): no no!

Εnter input: 75

75 correct? (yes/no): yes

759 - 34

Page 35: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Περισσότερες συν/σεις χαρακτήρων

• putback()– Όταν διαβάζει τοποθετεί πάλι τον χαρακτήρα στην είσοδο

– cin.putback(lastChar);

• peek()– Επιστρέφει τον επόμενο χαρακτήρα που θα διαβαστεί,

αλλά τον αφήνει στην είσοδο

– peekChar = cin.peek();

• ignore()– Παράλειψη της εισόδου, μέχρι έναν συγκεκριμένο

χαρακτήρα

– cin.ignore(1000, "\n");• Παραλείπει το πολύ 1000 χαρακτήρες μέχρι "\n"

9 - 35

Page 36: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Συναρτήσεις χειρισμού χαρακτήρων (1/3)

• Βρίσκονται στην βιβλιοθήκη cctype:

#include <cctype>

9 - 36

Page 37: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Συναρτήσεις χειρισμού χαρακτήρων (2/3)

9 - 37

Page 38: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Συναρτήσεις χειρισμού χαρακτήρων (3/3)

9 - 38

Page 39: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παραδείγματα

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

Page 40: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Η ΚΛΑΣΗ STRINGΕνότητα 23

9 - 40

Page 41: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Η κλασική 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

Page 42: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παράδειγμα

#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

Page 43: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Ε/Ε με την κλάση String

• Ακριβώς όπως και σε άλλους τύπους!

• string s1, s2;cin >> s1;cin >> s2;

• Αποτέλεσμα:Ο χρήστης πληκτρολογεί:

May the hair on your toes grow long and curly!

• Η εξαγωγή ακόμα παραβλέπει κενά:s1 έχει τιμή "May"s2 έχει τιμή "the"

9 - 43

Page 44: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

getline() με την κλάση String

• Για ολόκληρες γραμμές:

• Ακριβώς όπως η getline() του C-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

9 - 44

Page 45: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Άλλες εκδόσεις της getline()• Μπορούμε να ορίσουμε χαρακτήρα τέλους:

• Διαβάζει την είσοδο μέχρι να εμφανιστεί το "?"

string line;cout << "Enter input: ";getline(cin, line, "?");

9 - 45

Page 46: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Προσοχή στον συνδυασμό

• Προσοχή όταν αναμειγνύουμε cin >> var και getline()

– Αν η είσοδος είναι: 42Hello hitchhiker.

• Η μεταβλητή n έχει τιμή 42

• Η line είναι η κενή συμβολοσειρά!!!!!

– cin >> n παραλείπει κενούς χαρακτήρες, αφήνοντας τον χαρακτήρα "\n" στην είσοδο για την getline()!

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

9 - 46

Page 47: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Επεξεργασία μεταβλητών τύπου string• Ίδιες λειτουργίες με τις C-strings

• και παραπάνω!– Περισσότερες από 100 συναρτήσεις της κλάσης string

• Ορισμένες συναρτήσεις:– .length()

• επιστρέφει το μήκος της συμβολοσειράς

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

9 - 47

Page 48: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Συναρτήσεις της κλάσης string (1/2)

9 - 48

Page 49: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Συναρτήσεις της κλάσης string (2/2)

9 - 49

Page 50: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Μετατροπή από 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

Page 51: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Σύνοψη

• Η μεταβλητή C-string είναι "πίνακας από χαρακτήρες"– Με επιπλέον τον κενό χαρακτήρα '\0'

• Τα C-strings συμπεριφέρονται όπως οι πίνακες– Δεν μπορούν να αναθέσουν, να συγκρίνουν όπως οι απλές

μεταβλητές

• Οι βιβλιοθήκες <cctype> & <string> έχουν χρήσιμες συν/σεις χειρισμού

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

• getline() επιτρέπουν διάβασμα ολόκληρης γραμμής

• Τα αντικείμενα string συμπεριφέρονται καλύτερα από τα απλά C-strings

9 - 51

Page 52: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

ΔΟΜΕΣΕνότητα 24

10 - 52

Page 53: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Δομές

• 2η ομαδοποιημένη δομή δεδομένων:

struct

• Θυμίζουμε: "ομαδοποίηση"

– Πίνακες: συλλογή από τιμές ίδιου τύπου

– Δομή: συλλογή από τιμές διαφορετικών τύπων

• Τις χειριζόμαστε ως ένα αντικείμενο, όπως τους πίνακες

• Βασική διαφορά:

– Πρέπει πρώτα να "ορίσουμε" την δομή

– Πριν από την δήλωση οποιασδήποτε μεταβλητής

10 - 53

Page 54: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Τύποι δομών

• Ορίζουμε την δομή καθολικά (συνήθως)

• Δεν δεσμεύουμε μνήμη– Απλά δίνουμε έναν "τύπο" για το πώς η δομή θα μοιάζει

• Ορισμός:

struct CDAccountV1{

double balance;double interestRate;int term;

};

όνομα της νέας δομής (ετικέτα)

ονόματα για τα μέλη

10 - 54

Page 55: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Δήλωση μεταβλητών δομής

• Με τον ορισμό της δομής μπορούμε τώρα να ορίσουμε νέες μεταβλητές αυτού του τύπου:

– Ακριβώς όπως δηλώνουμε για απλούς τύπους

– Η μεταβλητή account τώρα είναι τύπου CDAccountV1

– Περιέχει "τιμές για τα μέλη"

• Για κάθε "τμήμα" της δομής

struct CDAccountV1{

double balance;double interestRate;int term;

};

CDAccountV1 account;

10 - 55

Page 56: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Πρόσβαση στα μέλη της δομής

• Ο τελεστής τελεία . έχει πρόσβαση στα μέλη:– account.balance

– account.interestRate

– account.term

• Καλούνται "μεταβλητές για τα μέλη"– Τα "τμήματα" της μεταβλητής δομής

– Διαφορετικές δομές μπορούν να έχουν το ίδιο όνομα για τις μεταβλητές για τα μέλη• Δεν έχουμε σύγκρουση

struct CDAccountV1{

double balance;double interestRate;int term;

};

CDAccountV1 account;

10 - 56

Page 57: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

#include <iostream>using namespace std;

struct CDAccountV1{

double balance;double interestRate;int term;

};

void getData(CDAccountV1& theAccount);

int main( ){

CDAccountV1 account;getData(account);

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;

}

void getData(CDAccountV1& theAccount){

cout << "Δώσε λογαριασμό: ";cin >> theAccount.balance;cout << "Δώσε επιτόκιο ";cin >> theAccount.interestRate;cout << "Δώσε αριθμό μηνών";cin >> theAccount.term;

}

10 - 57

Page 58: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παραδείγματα

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

Page 59: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παράλειψη ερωτηματικού στο τέλος

• Δεν επιτρέπεται η παράλειψη ερωτηματικού στο τέλος

• Είναι απαραίτητο γιατί μπορείτε να δηλώσετε μεταβλητές δομής στο σημείο αυτό

struct WeatherData{

double temperature;double windVelocity;

};

struct WeatherData{

double temperature;double windVelocity;

} high, low;

10 - 59

Page 60: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Χρήση ιεραρχικών δομών

• Δομές που μπορεί τα μέλη να είναι μικρότερες δομές

• Έχει σημασία η σειρά που δηλώνουμε τις δομές– πρώτα δηλώνεται η μικρότερη δομή

• Αν έχουμε μια μεταβλητή:

• Τότε εμφανίζουμε στην έξοδο:

struct Date{

int day;int month;int year;

};

struct PersonInfo{

double height;double weight;Date birthdate;

};

PersonInfo person1;

cout << person1.birthdate.day;

10 - 60

Page 61: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Οι δομές σε ορίσματα σε συναρτήσεις

• Τα περνάμε όπως τα απλά δεδομένα– Παράμετρος με τιμή

– Παράμετρος με αναφορά

– Ή συνδυασμός

• Μπορούν επίσης να είναι ο επιστρεφόμενος τύπος μιας συνάρτησης– Επιστρεφόμενος Τύπος είναι μια δομή

– Η εντολή return στον ορισμό της συνάρτησηςστέλνει μια μεταβλητή δομής σε αυτόν που την κάλεσε

10 - 61

Page 62: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Απόδοση αρχικών τιμών σε δομές

• Μπορούν να αρχικοποιηθούν κατά τη δήλωση

– Η δήλωση παρέχει αρχικά δεδομένα σε όλα τα τρία μέλη της δομής

struct Date{

int day;int month;int year;

};

Date dueDate = {12, 31, 2003};

10 - 62

Page 63: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παραδείγματα

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;

void readShoetype(Shoetype& newshoe1){

cout << "Δώσε στυλ:";cin >> newshoe1.style;cout << "Δώσε τιμή:";cin >> newshoe1.price;

}

Shoetype discount(Shoetype oldshoe){

Shoetype temp;temp.style = oldshoe.style;temp.price = 0.9 * oldshoe.price;return temp;

}

10 - 63

Page 64: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

ΧΡΗΣΗ ΑΡΧΕΙΩΝΕνότητα 25

10 - 64

Page 65: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Ροές (streams)• Τυπικά: διαβάζουμε δεδομένα από το πληκτρολόγιο και

εκτυπώνουμε σε ένα τερματικό παράθυρο. Ωστόσο:– Μπορούμε να διαβάζουμε από αρχεία

– Μπορούμε να εκτυπώνουμε σε αρχεία

• Stream: Μια ροή από χαρακτήρες

• Ροή εισόδου (Input stream)• Μπορεί να έρθει από το πληκτρολόγιο

• Μπορεί να έρθει από αρχείο

• Ροή εξόδου (Output stream)• Μπορεί να σταλθεί στην οθόνη

• Μπορεί να σταλθεί σε αρχείο

10 - 65

Page 66: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Χρήση Ροών

• Ήδη χρησιμοποιούμε ροές– cin

• Η ροή εισόδου ενώνεται με το πληκτρολόγιο

– cout

• Η ροή εξόδου ενώνεται με την οθόνη

• Μπορούμε να ορίσουμε άλλες ροές– Από ή προς αρχεία

– Παρόμοια χρήση όπως με τα cin, cout

10 - 66

Page 67: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Χρήση ροών όπως με cin, cout

• Θεωρείστε:

– Το πρόγραμμα ορίζει μια ροή (stream) inStreamπου έρχεται από κάποιο αρχείο:int theNumber;inStream >> theNumber;

• Διαβάζει τιμή από την ροή stream, και την αναθέτει στο theNumber

– Το πρόγραμμα ορίζει μια ροή (stream) outStream που στέλνεται σε κάποιο αρχείοoutStream << "theNumber is " << theNumber;

• Γράφει την τιμή στη ροή stream, που πάει σε κάποιο αρχείο

10 - 67

Page 68: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Αρχεία

• Θα χρησιμοποιήσουμε αρχεία text

• Διάβασμα από αρχείο

– Όταν το πρόγραμμα δέχεται κάποια είσοδο

• Εγγραφή σε αρχείο

– Όταν το πρόγραμμα στέλνει κάποια έξοδο

• Ξεκινάει από την αρχή του αρχείου και καταλήγει προς το τέλος του αρχείου

– Υπάρχουν και άλλοι τρόποι

– Θα επεκταθούμε στο τέλος σε άλλους τρόπους προσπέλασης

10 - 68

Page 69: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Σύνδεση με αρχείο

• Πρώτα πρέπει να συνδέσουμε το αρχείο με μια ροή

• Για είσοδο:

– Αρχείο → ifstream αντικείμενο

• Για έξοδο:

– Αρχέιο→ ofstream αντικείμενο

• Οι κλάσεις ifstream και ofstream

Ορίζονται στη βιβλιοθήκη <fstream>

#include <fstream>

10 - 69

Page 70: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Βιβλιοθήκες αρχείων Ε/Ε

• Για να επιτρέψουμε τόσο για είσοδο από αρχείο όσο και για έξοδο σε αρχείο :

#include <fstream>using namespace std;

#include <fstream>using std::ifstream;using std::ofstream;

ή

10 - 70

Page 71: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Δήλωση ροών

• Η ροή πρέπει πρώτα να δηλωθεί όπως μια τυπική μεταβλητή:

• Μετά πρέπει να συνδεθεί με το αρχείο:

– Καλείται "άνοιγμα αρχείου"

– Χρησιμοποιεί την συνάρτηση open

– Μπορούμε να ορίσουμε την ακριβή διαδρομή του αρχείου

ifstream inStream;ofstream outStream;

inStream.open("infile.txt");

10 - 71

Page 72: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Χρήση Ροών

• Μόλις δηλωθεί → χρησιμοποιείται κανονικά!

• Η ροή εξόδου γίνεται παρόμοια:

– Στέλνει τα αντικείμενα στο αρχείο εξόδου "outfile.txt"

int oneNumber, anotherNumber;inStream >> oneNumber >> anotherNumber;

ofstream outStream;

outStream.open("outfile.txt");outStream << "oneNumber = " << oneNumber

<< " anotherNumber = "<< anotherNumber;

10 - 72

Page 73: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Ονοματολογία αρχείων

• Προγράμματα και αρχεία

• Τα αρχεία έχουν δύο ονόματα στα προγράμματά μας

– Εξωτερικό όνομα αρχείου• Επίσης καλείται "φυσικό όνομα"

• Όπως το "infile.txt"

• Μερικές φορές λέγεται και "πραγματικό όνομα"

• Χρησιμοποιείται μόνο μια φορά (στο άνοιγμα/σύνδεση)

– Όνομα ροής• Καλείται επίσης και "λογικό όνομα"

• Το πρόγραμμα χρησιμοποιεί το όνομα αυτό για όλα τα αρχεία που επεξεργάζεται

ifstream inStream;ofstream outStream;

inStream.open("infile.txt");

10 - 73

Page 74: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Κλείσιμο αρχείων

• Τα αρχεία που ανοίγουν πρέπει να κλείνουν

– Όταν το πρόγραμμα σταματάει να δέχεται είσοδο ή να στέλνει στην έξοδο

– Απελευθερώνει τη ροή από το αρχείο

• Δεν παίρνουν ορίσματα

• Τα αρχεία κλείνουν αυτόματα όταν το πρόγραμμα τερματίζει– Ωστόσο πρέπει εμείς να τα κλείνουμε για να αποφεύγουμε λάθη

εγγραφής/ανάγνωσης

ifstream inStream;ofstream outStream;

inStream.close();outStream.close();

10 - 74

Page 75: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Η συνάρτηση flush()

• Η έξοδος συνήθως "ενταμιεύεται (buffered)"

– αποθηκεύεται προσωρινά πριν την εγγραφή της σε αρχείο

– Η εγγραφή γίνεται σε "ομάδες"

• Συχνά μπορεί να θέλουμε να εξαναγκάσουμε την εγγραφή:outStream.flush();

– Η συνάρτηση flush, για όλες τις ροές εξόδου

– Όλα τα δεδομένα εξόδου (buffered) γράφονται

• Όταν κλείνουμε το αρχείο τότε καλείται αυτόματα η συνάρτηση flush()

10 - 75

Page 76: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

#include <fstream>using namespace std;

int main( ){

ifstream inStream;ofstream outStream;

inStream.open("infile.txt");outStream.open("outfile.txt");

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;}

infile.txt

1

2

3

4

outfile.txt

The sum of the first 3numbers in infile.txtis 6

10 - 76

Page 77: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Προσάρτηση σε αρχείο

• Ο τυπικός τρόπος που ανοίγουμε αρχείο ξεκινάνειμε κενό αρχείο– Ακόμα και όταν το αρχείο υπάρχει ήδη→ τα δεδομένα

χάνονται

• Άνοιγμα για προσάρτηση:

– Αν το αρχείο δεν υπάρχει → το δημιουργεί

– Αν το αρχείο υπάρχει → προσαρτά στο τέλος

– το 2ο όρισμα είναι η κλάση ios που ορίζεται ως σταθερά• στη βιβλιοθήκη <iostream>, std namespace

ofstream outStream;outStream.open("important.txt", ios::app);

10 - 77

Page 78: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Εναλλακτικός τρόπος για άνοιγμα αρχείου

• Μπορούμε να δηλώσουμε το όνομα του αρχείου στη δήλωση– Το περνάμε ως ένα όρισμα

Ισοδύναμο με:

ifstream inStream;inStream.open("infile.txt");

ifstream inStream("infile.txt");

10 - 78

Page 79: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Παράδειγμα

#include <fstream>#include <iostream>using namespace std;

int main( ){

cout << "Opening data.txt for appending.\n";ofstream fout;fout.open("data.txt", ios::app);

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;}

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!

10 - 79

Page 80: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Έλεγχος για ύπαρξη αρχείου

• Το άνοιγμα αρχείου μπορεί να μην λειτουργήσει– Αν το αρχείο εισόδου δεν υπάρχει

– Δεν υπάρχει άδεια εγγραφής στο αρχείο εξόδου

– Άγνωστα αποτελέσματα

• Η συνάρτηση fail()– Κάλεσμα της fail() για έλεγχο σωστό ροών

inStream.open("stuff.txt");if (inStream.fail()){

cout << "File open failed.\n";exit(1);

}

10 - 80

Page 81: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Έλεγχος για το τέλος αρχείου (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

Page 82: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Τα ονόματα αρχείων ως μεταβλητές

• Η διαδικασία ανοίγματος ροής

– Το όρισμα στη συνάρτηση open() είναι τύπου string

– Μπορεί να είναι σταθερά " " ή μεταβλητή

– Παρέχει περισσότερη ευελιξία στο πρόγραμμα

char fileName[16];ifstream inStream;cout << "Enter file name: ";cin >> fileName;inStream.open(fileName);

10 - 82

Page 83: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

#include <fstream>#include <iostream>#include <cstdlib> //for exitusing 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

Page 84: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

#include <fstream>#include <iostream>#include <cstdlib> //for exitusing namespace std;

void addplusplus(ifstream& inStream, ofstream& outStream);int main( ){

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

elseoutStream << next;

inStream.get(next);}

}

cad.txt

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.

10 - 84

Page 85: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Σύνοψη

• Οι ροές συνδέονται με αρχεία με την λειτουργία open()

• H συνάρτηση fail() ελέγχει για επιτυχημένη ανάγνωση/εγγραφή

• Οι τύποι ροών μπορούν να είναι παράμετροι σε συναρτήσεις

– Πρέπει να είναι παράμετροι με αναφορά

10 - 85

Page 86: 343 –ισαγωγή σ ον Προγραμμαισμόcharis/c343/weeks/Lecture9.pdf · 343 –ισαγωγή σ ον Προγραμμαισμό Τμήμα Μαθημαικών

Καλή Μελέτη

• Βιβλιογραφία

[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