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

Σχετικά έγγραφα
int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

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

H ΓΛΩΣΣΑ C. Μάθηµα 12: υναµική έσµευση Μνήµης. ηµήτρης Ψούνης

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα. ηµήτρης Ψούνης

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

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

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

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

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

Εισαγωγή στον Προγραµµατισµό «C»

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

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

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

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

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

ΗΥ-150. Πίνακες (Arrays)

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

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

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

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

ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ - ΜΕΡΟΣ Γ'

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

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

ΕΡΓΑΣΤΗΡΙΟ 11 - Απαντήσεις

H ΓΛΩΣΣΑ C. Μάθηµα 4: Τελεστές και η οµή Ελέγχου (if$else) ηµήτρης Ψούνης

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσμία: Τετάρτη 23/11/2016, 21:00

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

Το πλήθος των δεικτών και οι µεγαλύτερες τιµές που µπορούν να πάρουν ορίζεται µε µία δηλωτική εντολή που λέγεται Dimension.

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΕΡΓΑΣΤΗΡΙΟ 2 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Εργαστήριο 2. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Επαναληπτικές δοµές. µτ α.τ. Όχι. ! απαγορεύεται µέσα σε µία ΓΙΑ να µεταβάλλουµε τον µετρητή! διότι δεν θα ξέρουµε µετά πόσες επαναλήψεις θα γίνουν

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

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

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

ΑΣΚΗΣΕΙΣ ΘΕΩΡΙΑΣ. ΘΕΜΑ 1 Δίνεται το παρακάτω τμήμα δηλώσεων ενός προγράμματος σε «ΓΛΩΣΣΑ»: ΜΕΤΑΒΛΗΤΕΣ ΠΡΑΓΜΑΤΙΚΕΣ: Π[10] ΛΟΓΙΚΕΣ: ΒΡΕΘΗΚΕ ΑΚΕΡΑΙΕΣ: i

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

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

for for for for( . */

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

Οι δείκτες στη γλώσσα C

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

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

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

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

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

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

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

H ΓΛΩΣΣΑ C. Μάθηµα 15: Είσοδος/Έξοδος: Συναρτήσεις Εισόδου. ηµήτρης Ψούνης

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

1. Ακολουθία 2. Επιλογή 2.1. Απλή επιλογή

Είναι πολύ πιθανό να παραξενευτείτε βλέποντας σύµβολα όπως { και *ptr++.

ΗΥ-150. Προγραµµατισµός. Πίνακες (Arrays)

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

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

H ΓΛΩΣΣΑ C. Μάθηµα 16: Είσοδος/Έξοδος: Συναρτήσεις Eξόδου. ηµήτρης Ψούνης

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

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

Προγραμματισμός Ι. Συναρτήσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

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

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

Κεφάλαιο 5ο: Εντολές Επανάληψης

Κρυπτογραφία και Πολυπλοκότητα

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

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

1. ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

char name[5]; /* define a string of characters */

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

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

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

Οικονοµικό Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής. Φθινοπωρινό Εξάµηνο Δοµές Δεδοµένων - Εργασία 2. Διδάσκων: E. Μαρκάκης

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ (ΚΥΚΛΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΗΡΕΣΙΩΝ) Γ ΤΑΞΗΣ 2003

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

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

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

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

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

ΠΕΡΙΕΧΟΜΕΝΑ. Μονοδιάστατοι πίνακες Πότε πρέπει να χρησιμοποιούνται πίνακες Πολυδιάστατοι πίνακες Τυπικές επεξεργασίες πινάκων

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

επιµέλεια Θοδωρής Πιερράτος

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ (ΚΥΚΛΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΗΡΕΣΙΩΝ) Γ ΤΑΞΗΣ 2003

a = 10; a = k; int a,b,c; a = b = c = 10;

διανύσματα - Πίνακες - Struct Στατικό διάνυσμα Είσοδος Έξοδος δεδομένων Συναρτήσεις Χειρισμός σφαλμάτων ΤΕΤΑΡΤΗ ΔΙΑΛΕΞΗ

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

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

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

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

Transcript:

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

2 Περιεχόµενα Μαθήµατος Α. Πίνακες 1. Μονοδιάστατοι Πίνακες 1. ήλωση Πίνακα 2. Παράδειγµα Χρήσης Πίνακα 3. Αρχικοποίηση πίνακα κατά τη δήλωση 4. Στατική έσµευση Πίνακα 2. ιδιάστατοι Πίνακες 1. ήλωση Πίνακα 2. Αρχικοποίηση κατά την δήλωση 3. Απεικόνιση στη µνήµη 4. Χρήση ιδιάστατων Πινάκων 3. Πολυδιάστατοι Πίνακες 4. Πίνακες και Συναρτήσεις Β. Τυχαίοι Αριθµοί 1. Η συνάρτηση rand() 2. Η συνάρτηση srand() 3. Παράδειγµα παραγωγής τυχαίων αριθµών Γ. Ασκήσεις

1. Μονοδιάστατοι Πίνακες 1. ήλωση Πίνακα Ένας πίνακας είναι µια σειρά από µεταβλητές ίδιου τύπου αποθηκευµένες στην µνήµη. 3 Για παράδειγµα ένας πίνακας 10 ακεραίων µε όνοµα pin,είναι 10 ακέραιες µεταβλητές αποθηκευµένες στην σειρά (η µία µετά την άλλη) στην µνήµη. pin[0] pin[1] pin[2] pin[3] pin[9] Ένας πίνακας θα δηλώνεται (στο τµήµα δήλωσης µεταβλητών) µε εντολή της µορφής: Τύπος_ εδοµένων ΟΝΟΜΑ_ΠΙΝΑΚΑ[ΠΛΗΘΟΣ]; Όπου: Τύπος_ εδοµένων: Ο τύπος δεδοµένων των µεταβλητών του πίνακα. ΟΝΟΜΑ_ΠΙΝΑΚΑ: Το όνοµα που επιλέγουµε εµείς για τον πίνακα. ΠΛΗΘΟΣ (προσέξτε ότι είναι µέσα σε αγκύλες): Πόσες µεταβλητές θα περιέχει ο πίνακας

4 1. Μονοδιάστατοι Πίνακες 1. ήλωση Πίνακα Για παράδειγµα µε την δήλωση: int pin[4]; ηλώνουµε έναν πίνακα µε 4 ακέραιες µεταβλητές. Με την εντολή δήλωσης, δεσµεύεται στην µνήµη χώρος για τον πίνακα και είναι σηµαντικό ότι οι θέσεις αυτές είναι σε µια σειρά. Τα ονόµατα των 4 µεταβλητών που κατασκευάσαµε είναι: pin[0],pin[1],pin[2],pin[3] Παρατηρούµε ότι η αρίθµηση ξεκινά από το 0 εωςκαι ένα λιγότερο από τον αριθµό που δηλώσαµε. Άρα µετά την εντολή δήλωσης, έχουν δεσµευτεί 4διαδοχικές θέσειςστην µνήµη για να αποθηκεύσουν τιµές σε αυτές τις µεταβλητές,στον χώρο της συνάρτησης που έχει δηλωθεί ο πίνακας: Χώρος της συνάρτησης pin[0] pin[1] pin[2] pin[3]

1. Μονοδιάστατοι Πίνακες 2. Παράδειγµα Χρήσης Πίνακα Πλέον µετά την δήλωση έχουµε στα χέρια µας τις µεταβλητές και µπορούµε να τις χρησιµοποιήσουµε. είτε για παράδειγµα το εξής απλό πρόγραµµα: Οι µεταβλητές διαχειρίζονται όπως οι τυπικές ακέραιες µεταβλητές /* array.c: Aplo programma me pinaka */ #include <stdio.h> int main() { int pin[3]; int sum; } pin[0]=1; pin[1]=3; pin[2]=4; sum=pin[0]+pin[1]+pin[2]; printf("\n%d+%d+%d=%d",pin[0],pin[1],pin[2],sum); 5 Προσοχή, µην γράψουµε αριθµό για όριο του πίνακα που είναι εκτός του επιτρεπτού. Π.χ. Αν έχουµε δήλωση int pin[4]; και γράψουµε για όνοµα µεταβλητής pin[5] θα έχουµε σφάλµα όταν θα εκτελέσουµε το πρόγραµµα!

1. Μονοδιάστατοι Πίνακες 3. Αρχικοποιήση Πίνακα κατά την ήλωση Όπως όταν έχουµε µια µεταβλητή, µπορούµε να την αρχικοποιήσουµε µε µια τιµή όταν την δηλώνουµε µε µία εντολή της µορφής: 6 int x=5; Το ίδιο ισχύει και για τους πίνακες. Έχουµε το δικαίωµα να αρχικοποιήσουµε τον πίνακα µε µια εντολήως εξής: int pinakas[5] = {0,4,9,2,1}; Που αντιστοιχεί στην δήλωση και καταχώρηση των µεταβλητών: int pinakas[5]; pinakas[0]=0; pinakas[1]=4; pinakas[2]=9; pinakas[3]=2; pinakas[4]=1; Θέλει προγραµµατιστική προσοχή! ιότι θα πρέπει να έχουµε ακριβώς τόσες τιµές όσες και οι θέσεις του πίνακα. Αν βάλουµε λιγότερες ή περισσότερες τιµές µέσα στα άγκιστρα, τότε πιθανόν το πρόγραµµα µας να έχει µη αναµενόµενη συµπεριφορά!

1. Μονοδιάστατοι Πίνακες 3. Αρχικοποιήση Πίνακα κατά την ήλωση Λεπτοµέρειες του µεταγλωττιστή: Α) Αν δεν δηλώσουµε διάσταση κατά την αρχικοποίηση τότε ο µεταγλωττιστής αρχικοποιεί τη διάσταση στο πλήθος των στοιχείων του πίνακα. Έτσι οι δύο ακόλουθες δηλώσεις είναι ισοδύναµες: int pin[4]={2,4,6,8}; 7 int pin[]={2,4,6,8}; Λεπτοµέρειες του µεταγλωττιστή: B) Ωστόσο αν δηλώσουµε µεγαλύτερη διάσταση στον πίνακα, µπορούµε να αρχικοποίησουµεµε λιγότερα στοιχεία τον πίνακα. Θα δεσµευτεί χώρος για τα επόµενα στοιχεία, αλλά δεν µπορούµε να είµαστε σίγουροι για την τιµή που θα έχουν Για παράδειγµα η ακόλουθη δήλωση είναι έγκυρη: int pin[10]={2,4,6,8};

1. Μονοδιάστατοι Πίνακες 4. Στατική έσµευση Μνήµης Πίνακα Στην πράξη χρησιµοποιούνται 4 τρόποι για την δήλωση της διάστασης του πίνακα. Η επιλογή του τρόπου εξαρτάται από το πρόγραµµα που γράφουµε. Α τρόπος: ηλώνουµε την διάσταση «καρφωτά» µέσω ενός αριθµού. Π.χ. στο τµήµα δήλωσης των δεδοµένων γράφουµε: 8 { } int pinakas[100]; //Εδώ δηλώνουµε τη διάσταση του πίνακα int i; for (i=0; i<100; i++) { /*Κάνε κάποια πράγµατα στον πίνακα*/ } Ο τρόπος αυτός είναι αντιαισθητικός και δείχνει µικρή προγραµµατιστική εµπειρία. Π.χ. αν χρειαστεί να τροποποιήσουµε το πρόγραµµα µας για να τρέχει για 1000 ακεραίους, τότε πρέπει να βρούµε όλες τις εµφανίσεις του 100 και να το αλλάξουµε σε 1000. Αυτόν τον τρόπο θα τον εφαρµόζουµε µόνο όταν θέλουµε να «τσεκάρουµε» έναν πολύ µικρό κώδικα.

9 1. Μονοδιάστατοι Πίνακες 4. Στατική έσµευση Μνήµης Πίνακα Β τρόπος: ηλώνουµε την διάσταση µέσω µίας συµβολικής σταθεράς. Παράδειγµα: #define N 100 // Εδώ δηλώνουµε το µέγεθος του πίνακα main() { int pinakas[ν]; // ήλωση του πίνακα int i; } for (i=0; i<ν; i++) { /*Κανε κάποια πράγµατα στον πίνακα*/ } Ο τρόπος αυτός είναι ισοδύναµος µε τον προηγούµενο και έχει το πλεονέκτηµα ότι η διάσταση του πίνακα δηλώνεται µόνο µία φορά µέσω της συµβολικής σταθεράς. Σε περίπτωση που θέλουµε να αλλάξουµε τη διάσταση του πίνακα αρκεί να αλλάξουµε την τιµή στη συµβολική σταθερά.

10 1. Μονοδιάστατοι Πίνακες 4. Στατική έσµευση Μνήµης Πίνακα Γ τρόπος: ηλώνουµε τη µέγιστη διάσταση του πίνακα µέσω συµβολικής σταθεράς, και έπειτα έχουµε µία µεταβλητή για το πλήθος των θέσεων που χρησιµοποιούµε Είναι πολύ συχνό στα προγράµµατα µας, να µην ξέρουµε πόσες ακριβώς θέσεις θα χρειαστούµε στον πίνακα. Στις περιπτώσεις αυτές, κάνουµε µια εκτίµηση του πόσες θέσεις (ένα άνω όριο) θα χρειαστούµε και δηλώνουµε τον πίνακα µε αυτό το όριο. Στην συνέχεια έχουµε µια µεταβλητή που χρησιµοποιούµε ως άνω όριο του πίνακα, ανάλογα µε το πόσες θέσεις χρειαζόµαστε πραγµατικά. #define SIZE 1000 // Εδώ δηλώνουµε το µέγιστο µέγεθος του πίνακα main() { int pinakas[size]; int N=100; int i; } for (i=0; i<ν; i++) { /*Κανε κάποια πράγµατα στον πίνακα*/ }

1. Μονοδιάστατοι Πίνακες 4. Στατική έσµευση Μνήµης Πίνακα Λίγα παραπάνω πράγµατα για τους µονοδιάστατους πίνακες... Αντιλαµβανόµαστε ότι υπάρχει ένα πρόβληµα µε τους πίνακες και το µέγεθος που θέλουµε να έχουν στο πρόγραµµα µας. Τα πράγµατα είναι καλά, όταν ξέρουµε εκ των προτέρων πόσα στοιχεία θα έχει. Τότε τρόποι δήλωσης σαν αυτούς που είδαµε είναι µια χαρά! Αυτoί ο τρόποι δήλωσης του πίνακα αναφέρονται σαν στατική δέσµευση µνήµης. Αντίθετα αν οι τρόποι που αναφέραµε δεν µπορούν να εξυπηρετήσουν το πρόγραµµα µας (φανταστείτε για παράδειγµα, ένα πρόγραµµα που το µέγεθος του πίνακα εξαρτάται από την είσοδο του χρήστη σε πολύ µεγάλο βαθµό. ηλαδή την µία φορά πρέπει να τρέχει για 10 ακέραιους και την άλλη για 1.000.000 ακεραίους). Εκεί είναι κατάχρηση να δηλώνουµε τόσο µεγάλο πίνακα για πιθανόν τόσα λίγα δεδοµένα. Γι αυτόν τον λόγο θα δούµε και έναν δεύτερο τρόπο να δεσµεύουµε χώρο στην µνήµη για έναν πίνακα, στο µάθηµα 9 και καλείται δυναµική δέσµευση µνήµης. τρόπος: Ζητάµε από τον χρήστη να µας εισάγει κατά τον χρόνο εκτέλεσης την διάσταση του πίνακα και δεσµεύουµε δυναµικά τον χώρο στην µνήµη (δυναµική δέσµευση µνήµης) 11

2. ιδιάστατοι Πίνακες 1. ήλωση Πίνακα Ένας διδιάστατοςπίνακας (πίνακας 2 διαστάσεων) είναι και πάλι ένας αποθηκευτικός χώρος στην µνήµη, όπου έχουµε δύο διαστάσεις: Μία για τις γραµµές και µία για τις στήλες. Έτσι θα έχουµε το δικαίωµα να ορίσουµε π.χ. έναν πίνακα ακεραίων 6x4, δηλαδή έναν πίνακα ακεραίων µε 6 γραµµές και 4 στήλες Θα έχουµε τα εξής στοιχεία στον πίνακα (προσέξτε και πάλι ότι η αρίθµηση των γραµµών και των στηλών ξεκινάει από το 0).Όνοµα του πίνακα στο παράδειγµα είναι Α: Στήλη 0 Στήλη 1 Στήλη 2 Στήλη 3 Γραµµή 0 A[0][0] A[1][1] A[0][2] A[0][3] Γραµµή 1 A[1][0] A[1][1] A[1][2] A[1][3] Γραµµή 2 A[2][0] A[2][1] A[2][2] A[2][3] Γραµµή 3 A[3][0] A[3][1] A[3][2] A[3][3] Γραµµή 4 A[4][0] A[4][1] A[4][2] A[4][3] Γραµµή 5 A[5][0] A[5][1] A[5][2] A[5][3] 12

13 2. ιδιάστατοι Πίνακες 1. ήλωση Πίνακα Ένας διδιάστατοςπίνακας θα δηλώνεται (στο τµήµα δήλωσης µεταβλητών) µε εντολή της µορφής: Τύπος_ εδοµένων ΟΝΟΜΑ_ΠΙΝΑΚΑ[ΠΛΗΘΟΣ-ΓΡΑΜΜΩΝ][ΠΛΗΘΟΣ-ΣΤΗΛΩΝ]; Όπου: Τύπος_ εδοµένων: Ο τύπος δεδοµένων των µεταβλητών του πίνακα. ΟΝΟΜΑ_ΠΙΝΑΚΑ: Το όνοµα που επιλέγουµε εµείς για τον πίνακα. ΠΛΗΘΟΣ-ΓΡΑΜΜΩΝ, ΠΛΗΘΟΣ-ΣΤΗΛΩΝ (προσέξτε ότι είναι µέσα σε αγκύλες πρώτα οι γραµµές και έπειτα οι στήλες): Πόσες γραµµές και στήλες θα περιέχει ο πίνακας. Το πλήθος των µεταβλητών που θα οριστούν θα είναι ίσο µε το γινόµενο του πλήθος των γραµµών µε το πλήθος των στηλών. Έτσι ο πίνακας που είδαµε προηγουµένως θα δηλώνεται µε µία εντολή δήλωσης της µορφής: int Α[6][4]; Ενώ για παράδειγµα ένας 8x10 πίνακας µεταβλητών double θα δηλώνεται µε την εντολή: double Α[8][10];

14 2. ιδιάστατοι Πίνακες 2. Αρχικοποίηση κατά τη ήλωση Αντίστοιχα µε τους µονοδιάστατους πίνακες και οι διδιάστατοιπίνακες µπορούν να αρχικοποιηθούν µε µια εντολή δήλωσης της µορφής: int pinakas[2][5] = {{0,4,9,2,1},{4,3,2,5,2}}; Όπου φαίνεται ότι γράφουµε τα περιεχόµενα κάθε διαδοχικής γραµµής µέσα σε άγκιστρα....ενώ οι διαδοχικές γραµµές του πίνακα χωρίζονται µε κόµµατα και βρίσκονται σε ένα µεγάλο ζεύγος άγκιστρων. Υπάρχει και µια πιο εκκεντρική µορφή δήλωσης: int pinakas[2][5] = {0,4,9,2,1,4,3,2,5,2}; Όπου η αντιστοίχιση είναι νοητή, δηλαδή τα 5 πρώτα στοιχεία είναι για την 1 η γραµµή κ.λπ. Ο λόγος ύπαρξης αυτής της εντολής δήλωσης είναι η απεικόνιση διδιάστατωνπινάκων στην µνήµη που θα δούµε αµέσως τώρα!

2. ιδιάστατοι Πίνακες 3. Απεικόνιση στη Μνήµη Βλέπουµε πως δεσµεύεται η µνήµη για έναν πίνακα που δηλώνεται µε την εντολή: 15 int pin[2][3]; Όπως είδαµε εδώ δηλώνουµε 3x2=6 µεταβλητές. Τα ονόµατα των 6 µεταβλητών που δηλώσαµε είναι: pin[0,0] pin[0,1] pin[0,2] pin[1,0] pin[1,1] pin[1,2] Είναι σηµαντικό ότι οι µεταβλητές δηλώνονται στον χώρο µνήµης της συνάρτησης σε διαδοχικές θέσεις γραµµή προς γραµµή: pin[0,0] pin[0,1] pin[0,2] pin[1,0] pin[1,1] pin[1,2]

16 2. ιδιάστατοι Πίνακες 4. Χρήση ιδιάστατων Πινάκων Ο πιο συνηθισµένος τρόπος για να διαχειριστούµε έναν διδιάστατοπίνακα, είναι µέσω µιας διπλής (εµφωλιασµένης) for. Συνήθως λοιπόν κάνουµε µια επανάληψη στις γραµµές και µία εµφωλιασµένηεπανάληψη στις στήλες, προκειµένου να κάνουµε µια διαπέραση των στοιχείων του πίνακα: είτε για παράδειγµα τον ακόλουθο κώδικα που δηλώνει έναν 10x5 πίνακα και αρχικοποιεί τα στοιχεία του σε 0. #define M 10 #define N 5 main() { int pin[m][n]; int i,j; //Ενας µετρητής για τις γραµµές και ένας για τις στήλες } for (i=0; i<m; i++) for (j=0; j<n; j++) pin[i][j]=0; Οι παρατηρήσεις που κάναµε περί στατικής δέσµευσης µνήµης ισχύουν και για τους διδιάστατους πίνακες!

17 3. Πολυδιάστατοι Πίνακες Αντίστοιχα ένας τριδιάστατοςπίνακας (πίνακας 3 διαστάσεων) είναι και πάλι ένας αποθηκευτικός χώρος στην µνήµη, όπου έχουµε τρεις διαστάσεις Έτσι ένας 5x2x8 πίνακας θα δηλώνεται µε µία εντολή της µορφής: int Α[5][2][8]; Ο οποίος θα περιέχει 5x2x8=80 ακέραιες µεταβλητές. Οι ίδιες παρατηρήσεις που κάναµε για τους µονοδιάστατους και τους διδιάστατουςπίνακες ισχύουν βεβαίως και εδώ. Αντίστοιχα µπορούµε να ορίσουµε πίνακες πολλών διαστάσεων (δεν υπάρχει πρακτικά περιορισµός στις διαστάσεις που µπορούµε να χρησιµοποιήσουµε). Π.χ. Ένας 5-διάστατος πίνακας 2x4x9x2x4 δηλώνεται µε µία εντολή της µορφής: int Α[2][4][9][2][4]; Τέτοιοι πίνακες είναι κυρίως για εξειδικευµένες εφαρµογές και δεν θα µας απασχολήσουν στους εκπαιδευτικούς στόχους των µαθηµάτων.

18 4. Πίνακες και Συναρτήσεις Ένας πίνακας µπορεί να διοχετευτεί ως όρισµα σε µία συνάρτηση µε τον εξής τρόπο: #define N 100 void function(int pin[]); // Πρωτότυπο συνάρτησης main() { int array[n]; } function(array); // ιοχέτευση πίνακα ως όρισµα στη συνάρτηση void function(int pin[]) // Σώµα Συνάρτησης {...ενέργειες στον pin[0...99] } Ωστόσο δεν θα επεκταθούµε περαιτέρω! Σε επόµενο µάθηµα θα δούµε έναν εναλλακτικό τρόπο διοχέτευσης πινάκων σε συναρτήσεις, µε χρήση δεικτών τον οποίο και θα επιλέξουµε να εφαρµόζουµε στην πράξη.

19 Β. Τυχαίοι Αριθµοί 1. Η συνάρτηση rand() Εδώ θα κάνουµε µια σύντοµη αναφορά σε δύο συναρτήσεις βιβλιοθήκης της C που µας επιτρέπουν να κάνουµε παραγωγή τυχαίων αριθµών. Η συνάρτηση rand() επιστρέφει τυχαίους αριθµούς. Το πρωτότυπό της είναι: unsigned int rand() Η οποία επιστρέφει έναν τυχαίο αριθµό στο διάστηµα 0...MAX_INT όπου MAX_INT ο µέγιστος µη προσηµασµένος ακέραιος που µπορεί να απεικονίσει το σύστηµά µας (συνήθως το 2 32-1) Είναι ορισµένη στην βιβλιοθήκη συναρτήσεων stdlib.h Ας δούµε δύο τρόπους να την χρησιµοποιήσουµε: x=rand()%100 Στο x θα αποθηκευτεί ένας αριθµός από το 0 έως το 99 x=10+rand()%91 Στο x θα αποθηκευτεί ένας αριθµός από το 10 έως το 100

20 Β. Τυχαίοι Αριθµοί 2. Η συνάρτηση srand() Ο τρόπος λειτουργίας της rand() στηρίζεται σε κάποια περίπλοκα µαθηµατικά και κάθε φορά παράγει την ίδια ακολουθία τυχαίων αριθµών. Για τον λόγο αυτό, λέµε ότι παράγει ψευδοτυχαίουςαριθµούς. Προκειµένου κάθε φορά που τρέχουµε το πρόγραµµα να παράγει άλλη ακολουθία τυχαίων αριθµών, πρέπει αρχικά στο πρόγραµµά µας να τρέξουµε την συνάρτηση: Που έχει δηλωθεί στη βιβλιοθήκη: void srand(int seed) stdlib.h Ο πιο συνηθισµένος τρόπος χρήσης είναι στην αρχή του προγράµµατός µας να γράψουµε την εντολή: srand(time(null)); Έτσι ώστε να αρχικοποιηθεί η ακολουθία τυχαίων αριθµών µε µία παράµετρο που εξαρτάται από την τρέχουσα ώρα. Θα απαιτηθεί να ενσωµατώσουµε και το αρχείο κεφαλίδας time.h στο οποίο έχει οριστεί η συνάρτηση time() που χρησιµοποιεί το πρόγραµµά µας.

21 Β. Τυχαίοι Αριθµοί 3. Παράδειγµα παραγωγής τυχαίων αριθµών Το παρακάτω πρόγραµµα τυπώνει στην οθόνη 10 τυχαίους αριθµούς στο διάστηµα 0...99 /* random.c: Typwnei 10 tyxaioys akeraioys sto diastima 0..99 */ #include <stdio.h> #include <stdlib.h> #include <time.h> main() { int x,i; srand(time(null)); } for (i=0; i<10; i++) { x=rand()%100; printf("\n%d",x); }

22 Γ. Ασκήσεις 1. Αρχικοποίηση και Εκτύπωση Μονοδιάστατου Πίνακα Γράψτε ένα πρόγραµµα το οποίο: 1. Να δηλώνει έναν πίνακα 100 ακεραίων (SIZE) 2. Ναι διαβάζει από τον χρήστη έναν αριθµό Ν από το 20 έως το 100 (που θα δηλώνει το πλήθος των στοιχείων του πίνακα που θέλει να χρησιµοποιήσει). Να πραγµατοποιηθεί έλεγχος ότι ο χρήστης πληκτρολόγησε τιµή από το 20 έως το 100. 3. Να αρχικοποιηθεί ο πίνακας µε τυχαίους αριθµούς 4. Να προβάλλει τα στοιχεία του πίνακα στην οθόνη µε έναν κοµψό τρόπο.

23 Γ. Ασκήσεις 2. Εκτύπωση ιδιάστατων Πινάκων Γράψτε ένα πρόγραµµα το οποίο: 1. Να δηλώνει έναν διδιάστατο πίνακα 5x8 2. Να αρχικοποιεί τις τιµές του πίνακα, αναθέτοντας σε κάθε θέση έναν τυχαίο αριθµό από 0 έως 200 3. Να προβάλλει τα στοιχεία του πίνακα στην οθόνη µε έναν κοµψό τρόπο (σε κάθε γραµµή της οθόνης να είναι και µία γραµµή του πίνακα)

24 Γ. Ασκήσεις 3. Στατική έσµευση Μνήµης σε ιδιάστατο Πίνακα Γράψτε ένα πρόγραµµα σε γλώσσα C που: 1. Να δηλώνει έναν διδιαστατο πίνακα 100x200 ακεραίων (SIZE1xSIZE2) 2. Ναι διαβάζει από τον χρήστη έναν αριθµό Mαπό το 10 έως το 100 (που θα δηλώνει το πλήθος των γραµµών του πίνακα που θέλει να χρησιµοποιήσει). Να πραγµατοποιηθεί έλεγχος ότι ο χρήστης πληκτρολόγησε τιµή από το 10 έως το 100. 3. Ναι διαβάζει από τον χρήστη έναν αριθµό Ν από το 10 έως το 100 (που θα δηλώνει το πλήθος των στηλών του πίνακα που θέλει να χρησιµοποιήσει). Να πραγµατοποιηθεί έλεγχος ότι ο χρήστης πληκτρολόγησε τιµή από το 10 έως το 100. 4. Να αρχικοποιηθεί ο πίνακας µε τυχαίους αριθµούς 5. Να προβάλλει τα στοιχεία του πίνακα στην οθόνη µε έναν κοµψό τρόπο.

25 Γ. Ασκήσεις 4. Κατασκευή Παιχνιδιού! Γράψτε ένα πρόγραµµα σε γλώσσα C που: 1. Θα αρχικοποιεί µία µεταβλητή µε όνοµα hidden µε έναν τυχαίο ακέραιο αριθµό από το 1 έως το 100. 2. Θα ζητεί από τον χρήστη να πληκτρολογήσει (µαντέψει) τον αριθµό 1. Αν ο χρήστης εισάγει τον αριθµό, θα εκτυπώσει κατάλληλο µήνυµα επιβράβευσης και θα τερµατίσει. 2. Αν ο χρήστης εισάγει µικρότερο αριθµό, θα εκτυπώσει κατάλληλο µήνυµα στον χρήστη να πληκτρολογήσει µεγαλύτερο αριθµό και θα επαναλάβει από το βήµα 2 3. Αν ο χρήστης εισάγει µεγαλύτερο αριθµό, θα εκτυπώσει κατάλληλο µήνυµα στον χρήστη να πληκτρολογήσει µικρότερο αριθµό και θα επαναλάβει από το βήµα 2

26 Γ. Ασκήσεις Όπως είδαµε το συντακτικό και η χρήση των πινάκων δεν είναι ιδιαίτερα δύσκολο. Σηµαντικότερο είναι να αναπτύξουµε αλγοριθµική σκέψη, δηλαδή να µάθουµε σκεπτικά που έχουν αναπτυχθεί για την αποδοτική επίλυση προβληµάτων µε τον υπολογιστή. Συνίσταται λοιπόν στο σηµείο αυτό να µελετηθούν τα ακόλουθα τέσσερα µαθήµατα αλγορίθµων µε τη βοήθεια της γλώσσας C: Αλγόριθµοι σε C Μάθηµα 1: ιαπέραση Πίνακα Αλγόριθµοι σε C Μάθηµα 2: Αναζήτηση σε Πίνακα Αλγόριθµοι σε C Μάθηµα 3: Ταξινόµηση Πίνακα Αλγόριθµοι σε C Μάθηµα 4: Αλγεβρικές Πράξεις Πινάκων