ΕΑΡΙΝΟ ΠΡΟΓΡΑΜΜΑ 2010 ΕΡΓΑΣΗΡΙΑ C++ Βαςιλϊντα Κουμπό 1
Θϋματα 1 ου Προεργαςτηρύου Περιβϊλλον Dev C++ Εγγραφό μηνυμϊτων ςτην οθόνη και ςε αρχεύο Βαςικού τύποι δεδομϋνων-μεταβλητϋσ, προτεραιότητα τελεςτών Ειςαγωγό τιμών από πληκτρολόγιο και αρχεύο Βιβλιοθόκεσ <iomanip>, <cmath>, <ctime> Μαθηματικϋσ ςυναρτόςεισ-τυχαύοι αριθμού Ένα απλό if ςχεςιακού τελεςτϋσ 2
C και C++ Από την C η C++ διατηρεύ : τουσ βαςικούσ τύπουσ δεδομϋνων char,int, long, short, float,double, long double τουσ τελεςτϋσ +, -, *, /, %, <, >, κλπ, με τη γνωςτό ςειρϊ προτεραιότητασ. εληνιέο ξνήο όπσο if, if-else, switch, while, for, θιπ. Όπωσ και ςτη C, ϋνα C++ πρόγραμμα αποτελεύται από μια ςυλλογή οριςμών, δηλώςεων και ςυναρτήςεων η οπούα μπορεύ να εύναι διαμεριςμϋνη ςε περιςςότερα από ϋνα αρχεύα. χόλια ςτη C++ περικλεύονται ςε /* */. Εναλλακτικϊ οι χαρακτόρεσ // μπορούν να χρηςιμοποιηθούν ςτην αρχό μιασ γραμμόσ για να δηλώςουν ότι η ςυγκεκριμϋνη γραμμό εύναι ςχόλιο. Κϊθε μεταβλητό ςε ϋνα πρόγραμμα C++ πρϋπει να οριςθεύ. 3
Βαςικοί τύποι Δεδομένων char (sizeof) 1 byte short μικρόσ ακϋραιοσ 2 bytes από -32.768 ϋωσ 32.767 int ακϋραιοσ 4 bytes από -2.147.438.648 ϋωσ -+2.147.438.648 long μεγϊλοσ ακϋραιοσ float πραγματικόσ 4 bytes από -2.147.438.648 ϋωσ -+2.147.438.648 4 bytes Από 3.4x10-38 ϋωσ 3.4x10 38 με ακρύβεια 7 δεκαδικών ψηφύων double πραγματικόσ διπλόσ ακρύβειασ long double πραγματικόσ διπλόσ ακρύβειασ 8 bytes από 1.7x10-308 ϋωσ 1.7x10 308, με 15 δεκαδικϊ ψηφύα 12 bytes από 1.2x10-4932 ϋωσ 1.2x10 4932, με 19 δεκαδικϊ ψηφύα 4
Προτεραιότητεσ τελεςτών 5
Ο τύποσ Bool Η C++ περιϋχει τον τύπο bool Ο τύποσ bool έχει δύο ςταθερέσ true false Οι λογικού τελεςτϋσ εύναι, όπωσ και ςτην C, οι &&,,! Επύςησ ιςχύει ότι, μια λογικό ϋκφραςη ϋχει τιμό false αν η τιμό τησ ϋκφραςησ εύναι 0. Διαφορετικϊ, αν ϋχει μη-μηδενικό τιμό τότε η λογικό τιμό τησ ϋκφραςησ εύναι true. 6
Συμβολοςειρέσ και ςταθερέσ υμβολοςειρϋσ: Όπωσ και ςτην C μια ςυμβολοςειρϊ εύναι μια ακολουθύα από χαρακτόρεσ που περικλεύεται ςε.... Κατϊ την αποθόκευςη μιασ τϋτοιασ ςταθερϊσ κϊθε χαρακτόρασ αποθηκεύεται ςε ςυνεχόμενα κουτιϊ μνόμησ ακολουθούμενη από τον χαρακτόρα ('\0') ο οπούοσ ςηματοδοτεύ το τϋλοσ τησ ακολουθύασ. ταθερϋσ: Η δεςμευμϋνη λϋξη const μπορεύ να χρηςιμοποιηθεύ για τη δημιουργύα ςταθερών τιμών ςε ϋνα C++ πρόγραμμα. Χρόςη του ϋχει ςαν αποτϋλεςμα ότι η τιμό του οριζόμενου αντικειμϋνου δεν μπορεύ να αλλαχθεύ αλλϊ μόνο να διαβαςτεύ. const float Pi = 3.1415; const int SampleSize = 100; macros: #define star * ; 7
Είςοδοσ/Έξοδοσ Μια διαφορϊ ανϊμεςα ςτισ C και C++ εύναι η μϋθοδοσ ειςόδου και εξόδου χαρακτόρων. υγκεκριμϋνα, η C++ δεν περιϋχει ςυναρτόςεισ όπωσ η scanf, printf, fprintf, fscanf, getc για την εύςοδο και ϋξοδο χαρακτόρων από και προσ τα ρεύματα ροόσ. Για επύτευξη αυτού του ςτόχου η C++ χρηςιμοποιεύ αντικεύμενα που εύναι οριςμϋνα ςε βιβλιοθόκεσ τησ γλώςςασ και μεθόδουσ των αντικειμϋνων αυτών. Σα πιο κϊτω αντικεύμενα εύναι οριςμϋνα ςτη βιβλιοθόκη iostream. cin, εύναι αντικεύμενο που αντιςτοιχεύ ςτο ρεύμα ειςόδου. cout, εύναι αντικεύμενο που αντιςτοιχεύ ςτο ρεύμα εξόδου. Για εγγραφό και ανϊγνωςη από και προσ τα αντικεύμενα αυτϊ δηλαδό προσ και από τα ρεύματα ειςόδου και εξόδου υπϊρχουν oριςμϋνοι οι τελεςτϋσ << και >> (υπερφοτωμϋνοι) 8
Εκβέιεηα κεηαβιεηώλ 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 9
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; 10
Είςοδοσ/Έξoδοσ Ο τελεςτόσ ειςαγωγόσ, ειςαγϊγει ςτον αριςτερό του τελεςτϋο τον δεξιό του τελεςτϋο: cout << ϋκφραςη, και O τελεςτόσ εξαγωγόσ, εξαγϊγει από τον αριςτερό του τελεςτϋο αντικεύμενο που τοποθετεύ ςτον δεξιό τελεςτϋο: cin >> ϋκφραςη. Οι δύο αυτού τελεςτϋσ μπορούν να γρϊψουν ό να διαβϊςουν ςτοιχεύα οποιουδόποτε από τουσ βαςικούσ τύπουσ τησ C++. Έτςι για παρϊδειγμα η ϋκφραςη cout << Hello!\n ϋχει ςαν αποτϋλεςμα την ειςαγωγό τησ ςυμβολοςειρϊσ Hello!\n ςτη ροό εξόδου του προγρϊμματοσ. Οι τελεςτϋσ << και >> μπορούν να χρηςιμοποιηθούν περιςςότερεσ από μια φορϊ ςε μια εντολό. Για παρϊδειγμa: cout << Insertion operations << can be << cascaded 11
#include <iostream> int main() { // διαζηάζεις length and width cout << "Rectangle dimensions: "; float Length; float Width; Οριςμού cin >> Length >> Width; // Υπολογιζμός και ηιμή για area float Area = Length * Width; Ειςαγωγό Οριςμόσ με αρχικοπούηςη } cout << "Area = " << Area << " = Length " << Length << " * Width " << Width << endl ; return 0; 12
Αποτέλεςμα εκτέλεςησ του προγράμματοσ 13
Η κλάςη string H C++ επιτρϋπει τη δημιουργύα νϋων τύπων και κλϊςεων. Ο προγραμματιςτόσ μπορεύ να δημιουργήςει νέουσ, δικούσ του τύπουσ/κλϊςεισ ό να χρηςιμοποιόςει όδη ϋτοιμεσ κλϊςεισ που προςφϋρονται ςτισ βιβλιοθόκεσ τησ γλώςςασ. Παράδειγμα είναι η κλάςη string χρηςιμοποιεύται για να απεικονύςει μια ακολουθύα χαρακτόρων ωσ ϋνα μόνο αντικεύμενο. Παραδεύγματα οριςμών και αρχικοποιόςεων: string Name = "Joanne"; string DecimalPoint = "."; string Question = '?'; // illegal 14
Χρήςιμεσ Βιβλιοθήκεσ iostream Για επεξεργαςύα ρευμϊτων ροόσ fstream Για επεξεργαςύα αρχεύων iomanip Για φορμαριςμϋνη εύςοδο και ϋξοδο δεδομϋνων ctype Βιβλιοθόκη βαςιςμϋνη ςε βιβλιοθόκη C για επεξεργαςύα χαρακτόρων math Βιβλιοθόκη βαςιςμϋνη ςε βιβλιοθόκη C που περιϋχει τριγωνομετρικϋσ, λογαριθμικϋσ και ϊλλεσ ςυναρτόςεισ Η C++ ϋχει και πολλϋσ ϊλλεσ βιβλιοθόκεσ 15
Βιβλιοθήκη iostream Περιϋχει ϋνα ςύνολο κλϊςεων που χρηςιμοποιούνται για δημιουργύα αντικειμϋνων που αντιςτοιχούν ςε ρεύματα ειςόδου και εξόδου. Σα αντικεύμενα cin και cout (cerr και clog) εύναι ςτιγμιότυπα κλϊςεων που ανόκουν ςτο iostream, και δημιουργούνται αυτόματα όταν ξεκινϊει η εκτϋλεςη ενόσ προγρϊμματοσ. Η βιβλιοθόκη επύςησ περιϋχει κϊποιουσ χειριςτϋσ (manipulators) που περιλαμβϊνουν dec endl ends flush oct εμφανύζει αριθμητικϋσ τιμϋσ ςε δεκαδικό μορφό προςθϋτει το χαρακτόρα \n ςτην ροό την οπούα και κϊνει flush προςθϋτει το χαρακτόρα NULL ςτην ροό την οπούα και κϊνει flush κϊνει flush το ρεύμα ροόσ εμφανύζει αριθμητικϋσ τιμϋσ ςε οκταδικό μορφό 16
H βιβλιοθήκη iomanip Οξίδεη έλα ζύλνιν από ρεηξηζηέο (manipulators) ξεπκάησλ ξνήο πνπ επηδξνύλ πάλσ ζηε ζπκπεξηθνξά ηεο εηζόδνπ θαη εμόδνπ δεδνκέλσλ. Εθηόο από ην setw() όια ηα ππόινηπα είλαη εμαθνινπζεηηθά (persistent), δειαδή παξακέλνπλ ζε ηζρύ κέρξη ηελ εθαξκνγή θάπνηνπ άιινπ manipulator πνπ αιιάδεη ηε ζπκπεξηθνξά ηνπ ξεύκαηνο. Μεξηθνί από ηνπο ρεηξηζηέο δελ είλαη πινπνηεκέλνη από όινπο ηνπο compiler C++. 17
H βιβλιοθόκη iomanip setw(int x) θϋτει το μόκοσ του πεδύου που θα τυπωθεύ ςε x setfill(int c) θϋτει τον χαρακτόρα γεμύςματοσ θϋςεων ςε c setbase(int b) θϋτει το b ωσ βϊςη των εμφανιζόμενων αριθμών fixed εμφανύζει τη δεκαδικό τιμό πραγματικών αριθμών setprecision(int d) θϋτει το d ωσ τον αριθμό θϋςεων ακρύβειασ skipws τα κενϊ αγνοούνται κατϊ τισ εξαγωγϋσ noskipws τα κενϊ δεν αγνοούνται 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 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 Παραδεύγματα 20
Η βιβλιοθόκη fstream Οξίδεη ηηο θιάζεηο ifstream, ofstream, θαη fstream, ζηηγκηόηππα ησλ νπνίσλ είλαη αληηθείκελα πνπ αλαπαξαζηνύλ ξεύκαηα ξνήο γηα αλάγλσζε από θαη γξάςηκν πξνο αξρεία. Γηα ηε δεκηνπξγία ελόο ξεύκαηνο ξνήο γηα αλάγλσζε ζηνηρείσλ από έλα αξρείν ζα πξέπεη λα δεκηνπξγήζνπκε έλα αληηθείκελν ηύπνπ ifstream. Γηα παξάδεηγκα, ε πην θάησ εληνιή αλνίγεη γηα αλάγλσζε ην αξρείν file.txt, δεκηνπξγώληαο ην aληηθείκελν ηύπνπ ifstream fin: ifstream fin( file.txt ); Παξόκνηα γηα εγγξαθή πξνο ην αξρείν file2.txt ζα πξέπεη λα δεκηνπξγήζνπκε αληηθείκελν ηύπνπ ofstream: ofstream fout( file2.txt ); 21
Η βηβιηνζήθε fstream Αλάγλσζε θαη εγγξαθή κέζσ ησλ δεκηνπξγεζέλησλ ξεπκάησλ κπνξνύλ λα γίλνπλ κέζσ ησλ ηειεζηώλ << θαη >>. Πξνζνρή: ε δεκηνπξγία ελόο ξεύκαηνο ofstream πξνο έλα αληηθείκελν έρεη σο απνηέιεζκα ηε δηαγξαθή ησλ πεξηερνκέλσλ ηνπ. Η C++ δίλεη ηελ δπλαηόηεηα λα γξάςνπκε ζην ηέινο ελόο αξρείνπ (append) δεκηνπξγώληαο ξεύκα ξνήο σο εμήο: ofstream myout( file.txt, (ios::out ios::app)); 22
#include <fstream> // file stream library #include <string> 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; 23
ifstream sin("in1.txt"); ofstream sout("out1.txt"); string s; while (sin >> s) { sout << s << endl; } sin.close(); sout.close(); if (!sin) { cerr<< cannot open In1.txt ; exit(1); } sin.open("in2.txt"); sout.open("out2.txt,(ios::out ios::app)); while (sin >> s) { sout << s << endl; } sin.close(); sout.close(); 24