ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Άδειες Χρήσης ΥΠΟΛΟΓΙΣΤΕΣ ΙI Δομές Διδάσκοντες: Αν Καθ Δ Παπαγεωργίου, Αν Καθ Ε Λοιδωρίκης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creatve Commons Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς
ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ πέρα απο απλές μεταβλητές ΔΟΜΕΣ Μέχρι εδώ έχουμε δεί δύο τύπους μεταβλητών: nt (ακέραιος, 4 bytes) double (ρητός διπλής ακρίβειας, 8 bytes) Σε πολλά προβλήματα χρειαζόμαστε πάνω απο μια μεταβλητή για να καθορίσουμε ένα μέγεθος Πχ δίανυσμα (3 ρητοί: x, y, ) μιγαδικός ( ρητοί: real, magnary) άτομο (5 ρητοί: x, y,, m, q) Πράξεις με αυτά τα μεγέθη σημαίνει Πράξεις με πολλές μεταβλητές το αποτέλεσμα εμπεριέχει πολλές μεταβλητές 1 Είναι βολικό να δημιουργήσουμε νέες, πολυσύνθετες μεταβλητές Ορισμός δομής Παράδειγμα #1: διάνυσμα Νέου τύπου μεταβλητή: Ορίζεται απο τον προγραμματιστή Εμπεριέχει οποιοδήποτε αριθμό και συνδιασμό άλλων μεταβλητών διαφόρων τύπων Στην δήλωση μιας δομής χρησιμοποιείται η δευσμευμένη λέξη της C++: struct Γενικός τρόπος δήλωσης struct όνομα{ τύπος μεταβλητή1 ; τύπος μεταβλητή ; struct vector{ double x; double y; double ; ; Στο «όνομα» χρησιμοποιούμε κάτι που είναι περιγραφικό Επιλέξαμε «vector» Στο εξής, το vector καθιστά νέο τύπο δηλαδή, στο εξή υπάρχουν: nt, double, vector Μέσα στο σώμα της δομής, ορίζουμε τα μέλη της δομής τύπο και όνομα χρησιμοποιούμε ονόματα που είναι περιγραφικά για τις x,y, συνιστώσες, χρησιμοποιούμε απλά x, y, 3 4 ; Ο ορισμός δομής είναι εντολή, άρα τελειώνει με ερωτηματικό
Δήλωση μεταβλητών δομής Προσπέλαση μελών δομής Ο ορισμός της δομής γίνεται πρίν την man Στο κυρίως πρόγραμμα δηλώνουμε μια μεταβλητή δομής όπως και στις απλές μεταβλητές Πχ Για να δηλώσουμε δύο διανύσματα: #nclude <ostream> usng namespace std; struct vector { double x, y, ; ; vector v, u; 5 Πράξεις επιτρέπονται μόνο μεταξύ απλών μεταβλητών δηλαδή μεταξύ των μελών της δομής Πως όμως φτάνουμε στα απλά μέλη της δομής; χρησιμοποιούμε τον τελεστή της τελείας χρησιμοποιούμε τα ίδια σύμβολα με αυτά που ορίσαμε Πχ για ανάθεση τιμών σε διάνυσμα #nclude <ostream> usng namespace std; struct vector {double x, y, ;; vector v, u; vx = 30; vy = 40; v = 50; ux = 110; uy = 10; u = 130; 6 Είσοδος/έξοδος τιμών δομής Πράξεις μεταξύ δομών Μπορούμε να εισάγουμε και κατευθείαν απο το πληκτρολόγιο Παράδειγμα: cout<< εισάγετε τις συνιστώσες διανύσματος << endl; cn >> vx >> vy >> v; Μπορούμε να εξάγουμε τιμές στην οθόνη Παράδειγμα: cout<< οι συνιστώσες του διανύσματος είναι << endl; cout << ux << << uy << << u << endl; ΠΡΟΣΟΧΗ: οι συναρτήσεις cout και cn δέχονται μόνο απλές μεταβλητές, ΟΧΙ δομές Τα παρακάτω είναι ΛΑΘΟΣ: cn >> v; Cout << u; 7 8 Μόνο η πράξη «=» επιτρέπεται μεταξύ μεταβλητών της ίδιας δομής γίνεται μια προς μια αντιγραφή των μελών της μιας στην άλλη cn >> vx >> vy >> v; u = v; cout << ux << << uy << << u << endl; Στην πράξη, αυτό που εκτελείται είναι cn >> vx >> vy >> v; ux = vx; uy = vy; u = v; cout << ux << << uy << << u << endl; Καμία άλλη πράξη, πχ «+, -, *, /» δεν επιτρέπεται
Παράδειγμα #1: πρόσθεση διανυσμάτων Άλλα παραδείγματα δομών #nclude <ostream> usng namespace std; struct vector {double x, y, ;; vector v, u, w; cout << εισάγετε συνιστώσες διανυσμάτων << endl; cn >> vx >> vy >> v; cn >> ux >> uy >> u; wx = vx + ux; wy = vy + uy; w = v + u; cout << οι συνιστώσες του αθροίσματος είναι << endl; cout << wx << << wy << << w << endl; 9 Σύμβολα και ονοματολογία είναι επιλογή του προγραμματιστή Σημαντικό να περιγράφουν το μέγεθος στο οποίο αντιστοιχούν Δομή για μιγαδικούς Δομή για ιόντα struct complex{ double real, mag; ; struct on{ double x, y,, m, q; ; Δομή για προϊόντα σε αποθήκη, που περιλαμβάνει κωδικό προϊόντος, έτος κατασκευής, τιμή πώλησης struct tem{ nt code, year; double prce; ; 10 Πίνακες δομών Παράδειγμα #: μέσος όρος του μέτρου διανυσμάτων (1/) Όταν ορίζουμε μια δομή, ορίζουμε μια νέου τύπου μεταβλητή Όπως και στις απλές μεταβλητές, μπορούμε να ορίσουμε πίνακα απο τις νέες μεταβητές Η προσπέλαση γίνεται πάλι με την τελεία, αμέσως μετά την δεικτοδότηση του πίνακα Παράδειγμα: δήλωση πίνακα με 1000 διανύσματα vector v[1000]; v[0]x = 30; v[0]y = 40; v[0] = 50; v[1]x = 30; v[1]y = 40; v[1] = 50; 11 Πρόγραμμα που διαβάζει n διανύσματα, και υπολογίζει τον μέσο όρο των μέτρων τους #nclude <ostream> usng namespace std; struct vector {double x, y, ;; nt n; vector v[1000]; cout << "εισάγετε τον αριθμό διανυσμάτων << endl; cn >> n; f(n==0) cout << ο μέσος όρος είναι 0 << endl; else f (n > 1000) cout << πιό λίγα διανύσματα <<endl; else { for (nt =0; <n; ++) 1 cn >> v[]x >> v[]y >> v[];
Παράδειγμα #: μέσος όρος του μέτρου διανυσμάτων (/) Δομές μέσα σε δομές double s = 0; for (nt =0; <n; ++) s += sqrt(v[]x * v[]x + v[]y * v[]y + v[] * v[]); cout << ο μέσος όρος είναι << s/n << \n ; Μια δομή συνιστά μια νέα μεταβλητή Με την σειρά της, μια δομή μπορεί να αποτελέσει μέλος μιας πιο σύνθετης δομής Παράδειγμα: ιόν με θέση, μάζα και φορτίο struct vector { double x, y, ; ; struct on{ vector r; double m, q; ; 13 Διαδοχική προσπέλαση γίνεται με διαδοχικές τελείες 14 Παράδειγμα #3: Δομή για ιόντα (1/) Παράδειγμα #3: Δομή για ιόντα (/) Πρόγραμμα που διαβάζει n ιόντα, και υπολογίζει τη συνολική μάζα και φορτίο, και τη μέση απόσταση απο την αρχή των αξόνων #nclude <ostream> usng namespace std; struct vector { double x, y, ; ; struct on { vector r; double m, q; ; nt n; on a[1000]; f (n < 1 n > 1000) return 1; for (nt =0; <n; ++) cn >> a[]rx >> a[]ry >> a[]r >> a[]m >> a[]q; double sm = 0; double sq = 0; double sd = 0; for (nt =0; <n; ++){ sm += a[]m; sq += a[]q; sd += sqrt(v[]rx * v[]rx + v[]ry * v[]ry + v[]r * v[]r); cout << "εισάγετε τον αριθμό των ιόντων << endl; cn >> n; 15 cout << η συνολική μάζα είναι << sm << endl; cout << το συνολικό φορτίο είναι << sq << endl; cout << η μέση απόσταση είναι << sd/n << endl; 16
Παράδειγμα #4: πράξεις με μιγαδικούς Παράδειγμα #4: πράξεις με μιγαδικούς (1/) Πρόγραμμα που διαβάζει δύο μιγαδικούς, και τυπώνει το άθροισμα, την διαφορά, και το γινόμενό τους ~ = 1 ~ ~ + ~ 1 ~ ~ 1 ~ ~ 1 ( = r r + = ( = ( = ( 1 1 + + r r 1 ) + ( ) + ( + ) ( ) + ( r 1 1 + + 1 ) ) + ) = r ) 17 #nclude <ostream> usng namespace std; struct complex { double real, mag; ; complex 1,, sum, df, prod; cout << "εισάγετε δύο μιγαδικούς << endl; cn >> eal >> 1mag; cn >> real >> mag; sumreal = eal + real; summag = 1mag + mag; dfreal = eal real; dfmag = 1mag mag; 18 Παράδειγμα #4: πράξεις με μιγαδικούς (/) Γιατί δεν επιτρέπονται άλλες πράξεις; endl; prodreal = eal*real - 1mag*mag; prodmag = eal*mag + 1mag*real; cout << το άθροισμα είναι << endl; cout << sumreal << << summag << endl; cout << η διαφορά είναι << endl; cout << dfreal << << dfmag << endl; cout << το γινόμενο είναι << endl; cout << prodreal << << prodmag << 19 Ανάλογα το φυσικό πρόβλημα που επιλύουμε, μια πράξη μπορεί να έχει διαφορετικό νόημα Παράδειγμα, ο πολλαπλασιασμός: Σε διανύσματα, το εσωτερικό γινόμενο είναι ρητός r a r b = a b + a b + a b = ρητός αριθμός x x y y Σε μιγαδικούς, το γινόμενο είναι μιγαδικός ~ ~ 1 ( r = ( 1 1 + ) ( ) + ( r Στην C++ ο χρήστης μπορεί να «προγραμματίσει» τις πράξεις μεταξύ μεταβλητών δομής Με χρήση συναρτήσεων Με ολοκληρωμένο ορισμό αντικειμένων (τάξεις) + + ) = 1 r ) = μιγαδικός 0
Συναρτήσεις με δομές Ορισμός, δήλωση και κλήση μιας συνάρτησης με δομές γίνεται όπως και με τις απλές μεταβλητές Στην λίστα εισόδου μπορούμε να έχουμε δομές Στην έξοδο μπορούμε να έχουμε δομή Οι πράξεις μέσα στην συνάρτηση γίνονται όπως είδαμε πριν με τον τελεστή της τελείας Παράδειγμα: συνάρτηση που υπολογίζει το μέτρο διανύσματος double magntude (vector v){ double d = sqrt(vx*vx + vy*vy + v*v); return d; 1 Παράδειγμα #5: συναρτήσεις για πρόσθεση και αφαίρεση και γινόμενο διανυσμάτων vector sum (vector v, vector u){ vector w; wx = vx + ux; wy = vy + uy; w = v + u; return w; vector df (vector v, vector u){ vector w; wx = vx - ux; wy = vy - uy; w = v - u; return w; double product (vector v, vector u){ return vx*ux + vy*uy + v*u; Υπερφόρτωση συναρτήσεων: πολυμορφισμός Μπορούμε να γράψουμε μια βιβλιοθήκη με συναρτήσεις για κάθε είδους μεταβλητής double sum (double x, double y){ μια απλούς ρητούς return x + y; complex sum (complex 1, complex ){ complex 3; 3real = eal + real; για μιγαδικούς 3mag = 1mag + mag; return 3; vector sum (vector v, vector u){ vector w; wx = vx + ux; για διανύσματα wy = vy + uy; w = v + u; return w; 3 Παράδειγμα #6: Πλήρες πρόγραμμα για πράξεις με διανύσματα (1/) Πρόγραμμα που διαβάζει δύο διανύσματα, και τυπώνει το μέτρο του καθενός, το μέτρο του αθροίσματος, το μέτρο της διαφοράς, καθώς και και το εσωτερικό τους γινόμενο #nclude <ostream> usng namespace std; struct vector {double x, y, ;; vector sum (vector, vector); vector df (vector, vector); double product (vector, vector); double magntude (vector); vector v, u; cout << εισάγετε συνιστώσες διανυσμάτων << endl; cn >> vx >> vy >> v; cn >> ux >> uy >> u; 4
Παράδειγμα #6: Πλήρες πρόγραμμα για πράξεις με διανύσματα (/) Μια συνάρτηση μπορεί να καλεί άλλη συνάρτηση cout << τα μέτρα των διανυσμάτων είναι << endl; cout << magntude(v) << << magntude(u) << endl; cout << το μέτρο του αθροίσματος είναι << endl; cout << magntude( sum(v, u) ); cout << το μέτρο της διαφοράς είναι << endl; cout << magntude( df(v, u) ); cout << το γινόμενο είναι << endl; cout << product(v, u); Παράδειγμα: συνάρτηση που υπολογίζει τη γωνία μεταξύ δύο διανυσμάτων r r r r r r a b a b = a b cosθ θ = a cos r r a b double angle (vector a, vector b){ double theta, m1, m; m1 = magntude(a); m = magntude(b); f (m1 == 0 m == 0) theta = 0; else f (m1*m == 0) theta = 90; else theta = acos( product(a,b)/(m1*m) )* 180/acos(-10); 5 return theta; 6 Δείκτες σε δομές Εισαγωγή πίνακα δομής σε συνάρτηση Όπως και στις απλές μεταβλητές, μπορούμε να δηλώσουμε δείκτη σε μεταβλητή δομής χρησιμοποιώντας τον τελεστή αστέρι «*» Ο δείκτης είναι η διεύθυνση του πρώτου στοιχείου της δομής παράδειγμα, δείκτης σε διάνυσμα struct vector { double x, y, ; ; vector v, *p; // ανάθεση διεύθυνσης p = &v; 7 Όπως και στην περίπτωση των πινάκων απλών μεταβλητών, ένας πίνακας δομής εισέρχεται ώς δείκτης Παράδειγμα: μέσος όρος των μέτρων ενός πίνακα διανυσμάτων double ave_magn(vector *v, nt n){ double s = 0; for (nt =0; <n; ++) s += sqrt(v[]x * v[]x + v[]y * v[]y + v[] * v[]); return s/n; 8
Παράδειγμα #7: μέσος όρος μέτρων διανυσμάτων #nclude <ostream> #nclude <cmath> usng namespace std; struct vector {double x, y, ;; double ave_magn(vector *, nt); nt n; vector v[1000]; cout << "εισάγετε τον αριθμό διανυσμάτων << endl; cn >> n; Πλήρες πρόγραμμα που υπολογίζει τον μέσο όρο των μέτρων ενός πίνακα διανυσμάτων f(n==0 n>1000) return 1; for (nt =0; <n; ++) cn>>v[]x>>v[]y>>v[]; cout << ave_magn(v, n) <<endl; 9 Παράδειγμα #8:# ιόντα Πρόγραμμα που διαβάζει n ιόντα και υπολογίζει το κέντρο μάζας, την ολική ηλεκτροστατική ενέργεια, και την δύναμη που ασκείται σε κάθε ιόν Θα χρειαστούμε: Την δομή για ιόντα Συνάρτηση για κέντρο μάζας Συνάρτηση για απόσταση δύο ιόντων Συνάρτηση για ηλεκτροστατική ενέργεια ενός ιόντος Συνάρτηση για την συνολική δύναμη που νοιώθει ένα ιόν = 1 q q E j 0 n j r r = j j q q ( x x ) n x = 1 j j j r r 3 = 0 j j F 30 Παράδειγμα #8:# συναρήσεις για ιόντα (1/5) Δομή για ιόντα struct vector { double x, y, ; ; struct on { vector r; double m, q; ; Συνάρτηση για κέντρο μάζας Το κέντρο μάζας έχει x, y, συντεταγμένες vector Στην είσοδο δέχεται πίνακα με ιόντα Υπολογίζει και τις τρεις συνιστώσες x m μ x =, και παρόμοια για μ y, m μ 31 Παράδειγμα #8:# συναρήσεις για ιόντα (/5) Συνάρτηση για κέντρο μάζας vector centermass (on *a, nt n){ vector cm; double m; cmx = cmy = cm = m = 0; for (nt =0; <n; ++){ cmx += a[]rx * a[]m; cmy += a[]ry * a[]m; cm += a[]r * a[]m; m += a[]m; cmx = cmx / m; cmy = cmy / m; cm = cm / m; return cm; μ = x x m m 3
Παράδειγμα #8:# συναρήσεις για ιόντα (3/5) Παράδειγμα #8:# συναρήσεις για ιόντα (4/5) Συνάρτηση για απόσταση δύο διανυσμάτων double dst (vector v, vector u){ return sqrt( pow(vx-ux, ) + pow(vy-uy, ) + pow(v-u, )); ή με τις συναρτήσεις df και magntude double dst (vector v, vector u){ return magntude( df(v, u) ); r r d = v u Συνάρτηση για ηλεκτροστατική ενέργεια ενός ιόντος = 1 q q E j 0 n j r r = j j double energy (on *a, nt n, nt j){ double e = 0; for (nt =0; <n; ++) f(!= j) e += a[]q * a[j]q / dst(a[j]r, a[]r); return e; 33 34 Παράδειγμα #8:# συναρήσεις για ιόντα (5/5) n q q j ( x x j F j r r Hλεκτροστατική δύναμη πάνω σε ιόν vector force (on *a, nt n, nt j){ vector f, f; fx = fy = f = 0; for (nt =0; <n; ++) f(!= j){ = 1 = 0 j j x ) 3 fx = a[]q*a[j]q * (a[j]rx - a[]rx)/ pow( dst(a[j]r, a[]r), 3); fy = a[]q*a[j]q * (a[j]ry - a[]ry)/ pow( dst(a[j]r, a[]r), 3); f = a[]q*a[j]q * (a[j]r - a[]r)/ pow( dst(a[j]r, a[]r), 3); Παράδειγμα #8:# πρόγραμμα για ιόντα (1/3) Πλήρες πρόγραμμα για ιόντα #nclude <ostream> #nclude <cmath> usng namespace std; struct vector { double x, y, ; ; struct on { vector r; double m, q; ; vector sum (vector, vector); vector df (vector, vector); double magntude (vector); double dst (vector, vector); f = sum(f, f); return f; 35 vector centermass (on *, nt); double energy (on *, nt, nt); vector force (on *, nt, nt); συνεχίζεται 36
Παράδειγμα #8:# πρόγραμμα για ιόντα (/3) nt n; on a[1000]; vector f, m; cout << "εισάγετε τον αριθμό των ιόντων << endl; cn >> n; f (n < 1 n > 1000) return 1; for (nt =0; <n; ++) cn >> a[]rx >> a[]ry >> a[]r >> a[]m >> a[]q; Παράδειγμα #8:# πρόγραμμα για ιόντα (3/3) for (nt =0; <n; ++){ cout << το ιόν << << έχει ενέργεια <<endl; cout << energy(a, n, ); f = force(a, n, ); cout << και υφίσταται δύναμη << endl; cout << fx << << fy << << f << endl; m = centermass(a, n); cout << το κέντρο μάζας έχει συντεταγμένες <<endl; cout << mx << << my << << m <<endl; 37 συνεχίζεται 38 Παράδειγμα #9:# : μοριακή δυναμική Παράδειγμα #9:# : μοριακή δυναμική: εξισώσεις κίνησης Έχουμε χτίσει όλη τη βάση ώστε να δημιουργήσουμε έναν κώδικα μοριακής δυναμικής: ιόντα, λόγω των μεταξύ τους δυνάμεων εκτελούν τροχιές στον χώρο Χρειαζόμαστε για κάθε ιόν: Θέση (διάνυσμα) Μάζα (ρητός) Φορτίο (ρητός) Ταχύτητα (διάνυσμα) Επιτάχυνση (διάνυσμα) Ολοκλήρωση εξισώσεων κίνησης: Ανάπτυγμα Taylor για την απόσταση r r r 1 r ( t + Δt ) = ( t ) + v ( t ) Δt + a( t )( Δt ) Ανάπτυγμα για την ταχύτητα r r r v ( t + Δt ) = v ( t ) + a( t ) Δt Η πλήρης δομή για ένα ιόν ΣΗΜΕΙΩΣΗ: εφαρμόζοντας αυτούς τους τύπους επιτυγχάνουμε λύση με ακρίβεια πρώτης τάξης, όχι ικανοποιητική Με μικρή struct vector { double x, y, ; ; τροποποίηση μπορούμε να επιτύχουμε ακρίβεια δεύτερης struct on { vector r, vel, acc; double m, q; ; 39 τάξης, αλλά δεν είναι επι του παρόντως 40
Παράδειγμα #9:# : μοριακή δυναμική: συνάρτηση για πολλαπλασιασμό διανύσματος με ρητό Θα χρειαστεί να πολλαπλασιάσουμε διάνυσμα με ρητό Πχ Χρειαζόμαστε μια συνάρτηση για να το κάνει αυτό vector mult(vector r, double f){ rx *= f; ry *= f; r *= f; return r; r x x f f y y f f Υπάρχει πάντα η πιθανότητα κάποιος να την καλέσει λάθος, εισάγοντας πρώτα τον ρητό και μετά το διάνυσμα Για να μην προκαλέσει λάθος αυτό, μπορούμε να υπερφορτώσουμε την συνάρτηση δηλώνοντάς την δεύτερη φορά vector mult(double f, vector r){ rx *= f; ry *= f; r *= f; return r; Τώρα όπως και να την καλέσει κανείς, είναι σωστό! r v dt 41 Παράδειγμα #9:# : μοριακή δυναμική: η στιγμιαία επιτάχυνση σε κάθε ιόν vod acceleraton (on *a, nt n){ Χρειαζόμαστε μια συνάρτηση για να υπολογίζει την στιγμιαία επιτάχυνση σε κάθε ιόν r r a = f / m for (nt =0; <n; ++) a[]acc = mult( force(a,n,), 10/a[]m); 4 Παράδειγμα #9:# : μοριακή δυναμική: ανανέωση ταχύτητας κάθε ιόντος Παράδειγμα #9:# : μοριακή δυναμική: ανανέωση θέσης κάθε ιόντος Χρειαζόμαστε μια συνάρτηση για να υπολογίζει την νέα ταχύτητα του κάθε ιόντος r r r v ( t + Δt ) = v ( t ) + a( t ) Δt vod velocty (on *a, nt n, double dt){ for (nt =0; <n; ++){ vector v1 = mult( a[]acc, dt ); Χρειαζόμαστε μια συνάρτηση για να υπολογίζει την νέα θέση του κάθε ιόντος r r r 1 r ( t + Δt ) = ( t ) + v ( t ) Δt + a( t )( Δt ) vod poston (on *a, nt n, double dt){ for (nt =0; <n; ++){ vector r1 = mult( a[]vel, dt); vector r = mult( a[]acc, 05*dt*dt); a[]vel = sum( a[]vel, v1 ); 43 a[]r = sum( a[]r, sum(r1, r)); 44
Παράδειγμα #9:# : μοριακή δυναμική Δείκτες σε δομές: Μια προσεκτικότερη ματιά: ανάθεση τιμών μέσω δείκτη Έχοντας δώσει αρχικές τιμές σε θέση, μάζα και φορτίο, το κυρίως πρόγραμμα όσο αναφορά την δυναμική εξέλιξη του συστήματος των ιόντων είναι πολύ απλό: nt n, nsteps; on a[1000]; double dt; for (nt j=0; j<nsteps; ++j){ acceleraton (a, n); poston (a, n, dt); velocty (a, n, dt); 45 Χρησιμοποιούμε και πάλι το αστέρι και την τελεία Επειδή η τελεία έχει μεγαλύτερη προτεραιότητα, απαραίτητες είναι οι παρενθέσεις vector v, *p; p = &v; cn >> (*p)x >> (*p)y >> (*p); το *(px) όπως και το px δεν έχουν νόημα καθώς το p είναι δείκτης Πιο συμπαγής συμβολισμός η C++ μας προσφέρει έναν πιο συμπαγή συμβολισμό με τον τελεστή του βέλους «->» vector v, *p; p = &v; cn >> p->x >> p->y >> p->; Το βέλος «δείχνει» στα «συστατικά» της δομής 46 Δείκτες όταν έχουμε δομές μέσα σε δομές Χρησιμότητα δεικτών σε δομές Για πρόσβαση σε αριθμητικές τιμής μέσω δείκτη, χρησιμοποιούμε το βέλος για το πρώτο «επίπεδο», και κατόπιν την τελεία, όσες φορές χρειαστεί struct vector { double x, y, ; ; struct on { vector r; double m, q; ; on a, *p; p = &a; p->rx = 30; p->ry = 40; p->r = 50; p->m = 60; p->q = 70; 47 Πολλές δομές μπορεί να είναι μεγάλες Τότε, εάν εισέρχονται σε συνάρτηση, η δημιουργία αντιγράφων μπορεί να είναι χρονοβόρα Λύση είναι να εισάγουμε έναν δείκτη προς την δομή Παράδειγμα, η συνάρτηση sum για πρόσθεση δύο διανυσμάτων vector sum (vector *v, vector *u){ vector w; wx = v->x + u->x; wy = v->y + u->y; w = v-> + u->; return w; Στο κυρίως πρόγραμμα θα καλεστεί vector v, u, w; w = sum (&v, &u); 48
Πίνακας δομής και δείκτες Όπως και στην περίπτωση των απλών μεταβλητών, ένας πίνακας έχει πολλά κοινά με έναν δείκτη Το όνομα του πίνακα είναι δείκτης στο πρώτο του στοιχείο Ισχύει η αριθμητική δεικτών Παράδειγμα, πίνακας διανυσμάτων struct vector { double x, y, ; ; vector v[1000]; vector *p; p = v; p = &v[0]; ταυτόσημα v[]x = 3; (p+)->x = 3; p[]x = 3; ταυτόσημα 49
Χρηματοδότηση Τέλος Ενότητας Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους
Σημείωμα Ιστορικού Εκδόσεων Έργου Σημειώματα Το παρόν έργο αποτελεί την έκδοση 10 Έχουν προηγηθεί οι κάτωθι εκδόσεις: Έκδοση 10 διαθέσιμη εδώ http://ecourseuogr/course/vewphp?d=17
Σημείωμα Αναφοράς Σημείωμα Αδειοδότησης Copyrght Πανεπιστήμιο Ιωαννίνων, Διδάσκοντες: Αν Καθ Δ Παπαγεωργίου, Αν Καθ Ε Λοιδωρίκης «ΥΠΟΛΟΓΙΣΤΕΣ ΙI Δομές» Έκδοση: 10 Ιωάννινα 014 Διαθέσιμο από τη δικτυακή διεύθυνση: http://ecourseuogr/course/vewphp?d=17 Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creatve Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 40 [1] ή μεταγενέστερη [1] https://creatvecommonsorg/lcenses/by-sa/40/