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

Σχετικά έγγραφα
5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ηλεκτρονικοί Υπολογιστές

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C: Από τη Θεωρία στην Εφαρμογή

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

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

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

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

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

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

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

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

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

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

2 η Διάλεξη C++ Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

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

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

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

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

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

Εισαγωγή στην πληροφορική

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

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

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

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

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

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

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

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

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

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

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

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

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

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

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

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

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

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

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

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

ΣΥΝΟΠΤΙΚΟΣ ΟΔΗΓΟΣ ΓΛΩΣΣΑΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C

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

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

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

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

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

Οι εντολές ελέγχου της ροής ενός προγράμματος.

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 10 Ο. Δομές Ενώσεις Απαριθμητοί τύποι δεδομένων ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

Πίνακες. Χρησιμοποιούνται για αποθήκευση συνόλου δεδομένων του ίδιου τύπου. Γραμμική Διάταξη Δήλωση Τύπος Δεδομένων ΌνομαΠίνακα[ length ]

3. ΕΝΤΟΛΕΣ ΕΛΕΓΧΟΥ (Β' μέρος: switch και :? )

Transcript:

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ 6.1 Η Έννοια του Πίνακα Συχνά είναι προτιμότερο να αντιμετωπίζουμε ένα σύνολο μεταβλητών σαν ενότητα για να απλοποιούμε το χειρισμό τους. Έτσι οργανώνουμε σύνθετα δεδομένα σε ομάδες που ονομάζουμε δομές δεδομένων (data structures). Μια δομή δεδομένων είναι ο πίνακας (array). Οι πινάκες χρησιμοποιούνται για την αποθήκευση στη μνήμη του υπολογιστή ενός μεγάλου πλήθους δεδομένων που συνήθως, συνδέονται μεταξύ τους με κάποια λογική σχέση. Πίνακας (array) είναι ένα σύνολο μεταβλητών του ίδιου τύπου που έχουν κοινό όνομα. Η διάκριση των μεταβλητών που αποτελούν ένα πίνακα γίνεται με τη χρήση ενός αριθμού που προσδιορίζει τη θέση κάθε μεταβλητής και ονομάζεται δείκτης(index). Ο δείκτης του πίνακα είναι ουσιαστικά ένας ακέραιος αριθμός που συνοδεύει το κοινό όνομα όλων των μεταβλητών και τοποθετείται μέσα σε αγκύλες. Έτσι, για παράδειγμα, οι μεταβλητές: x[0], x[1], x[2] και x[3] είναι τέσσερις διαφορετικές μεταβλητές που σχηματίζουν ένα πίνακα τεσσάρων στοιχείων. Ένας πίνακας ορίζεται όπως κάθε άλλη μεταβλητή στην αρχή της συνάρτησης (π.χ. στη main() ). Ότι είναι πίνακας γίνεται κατανοητό από τις αγκύλες στο τέλος του ονόματος. Πρέπει όμως να προσδιορίσουμε τον τύπο και το μέγεθος του (ο αριθμός μέσα στις αγκύλες) όπως φαίνεται παρακάτω: char name[30]; int a[100], b[100]; Οι εντολές αυτές ορίζουν αντίστοιχα: πίνακα τριάντα θέσεων (στοιχείων) τύπου χαρακτήρα με όνομα name[ ], name[0] name[1] name[2]... name[ 29] έναν ακέραιο πίνακα τεσσάρων θέσεων με το όνομα my_class [ ] και δύο πίνακες ακεραίων αριθμών με τα ονόματα a[ ] και b[ ] αντίστοιχα, που περιλαμβάνουν εκατό θέσεις ο καθένας. a[0] a[1] a[2]... a[99] b[0] b[1] b[2]... b[99] Η παράσταση των πινάκων παραπάνω είναι αντίστοιχη με την εσωτερική διάταξη των στοιχείων στη μνήμη του υπολογιστή. 1

Στη γλώσσα C, το πρώτο στοιχείο ενός πίνακα έχει πάντα δείκτη 0. Αυτό σημαίνει ότι αν ο πίνακας οριστεί με την εντολή: τύπος ονομα_πίνακα[ν]; τότε τα στοιχεία του πίνακα έχουν δείκτη: 0, 1, 2,..., Ν-1 και είναι συνολικά N. Προσέξτε ότι τα στοιχεία του πίνακα είναι διατεταγμένα στη σειρά το ένα πίσω από το άλλο, χωρίς ενδιάμεσα κενά διαστήματα. Ο ορισμός ενός πίνακα είναι μια άμεση εντολή στο μεταγλωττιστή της C η οποία δεσμεύει έναν καθορισμένο αριθμό bytes για τον πίνακα αυτό. Κάθε στοιχείο του πίνακα καταλαμβάνει το ίδιο μήκος με οποιοδήποτε άλλο στοιχείο του. Το συνολικό μέγεθος ενός πίνακα σε bytes καθορίζεται από τον τύπο του. Οι πίνακες που ορίσαμε προηγουμένως (name [ ], a [ ] και b [ ]) έχουν μήκος 30*1 = 30, 4*100 = 400 και 4*100 = 400 bytes αντίστοιχα υποθέτοντας ότι εργαζόμαστε σ' έναν υπολογιστή όπου ένας ακέραιος καταλαμβάνει τέσσερα bytes και ένας χαρακτήρας ένα byte. 6.2 Απόδοση Αρχικών Τιμών & Επεξεργασία Πίνακα Όπως και με τις απλές μεταβλητές, τα στοιχεία ενός πίνακα μπορούν να λάβουν αρχικές τιμές είτε ταυτόχρονα με τον ορισμό του πίνακα είτε στο κυρίως σώμα του προγράμματος. Στην πρώτη περίπτωση οι τιμές που αποδίδονται στα στοιχεία του πίνακα σχηματίζουν μια λίστα δεδομένων που περικλείονται σε άγκιστρα... Οι επόμενες εντολές αποδίδουν στους πίνακες name [ ] και length [ ] αρχικές τιμές: char name[6] = 'G', 'Έ', 'O', 'R', 'G', 'E'; int length[3] = 1, 5, 10; float grades[ ] = 8.5, 9.0, 9.3, 10.0; Όταν ο ορισμός ενός πίνακα συνοδεύεται με την απόδοση αρχικών τιμών στα στοιχεία του, τότε δεν είναι υποχρεωτικό να προσδιορίσουμε το πλήθος των στοιχείων του (6 και 3 στα δυο πρώτα παραδείγματα παραπάνω, ενώ όπως γίνεται αντιληπτό ο πίνακας grades[ ] θα έχει 4 στοιχεία). Η απόδοση αρχικών τιμών στον πίνακα με τον τρόπο αυτόν μπορεί να γίνει μόνο στην εντολή ορισμού του. Αν ορίσουμε έναν πίνακα αλλά αποδώσουμε αρχικές τιμές μόνο σε μερικά από τα στοιχεία του, ο μεταγλωττιστής της C αποτελειώνει την εργασία απόδοσης αρχικών τιμών αποδίδοντας μηδενικές τιμές στα υπόλοιπα στοιχεία του πίνακα. Επομένως ο ορισμός: int a[5] = 1,2,3; εξασφαλίζει ότι τα στοιχεία του πίνακα a[ ] έχουν τιμές a[0]=1, a[1]=2, a[2]=3, a[3]=0 και a[4]=0. Γενικά πάντως είναι καλύτερα να δίνουμε αρχικές τιμές σε κάθε στοιχείο του πίνακα χωριστά, ώστε να έχουμε πλήρη έλεγχο του προγράμματος και των λειτουργιών του. Για το σκοπό αυτό χρησιμοποιούμε συνήθως ένα βρόχο for, αν θέλουμε για παράδειγμα όλα τα στοιχεία του να είναι μηδέν. 2

Παράδειγμα 1 include <stdio.h> int i ; double measure[20]; measure [i] =0.0; printf("to stoixeio %d exei timi %f\n", i+1, measure[i] ); Προσοχή!!! Στην printf, γράψαμε i+1 (και όχι i), γιατί όταν δει ο χρήστης το πρώτο στοιχείο θα πρέπει να λέει το στοιχείο 1 (και όχι το στοιχείο 0). Θα μπορούσαμε να βάλουμε το μετρητή της for(εδώ το i) να ξεκινάει από το 1, όμως το σωστό είναι όπως το βάλαμε γιατί το πρώτο στοιχείο στον πίνακα (που επίσης αναφέρεται) είναι το στοιχείο με δείκτη 0. Μια μεταβλητή i χρησιμοποιείται για την πρόσβαση των στοιχείων του πίνακα measure[ ] που πρόκειται να μηδενιστούν. Γενικά είναι δυνατό να χρησιμοποιήσουμε μια ακέραια παράσταση για τον εντοπισμό και την επεξεργασία των στοιχείων ενός πίνακα. Για παράδειγμα, η αντιγραφή του πίνακα a[20] στον πίνακα b[20] γίνεται αντιγράφοντας κάθε στοιχείο χωριστά: for(i=0;i<20;i++) b[i] = a[i]; Ο μόνος περιορισμός είναι ότι η τιμή της παράστασης δεν πρέπει να είναι μεγαλύτερη από το μέγεθος του πίνακα. Για παράδειγμα αν έχουμε ορίσει τον πίνακα: int a[100]; δεν μπορούμε να μιλήσουμε για το στοιχείο a[105] ή a[100], παρά μόνο μέχρι το στοιχείο a[99]. Παράδειγμα 2 int i ; double a[20], b[20]; a[i] = 1.0; 3

printf("%d \t %f\n",i,a[i] ); b[i] = i; for(i=0;i<20;i++) a[i] = b[i]; printf("printing a[i]... \n" ); printf("%d \t %f\n",i,a[i] ); Παράδειγμα 3 Έστω ότι θέλουμε να βγαλουμε το μέσο όρο της βαθμολογίας για 5 μαθήματα που δώσαμε, όπως κάναμε στο 5ο μάθημα κεφ. 5.4. Τώρα, θα χρησιμοποιήσουμε πίνακες, ώστε στο τέλος θα μπορούμε να ζητήσουμε από το πρόγραμμα τους βαθμούς, αφού κάθε μάθημα θα αποθηκεύεται σε μια θέση του πίνακα και δε θα σώζονται όλοι οι βαθμοί στην ίδια μεταβλητή vathmos, όπου στο τέλος υπάρχει μόνο ο τελευταίος. void main () int mathima,vathmos[5],sum; float mo; sum=0; for (mathima=0;mathima<5;mathima++) printf("dwse to %do mathima:\n",mathima+1); scanf("%d",&vathmos[mathima]); while (vathmos[mathima]<0 vathmos[mathima]>20) printf("edwses lathos vathmo,xanadwse:\n"); scanf("%d",&vathmos[mathima]); printf ("To %do mathima pires %d\n",mathima+1,vathmos[mathima]); sum=sum+vathmos[mathima]; printf("to a8roisma ws twra einai %d\n\n",sum); mo=(float)sum/5; printf ("O mesos oros einai %6.2f\n",mo); for (mathima=0;mathima<5;mathima++) printf ("To %do mathima pires %d\n",mathima+1,vathmos[mathima]); 6.3 Ορισμός συμβολικής σταθεράς Έστω ότι θέλουμε να μετατρέψουμε το παραπάνω πρόγραμμα και για έναν άλλο μαθητή, ο οποίος όμως έχει 8 μαθήματα. Έτσι πρέπει σε αρκετά σημεία να αλλάξουμε το 5 και να το κάνουμε 8 (π.χ. για το μέγεθος του πίνακα, τις συνθήκες της for, το μέσο όρο κλπ). Υπάρχει όμως περίπτωση κάποια 5, μέσα στο πρόγραμμα να μην πρέπει να αλλαχθούν, γιατί ίσως κάνουν άλλες 4

διεργασίες. Για να μην κάνουμε λάθος με τις αντικαταστάσεις ή δεν αλλάξουμε κάποιο, χρησιμοποιούμε τις συμβολικές σταθερές. Έτσι, κάνουμε μόνο μια αλλαγή στην αρχή που καθορίζουμε τη συμβολική σταθερά (που μπορούμε να της δώσουμε ότι όνομα θέλουμε, απλά είναι κοινό χρησιμοποιούμενο να γράφεται με κεφαλαία και δεν μπορεί να αλλάξει η τιμή της μέσα στο πρόγραμμα, αντιθέτως με τις μεταβλητές). Το πρόγραμμα όπου βλέπει τη σταθερά NUM_MATH θεωρεί ότι βλέπει τον αριθμό 8. Παράδειγμα #define NUM_MATH 8 void main () int mathima,vathmos[num_math],sum; float mo; sum=0; for (mathima=0;mathima<num_math;mathima++) printf("dwse to %do mathima:\n",mathima+1); scanf("%d",&vathmos[mathima]); while (vathmos[mathima]<0 vathmos[mathima]>20) printf("edwses lathos vathmo,xanadwse:\n"); scanf("%d",&vathmos[mathima]); printf ("To %do mathima pires %d\n",mathima+1,vathmos[mathima]); sum=sum+vathmos[mathima]; printf("to a8roisma ws twra einai %d\n\n",sum); mo=(float)sum/num_math; printf ("O mesos oros einai %6.2f\n",mo); for (mathima=0;mathima<num_math;mathima++) printf ("To %do mathima pires %d\n",mathima+1,vathmos[mathima]); Αν θέλουμε να κάνουμε το πρόγραμμα για ένα μαθητή με 5 μαθήματα, απλά αλλάζουμε τη δήλωση της σταθεράς και γράφουμε: #define NUM_MATH 5 6.4 Πίνακες Χαρακτήρων και Αλφαριθμητικά Τα αλφαριθμητικά αποθηκεύονται στον υπολογιστή σαν πίνακες χαρακτήρων. Αλφαριθμητικό (string) είναι ουσιαστικά μια ειδική περίπτωση ενός πίνακα χαρακτήρων όπου ο τελευταίος χαρακτήρας είναι ο κενός χαρακτήρας: '\0'. (Θεωρείται ένας χαρακτήρας, όπως συμβαίνει με την αλλαγή γραμμής '\n'). 5

Επομένως ο ορισμός και η απόδοση αρχικών τιμών σ' ένα αλφαριθμητικό ακολουθεί τους κανόνες που περιγράψαμε στην προηγούμενη παράγραφο για τους πίνακες δεδομένων. Για παράδειγμα η εντολή: char city[15] = "Thessaloniki"; ορίζει ένα πίνακα χαρακτήρων με 15 στοιχεία που γεμίζει ως εξής: T h e s s a l o n i k i \0 Οι δύο τελευταίες θέσεις του πίνακα περιέχουν πιθανώς κάποιες τιμές αλλά δε λαμβάνουν μέρος στην επεξεργασία του αλφαριθμητικού, αφού βρίσκονται μετά το χαρακτήρα '\0' που σημειώνει το τέλος του. Επομένως, το ελάχιστο μέγεθος του πίνακα city[ ] είναι 13 στοιχεία (12 για το "Thessaloniki" και 1 ο χαρακτήρας '\0'). Αν ο πίνακας οριστεί με λιγότερες από 13 θέσεις, θα χτυπήσει λάθος στο πρόγραμμα. Η γλώσσα C προσφέρει τη δυνατότητα στον προγραμματιστή να ορίσει ένα αλφαριθμητικό χωρίς να προσδιορίσει το μήκος του: char city[] = "Thessaloniki"; Όταν ο μεταγλωττιστής της C συναντήσει έναν τέτοιο ορισμό, μετρά το πλήθος χαρακτήρων του αλφαριθμητικού, προσθέτει ένα για τον κενό χαρακτήρα, και δεσμεύει τον αντίστοιχο χώρο στη μνήμη του υπολογιστή. Σημειώστε ότι για την απόδοση αρχικών τιμών στο αλφαριθμητικό χρησιμοποιούμε τα εισαγωγικά " ", αντί των αγκίστρων και αποστρόφων που είδαμε στην προηγούμενη παράγραφο. (Υπενθύμίση: char name[6] = 'G', 'Έ', 'O', 'R', 'G', 'E'; ) Στο παράδειγμα που ακολουθεί εισάγουμε ένα αλφαριθμητικό και κατόπιν εμφανίζουμε τους μεμονωμένους χαρακτήρες του. Παράδειγμα 1 int index ; char name[20]=0; printf("enter your name:"); scanf("%s",&name); for(index=0; index<20; index++) printf("%c\n",name[index]); Εδώ, βλέπουμε ότι για να διαβαστεί ένα αλφαριθμητικό(string), που ουσιαστικά είναι πίνακας χαρακτήρων, γράφουμε με μορφοποίηση την "%s", δηλαδή scanf("%s",&name); και οι χαρακτήρες του αλφαριθμητικού μπαίνουν στον πίνακα που αναφέραμε (εδώ ο πίνακας με το όνομα name[ ] ) 6

6.5 Πολυδιάστατοι πίνακες Ένας πίνακας είναι πολυδιάστατος (multidimensional) αν για τον προσδιορισμό της θέσης κάποιου στοιχείου του απαιτούνται περισσότεροι από ένας ακέραιοι αριθμοί. Το πλήθος των ακεραίων ονομάζεται διάσταση (dimension) του πίνακα. Στις προηγούμενες παραγράφους γνωρίσαμε τους απλούς (μονοδιάστατους) πίνακες που όπως είδαμε αποτελούν ουσιαστικά λίστες δεδομένων. Στους δισδιάστατους πίνακες σκεφτόμαστε έναν πίνακα με γραμμές και στήλες, ενώ ο τρισδιάστατος ένα όγκο, όπως φαίνεται στην εικόνα. Στην εικόνα ο μονοδιάστατος έχει μέγεθος 5, ο δισδιάστατος 5x4 (πρώτα αναφέρονται οι γραμμές) και ο τρισδιάστατος 5x4x2. Για τους παραπάνω, θα μπορούσαμε να δηλώσουμε μέσα στο πρόγραμμα μας. int a[5]; int b[5][4]; int c[5][4][2]; Έτσι, για το δισδιάστατο πίνακα b, δίνεται η εντολή να εξασφαλίστούν είκοσι θέσεις μνήμης (των 4 bytes η κάθε μία, αφού είναι ακέραιοι). Επειδή η μνήμη του υπολογιστή είναι ουσιαστικά ένας μονοδιάστατος πίνακας, η αποθήκευση των πολυδιάστατων πινάκων γίνεται "ανά γραμμή". Όπως και στους μονοδιάστατους πίνακες ο ορισμός ενός πολυδιάστατου πίνακα μπορεί να συνοδεύεται από την απόδοση αρχικών τιμών. Για παράδειγμα μπορούμε να έχουμε: int a[5][4] = 1,2,3,4,2,4,6,8,3,5,7,9,5,6,7,8,1,2,3,4; Η γλώσσα C μπορεί ωστόσο να αναγνωρίσει και να διαβάσει τα δεδομένα απόδοσης αρχικών τιμών ακόμα και αν δίνονται σαν απλή λίστα σταθερών: int a[5][4] = 1,2,3,4,2,4,6,8,3,5,7,9,5,6,7,8,1,2,3,4; Ανάλογα με τα όσα είπαμε για τους μονοδιάστατους πίνακες, η απόδοση αρχικών τιμών σε μερικά μόνο στοιχεία ενός πολυδιάστατου πίνακα έχει ως αποτέλεσμα το μηδενισμό όλων των υπολοίπων στοιχείων του. Επομένως ένας απλός και γρήγορος τρόπος για να μηδενίσουμε όλα τα στοιχεία ενός πολυδιάστατου πίνακα είναι να γράψουμε: int array[100][200][300] = 0 ; Είναι προφανές ότι η επεξεργασία των πολυδιάστατων πινάκων γίνεται συνήθως με ένθετες επαναληπτικές διαδικασίες (κυρίως εντολές for). Για 7

παράδειγμα, το επόμενο πρόγραμμα υπολογίζει τον πίνακα αθροίσματος C δύο δισδιάστατων πινάκων Α και Β: Παράδειγμα 5 int A[3][3]= 1,2,3, 4,5,6, 7,8,9 ; int B[3][3]=9,8,7, 6,5,4, 3,2,1; int i,j,c[3][3] = 0 ; for(i=0; i<3; i++) for(j=0; j<3; j++) C[i][j]=A[i][j]+B[i][j]; for(i=0; i<3; i++) for(j=0; j<3; j++) printf("%d \t", C[i][j]); printf("\n"); Στο προηγούμενο παράδειγμα έχουμε: for(i=0; i<3; i++) for(j=0; j<3; j++) C[i][j]=A[i][j]+B[i][j]; όπου η πάνω for, αφού δεν έχει άγκιστρα περιλαμβάνει μια μόνο εντολή την από κάτω for, η οποία όμως είναι μαζί με την πρόσθεση. Άρα είναι ίδιο με το να γράψουμε: for(i=0; i<3; i++) for(j=0; j<3; j++) C[i][j]=A[i][j]+B[i][j]; 8

6.6 Ασκήσεις ΑΣΚΗΣΗ 1: Να πληκτρολογήσετε το παρακάτω πρόγραμμα και να εξηγήσετε τι κάνει. int numbers[8] = 8, 25, 136, 44, 52, 160, 95, 89; int arithmos_xristi, i; printf("enter a number to search: "); scanf("%d",&arithmos_xristi); for (i = 0; i < 8; ++i) if ( numbers[i] == arithmos_xristi ) break; if (i == 8) printf("%d is not in the list\n",arithmos_xristi); else printf("%d is the %dth element in the list\n", arithmos_xristi,i + 1); ΑΣΚΗΣΗ 2: Μετατρέψτε το παραπάνω πρόγραμμα ώστε να δέχεται τις τιμές του πίνακα numbers[8] από το πληκτρολόγιο και να ενεργεί όπως παραπάνω. Άρα θα πρέπει να γράψετε και μια εντολή επανάληψης για να παίρνουν τιμές τα στοιχεία του πίνακα από το χρήστη. ΑΣΚΗΣΗ 3: Μετατρέψτε το παραπάνω πρόγραμμα ώστε αν καταλήξει πως η τιμή που ζητήθηκε δεν υπάρχει, τότε να συνεχίζει ζητώντας νέα τιμή. Αν μετά από 8 επαναλήψεις καμία από τις τιμές που δόθηκαν δεν υπάρχει τότε μόνο να σταματάει. ΑΣΚΗΣΗ 4: Δημιουργείστε πρόγραμμα που να δέχεται από το πληκτρολόγιο 10 ονόματα φίλων σας, να τα αποθηκεύει σε ένα πίνακα και μετά να εκτυπώνει τα ονόματα τους με αντίστροφη σειρά από αυτή που τα έχετε εισάγει. Υποθέσατε ότι τα ονόματα των φίλων σας είναι μέχρι 20 χαρακτήρες. Θα χρησιμοποιήσετε τον τελεστή μείωσης metritis--. 9