Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ Ενότητα: Δείκτες Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης Τμήμα: Οικονομικών Επιστημών
Αριθμητική δεικτών στη C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 } #include <iostream> using namespace std; int main() int val; int *p; /* random value */ p = &val; cout << "pointer : " << p << endl; cout << "value : " << val << endl << endl; /* assign value with a pointer */ *p = 10; cout << "pointer : " << p << endl; cout << "value : " << val << endl << endl; /* increase value by 1 */ (*p)++; cout << "pointer : " << p << endl; cout << "value : " << val << endl << endl; /* next memory position 1 */ ++p; cout << "pointer : " << p << endl; cout << "value : " << val << endl << endl; return 0;
Δείκτες και πίνακες στη C++
Μια διάηαξη πίνακα ζηη C++ (array) είναι ένας δείκηης ζηην πρώηη ηιμή, πχ: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 } #include <iostream> using namespace std; int main() int a[5] = 2,4,6,8,0}; cout << a << endl; cout << &a << endl; cout << *a << endl; return 0;
Μια μικρή συλλογή στατιστικών συναρτήσεων στη C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 #include <stdlib.h> #include <math.h> #include <iostream> #define NMAX 100000 using namespace std; double sum (double *x, unsigned int n); double sum2 (double *x, unsigned int n); double average (double *x, unsigned int n); double variance (double *x, unsigned int n); double stdev (double *x, unsigned int n); double sumxy (double *x, double *y, unsigned int n); double covar (double *x, double *y, unsigned int n); double correl (double *x, double *y, unsigned int n); double pearson (double *x, double *y, unsigned int n); int main() } double x[nmax], y[nmax]; double z; unsigned int i=0; unsigned int n; cout << "x,y : "; while (cin>>z) x[i] = z; cin >> z; y[i] = z; ++i; cout << "x,y : "; } n=i; cout << endl; cout << "Results : " << endl; cout << "ave x cout << "var x cout << "std x cout << "ave y cout << "var y cout << "std y : " << average(x,n) << endl; : " << variance(x,n) << endl; : " << stdev(x,n) << endl; : " << average(y,n) << endl; : " << variance(y,n) << endl; : " << stdev(y,n) << endl; cout << "covar : " << covar(x,y,n) << endl; cout << "correl : " << correl(x,y,n) << endl; cout << "pearson : " << pearson(x,y,n) << endl; return 0; double sum(double *x, unsigned int n) double sum = 0.0; for (int i=0; i < n; i++) sum += x[i];
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 } } return sum; double sum2(double *x, unsigned int n) double sum2 = 0.0; for (int i=0; i < n; i++) sum2 += pow(x[i], 2.0); } return sum2; } double average(double *x, unsigned int n) double ave = sum(x,n) / n; return ave; } double variance(double *x, unsigned int n) double s = sum(x, n); double s2 = sum2(x, n); double avex = average(x,n); double var = 0.0; for (int i=0; i < n; i++) var += pow( (x[i] - avex), 2.0 ); } var /= (n-1); return var; } double stdev(double *x, unsigned int n) double var = variance(x,n); double std = sqrt(var); return std; 101 } 102 103 104 double sumxy(double *x, double *y, unsigned int n) 105 106 double sumxy = 0.0; 107 for (int i=0; i < n; i++) 108 109 sumxy += x[i] * y[i]; 110 } 111 return sumxy; 112 } 113 114 double covar(double *x, double *y, unsigned int n) 115 116 double avex = average(x,n); 117 double avey = average(y,n); 118 double covar = 0.0; 119 for (int i=0; i < n; i++) 120 121 covar += (x[i] - avex) * (y[i] - avey); 122 }
123 covar /= n; 124 return covar; 125 } 126 127 128 double correl(double *x, double *y, unsigned int n) 129 130 double cov = covar (x,y,n); 131 double stdx = stdev(x,n); 132 double stdy = stdev(y,n); 133 double correl = cov / (stdx*stdy); 134 return correl; 135 } 136 137 double pearson(double *x, double *y, unsigned int n) 138 139 double sx = sum (x,n); 140 double sy = sum (y,n); 141 double s2x = sum2 (x,n); 142 double s2y = sum2 (y,n); 143 double sxy = sumxy (x,y,n); 144 double pearson = (n*sxy - sx*sy) / 145 sqrt( (n*s2x -pow(sx,2.0) ) * (n*s2y - pow(sy,2.0)) ); 146 return pearson; 147 }
Μία συνάρτηση τύπου void στη C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <iostream> using namespace std; float dr2eu(float dr); void end_of_program(); int main() float dr, eu; cout << "Give me the amount of GRD : "; cin >> dr; eu = dr2eu(dr); cout << dr << " GRD = " << eu << " EUR"<< endl; end_of_program(); return 0; 21 } 22 23 float dr2eu(float dr) 24 25 return dr / 340.75; 26 } 27 28 void end_of_program() 29 30 31 cout << endl; cout << "--------------------------------------" << endl; 32 cout << "*** here the program ends ***" << endl; 33 cout << "--------------------------------------" << endl; 34 }
Οι δείκτες είναι διευθύνσεις μνήμης
Οι μεηαβληηές αποθηκεύονηαι ζηη μνήμη, αυηό ζημαίνει πως έχουν κάποια διεύθυνζη μνήμης, πχ: 1 #include <iostream> 2 3 using namespace std; 4 5 int main() 6 7 8 float x = 1.0/3; 9 10 cout << "value : " << x << endl; 11 cout << "address : " << &x << endl; 12 13 return 0; 14 }
Προσπέλαση σε στοιχεία πίνακα με δείκτες στη C++
Ας ορίζοσμε ένα πίνακα και ένα δείκηη ζε πίνακα. Δείηε πως μπορούμε να πάροσμε ηην ηιμή ηοσ, πτ, δεύηεροσ ζηοιτείοσ με ηρεις διαθορεηικούς ηρόποσς: με ηην ηιμή ηοσ δείκηη, με αποαναθοροποίηζη, και με απεσθείας ηρόπο: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 } #include <iostream> using namespace std; int main() int a[5] = 2,4,6,8,0}; int *p; p = a; cout << *(p+1) << endl; /* by pointer */ cout << *(a+1) << endl; /* dereferencing */ cout << a[1] << endl; /* directly */ return 0;
Συνάρτηση για ανάγνωση δεδομένων στη C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <iostream> using namespace std; float dr2eu(float dr); float read_dr(); int main() float dr, eu; dr = read_dr(); eu = dr2eu(dr); cout << dr << " GRD = " << eu << " EUR"<< endl; return 0; 19 } 20 21 float read_dr(void) 22 23 24 25 26 float dr; cout << "Give me amount of drachmas : "; cin >> dr; return dr; 27 } 28 29 float dr2eu(float dr) 30 31 32 33 } float eu = dr / 340.750; return eu;
Συνάρτηση για τη μετατροπή GRD σε EUR στη C++
1 #include <iostream> 2 3 using namespace std; 4 5 float dr2eu(float dr) 6 7 float eu; 8 eu = dr / 340.75; 9 return eu; 10 } 11 12 int main() 13 14 15 16 17 18 19 20 21 22 23 24 } float dr, eu; cout << "Give me the amount of GRD : "; cin >> dr; eu = dr2eu(dr); cout << dr << " GRD = " << eu << " EUR"<< endl; return 0; Εναλλακηικά μπορούμε πρώηα να δηλώζοσμε ηο πρόησπο ηης ζσνάρηηζης (πριν ηη main) και μετά να γράψοσμε όλο τον ορισμό της σσνάρτησης: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 return 0; 19 } 20 21 float dr2eu(float dr) 22 23 float eu; 24 eu = dr / 340.75; 25 return eu; 26 } #include <iostream> using namespace std; float dr2eu(float dr); int main() float dr, eu; cout << "Give me the amount of GRD : "; cin >> dr; eu = dr2eu(dr); cout << dr << " GRD = " << eu << " EUR"<< endl;
Και οι δύο εκδοτές ηοσ προγράμμαηος θα δώζοσν ηο ίδιο αποηέλεζμα. Τέλος, ένας ζύνηομος οριζμός ηης ζσνάρηηζης θα μπορούζε να είναι: float dr2eu(float dr) return dr / 340.75; }
Το πρώτο παράδειγμα με δείκτες στη C++
Το ππώηο ππόγπαμμα με δείκηερ. Απλό και σωπίρ κάποια ιδιαίηεπη σπηζιμόηηηα, πέπα από ηην επίδειξη. Οι x,y είναι κανονικέρ μεηαβληηέρ, όπωρ ηιρ ξέποςμε. Η μεηαβληηή p είναι δείκηηρ, και σπηζιμοποιείηαι για ηην έμμεζη πποζπέλαζη ζε μεηαβληηέρ, μέζω ηηρ διεύθςνζηρ μνήμηρ. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 } #include <iostream> using namespace std; int main() int x,y,z; int *p; cin >> x; p = &x; y = *p; z = x; cout << "p = " << p << endl; cout << "y = " << y << endl; cout << "z = " << z << endl; return 0;
Ανοικτά Ακαδημαϊκά Μαθήματα Πανεπιστήμιο Ιωαννίνων Τέλος Ενότητας
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. Σημειώματα Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Ιωαννίνων, Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης. «Ηλεκτρονικοί Υπολογιστές IΙΙ. Δείκτες». Έκδοση: 1.0. Ιωάννινα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: http://ecourse.uoi.gr/course/view.php?id=1066. Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 4.0 [1] ή μεταγενέστερη. [1] https://creativecommons.org/licenses/by-sa/4.0/.