Εισαγωγή στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Παράδειγµα χρήσης κλάσεων βιβλιοθηκών: Η κλάση string Ι/Ο στη C++ Βιβλιοθήκες της C++ Παράµετροι Αναφοράς, Παράµετροι default ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1
Από τη C η C++ διατηρεί : C και C++ τους βασικούς τύπους δεδοµένων int, long, short, char, float, double, long double τους τελεστές +, -, *, /, %, <, >, κλπ, µε τη γνωστή σειρά προτεραιότητας. εντολές ροής όπως if, if-else, switch, while, for, κλπ Oπως και στη C, ένα C++ πρόγραµµα αποτελείται από µια συλλογή ορισµών, δηλώσεων και συναρτήσεων η οποία µπορεί να είναι διαµερισµένη σε περισσότερα από ένα αρχεία. Σχόλια στη C++ περικλείονται σε /* */. Εναλλακτικά οι χαρακτήρες // µπορούν να χρησιµοποιηθούν στην αρχή µιας γραµµής για να δηλώσουν ότι η συγκεκριµένη γραµµή είναι σχόλιο. Κάθε µεταβλητή σε ένα πρόγραµµα C++ πρέπει να ορισθεί. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2
Ο τύπος Boolean Η C++ περιέχει τον τύπο bool Ο τύπος bool έχει δύο σταθερές τις true false Οι λογικοί τελεστές είναι, όπως και στην C, οι &&,,! Επίσης ισχύει ότι, µια λογική έκφραση έχει τιµή false εαν η τιµή της έκφρασης είναι 0. ιαφορετικά, αν έχει µη-µηδενική τιµή τότε η λογική τιµή της έκφρασης είναι true. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 3
Συµβολοσειρές και σταθερές Συµβολοσειρές: Όπως και στην C µια συµβολοσειρά είναι µια ακολουθία από χαρακτήρες που περικλείεται σε.... Κατά την αποθήκευση µιας τέτοιας σταθεράς κάθε χαρακτήρας αποθηκεύεται σε συνεχόµενα κουτιά µνήµης ακολουθούµενη από τον χαρακτήρα ('\0') ο οποίος σηµατοδοτεί το τέλος της ακολουθίας. Σταθερές: Η δεσµευµένη λέξη const µπορεί να χρησιµοποιηθεί για τη δηµιουργία σταθερών τιµών σε ένα C++ πρόγραµµα. Χρήση του έχει σαν αποτέλεσµα ότι η τιµή του οριζόµενου αντικειµένου δεν µπορεί να αλλαχθεί αλλά µόνο να διαβαστεί. const float Pi = 3.1415; const int SampleSize = 100; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 4
Είσοδος/Έξοδος Μια διαφορά ανάµεσα στις C και C++ είναι η µέθοδος εισόδου και εξόδου χαρακτήρων. Συγκεκριµένα, η C++ δεν περιέχει συναρτήσεις όπως η scanf, printf, fprintf, fscanf, getc για την είσοδο και έξοδο χαρακτήρων από και προς τα ρεύµατα ροής. Για επίτευξη αυτού του στόχου η C++ χρησιµοποιεί αντικείµενα που είναι ορισµένα σε βιβλιοθήκες της γλώσσας και µεθόδους των αντικειµένων αυτών. Τα πιο κάτω αντικείµενα είναι ορισµένα στη βιβλιοθήκη iostream. cin, είναι αντικείµενο που αντιστοιχεί στο ρεύµα εισόδου. cout, είναι αντικείµενο που αντιστοιχεί στο ρεύµα εξόδου. Για εγγραφή και ανάγνωση από και προς τα αντικείµενα αυτά δηλαδή προς και από τα ρεύµατα εισόδου και εξόδου υπάρχουν ορισµένοι οι τελεστές << και >> : ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 5
Είσοδος/Έξoδος Ο τελεστής εισαγωγής, εισαγάγει στον αριστερό του τελεστέο τον δεξιό του τελεστέο: cout << έκφραση, και O τελεστής εξαγωγής, εξαγάγει από τον αριστερό του τελεστεό αντικείµενο που τοποθετεί στον δεξιό τελεστέο: cin >> έκφραση. Οι δύο αυτοί τελεστές µπορούν να γράψουν ή να διαβάσουν στοιχεία οποιουδήποτε από τους βασικούς τύπους της C++. Έτσι για παράδειγµα η έκφραση cout << Hello!\n έχει σαν αποτέλεσµα την εισαγωγή της συµβολοσειράς Hello!\n στη ροή εξόδου του προγράµµατος. Οι τελεστές << και >> µπορούν να χρησιµοποιηθούν περισσότερες από µια φορά σε µια εντολή. Για παράδειγµa: cout << Insertion operations << can be << cascaded ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 6
#include <iostream> int main() { // Extract length and width cout << "Rectangle dimensions: "; float Length; float Width; cin >> Length >> Width; Ορισµοί Εισαγωγή // Compute and insert the area float Area = Length * Width; Ορισµός µε αρχικοποίηση cout << "Area = " << Area << " = Length " << Length << " * Width " << Width << endl; return 0;
Αποτέλεσµα εκτέλεσης του προγράµµατος ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 8
Η κλάση string Όπως έχουµε αναφέρει η C++ επιτρέπει τη δηµιουργία νέων τύπων και κλάσεων. Ο προγραµµατιστής µπορεί να δηµιουργήσεις νέους, δικούς του τύπους/κλάσεις ή να χρησιµοποιήσει ήδη έτοιµες κλάσεις που προσφέρονται στις βιβλιοθήκες της γλώσσας. Παράδειγµα είναι η κλάση string. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 9
Class string H κλάση string χρησιµοποιείται για να απεικονίσει µια ακολουθία ως ένα µόνο αντικείµενο. Παραδείγµατα ορισµών και αρχικοποιήσεων: string Name = "Joanne"; string DecimalPoint = "."; string Question = '?'; // illegal ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 10
H κλάση string To συναρτησιακό κοµµάτι της κλάσης περιέχει τις πιο κάτω µεθόδους: size() υπολογίζει και επιστρέφει το µήκος της συµβολοσειράς string Saying = "Rust never sleeps."; cout << Saying.size() << endl; θα γράψει στην οθόνη την τιµή 18 substr() επιστρέφει κάποια υποακολουθία της συµβολοσειράς σύµφωνα µε τις παραµέτρους που δίνονται (θεωρούµε ότι ο πρώτος χαρακτήρας βρίσκεται στη θέση 0) string Word = Saying.substr(11, 16); // sleeps find() υπολογίζει και επιστρέφει τη θέση της πρώτης εµφάνισης κάποιας υποακολουθίας int j = Word.find("ee,0); // 2 int k = Word.find("steel,0); //? ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 11
Η κλάση string Βοηθητικές συναρτήσεις και τελεστές getline() εξαγάγει την επόµενη γραµµή από το ρεύµα ροής και την τοποθετεί στη δεύτερη παράµετρό του Παράδειγµα string Response; cout << "Enter text: "; getline(cin, Response, '\n'); cout << "Response is \"" << Response << "\" << endl; Αποτέλεσµα εκτέλεσης Enter text: Want what you do Response is "Want what you do" ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 12
Βοηθητικοί τελεστές Η κλάση string + αλληλουχία συµβολοσειρών Παράδειγµα string Part1 = "Me"; string Part2 = " and "; string Part3 = "You"; string All = Part1 + Part2 + Part3; += ανάθεση αλληλουχίας string ThePlace = "Brooklyn"; ThePlace += ", NY"; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 13
#include <iostream> #include <string> int main() { cout << "Enter the date in American format: " << "(e.g., December 29, 1953) : "; string Date; getline(cin, Date, '\n'); int i = Date.find(" "); string Month = Date.substr(0, i); int k = Date.find(","); string Day = Date.substr(i + 1, k - i - 1); string Year = Date.substr(k + 2, Date.size() - 1); string NewDate = Day + " " + Month + " " + Year; cout << "Original date: " << Date << endl; cout << "Converted date: " << NewDate << endl; return 0;
iostream Χρήσιµες Βιβλιοθήκες Για επεξεργασία ρευµάτων ροής fstream Για επεξεργασία αρχείων iomanip Για φορµαρισµένη είσοδο και έξοδο δεδοµένων ctype Βιβλιοθήκη βασισµένη σε βιβλιοθήκη C για επεξεργασία χαρακτήρων math Βιβλιοθήκη βασισµένη σε βιβλιοθήκη C που περιέχει τριγωνοµετρικές, λογαριθµικές και άλλες συναρτήσεις Η C++ έχει και πολλές άλλες βιβλιοθήκες ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 15
Βιβλιοθήκη iostream Περιέχει ένα σύνολο κλάσεων που χρησιµοποιούνται για δηµιουργία αντικειµένων που αντιστοιχούν σε ρεύµατα εισόδου και εξόδου. Τα αντικείµενα cin και cout (cerr και clog) είναι στιγµιότυπα κλάσεων που ανήκουν στο iostream, και δηµιουργούνται αυτόµατα όταν ξεκινά η εκτέλεση ενός προγράµµατος. Η βιβλιοθήκη επίσης περιέχει κάποιους χειριστές (manipulators) που περιλαµβάνουν dec endl ends flush oct εµφανίζει αριθµητικές τιµές σε δεκαδική µορφή προσθέτει το χαρακτήρα \n στην ροή την οποία και κάνει flush προσθέτει το χαρακτήρα NULL στην ροή την οποία και κάνει flush κάνει flush το ρεύµα ροής εµφανίζει αριθµητικές τιµές σε οκταδική µορφή ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 16
H βιβλιοθήκη iomanip Ορίζει ένα σύνολο από χειριστές (manipulators) ρευµάτων ροής που επιδρούν πάνω στη συµπεριφορά της εισόδου και εξόδου δεδοµένων. Εκτός από το setw() όλα τα υπόλοιπα είναι εξακολουθητικά (persistent), δηλαδή παραµένουν σε ισχύ µέχρι την εφαρµογή κάποιου άλλου manipulator που αλλάζει τη συµπεριφορά του ρεύµατος. Μερικοί από τους χειριστές δεν είναι υλοποιηµένοι από όλους τους compiler C++. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 17
H βιβλιοθήκη iomanip setw(int x) setfill(int c) setbase(int b) fixed setprecision(int d) boolalpha noboolalpha skipws noskipws θέτει το µήκος του πεδίου που θα τυπωθεί σε x θέτει τον χαρακτήρα γεµίσµατος θέσεων σε c θέτει το b ως βάση των εµφανιζόµενων αριθµών εµφανίζει τη δεκαδική τιµή πραγµατικών αριθµών θέτει το d ως τον αριθµό θέσεων ακρίβειας Εµφανίζει λογικές τιµές συµβολικά ως true, false Εµφανίζει λογικές τιµές µε την ακέραια παράστασή τους (ως 0 και 1) τα κενά αγνοούνται κατά τις εξαγωγές τα κενά δεν αγνοούνται ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 18
Παραδείγµατα cout << setfill( # ) << setw(15) << Hello << endl; ##########Hello int number = 9; int base = 8; cout << number << in base 10 is << setbase(base) << number << in base << dec << base << endl ; 9 in base 10 is 11 in base 8 cout << 1000000000000.0 << endl; cout << 0.0000000000001 << endl ; cout << 921.8 << endl; cout << fixed << 1000000000000.0 << endl; cout << 0.0000000000001 << endl ; cout << 921.8 << endl; 1e+012 1000000000000.000000 1e-013 0.000000 921.8 921.800000 ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 19
Παραδείγµατα cout << setprecision(6) << 12.01234 << endl << 12.0123 << endl << 12.012 << endl << 12.01 << endl << 12.0 << endl; 12.0123 12.0123 12.012 12.01 12 ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 20
Παραδείγµατα char s1, t1, s2, t2, s3; cout << Enter text: ; cin >> s1 >> t1; cout << s1 << endl; cout << t1 << endl; cin >> noskipws >> s2 >> t2; cout << s2 << t2; cin >> skipws >> s3; cout << s3; Enter text: a b c d a b c d ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 21
Η βιβλιοθήκη fstream Ορίζει τις κλάσεις ifstream, ofstream, και fstream, στιγµιότυπα των οποίων είναι αντικείµενα που αναπαραστούν ρεύµατα ροής για ανάγνωση από και γράψιµο προς αρχεία. Για τη δηµιουργία ενός ρεύµατος ροής για ανάγνωση στοιχείων από ένα αρχείο θα πρέπει να δηµιουργήσουµε ένα αντικείµενο τύπου ifstream. Για παράδειγµα, η πιο κάτω εντολή ανοίγει για ανάγνωση το αρχείο file.txt, δηµιουργώντας το aντικείµενο τύπου ifstream fin: ifstream fin( file.txt ); Παρόµοια για εγγραφή προς το αρχείο file2.txt θα πρέπει να δηµιουργήσουµε αντικείµενο τύπου ofstream: ofstream fout( file2.txt ); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 22
Η βιβλιοθήκη fstream Ανάγνωση και εγγραφή µέσω των δηµιουργηθέντων ρευµάτων µπορούν να γίνουν µέσω των τελεστών << και >>. Προσοχή: η δηµιουργία ενός ρεύµατος ofstream προς ένα αντικείµενο έχει ως αποτέλεσµα τη διαγραφή των περιεχοµένων του. Η C++ δίνει την δυνατότητα να γράψουµε στο τέλος ενός αρχείου (append) δηµιουργώντας ρεύµα ροής ως εξής: ofstream myout( file.txt, (ios::out ios::app)); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 23
#include <fstream> #include <string> // file stream library int main() { ifstream fin("mydata.txt"); int ValuesProcessed = 0; float ValueSum = 0; float Value; while (fin >> Value) { ValueSum += Value; ++ValuesProcessed; if (ValuesProcessed > 0) { ofstream fout("average.txt"); float Average = ValueSum / ValuesProcessed; fout << "Average: " << Average << endl; else cerr << "No list to average" << endl; return 0;
ifstream sin("in1.txt"); ofstream sout("out1.txt"); string s; while (sin >> s) { sout << s << endl; sin.close(); sout.close(); sin.open("in2.txt"); sout.open("out2.txt", (ios::out ios::app)); while (sin >> s) { sout << s << endl; sin.close(); sout.close(); if (! sin){ cerr << cannot open in1.txt ; exit(1);
Παράµετροι Αναφοράς Aς επιστρέψουµε στους τελεστές >> και <<. Έχουµε δεί ότι π.χ. η cin >> Length έχει σαν αποτέλεσµα την ανάγνωση µιας τιµής και αποθήκευση αυτής στη µεταβλητή Lenth. H εντολή της C που θα είχε ισοδύναµο αποτέλεσµα είναι η scanf( %f, &Length). Παρατηρούµε ότι κατά τη χρήση του τελεστή εξαγωγής δεν χρησιµοποιήθηκε ο τελεστής αναφοράς. Αυτό οφείλεται στο ότι η C++ µας επιτρέπει κατά τον ορισµό συναρτήσεων και τελεστών να χρησιµοποιούµε δύο διαφορετικά είδη παραµέτρων: παραµέτρους τιµών, δηλαδή παραµέτρους στις οποίες αντιγράφεται και αποθηκεύεται η τιµή των πραγµατικών παραµέτρων της συνάρτησης, και παραµέτρους αναφοράς, δηλαδή παραµέτρους στις οποίες αποθηκεύεται η διεύθυνση των πραγµατικών παραµέτρων της συνάρτησης. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 26
Παράδειγµα Να γράψετε συνάρτηση η οποία παίρνει τέσσερις παραµέτρους, η πρώτη από τις οποίες είναι ένας πραγµατικός αριθµός, και αποθηκεύει στις επόµενες τρεις το πρόσηµο, την ακέραια τιµή και την κλασµατική τιµή της πρώτης παραµέτρου αντίστοιχα. Στην C θα γράφαµε void separate(double x, char *sign, int *whole, double *frac){ if (x < 0) *sign = - ; else if (x == 0) *sign = ; else *sign = + ; *whole = floor(fabs(x)); *frac = fabs(x) - *whole; και θα καλούσαµε την συνάρτηση ως separate(x, &s, &w, &f), όπου x, s, w, f, µεταβλητές κατάλληλου τύπου. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 27
Παράδειγµα Στην C++ η συνάρτηση µας θα µπορούσε να ορισθεί χρησιµοποιώντας µία παράµετρο τιµής και τρεις παραµέτρους αναφοράς ως εξής: void separate(double x, char &sign, int &whole, double &frac){ if (x < 0) sign = - ; else if (x == 0) sign = ; else sign = + ; whole = floor(fabs(x)); frac = fabs(x) - whole; και θα καλούσαµε την συνάρτηση ως separate(x, s, w, f), όπου x, s, w, f, µεταβλητές κατάλληλου τύπου. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 28
Σταθερές παράµετροι ήλωση παραµέτρου σε συνάρτηση χρησιµοποιώντας την δεσµευµένη λέξη const δείχνει ότι η παράµετρος δεν µπορεί να αλλαχθεί από τη συνάρτηση. void PromptAndGet(int &n, const string &s) { cout << s ; cin >> n ; s = "Got it"; // illegal assignment ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 29
Παράµετροι default Στη C όταν καλούµε µια συνάρτηση πρέπει να περάσουµε πραγµατικές τιµές για όλες τις παραµέτρους της συνάρτησης. H C++ µας επιτρέπει να δίνουµε default τιµές σε παραµέτρους συναρτήσεων και σε περίπτωση που κατά την κλήση της συνάρτησης δώσουµε πραγµατικές τιµές σε µερικές µόνο από τις παραµέτρους οι υπόλοιπες παράµετροι παίρνουν τις default τιµές που έχουν ορισθεί. Παρατήρηση: οι default παράµετροι µιας συνάρτησης πρέπει να εµφανίζονται µετά από τις υποχρεωτικές. Ο ορισµός των default τιµών µπορούν να γίνουν είτε στο πρωτότυπο της συνάρτησης, είτε στον ορισµό της συνάρτησης, αλλά όχι και στα δύο. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 30
Παράδειγµα void PrintChar(char c = '=', int n = 80) { for (int i = 0; i < n; ++i) cout << c; Ποιο θα είναι το αποτέλεσµα των πιο κάτω κλήσεων; PrintChar('*', 20); PrintChar('-'); PrintChar(); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 31
Παράδειγµα Έστω bool GetNumber(int &n, istream &sin = cin) { return sin >> n ; Πιθανές κλήσεις int x, y, z; ifstream fin("data.txt"); GetNumber(x, cin); GetNumber(y); GetNumber(z, fin); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 32
Εµβέλεια µεταβλητών void f() { int i = 1; cout << i << endl; // insert 1 { int j = 10; cout << i << j << endl; // insert 1 10 i = 2; cout << i << j << endl // insert 2 10 cout << i << endl; // insert 2 cout << j << endl; // illegal ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 33
Εµβέλεια µεταβλητών int i = 1; int main f() { cout << i << endl; // insert 1 char i = 'a'; cout << i << endl; // insert a ::i = 2; cout << i << endl; // insert a cout << ::i << endl; // insert 2 return 0; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 34
Overloading Συναρτήσεων Το όνοµα µιας συνάρτησης µπορεί να γίνει overloaded: µπορούµε να ορίσουµε δύο συναρτήσεις µε το ίδιο όνοµα αλλά µε διαφορετικές διασυνδέσεις, δηλαδή διαφορετικά σύνολα παραµέτρων ιαφορά στο πλήθος των παραµέτρων Min(a, b, c) Min(a, b) ιαφορά στον τύπο των παραµέτρων Min(10, 20) Min(4.4, 9.2) Ο compiler χρησιµοποιεί τακτικές που επιτρέπουν την επιλογή της πιο κατάλληλης συνάρτησης για την αποπεράτωση κλήσεων µιας διαδικασίας: aν υπάρχει συνάρτηση της οποίας οι τυπικές παράµετροι ταιριάζουν µε τις πραγµατικές παραµέτρους της κλήσης τότε επιλέγεται, αν δεν υπάρχει τέτοια συνάρτηση τότε ο compiler προσπαθεί να κάνει κατάλληλα castings ώστε να µπορεί να χρησιµοποιηθεί µια από τις υπάρχουσες συναρτήσεις. Οι ακριβείς κανόνες είναι σχετικά πολύπλοκοι. Καλό είναι να δίνεται πάντα προσοχή κατά τη χρήση overloaded συναρτήσεων. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 35
Παράδειγµα int Min(int a, int b) { cout << "Using int min()" << endl; if (a > b) return b; else return a; double Min(double a, double b) { cout << "Using double min()" << endl; if (a > b) return b; else return a; int main() { int a = 10; int b = 20; double x = 4.4; double y = 9.2; int c = Min(a, b); int z = Min(x, y); return 0; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 36