Professional Documents
Culture Documents
Υπολογιστεσ Ιi Προγραμματισμός Με Τη Γλώσσα c++ ε. Λοιδωρίκης, δ. Παπαγεωργίου Πανεπιστήμιο Ιωαννίνων
Υπολογιστεσ Ιi Προγραμματισμός Με Τη Γλώσσα c++ ε. Λοιδωρίκης, δ. Παπαγεωργίου Πανεπιστήμιο Ιωαννίνων
Ε. Λοιδωρίκης, Δ. Παπαγεωργίου
Πανεπιστήμιο Ιωαννίνων
Ένα πρώτο πρόγραμμα
TOY HELLO
HELLO
ΠΡΟΓΡΑΜΜΑΤΟΣ
1 2
3 4
Πως γράφεται το πρόγραμμα Σχόλια
ΥΠΟΛΟΓΙΣΤΕΣ IΙ - ΔΟΜΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ
HELLO
WORLD
11 12
ΥΠΟΛΟΓΙΣΤΕΣ IΙ - ΔΟΜΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ
Μετάφραση του Μετάφραση του
13 14
Μετάφραση του
Οι υπόλοιπες εντολές
ΥΠΟΛΟΓΙΣΤΕΣ IΙ - ΔΟΜΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ
1 2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ, ΠΡΑΞΕΙΣ, ΜΕΤΑΒΛΗΤΕΣ
11 12
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ, ΠΡΑΞΕΙΣ, ΜΕΤΑΒΛΗΤΕΣ
Η διαίρεση γίνεται κατά το συνήθη τρόπο, δηλαδή και κατά συνέπεια το αποτέλεσμα θα είναι του
αν προκύψουν δεκαδικά ψηφία, αυτά παραμένουν ανώτερου τύπου.
στον αριθμό.
Οι τύποι δεδομένων ιεραρχούνται ως εξής:
Σημείωση: Κάποιοι μεταφραστές επιτρέπουν και το
υπόλοιπο διαίρεσης % ως πράξη, χωρίς αυτό όμως double Ανώτερος
να περιλαμβάνεται στο πρότυπο της γλώσσας. float
int Κατώτερος
13 14
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ, ΠΡΑΞΕΙΣ, ΜΕΤΑΒΛΗΤΕΣ
Όλες οι συναρτήσεις δέχονται ως όρισμα αριθμούς Για να υπολογίσουμε τον αριθμό π γράφουμε:
float ή double και επιστρέφουν αποτέλεσμα του
αντίστοιχου τύπου. Πχ. acos(-1.0)
17 18
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ, ΠΡΑΞΕΙΣ, ΜΕΤΑΒΛΗΤΕΣ
23 24
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ, ΠΡΑΞΕΙΣ, ΜΕΤΑΒΛΗΤΕΣ
Ποια
Ποια είναι
είναι ηη τιμή
τιμή των
των μεταβλητών
μεταβλητών n,
n, jj Ποια
Ποια είναι
είναι ηη τιμή
τιμή των
των μεταβλητών
μεταβλητών m,
m, kk
μετά
μετά από
από τις
τις εντολές:
εντολές: μετά
μετά από
από τις
τις εντολές:
εντολές:
nn == 10;
10; mm == 4;
4;
jj == ++n
++n %% 4;
4; kk == 2+
2+ m++;
m++;
Η n γίνεται 11 Η m γίνεται 5
Η j γίνεται 3 Η k γίνεται 6
31 32
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ, ΠΡΑΞΕΙΣ, ΜΕΤΑΒΛΗΤΕΣ
33 34
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ, ΠΡΑΞΕΙΣ, ΜΕΤΑΒΛΗΤΕΣ
Οι τιμές των μεταβλητών μπορούν να εμφανιστούν στην Εάν θέλουμε να αλλάξουμε γραμμή θα πρέπει να
οθόνη με την εντολή cout. Πχ. χρησιμοποιήσουμε το χαρακτήρα διαφυγής \n
Μηνύματα και μεταβλητές μπορεί να εμφανιστούν από Ο χαρακτήρας '\n' έχει το ειδικό όνομα endl που
την ίδια εντολή cout: μπορούμε να χρησιμοποιήσουμε:
cout << "Η τιμή είναι: " << x; cout << x << endl;
35 36
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ, ΠΡΑΞΕΙΣ, ΜΕΤΑΒΛΗΤΕΣ
pi = acos(-1.0);
e = 2*pi*r*h + 2*pi*r*r;
v = pi*r*r*h;
Παράδειγμα #7
#include <iostream>
using namespace std;
int main ( )
{
int sec, min, hour, ypolsec, ypolmin;
hour = min / 60 ;
ypolmin = min % 60 ;
cout << sec << " δευτερόλεπτα είναι: " << endl;
cout << hour << " ώρες " << endl;
cout << ypolmin << " λεπτά " << endl;
cout << ypolsec << " δευτερόλεπτα " << endl;
} 41
Τι χρειάζεται η εντολή if ;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
Η εντολή if επιτρέπει την επιλεκτική εκτέλεση
εντολών ελέγχοντας μια συνθήκη.
Εντολή if
1 2
Παράδειγμα #1 Παράδειγμα #1
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
#include <iostream>
using namespace std;
Κατασκευάστε
Κατασκευάστε πρόγραμμα
πρόγραμμα που
που θα
θα βρίσκει
βρίσκει το
το int main ( )
μεγαλύτερο από δύο ακέραιους a, b που θα
μεγαλύτερο από δύο ακέραιους a, b που θα {
// Οι δύο αριθμοί
εισάγονται
εισάγονται από
από το
το πληκτρολόγιο.
πληκτρολόγιο.
int a, b;
int max; // Ο μεγαλύτερος
if ( a > b )
max = a;
else
max = b;
cout << "Ο μεγαλύτερος είναι ο " << max << endl;
}
3 4
Συντακτικό της εντολής if 1/4 Τι συγκρίσεις μπορεί να γίνουν ;
Μεταξύ δύο μεταβλητών ή γενικότερα δύο παραστάσεων a και
if ( σύγκριση )
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
b μπορούν να γίνουν οι παρακάτω συγκρίσεις:
εντολή1 ;
else Σύγκριση Τι σημαίνει
εντολή2 ; a == b a=b
a != b a b
Παρατηρήσεις:
a > b a>b
• Οι εντολές γράφονται μερικά κενά (ή ένα tab) πιο δεξιά για
a < b a<b
ευκρίνεια.
• Δεν βάζουμε ερωτηματικό μετά τη σύγκριση ούτε μετά την a >= b a b
else.
• Το τμήμα else μπορεί να παραληφθεί οπότε η εντολή a <= b a b
γίνεται: Κάθε σύγκριση είναι είτε αληθής είτε ψευδής.
if ( σύγκριση ) Στη C++ το αληθές είναι ο ακέραιος 1 ενώ το ψευδές ο
εντολή ; ακέραιος 0
5 6
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
Σε περίπτωση που θέλουμε
εντολή ;
Εάν η σύγκριση είναι αληθής να εκτελεστούν
if ( σύγκριση ) εντολή ;
εκτελείται η εντολή1 και το περισσότερες από μια
..
εντολή1 ; πρόγραμμα συνεχίζει μετά την . εντολές είτε όταν η
εντολή2. σύγκριση είναι αληθής είτε
else
} else { όταν είναι ψευδής,
εντολή2 ; χρησιμοποιούμε άγκιστρα για
εντολή ;
Εάν η σύγκριση είναι ψευδής να ομαδοποιήσουμε τις
εντολή ;
εκτελείται η εντολή2. εντολές.
..
.
}
7 8
Συντακτικό της εντολής if 3/4 Συντακτικό της εντολής if 4/4
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
Σημαντική παρατήρηση:
if ( σύγκριση1 )
Η εντολή if από το σημείο που αρχίζει μέχρι το if ( σύγκριση2 ) {
σημείο που τελειώνει (συμπεριλαμβανομένων και εντολή ;
όλων των εντολών που περιέχει) εντολή ;
..
θεωρείται συντακτικά ως μία εντολή. .
Μία εντολή } else { Μία εντολή
εντολή ;
Αυτό έχει σημασία στα σημεία όπου το συντακτικό εντολή ;
της γλώσσας απαιτεί μία εντολή. ..
.
}
9 10
Παράδειγμα #2 Παράδειγμα #2
#include <iostream>
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
using namespace std;
Κατασκευάστε
Κατασκευάστε πρόγραμμα
πρόγραμμα πουπου θα
θα επιλύει
επιλύει την
την
int main ( )
εξίσωση πρώτου βαθμού
εξίσωση πρώτου βαθμού {
Ax+B=0
Ax+B=0 double a, b; // Οι συντελεστές
double x; // Η λύση
όταν
όταν δίνονται
δίνονται τα
τα ΑΑ και
και Β.
Β.
cout << "Εισάγετε τους συντελεστές \n";
cin >> a >> b;
Υπενθύμιση: Η λύση είναι αν
if ( a != 0 ) {
x = -b/a;
αλλιώς δεν υπάρχει λύση. cout << "Η λύση είναι " << x << endl;
} else
cout << "Δεν υπάρχει λύση \n";
}
11 12
Παράδειγμα #3 Παράδειγμα #3
Κατασκευάστε
Κατασκευάστε πρόγραμμα
πρόγραμμα πουπου θα
θα βρίσκει
βρίσκει τις
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
τις #include <iostream>
#include <cmath>
πραγματικές
πραγματικές λύσεις
λύσεις (αν
(αν υπάρχουν)
υπάρχουν) της
της using namespace std;
δευτεροβάθμιας εξίσωσης
δευτεροβάθμιας εξίσωσης
int main ( )
Ax22 +
Ax + Bx
Bx + +CC==0 0 {
όταν
όταν δίνονται
δίνονται τα
τα Α,
Α, BB και
και C.
C. double a, b, c; // Οι συντελεστές
double d; // Η διακρίνουσα
Υπενθύμιση: double x1, x2; // Οι λύσεις
13 14
Παράδειγμα #3 Παράδειγμα #3
…Συνέχεια …Συνέχεια
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
if ( a != 0 ) { // Eίναι εξίσωση 2ου βαθμού } else // Eίναι εξίσωση 1ου βαθμού
d = b*b-4*a*c; if ( b != 0 ) {
if ( d > 0 ) { x1 = -c/b;
x1 = (-b+sqrt(d))/(2*a); cout << "Υπάρχει μια λύση:\n";
x2 = (-b-sqrt(d))/(2*a); cout << x1 << endl;
cout << "Υπάρχουν δύο λύσεις:\n"; } else
cout << x1 << endl; cout << "Δεν υπάρχει λύση\n";
cout << x2 << endl; }
} else if ( d == 0 ) {
x1 = -b/(2*a);
cout << "Υπάρχει μία λύση:\n";
cout << x1 << endl;
} else
cout << "Δεν υπάρχουν λύσεις\n";
Συνεχίζεται…
15 16
Σύνθετες λογικές παραστάσεις Πίνακες αλήθειας ( && )
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
σύγκριση1 σύγκριση2 σύγκριση1 && σύγκριση2
παραστάσεις με τη χρήση των λογικών τελεστών
&& || ! Α Α Α
Α Ψ Ψ
if ( σύγκριση1 && σύγκριση2 ) Ψ Α Ψ
if ( σύγκριση1 || σύγκριση2 ) Ψ Ψ Ψ
if ( ! σύγκριση )
Πρακτικός κανόνας:
Το αποτέλεσμα μιας σύνθετης λογικής παράστασης Το τελικό αποτέλεσμα είναι αληθές όταν
είναι είτε αληθές είτε ψευδές και εξαρτάται από τις και οι δύο
επιμέρους συγκρίσεις. συγκρίσεις είναι αληθείς
17 18
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
σύγκριση1 σύγκριση2 σύγκριση1 || σύγκριση2
σύγκριση ! σύγκριση
Α Α Α Α Ψ
Α Ψ A Ψ Α
Ψ Α A
Ψ Ψ Ψ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
(-a/2,b/2) (a/2,b/2)
Ένα
Ένα παραλληλόγραμμο
παραλληλόγραμμο με με κέντρο
κέντρο την
την αρχή
αρχή των
των
αξόνων
αξόνων έχει
έχει πλευρές
πλευρές a,
a, b.
b. Βρείτε
Βρείτε αν
αν ένα
ένα σημείο
σημείο με
με
συντεταγμένες
συντεταγμένες x,x, yy βρίσκεται
βρίσκεται εντός
εντός του
του
(-a/2,-b/2) (a/2,-b/2)
παραλληλογράμμου.
παραλληλογράμμου.
Υπενθύμιση:
Παράδειγμα #4 Παράδειγμα #4
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
#include <iostream> …Συνέχεια
using namespace std; a2 = a/2;
b2 = b/2;
int main ( )
{ if ( x>=-a2 && x<=a2 && y>=-b2 && y<=b2 )
double a, b; // Τα μήκη των πλευρών cout << "Το σημείο είναι εντός\n";
double x, y; // Συντεταγμένες σημείου else
double a2, b2; // Το ήμισυ των πλευρών cout << "Το σημείο είναι εκτός\n";
}
cout << "Εισάγετε τα μήκη των πλευρών ";
cin >> a >> b;
23 24
Προτεραιότητες λογικών τελεστών Προτεραιότητες
Σε μια σύνθετη λογική παράσταση όπως πχ.
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
a>0 && b>0 || c!=2 Τελεστής Προτεραιότητα Προσεταιριστικότητα
η σειρά των λογικών πράξεων καθορίζεται από την ! ++ -- Υψηλή Από δεξιά προς αριστερά
προτεραιότητα των τελεστών. Για τελεστές ίδιας * / % Από αριστερά προς δεξιά
προτεραιότητας οι πράξεις γίνονται από αριστερά + - Από αριστερά προς δεξιά
προς τα δεξιά. < <= > >= Από αριστερά προς δεξιά
Τελεστής Προτεραιότητα == != Από αριστερά προς δεξιά
! Υψηλή
&&
&& Από αριστερά προς δεξιά
|| Χαμηλή
|| Από αριστερά προς δεξιά
= += -= *= /= %= Χαμηλή Από δεξιά προς αριστερά
Εάν υπάρχουν πράξεις σε παρενθέσεις, αυτές
γίνονται πάντα πρώτες.
25 26
Παράδειγμα #5 Παράδειγμα #5
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
Με
Με ποια
ποια εντολή
εντολή ifif μπορούμε
μπορούμε νανα διαπιστώσουμε
διαπιστώσουμε αν
αν if ( k%2 == 0 )
ένας … είναι άρτιος …
ένας ακέραιος
ακέραιος είναι
είναι άρτιος
άρτιος ήή περιττός
περιττός ;;
else
… είναι περιττός …
Υπενθύμιση:
27 28
Παράδειγμα #6 Παράδειγμα #6
#include <iostream>
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
using namespace std;
Κατασκευάστε
Κατασκευάστε πρόγραμμα
πρόγραμμα πουπου θα
θα αποφασίζει
αποφασίζει αν
αν int main ( )
ένα
ένα έτος
έτος είναι
είναι δίσεκτο
δίσεκτο ήή όχι.
όχι. {
int year;
Υπενθύμιση: if ( year%4 == 0 )
if ( year%100 == 0 )
Ένα έτος θεωρείται δίσεκτο όταν διαιρείται if ( year%400 == 0 )
cout << "Είναι δίσεκτο\n";
ακριβώς με το 4. Όμως από αυτά εξαιρούνται τα else
cout << "Δεν είναι δίσεκτο\n";
έτη που διαιρούνται με το 100, εκτός αν else
διαιρούνται με το 400. cout << " Είναι δίσεκτο \n";
else
cout << " Δεν είναι δίσεκτο \n";
29 } 30
Παράδειγμα #6 Παράδειγμα #7
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
Εναλλακτικά θα μπορούσαμε να γράψουμε:
Κατασκευάστε
Κατασκευάστε πρόγραμμα
πρόγραμμα πουπου θα
θα βρίσκει
βρίσκει τη
τη
γωνία
γωνία που
που σχηματίζει
σχηματίζει με
με τον
τον άξονα
άξονα xx ένα
ένα
if (year%4 == 0 && year%100 != 0 || year%400 == 0)
… είναι δίσεκτο …
διάνυσμα
διάνυσμα με
με συντεταγμένες
συντεταγμένες (x,y).
(x,y).
else Η
Η γωνία
γωνία να
να υπολογίζεται
υπολογίζεται σε
σε μοίρες
μοίρες και
και εντός
εντός του
του
… δεν είναι δίσεκτο …
διαστήματος [0,360).
διαστήματος [0,360).
31 32
Παράδειγμα #7 Παράδειγμα #7
(x,y)
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
(x,y)
φ=atan(y/x) φ= atan(y/x)+2π
φ
φ
φ
(x,y)
(x,y)
Η γωνία υπολογίζεται ως atan(y/x). Όμως:
φ= atan(y/x)+π
• Αν x=0 δεν μπορεί να γίνει η διαίρεση. φ
φ
• Σημεία συμμετρικά ως προς την αρχή των αξόνων έχουν την
ίδια εφαπτομένη.
• Η συνάρτηση atan επιστρέφει αποτέλεσμα στην περιοχή -π/2
έως π/2
• Το αποτέλεσμα επιστρέφεται σε ακτίνια και όχι σε μοίρες. (x,y) φ= atan(y/x)+π
33 34
Παράδειγμα #7 Παράδειγμα #7
…Συνέχεια
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
#include <iostream> if ( x==0 )
#include <cmath> if ( y > 0 )
using namespace std; phi = 90;
else if ( y < 0 )
int main ( ) phi = 270;
{ else
double x, y; // Συντεταγμένες σημείου phi = 0;
double pi; // Ο αριθμός π else
double phi; // Η γωνία if ( x > 0 )
if ( y >= 0 )
cout << "Δώστε το σημείο "; phi = atan(y/x)*180/pi;
cin >> x >> y; else
phi = atan(y/x)*180/pi+360;
pi = acos(-1.0); else
Συνεχίζεται… phi = atan(y/x)*180/pi+180;
cout << "Η γωνία είναι " << phi << " μοίρες\n";
35 } 36
Τι κάνει η εντολή switch
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
Η εντολή switch ελέγχει αν η τιμή μιας ακέραιας
μεταβλητής ισούται με κάποια σταθερά (από ένα
Εντολή switch πλήθος σταθερών) και ανάλογα εκτελεί
συγκεκριμένες εντολές.
37 38
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
case σταθερά1: • Η εντολή switch αποτελείται από μια σειρά από
εντολή ; εντολές και σημεία εισόδου (όπου υπάρχει case).
εντολή ;
..
.
• Ελέγχεται η ακέραια παράσταση με τις
break ; αντίστοιχες σταθερές στις case, και
case σταθερά2: προσδιορίζεται το σημείο εισόδου.
εντολή ;
εντολή ; • Κατόπιν εκτελούνται όλες οι εντολές μέχρι το
..
. τελικό άγκιστρο, ή μέχρι να βρεθεί break.
break;
default: • Εάν δεν ταιριάζει καμία case, τότε το σημείο
εντολή ; εισόδου είναι το default.
εντολή ; Μπορεί να παραληφθεί
.. • Το break μας βγάζει από την εντολή switch.
.
}
39 40
Παράδειγμα #8 Παράδειγμα #8
#include <iostream>
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
Κατασκευάστε
Κατασκευάστε πρόγραμμα
πρόγραμμα που
που θα
θα υπολογίζει
υπολογίζει το
το
#include <cmath>
using namespace std;
όγκο ενός από τα παρακάτω:
όγκο ενός από τα παρακάτω:
Ορθογώνιο
Ορθογώνιο παραλληλεπίπεδο
παραλληλεπίπεδο
int main ( )
{
Σφαίρα
Σφαίρα int n; // Επιλογή σχήματος
Κύλινδρος
Κύλινδρος double a, b, c; // Πλευρές ορθογωνίου
double pi; // Ο αριθμός π
double r, h; // Για τον κύλινδρο
double v; // Ο όγκος
Υπενθύμιση:
cout << "Επιλέξτε αντικείμενο: \n";
cout << "1. Ορθογώνιο παραλληλόγραμμο \n";
cout << "2. Σφαίρα \n";
cout << "3. Κύλινδρος \n";
41 Συνεχίζεται… 42
Παράδειγμα #8 Παράδειγμα #8
…Συνέχεια
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΗ if
…Συνέχεια
cin >> n; case 3:
switch (n) { cout << "Ακτίνα και ύψος ? \n";
case 1: cin >> r >> h;
cout << "Μήκη πλευρών ? \n"; pi = acos(-1.0);
cin >> a >> b >> c; v = pi*r*r*h;
v = a*b*c; cout << "Ο όγκος είναι: " << v << endl;
cout << "Ο όγκος είναι: " << v << endl; break;
break; default:
case 2: cout << "Λανθασμένη επιλογή. \n";
cout << "Ακτίνα σφαίρας? \n"; }
cin >> r; }
pi = acos(-1.0);
v = 4*pi*r*r*r/3;
cout << "Ο όγκος είναι: " << v << endl;
break;
Συνεχίζεται…
43 44
Εντολές επανάληψης
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
• while
Εντολές επανάληψης
• for
• do-while
1 2
Παράδειγμα #1
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
3 4
Παράδειγμα #1 Συντακτικό της εντολής while 1/2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
7 8
Παράδειγμα #1 (ξανά)
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
9 10
int main ( )
• Αρχική τιμή {
• Συνθήκη επανάληψης int n, k;
• Αύξηση της μεταβλητής
cout << "Εισάγετε το Ν ";
cin >> n;
11 12
Συντακτικό της εντολής for 1/2 Συντακτικό της εντολής for 2/2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
Πως λειτουργεί η εντολή for 1/2 Πως λειτουργεί η εντολή for 2/2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
Ελέγχεται η συνθήκη.
Γράφουμε:
Εάν η συνθήκη είναι αληθής εκτελείται η εντολή,
εκτελείται η αύξηση και το πρόγραμμα επιστρέφει • Μια εντολή για να αναθέσουμε αρχική τιμή.
στην for για να ελέγξει και πάλι τη συνθήκη. • Μια συνθήκη που όσο είναι αληθής γίνονται
επαναλήψεις.
Εάν η συνθήκη είναι ψευδής τερματίζεται η • Μια εντολή που αυξάνει ή μειώνει την τιμή της
λειτουργία της εντολής for. μεταβλητής.
15 16
Σχέση των εντολών for και while Παράδειγμα #2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
αρχική τιμή ; k = 0;
while ( συνθήκη ) { while ( k < 10 ) {
εντολή ; cout << k << endl ;
αύξηση ; ++k;
} }
17 18
Παράδειγμα #3 Παράδειγμα #3
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
21 22
Εντολή do-while
Παρατηρήσεις:
23 24
Συντακτικό της εντολής do-while 2/2 Πως λειτουργεί η εντολή do-while 1/2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
25 26
27 28
Παράδειγμα #5 Παράδειγμα #5
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
do {
cout << "Εισάγετε ένα θετικό ακέραιο "; cout << "Εισάγετε ένα θετικό ακέραιο ";
cin >> n; cin >> n;
if ( n <= 0 ) cout << "ΛΑΘΟΣ \n";
} while ( n <= 0 );
Πρακτικός κανόνας:
Στις ανωτέρω εντολές if και do-while γράφω την
ίδια συνθήκη.
29 30
Παράδειγμα:
Σημείωση:
for ( k=1 ; ; ++k ) { Το ζητούμενο άθροισμα είναι:
..
.
if ( … ) break;
}
31 32
Παράδειγμα #6 Παράδειγμα #7
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
Σημείωση:
Το άθροισμα συγκλίνει στο π/4.
Παρατήρηση:
Κάθε όρος έχει αντίθετο πρόσημο από τον
προηγούμενο.
33 34
Παράδειγμα #7 Παράδειγμα #8
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
s = 0;
p = 1.0; // Αρχικό πρόσημο
Σημείωση:
for ( k=1; k<=n ; k+=2 ) { Η ακολουθία αυτή συγκλίνει γρήγορα στην τιμή
s += p/k; // Άθροιση
p = -p; // Αλλαγή προσήμου
}
cout << s << endl;
}
35 36
Παράδειγμα #8 Παράδειγμα #9
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
Αλγόριθμος:
1. Χωρίζουμε το διάστημα [α,b] σε N ίσα υποδιαστήματα.
2. Υπολογίζουμε το εμβαδόν του κάθε ορθογωνίου παραλληλο-
γράμμου θεωρώντας ως ύψος την τιμή της συνάρτησης στο
μέσον του.
3. Αθροίζουμε όλα τα επιμέρους εμβαδά.
41 42
α b
Το 1o υποδιάστημα ξεκινάει στο: α
Το 2o υποδιάστημα ξεκινάει στο: α+h
Το 3o υποδιάστημα ξεκινάει στο: α+2h Ποιο είναι το συνολικό εμβαδόν ;
Το 4o υποδιάστημα ξεκινάει στο: α+3h
…
Το k υποδιάστημα ξεκινάει στο: α+(k-1)h
43 44
Παράδειγμα #10 Παράδειγμα #10
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
Υπολογίστε
Υπολογίστε προσεγγιστικά
προσεγγιστικά το
το διπλό
διπλό ολοκλήρωμα
ολοκλήρωμα
όταν
όταν δίνεται
δίνεται το
το xx και
και το
το Ν.
Ν. Παράδειγμα:
Υπενθύμιση:
Το ανωτέρω άθροισμα είναι η σειρά Taylor του ex
προηγούμενος προηγούμενος
3ος όρος 4ος όρος
όρος όρος
51 52
Παράδειγμα #12 Παράδειγμα #12
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ
int main ( )
{
double x, s, t;
int n, k;
s = 1.;
t = 1.;
for ( k=1; k<=n; ++k ) {
t *= x/k;
Αναδρομική σχέση με ένα προηγούμενο όρο. s += t;
}
Προσοχή: δεν ζητούνται οι επιμέρους όροι αλλά το άθροισμά τους. cout << s << endl;
}
53 54
s = 1;
t = 1; Υπενθύμιση:
e = 1.e-6; Το ανωτέρω άθροισμα αποτελεί μια προσέγγιση του
for ( k=1; abs(t)>=e; ++k ) {
t *= x/k;
s += t; για (διωνυμική σειρά)
}
cout << s << endl;
} 57 58
#include <iostream>
using namespace std;
int main ( )
{
int k, n;
double x, s, t;
s = 1;
t = 1;
for ( k=1; k<=n; ++k ) {
t = -t*x*(2*k-1)/(2*k);
s += t;
}
cout << s << endl;
}
61
Τι είναι οι πίνακες;
3.2 a
μνήμη
..
.
1 2
7 8
Ανάθεση τιμών στα στοιχεία πίνακα Ανάθεση τιμών στα στοιχεία πίνακα
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
11 12
Παράδειγμα #1 Παράδειγμα #1
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
Παράδειγμα #2 Παράδειγμα #2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
0 1.7000000 0.8805000
1 0.8500000 1.7305000
2 3.6000000 1.0195000
3 4.1720000 1.5915000
19 20
Παράδειγμα #3 Παράδειγμα #4
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
21 22
Παράδειγμα #4 Παράδειγμα #5
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
23 24
Παράδειγμα #5 Παράδειγμα #5
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
y
Οι συντελεστές α, b δίνονται από:
25 26
Παράδειγμα #5 Παράδειγμα #5
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
Θεωρήστε
Θεωρήστε ένα ένα σύστημα
σύστημα που που αποτελείται
αποτελείται από
από N N Το κέντρο μάζας είναι:
φορτισμένα
φορτισμένα σωματίδια,
σωματίδια, το το καθένα
καθένα με φορτίο qqi,i,
με φορτίο
και
και μάζα
μάζα mmi.i. Η
Η θέση
θέση του
του κάθε
κάθε σωματιδίου
σωματιδίου
προσδιορίζεται
προσδιορίζεται από από τις συντεταγμένες xxi,i, yyi,i, zzi.i.
τις συντεταγμένες
Βρείτε:
Βρείτε:
α)
α) το ολικό φορτίο του συστήματος
το ολικό φορτίο του συστήματος Η ηλεκτροστατική ενέργεια είναι:
β) το κέντρο μάζας του συστήματος
β) το κέντρο μάζας του συστήματος
γ)
γ) την
την ολική
ολική ηλεκτροστατική
ηλεκτροστατική ενέργεια
ενέργεια
29 30
qtot = 0; sx = sy = sz = sm = 0;
for ( k=0; k<n; ++k ) for ( k=0; k<n; ++k ) {
qtot += q[k]; sx += m[k]*x[k];
cout << "Το ολικό φορτίο είναι " << qtot << endl; sy += m[k]*y[k];
sz += m[k]*z[k];
Συνεχίζεται… sm += m[k];
}
xm = sx/sm;
ym = sy/sm;
zm = sz/sm;
cout << "Το κέντρο μάζας είναι "
<< xm << " " << ym << " " << zm << endl;
Συνεχίζεται…
33 34
e = 0;
for ( i=0; i<n-1; ++i )
for ( j=i+1; j<n; ++j ) {
Πίνακες χαρακτήρων
d = sqrt( pow(x[i]-x[j],2)+pow(y[i]-y[j],2)+
pow(z[i]-z[j],2) );
e += q[i]*q[j]/d;
}
cout << "Η ηλεκτροστατική ενέργεια είναι "
<< e << endl;
}
35 36
Μεταβλητές τύπου char Πίνακες χαρακτήρων (συμβολοσειρές)
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
39 40
Παράδειγμα #7 Παράδειγμα #7
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
• strcmp ( s1, s2 )
Για να χρησιμοποιήσουμε την ανωτέρω συνάρτηση πρέπει να
Συγκρίνει τις συμβολοσειρές s1 και s2 και επιστρέφει:
βάλουμε:
-1 αν η s1 είναι λεξικογραφικά μικρότερη από την s2.
0 αν η s1 είναι λεξικογραφικά ίση με την s2. #include <cstdio>
1 αν η s1 είναι λεξικογραφικά μεγαλύτερη από την s2.
Παράδειγμα #8 Παράδειγμα #8
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
Συνεχίζεται…
49 50
Παράδειγμα #9 Παράδειγμα #9
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
1)
1) Κεφαλαίοι
Κεφαλαίοι χαρακτήρες
χαρακτήρες #define MAX 100
2)
2) Μικροί
Μικροί χαρακτήρες
χαρακτήρες int main ()
3)
3) Αριθμητικά
Αριθμητικά ψηφία
ψηφία {
char str[MAX];
4) Σύμβολα
4) Σύμβολα int len; // Μήκος αλφαριθμητικού
int n1; // Πλήθος κεφαλαίων
υπάρχουν
υπάρχουν στη
στη συμβολοσειρά.
συμβολοσειρά. int n2; // Πλήθος μικρών
int n3; // Πλήθος ψηφίων
int n4; // Πλήθος σύμβόλων
int k;
…Συνέχεια
n1 = n2 = n3 = n4 = 0;
len = strlen(str);
for (k=0; k<len; ++k)
if (str[k]>='A' && str[k]<='Z')
++n1;
else if (str[k]>='a' && str[k]<='z')
++n2;
else if (str[k]>='0' && str[k]<='9')
++n3;
else
++n4;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
• Αυτόνομα τμήματα κώδικα (υποπρογράμματα) που
πραγματοποιούν μια καθορισμένη εργασία.
• Χρήσιμες για περιπτώσεις που ο ίδιος υπολογισμός
επαναλαμβάνεται πολλές φορές μέσα στο πρόγραμμα.
• Βοηθούν στην τμηματική ανάπτυξη και έλεγχο μεγάλων
Συναρτήσεις προγραμμάτων.
• Παράδειγμα: οι ενσωματωμένες συναρτήσεις sin, cos,
sqrt, abs, κλπ
• Κάθε συνάρτηση μπορεί να δέχεται ως είσοδο μία ή
περισσότερες μεταβλητές και μπορεί να επιστρέφει ένα
αποτέλεσμα (ή παραπάνω).
• Κάθε πρόγραμμα C++ αποτελείται από μία η περισσότερες
συναρτήσεις.
1 2
Παράδειγμα #1 Παράδειγμα #1
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
double convert ( double cm )
Κατασκευάστε
Κατασκευάστε συνάρτηση
συνάρτηση που
που θα
θα δέχεται
δέχεται
{
εκατοστά και θα τα μετατρέπει σε ίντσες. double inch;
εκατοστά και θα τα μετατρέπει σε ίντσες.
inch = cm/2.54;
Υπενθύμιση: return inch;
1 in = 2.54 cm }
Συνάρτηση
Είσοδος Έξοδος
convert
double cm
3 4
Παράδειγμα #1 Παράδειγμα #1 (πλήρες)
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
#include <iostream>
Η επικεφαλίδα της συνάρτησης: using namespace std;
int main ( )
double convert ( double cm ) {
double a, b;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
δηλώσεις #include
τύπος αποτελέσματος όνομα συνάρτησης ( παράμετροι ) πρωτότυπα συναρτήσεων Το κυρίως πρόγραμμα main
{ int main ( ) είναι μια συνάρτηση που
καλείται από το λειτουργικό
δηλώσεις τοπικών μεταβλητών {
… εντολές … σύστημα.
… εντολές …
}
return τιμή αποτελέσματος
}
συνάρτηση1
συνάρτηση2
7 8
Το πρωτότυπο της συνάρτησης Μεταβλητές της συνάρτησης
Οι μεταβλητές που ορίζονται εσωτερικά σε μια συνάρτηση
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
• Χρειάζεται έτσι ώστε ο μεταφραστής να
αποτελούν τοπικές μεταβλητές της συνάρτησης και δεν έχουν
γνωρίζει τι τύπου ορίσματα δέχεται η σχέση με μεταβλητές που έχουν το ίδιο όνομα σε άλλες
συνάρτηση και τι τύπου αποτέλεσμα συναρτήσεις.
επιστρέφει.
int main ( )
• Είναι ίδιο με την επικεφαλίδα της συνάρτησης {
χωρίς τα ονόματα των μεταβλητών. int k;
… … …
• Τα πρωτότυπα γράφονται πριν από το main } Διαφορετικές μεταβλητές
αλλά γενικά πριν χρησιμοποιήσουμε τις double abc ( double x ) (με διαφορετική τιμή)
συναρτήσεις. {
int k;
• Στο τέλος του πρωτότυπου μπαίνει
… … …
ερωτηματικό.
9
} 10
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
καλέσουμε. Πχ. η συνάρτηση
• Μια συνάρτηση μπορεί να επιστρέψει
double convert ( double cm )
αποτέλεσμα οποιουδήποτε από τους τύπους καλείται ως:
δεδομένων που χειρίζεται η γλώσσα (double, a = convert(b)
int, κλπ). • Οι μεταβλητές στην επικεφαλίδα της συνάρτησης (cm)
ονομάζονται τυπικές παράμετροι.
• Ο τερματισμός λειτουργίας της συνάρτησης και
• Οι μεταβλητές που δίνουμε κατά την κλήση (b) ονομάζονται
η επιστροφή του αποτελέσματος γίνεται με την πραγματικές παράμετροι ή ορίσματα της κλήσης. Το πλήθος
εντολή return. και οι τύποι των ορισμάτων κατά την κλήση πρέπει να
συμβαδίζουν με αυτά που δηλώθηκαν στο πρωτότυπο και
την επικεφαλίδα της συνάρτησης.
• Κάθε συνάρτηση μπορεί να κληθεί πολλές φορές με
διαφορετικά ορίσματα. Πχ:
x = convert(y)
11 q = convert(3*w-t) 12
Κλήση και επιστροφή της
συνάρτησης
Παράδειγμα #2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
Η κλήση και η επιστροφή της συνάρτησης γίνεται ως εξής:
Παράδειγμα #2 Παράδειγμα #3
#include <iostream>
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
#include <cmath>
using namespace std;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
double f ( double x )
Εμφανίστε
Εμφανίστε στην
στην οθόνη
οθόνη πίνακα
πίνακα τιμών
τιμών της
της
{
return (7*x*x-3*x+6)/sqrt(1+x*x); προηγούμενης
προηγούμενης συνάρτησης, από x=0 έως 10
συνάρτησης, από x=0 έως 10
} ανά 0.1
ανά 0.1
17 18
Παράδειγμα #4 Παράδειγμα #4
Αποτέλεσμα στην οθόνη:
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
#include <iostream>
#include <cmath>
#include <iomanip> 0.0 6.0000000
using namespace std; 0.1 5.7413646
0.2 5.5696982
double f ( double ); 0.3 5.4883446
0.4 5.4965820
int main ( ) 0.5 5.5901699
{ 0.6 5.7623525
double x; 0.7 6.0049700
0.8 6.3094200
cout << fixed; 0.9 6.6673485
for (x=0; x<=10; x+=0.1) 1.0 7.0710678
cout << setw(5) << setprecision(1) << x << " " 1.1 7.5137551
<< setw(10) << setprecision(7) << f(x) 1.2 7.9895013
<< endl; 1.3 8.4932709
} 1.4 9.0208168
1.5 9.5685784
… …
19 20
Συναρτήσεις που δεν επιστρέφουν
αποτέλεσμα
Παράδειγμα #5
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
Μια συνάρτηση μπορεί να μην επιστρέφει
αποτέλεσμα. Λέμε ότι είναι συνάρτηση τύπου void. Κατασκευάστε
Κατασκευάστε συνάρτηση
συνάρτηση πουπου θα
θα δέχεται
δέχεται ως
ως
είσοδο έναν ακέραιο n και θα εμφανίζει στην
είσοδο έναν ακέραιο n και θα εμφανίζει στην
Μια συνάρτηση που δεν επιστρέφει αποτέλεσμα οθόνη
οθόνη nn φορές
φορές τη
τη φράση:
φράση:
δεν καλείται με τον ίδιο τρόπο όπως οι άλλες Κατανοώ
Κατανοώ τη γλώσσα C++
τη γλώσσα C++
συναρτήσεις, αλλά η κλήση της μοιάζει με εντολή.
21 22
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
#include <iostream>
using namespace std;
Υπάρχουν συναρτήσεις που εκτελούν μια
void katanoo ( int ); // Πρωτότυπο συνάρτησης
συγκεκριμένη εργασία χωρίς να δέχονται
παραμέτρους.
int main ( )
{
int k;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
double golden ( )
{
Κατασκευάστε
Κατασκευάστε συνάρτηση
συνάρτηση που
που θα
θα υπολογίζει
υπολογίζει και
και return (sqrt(5.0)-1)/2;
θα επιστρέφει το λόγο της χρυσής τομής
θα επιστρέφει το λόγο της χρυσής τομής }
a = golden();
25 26
Παράδειγμα #7 Παράδειγμα #7
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
#include <iostream>
#include <cmath>
using namespace std;
Κατασκευάστε
Κατασκευάστε συνάρτηση
συνάρτηση που
που θα
θα δέχεται
δέχεται ως
ως
double metro ( double, double, double );
είσοδο τις τρεις καρτεσιανές συντεταγμένες
είσοδο τις τρεις καρτεσιανές συντεταγμένες ενόςενός
διανύσματος
διανύσματος καικαι θα
θα υπολογίζει
υπολογίζει το
το μέτρο
μέτρο του.
του.
int main ( )
{
double x, y, z;
cout << "Το μέτρο είναι " << metro(x,y,z) << endl;
}
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
Κατασκευάστε
Κατασκευάστε τη τη συνάρτηση
συνάρτηση
Μια συνάρτηση μπορεί να κληθεί είτε από το κυρίως double
double gonia ( double x1, double y1,
gonia ( double x1, double y1, double
double z1, z1,
πρόγραμμα main ή από οποιαδήποτε άλλη double
double x2, double y2, double z2
x2, double y2, double z2 ))
συνάρτηση. που
που θα
θα υπολογίζει
υπολογίζει τη τη γωνία
γωνία (σε
(σε μοίρες)
μοίρες) μεταξύμεταξύ δύο δύο
διανυσμάτων
διανυσμάτων rr11,, rr22 με
με συντεταγμένες
συντεταγμένες (x (x11,y
,y11,z
,z11)) και
και (x
(x22,y
,y22,z
,z22).
).
Υπενθύμιση:
Παράδειγμα #8 Παράδειγμα #8
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
double ginomeno ( double x1, double y1, double z1, double gonia ( double x1, double y1, double z1,
double x2, double y2, double z2 ) double x2, double y2, double z2 )
{ {
double m1, m2;
return x1*x2 + y1*y2 + z1*z2; double g, t, phi, mphi;
}
m1 = metro(x1,y1,z1);
m2 = metro(x2,y2,z2);
if ( m1*m2 == 0 )
mphi = 0;
else {
g = ginomeno(x1,y1,z1,x2,y2,z2);
t = g/(m1*m2);
if ( t > 1 ) t = 1;
if ( t < -1 ) t = -1;
phi = acos(t);
mphi = moires(phi);
}
return mphi;
31 } 32
Παράδειγμα #8 Παράδειγμα #8
Τι χρειάζονται οι εντολές:
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
#include <iostream>
#include <cmath>
using namespace std;
if ( t > 1 ) t = 1;
double metro ( double,double,double );
if ( t < -1 ) t = -1; double ginomeno ( double,double,double,double,double,double );
double gonia ( double,double,double,double,double,double );
double moires ( double );
Κάποιες φορές λόγω σφαλμάτων στρογγύλευσης μπορεί το t
(δηλαδή το cosφ) να υπολογιστεί ως: int main ( )
1.0000000000000001 {
double x1, y1, z1, x2, y2, z2;
Σε αυτή την περίπτωση η κλήση της συνάρτησης acos που
ακολουθεί θα δώσει λάθος. cout << "Εισάγετε συντεταγμένες ";
cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
Παράδειγμα #8 Παράδειγμα #9
Δίνεται
Δίνεται ηη συνάρτηση
συνάρτηση
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
Πως καλούνται οι συναρτήσεις στο παράδειγμα.
main Υπολογίστε
Υπολογίστε μια
μια προσέγγιση
προσέγγιση της
της πρώτης
πρώτης παραγώγου,
παραγώγου,
χρησιμοποιώντας
χρησιμοποιώντας τοντον ορισμό
ορισμό
gonia
χρησιμοποιώντας
χρησιμοποιώντας ένα
ένα μικρό
μικρό h.
h. Κατόπιν
Κατόπιν υπολογίστε
υπολογίστε την
την
παράσταση
παράσταση
metro ginomeno moires
35
για
για οποιοδήποτε
οποιοδήποτε xx ζητηθεί.
ζητηθεί. 36
Παράδειγμα #9 Παράδειγμα #9
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
Θα κατασκευάσουμε τρεις συναρτήσεις: double f ( double x )
{
• Για τη συνάρτηση f(x) return (x*x+2*x+6)/sqrt(1+x*x);
double f ( double x ) }
37 38
Παράδειγμα #9 Παράδειγμα #9
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
#include <iostream>
double phi ( double x ) #include <cmath>
{ using namespace std;
double fx, dx;
double f ( double );
fx = f(x); double deriv ( double );
dx = deriv(x); double phi ( double );
return (2*fx+dx)/(3*fx-dx);
} int main ( )
{
double x;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
• Κάθε συνάρτηση έχει τις δικές της μεταβλητές (τοπικές Οι καθολικές μεταβλητές δηλώνονται εκτός οποιασδήποτε
μεταβλητές). συνάρτησης.
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
• Εάν υπάρχει σε μια συνάρτηση δηλωμένη τοπική • Μια συνάρτηση μπορεί να καλέσει το εαυτό της. Όταν
μεταβλητή με το ίδιο όνομα με κάποια καθολική συμβαίνει αυτό έχουμε μια αναδρομική κλήση της
μεταβλητή, τότε στη συνάρτηση αυτή χρησιμοποιείται η συνάρτησης.
τοπική και όχι η καθολική μεταβλητή.
• Αναδρομική κλήση μπορούμε να έχουμε όταν μια
• Κατά συνέπεια η συνάρτηση αυτή δεν μπορεί να έχει συνάρτηση καλέσει τον εαυτό της μέσω κάποιας άλλης
πρόσβαση στην αντίστοιχη καθολική μεταβλητή. συνάρτησης. Πχ
Η συνάρτηση a καλεί την b
• Με τη χρήση καθολικών μεταβλητών μπορούμε να
Η συνάρτηση b καλεί την c
δώσουμε μεταβιβάσουμε τιμές στις συναρτήσεις, κάτι
όμως που αν γίνεται συστηματικά οδηγεί σε δυσνόητα Η συνάρτηση c καλεί την a
προγράμματα με δυσκολία στην εκσφαλμάτωση. • Στην πραγματικότητα δεν καλείται πάλι η ίδια συνάρτηση,
αλλά ένα δεύτερο (ή τρίτο…) αντίγραφό της, το οποίο
δημιουργείται αυτόματα όταν χρειαστεί.
43 44
Παράδειγμα #10 Παράδειγμα #10
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
Κατασκευάστε
Κατασκευάστε τη
τη συνάρτηση
συνάρτηση Με τον παραδοσιακό (όχι αναδρομικό τρόπο)
int
int parag ( int nn ))
parag ( int
που
που θα
θα υπολογίζει
υπολογίζει το
το nn παραγοντικό
παραγοντικό int parag ( int n )
{
int p, k;
p = 1;
for (k=2; k<=n; ++k)
p*=k;
return p;
}
45 46
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
• H C++ επιτρέπει τον ορισμό συναρτήσεων με το ίδιο
Χρησιμοποιώντας αναδρομικότητα:
όνομα, αλλά διαφορετικές παραμέτρους και λειτουργία,
Παρατηρούμε ότι n! = n (n-1)! στο ίδιο πρόγραμμα. Η τεχνική αυτή ονομάζεται
υπερφόρτωση συναρτήσεων.
int parag ( int n ) • Οι γνωστές μαθηματικές συναρτήσεις είναι ήδη
{ υπερφορτωμένες αφού μπορούν να κληθούν με ορίσματα
if ( n > 1 ) τύπου float ή double. Τα αντίστοιχα πρωτότυπα για την
sqrt θα ήταν:
return n*parag(n-1);
float sqrt ( float )
else double sqrt ( double )
return 1;
• Κατά την κλήση της συνάρτησης, ανάλογα με τον τύπο
}
των ορισμάτων ο μεταφραστής αποφασίζει ποια από τις
διαφορετικές εκδοχές της συνάρτησης θα καλέσει στην
47 πραγματικότητα. 48
Παράδειγμα #11 Παράδειγμα #11
Για την περίπτωση ακέραιων
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
Κατασκευάστε
Κατασκευάστε συνάρτηση
συνάρτηση ηη οποία
οποία θα
θα υπολογίζει
υπολογίζει int mod ( int a, int b )
το
το υπόλοιπο της διαίρεσης του a από τον
υπόλοιπο της διαίρεσης του a από τον b.
b. Η
Η
{
return a % b;
συνάρτηση
συνάρτηση θα θα πρέπει
πρέπει να
να καλείται
καλείται είτε
είτε με
με ακέραια
ακέραια }
ορίσματα
ορίσματα ήή με
με πραγματικούς
πραγματικούς διπλής
διπλής ακρίβειας.
ακρίβειας.
49 50
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
• Mε τον τελεστή (τύπος) μπροστά από μια παράσταση
double mod ( double a, double b ) αλλάζουμε την παράσταση στον δεδομένο τύπο. Ο τύπος
{ μπορεί να είναι int, float, double, char κλπ.
int p;
double y; • Έτσι με τον τελεστή (int) αλλάζουμε μια παράσταση σε
ακέραια. Τα δεκαδικά ψηφία αποκόπτονται.
p = (int) (a/b); // Ακέραιο πηλίκο a/b
y = a - p*b; // Το υπόλοιπο • Η αλλαγή τύπου έχει υψηλότερη προτεραιότητα από τις
return y; πράξεις. Πχ.
} (int)x+0.5
είναι διαφορετικό από το
(int)(x+0.5)
51 52
Παράδειγμα #11
Το κυρίως πρόγραμμα
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ
#include <iostream>
using namespace std;
int main ( )
{
int k;
double d;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
– τύπος
• Καθορίζει το μέγεθος στην μνήμη σε Bytes
– τιμή
ΔΕΙΚΤΕΣ • Η αριθμητική τιμή που αποθηκεύεται στην μνήμη
1 2
• Η ανάθεση της διεύθυνσης μιας μεταβλητής γίνεται κατα την • Μεταβλητή που «δείχνει» σε κάποια θέση μνήμης
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
εκτέλεση. Ο χρήστης δεν γνωρίζει που αποθηκεύεται. • Συστατικά δείκτη
– Τύπος
• Μήπως όμως θα ‘πρεπε; • Καθορίζει τι τύπου μεταβλητή έχει αποθηκευθεί εκεί που
δείχνει (π.χ. int ή double)
• Η C++ μας δίνει την δυνατότητα να γνωρίζουμε την διεύθυνση – Τιμή
μιας μεταβλητής, και να χρησιμοποιήσουμε αυτή την γνώση για • Μια διεύθυνση μνήμης
καλύτερο προγραμματισμό.
– Λίστες, βάσεις δεδομένων, γραφικά, λειτουργικά συστήματα
• Για να έχει νόημα ένας δείκτης θα πρέπει να «δείχνει» σε
κάποια υπάρχουσα μεταβλητή
• Δείκτης: μια νέα μεταβλητή, που αντί για αριθμητικές τιμές,
αποθηκεύει διευθύνσεις μνήμης
3 4
Δήλωση δείκτη Ανάθεση τιμών σε δείκτη
• Αναθέτουμε σε δείκτη την διεύθυνση μιας μεταβλητής. Η
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
• Χρησιμοποιείται ο τελεστής αστέρι «*» μεταβλητή αυτή πρέπει:
– Δυστυχώς είναι το ίδιο με τον τελεστή πολλαπλασιασμού, οπότε – να υπάρχει
θέλει προσοχή – να είναι του ίδιου τύπου
• Δηλώνεται όπως και οι απλές μεταβλητές αλλά με το αστέρι
μπροστά • Η ανάθεση γίνεται με τον τελεστή «&»
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
• Μια βασική λειτουργία/πράξη με δείκτες είναι: • Επιτρέπεται η απευθείας ανάθεση της διεύθυνσης ενός δείκτη
– ποια η τιμή της μεταβλητής εκεί πού δείχνει ένας δείκτης; σε άλλον δείκτη
– ...δηλαδή επιτρέπεται το «=»
• Ο τελεστής «*» χρησιμοποιείται για να μας δώσει την
αριθμητική τιμή στην θέση που δείχνει ο δείκτης
int main(){
int n, m;
int main(){ int *k, *j;
int n, m; n = 7; m = 8;
int *k, *j;
n = 7; m = 8; k = &n; j = k;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
• Μπορούμε να αναθέτουμε αριθμητική τιμή σε μεταβλητές Τα δύο παρακάτω μοιάζουν. Το ένα όμως είναι τραγικά λάθος.
– Απευθείας (όπως κάναμε μέχρι τώρα) Ποιο και γιατί;
– Μέσω δεικτών προς τις μεταβλητές αυτές
int main(){ int main(){
Τα δύο παρακάτω είναι ουσιαστικά ταυτόσημα
int n; int n;
int main(){ int main(){ int *k; int *k;
int n; int n;
int *k; int *k; k = &n; *k =7;
*k =7; k = &n;
k = &n; k = &n;
n = 7; *k =7; cout <<n<<*k<<endl; cout <<n<<*k<<endl;
} }
cout <<n<<*k<<endl; cout <<n<<*k<<endl;
Το δεύτερο: αναθέτει την τιμή 7 στην διεύθυνση όπου δείχνει ο δείκτης k,
} }
πριν όμως καθοριστεί το πού δείχνει ο k. Άρα κατά την εκτέλεση του *k =7,
9 10
το 7 θα αποθηκευτεί σε κάποια τυχαία θέση στην μνήμη... Πολύ κακό..!!
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
– Τελεστής «*»
int main(){
• Κατά την δήλωση του τύπου επισημαίνει ότι είναι δείκτης
int n1, n2, n3;
• Μέσα στο πρόγραμμα σημαίνει: «δώσε την τιμή στην διεύθυνση που int *k1, *k2;
δείχνει ο δείκτης»
– Τελεστής «&» k1 = &n1; θέση Α1 Α2 Α3 Α4 Α5
• «δώσε την διεύθυνση της μεταβλητής» k2 = &n2; όνομα n1 n2 n3 k1 k2
n1 = 5; τιμή 5 10 15 A1 A2
*k = m; Βάλε την τιμή της m εκεί όπου δείχνει ο k *k2 = 10;
m = *k; Δώσε στην m την τιμή στην οποία δείχνει ο k n3 = 15;
.
k = &m; Δώσε στον k την διεύθυνση του m .
}
• Προτεραιότητα: Οι τελεστές * και & έχουν την υψηλότερη
προτεραιότητα, μετά τους ++, --, - 11 12
– εάν δεν είμαστε σίγουροι, χρησιμοποιούμε παρενθέσεις
Παράδειγμα #1: Διάταξη μεταβλητών Παράδειγμα #1: Διάταξη μεταβλητών
και δεικτών στην μνήμη (2/3) και δεικτών στην μνήμη (3/3)
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
int main(){ int main(){
. .
. .
θέση Α1 Α2 Α3 Α4 Α5 θέση Α1 Α2 Α3 Α4 Α5
*K1 = 1; όνομα n1 n2 n3 k1 k2 k1 = &n3; όνομα n1 n2 n3 k1 k2
*K2 = 2; τιμή 1 2 15 A1 A2 *K1 = 11; τιμή 1 2 11 A3 A2
. .
. .
} }
13 14
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
using namespace std;
int main(){
• Τι είναι πίνακας;
double a1, a2;
double *b1, *b2; – Ομαδοποίηση μεταβλητών που καταλαμβάνουν διαδοχικές
a1,a2 θέσεις στην μνήμη
b1 = &a1; σωστή - -
b2 = &a2; σωστή - - • Στην C++ το όνομα του πίνακα (χωρίς τις αγκύλες) είναι ένας
*a1 = 33; λάθος: ο α1 δεν είναι δείκτης δείκτης προς την διεύθυνση του πρώτου στοιχείου
a1 = 22; σωστή 22 -
a2 = 20; σωστή 22 20 int main(){ int main(){
b2 = *a1; λάθος: το *α1 δεν έχει νόημα int n[10]; int n[10]; int *k;
b2 = a1; λάθος: ο b2 είναι δείκτης, o a1 μεταβλητή
b2 = 40; λάθος: ο b2 είναι δείκτης, οχι μεταβλητή n[0] = 100; k = n; (ή k = &n[0];)
b2 = b1; σωστή 22 20 . *k = 100;
*b2 = 40; σωστή 40 20 . .
*b1 = 30; σωστή 30 1520 } } 16
a2 = *b1; σωστή 30 30
Προσπέλαση πινάκων με δείκτες Ποιά η διαφορά δεικτών και πινάκων;
• Αφού γνωρίζουμε την διεύθυνση του πρώτου στοιχείου του • Πολύ μικρή. Στην πράξη, επιτρέπεται να χρησιμοποιούμε
πίνακα, μπορούμε να χρησιμοποιήσουμε μόνο δείκτες για την αγκύλες και στους δείκτες, σαν να ήταν πίνακες
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΕΙΚΤΕΣ
προσπέλασή του;
int main(){
int n[10]; int m, *k;
• Στην C++ επιτρέπεται η αριθμητική δεικτών
– τo k+1 «δείχνει» στην δεύτερη θέση (4 bytes παρακάτω εαν k=n;
δείχνει σε ακέραιο), το k+2 στην τρίτη, κοκ n[2] = 300;
int main(){ int main(){
int n[10]; int n[10]; int *k; m = n[2];
m = *(k+2); ισοδύναμες εκφράσεις
n[0] = 100; k = n; m = k[2];
n[1] = 200; *k = 100; }
n[2] = 300; *(k+1) = 200;
. *(k+2) = 300; • Η μόνη ουσιαστική διαφορά δείκτη και πίνακα;
} } – Στον δείκτη επιτρέπεται να αλλάξει τιμή: π.χ. k=k+1;
17 – Στον πίνακα δεν επιτρέπεται: το n=n+1; είναι λάθος 18
Δηλαδή, το k+1 ≡ &n[1]; k+2 ≡ &n[2]; κτλ
Λύση
int main(){
int n[100]; int *k;
k = n;
for (int i=0; i<100; ++i){
*k = 10 * i;
++k;
}
19
}
Κλήση συνάρτησης κατ’ αξία
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
• Μέχρι τώρα είδαμε την κλήση συνάρτησης «κατ’ αξία»
– Στην λίστα εισόδου μεταφέρονται μόνο οι τιμές των
μεταβλητών
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
• Εναλλακτικός τρόπος κλήσης συνάρτησης είναι «κατ’ αναφορά»
– Στην λίστα εισόδου μεταφέρονται οι διευθύνσεις των • Στην γενική περίπτωση στην λίστα εισόδου έχουμε
μεταβλητών (δηλαδή δείκτες) μεταβλητές και δείκτες
Παράδειγμα: συνάρτηση που μετατρέπει έναν αριθμό στο τύπος όνομα(τύπος *δείκτης, τύπος μεταβλητή, …){
τετράγωνό του εντολές;
void square(double *x){ return …;
*x = (*x) * (*x); }
}
• Το πρωτότυπο της συνάρτησης δηλώνεται όπως και πρίν
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
• Εάν καλούμε μια συνάρτηση από το κυρίως πρόγραμμα η
συνάρτηση που μετατρέπει πολικές συντεταγμένες σε καρτεσιανές
οποία δέχεται δείκτες, τότε πρέπει στην είσοδο να δώσουμε
διευθύνσεις • Οι πολικές συντεταγμένες ορίζονται από την ακτίνα ρ και την
γωνία θ
Παράδειγμα: συνάρτηση που μετατρέπει έναν αριθμό
στο τετράγωνό του.
Οι καρτεσιανές συντεταγμένες
#include <iostream> square (&x); δίνονται συναρτήσει των πολικών:
using namespace std; cout <<“στο τετράγωνο
y
x = ρ cos(θ)
int main(){ είναι” << x <<endl; y = ρ sin(θ)
} ρ
void square(double *x);
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
void polar_to_cartesian(double *r, double *t);
int main(){ Η συνάρτηση να δέχεται δύο ρητούς και να ανταλλάσσει τις τιμές
double r, t; τους
cout << “δώσε πολικές συντεταγμένες” << endl; (θα μας χρειαστεί αργότερα για ταξινόμηση)
cin >> r >> t;
void swap(double *x, double *y){
polar_to_cartesian(&r, &t); double z = *x ;
cout << “σε καρτεσιανές είναι” << r << t << endl; *x = *y ;
} *y = z ;
}
void polar_to_cartesian(double *r, double *t){
double x = (*r) * cos(*t);
double y = (*r) * sin(*t);
*r = x; *t = y;
}
7 8
Συνάρτηση που δέχεται πίνακες Παράδειγμα #3: Μέγιστο πίνακα
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
• Για να περάσουμε έναν πίνακα σε μια συνάρτηση αρκεί να double xmax (double *x, int n){
περάσουμε: double m = x[0];
– την διεύθυνση του πρώτου στοιχείου (δηλαδή δείκτης) for (int i = 1; i < n; ++i)
– το πλήθος των στοιχείων του πίνακα (δηλαδή ακέραιος) if(x[i] > m) m = x[i];
• εάν είναι πολυδιάστατος, τότε περνάμε τα ανάλογα πλήθη return m;
}
• Μέσα στην συνάρτηση χρησιμοποιούμε αριθμητική δεικτών και ένα πρόγραμμα που το καλεί
για να προσπελάσουμε όλα τα στοιχεία του πίνακα
#include <iostream>
– Υπενθυμίζεται ότι το *(k+i) και το k[i] είναι ταυτόσημα
using namespace std;
double xmax(double *x, int n);
• Για παράδειγμα, για να περάσουμε έναν πίνακα ρητών x με n int main(){
στοιχεία, η συνάρτηση θα δηλωθεί ως int n; double x[1000];
τύπος όνομα (double *x, int n){ cout << “πόσα στοιχεία θα εισάγετε” << endl;
εντολές; cin >> n;
return …; for (int i=0; i<n; ++i) cin >> x[i];
} cout << “το μέγιστο είναι” << xmax(x, n); << endl;
9 } 10
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
Ορίστε συνάρτηση που γυρνάει τον Ορίστε συνάρτηση που δέχεται δύο πίνακες (και το πλήθος των
μέσο όρο των στοιχείων ενός πίνακα στοιχείων τους) και επιστρέφει το εσωτερικό τους γινόμενο
έστω πίνακες x[i] και y[i], με i=0, 1, 2, … n-1
To εσωτερικό γινόμενο P:
double average (double *x, int n){
i <n
if (n == 0) return 0; P = ∑ x [i ] * y [i ]
i =0
double s = 0 ;
for (int i = 0 ; i<n ; i++) s += x[i];
double array_product (double *x, double *y, int n){
return s/n ;
double p = 0;
}
for (int i = 0; i < n; ++i) p += x[i] * y[i];
return p;
}
11 12
Παράδειγμα #6: σύστημα n σωματιδίων Παράδειγμα #7: σύστημα n σωματιδίων
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΣΥΝΑΡΤΗΣΕΙΣ ΙΙ
Έστω σύστημα n σωματιδίων, με τις συντεταγμένες τους Έστω σύστημα n σωματιδίων, με τις συντεταγμένες τους
αποθηκευμένες σε τρεις πίνακες: x, y, z. Γράψτε συνάρτηση που αποθηκευμένες σε τρεις πίνακες: x, y, z. Γράψτε συνάρτηση που
δέχεται τους τρεις πίνακες και έναν ακέραιο i, έτσι ώστε να δέχεται τους τρεις πίνακες, το πλήθος των στοιχείων τους n, και
υπολογίζει την απόσταση του σωματιδίου i από την αρχή των έναν ακέραιο i, έτσι ώστε να υπολογίζει την μέση απόσταση του
αξόνων σωματιδίου i απο τα άλλα σωματίδια.
double dist_ave (double *x, double *y, double *z, int n, int i){
double dist (double *x, double *y, double *z, int i){
double d = sqrt(x[i]*x[i] + y[i]*y[i] + z[i]*z[i]); if (n < 2) return 0;
return d;
} double s = 0;
for (int j = 0; j<n; ++j)
if (j != i)
s += sqrt( pow(x[i]-x[j], 2) +
pow(y[i]-y[j], 2) + pow(z[i]-z[j], 2) );
return s/(n-1);
13 } 14
πέρα απο απλές μεταβλητές...
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
– int (ακέραιος, 4 bytes)
– double (ρητός διπλής ακρίβειας, 8 bytes)
1
• Είναι βολικό να δημιουργήσουμε νέες, πολυσύνθετες μεταβλητές
2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
– Ορίζεται απο τον προγραμματιστή double y;
– Εμπεριέχει οποιοδήποτε αριθμό και συνδιασμό άλλων double z;
μεταβλητών διαφόρων τύπων };
• Στο «όνομα» χρησιμοποιούμε κάτι που είναι περιγραφικό.
• Στην δήλωση μιας δομής χρησιμοποιείται η δευσμευμένη λέξη
της C++: struct • Επιλέξαμε «vector». Στο εξής, το vector καθιστά νέο τύπο
– δηλαδή, στο εξή υπάρχουν: int, double, vector
• Γενικός τρόπος δήλωσης
• Μέσα στο σώμα της δομής, ορίζουμε τα μέλη της δομής
struct όνομα{
τύπος μεταβλητή1 ; – τύπο και όνομα
τύπος μεταβλητή2 ; – χρησιμοποιούμε ονόματα που είναι περιγραφικά
. – για τις x,y,z συνιστώσες, χρησιμοποιούμε απλά x, y, z.
.
3
}; • Ο ορισμός δομής είναι εντολή, άρα τελειώνει με ερωτηματικό 4
Δήλωση μεταβλητών δομής Προσπέλαση μελών δομής
• Πράξεις επιτρέπονται μόνο μεταξύ απλών μεταβλητών
• Ο ορισμός της δομής γίνεται πρίν την main. – δηλαδή μεταξύ των μελών της δομής
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
• Στο κυρίως πρόγραμμα δηλώνουμε μια μεταβλητή δομής
όπως και στις απλές μεταβλητές • Πως όμως φτάνουμε στα απλά μέλη της δομής;
– Π.χ. Για να δηλώσουμε δύο διανύσματα: – χρησιμοποιούμε τον τελεστή της τελείας «.»
#include <iostream> – χρησιμοποιούμε τα ίδια σύμβολα με αυτά που ορίσαμε
using namespace std; • Π.χ. για ανάθεση τιμών σε διάνυσμα
• Μπορούμε να εισάγουμε και κατευθείαν απο το πληκτρολόγιο • Μόνο η πράξη «=» επιτρέπεται μεταξύ μεταβλητών της ίδιας δομής.
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
Παράδειγμα: – γίνεται μια προς μια αντιγραφή των μελών της μιας στην άλλη
cout<<“εισάγετε τις συνιστώσες διανύσματος”<< endl; cin >> v.x >> v.y >> v.z;
cin >> v.x >> v.y >> v.z; u = v;
cout << u.x <<“ “<< u.y <<“ “<< u.z << endl;
• Μπορούμε να εξάγουμε τιμές στην οθόνη
• Στην πράξη, αυτό που εκτελείται είναι
Παράδειγμα:
cout<<“οι συνιστώσες του διανύσματος είναι”<< endl; cin >> v.x >> v.y >> v.z;
cout << u.x <<“ “<< u.y <<“ “<< u.z << endl; u.x = v.x;
u.y = v.y;
u.z = v.z;
ΠΡΟΣΟΧΗ: οι συναρτήσεις cout και cin δέχονται μόνο απλές cout << u.x <<“ “<< u.y <<“ “<< u.z << endl;
μεταβλητές, ΟΧΙ δομές. Τα παρακάτω είναι ΛΑΘΟΣ:
cin >> v;
Cout << u; 7 • Καμία άλλη πράξη, π.χ. «+, -, *, /» δεν επιτρέπεται 8
Παράδειγμα #1: πρόσθεση
διανυσμάτων Άλλα παραδείγματα δομών
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
using namespace std; • Σημαντικό να περιγράφουν το μέγεθος στο οποίο αντιστοιχούν
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
• Όπως και στις απλές μεταβλητές, μπορούμε να ορίσουμε #include <iostream>
πίνακα απο τις νέες μεταβητές using namespace std;
• Η προσπέλαση γίνεται πάλι με την τελεία, αμέσως μετά την struct vector {double x, y, z;};
δεικτοδότηση του πίνακα
int main(){
int n; vector v[1000];
• Παράδειγμα: δήλωση πίνακα με 1000 διανύσματα cout << "εισάγετε τον αριθμό διανυσμάτων“ << endl;
int main(){ cin >> n;
vector v[1000];
v[0].x = 3.0; v[0].y = 4.0; v[0].z = 5.0; if(n==0) cout << ”ο μέσος όρος είναι 0” << endl;
v[1].x = 3.0; v[1].y = 4.0; v[1].z = 5.0; else if (n > 1000) cout << “πιό λίγα διανύσματα” <<endl;
. else {
. for (int i=0; i<n; ++i)
11 12
} cin >> v[i].x >> v[i].y >> v[i].z;
Παράδειγμα #2: μέσος όρος του
μέτρου διανυσμάτων (2/2)
Δομές μέσα σε δομές
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
double s = 0;
• Με την σειρά της, μια δομή μπορεί να αποτελέσει μέλος μιας
for (int i=0; i<n; ++i) πιο σύνθετης δομής.
s += sqrt(v[i].x * v[i].x + – Παράδειγμα: ιόν με θέση, μάζα και φορτίο
v[i].y * v[i].y +
v[i].z * v[i].z); struct vector {
double x, y, z;
cout << ”ο μέσος όρος είναι” << s/n << “\n”; };
}
} struct ion{
vector r;
double m, q;
};
Παράδειγμα #3: Δομή για ιόντα (1/2) Παράδειγμα #3: Δομή για ιόντα (2/2)
if (n < 1 || n > 1000) return 1;
Πρόγραμμα που διαβάζει n ιόντα, και υπολογίζει τη συνολική μάζα
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
και φορτίο, και τη μέση απόσταση απο την αρχή των αξόνων for (int i=0; i<n; ++i)
#include <iostream> cin >> a[i].r.x >> a[i].r.y >> a[i].r.z >>
using namespace std; a[i].m >> a[i].q;
cout << "εισάγετε τον αριθμό των ιόντων“ << endl; cout << ”η συνολική μάζα είναι” << sm << endl;
cin >> n; cout << ”το συνολικό φορτίο είναι” << sq << endl;
15
cout << ”η μέση απόσταση είναι” << sd/n << endl; 16
}
Παράδειγμα #4: πράξεις με μιγαδικούς
Παράδειγμα #4: πράξεις με μιγαδικούς (1/2)
Πρόγραμμα που διαβάζει δύο μιγαδικούς, και τυπώνει το #include <iostream>
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
άθροισμα, την διαφορά, και το γινόμενό τους using namespace std;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
zprod.real = z1.real*z2.real - z1.imag*z2.imag;
• Παράδειγμα, ο πολλαπλασιασμός:
zprod.imag = z1.real*z2.imag + z1.imag*z2.real;
– Σε διανύσματα, το εσωτερικό γινόμενο είναι ρητός
r r
cout << “το άθροισμα είναι” << endl;
cout << zsum.real << “ ” << zsum.imag << endl;
a ⋅ b = a x b x + a y b y + a z b z = ρητός αριθμός
cout << “η διαφορά είναι” << endl; – Σε μιγαδικούς, το γινόμενο είναι μιγαδικός
z~1 ⋅ z~2 = (z 1r + iz 1i ) ⋅ (z 2r + iz 2 i ) =
cout << zdif.real << “ ” << zdif.imag << endl;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
όπως και με τις απλές μεταβλητές w.x = v.x + u.x;
– Στην λίστα εισόδου μπορούμε να έχουμε δομές w.y = v.y + u.y;
– Στην έξοδο μπορούμε να έχουμε δομή w.z = v.z + u.z;
– Οι πράξεις μέσα στην συνάρτηση γίνονται όπως είδαμε πριν με return w;
τον τελεστή της τελείας «.» }
vector dif (vector v, vector u){
• Παράδειγμα: συνάρτηση που υπολογίζει το μέτρο διανύσματος vector w;
w.x = v.x - u.x;
double magnitude (vector v){ w.y = v.y - u.y;
double d = sqrt(v.x*v.x + v.y*v.y + v.z*v.z); w.z = v.z - u.z;
return d; return w;
} }
double product (vector v, vector u){
21 return v.x*u.x + v.y*u.y + v.z*u.z; 22
}
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
– μια απλούς ρητούς return x + y; καθώς και και το εσωτερικό τους γινόμενο.
} #include <iostream>
using namespace std;
complex sum (complex z1, complex z2){
complex z3;
struct vector {double x, y, z;};
z3.real = z1.real + z2.real;
– για μιγαδικούς
z3.imag = z1.imag + z2.imag;
vector sum (vector, vector);
return z3;
vector dif (vector, vector);
}
double product (vector, vector);
vector sum (vector v, vector u){ double magnitude (vector);
vector w;
w.x = v.x + u.x; int main(){
– για διανύσματα w.y = v.y + u.y; vector v, u;
w.z = v.z + u.z; cout <<“εισάγετε συνιστώσες 2 διανυσμάτων”<< endl;
return w; 23 cin >> v.x >> v.y >> v.z; 24
} cin >> u.x >> u.y >> u.z;
Παράδειγμα #6: Πλήρες πρόγραμμα για Μια συνάρτηση μπορεί να καλεί άλλη
πράξεις με διανύσματα (2/2) συνάρτηση
Παράδειγμα: συνάρτηση που υπολογίζει τη γωνία μεταξύ δύο
διανυσμάτων
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
r
cout << “τα μέτρα των διανυσμάτων είναι” << endl;
r r r r ⎛ ar ⋅b ⎞
cout << magnitude(v) <<“ ” << magnitude(u) << endl; a ⋅b =| a | ⋅ | b | ⋅ cos θ ⇒ θ = a cos⎜⎜ r r ⎟⎟
cout << “το μέτρο του αθροίσματος είναι” << endl; ⎝ | a | ⋅ |b | ⎠
cout << magnitude( sum(v, u) ); double angle (vector a, vector b){
double theta, m1, m2;
cout << “το μέτρο της διαφοράς είναι” << endl; m1 = magnitude(a);
cout << magnitude( dif(v, u) ); m2 = magnitude(b);
25 return theta; 26
}
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
σε μεταβλητή δομής χρησιμοποιώντας τον τελεστή αστέρι «*».
– Παράδειγμα: μέσος όρος των μέτρων ενός πίνακα
– Ο δείκτης είναι η διεύθυνση του πρώτου στοιχείου της δομής
διανυσμάτων
– παράδειγμα, δείκτης σε διάνυσμα
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
#include <iostream> σε κάθε ιόν
#include <cmath>
using namespace std; • Θα χρειαστούμε:
struct vector {double x, y, z;}; – Την δομή για ιόντα
double ave_magn(vector *, int); – Συνάρτηση για κέντρο μάζας
– Συνάρτηση για απόσταση δύο ιόντων
int main(){
– Συνάρτηση για ηλεκτροστατική ενέργεια ενός ιόντος
int n; vector v[1000];
cout << "εισάγετε τον αριθμό διανυσμάτων“ << endl; – Συνάρτηση για την συνολική δύναμη που νοιώθει ένα ιόν
cin >> n;
n −1 qq n −1 q i q j (x j − x i )
E j = ∑ r i jr F jx = ∑
if(n==0 || n>1000) return 1;
for (int i=0; i<n; ++i) cin>>v[i].x>>v[i].y>>v[i].z; r r
i =0 | r j − ri | i =0 | r j − ri |3
cout << ave_magn(v, n) <<endl; i≠j i≠j
29 30
}
Παράδειγμα #8: συναρήσεις για ιόντα Παράδειγμα #8: συναρήσεις για ιόντα
(1/5) (2/5)
• Συνάρτηση για κέντρο μάζας
μx =
∑i x i m i
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
• Δομή για ιόντα
∑i m i
vector centermass (ion *a, int n){
vector cm; double m;
struct vector { double x, y, z; };
struct ion { vector r; double m, q; }; cm.x = cm.y = cm.z = m = 0;
for (int i=0; i<n; ++i){
cm.x += a[i].r.x * a[i].m;
• Συνάρτηση για κέντρο μάζας cm.y += a[i].r.y * a[i].m;
– Το κέντρο μάζας έχει x, y, z συντεταγμένες ⇒ vector cm.z += a[i].r.z * a[i].m;
m += a[i].m;
– Στην είσοδο δέχεται πίνακα με ιόντα
}
– Υπολογίζει και τις τρεις συνιστώσες cm.x = cm.x / m;
cm.y = cm.y / m;
μx =
∑i x i mi , ... και παρόμοια για μ , μ cm.z = cm.z / m;
∑i m i
y z
return cm;
31 32
}
Παράδειγμα #8: συναρήσεις για ιόντα Παράδειγμα #8: συναρήσεις για ιόντα
(3/5) (4/5)
• Συνάρτηση για απόσταση δύο διανυσμάτων r r • Συνάρτηση για ηλεκτροστατική ενέργεια ενός ιόντος
d =| v − u |
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
double dist (vector v, vector u){ n −1 q q
Ej =∑ r r
i j
return sqrt( pow(v.x-u.x, 2) +
pow(v.y-u.y, 2) + i =0 | r j − ri |
pow(v.z-u.z, 2)); i≠j
}
double energy (ion *a, int n, int j){
• ή με τις συναρτήσεις dif και magnitude double e = 0;
double dist (vector v, vector u){ for (int i=0; i<n; ++i) if(i != j)
return magnitude( dif(v, u) ); e += a[i].q * a[j].q / dist(a[j].r, a[i].r);
}
return e;
}
33 34
Παράδειγμα #8: συναρήσεις για ιόντα Παράδειγμα #8: πρόγραμμα για ιόντα
(5/5) n −1 q q ( x − x ) (1/3)
Fj = ∑
x i j j i
• Hλεκτροστατική δύναμη πάνω σε ιόν r r
i =0 | r j − ri |3 • Πλήρες πρόγραμμα για ιόντα
vector force (ion *a, int n, int j){ i≠j
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
vector f, fi; #include <iostream>
f.x = f.y = f.z = 0; #include <cmath>
for (int i=0; i<n; ++i) if(i != j){ using namespace std;
fi.x = a[i].q*a[j].q * (a[j].r.x - a[i].r.x)/
pow( dist(a[j].r, a[i].r), 3); struct vector { double x, y, z; };
struct ion { vector r; double m, q; };
fi.y = a[i].q*a[j].q * (a[j].r.y - a[i].r.y)/
pow( dist(a[j].r, a[i].r), 3); vector sum (vector, vector);
vector dif (vector, vector);
fi.z = a[i].q*a[j].q * (a[j].r.z - a[i].r.z)/ double magnitude (vector);
pow( dist(a[j].r, a[i].r), 3); double dist (vector, vector);
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
vector f, m;
for (int i=0; i<n; ++i){
cout << "εισάγετε τον αριθμό των ιόντων“ << endl;
cout << “το ιόν” << i << “έχει ενέργεια” <<endl;
cin >> n; cout << energy(a, n, i);
if (n < 1 || n > 1000) return 1; f = force(a, n, i);
cout << “και υφίσταται δύναμη” << endl;
for (int i=0; i<n; ++i) cout << f.x <<“ ”<< f.y <<“ ”<< f.z << endl;
cin >> a[i].r.x >> a[i].r.y >> a[i].r.z >> }
a[i].m >> a[i].q; }
m = centermass(a, n);
cout << “το κέντρο μάζας έχει συντεταγμένες” <<endl;
cout << m.x <<“ ”<< m.y <<“ ”<< m.z <<endl;
37 38
συνεχίζεται...
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
κώδικα μοριακής δυναμικής: – Ανάπτυγμα Taylor για την απόσταση
– ιόντα, λόγω των μεταξύ τους δυνάμεων εκτελούν τροχιές r r r 1r
στον χώρο r (t + Δt ) = r (t ) + v (t )Δt + a (t )( Δt )2
• Χρειαζόμαστε για κάθε ιόν: 2
– Θέση (διάνυσμα)
– Μάζα (ρητός) – Ανάπτυγμα για την ταχύτητα
– Φορτίο (ρητός) r r r
– Ταχύτητα (διάνυσμα) v (t + Δt ) = v (t ) + a (t )Δt
– Επιτάχυνση (διάνυσμα)
• Η πλήρης δομή για ένα ιόν – ΣΗΜΕΙΩΣΗ: εφαρμόζοντας αυτούς τους τύπους επιτυγχάνουμε
λύση με ακρίβεια πρώτης τάξης, όχι ικανοποιητική. Με μικρή
struct vector { double x, y, z; }; τροποποίηση μπορούμε να επιτύχουμε ακρίβεια δεύτερης
struct ion { vector r, vel, acc; double m, q; };
39 τάξης, αλλά δεν είναι επι του παρόντως. 40
Παράδειγμα #9: μοριακή δυναμική:
Παράδειγμα #9: μοριακή δυναμική:
συνάρτηση για πολλαπλασιασμό
η στιγμιαία επιτάχυνση σε κάθε ιόν
διανύσματος με ρητό
r
Θα χρειαστεί να πολλαπλασιάσουμε διάνυσμα με ρητό. Π.χ. v ⋅ dt Χρειαζόμαστε μια συνάρτηση για να υπολογίζει την στιγμιαία
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
Χρειαζόμαστε μια συνάρτηση για να το κάνει αυτό επιτάχυνση σε κάθε ιόν
vector mult(vector r, double f){ ⎧x → x ⋅ f
r.x *= f; r.y *= f; r.z *= f; r ⎪ r
r ⋅ f ⇒ ⎨y → y ⋅ f r
}
return r;
⎪ z → z ⋅f a i = f i / mi
⎩
Υπάρχει πάντα η πιθανότητα κάποιος να την καλέσει λάθος, εισάγοντας πρώτα void acceleration (ion *a, int n){
τον ρητό και μετά το διάνυσμα. Για να μην προκαλέσει λάθος αυτό, μπορούμε
να υπερφορτώσουμε την συνάρτηση δηλώνοντάς την δεύτερη φορά. for (int i=0; i<n; ++i)
a[i].acc = mult( force(a,n,i), 1.0/a[i].m);
vector mult(double f, vector r){
r.x *= f; r.y *= f; r.z *= f; }
return r;
}
41 42
Τώρα όπως και να την καλέσει κανείς, είναι σωστό!
Χρειαζόμαστε μια συνάρτηση για να υπολογίζει την νέα ταχύτητα Χρειαζόμαστε μια συνάρτηση για να υπολογίζει την νέα θέση του
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
του κάθε ιόντος κάθε ιόντος
r r r 1r
r r r r (t + Δt ) = r (t ) + v (t )Δt + a (t )( Δt )2
v (t + Δt ) = v (t ) + a (t )Δt 2
void position (ion *a, int n, double dt){
void velocity (ion *a, int n, double dt){
for (int i=0; i<n; ++i){
for (int i=0; i<n; ++i){
vector r1 = mult( a[i].vel , dt);
vector v1 = mult( a[i].acc, dt ); vector r2 = mult( a[i].acc , 0.5*dt*dt);
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
των ιόντων είναι πολύ απλό: – Επειδή η τελεία έχει μεγαλύτερη προτεραιότητα, απαραίτητες
είναι οι παρενθέσεις
int main(){ vector v, *p;
int n, nsteps; p = &v;
ion a[1000]; cin >> (*p).x >> (*p).y >> (*p).z;
double dt;
το *(p.x) όπως και το p.x δεν έχουν νόημα καθώς το p είναι δείκτης
.
.
for (int j=0; j<nsteps; ++j){ • Πιο συμπαγής συμβολισμός
acceleration (a, n); – η C++ μας προσφέρει έναν πιο συμπαγή συμβολισμό με τον
position (a, n, dt); τελεστή του βέλους «->»
velocity (a, n, dt);
vector v, *p;
}
p = &v;
.
cin >> p->x >> p->y >> p->z;
. 45 46
} – Το βέλος «δείχνει» στα «συστατικά» της δομής
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
κατόπιν την τελεία, όσες φορές χρειαστεί.
– Λύση είναι να εισάγουμε έναν δείκτη προς την δομή
struct vector { double x, y, z; }; – Παράδειγμα, η συνάρτηση sum για πρόσθεση δύο διανυσμάτων
struct ion { vector r; double m, q; };
int main(){ vector sum (vector *v, vector *u){
ion a, *p; vector w;
w.x = v->x + u->x;
p = &a; w.y = v->y + u->y;
p->r.x = 3.0; w.z = v->z + u->z;
p->r.y = 4.0; return w;
p->r.z = 5.0; }
p->m = 6.0;
p->q = 7.0; – Στο κυρίως πρόγραμμα θα καλεστεί
. int main(){
. vector v, u, w;
47 48
} w = sum (&v, &u);
Πίνακας δομής και δείκτες
• Όπως και στην περίπτωση των απλών μεταβλητών, ένας πίνακας
έχει πολλά κοινά με έναν δείκτη
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΔΟΜΕΣ
p = v;
ταυτόσημα
p = &v[0];
v[2].x = 3;
(p+2)->x = 3; ταυτόσημα
49
p[2].x = 3;
πέρα απο απλές δομές...
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
– Δομές: σύνθετες μεταβλητές
– Συναρτήσεις που δέχονται και επιστρέφουν δομές
1 2
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
class όνομα{ Ιδιωτικά μέλη της τάξης.
– Χρησιμοποιείται η δεσμευμένη λέξη «class»
τύπος μεταβλητή1 ; Δεν μπορούμε να τα
– Μέλη της τάξης μπορεί να είναι μεταβλητές και συναρτήσεις τύπος μεταβλητή2 ; προσπελάσουμε, παρά
τύπος όνομα-συνάρτησης1(...); μόνο μέσω των δημόσιων
• Τα μέλη μιας τάξης χωρίζονται σε δύο είδη τύπος όνομα-συνάρτησης2(...); συναρτήσεων της τάξης
→ ενθυλάκωση
– «private»: ιδιωτικά μέλη: δεν είναι ορατά έξω από την τάξη .
.
– «public»: δημόσια μέλη: είναι ορατά από οποιοδήποτε
public: Δημόσια μέλη της τάξης.
σημείο του προγράμματος Μπορούμε να τα
τύπος μεταβλητή3 ;
τύπος μεταβλητή4 ; προσπελάσουμε άμεσα
• Εξ ορισμού η C++ θεωρεί οτι τα μέλη μιας τάξης είναι private, τύπος όνομα-συνάρτησης3(...); από οποιοδήποτε σημείο
εκτός και εάν δηλωθούν public του προγράμματος.
τύπος όνομα-συνάρτησης4(...);
– Σε αντιδιαστολή, τα μέλη μιας δομής θεωρούνται εξ ορισμού . Οι δημόσιες συναρτήσεις
«public» . επεξεργάζονται ιδιωτικά
3 }; μέλη της τάξης 4
Απλές τάξεις Σχέση δομής και τάξης
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
• Μια τάξη είναι μια γενίκευση της δομής. Άρα ότι μάθαμε με τις
• Στην πιο απλή περίπτωση, μια τάξη έχει δομές, μπορούμε να το κάνουμε με τάξεις.
– Ιδιωτικές μεταβλητές:
• δεδομένα «προστατευμένα» από το υπόλοιπο πρόγραμμα • Παράδειγμα, ένα «δημόσιο» διάνυσμα μπορεί να γραφτεί
• Επεξεργασία μόνο με προκαθορισμένο τρόπο ισοδύναμα με δύο τρόπους
– Δημόσιες συναρτήσεις:
• Συναρτήσεις που επεξεργάζονται τις ιδιωτικές μεταβλητές
– Με δομή: struct vector { double x, y, z; };
• Συνιστούν την γέφυρα επικοινωνίας των μεταβλητών με το
έξω πρόγραμμα
class vector {
class όνομα{ public:
– Με τάξη:
ιδιωτικές μεταβλητές; double x, y, z;
public: };
δημόσιες συναρτήσεις; Τα παραπάνω είναι απολύτως ίδια. Τα παραδείγματα του προηγούμενου
}; 5 κεφαλαίου θα μπορούσαν να είχαν γραφτεί με την αντίστοιχη τάξη6
• Μέσα στην τάξη δηλώνουμε τα πρωτότυπα των συναρτήσεων- • Μια συνάρτηση που είναι μέλος μιας τάξης έχει άμεση πρόσβαση
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
μελών στα ιδιωτικά μέλη της τάξης
– Παράδειγμα, ένα ιδιωτικό διάνυσμα, με μια συνάρτηση μέλος για – Δεν χρειάζεται τελείες κτλ
την εισαγωγή τιμών στο διάνυσμα
class vector{ • Ως εκ τούτου, ανήκει στην τάξη και πρέπει να δηλωθεί ανάλογα
double x, y, z; – Ο μεταφραστής πρέπει να ξέρει την τάξη που ανήκει
public:
void set( double x1, double y1, double z1) ;
}; • Δήλωση συνάρτησης (έξω από την τάξη, έξω από την main):
τύπος τάξη::όνομα (λίστα εισόδου){
εντολές;
– Τα x, y, z είναι ιδιωτικά, και δεν μπορούμε να τους δώσουμε
return …;
τιμές κατευθείαν από το πρόγραμμα με τον τελεστή της τελείας.
}
– Θα χρησιμοποιήσουμε την συνάρτηση set, στην οποία δίνουμε
στην λίστα εισόδου τις επιθυμητές τιμές Το καινούριο στοιχείο: πριν το όνομα της συνάρτηση γράφουμε
7 8
– Η set θα πρέπει να αντιγράψει τις τιμές στα x, y, z το όνομα της τάξης, χωρισμένα με δύο άνω-κάτω τελείες
Δήλωση συνάρτησης μέλους Κλήση συνάρτηση μέλους
• Στο προηγούμενο παράδειγμα του διανύσματος • Η κλήση γίνεται με τον τελεστή της τελείας, όπως γίνονταν
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
και στις δομές.
class vector{
• Μόνη διαφορά, ότι η συνάρτηση έχει πάντα παρενθέσεις
double x, y, z;
public: – Με την λίστα εισόδου εάν υπάρχει
void set( double x1, double y1, double z1) ; – Άδειες παρενθέσεις εάν δεν υπάρχει είσοδος
};
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
double a, b, c;
class vector{
double x, y, z; cout<<“εισάγετε συνιστώσες διανύσματος”<< endl;
public: cin >> a >> b >> c;
void set(double, double, double); v.set(a, b, c);
double magn();
}; cout<<“εισάγετε συνιστώσες διανύσματος”<< endl;
cin >> a >> b >> c;
void vector::set (double x1, double y1, double z1){ u.set(a, b, c);
x = x1;
y = y1; cout <<“το μέτρο του πρώτου διανύσματος”<<endl;
z = z1; cout << v.magn() << endl;
}
double vector::magn(){ cout <<“το μέτρο του δεύτερου διανύσματος”<<endl;
return sqrt(x*x + y*y +z*z); 11 cout << u.magn() << endl; 12
} συνεχίζεται... }
Παράδειγμα με συνάρτηση
Συνάρτηση δόμησης
δόμησης
#include <iostream>
• Κατά την δημιουργία ενός αντικειμένου, οι εσωτερικές
#include <cmath>
μεταβλητές δεν έχουν αρχική τιμή
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
using namespace std;
– Στο προηγούμενο χρησιμοποιήσαμε την set για να δώσουμε
αρχικές τιμές class vector{
– η συνάρτηση set καλείται μέσα στο πρόγραμμα double x, y, z;
public:
• Μπορούμε να προγραμματίσουμε έτσι ώστε κατά την δήλωση του vector();
αντικειμένου, οι εσωτερικές μεταβλητές να παίρνουν εξ ορισμού void set(double, double, double);
κάποια συγκεκριμένη αρχική τιμή double magn();
};
Παράδειγμα με συνάρτηση
Παράδειγμα #2: λίστα αποθήκης
δόμησης
int main(){ Στη δήλωση, τα διανύσματα Πρόγραμμα για οργάνωση και χειρισμό αντικειμένων σε αποθήκη
v, u αρχικοποιούνται στο
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
vector v, u;
. (0,0,0). • Θα ορίσουμε μια νέα τάξη που θα περιλαμβάνει
– Μεταβλητές για κάθε αντικείμενο:
• Η συνάρτηση δόμησης μπορεί και να έχει είσοδο • κόστος αγοράς
class vector{ double x, y, z; • Τιμή πώλησης
public: • Αριθμός αντικειμένων στην αποθήκη
vector(double x1, double y1, double z1); • Χρηματικό ισοζύγιο
.
– Συναρτήσεις για επεξεργασία των παραπάνω
};
• Συνάρτηση για αρχικές συνθήκες
vector::vector(double x1, double y1, double z1){
• Συνάρτηση για πώληση
x = x1; y = y1; z = z1; }
• Συνάρτηση για αγορά
• Τώρα όμως θα πρέπει να δοθούν οι τιμές κατά την δήλωση
• Συνάρτηση που να δείχνει την κατάσταση
int main(){ Στη δήλωση, τα διανύσματα
vector v(0,0,0), u(1,1,1); v, u αρχικοποιούνται στο
(0,0,0) και (1,1,1) 15 16
.
Παράδειγμα #2: λίστα αποθήκης (1/5) Παράδειγμα #2: λίστα αποθήκης (2/5)
#include <iostream>
using namespace std;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
void item::sell(){
class item{
double cost; int n;
double price; cout << ”πόσα κομμάτια προς πώληση;” << endl;
int stock; cin >> n;
double cash;
public: if ( stock<n ) cout<< “έχουμε μόνο” << stock <<endl;
item();
void reset(); else {
void sell(); stock -= n;
void buy(); cash += n * price;
void info(); }
}; }
item::item(){ cost = price = stock = cash = 0; } 17 18
Παράδειγμα #2: λίστα αποθήκης (3/5) Παράδειγμα #2: λίστα αποθήκης (4/5)
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
void item::reset(){
cout << “παλιές τιμές αγοράς και πώλησης” << endl;
cout << cost << “ ” << price << endl;
cout << “εισάγετε νέες τιμές” << endl;
void item::buy(){
cin >> cost >> price;
}
int n;
cout << ”πόσα κομμάτια προς αγορά;” << endl;
cin >> n;
void item::info(){
cout << stock <<“ έχουν μείνει στην αποθήκη ” <<endl;
stock += n;
cout << cost <<“ ευρώ η τιμή αγοράς ” <<endl;
cash -= n * cost;
cout << price <<“ ευρώ η τιμή πώλησης ” <<endl;
}
cout << cash <<“ ευρώ το ισοζύγιο ” <<endl;
}
19 20
Παράδειγμα #2: λίστα αποθήκης
Παράδειγμα #2: λίστα αποθήκης (5/5)
Εκτέλεση και αποτελέσματα
int main(){
item a[1000]; int i, j; > Aριθμός προϊόντος; > Aριθμός προϊόντος;
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
> 1 > 1
do { > Eντολή; 0-4: e-s-b-r-i > Eντολή; 0-4: e-s-b-r-i
cout<< “Aριθμός προϊόντος;” <<endl; cin >> i; > 3 > 1
cout<<“Eντολή; 0-4: e-s-b-r-i”<<endl; cin >> j; > παλιές τιμές αγοράς και > πόσα κομμάτια προς πώληση;”
πώλησης > 3
switch (j){ > 0 0
case 1: a[i].sell(); break; > εισάγετε νέες τιμές > Aριθμός προϊόντος;
case 2: a[i].buy(); break; > 3 4 > 1
case 3: a[i].reset(); break; > Eντολή; 0-4: e-s-b-r-i
case 4: a[i].info(); break; > Aριθμός προϊόντος; > 4
} > 1 > 2 έχουν μείνει στην αποθήκη
} > Eντολή; 0-4: e-s-b-r-i > 3 ευρώ η τιμή αγοράς
while( j > 0 ); > 2 > 4 ευρώ η τιμή πώλησης
} > πόσα κομμάτια προς αγορά; > -3 ευρώ το ισοζύγιο
21 > 5 22
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
– Δέχεται νούμερα, που προστίθενται στο τέλος
class queue {
– Τραβάει νούμερα από την αρχή της ουράς double q[1000];
– Η σειρά που ακολουθείται είναι «πρώτο μπαίνει, πρώτο βγαίνει) int sloc, rloc;
public:
• Από μεταβλητές θα χρειαστούμε queue();
void qput(double);
– έναν πίνακα για να αποθηκεύουμε τα νούμερα
double qget();
– έναν ακέραιο για την θέση όπου βάζουμε τον επόμενο };
– έναν ακέραιο για την θέση απ’ όπου τραβάμε τον επόμενο
• Από συναρτήσεις θα χρειαστούμε
– μια συνάρτηση όταν ένας νέος αριθμός μπαίνει στη λίστα • Η συνάρτηση δόμησης πρέπει να δίνει τις κατάλληλες αρχικές
– μια συνάρτηση για να τραβάμε έναν αριθμό από την λίστα τιμές κατά την δήλωση μιας νέας ουράς.
• και οι δύο πρέπει να ελέγχουν μην ξεπεραστούν όρια. – Αρχικά είναι άδεια, άρα sloc=rloc=0;
– μια συνάρτηση να δίνει αρχικές τιμές. 23 queue::queue(){ sloc = rloc = 0; } 24
Παράδειγμα #2: Λίστα Παράδειγμα #2: Λίστα
προτεραιότητας (2/4) προτεραιότητας (3/4)
• Η συνάρτηση qput δέχεται έναν ρητό και τον προσθέτει στο • Η συνάρτηση qget τραβάει έναν ακέραιο από την αρχή της ουράς
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
τέλος της ουράς – Ελέγχει ότι η ουρά δεν είναι άδεια
– Ελέγχει ότι η ουρά δεν έχει γεμίσει – Η θέση στην αρχή της ουράς είναι η rloc
– Η θέση στο τέλος της ουράς είναι η sloc
double queue::qget(){
void queue::qput(double a){
if(rloc == sloc){
if(sloc == 1000){
cout<< ”η λίστα είναι άδεια ”;
cout<< ”η λίστα είναι γεμάτη” << endl;
return 0;
return;
}
}
double r = q[rloc];
q[sloc] = a;
rloc++;
sloc++;
return r;
}
}
25 26
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
int main(){ int main(){
queue a, b; queue a; int i; double x;
a.qput(10); do { cout<<”Επόμενη εντολή; 0-2 e-p-g“<<endl;
b.qput(19); cin >> i;
a.qput(20);
b.qput(1); switch (i) {
case 1:
cout<<”η λίστα a περιέχει τους αριθμούς: “; cout<< “δώστε αριθμό” <<endl;
cout << a.qget() << “ “ << a.qget() <<endl; cin >> x; a.qput(x); break;
case 2:
cout<<”η λίστα b περιέχει τους αριθμούς: “; cout<< “επόμενος αριθμός στην ουρά ”;
cout << b.qget() << “ “ << b.qget() << endl; cout << a.qget() << endl; break;
} }
Στην εκτέλεση του παραπάνω θα λάβουμε }
> η λίστα a περιέχει τους αριθμούς: 10 20 27
while ( i > 0 );
28
> η λίστα b περιέχει τους αριθμούς: 19 1 }
Παράδειγμα #2: Λίστα
Παράδειγμα #3: Μέτρηση καρτών
προτεραιότητας 2: εφαρμογή
> Επόμενη εντολή; 0-2 e-p-g > Επόμενη εντολή; 0-2 e-p-g
Πρόγραμμα που μετράει κάρτες σε παιχνίδι
> 1 > 2
• Έστω το παιχνίδι «21»,το οποίο παίζεται ως εξής:
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
> δώστε αριθμό > επόμενος αριθμός στην ουρά 7
> 4 – τραβάς όσα φύλλα επιθυμείς
> Επόμενη εντολή; 0-2 e-p-g
– ο πιο κοντά στο 21 κερδίζει
> Επόμενη εντολή; 0-2 e-p-g > 2
> 1 > επόμενος αριθμός στην ουρά 5 – παίζουν τα φύλλα από 1 μέχρι και 10
> δώστε αριθμό – παίζουν n τράπουλες
> 7 > Επόμενη εντολή; 0-2 e-p-g
> 2
> Επόμενη εντολή; 0-2 e-p-g > η λίστα είναι άδεια 0 Θα φτιάξουμε μια τάξη που θα μετράει τα φύλλα
> 2 • Από μεταβλητές θα χρειαστούμε
> επόμενος αριθμός στην ουρά 4 > Επόμενη εντολή; 0-2 e-p-g
– έναν πίνακα για να αποθηκεύει πόσα φύλλα περάσανε
> 1
> Επόμενη εντολή; 0-2 e-p-g > δώστε αριθμό – έναν ακέραιο για πόσα φύλλα ακόμα παίζουν
> 1 > 15 • Από συναρτήσεις θα χρειαστούμε
> δώστε αριθμό
– μια συνάρτηση δόμησης για αρχικές τιμές
> 5 > Επόμενη εντολή; 0-2 e-p-g
> 2 – μια συνάρτηση όταν ένα νέο φύλλο περνάει
> επόμενος αριθμός στην ουρά 15 – μια συνάρτηση που συμβουλεύει να τραβήξουμε ή όχι
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
– στην είσοδο το j είναι το φύλλο που περνάει
using namespace std;
– αφαιρείται ένα από τα j που παραμένουν
class game{ – αφαιρείται ένα από τον συνολικό αριθμό που παραμένει
int cards[11];
int num; void game::add( int j ){
public:
game(int); if( cards[j] == 0 ){
void add(int); cout << “τέλειωσε αυτή η κάρτα” << endl;
double play(int); return;
}; }
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
– αθροίζουμε τον αριθμό φύλλων που δεν το καίνε int main(){
• δηλαδή αυτά που έχουν μείνει από 1 μέχρι 21 - j int n, j;
– διαιρούμε με τον συνολικό αριθμό φύλλων που έχει μείνει cout << “πόσες τράπουλες; ”;
cin >> n;
double game::play( int j ){
game a(n);
if( num == 0 ){
do{
cout<< “τελείωσαν οι κάρτες” << endl ;
cout << “νέο φύλλο ”;
return 0;
cin >> j;
}
if (j <= 10) a.add(j);
else cout << “τράβα” << a.play(j) << “%\n”;
double s=0;
for(int i=1; i <= 21-j; ++i) s += cards[i];
}
while( j > 0 );
return s / num * 100; 33 34
}
}
Πρόσθεση διανυσμάτων 1: με
Υπερφόρτωση τελεστών
εξωτερική συνάρτηση
• Έστω η τάξη vector
– για απλότητα θεωρούμε όλα τα μέλη της τάξης δημόσια
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
• Είδαμε πως γράφουμε συναρτήσεις για την εκτέλεση
class vector{
συγκεκριμένων λειτουργιών-πράξεων
public:
• Είδαμε πως υπερφορτώνουμε συναρτήσεις double x, y, z;
};
• Εδώ τα συνδυάζουμε υπερφορτώνοντας τους τελεστές
– Για παράδειγμα, αντί να γράψουμε συνάρτηση sum για • Θα γράψουμε εξωτερική συνάρτηση για την πρόσθεση
πρόσθεση διανυσμάτων, θα επαναπρογραμματίσουμε το
“+” ώστε να κάνει την επιθυμητή λειτουργία vector sum(vector v, vector u){
vector w;
• Ως παράδειγμα, θα χρησιμοποιήσουμε την τάξη vector w.x = v.x + u.x;
w.y = v.y + u.y;
w.z = v.z + u.z;
return w;
35 } 36
Πρόσθεση διανυσμάτων 1: με Πρόσθεση διανυσμάτων 2: με
εξωτερική συνάρτηση συνάρτηση-μέλος
#include <iostream> • Έστω η τάξη vector
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
using namespace std; class vector{
public:
class vector{ double x, y, z;
public: double x, y, z; }; vector sum(vector);
};
vector sum(vector, vector);
• Η συνάρτηση-μέλος δέχεται και επιστρέφει τον ίδιο τύπο με την τάξη
int main(){ • καλείται από κάποια μεταβλητή τύπου vector με την τελεία
vector v1, v2, v3;
. vector vector::sum(vector u){
. vector w;
v3 = sum(v1, v2); w.x = x + u.x;
. w.y = y + u.y;
cout << “το άθροισμα v1+v2 είναι ” << endl; w.z = z + u.z;
cout << v3.x << v3.y << v3.z<<endl; return w;
} 37 } 38
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
από τον κωδικό operator συνοδευόμενο από το επιθυμητό σύμβολο
class vector{
public: – π.χ. για πρόσθεση, χρησιμοποιούμε το operator+
double x, y, z; class vector{
vector sum(vector); public:
}; double x, y, z;
vector operator+(vector);
int main(){ };
vector v1, v2, v3;
. vector vector::operator+(vector u){
. vector w;
v3 = v1.sum(v2); w.x = x + u.x;
. w.y = y + u.y;
cout << “το άθροισμα v1+v2 είναι ” << endl; w.z = z + u.z;
cout << v3.x << v3.y << v3.z<<endl; return w;
39 40
} }
Πρόσθεση διανυσμάτων 3: με Σύγκριση συνάρτησης-μέλους και
υπερφόρτωση τελεστή τελεστή
#include <iostream>
using namespace std; Με συνάρτηση-μέλος Με τελεστή
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
• Η συνάρτηση sum καλείται από • Ο τελεστής + καλείται από το
class vector{ το διάνυσμα στα αριστερά διάνυσμα στα αριστερά
public: – Άρα έχει άμεση γνώση των – Άρα έχει άμεση γνώση των
double x, y, z; μελών x, y, z μελών x, y, z
vector operator+(vector); • Το διάνυσμα στα δεξιά εισέρχεται • Το διάνυσμα στα δεξιά εισέρχεται
}; – Άρα για τα x, y, z του – Άρα για τα x, y, z του
εισερχόμενου διανύσματος εισερχόμενου διανύσματος
int main(){ χρειαζόμαστε την τελεία χρειαζόμαστε την τελεία
vector v1, v2, v3;
. • H συνάρτηση καλείται ως • Ο τελεστής καλείται ως
. v3 = v1.sum(v2); v3 = v1 + v2;
v3 = v1 + v2;
.
cout << “το άθροισμα v1+v2 είναι ” << endl; Με τελεστή δεν χρειάζονται η τελεία και οι παρενθέσεις!
cout << v3.x << v3.y << v3.z<<endl; 41 42
}
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
double vector::operator*(vector u){
return x*u.x + y*u.y + z*u.z;
}
vector vector::operator-(vector u){
vector w;
w.x = x - u.x; • Γινόμενο διανύσματος με ρητό
w.y = y - u.y;
w.z = z - u.z; vector vector::operator*(double m){
return w; vector w;
} w.x = x * m;
w.y = y * m;
w.z = z * m;
return w;
}
43 44
Δημιουργία τελεστή εξωτερικού
Λοιπές συναρτήσεις-μέλη
γινομένου διανυσμάτων
• Συνάρτηση δόμησης χωρίς είσοδο (για εξ ορισμού ανάθεση (0,0,0))
• Εξωτερικό γινόμενο (ορίζουμε τον νέο τελεστή ^)
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
vector::vector(){ x = y = z = 0; }
iˆ ˆj kˆ
r r
a × b = ax ay a z = iˆ(a y bz − a z b y ) − ˆj (a x bz − a z bx ) + kˆ(a x b y − a y bx ) • Συνάρτηση δόμησης με είσοδο (για ανάθεση κατά την δήλωση)
bx by bz vector::vector(double x1, double y1, double z1){
x = x1; y = y1; z = z1;
}
vector vector::operator^(vector u){
• Συνάρτηση set (για ανάθεση μετά την δήλωση)
vector w;
w.x = y * u.z – z * u.y; void vector::set(double x1, double y1, double z1){
w.y = z * u.x – x * u.z; x = x1; y = y1; z = z1;
w.z = x * u.y – y * u.x; }
return w; • Συνάρτηση magnitude
}
double vector::magnitude(){
45
return sqrt(x*x + y*y + z*z); 46
}
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
#include <cmath>
• Πλήρες πρόγραμμα C++ με τους τελεστές και συναρτήσεις-μέλη using namespace std;
που δόθηκαν προηγουμένως, ώστε να υπολογίσει την έκφραση
class vector{
public:
(v1 × v 2 ) × (v1 × v3 )⋅ | (v1 + v 2 ) × (v1 − v3 ) | double x, y, z;
vector();
vector(double, double, double);
void set(double, double, double);
vector operator+(vector);
vector operator-(vector);
double operator*(vector);
vector operator*(double);
vector operator^(vector);
double magnitude();
47 }; 48
Παράδειγμα 1: Διανυσματικός
Παράδειγμα 2: μιγαδικοί αριθμοί
λογισμός (2/2)
int main(){
double x, y, z; vector r; #include <iostream>
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
cout << “εισάγετε τα τρία διανύσματα ” <<endl; #include <cmath>
using namespace std;
cin >> x >> y >> z;
vector v1(x,y,z); class complex{
public:
cin >> x >> y >> z; double real, imag;
vector v2(x,y,z); complex();
complex(double, double);
cin >> x >> y >> z; void set(double, double);
vector v3(x,y,z); (v1 × v 2 ) × (v1 × v3 )⋅ | (v1 + v 2 ) × (v1 − v3 ) | complex operator+(complex);
complex operator-(complex);
r = ((v1^v2)^(v1^v3)) * ((v1+v2)^(v1-v3)).magn(); complex operator*(complex);
complex operator*(double);
cout << ”το ζητούμενο διάνυσμα είναι” <<endl; double magnitude();
cout << r.x <<” “<< r.y <<” “<< r.z <<endl; 49 }; 50
}
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
complex::complex(){real = imag = 0; } complex complex::operator+(complex z){
complex w;
complex::complex(double r, double i){ w.real = real + z.real;
real = r; imag = i; w.imag = imag + z.imag;
} return w;
}
void complex::set(double r, double i){
real = r; imag = i; complex complex::operator-(complex z){
} complex w;
w.real = real - z.real;
double complex::magnitude(){ w.imag = imag - z.imag;
return sqrt(real*real + imag*imag); return w;
} }
51 52
Παράδειγμα 2: μιγαδικοί αριθμοί Παράδειγμα 2: μιγαδικοί αριθμοί
Χρησιμοποιώντας την τάξη complex, υπολογίστε τους 100 πρώτους
όρους της παρακάτω αναδρομικής ακολουθίας μιγαδικών αριθμών
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ - ΤΑΞΕΙΣ
complex complex::operator*(complex z){ z n = rz n −1 (1 − z n − 2 )
complex w; z 1 = 0.75 + i 0.25, z 2 = 0.25 + i 0.75, r = 2
w.real = real * z.real – imag * z.imag;
w.imag = real * z.imag + imag * z.real; int main(){
return w; double r = 2;
} complex za(0.75, 0.25);
complex zb(0.25, 0.75);
complex complex::operator*(double m){ complex z1(1.00, 0.00);
complex w;
w.real = real * m; for (int i=3; i<=100; ++i){
w.imag = imag * m; zc = ( zb * (z1 – za) ) * r;
return w; za = zb; zb = zc;
} cout << “ο όρος ” << i << “είναι ”
<< zc.real << “ “ << zc.imag << endl;
53 } 54
}