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

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

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

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

Εργαστήριο 2: Πίνακες

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

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

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

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

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

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

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

ΕΡΓΑΣΙΑ 2. Κατασκευάζοντας Ημερολόγια. Ημερομηνία Ανάρτησης: 23/02/2018 Ημερομηνία Παράδοσης: 13/03/2018, 09:00

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

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

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

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

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

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

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

Διάλεξη 5: Δείκτες και Συναρτήσεις

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

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Εργαστήριο 6: Αναζήτηση, Ανάλυση Πολυπλοκότητας

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Η γλώσσα C. Δείκτες (pointers)

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

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

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Ενδεικτικές λύσεις και στατιστικά

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

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

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

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

Προγραμματισμός Υπολογιστών με C++

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

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

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

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Συμβολοσειρές, Δείκτες και Παραδείγματα (Κεφάλαιο 13, KNK-2ED)

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

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

Διδάσκων: Κωνσταντίνος Κώστα

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

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

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

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

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

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

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

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

Διάλεξη 7: Συμβολοσειρές, Δείκτες και Παραδείγματα

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

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

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

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

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

Η γλώσσα C. Δείκτες (pointers)

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

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

Επεξεργασία Αρχείων Κειµένου

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

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

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

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

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

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

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

Hawai i Health Connector Extended Services Transition Plan

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

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

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

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

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


Αρχές Προγραμματισμού

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

Διάλεξη 1: Δομές Δεδομένων και Αλγόριθμοι - Εισαγωγή. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Δομές Δεδομένων & Αλγόριθμοι

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

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

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Συναρτήσεις και διαδικασίες

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

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

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

Αρχές Προγραμματισμού

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

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

Transcript:

Διάλεξη 4: Δείκτες (pointers) και Πίνακες Δεικτών Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Εισαγωγή στις έννοιες: - Πίνακες Δεικτών - Πολυδιάστατοι πίνακες - Πέρασμα παραμέτρων σε προγράμματα C Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 1

Πίνακες Δεικτών Ορισμός Πίνακα με Δείκτες (Pointers): Πίνακας δεικτών είναι ένας πίνακας που περιέχει δείκτες. Δηλώνεται με τον τύπο δεδομένων,* και [], π.χ., int * p[] Παράδειγμα: η δήλωση char *a[1] = { } λέει ότι ο aείναι πίνακας μεγέθους 1 (index: -9) και τα στοιχεία του είναι δείκτες σε char. Έτσιτοa[6] είναι δείκτης σε χαρακτήρα και *a[6]είναι ο χαρακτήρας στον οποίο δείχνει. Αρχικοποίηση τιμών σε πίνακα δεικτών γίνεται με τη σύνταξη. char *m[] = { January, February, March, April, May, June, July, August, September, October, November, December }; ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 2

Παράδειγμα Πίνακες Δεικτών Address data m[] 3143928 1418236 m[1] 3143932 14182248 February m[2] 3143936 14182324 m[3] 314394 14182312 m[4] 3143944 14182244 m[5] 3143948 14182236 m[6] 3143952 1418224 m[7] 3143956 14182228?? M a y \ F 141822-42 43 44 45 46 47 48 m[8] 314396 14182216 m[9] 3143964 141823 m[1] 3143968 14182288 m[11] 3143972 14182276 Οι χαρακτήρες κάθε συμβολοσειράς τοποθετούνται κάπου στη μνήμη και στο m[i] τοποθετείται δείκτης σ αυτούς τους χαρακτήρες. ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 3

Παράδειγμα Πίνακες Δεικτών (συν.) m[] m[1] Address data 3143928 1418236 January 3143932 14182248 February m[2] 3143936 14182324 March m[3] 314394 14182312 April m[4] 3143944 14182244 May m[5] 3143948 14182236 June m[6] 3143952 1418224 July m[7] m[8] m[9] 3143956 14182228 August 314396 14182216 September 3143964 141823 October m[1] 3143968 14182288 November m[11] 3143972 14182276 December Τι θα τυπώσουν τα ακόλουθα; 1. printf("%c", *m[1]); 2. printf("%c", *(m[3]+2)); 3. printf("%s", m[]); 4. printf("%d", m[]); 5. printf("%d", &m[9]); 6. printf("%c", m[2][3]); 1. F 2. r 3. January 4. 1418236 5. 3143964 6. c ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 4

Παράδειγμα Πίνακες Δεικτών (συν.) Πρόβλημα: Χρειαζόμαστε μία συνάρτηση η οποία θα επιστρέφει το ένα string με το όνομα του κάποιου μήνα k που θα δοθεί σαν παράμετρος Παράμετροι Εισόδου: char *months[]: πίνακας δεικτών με τους μήνες int k: ο αριθμός του μήνα (π.χ., 1=January) char *month_name(char *months[], int k){ if (k < 1 k > 12) return "Error"; else return months[k-1]; } ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 5

Αρχικοποίηση Πίνακα Δεικτών int main() { int *a[1]; for(int i=; i<1; i++){ printf("%d\n", a[i]); } Εκτυπώνει 1628344792 2289544 288999592 288773112-1 28877314 288772914 289866642 28883211 1892 ΠΡΟΣΟΧΗ } int *b[1] = {}; for(int i=; i<1; i++){ printf("%d\n", b[i]); } Εκτυπώνει Τον χώρο στον οποίο θα δείχνει κάθε pointer a[i], πρέπει να τον δεσμεύσουμε ξεχωριστά ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 6

Πολυδιάστατοι πίνακες Η C διαθέτει ορθογωνικούς πολυδιάστατους πίνακες. Κατά τη δήλωση ενός πολυδιάστατου πίνακα (όπως και για ένα μονοδιάστατο) πρέπει να προσδιορίσουμε τις διαστάσεις του*. π.χ., τύπος ονομα[γραμμες][στήλες] char array[ 3 ][ 7 ] Ένας πολυδιάστατος πίνακας είναι ένας μονοδιάστατος πίνακας κάθε στοιχείο του οποίου είναι ένας πίνακας. Για να αναφερθούμε σε κάποιο στοιχείο του πίνακα χρησιμοποιούμε δείκτες θέσης. π.χ., array[i][j] /*[γραμμή][στήλη]*/ * Στην C99 επιτρέπονται και οι δυναμικοί πίνακες, π.χ., char array[i][i], όπου iείναι μεταβλητή αλλά δεν θα τους χρησιμοποιήσουμε στα πλαίσια αυτού του μαθήματος. ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 7

Πολυδιάστατοι πίνακες(συν.) Αρχικοποίηση πολυδιάστατου πίνακα Μια λίστα αρχικών τιμών κλεισμένη σε άγκιστρα, όπου κάθε τιμή παίρνει αρχική τιμή από μια αντίστοιχη υπολίστα. π.χ. char daysofmonth[2][13] = { {, 31, 28, 31, 3, 31, 3, 31, 31, 3, 31, 3, 31}, {, 31, 29, 31, 3, 31, 3, 31, 31, 3, 31, 3, 31}} Μεταβίβαση δισδιάστατου πίνακα σε συνάρτηση Η δήλωση των παραμέτρων της συνάρτησης πρέπει να περιλαμβάνει τον αριθμό των στηλώνκάθε δισδιάστατου πίνακα. Ο αριθμός των γραμμών είναι αδιάφορος. Για παράδειγμα, όλες οι πιο κάτω δηλώσεις είναι έγκυρες. f( int daysofmonth[2][13] ) {... } f( int daysofmonth[][13] ) {... } f( int(*daysofmonth)[13] ) {... } ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 8

Πολυδιάστατοι Πίνακες vs. Πίνακες Δεικτών Έστω int a[1][2]: int*b[1]; Ποια η διαφορά ανάμεσα στους δύο πίνακες; O a είναι πραγματικά δισδιάστατος πίνακας: κατά τον ορισμό του δεσμεύθηκαν 1x2=2 συνεχόμενες θέσεις. Κατά τον ορισμό του b κατανέμεται χώρος για 1 δείκτες. Απόδοση αρχικών τιμών πρέπει να γίνει ρητά είτε στατικά (i.e. { })ή δυναμικά με κώδικα (for loop). int main() { int a[1][2]; int *b[1]; printf("%d, %d", sizeof(a), sizeof(b)); } - Εκτυπώνει 8 (1 γραμμές x 2 στήλες x 4 (μέγεθος int) και 4 (1 γραμμές x 4(μέγεθος pointer) ) σε x86 -Εκτυπώνει 8 (1 γραμμές x 2 στήλες x 4 (μέγεθος int) και 8 (1 γραμμές x 8(μέγεθος pointer) ) σε x64 Πλεονέκτημα Πίνακα Δεικτών Κάθε δείκτης μπορεί να δείχνει σε γραμμή με διαφορετικό μήκος ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 9

Πολυδιάστατοι Πίνακες vs. Πίνακες Δεικτών(συν.) Παράδειγμα Έστω char fixed[] [15] = { Illegal month, Jan, Feb, March }; char *variable[] = { Illegal month, Jan, Feb, March }; Γραφικά στο επίπεδο της μνήμης έχουμε fixed Illegal month\- Jan\----------- Feb\----------- Μarch\--------- variable Illegal month\ Jan\ Feb\ Μarch\ ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 1

Παράμετροι της συνάρτησης <main> H συνάρτηση mainμε παράμετρο voidθέλοντας να δείξουμε ότι η συνάρτηση main δε δέχεται ορίσματα. int main() { } Αυτό όμως δε σημαίνει ότι δεν μπορούμε να περάσουμε ορίσματα. Τα δυνατά ορίσματα όμως της mainείναι καθορισμένα και είναι τα εξής: int main(int argc, char *argv[]) { } Tαορίσματα περνιούνται στο πρόγραμμα από τη γραμμή εντολών τη στιγμή που αρχίζει η εκτέλεσή του. Το πρώτο όρισμα argc,το οποίο είναι τύπου ακέραιος, είναι ο αριθμός των ορισμάτων της γραμμής διαταγών, με τα οποία έχει κληθεί το πρόγραμμα. Παράδειγμα: $ prog opt1 opt2 opt3 Παράδειγμα: $ prog 13 argc=4 argc=2 ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 11

Παράμετροι της συνάρτησης <main> (συν.) Το δεύτερο όρισμα argvείναι δείκτης για έναν πίνακα συμβολοσειρών ο οποίος περιέχει τα ορίσματα. Κατά σύμβαση argv[] είναι το όνομα με το οποίο κλήθηκε το πρόγραμμα. Παράδειγμα: $ prog1 Παράδειγμα: $ prog2 argv[]=prog1 argv[]=prog2 argv[1],, argv[argc-1],είναι τα υπόλοιπα ορίσματα με την σειρά που δόθηκαν στη γραμμή εντολής. Παράδειγμα: $ prog opt1 opt2 opt3 argc=4 argv[]=prog, argv[1]=opt1, argv[2]=opt2, argv[3]=opt3 Παράδειγμα: $ prog 13 argc=2 argv[]=prog, argv[1]=13 ΕΠΛ35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 12