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

Σχετικά έγγραφα
Προγραμματισμό για ΗΜΥ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Εργαστήριο 9: Αρχεία

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Χpήσιµες Βιβλιοθήκες της γλώσσας C

Transcript:

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

Πίνακες Δεικτών Πίνακας δεικτών είναι ένας πίνακας που περιέχει δείκτες. Δήλωση πίνακα από δείκτες τύπου type γίνεται ως type *arrayname[arraysize] π.χ. η δήλωση char *a[1] = { λέει ότι ο a είναι πίνακας μεγέθους 1 και τα στοιχεία του είναι δείκτες σε char. Έτσι το a[6] είναι δείκτης σε χαρακτήρα και *a[6] είναι ο χαρακτήρας στον οποίο δείχνει. Αρχικοποίηση τιμής σε πίνακα δεικτών γίνεται με τη γνωστή σύνταξη. Παράδειγμα: char *name[] = { Γενάρης, Φεβράρης, Μάρτης, Απρίλης, Μάης, Ιούνης, Ioύλης, Αύγουστος, Σεπτέμβρης, Οκτώβρης, Νοέμβρης, Δεκέμβρης ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-2

Παράδειγμα char *name[] = { Γενάρης, Φεβράρης, Μάρτης, Απρίλης, Μάης, Ιούνης, Ioύλης, Αύγουστος, Σεπτέμβρης, Οκτώβρης, Νοέμβρης, Δεκέμβρης Γραφικά, έχουμε Γενάρης Φεβράρης...... Νοέμβρης Δεκέμβρης Oι χαρακτήρες κάθε συμβολοσειράς τοποθετούνται κάπου στη μνήμη και στο name[i] τοποθετείται δείκτης σ αυτούς τους χαρακτήρες. ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-3

Παράδειγμα Να γράψετε συνάρτηση που, με δεδομένο εισόδου ακέραιο i, επιστρέφει το όνομα του i-οστού μήνα (αν υπάρχει). #include <stdio.h> char *month_name(char *name[], int n){ if (n < 1 n > 12) return name[]; else return name[n]; int main() { char *name[] = { "Aνύπαρκτος μήνας","γενάρης", "Φεβράρης", "Μάρτης", "Απρίλης", "Μάης", "Ιούνης", "Ioύλης", "Αύγουστος", "Σεπτέμβρης", "Οκτώβρης", "Νοέμβρης", "Δεκέμβρης"; printf("%s", month_name(name, 1)); return ; ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-4

#include <stdio.h> int main() { char *a[1] ; int i; for (i=;i<1;i++) { printf("%d\n", a[i]); #include <stdio.h> int main() { char *a[1] = { ; int i; for (i=;i<1;i++) { printf("%d\n", a[i]); Σωστή Αρχικοποίηση Εκτυπώνει 1628344792 2289544 288999592 288773112-1 28877314 288772914 289866642 28883211 1892 Εκτυπώνει Προσοχή: Τον χώρο στον οποίο θα δείχνει κάθε pointer a[i], πρέπει να τον δεσμεύσουμε ξεχωριστά (i.e. name[]) #include <stdio.h> int main() { char *a[1] = {; char name[] = car"; a[] = name; printf("%s\n", a[]); ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-5 Εκτυπώνει «car»

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

Πολυδιάστατοι πίνακες (συν.) Αρχικοποίηση πολυδιάστατου πίνακα Μια λίστα αρχικών τιμών κλεισμένη σε άγκιστρα, όπου κάθε τιμή παίρνει αρχική τιμή από μια αντίστοιχη υπολίστα. π.χ. γραμμές στήλες 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 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-7

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

Παράδειγμα Έστω 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\ - συμβολίζει ένα αχρησιμοποίητο byte ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-9

Παράμετροι της συνάρτησης main() H συνάρτηση main με παράμετρο void θέλοντας να δείξουμε ότι η συνάρτηση main δε δέχεται ορίσματα. int main(void) {... Αυτό όμως δε σημαίνει ότι δεν μπορούμε να περάσουμε ορίσματα. Τα δυνατά ορίσματα όμως της main είναι καθορισμένα και είναι τα εξής: int main(int argc, char *argv[]) {... Tα ορίσματα περνιούνται στο πρόγραμμα από τη γραμμή εντολών τη στιγμή που αρχίζει η εκτέλεσή του. ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-1

Σημασία των ορισμάτων Το πρώτο όρισμα argc, το οποίο είναι τύπου ακέραιος, είναι ο αριθμός των ορισμάτων της γραμμής διαταγών, με τα οποία έχει κληθεί το πρόγραμμα. Το δεύτερο όρισμα argv είναι δείκτης για έναν πίνακα συμβολοσειρών ο οποίος περιέχει τα ορίσματα. Κατά σύμβαση argv[] είναι το όνομα με το οποίο κλήθηκε το πρόγραμμα. argv[1],, argv[argc - 1], είναι τα υπόλοιπα ορίσματα με την σειρά που δόθηκαν στη γραμμή εντολής. argv[argc] περιέχει το μηδενικό δείκτη (NULL). ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-11

Σημασία των ορισμάτων (συν.) Παράδειγμα: Έστω ένα πρόγραμμα C το οποίο έχει τη μορφή: int main(int argc, char *argv[]) { int i = ; for (i=; i<argc; i++) { printf("argv[%d] = \ %s\ \n", i, argv[i]); return ; Θεωρείστε επίσης ότι το εκτελέσιμο αρχείο του παραπάνω προγράμματος έχει ονομαστεί prog. Τότε κατά την κλήση του prog υπό τη μορφή: $ prog opt1 opt2 opt3 έχουμε την εξής ανάθεση τιμών στα ορίσματα της main: argc = 4 argv[] = prog argv[1] = opt1 argv[2] = opt2 argv[3] = opt3 ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-12

Παράδειγμα 1 Ζητούμενο: πρόγραμμα που κατά την κλήση του με n ορίσματα αντηχεί (echoes) τα n-1 τελευταία στην οθόνη. Για παράδειγμα αν το πρόγραμμα αυτό λέγεται echo, τότε μία κλήση της μορφής: $ echo Hello world! θα εμφάνιζε στην έξοδο $ Hello world! Οι τυπικές παράμετροι της συνάρτησης main θα έχουν τιμές: argc = 3 argv[] = echo argv[1] = Hello argv[2] = world! ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-13

Παράδειγμα 1 - Υλοποίηση (συν.) #include <stdio.h> main (int argc, char *argv[]){ int i; for(i = 1; i < argc; i++) printf( %s%s, argv[i], (i < argc - 1)? : ); printf( \n ); return ; Maκροεντολή C (Μacro) (i < argc - 1)? : ); Ισοδύναμο με If (i < argc - 1) return Else return ΕΠΛ 35 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. 4-14