You are on page 1of 36

Εισαγωγή στη 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


H κλάση string
• Class 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 εµφανίζει αριθµητικές τιµές σε δεκαδική µορφή


προσθέτει το χαρακτήρα \n στην ροή την οποία και
endl
κάνει flush
προσθέτει το χαρακτήρα NULL στην ροή την οποία και
ends
κάνει flush
flush κάνει flush το ρεύµα ροής

oct εµφανίζει αριθµητικές τιµές σε οκταδική µορφή


ΕΠΛ 132 – Αρχές Προγραµµατισµού ΙΙ 16
H βιβλιοθήκη iomanip
• Ορίζει ένα σύνολο από χειριστές (manipulators) ρευµάτων ροής
που επιδρούν πάνω στη συµπεριφορά της εισόδου και εξόδου
δεδοµένων.

• Εκτός από το setw() όλα τα υπόλοιπα είναι εξακολουθητικά


(persistent), δηλαδή παραµένουν σε ισχύ µέχρι την εφαρµογή
κάποιου άλλου manipulator που αλλάζει τη συµπεριφορά του
ρεύµατος.

• Μερικοί από τους χειριστές δεν είναι υλοποιηµένοι από όλους


τους compiler C++.

ΕΠΛ 132 – Αρχές Προγραµµατισµού ΙΙ 17


H βιβλιοθήκη iomanip
setw(int x) θέτει το µήκος του πεδίου που θα τυπωθεί σε x

setfill(int c) θέτει τον χαρακτήρα γεµίσµατος θέσεων σε c

setbase(int b) θέτει το b ως βάση των εµφανιζόµενων αριθµών


fixed εµφανίζει τη δεκαδική τιµή πραγµατικών αριθµών

setprecision(int d) θέτει το d ως τον αριθµό θέσεων ακρίβειας

boolalpha Εµφανίζει λογικές τιµές συµβολικά ως true, false


Εµφανίζει λογικές τιµές µε την ακέραια παράστασή
noboolalpha
τους (ως 0 και 1)
skipws τα κενά αγνοούνται κατά τις εξαγωγές

noskipws τα κενά δεν αγνοούνται

ΕΠΛ 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> // 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;
}
ifstream sin("in1.txt"); if (! sin){
ofstream sout("out1.txt"); cerr << “cannot open in1.txt” ;
string s; exit(1);
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();
Παράµετροι Αναφοράς
• 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

You might also like