Μεθόδων Επίλυσης Προβλημάτων

Σχετικά έγγραφα
Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

17. Πολυδιάςτατοι πίνακεσ

ΕΠΛ 034: Εισαγωγή στον Προγραμματισμό για ΗΜΥ

Μεθόδων Επίλυσης Προβλημάτων

Μεθόδων Επίλυσης Προβλημάτων

Εισαγωγή στον Προγραμματισμό

Προγραμματισμό για ΗΜΥ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Μεθόδων Επίλυσης Προβλημάτων

Μεθόδων Επίλυσης Προβλημάτων

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

Κεφάλαιο Πίνακες Ι. ( ιάλεξη 15) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Μεθόδων Επίλυσης Προβλημάτων

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Διαδικασιακός Προγραμματισμός

Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Προγραμματισμό για ΗΜΥ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων. 14. Πίνακες Ι. Ιωάννης Κατάκης. ΕΠΛ 032: Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Διάλεξη 6: Δείκτες και Πίνακες

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

είκτες και Πίνακες (2)

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Μεθόδων Επίλυσης Προβλημάτων

Μεθόδων Επίλυσης Προβλημάτων

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Γλώσσα Προγραμματισμού C

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Δομημένος Προγραμματισμός

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Η γλώσσα προγραμματισμού C

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Γλώσσα Προγραμματισμού C. Προγραμματισμός HY: Γλώσσα Προγραμματισμού C. Γρήγορος Πίνακας Αναφοράς Σύνταξης. Εισήγηση #4. Επαναληπτικές δομές:

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

Να εκτυπωθούν οι πρώτες Ν σειρές του τριγώνου, χρησιµοποιώντας ένα πίνακα µεγέθους Ν στοιχείων (η Ν-οστή σειρά περιέχει Ν στοιχεία).

Κεφάλαιο ΙV: Δείκτες και πίνακες. 4.1 Δείκτες.

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Προγραμματισμός I (Θ)

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Προγραμματισμό για ΗΜΥ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κεφάλαιο 8.6. Πίνακες ΙI (Διάλεξη 17)

Γλώσσα Προγραμματισμού C

Μεθόδων Επίλυσης Προβλημάτων

Υπολογισμός - Εντολές Επανάληψης

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Δομημένος Προγραμματισμός (ΤΛ1006)

ΕΠΛ 034: Εισαγωγή στον Προγραμματισμό για ΗΜΥ

Κεφάλαιο 8.6. Πίνακες ΙI ( ιάλεξη 16) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΕΞΕΤΑΣΗ IOYNIOY 2018 ΘΕΜΑΤΑ Α ΟΝΟΜΑΤΕΠΩΝΥΜΟ:... ΑΕΜ: ΕΞΑΜΗΝΟ:

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στον δομημένο προγραμματισμό

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

Ενότητα 4: «Εισαγωγή στον Προγραμματισμό. Τα πρώτα προγράμματα σε γλώσσα C»

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Μεθόδων Επίλυσης Προβλημάτων

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Προγραμματισμός Ι (ΗΥ120)

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

ΕΠΛ 032.3: Προγραµµατισµός ΜεθόδωνΕπίλυσηςΠροβληµάτων

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

οµές (structures) και Eνώσεις (unions)

12. Συναρτήσεις (Μέρος ΙI)

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 11η: Δείκτες, μέρος 1

Εισαγωγή στον Προγραμματισμό (με. τη C)

Η γλώσσα προγραμματισμού C

Εισαγωγή στον Προγραμματισμό

Η γλώσσα προγραμματισμού C

Προγραμματισμός Η/Υ. Ενότητα 6: Πίνακες και Δείκτες

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Transcript:

ΕΠΛ 032.3: 3: Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων Αχιλλέας Αχιλλέως, Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου Email: achilleas@cs.ucy.ac.cy

Κεφάλαιο 12 Πολυδιάστατοι Πίνακες

Πολυδιάστατοι πίνακες Μέχρι τώρα μιλούσαμε για Μονοδιάστατους Πίνακες. π.χ. int age[5]= {31,28,31,30,31; ή για Παράλληλους πίνακες, π.χ. int id[5] = {1029,1132,1031,9991,1513; int age[5] = {31,28,31,30,31; Σήμερα θα μιλήσουμε για Πολυδιάστατους Πίνακες (κυρίως ισδιάστατους).

Πολυδιάστατοι πίνακες Η C διαθέτει ορθογωνικούς πολυδιάστατους πίνακες. δηλ. char array[3][7] /*[γραμμή][στήλη]*/ Αυτό συνεπάγεται ότι δεσμεύουμε ακριβός 3*7 =21 χαρακτήρες στην μνήμη. Κάθε χαρακτήρας είναι 1 byte. Επομένως η πιο πάνω δήλωση δεσμεύει 21 bytes. Για να αναφερθούμε σε κάποιο στοιχείο του πίνακα χρησιμοποιούμε δείκτες θέσης. π.χ. array[0][0]= Α, array[2][3]= Β array[3][2]= Α /*[γραμμή][στήλη]*/ έν υπάρχει το [3][2]

Κοινά Λάθη σε Πολυδιάστατους Πίνακες Ερώτηση Α Μπορούμε να δηλώσουμε μη-ορθογωνικούς πολυδιάστατους πίνακες? ΌΧΙ Θα μπορούσε να γίνει κάτι αντίστοιχο, με χρήση δυναμικής δέσμευσης μνήμης, αλλά όχι σε αυτό το μάθημα. Ερώτηση Β Μπορούν τα στοιχεία του πίνακα να είναι με να είναι ανομοιογενή (δηλαδή λ δή κάποιες γραμμές η στήλες να φέρουν διαφορετικό τύπο (int, char, float)? ΌΧΙ Θα μπορούσε να γίνει κάτι αντίστοιχο, με την χρήση κάποιων ειδικών δομών που λέγονται structs, αλλά όχι σε αυτό το μάθημα.

>2-διάστατοι Πίνακες Ένας πολυδιάστατος πίνακας είναι ένας μονοδιάστατος πίνακας κάθε στοιχείο του οποίου είναι ένας πίνακας. Μπορούν να υπάρχουν πίνακες σε πολλές διαστάσεις (η ΑΝSI-CC που χρησιμοποιούμε υποδεικνύει στους κατασκευαστές μεταγλωττιστών να προσφέρουν μέχρι 6 διαστάσεις) Σε αυτό το μάθημα θα μελετήσουμε δισδιάστατους πίνακες (η άλλη χρήσιμη κατηγόρια πινάκων είναι οι τρισδιάστατοι). Παράδειγμα 3-διάστατου πίνακα int enrolled[course][campus][year]; ][y ]; Π.χ. εγγραφές της μορφής {32,1,2004, {132,1,2005,{131,1,2005

Πολυδιάστατοι πίνακες (συν.) Αρχικοποίηση 2-διάστατου πίνακα Στατικά Μια λίστα αρχικών τιμών κλεισμένη σε άγκιστρα, όπου κάθε τιμή παίρνει αρχική τιμή από μια αντίστοιχη υπολίστα, π.χ. int studentgrades[100][6] ] = { Η πρώτες δυο γραμμές (από ό τις 100) {99, 76, 88, 74, 65, 53, περιέχουν τις 6 βαθμολογίες δυο {67, 71, 77, 71, 80, 47, φοιτητών) ; Αρχικοποίηση 2-διάστατου πίνακα με FOR loop for(i=0;i<100;i++) for(j=0;j<6; j++) studentgrades[i][j]=0; // γραμμές // στήλες T ti l l ί ίδ θ ό δ ά Tο nesting-level είναι ίδιο με τον αριθμό των διαστάσεων του πίνακα

Παράδειγμα Γράψετε ένα πρόγραμμα το οποίο α) δημιουργεί ένα πίνακα 10x10 β) Αρχικοποιεί κάθε θέση του πίνακα σε 0 γ) Εκτυπώνει τον πίνακα

Παράδειγμα 1 Λύση Α #include <stdio.h> Εκτυπώνει #define SIZE 10 0000000000 0000000000 main () { // ήλωση Πίνακα 0000000000 int matrix[size][size], i, j; 0000000000 0000000000 // Αρχικοποίηση πίνακα 0000000000 for (i=0; i<size; i++) 0000000000 for (j=0; j<size; j++) 0000000000 matrix[i][j] = 0; 0000000000 0000000000 // Εκτύπωση πίνακα for (i=0; i<size; i++) { for (j=0; j<size; j++) { printf("%d", matrix[i][j]); printf("\n"); Μετά την εκτύπωση κάθε γραμμής εκτυπώνουμε newline

Παράδειγμα 1 Λύση Β #include <stdio.h> #define SIZE 10 main () { int matrix[size][size] = {{ ; int i,j; // Εκτύπωση πίνακα for (i=0; i<size; i++) { Η Αρχικοποίηση γίνεται εδώ με δυο παρενθέσεις αντί for loop. To μειονέκτημα είναι ότι δουλεύει μόνο για αρχικοποίηση σε 0 for (j=0; j<size; j++) { printf("%d", matrix[i][j]); printf("\n");

Παράδειγμα 2 Αρχικοποίηση Πίνακα Γράψετε ένα πρόγραμμα το οποίο δημιουργεί τον πιο κάτω 2-διάστατο πίνακα στην μνήμη και στην συνέχεια τον εκτυπώνει

Παράδειγμα 2 Αρχικοποίηση Πίνακα Βλέπουμε ότι ο πίνακας Α μπορεί να παραχθεί από τον Β εάν προσθέσουμε σε κάθε θέση του Β το αριθμό 3 Α Β 01234 01234 01234 01234 01234

Παράδειγμα 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; for (i=0; i<size; i++) { for (j=0; j<size; j++) { printf("%d", matrix[i][j]); printf("\n"); ") Για κάθε i (γραμμή) εκτελείτε το πιο κάτω: j 0+3=3 1+3=4 2+3=5 3+3=6 4+3=7 Στο τέλος εκτυπώνετε

Παράδειγμα 3 Άθροισμα ιαγωνίου Γράψετε ένα πρόγραμμα το οποίο δημιουργεί τον πιο κάτω 2- διάστατο πίνακα στην μνήμη και στην συνέχεια εκτυπώνει το άθροισμα της διαγωνίου =25 Παρατηρούμε ότι οι τιμές που θέλουμε είναι για 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]; printf( Sum: %d, sum); Μεταβλητή που θα κρατά το άθροισμα for (i=0; i<size; i++) { sum += matrix[i][i];

Παράδειγμα 4 Άθροισμα Στήλης Γράψετε ένα πρόγραμμα το οποίο δημιουργεί τον πιο κάτω 2-διάστατο πίνακα στην μνήμη και στην συνέχεια εκτυπώνει το άθροισμα της τρίτης στήλης (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); Εδώ το δεύτερο for loop θα ήταν αχρείαστο.

Πολυδιάστατοι Πίνακες & Συναρτήσεις Όταν περνάμε πολυδιάστατους πίνακες σε συναρτήσεις, τότε ακολουθείτε η ίδια λογική με την περίπτωση των μονοδιάστατων πινάκων ηλαδή οι πίνακες περνάνε δια αναφοράς (και όχι δια τιμής). Επομένως δεν παράγεται ένα νέο αντίγραφο του πίνακα αλλά αντίθετα, η συνάρτηση μπορεί να κάνει κατευθείαν αλλαγές πάνω στον αρχικό πίνακα.

Πίνακες και Συναρτήσεις (Πρότυπο Ορισμός - Κλήση) #include <stdio.h> #define SIZE 4 // Πρότυπο void FillArray (int[ ][ ]); main ( ) { int array [SIZE][SIZE]; // Κλήση Συνάρτησης FillArray (array); // Ορισμός Συνάρτησης void FillArray( int table[ ][SIZE] ) { int i,j; for ( i = 0; i < SIZE; i++) { for ( j = 0; j < SIZE; j++) { table[i][j] = 0; Μόνο η πρώτη διάσταση μπορεί να παραληφθεί array[0][1] = 0 array[0] [1] = 0 array[0] [2] = 0 array[0] [3] = 0 Έξοδος: array[1][1] = 0 array[1] [1] = 0 array[1] [2] = 0 array[1] [3] = 0 array[2][1] = 0 array[2] [1] = 0 array[2] [2] = 0 array[2] [3] = 0 array[3][1] = 0 array[3] [1] = 0 array[3] [2] = 0 array[3] [3] = 0

Παράδειγμα Επεξεργασίας Βαθμών Γράψετε ένα πρόγραμμα: που διαβάζει από τ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-διαστάσεων πίνακα Β) Υπολογισμός μέσου όρου ανά φοιτητή C) Εκτύπωση αποτελεσμάτων

Παράδειγμα Επεξεργασίας Βαθμών // Σταθερές #define NUM_STUDENTS 80 #define NUM_COURSES 5 Πίνακες στο main // Πίνακας ο οποίος κρατά για κάθε φοιτητή την βαθμολογία // για κάθε μάθημα float grade_table[num_students][num_courses] = {{ ; // Πίνακας ο οποίος κρατά για κάθε φοιτητή τον // μέσο όρο της βαθμολογίας float average_per_student[num_students]={ ; 18-22

Παράδειγμα Επεξεργασίας Βαθμών 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( const float grade_table[][num_courses], float average_per_student[]){ int i,j; for(i=0;i<num 0;i<NUM_STUDENTS; i++) { for(j=0;j<num_courses; j++){ average_per_student[i]+=grade_table[i][j]; Κρατά το Sum κάθε φοιτητή 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++) j j ){ printf("%5.2f ",grade_table[i][j]); printf("%5 %5.2f\n 2f\n",average_per_student[i]); Μέσος Όρος Εκτυπώνει: 90.00 60.00 70.00 89.00 45.00 70.80 40.00 56.00 78.00 99.00 100.00 74.60

Τέλος 12 ου Κεφαλαίου