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

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

2ο σετ σημειώσεων. 1 Εντολές εκτέλεσης υπό συνθήκη. 19 Μαρτίου 2012

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

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

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

5ο σετ σημειώσεων - Δείκτες

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

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

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

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

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

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

Εντολές ελέγχου ροής if, for, while, do-while

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

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

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

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

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

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

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

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

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

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

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

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

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

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

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

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

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

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

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

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

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

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

Δείκτες & Πίνακες Δείκτες, Πίνακες

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

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

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

Ασκηή σεις 12ο Μαά θημα - Λυύ σεις

H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης

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

ΠΡΟΓΡΜΜΑΤΑ ΣΕ C. Γράψτε σε γλώσσα προγραμματισμού C τη συνάρτηση:

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

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

4. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Α' μέρος: for)

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

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

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

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

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

Μεταβλητές τύπου χαρακτήρα

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

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

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

Σημειώσεις για πρόοδο στο εργαστήριο

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

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

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

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

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

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

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 3η Διάλεξη Είσοδος Δεδομένων Συνθήκες Βρόχοι Παραδείγματα

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

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

scanf() scanf() stdin scanf() printf() int float double %lf float

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 7 Ο. Αριθμητικές πράξεις Τυχαίοι αριθμοί Εφαρμογές σε προβλήματα ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7) Είσοδος/ Έξοδος

ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ 8/9/2008

Τα δεδομένα στη C++ χωρίζονται σε 3 κατηγορίες: τους αριθμούς (numbers), τους χαρακτήρες (characters) και τις συμβολοσειρές (strings).

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

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7)

Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου. ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

TMHMA TEXNΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛ/ΝΙΩΝ Προγραμματισμός Ι ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ , Α ΕΞΑΜΗΝΟ Βασίλης Μποζαντζής. Βασίλης Μποζαντζής

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

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 4-2

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

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

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

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

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

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

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Εισαγωγή στις Συναρτήσεις

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 8 Ασκήσεις Πινάκων Ταξινόμηση Αναζήτηση. Γιώργος Λαμπρινίδης

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

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

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

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

printf Οι κωδικοί (format codes) του printf για διάφορους τύπους δεδοµένων είναι:

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

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Αλγόριθμοι Ταξινόμησης Μέρος 1

Transcript:

Πίνακες 0 Μαρτίου 014 1 Πίνακες Είδαμε ότι δηλώνοντας μία μεταβλητή κάποιου συγκεκριμένου τύπου δεσμεύουμε μνήμη κατάλληλη για να αποθηκευτεί μία οντότητα του συγκεκριμένου τύπου. Στην περίπτωση που θέλουμε να δεσμεύσουμε μνήμη για να αποθηκευτούν περισσότερες από μία ομοειδείς μεταβλητές μπορούμε να χρησιμοποιήσουμε πίνακες (arrays). Η δήλωση ενός πίνακα είναι όπως και η δήλωση μίας μεταβλητής με τη διαφορά ότι μετά το όνομα του πίνακα δηλώνουμε το μέγεθός του μέσα σε αγκύλες (brackets) []. Για παράδειγμα οι παρακάτω δηλώσεις δηλώνουν έναν πίνακα ακεραίων a με δέκα θέσεις, έναν πίνακα αριθμών κινητής υποδιαστολής b με 5 και έναν πίνακα χαρακτήρων c με 100: Η αρίθμηση των επιμέρους στοιχείων του πίνακα ξεκινάει από το μηδέν, δηλαδή σε έναν πίνακα με 100 στοιχεία αυτά είναι αριθμημένα από το μηδέν μέχρι και το 99 όχι όμως το 100. Το μέγεθος του πίνακα πρέπει να είναι μία ακέραιη σταθερά. Δεν μπορεί να είναι αριθμός κινητής υποδιαστολής ούτε μεταβλητή. 1 int a[10]; float b[5]; char c[100]; Αφού δηλώσουμε τον πίνακα μπορούμε να αναφερθούμε στα επιμέρους στοιχεία του με το όνομα του πίνακα ακολουθούμενο από τον αύξοντα αριθμό του στοιχείου μέσα σε αγκύλες. Π.χ. σύμφωνα με τις παραπάνω δηλώσεις οι παρακάτω εντολές σημαίνουν τα εξής: 1 a[0] = b[10]; Διάβασε το υπ αριθμόν 10 στοιχείο του πίνακα b και αποθήκευσέ το στο υπ αριθμόν 0 στοιχείο του πίνακα a. 1 b[1] = a[10] + a[11]; Διάβασε τα υπ αριθμόν 10 και 11 στοιχεία του πίνακα a, πρόσθεσέ τα και αποθήκευσε το αποτέλεσμα στο υπ αριθμόν 1 στοιχείο του πίνακα b. Χρειάζεται προσοχή όταν αναφερόμαστε στα επιμέρους στοιχεία ενός πίνακα για να μη βγούμε έξω από τα όριά του. Αν π.χ. σε έναν πίνακα a 10 στοιχείων εμείς ζητήσουμε να διαβάσουμε ή να γράψουμε στο υπ αριθμό 45, η C δεν μας εμποδίζει αλλά αυτό σίγουρα θα έχει άσχημα (έως καταστροφικά) αποτελέσματα καθώς θα πειράζουμε τμήματα μνήμης που δε θα θέλαμε να τροποποιήσουμε. Προσοχή λοιπόν ειδικά στο σημείο ότι ένας πίνακας 100 θέσεων έχει στοιχεία 1

αριθμημένα από το μηδέν μέχρι το 99 και όχι το 100. Γενικά σε έναν πίνακα n θέσεων τα επιμέρους στοιχεία αριθμούνται από το μηδέν μέχρι το n-1. Επίσης μπορούμε να αρχικοποιήσουμε πίνακες κατά τη δήλωσή τους περικλείοντας τα στοιχεία τους μέσα σε άγκιστρα στο παρακάτω παράδειγμα. Εκεί ο πίνακας p θα είναι ένας πίνακας 4 στοιχείων. Το p[0] θα είναι 15, το p[1] θα είναι 1 κοκ. 1 int p[] = { 15, 1, 7, 45}; 1.1 Παραδείγματα 1. Ένα πρόγραμμα που δηλώνει έναν πίνακα a πέντε ακεραίων, ζητάει από το χρήστη να δώσει τιμές για αυτούς και στη συνέχεια τους τυπώνει. 5 int a[5]; 7 8 for (i = 0; i < 5; ++i) { Listing 1: Τιμές σε πίνακα και εκτύπωση 9 printf(" Dose to #% d stoixeio to pinaka: ", i); 10 scanf("%d", &a[i]); 11 } 1 1 for (i = 0; i < 5; ++i) { 14 printf(" To #% d stoixeio toy pinaka einai %d\n", i, a[i]); 15 } 16 17 return 0; 18 }. Ένα πρόγραμμα όπως το παραπάνω το οποίο βρίσκει το μικρότερο στοιχείο του πίνακα. Listing : Μικρότερο στοιχείο πίνακα 5 int a[5]; 7 int mikr; 8 9 for (i = 0; i < 5; ++i) { 10 printf(" Dose to #% d stoixeio to pinaka: ", i);

11 scanf("%d", &a[i]); 1 } 1 14 mikr = a[0]; 15 for (i = 1; i < 5; ++i) { 16 if (a[i] < mikr) 17 mikr = a[i]; 18 } 19 printf(" To mikrotero stoixeio einai to %d\n", mikr); 0 1 return 0; }. Ένα πρόγραμμα όπως το παραπάνω το οποίο αθροίζει τα στοιχεία του πίνακα. 5 int a[5]; 7 int sum; 8 9 for (i = 0; i < 5; ++i) { Listing : Άθροισμα στοιχείων πίνακα 10 printf(" Dose to #% d stoixeio to pinaka: ", i); 11 scanf("%d", &a[i]); 1 } 1 14 sum = 0; 15 for (i = 0; i < 5; ++i) { 16 sum += a[i]; 17 } 18 printf(" To athroisma einai %d\n", sum); 19 0 return 0; 1 } 4. Ένα πρόγραμμα το οποίο δημιουργεί έναν πίνακα αντιστοίχισης θερμοκρασιών βαθμών Κελσίου σε βαθμούς Φαρενάιτ. Δηλαδή οι αύξοντες αριθμοί των στοιχείων του πίνακα θα είναι οι βαθμοί Κελσίου και το αντίστοιχο στοιχείο θα είναι η θερμοκρασία σε βαθμούς Φαρενάιτ. Π.χ. το a[5] θα πρέπει να έχει τη θερμοκρασία Φαρενάιτ που αντιστοιχεί στους 5 βαθμούς Κελσίου. Αν T C είναι η θερμοκρασία σε βαθμούς Κελσίου, τότε η αντίστοιχη θερμοκρασία Φαρενάιτ είναι T F = (9/5) T C +.

Listing 4: Πίνακας Κελσίου-Φαρενάιτ 5 float t[15]; 7 8 for (i = 0; i < 15; ++i) { 9 t[i] = (9./5)* i + ; 10 } 11 1 printf("oc of\n"); 1 printf("---+------\n"); 14 for (i = 0; i < 15; ++i) { 15 printf("%-d %5.f\n", i, t[i]); 16 } 17 18 return 0; 19 } 5. Όταν αναπτύσσουμε ένα πρόγραμμα που χρησιμοποιεί πίνακες, καμιά φορά χρειάζεται να τους γεμίσουμε με στοιχεία προκειμένου να ελέγξουμε την ορθότητα του προγράμματός μας. Είναι χρονοβόρο και κουραστικό να πρέπει να δώσουμε τα στοιχεία με το χέρι. Σε τέτοιες περιπτώσεις μπορούμε να χρησιμοποιήσουμε τυχαία στοιχεία καλώντας τη συνάρτηση rand(). Η δήλωση της rand() περιλαμβάνεται στο αρχείο stdlib.h το οποίο πρέπει να κάνουμε include. Η rand επιστρέφει έναν τυχαίο ακέραιο αριθμό. Αν μας ενδιαφέρουν τυχαίοι αριθμοί μέσα σε ένα συγκεκριμένο εύρος, π.χ. από το μηδέν μέχρι το 19, εφαρμόζουμε τον τελεστή % ακέραιου υπολοίπου στον αριθμό που επιστρέφει η rand. Οσοδήποτε μεγάλος και αν είναι ο αριθμός που επιστρέφει η rand, ο αριθμός rand() % 0 θα είναι από το μηδέν μέχρι το δεκαεννιά, ο rand() % 5 από το μηδέν μέχρι το τέσσερα κτλ. Το παρακάτω παράδειγμα δείχνει τη χρήση της rand για να γεμίσουμε έναν πίνακα 10 στοιχείων με τυχαίους αριθμούς από το μηδέν μέχρι το τέσσερα. Παρατηρήστε το #include <stdlib.h> στη γραμμή και τη χρήση του τελεστή % στη γραμμή 10¹. # include <stdlib.h> Listing 5: Πίνακας με τυχαία στοιχεία ¹Αν τρέξετε αρκετές φορές το παράδειγμα θα δείτε ότι δίνει πάντα τους ίδιους τυχαίους αριθμούς. Άρα δεν είναι τυχαίοι. Στην πραγματικότητα είναι ψευδοτυχαίοι δηλαδή προκύπτουν με έναν προκαθορισμένο αλγόριθμο που δίνει την εντύπωση ότι η σειρά τους είναι τυχαία. Μάλιστα, κάθε φορά που τρέχουμε κάποιο πρόγραμμα η γεννήτρια ψευδοτυχαίων αριθμών ξεκινάει από τον ίδιο και έτσι προκύπτει πάντα η ίδια σειρά αριθμών. Μπορείτε να κατεβάσετε το παράδειγμα exu6_b για να δείτε πώς μπορούμε να αλλάξουμε αυτήν τη συμπεριφορά, καλώντας τη συνάρτηση srand η οποία αρχικοποιεί τη γεννήτρια τυχαίων αριθμών με παράμετρο την τρέχουσα ώρα. 4

4 int main() 5 { 6 int t[10]; 7 int i; 8 9 for (i = 0; i < 10; ++i) 10 t[i] = rand() % 5; 11 1 for (i = 0; i < 10; ++i) 1 printf("#%d: %d\n", i, t[i]); 14 15 16 return 0; 17 } 6. Τα παραπάνω παραδείγματα έχουν το εξής πρόβλημα: Δουλεύουν σωστά για το μέγεθος πίνακα για το οποίο αρχικά γράφτηκαν αλλά αν θέλουμε να αλλάξουμε το μέγεθος του πίνακα θα πρέπει να το αλλάξουμε σε όλα τα σημεία στα οποία αυτό εμφανίζεται. Θα ήταν προτιμότερο να ορίζαμε μία συμβολική σταθερά η οποία να είχε τιμή το μέγεθος του πίνακα και όποτε χρειαζόταν να χρησιμοποιήσουμε το μέγεθος, θα χρησιμοποιούσαμε τη συμβολική σταθερά. Το παρακάτω παράδειγμα δηλώνει τη συμβολική σταθερά MSIZE στη γραμμή 4. Κατά τα άλλα είναι όπως και το παράδειγμα 6 μόνο που αντί να γράφουμε τον αριθμό 10 συγκεκριμένα όποτε θέλουμε να αναφερθούμε στο μέγεθος του πίνακα, χρησιμοποιούμε την MSIZE. Έτσι, αν κάποια στιγμή θελήσουμε να αλλάξουμε το μέγεθος του πίνακα από 10 σε 0, απλώς θα αλλάξουμε τον αντίστοιχο αριθμό στη γραμμή 4. # include <stdlib.h> Listing 6: Χρήση της #define 4 # define MSIZE 10 5 6 int main() 7 { 8 int t[ MSIZE]; 9 int i; 10 11 for (i = 0; i < MSIZE; ++i) 1 t[i] = rand() % 5; 1 14 for (i = 0; i < MSIZE; ++i) 15 printf("#%d: %d\n", i, t[i]); 16 17 return 0; 18 } 5

7. Και ένα παράδειγμα το οποίο γεμίζει ένα πίνακα ακεραίων με τυχαίες τιμές και στη συνέχεια τον ταξινομεί με τη μέθοδο της φυσαλίδας. # include <stdlib.h> Listing 7: Ταξινόμηση φυσαλίδας 4 # define MSIZE 10 5 6 int main() 7 { 8 int t[ MSIZE]; 9 int i, j, temp; 10 11 /* Arxikopoiisi pinaka */ 1 for (i = 0; i < MSIZE; ++i) { 1 t[i] = rand() % 0; 14 printf("%d ", t[i]); 15 } 16 printf("\n"); 17 18 /* Taivomnsn fysalidas */ 19 for (i = 1; i < MSIZE - 1; ++i) { 0 for (j = MSIZE - 1; j >= i; j--) { 1 if (t[j] < t[j-1]) { temp = t[j]; t[j] = t[j-1]; 4 t[j-1] = temp; 5 } 6 } 7 } 8 9 /* Ektypwsn taivomnmevou pivaka */ 0 for (i = 0; i < MSIZE; ++i) 1 printf("%d ", t[i]); printf("\n"); 4 5 return 0; 6 } 1. Πολυδιάστατοι πίνακες Στα προηγούμενα είδαμε πώς μπορούμε να δηλώσουμε πίνακες στων οποίων τα επιμέρους στοιχεία αναφερόμαστε με τη χρήση μίας παραμέτρου. Αυτοί οι πίνακες ονομάζονται μονοδιά- 6

στατοι. Ο παρακάτω πίνακας p1 για παράδειγμα αποτελείται από 100 συνεχόμενα στοιχεία ακέραιου τύπου. Μπορούμε να αναφερθούμε σε αυτά χρησιμοποιώντας έναν αριθμό από το 0 μέχρι και το 99 όπως στη γραμμή. 1 int p1[100]; p1[4] = 5; Μπορούμε όμως να δηλώσουμε και πίνακες περισσότερων διαστάσεων όπως στο παρακάτω παράδειγμα προσθέτοντας και άλλα ζευγάρια αγκυλών στη δήλωση του πίνακα. Εκεί, ο πίνακας p ορίζεται ως ένας διδιάστατος πίνακας. Για να αναφερθούμε σε κάποιο από τα στοιχεία του πρέπει να χρησιμοποιήσουμε δύο παραμέτρους όπως στη γραμμή. Στη συγκεκριμένη εντολή η πρώτη παράμετρος, ο αριθμός 1, αναφέρεται στην πρώτη διάσταση του πίνακα και μπορεί να κυμαίνεται από 0 έως και εφόσον στην αντίστοιχη διάσταση ο πίνακας έχει δηλωθεί μεγέθους 4. Η δεύτερη παράμετρος, ο αριθμός 19, αναφέρεται στη δεύτερη διάσταση του πίνακα και μπορεί να κυμαίνεται από 0 έως και 4. 1 int p[4][5]; p[1][19] = 7; Μπορούμε, αν θέλουμε, να φανταστούμε τέτοιους πίνακες ως δομές με γραμμές και στήλες, αλλά αυτό μπορεί να είναι παραπλανητικό με την έννοια ότι έχουμε συνηθίσει ως άνθρωποι να διαβάζουμε σε γραμμές και έτσι μπορεί κάποιος να θεωρήσει ότι αρκεί να φανταστεί κάτι ως γραμμή για να αποθηκευτούν αντίστοιχα δεδομένα σε συνεχόμενες θέσεις στη μνήμη από την C. Οπότε ας δούμε τους κανόνες που ισχύουν στη C: Τα στοιχεία ενός μονοδιάσταστατου πίνακα αποθηκεύονται σε διαδοχικές θέσεις στη μνήμη. Δηλαδή, στο παράδειγμα του πίνακα p1 παραπάνω, το στοιχείο p1[0] είναι το πρώτο στοιχείο του πίνακα και είναι αποθηκευμένο σε κάποια θέση μνήμης. Το στοιχείο p1[1] βρίσκεται στην αμέσως επόμενη κοκ. Και αντίστροφα, αν σε κάποια θέση μνήμης είναι αποθηκευμένο κάποιο στοιχείο p1[x] του πίνακα, τότε στην αμέσως επόμενη θέση του πίνακα θα βρίσκεται το p1[x+1]. Ο τελεστής [] που χρησιμοποιούμε για να αναφερθούμε στα επιμέρους στοιχεία ενός πίνακα είναι προσεταιριστικός από τα αριστερά προς τα δεξιά. Αυτό σημαίνει ότι στη δήλωση του πίνακα p ζητάμε έναν πίνακα 4 στοιχείων κάθε ένα από τα οποία θα είναι πίνακας 5 στοιχείων. Κάθε ένας από τους τέσσερις πίνακες των 5 στοιχείων είναι μονοδιάσταστος δηλαδή τα στοιχεία του είναι αποθηκευμένα σε συνεχόμενες θέσεις στη μνήμη. 7