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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στην γλώσσα προγραμματισμού C

Εισαγωγή στη γλώσσα προγραμματισμού C++

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

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

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

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

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

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

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

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

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

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

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

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

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

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

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

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

Διάλεξη 9η: Πίνακες (arrays)

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

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

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

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

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

ΗΥ-150. Προγραμματισμός

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

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

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

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

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

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

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

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

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

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

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

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

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

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

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

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

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

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

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

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

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

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

Λύσεις για τις ασκήσεις του lab5

Κεφάλαιο 2.5: Τύποι εδοµένων, Τελεστές και Αριθµητικές Εκφράσεις. ( ιαλέξεις 5-6) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΗΥ-150. Προγραμματισμός

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

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

Transcript:

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

Πίνακες Πολλές φορές θέλουμε να κρατήσουμε στην μνήμη πολλά αντικείμενα ίδιου τύπου. π.χ μπορεί κάποιος να μας ζητήσει να διαβάσουμε 1000 ακεραίους και να τους βάλουμε σε μη-αύξουσα σειρά. μπορεί να θέλουμε να αποθηκεύσουμε 100 ονόματα φοιτητών με τους βαθμούς τους Χαροκόπειο Πανεπιστήμιο 2/38

Πίνακες Ένας πίνακας είναι μια ομάδα συνεχόμενων θέσεων μνήμης που έχουν το ίδιο όνομα και τον ίδιο τύπο. Χαροκόπειο Πανεπιστήμιο 3/38

Δήλωση Πίνακα σε C 0 1 2 1 int main ( ) { 2 int x [ 1 0 0 0 ] ; 3 } x[0] x[1] x[999] 2GB Χαροκόπειο Πανεπιστήμιο 4/38

Βασικά Χαρακτηριστικά Πινάκων στην C 1 int main ( ) { 2 int x [ 1 0 0 0 ] ; 3 } Το πρώτο στοιχείο είναι πάντα το μηδενικό Τα στοιχεία είναι πάντα συνεχόμενα στην μνήμη Το μέγεθος ενός πίνακα πρέπει να είναι ακέραιο Χαροκόπειο Πανεπιστήμιο 5/38

Πρόσβαση σε Στοιχείο του Πίνακα Για να πάρουμε ένα στοιχείο του πίνακα δίνουμε: π.χ όνομα πίνακα θέση x[3] = 100; ή printf("%d", x[3]); x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7]. x[999] Τα στοιχεία ενός πίνακα με μέγεθος n είναι προσβάσιμα με ακέραιους δείκτες από το μηδέν έως το n 1. Χαροκόπειο Πανεπιστήμιο 6/38

Πρόσβαση σε Στοιχείο του Πίνακα 1 int main ( ) { 2 int i ; 3 int x [ 1 0 0 0 ] ; 4 5 for ( i = 0 ; i < 1000; i++) 6 x [ i ] = 0 ; 7 } Τα στοιχεία ενός πίνακα με μέγεθος n είναι προσβάσιμα με ακέραιους δείκτες από το μηδέν έως το n 1. Χαροκόπειο Πανεπιστήμιο 7/38

Στοιχεία Πίνακα Τα στοιχεία ενός πίνακα χρησιμοποιούνται σαν συνηθισμένες μεταβλητές. 1 int main ( ) { 2 int x [ 8 ] ; 3 4 x [ 3 ] = 5 ; 5 6 printf ( "%d\n", x [ 3 ] ) ; 7 } x[0] x[1] x[2] 5 x[4] x[5] x[6] x[7] Χαροκόπειο Πανεπιστήμιο 8/38

Στοιχεία Πίνακα Μπορούμε να κάνουμε πράξεις μέσα στον δείκτη. 1 int main ( ) { 2 int x [ 8 ], j ; 3 4 j = 1 ; 5 x [ j+1] = 5 ; 6 7 if ( x[4 2] == 5) 8 printf ( "x[2] = 5\n" ) ; 9 } x[0] x[1] 5 x[3] x[4] x[5] x[6] x[7] Χαροκόπειο Πανεπιστήμιο 9/38

Στοιχεία Πίνακα σε Εκφράσεις Πρίν χρησιμοποιηθεί ο πίνακας πρέπει να υπολογιστεί η έκφραση μέσα στα [ ]. 1 int cyclenext ( int i ) { 2 if ( i >= 8 i < 0) 3 return 0 ; 4 else 5 return i+1; 6 } 7 8 int main ( ) { 9 int i ; 10 int y [ 9 ], 11 x [ 9 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ; 12 13 for ( i = 0 ; i < 9 ; i++) 14 y [ cyclenext ( i ) ] = x [ i ] ; 15 } Επίσης ο τύπος ενός πίνακα πρέπει να ταιριάζει με τον τύπο που μια έκφραση περιμένει. Χαροκόπειο Πανεπιστήμιο 10/38

Προτεραιότητα Τελεστών Η προτεραιότητα υπολογισμού της έκφρασης [ ] είναι η υψηλότερη δυνατή..1 παρενθέσεις: (), [], expr++ ή expr Υπολογίζονται πρώτα, από τα αριστερά προς τα δεξιά. Εάν υπάρχουν ένθετες υπολογίζονται πρώτα οι εσωτερικές..2 μοναδιαίοι τελεστές: +,, ++expr, expr και! Υπολογίζονται από δεξιά προς τα αριστερά..3 πολλαπλασιασμός, διαίρεση και υπόλοιπο:, /, ή % Υπολογίζονται δεύτερα από αριστερά προς τα δεξιά..4 πρόσθεση, αφαίρεση: + ή Εάν υπάρχουν πολλοί, υπολογίζονται από τα αριστερά προς τα δεξιά..5 Σχεσιακοί: <, >, <=, >= Υπολογίζονται από τα αριστερά προς τα δεξιά..6 Ισότητας: ==,! = Υπολογίζονται από τα αριστερά προς τα δεξιά..7 λογικό AND: && Από αριστερά προς τα δεξιά..8 λογικό OR: Από αριστερά προς τα δεξιά..9 εκχώρησης: =, + =, =, =, / =, % = Από δεξιά προς τα αριστερά. Χαροκόπειο Πανεπιστήμιο 11/38

Αρχικοποίηση Πίνακα Όπως όλες οι μεταβλητές στην C έτσι και ο πίνακας χρειάζεται αρχικοποίηση: 1 int main ( ) { 2 int i ; 3 int x [ 1 0 0 0 ] ; 4 5 for ( i = 0 ; i < 1000; i++) 6 x [ i ] = 0 ; 7 } Χαροκόπειο Πανεπιστήμιο 12/38

Αρχικοποίηση Πίνακα Σε περίπτωση που ο πίνακας είναι μικρός μπορούμε να τον αρχικοποιήσουμε απευθείας την ώρα της δήλωσης του: 1 int main ( ) { 2 int x [ 1 0 ] = { 32, 27, 64, 18, 95, 3 14, 90, 70, 60, 37 } ; 4 } 32 27 64 18 95 14 90 70 60 37 Χαροκόπειο Πανεπιστήμιο 13/38

Αρχικοποίηση Πίνακα Ένας πίνακας δεν αρχικοποιείτε αυτόματα. 1 int main ( ) { 2 int x[1000] = { 0 } ; 3 } Εάν όμως αρχικοποιήσουμε λιγότερα στοιχεία από το μέγεθος του ο μεταγλωττιστής φροντίζει τα υπόλοιπα στοιχεία να πάρουν την τιμή μηδέν. Χαροκόπειο Πανεπιστήμιο 14/38

Αρχικοποίηση Πίνακα Ο μεταγλωττιστής μπορεί να καταλάβει το μέγεθος του πίνακα από την λίστα αρχικοποίησης. 1 int main ( ) { 2 int x [ ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ; 3 } Ο πίνακας x[] είναι στην ουσία x[9]. Χαροκόπειο Πανεπιστήμιο 15/38

Μέγεθος Πίνακα και Σταθερές Θυμηθείτε τις σταθερές που υποστηρίζει ο προ-επεξεργαστής: 1 #include < s t d i o. h> 2 3 #define SIZE 10 4 5 int main ( ) { 6 int a [ SIZE ] ; 7 8 for ( int i = 0 ; i < SIZE ; i++) 9 a [ i ] = i ; 10 11 for ( int i = 0 ; i < SIZE ; i++) { 12 printf ( "%d", a [ i ] ) ; 13 14 if ( i < SIZE 1) 15 printf ( " " ) ; 16 else 17 printf ( "\n" ) ; 18 } 19 } Χαροκόπειο Πανεπιστήμιο 16/38

Μέγεθος Πίνακα και Σταθερές Θα δούμε αργότερα πως μερικές φορές το μέγεθος ενός πίνακα δεν μπορεί να είναι γνωστό κατά την διάρκεια της μεταγλώττισης. Για αυτό η C παρέχει δύο τύπους πίνακα:.1 στατικούς πίνακες.2 δυναμικούς πίνακες Οι δυναμικοί πίνακες δεν θα μας απασχολήσουν ακόμη. Όλοι οι πίνακες που έχουμε δει ως τώρα ήταν στατικοί. Χαροκόπειο Πανεπιστήμιο 17/38

Σφάλμα Εκτός Ορίων Τι συμβαίνει άμα φτιάξουμε ένα πίνακα 10 στοιχείων και κατά λάθος χρησιμοποιήσουμε την 11η τιμή; 1 #include < s t d i o. h> 2 3 int main ( ) { 4 int a [ 1 0 ] = { 10, 1, 3, 4, 5, 9, 2, 9, 10, 10 } ; 5 6 for ( int i = 0 ; i < 11; i++) { / * RUN TIME ERROR * / 7 printf ( "%d\n", a [ i ] ) ; 8 } 9 } Επειδή δεν ξέρουμε τι υπάρχει στην θέση μνήμης που ακολουθεί τον πίνακα, μπορεί να συμβεί οτιδήποτε. Χαροκόπειο Πανεπιστήμιο 18/38

Σφάλμα Εκτός Ορίων Τι συμβαίνει άμα φτιάξουμε ένα πίνακα 10 στοιχείων και κατά λάθος χρησιμοποιήσουμε την 11ή τιμή; 0 1 2 x[0] x[1] x[11]???????? x[10] 2GB Συνήθως είτε παίρνουμε κάτι που είναι "σκουπίδια" ή τερματίζει απότομα το πρόγραμμα μας (crash). Χαροκόπειο Πανεπιστήμιο 19/38

Παράδειγμα Χρήσης Πίνακα Άθροισμα 1 #include < s t d i o. h> 2 #define SIZE 12 3 4 int main ( ) { 5 int a [ SIZE ] = { 1, 3, 5, 4, 7, 2, 99, 6 16, 45, 67, 89, 45 } ; 7 int i, total = 0 ; 8 9 for ( i = 0 ; i < SIZE ; i++) 10 total += a [ i ] ; 11 12 printf ( "Total of array elements is %d\n", total ) ; 13 } εκτυπώνει Total of array elements is 383 Χαροκόπειο Πανεπιστήμιο 20/38

Παράδειγμα Μέσος Όρος 1 #include < s t d i o. h> 2 #define SIZE 6 3 4 int main ( ) { 5 double a [ SIZE ] = { 1. 0, 2. 3, 1.3333, 7.102, 1.523, 1.0001 } ; 6 int i ; 7 double avg = 0. 0 ; 8 9 for ( i = 0 ; i < SIZE ; i++) 10 avg += a [ i ] ; 11 12 avg / = SIZE ; 13 14 printf ( "average is %lf\n", avg ) ; 15 } εκτυπώνει average is 2.376400 Χαροκόπειο Πανεπιστήμιο 21/38

Πίνακες Χαρακτήρων Τα αλφαριθμητικά που βλέπουμε διαρκώς στην χρήση της printf είναι στην ουσία πίνακες χαρακτήρων με το ιδιαίτερο χαρακτηριστικό πως ο τελευταίος χαρακτήρας είναι ο ειδικός κενός χαρακτήρας '\0'. 1 int main ( ) { 2 char string [ 6 ] ; 3 4 string [ 0 ] = 'f' ; 5 string [ 1 ] = 'i' ; 6 string [ 2 ] = 'r' ; 7 string [ 3 ] = 's' ; 8 string [ 4 ] = 't' ; 9 string [ 5 ] = '\0' ; 10 } Ο κενός χαρακτήρας είναι απαραίτητος ώστε να μπορούν οι διάφορες συναρτήσεις να ξέρουν το τέλος του αλφαριθμητικού χωρίς να τους δίνουμε το μέγεθος του πίνακα. Χαροκόπειο Πανεπιστήμιο 22/38

Πίνακες Χαρακτήρων Το παρακάτω πρόγραμμα 1 int main ( ) { 2 char string [ 6 ] ; 3 4 string [ 0 ] = 'f' ; 5 string [ 1 ] = 'i' ; 6 string [ 2 ] = 'r' ; 7 string [ 3 ] = 's' ; 8 string [ 4 ] = 't' ; 9 string [ 5 ] = '\0' ; 10 11 printf ( "%s\n", string ) ; 12 printf ( "first\n" ) ; 13 } τυπώνει 2 φορές την λέξη first. Χαροκόπειο Πανεπιστήμιο 23/38

Πίνακες Χαρακτήρων Μπορούμε όμως να αρχικοποιήσουμε πιο γρήγορα τον πίνακα χαρακτήρων: 1 int main ( ) { 2 char string [ 6 ] = "first" ; 3 4 printf ( "%s\n", string ) ; 5 printf ( "first\n" ) ; 6 } ο μεταγλωττιστής βάζει αυτόματα το '\0'. Χαροκόπειο Πανεπιστήμιο 24/38

Πίνακες Χαρακτήρων Μπορούμε και να παραλείψουμε το μέγεθος: 1 int main ( ) { 2 char string [ ] = "first" ; 3 4 printf ( "%s\n", string ) ; 5 printf ( "first\n" ) ; 6 } ο μεταγλωττιστής το βρίσκει αυτόματα. Προσοχή γιατί το μέγεθος του πίνακα είναι ένα παραπάνω από το μήκος του αλφαριθμητικού. Χαροκόπειο Πανεπιστήμιο 25/38

Πίνακες Χαρακτήρων Η θέση του '\0' Η θέση του κενού χαρακτήρα καθορίζει το τέλος ενός αλφαριθμητικού: 1 #include < s t d i o. h> 2 3 int main ( ) { 4 char string [ 1 1 ] = { 't', 'w', 'o', '\0', ' ', 'w', 5 'o', 'r', 'd', 's', '\0' } ; 6 7 printf ( "%s\n", string ) ; 8 } Το παραπάνω πρόγραμμα τυπώνει την λέξη two και όχι two words, αφού η printf σταματάει μόλις δει τον κενό χαρακτήρα. Χαροκόπειο Πανεπιστήμιο 26/38

Πίνακες Χαρακτήρων Αρχικοποίηση σε κενό αλφαριθμητικό Η θέση του κενού χαρακτήρα καθορίζει το τέλος ενός αλφαριθμητικού: 1 #include < s t d i o. h> 2 3 int main ( ) { 4 char string [ 1 1 ] = { 't', 'w', 'o', '\0', ' ', 'w', 5 'o', 'r', 'd', 's', '\0' } ; 6 7 printf ( "%s\n", string ) ; 8 9 string [ 0 ] = '\0' ; 10 } Μπορούμε να δώσουμε σε έναν πίνακα χαρακτήρων την τιμή του κενού αλφαριθμητικού βάζοντας τον πρώτο χαρακτήρα να πάρει την τιμή '\0'. Χαροκόπειο Πανεπιστήμιο 27/38

Πίνακες και Συναρτήσεις Για να ορίσουμε μια συνάρτηση που παίρνει ένα πίνακα ως όρισμα: 1 void swap ( int array [ ], int i, int j ) { 2 / * code t o swap element a r r a y [ i ] and a r r a y [ j ] 3 } έπειτα την καλούμε: 1 int main ( ) { 2 int a [ 5 ] = { 1, 2, 2, 3, 1 } ; 3 4 swap ( a, 2, 3 ) ; 5 } δίνοντας μόνο το όνομα του πίνακα. Χαροκόπειο Πανεπιστήμιο 28/38

Πίνακες και Call-By-Value Παρόλο που η C χρησιμοποιεί πάντα κλήση μέσω τιμής, οι τιμές των στοιχείων ενός πίνακα μπορούν να αλλάξουν μέσα σε μια συνάρτηση. 1 #include < s t d i o. h> 2 3 void increment ( int [ ] a, int n ) { 4 int i ; 5 for ( i = 0 ; i < n ; i++) 6 a [ i ] + + ; 7 } 8 9 int main ( ) { 10 int a [ ] = { 1, 2, 3 } ; 11 12 increment ( a, 3 ) ; 13 14 / * here a [ ] = { 2, 3, 4} * / 15 } Χαροκόπειο Πανεπιστήμιο 29/38

Πίνακες και Call-By-Value Η χρήση του const λέει στον μεταγλωττιστή να μην επιτρέπει καμία αλλαγή στοιχείου πίνακα μέσα σε μια συνάρτηση. 1 #include < s t d i o. h> 2 3 void increment ( const int [ ] a, int n ) { / * const here * / 4 int i ; 5 for ( i = 0 ; i < n ; i++) 6 a [ i ] + + ; / * ERROR * / 7 } 8 9 int main ( ) { 10 int a [ ] = { 1, 2, 3 } ; 11 12 increment ( a, 3 ) ; 13 } Χαροκόπειο Πανεπιστήμιο 30/38

Παράδειγμα Εναλλαγή Στοιχείων Πίνακα 1 #include < s t d i o. h> 2 3 void swap ( int a [ ], int i, int j ) ; 4 5 int main ( ) { 6 int n [ ] = { 1, 2, 3 } ; 7 swap ( n, 0, 1 ) ; 8 swap ( n, 1, 2 ) ; 9 } 10 11 void swap ( int a [ ], int i, int j ) { 12 int temp = a [ i ] ; 13 a [ i ] = a [ j ] ; 14 a [ j ] = temp ; 15 } Χαροκόπειο Πανεπιστήμιο 31/38

Παράδειγμα Αντιστροφή Πίνακα 1 #include < s t d i o. h> 2 3 void swap ( int a [ ], int i, int j ) { 4 int temp = a [ i ] ; 5 a [ i ] = a [ j ] ; 6 a [ j ] = temp ; 7 } 8 9 void reverse ( int a [ ], int n ) { 10 int i ; 11 for ( i = 0 ; i < n / 2 ; i++) 12 swap ( a, i, n i 1); 13 } 14 15 int main ( ) { 16 int a [ ] = { 1, 2, 3, 4, 5 } ; 17 reverse ( a, 5 ) ; 18 } Χαροκόπειο Πανεπιστήμιο 32/38

Πίνακες Πολλών Διαστάσεων Η C μας επιτρέπει να ορίσουμε και πολυδιάστατους πίνακες: 1 int marray [ 3 ] [ 4 ] ; π.χ ένας πίνακας ακεραίων με 3 γραμμές και 4 στήλες που ονομάζεται marray. Χαροκόπειο Πανεπιστήμιο 33/38

Πίνακες Πολλών Διαστάσεων a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] και ένα κλασσικό loop για να αρχικοποιήσουμε τον πίνακα 1 for ( i = 0 ; i < 3 ; i++) 2 for ( j = 0 ; j < 4 ; j++) 3 a [ i ] [ j ] = 0 ; Χαροκόπειο Πανεπιστήμιο 34/38

Αρχικοποίησης Πινάκων Πολλών Διαστάσεων 1 int a [ 2 ] [ 2 ] = { { 1, 2 }, { 3, 4 } } ; Οι τιμές ομαδοποιούνται ανά σειρά σε άγκιστρα. Χαροκόπειο Πανεπιστήμιο 35/38

Πίνακες Πολλών Διαστάσεων και Συναρτήσεις 1 #include < s t d i o. h> 2 #define COLUMNS 3 3 4 int max ( const int a [ ] [ COLUMNS ], int rows, int columns ) { 5 int i, j ; 6 int max = a [ 0 ] [ 0 ] ; 7 8 for ( i = 0 ; i < rows ; i++) 9 for ( j = 0 ; j < columns ; j++) 10 max = a [ i ] [ j ] > max?a [ i ] [ j ] : max ; 11 12 return max ; 13 } 14 15 int main ( ) { 16 const int a [ 2 ] [ COLUMNS ] = { { 1, 2, 3 }, { 1000, 0, 1 } } ; 17 printf ( "maximum = %d\n", max ( a, 2, COLUMNS ) ) ; 18 } Είναι δυνατόν να παραλείψουμε την πρώτη διάσταση σε μια συνάρτηση, αλλά όχι και την δεύτερη αφού πρέπει να ξέρει ο μεταγλωττιστής την μορφή του πίνακα. Χαροκόπειο Πανεπιστήμιο 36/38

Πίνακες Πολλών Διαστάσεων και Συναρτήσεις Οι διδιάστατοι πίνακες υλοποιούνται με μονοδιάστατους στην C, π.χ σε έναν πίνακα int a[3][4] έχουμε a[i][j] = a[ 4*i + j ] Για αυτό τον λόγο πρέπει ο μεταγλωττιστής να ξέρει τον αριθμό στηλών όταν καλείτε μια συνάρτηση. Χαροκόπειο Πανεπιστήμιο 37/38

Διδιάστατοι Πίνακες Πολλαπλασιασμός Πινάκων c 11 c 12 c 1p a 11 a 12 a 1m b 11 b 12 b 1p c 21 c 22 c 2p........ = a 21 a 22 a 2m........ b 21 b 22 b 2p........ c n1 c n2 c np a n1 a n2 a nm b m1 b m2 b mp 1 for ( i = 0 ; i < n ; i++) 2 for ( j = 0 ; j < p ; j++) 3 for ( k = 0, c [ i ] [ j ] = 0. 0 ; k < m ; k++) 4 c [ i ] [ j ] += a [ i ] [ k ] * b [ k ] [ j ] ; Χαροκόπειο Πανεπιστήμιο 38/38