Προγραμματιςμόσ Μεκόδων Επίλυςθσ Προβλθμάτων 17. Πολυδιάςτατοι πίνακεσ Ιωάννθσ Κατάκθσ
Πολυδιάςτατοι πίνακεσ o Μζχρι τϊρα μιλοφςαμε για μονοδιάςτατουσ πίνακεσ ι int age[5]= 31,28,31,30,31; o Για παράλλθλουσ πίνακεσ int id[5] = 1029,1132,1031,9991,1513; int age[5] = 31,28,31,30,31; o Σιμερα κα μιλιςουμε για πολυδιάςτατουσ πίνακεσ (κυρίωσ διςδιάςτατουσ).
Πολυδιάςτατοι πίνακεσ o Η C διακζτει ορκογϊνιουσ πολυδιάςτατουσ πίνακεσ char array[3][7] /*[γραμμι+*ςτιλθ]*/ 0 0 1 2 3 4 5 6 1 2 o Αυτό ςυνεπάγεται ότι δεςμεφουμε ακριβϊσ 3*7 = 21 χαρακτιρεσ ςτθ μνιμθ o Για να αναφερκοφμε ςε κάποιο ςτοιχείο του πίνακα χρθςιμοποιοφμε δείκτεσ κζςθσ π.χ. array*0][0]= Α, array[2][3]= Β array[3][2]= Α Δεν υπάρχει το *3+*2+ 0 1 2 0 1 2 3 4 5 6 A B
Συχνζσ ερωτιςεισ Ερώτηςη Α o Μποροφμε να δθλϊςουμε μθ-ορκογϊνιουσ πολυδιάςτατουσ πίνακεσ? ΌΧΙ o Θα μποροφςε να γίνει κάτι αντίςτοιχο, με χριςθ δυναμικισ δζςμευςθσ μνιμθσ, αλλά όχι ςε αυτό το μάκθμα Ερώτηςη Β 0 1 2 0 1 2 3 4 5 6 o Μποροφν τα ςτοιχεία του πίνακα να είναι ανομοιογενι (δθλαδι κάποιεσ γραμμζσ ι ςτιλεσ να φζρουν διαφορετικό τφπο (int, char, float)? ΌΧΙ o Θα μποροφςε να γίνει κάτι αντίςτοιχο, με τθν χριςθ κάποιων ειδικϊν δομϊν που λζγονται structs, αλλά όχι ςε αυτό το μάκθμα 0 1 2 0 1 2 3 4 5 6 A 2.30 4.30 1 3 B
Διςδιάςτατοι πίνακεσ o Ζνασ πολυδιάςτατοσ πίνακασ είναι ζνασ μονοδιάςτατοσ πίνακασ κάκε ςτοιχείο του οποίου είναι ζνασ πίνακασ o Μποροφν να υπάρχουν πίνακεσ ςε πολλζσ διαςτάςεισ (θ ΑΝSI-C που χρθςιμοποιοφμε υποδεικνφει ςτουσ καταςκευαςτζσ μεταγλωττιςτϊν να προςφζρουν μζχρι 6 διαςτάςεισ) o Σε αυτό το μάκθμα κα μελετιςουμε διςδιάςτατουσ πίνακεσ (μια άλλθ χριςιμθ κατθγόρια πινάκων είναι οι τριςδιάςτατοι) o Παράδειγμα 3-διάςτατου πίνακα int enrolled[course_id][professor_id][year]; εγγραφζσ τθσ μορφισ 32,1,2004, 132,2,2005,131,3,2005
Πολυδιάςτατοι πίνακεσ (ςυν.) o Αρχικοποίθςθ διςδιάςτατου πίνακα Μια λίςτα αρχικϊν τιμϊν κλειςμζνθ ςε άγκιςτρα, όπου κάκε τιμι παίρνει αρχικι τιμι από μία αντίςτοιχθ υπολίςτα int studentgrades[100][6] = ; 99, 76, 88, 74, 65, 53, 67, 71, 77, 71, 80, 47, o Αρχικοποίθςθ διςδιάςτατου πίνακα με FOR loop for(i=0;i<100;i++) // γραμμζσ for(j=0;j<6; j++) // ςτιλεσ studentgrades[i][j]=0; Οι πρϊτεσ δυο γραμμζσ (από τισ 100) περιζχουν τισ 6 βακμολογίεσ δυο φοιτθτϊν)
Παράδειγμα Γράψετε ζνα πρόγραμμα το οποίο: α) Δθμιουργεί ζναν πίνακα 10x10 β) Αρχικοποιεί κάκε κζςθ του πίνακα ςε 0 γ) Εκτυπϊνει τον πίνακα
Παράδειγμα 1 Λφςθ Α #include <stdio.h> #define SIZE 10 main () // Διλωςθ Πίνακα int matrix[size][size], i, j; // Αρχικοποίθςθ πίνακα for (i=0; i<size; i++) for (j=0; j<size; j++) matrix[i][j] = 0; // Εκτφπωςθ πίνακα for (i=0; i<size; i++) for (j=0; j<size; j++) printf("%d", matrix[i][j]); Εκτυπϊνει 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 printf("\n"); //Μετά το τζλοσ εκτφπωςθσ μίασ γραμμισ αλλάηουμε //γραμμι
Παράδειγμα 1 Λφςθ Β #include <stdio.h> #define SIZE 10 main () int matrix[size][size] = ; int i,j; // Εκτφπωςθ πίνακα for (i=0; i<size; i++) for (j=0; j<size; j++) printf("%d", matrix[i][j]); printf("\n"); Η Αρχικοποίθςθ γίνεται εδϊ με δυο παρενκζςεισ αντί for loop. To μειονζκτθμα είναι ότι δουλεφει μόνο για αρχικοποίθςθ ςε 0
Παράδειγμα 2 - Αρχικοποίθςθ Πίνακα Γράψετε ζνα πρόγραμμα το οποίο δθμιουργεί τον πιο κάτω διςδιάςτατο πίνακα ςτθν μνιμθ και ςτθν ςυνζχεια τον εκτυπϊνει
Παράδειγμα 2 - Αρχικοποίθςθ Πίνακα Βλζπουμε ότι ο πίνακασ Α μπορεί να παραχκεί από τον Β εάν προςκζςουμε ςε κάκε κζςθ του Β τον αρικμό 3 Α Β 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Παράδειγμα 2 - Αρχικοποίθςθ Πίνακα #include <stdio.h> #define SIZE 5 main () int matrix[size][size]; int i,j; // Αρχικοποιθςθ for (i=0; i<size; i++) for (j=0; j<size; j++) matrix[i][j] = j+3; Για κάκε i (γραμμι): j 0+3=3 1+3=4 2+3=5 3+3=6 4+3=7 for (i=0; i<size; i++) for (j=0; j<size; j++) printf("%d", matrix[i][j]); printf("\n");
Παράδειγμα 3 - Άκροιςμα Διαγωνίου Γράψετε ζνα πρόγραμμα το οποίο δθμιουργεί τον παρακάτω διςδιάςτατο πίνακα ςτθ μνιμθ και ςτθν ςυνζχεια εκτυπϊνει το άκροιςμα τθσ διαγωνίου Α Παρατθροφμε ότι οι τιμζσ που κζλουμε είναι για i=j
Παράδειγμα 3 - Άκροιςμα Διαγωνίου #include <stdio.h> #define SIZE 5 main () int matrix[size][size]; int i,j; int sum = 0; // Μεταβλθτι που αποκθκεφεται το άκροιςμα // Αρχικοποίθςθ for (i=0; i<size; i++) for (j=0; j<size; j++) matrix[i][j] = j+3; // Εφρεςθ Ακροίςματοσ for (i=0; i<size; i++) for (j=0; j<size; j++) if (i==j) sum += matrix[i][j]; //Εναλλατικά for (i=0; i<size; i++) sum += matrix[i][i]; printf( Sum: %d, sum);
Παράδειγμα 4 - Άκροιςμα Στιλθσ Γράψετε ζνα πρόγραμμα το οποίο δθμιουργεί τον πιο κάτω διςδιάςτατο πίνακα ςτθ μνιμθ και ςτθ ςυνζχεια εκτυπϊνει το άκροιςμα τθσ τρίτθσ ςτιλθσ (index 2) = 25 Παρατθροφμε ότι κζλουμε τισ τιμζσ όπου το j=2
Παράδειγμα 3 - Άκροιςμα Στιλθσ #include <stdio.h> #define SIZE 5 main () int matrix[size][size]; int i,j; int sum = 0; // Αρχικοποίθςθ for (i=0; i<size; i++) for (j=0; j<size; j++) matrix[i][j] = j+3; // Εφρεςθ Ακροίςματοσ for (i=0; i<size; i++) sum += matrix[i][2]; printf( Sum: %d, sum);
Πολυδιάςτατοι Πίνακεσ & Συναρτιςεισ o Όταν περνάμε πολυδιάςτατουσ πίνακεσ ςε ςυναρτιςεισ, τότε ακολουκείται θ ίδια λογικι με τθν περίπτωςθ των μονοδιάςτατων πινάκων (κλιςθ με τιμι) o Επομζνωσ δεν παράγεται ζνα νζο αντίγραφο του πίνακα αλλά αντίκετα, θ ςυνάρτθςθ μπορεί να κάνει κατευκείαν αλλαγζσ πάνω ςε αυτόν
Πίνακεσ και Συναρτιςεισ #include <stdio.h> #define SIZE 4 // Πρότυπο void FillArrayOne (int[ ][ ]) ; main ( ) int array [SIZE][SIZE]=; // Κλιςθ Συνάρτθςθσ FillArrayOne (array); Μετά τθν κλιςθ τθσ FillArrayOne: // Οριςμόσ Συνάρτθςθσ void FillArrayOne( int table[ ][SIZE] ) int i,j; for ( i = 0; i < SIZE; i++) for ( j = 0; j < SIZE; j++) table[i][j] = 1; array[0][1] = 1 array[0] [1] = 1 array[0] [2] = 1 array[0] [3] = 1 array[1][1] = 1 array[1] [1] = 1 array[1] [2] = 1 array[1] [3] = 1 array[2][1] = 1 array[2] [1] = 1 array[2] [2] = 1 array[2] [3] = 1 array[3][1] = 1 array[3] [1] = 1 array[3] [2] = 1 array[3] [3] = 1 Μόνο η πρώηη διάζηαζη μπορεί να παραληθθεί
Παράδειγμα Επεξεργαςίασ Βακμϊν o Γράψετε ζνα πρόγραμμα Το οποίο διαβάηει από τo πλθκτρολόγιο βακμοφσ 80 φοιτθτϊν. Για κάκε φοιτθτι διαβάηονται βακμοί για 5 μακιματα 90 60 70 89 45 (βακμοί 1ου φοιτθτι) 40 56 78 99 100 (βακμοί 2ου φοιτθτι) υπολογίηει και τυπϊνει (α) βακμοφσ κάκε φοιτθτι (β) το μζςο όρο για κάκε φοιτθτι Επικυμθτι εκτφπωςθ: Μζςοσ Όροσ 90.00 60.00 70.00 89.00 45.00 70.80 40.00 56.00 78.00 99.00 100.00 74.60
Παράδειγμα Επεξεργαςίασ Βακμϊν Τι πρζπει να γίνει; α) Να διαβαςτοφν δεδομζνα από το πλθκτρολόγιο και να αποκθκευτοφν ςε ζνα 2-διαςτάςεων πίνακα β) Υπολογιςμόσ μζςου όρου ανά φοιτθτι γ) Εκτφπωςθ αποτελεςμάτων
Παράδειγμα Επεξεργαςίασ Βακμϊν // Στακερζσ #define NUM_STUDENTS 80 #define NUM_COURSES 5 // Πίνακασ ο οποίοσ κρατά για κάκε φοιτθτι τθ βακμολογία // για κάκε μάκθμα float grade_table[num_students][num_courses] = ; // Πίνακασ ο οποίοσ κρατά για κάκε φοιτθτι τον // μζςο όρο τθσ βακμολογίασ float average_per_student[num_students]= ;
Παράδειγμα επεξεργαςίασ βακμϊν main() float grade_table[num_students][num_courses] = ; float average_per_student[num_students]= ; // Διάβαςμα δεδομζνων read_data(grade_table); // Υπολογιςμόσ μζςων όρων compute_averages(grade_table, average_per_student); // Εκτφπωςθ αποτελεςμάτων display_results(grade_table, average_per_student);
Παράδειγμα επεξεργαςίασ βακμϊν void read_data(float grade_table[][num_courses]) int i,j; for(i=0;i<num_students;i++) printf("student %d\n", i); for(j=0;j<num_courses;j++) scanf("%f", &grade_table[i][j]);
Παράδειγμα Επεξεργαςίασ Βακμϊν void compute_averages(float grade_table[][num_courses], float average_per_student[]) int i,j; for(i=0;i<num_students; i++) for(j=0;j<num_courses; j++) average_per_student[i]+=grade_table[i][j]; for(i=0;i<num_students; i++) average_per_student[i]/=num_courses;
Παράδειγμα Επεξεργαςίασ Βακμϊν void display_results(float grade_table[][num_courses], float average_per_student[]) int i,j; for(i=0;i<num_students; i++) for(j=0;j<num_courses;j++) printf("%5.2f ",grade_table[i][j]); printf("%5.2f\n",average_per_student[i]);
Τζλοσ διάλεξθσ