Η γλώσσα προγραμματισμού C Πίνακες 2 διαστάσεων
Δήλωση δισδιάστατου πινακα Οι δισδιάστατοι πίνακες χαρακτηρίζονται από τις γραμμές και τις στήλες (οι διαστάσεις) τους. Πίνακας 2 διαστάσεων: 3 γραμών και 4 στηλών: 1 2 3 4 Στήλες 1 Α 11 Α 12 Α 13 Α 14 2 Α 21 Α 22 Α 23 Α 24 3 Α 31 Α 32 Α 33 Α 34 Πρόκειται για μονοδιάστατο πίνακα, όπου κάθε στοιχείο του είναι ένας πίνακας. Η δήλωση στη C έχει ως εξής: Τύπος Όνομα_πίνακα [Πλήθος_γραμμών] [Πλήθος_στηλών]; Παράδειγμα δήλωσης: int A [3] [4]; 2
Η δέσμευση στοιχειων ενός δισδιάστατου πίνακα στη C Με τη δήλωση ενός πίνακα δεσμεύονται αντίστοιχα τμήματα μνήμης: int A[3][4]; // ή int Α[Μ][Ν] αν έχουν οριστεί τα Μ & Ν // δεσμεύονται 12 θέσεις ακεραίων ή 48 bytes (1 int έχει εύρος 4 bytes) char O[10][30]; // ή char O[Μ][Ν] αν έχουν οριστεί τα Μ & Ν // δεσμεύονται 300 θέσεις χαρακτήρων ή 300 bytes (1 char έχει εύρος 1 byte) float P [4][5]; // ή float P[Μ][Ν] αν έχουν οριστεί τα Μ & Ν // δεσμεύονται 20 θέσεις πραγματικών ή 40 bytes (1 float έχει εύρος 4 bytes) Πλήθος στοιχείων = (πλήθος_γραμμών) x (πλήθος_στηλών) Αριθμός bytes = (εύρος_τύπου) x (πλήθος_στοιχείων): bytes = sizeof(τύπος)*(πλήθος_γραμμών) *(πλήθος_στηλών) Αποθηκεύονται διαδοχικά πρώτα τα στοιχεία της 1ης γραμμής, στη συνέχεια τα στοιχεία της 2ης γραμμής κ.ο.κ. 3
Αναφορά σε στοιχεία ενός δισδιάστατου πίνακα Αναφερόμαστε σε κάποιο στοιχείο ενός διδιάστατου πίνακα με το όνομα του πίνακα με τους αριθμούς της γραμμής και της στήλης σε αγκύλες: A[i][j] Στήλες 0 1 2 3 0 Α[0][0] Α[0][1] Α[0][2] Α[0][3] 1 2 Α[1][0] Α[1][1] Α[1][2] Α[1][3] Α[2][0] Α[2][1] Α[2][2] Α[2][3] H αρίθμηση των γραμμών και των στηλών ξεκινάει από το 0. Σε ένα πίνακα διαστάσεων ΜxN το 1 ο στοιχείο του είναι το Α[0][0] και το τελευταίο Α[Μ-1][Ν-1]. Ο υπολογισμός της θέση μνήμης κάποιου στοιχείου Α[i][j] ενός πίνακα Α[Μ][Ν] γίνεται σύμφωνα με τον τύπο: position = i * Ν + j + 1 4
Απόδοση τιμών σε δισδιάστατους πίνακες - Ι Κατά την διάρκεια της εκτέλεσης του προγράμματος: pinakas [i][j] = 8; Με την δήλωση του πίνακα (απόδοση αρχικών τιμών): int A[2][3] = {{5,8,2, {6, 3,7; ή int A[2][3] = {5, 8, 2, 6, 3, 7; A[0][0]=5; A[0][1]=8; A[0][2]=2; A[1][0]=6; A[1][1]=3;) Α[1][2]=7; Αν δεν υπάρχουν όλες οι τιμές: int A[2][3] = {5,8,2; (A[0][0]=5; A[0][1]=8; A[0][2]=2; A[1][0/1/2]=0; ) Αποδοση αρχικών μηδενικών τιμών: int A[2][3] = {0; 5
Απόδοση τιμών σε δισδιάστατους πίνακες - Ι Είναι δυνατόν να μη δηλωθεί το πλήθος των στοιχείων των γραμμών, όταν αποδίδονται αρχικές τιμές. Το πλήθος των στηλών όμως πρέπει υποχρεωτικά να δηλωθεί: int A[][3] = {{5,8,2, {6, 3,7; ή int A[][3] = {5, 8, 2, 6, 3, 7; (θα δημιουργηθεί ένας δισδιάστατος πίνακας ακεραίων με 2 γραμμές και 3 στήλες) Για την ανάγνωση (αλλά και για τη μαζική επεξεργασία) των στοιχείων ενός πίνακα χρησιμοποιούμε ένθετες εντολές επανάληψης: Προσοχή: for (i=0;i<m; i++) for (j=0;j<n; j++) 5 8 2 6 3 7 Οι compilers της C δεν ελέγχουν αν οι δείκτες i & j υπερβαίνουν τα όρια. 6
Διάβασμα ενός δισδιάστατου πίνακα (πληκτρολόγιο) #include <stdio.h> #define M 4 #define N 5 main() { int i, j, pin[m][n]; for (i=0;i<m; i++) //ανάγνωση πίνακα for (j=0;j<n; j++) { printf("give me the no. %d,%d element:",i+1, j+1); scanf("%d",&pin[i][j]); printf("\nyou have just read:\n"); for (i=0;i<m; i++) { // εμφάνιση στη οθόνη for (j=0;j<n; j++) printf("\t%d", pin[i][j]); printf("\n"); // γιατί; 7
Δημιουργία ενός μοναδιαίου πίνακα (ΜxM) #include <stdio.h> #define Μ 4 main() { int i, j, pin[m][m] = {0; // όλα 0 for (i=0;i<m; i++) //δημιουργία πίνακα pin[i][i]=1; //διαγώνιος printf("\nyou have just creat:\n"); for (i=0;i<m; i++) { // εμφάνιση στη οθόνη for (j=0;j<m; j++) printf("\t%d ", pin[i][j]); printf("\n"); // γιατί; Μοναδιαίος 4x4: 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 8
Εύρεση μέσου όρου στοιχείων δισδιάστατου πίνακα #include <stdio.h> #define M 4 #define N 5 main() { int i, j, pin[m][n], sum; float MO; for (i=0;i<m; i++) //ανάγνωση πίνακα for (j=0;j<n; j++) { printf("give me the no. %d,%d element:",i+1, j+1); scanf("%d",&pin[i][j]); for (sum=0, i=0;i<m; i++) //υπολογισμός αθροίσματος for (j=0;j<n; j++) sum=sum+pin[i][j]; MO=(float) sum /(M*N); // υπολογισμός Μέσου Όρου printf("mo=%f\n", MO); 9
Ποια είναι η θέση του μικρότερου στοιχείου.. int i, j, pin[m][n], imin, jmin; for (i=0;i<m; i++) //ανάγνωση πίνακα for (j=0;j<n; j++) { printf("give me the no. %d,%d element:",i+1, j+1); scanf("%d",&pin[i][j]); imin=0;jmin=0; for (i=0;i<m; i++) for (j=0;j<n; j++) //εύρεση του μικρότερου if (pin[imin][jmin]>pin[i][j]) { imin=i; jmin=j; printf ("MIN=%d at position [%d],[%d]\n", pin[imin][jmin], imin+1, jmin+1);. 10
Εύρεση μεγαλύτερου και μικρότερου κάθε γραμμής int i, j, pin[m][n], MIN, MAX; for (i=0;i<m; i++) //ανάγνωση πίνακα for (j=0;j<n; j++) { printf("give me the no. %d,%d element:",i+1, j+1); scanf("%d",&pin[i][j]); for (i=0;i<m; i++) { MIN=MAX=pin[i][0]; // μηδενίζουμε σε κάθε γραμμή for (j=0;j<n; j++) { if (MAX < pin[i][j]) MAX= pin[i][j]; if (MIN > pin[i][j]) MIN = pin[i][j]; printf ("line %d, MAX=%d, MIN=%d", i+1, MAX,MIN); 11
Εύρεση μέσου όρων των διαγωνίων τετράγωνου πίνακα int i, j, pin[m][m], sum; float MO1, MO2; for (i=0;i<m; i++) //ανάγνωση πίνακα for (j=0;j<m; j++) { printf("give me the no. %d,%d element:",i+1, j+1); scanf("%d",&pin[i][j]); sum=0; // 1 η διαγώνιος for (i=0;i<m; i++) sum=sum+pin[i][i]; MO1=(float)sum/M; sum=0; //2 η διαγώνιος for (i=0;i<m; i++) // αν βάλουμε for (i = Μ-1 ; i >= 0 ; --i)? sum=sum +pin[i][(m-1)-i]; MO2=(float) sum/m; printf ("1st diagonal, average: %f\n", MO1); printf ("2nd diagonal, average: %f\n", MO2); 12
Στο εργαστήριο Μεταγλωττίστε τα προγράμματα που υπάρχουν στο περιεχόμενο της θεωρίας του μαθήματος. Διαβάστε ένα δισδιάστατο πίνακα και βρείτε τα αθροίσματα κάθε γραμμής και κάθε στήλης. Διαβάστε ένα δισδιάστατο τετραγωνικό πίνακα και βρείτε το μικρότερο στοιχείο της διαγωνίου και το μεγαλύτερο της αντιδιαγωνίου. Γράψτε ένα πρόγραμμα που θα διαβάζει 2 δισδιάστατους πίνακες με το ίδιο πλήθος γραμμών και στηλών αντίστοιχα και θα δημιουργεί ένα νέο πίνακα με άθροισμα τους. Γράψτε ένα πρόγραμμα που θα ελέγχει αν 2 δισδιάστατοι πίνακες είναι ίσοι. Γράψτε ένα πρόγραμμα με το οποίο θα ελέγχετε αν ένας τετραγωνικός πίνακας είναι μοναδιαίος. Γράψτε ένα πρόγραμμα το οποίο θα ελέγχει αν σ ένα δισδιάστατο πίνακα επικρατούν τα μηδενικά στοιχεία (> 50% -sparse matrix). 13