(Πρόχειρο σχέδιο - Μαθήµατος 5) 8. ΠΙΝΑΚΕΣ (ARRAYS) //26. Array.cpp int main(void) int age[4]; //Πίνακας από 4 ακεραίους cout << "DOSTE 4 numbers"<< endl; for(int j = 0; j < 4; j++) cout << " : "; cin >> age[j]; cout << "NA TI EXOYME" << endl; for(int j = 0; j < 4; j++) cout << j<<":" << age[j]<< endl; Το µέγεθος του πίνακα προσδιορίζει πόσα στοιχεία θα έχει ο πίνακας (age[4] έχει 4 στοιχεία). Ο αριθµός µέσα στα [..] είναι το µέγεθος του πίνακα και είναι ακέραια σταθερή. Θα µπορούσε να είχε δηλωθεί και ως const int NB=4; int age[nb]; // Πίνακας από NB=4 ακεραίους Tα δεδοµένα του πίνακα ονοµάζονται στοιχεία σε αντίθεση µε τα δεδοµένα της δοµής που λέγονται µέλη. Όλα τα στοιχεία ενός πίνακα είναι ίδιου τύπου (εδώ ακέραιοι). Το πρώτο στοιχείο αριθµείται µε 0. (στο παράδειγµά µας int age[4], έχουµε 4 ακεραίους που απαιτούν 4x4=16 byte (32bit sys) µνήµη) Αρχικές τιµές σε πίνακα int days[12]=31,28,31, 30,31,30, 31,31,30, 31,30,31; ή και int days[ ]=31,28,31,30,31,30,31,31,30,31,30,31; //εδώ ξέρει ότι έχει 12 στοιχεία αν είχα int days[12]=31,28,31 //τα υπόλοιπα 9 στοιχεία θα πάρουν τιµή 0 Πολυδιάστατος πίνακας //27. 2DArray.cpp δυσδιάστατος πίνακας #include <iomanip> const int DISTRICTS = 3; //περιοχές const int MONTHS = 2; //µήνες int main(void) int d, m; double sales[districts][months]; VK - page 36
cout << endl; for(d = 0; d < DISTRICTS; d++) for(m = 0; m < MONTHS; m++) cout << "Sales for district " << d + 1; cout << ", minas " << m + 1 << ": "; cin >> sales[d][m]; cout << "\n\n"; cout << "\nminas "; for(m = 0; m < MONTHS; m++) cout<<setw(10)<<m+1; for(d = 0; d < DISTRICTS; d++) cout << "\ndistrict " << d + 1; for(m = 0; m < MONTHS; m++) cout << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2) << setw(10) << sales[d][m]; cout << endl; Ο παραπάνω πίνακας sales είναι ένας πίνακας από πίνακες. Κάθε µία από τις 3 περιοχές έχει για 2 µήνες στοιχεία πωλήσεων. (double sales[districts][months] ή double sales[3][2] Εποµένως αν θέλω τις πωλήσεις της 2 ης περιοχής το 2 ο µήνα γράφω sales[1][1]. Κάθε δεικτης έχει τα δικά του [..] //δεν βάζω, δηλ όχι sales[3,2] Αρχική τιµή double sales[3][2]= 1,4, 5,3, 8.4,9.5 ; //3 σετ των 2 Μπορώ να έχω παραπάνω από 2 διαστάσεις πίνακα Μπορώ να περάσω πίνακα σαν παράµετρο σε συνάρτηση Πίνακες µπορεί να είναι τύπου δοµής, ή και τύπου κλάσης και να έχω πίνακα από αντικείµενα. Πίνακες µπορεί να είναι µέλη κλάσης. Αν έχω ένα πίνακα από αντικείµενα π.χ. klasi Κ[3]; για να καλέσω µια συνάρτηση-µέλος της κλάσης klasi, µε όνοµα π.χ. show() θα προσπελάσω τα 3 αντικείµενα του πίνακα δίνοντας: Κ[0].show();Κ[1].show();Κ[2].show(); VK - page 37
9. ΕΙΚΤΕΣ (POINTEURS) Μπορείς να βρεις την διεύθυνση µια µεταβλητής µε τον τελεστή &. int a; cout<< &a; // 0x 22ff18 Οι µεταβλητές που κρατούν διευθύνσεις άλλων µεταβλητών καλούνται δείκτες (pointeurs). ηλώνονται µε * που σηµαίνει δείχνει προς.π.χ. int* ptr; //µεταβλητή δείκτη προς ακέραιο char* ptr; //µεταβλητή δείκτη προς χαρακτήρα //28. pointeurs int a=3; int* ptr; ptr=&a; cout<< &a <<endl; // 0x 22ff18 ptr=&a; //0x 22ff18 -ανάθεση τιµής στη µεταβλητή ptr ίση µε την διεύθυνση του a cout<<*ptr<<endl; // 3 - η τιµή της µεταβλητής που δείχνει ο ptr είναι 3 cout<<&ptr<<endl; system( "PAUSE" ); αmεταβλητή είκτη ptr = 0x 22ff18 βρίσκεται στο 0x 22ff25 Ακέραια µεταβλητή a =3 βρίσκεται στο 0x 22ff18 Η µεταβλητή δείκτη ptr έχει τιµή την διεύθυνση της a και έχει την ιδιότητα να µπορεί να δώσει την τιµή της µεταβλητής a στην οποία δείχνει. *ptr=3 Ο τελεστής * πριν το όνοµα της µεταβλητής λέγεται τελεστής αποαναφοροποίησης (dereference operator) Μερικές φορές λέγεται και τελεστής έµµεσης αναφοράς (indirection operator). Συντακτικά όµοιο να µπαίνει * πριν το όνοµα της µεταβλητής int* ptr; //µεταβλητή δείκτη προς ακέραιο int *ptr; //» Οι δείκτες πρέπει να έχουν τιµή γιατί αρχικά ένας δείκτης δεν έχει τιµή είκτης σε void H διεύθυνση, που τοποθετείτε σε ένα δείκτη πρέπει να είναι ίδιου τύπου δεδομένων με τον δείκτη. float flovar=98.6; int* ptrint=&flovar; //λάθος δεν είναι ίδιου τύπου Εξαίρεση void *ptr; // ο pointeur μπορεί να δείξει σε οποιοδήποτε τύπο δεδομένων είκτες και Πίνακες Το όνοµα ενός πίνακα είναι η διεύθυνσή του. Τα στοιχεία του πίνακα µπορούν να προσπελαστούν και µε συµβολισµό δεικτών VK - page 38
//29. Pointeurs & arrays int A[5]=31,54,77,52,93; for (int j=0;j<5;j++) //cout<<a[j]<<" "; cout<<*(a+j)<<" "; * (Α++); // είναι λάθος, δεν µπορεί να τροποποιηθεί µια σταθερά Ταξινόµηση µε δείκτες //30. Ταξινόµηση 2 αριθµών µε δείκτες void order (int*, int*); int n1=100, n2=30; order(&n1,&n2); cout<<"n1="<<n1<<endl; cout<<"n2="<<n2<<endl; void order (int* a, int* b) if (*a >*b) int temp=*a; *a=*b; //αντιµετάθεση *b=temp; //31. Ταξινόµηση πίνακα µε δείκτες, bsort παραλλαγή του bubble Sort void bsort(int* ptr, int n); const int n=10; int A[n]=37,84,62,91,11,65,57,28,19,49; VK - page 39
bsort(a,n); for (int j=0;j<n; j++) cout<<a[j]<<" "; void bsort(int* ptr, int n) void order (int*, int*); int j,k; for (j=0;j<n-1; j++) for (k=0;k<n; k++) order(ptr+j,ptr+k); void order (int* a, int* b) if (*a > *b) int temp=*a; *a=*b; //αντιµετάθεση *b=temp; VK - page 40