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

Σχετικά έγγραφα
Προγραμματισμός Ι (ΗΥ120)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

double sum(double a, double b) { return(a+b); } double my_avg(double a, double b) { return(sum(a, b)/2.0); }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Β' Περιόδου Θέµα 1. (α')

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

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

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

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

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

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

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

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

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

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

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

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

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

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

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

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

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

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

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

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

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

Ι Αρχεία δεδομένων, μέρος δεύτερο: δυαδικά αρχεία ΙΙ Δομές δεδομένων (struct)

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

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

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

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

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

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

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

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

Συμβολοσειρές Ορίσματα στη main()

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

Transcript:

Προγραμματισμός Ι (ΗΥ120) Διάλεξη 11: Δείκτες & Πίνακες

Δείκτες και πίνακες Μια μεταβλητή «μονοδιάστατος πίνακας από αντικείμενα τύπου Τ» μπορεί να θεωρηθεί ως (είναι συντακτικά συμβατή με) μια μεταβλητή «δείκτης-σε-τ» με σταθερή τιμή την διεύθυνση του πρώτου στοιχείου του πίνακα. Αντίστροφα, μια μεταβλητή δείκτης-σε-τ (και μια διεύθυνση μεταβλητής τύπου Τ) μπορεί να θεωρηθεί ως η αρχή ενός μονοδιάστατου πίνακα από αντικείμενα τύπου Τ. Με χρήση δεικτών μπορεί να γίνει διέλευση των στοιχείων ενός πίνακα Αντί της συμβατικής μεθόδου πρόσβασης μέσω της θέσης τους. Υπάρχει συντακτική συμβατότητα ανάμεσα σε μεταβλητές «πίνακας από Τ» και «δείκτης σε Τ». 2

int a[5]; int * b = a; 3 a[0] a[1] a[2] a[3] a[4] *b *(b+1)*(b+2)*(b+3)*(b+4) b[0] b[1] b[2] b[3] b[4]

char a[]={'a','b','c'}; a[0] a[1] a[2] διεύθυνση 0 1 2 3 4 5 6 7 8 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0... 4

char a[]={'a','b','c'}; char *b=a; a[0] a[1] a[2] διεύθυνση 0 1 2 3 4 5 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 5 b 6 7 8...

char a[]={'a','b','c'}; char *b=a; b[0]++; a[0] a[1] a[2] διεύθυνση 0 1 2 3 4 5 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 6 b 6 7 8...

char a[]={'a','b','c'}; char *b=a; b[0]++; b[1]++; a[0] a[1] a[2] διεύθυνση 0 1 2 3 4 5 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 7 b 6 7 8...

char a[]={'a','b','c'}; char *b=a; b[0]++; b[1]++; b[2]++; a[0] a[1] a[2] διεύθυνση 0 1 2 3 4 5 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 8 b 6 7 8...

char a[]={'a','b','c'}; char *b=a; b[0]++; b[1]++; b[2]++; *b=*b+1; a[0] a[1] a[2] b διεύθυνση 0 1 2 3 4 5 6 7 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 9 8...

char a[]={'a','b','c'}; char *b=a; b[0]++; b[1]++; b[2]++; *b=*b+1; b++; a[0] a[1] a[2] b διεύθυνση 0 1 2 3 4 5 6 7 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 10 8...

char a[]={'a','b','c'}; char *b=a; b[0]++; b[1]++; b[2]++; *b=*b+1; b++; *b=*b+1; a[0] a[1] a[2] b διεύθυνση 0 1 2 3 4 5 6 7 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 11 8...

char a[]={'a','b','c'}; char *b=a; b[0]++; b[1]++; b[2]++; *b=*b+1; b++; *b=*b+1; b++; a[0] a[1] a[2] b διεύθυνση 0 1 2 3 4 5 6 7 8 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 1 12...

char a[]={'a','b','c'}; char *b=a; b[0]++; b[1]++; b[2]++; *b=*b+1; b++; *b=*b+1; b++; *b=*b+1; a[0] a[1] a[2] b διεύθυνση 0 1 2 3 4 5 6 7 8 περιεχόμενα 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 1 13...

/* εκτύπωση strings αποθηκευμένων σε ένα πίνακα */ char str[]= {'o','n','e','\0','t','w','o','\0','x'}; char *str_p; 14 printf("%s\n", str); printf("%s\n", &str[0]); str_p = str; printf("%s\n", str_p); printf("%s\n", &str[4]); str_p = str_p + 4; printf("%s\n", str_p); printf("%s\n", str_p + 1); /* εκτυπώνει "one" */ /* εκτυπώνει "one" */ /* εκτυπώνει "one" */ /* εκτυπώνει "two" */ /* εκτυπώνει "two" */ /* εκτυπώνει "wo" */

Προσπέλαση Πίνακα με Δείκτες: Καλή ιδέα; Η πρόσβαση σε στοιχεία του πίνακα με δείκτη μπορεί να είναι πιο γρήγορη από την συμβατική πρόσβαση μέσω θέσης στον πίνακα Γιατί; Δεν είναι καλή ιδέα να χρησιμοποιείται, εκτός και αν υπάρχει σοβαρός λόγος, π.χ. η συγκεκριμένη πρόσβαση αποτελεί όντως σημείο συμφόρησης ενός ιδιαίτερα κρίσιμου κώδικα. Σε γενικές γραμμές, η συμβατική πρόσβαση στα στοιχεία ενός πίνακα βελτιώνει την αναγνωσιμότητα του κώδικα. Η πρόσβαση με δείκτες είναι συνήθης τακτική ιδίως για προγραμματισμό σε «χαμηλό» επίπεδο συστήματος π.χ. Λειτουργικό σύστημα. 15

/* διέλευση (εκτύπωση) πίνακα ακεραίων */ int i,a[n]; for (i=0; i<n; i++) printf("%d ",a[i]); printf("\n"); /* διέλευση (εκτύπωση) πίνακα ακεραίων */ 16 int i,*a_ptr,a[n]; a_ptr=a; for (i=0; i<n; i++) printf("%d ",a_ptr[i]); printf("\n"); /* διέλευση (εκτύπωση) πίνακα ακεραίων */ int *a_ptr,a[n]; for (a_ptr=a; a_ptr<a+n; a_ptr++) printf("%d ",*a_ptr); printf("\n");

Πίνακες από δείκτες Οι πίνακες από δείκτες (π.χ. *b[ν]) «μοιάζουν» με 2-διάστατους πίνακες (π.χ. a[ν][μ]), όμως: Κάθε σειρά a[i] του 2-διάστατου πίνακα a έχει ακριβώς τον ίδιο αριθμό στοιχείων (Μ). Οι σειρές του πίνακα a αποθηκεύονται πάντα σε συνεχόμενες θέσεις μνήμης, η μία μετά την άλλη. Κάθε δείκτης b[i] του πίνακα b μπορεί να δείχνει σε εντελώς διαφορετική περιοχή μνήμης, η οποία να μην έχει καμία σχέση με τις περιοχές μνήμης όπου δείχνουν οι υπόλοιποι δείκτες του πίνακα b. Τα δεδομένα που βρίσκονται αποθηκευμένα εκεί όπου δείχνουν τα στοιχεία του b, μπορεί να «ανήκουν» σε συμβατικές μεταβλητές του προγράμματος. 17

2-διάστατος πίνακας αντικειμένων τύπου Τ πίνακας από δείκτες σε αντικείμενα τύπου Τ 18 T a[n][m]; T *b[n]; a b N N M NULL δεδομένα τύπου Τ

Παράμετροι της main Συχνά είναι βολικό το πρόγραμμα να δέχεται κάποια δεδομένα ως παραμέτρους εκκίνησης αντί να τα ζητά από τον χρήστη μέσω αντίστοιχου διαλόγου. Η συνάρτηση main δέχεται δύο παραμέτρους. 1. Τον αριθμό τον ορισμάτων argc (argument count) που περάστηκαν στο πρόγραμμα από το περιβάλλον εκτέλεσης, συμπεριλαμβανομένου του ονόματος του (όρισμα 0). 2. Τον πίνακα από δείκτες-σε-χαρακτήρα argv (argument vector), όπου το i-οστό στοιχείο του πίνακα περιέχει ένα δείκτη σε θέση μνήμης όπου βρίσκεται αποθηκευμένο το i-οστό αλφαριθμητικό που δόθηκε ως όρισμα από την γραμμή εντολών. 19

>./myprog one 2 three 45 0x06 qkja<enter> 20 int main (int argc, c { } 7 har *argv[]) o n e \0 4 5 \0 2 \0 m y p r o g \0 t h r e e \0 0 x 0 6 \0 q k j a \0

Ταξινόμηση με Ευρετήριο πίνακας από N δείκτες σε ονόματα στον πίνακα Πίνακας από 7 ονόματα (το πολύ 6 χαρακτήρων) 21 char *idx[7]; char names[7][7]; πριν την ταξινόμηση του ευρετηρίου d o n a l d 0 k a t h y 0? j o h n 0?? m a r i n a 0 a l e x 0?? k o s t a s 0 m a r y 0??

Ταξινόμηση με Ευρετήριο πίνακας από N δείκτες σε ονόματα στον πίνακα Πίνακας από 7 ονόματα (το πολύ 6 χαρακτήρων) 22 char *idx[7]; char names[7][7]; μετά την ταξινόμηση του ευρετηρίου d o n a l d 0 k a t h y 0? j o h n 0?? m a r i n a 0 a l e x 0?? k o s t a s 0 m a r y 0??

/* ταξινόμηση αλφαριθμητικών με ευρετήριο */ #include <stdio.h> #include <string.h> #define N 7 #define MAXNAMELEN 7 23 int main(int argc, char *argv[]) { char names[ν][maxnamelen],*idx[n],*tmp; int i,j; for (i=0; i<n; i++) { printf("enter name: "); scanf("%6s", names[i]); } for (i=0; i<n; i++) { idx[i] = names[i]; } συνάρτηση σύγκρισης αλφαριθμητικών } for (i=0; i<n; i++) { for (j=i; j<n; j++) { if (strcmp(idx[i],idx[j])>0) { tmp = idx[i]; idx[i] = idx[j]; idx[j] = tmp; } } } for(i=0; i<n; i++) { printf("%s\n", idx[i]); } return(0);