Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

Σχετικά έγγραφα
Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

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

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

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

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

Προγραμματισμός Δομές Δεδομένων

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

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

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

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

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

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

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

Γλώσσες προγραµµατισµού. Ανάπτυξη Συστηµάτων Λογισµικού

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

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

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Η γλώσσα προγραμματισμού C Συνδεδεμένες Λίστες

Εισαγωγή στον Προγραμματισμό (με. τη C)

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

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

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

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

Φροντιστήριο 4 Σκελετοί Λύσεων

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

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

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

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

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

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

Το λειτουργικό σύστημα. Προγραμματισμός II 1

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

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

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Προγραμματισμός Αναδρομή

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

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

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

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

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

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

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

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

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

Προγραμματισμός Αναδρομή

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

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

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

Sheet2. - Άσκηση 1 οκ - Άσκηση 2 οκ. Σκέψου πώς θα µπορούσες να την

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

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

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

ιαφάνειες παρουσίασης #9 (α)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

Περιεχόμενα. Πρόλογος... 17

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

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

υναµικές οµές εδοµένων

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

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

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

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

Κεφάλαιο 7: Υπορουτίνες

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

Σημειώσεις έκτης και έβδομης εβδομάδας

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

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

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

Φροντιστήριο 4 Σκελετοί Λύσεων

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1

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

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

Προγραμματισμός ΙΙ Εαρινό εξάμηνο Εργασία 3 Βιβλιοθήκη για λειτουργίες σε γράφους

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

Αλγόριθμοι Ταξινόμησης Μέρος 1

Περιεχόμενα. Πρόλογος... 21

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

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

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

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

Μεταγλωττιστές. Συντακτικός Αναλυτής Κατασκευή Πίνακα Συμβόλων (ΠΣ) Εργαστήριο 7. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

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

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

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

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

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

Transcript:

Δείκτες σε συναρτήσεις Προγραμματισμός II 1 lalis@inf.uth.gr

Συνάρτηση Ομάδα εντολών που γράφουμε ξεχωριστά για να υλοποιήσουμε μια συγκεκριμένη λειτουργία για καλύτερη / πιο καθαρή δόμηση του κώδικα για να μπορούμε να τις εκτελούμε πολλές φορές χωρίς να πρέπει να επαναλαμβάνουμε κάθε φορά τις ίδες εντολές Μπορεί να δέχεται παραμέτρους παραμετροποιημένος κώδικας δεν χρειάζεται να γράφουμε (πρακτικά) τον ίδιο κώδικα πολλές φορές μέσα στα προγράμματα μας επαναχρησιμοποίηση μιας γενικής/βασικής διαδικασίας έχοντας παράλληλα την ευελιξία για μικρο-προσαρμογές μέσω των παραμέτρων Προγραμματισμός II 2 lalis@inf.uth.gr

Μετα-συνάρτηση Μια από τις παραμέτρους που δέχεται η συνάρτηση είναι... κώδικας Ένας τρόπος (στην C ο μόνος) να περάσουμε κώδικα ως παράμετρο μιας συνάρτησης είναι να οριστεί κατάλληλη παράμετρος με τύπο συνάρτησης Αυτός ορίζεται μέσω των παραμέτρων που δέχεται και του αποτελέσματος που επιστρέφει η συνάρτηση Προγραμματισμός II 3 lalis@inf.uth.gr

Γιατί να έχουμε μετα-συναρτήσεις; Μια συνάρτηση μπορεί να έχει διαφορετικές, ανεξάρτητες διαδικασίες / «διαστάσεις» π.χ., διάσχιση και εκτύπωση των περιεχομένων μιας πολύπλοκης δομής δεδομένων Μπορεί να είναι χρήσιμο αυτές οι διαδικασίες να υλοποιηθούν ξεχωριστά π.χ., διαδικασία διάσχισης / διαδικασία εκτύπωσης Πως μπορούμε να το πετύχουμε αυτό; Υλοποιούμε την βασική διαδικασία έτσι ώστε να δέχεται τις υπόλοιπες διαδικασίες ως παραμέτρους π.χ., η συνάρτηση που υλοποιεί την διάσχιση της δομής δέχεται ως παράμετρο την συνάρτηση που υλοποιεί την εκτύπωση των περιεχομένων κάθε στοιχείου της δομής Προγραμματισμός II 4 lalis@inf.uth.gr

struct list { int v; struct list *nxt; ; struct list *list_init(); int list_haselement(struct list *root, int v); struct list *list_insert(struct list *root, int v); struct list *list_remove(struct list *root, int v); void list_destroy(struct list *root); void list_print(struct list *root); Προγραμματισμός II 5 lalis@inf.uth.gr

structure-level traversal code void list_print(struct list *root) { struct list *curr; for(curr=root; curr!= NULL; curr=curr->nxt) { printf("%d\n",curr->v); node-level print code Προγραμματισμός II 6 lalis@inf.uth.gr

struct list { int v; struct list *nxt; ; struct list *list_init(); int list_haselement(struct list *root, int v); struct list *list_insert(struct list *root, int v); struct list *list_remove(struct list *root, int v); void list_destroy(struct list *root); void list_traverse(struct list *root, void (*handle)(struct list *)); Προγραμματισμός II 7 lalis@inf.uth.gr

void list_traverse(struct list *root, void (*handle)(struct list *)) { struct list *curr; for(curr=root; curr!= NULL; curr=curr->nxt) { handle(cur); void printfun(struct list *l) { printf("%d\n",l->v); struct list *root = list_init(); struct list *root = list_insert(root, 1); struct list *root = list_insert(root, 2); struct list *root = list_insert(root, 3); list_traverse(root, printfun); Προγραμματισμός II 8 lalis@inf.uth.gr

Υλοποίηση δομών με πλήρη ανεξαρτησία ως προς το περιεχόμενο των στοιχείων Οι βασικές λειτουργίες των πολύπλοκων δομών δεδομένων μπορεί να υλοποιηθούν μια φορά, ανεξάρτητα από το περιεχόμενο των στοιχείων Η υλοποίηση αφορά την οργάνωση της αποθήκευσης των στοιχείων στην μνήμη (όχι το περιεχόμενο τους) π.χ., πίνακας, λίστα, δέντρο κλπ Κάποιες λειτουργίες χρειάζονται πρόβαση στα περιεχόμενα των στοιχείων αναζήτηση: απαιτείται έλεγχος ισότητας / ισοδυναμίας ανάμεσα σε δύο στοιχεία ταξινόμηση: απαιτείται σύγκριση ανάμεσα σε δύο στοιχεία Κατάλληλη αφαίρεση μέσω συναρτήσεων που δίνονται ως παράμετροι από την εφαρμογή Προγραμματισμός II 9 lalis@inf.uth.gr

element comparison function (-1 smaller, 0 equal, 1 bigger) typedef struct setstruct *set_t; set_t set_init(int (*cmp)(void *, void*)); int set_find(set_t s, void *elem); set_t set_add(set_t s, void *elem); set_t set_rmv(set_t s, void *elem); void set_traverse(set_t s, void (*handle)(void *)); void set_destroy(set_t s); element handling function (whatever the application wants to do with every element) Προγραμματισμός II 10 lalis@inf.uth.gr

struct student { char name[64]; unsigned short courses_taken; unsigned short courses_passed; unsigned short courses_left; float gpa; ; int cmpstudents(void *sptr1, void *sptr2) { struct student *s1 = (struct student *)sptr1; struct student *s2 = (struct student *)sptr2; return(strcmp(s1->name,s2->name)); set_t students = set_init(cmpstudents); Προγραμματισμός II 11 lalis@inf.uth.gr

void printstudent(void *sptr) { struct student *s = (struct student *)sptr; printf("%s\t", s->name); printf("%d\t", s->courses_left); printf("%f\n", s->gpa); printf("name\tcourses Left\tGPA\n"); set_traverse(students, printstudent); int counter; // global void countstudent(void *sptr) { counter++; counter = 0; set_traverse(students, countstudent); printf("nof students is %d\n",counter); Προγραμματισμός II 12 lalis@inf.uth.gr

Μια πιο καθαρή λύση για την διάσχιση Η διάσχιση της δομής χωρίς έλεγχο από την εφαρμογή δεν είναι ιδιαίτερα ευέλικτη Μπορεί να δοθεί περισσότερος έλεγχος στην εφαρμομή, μέσα από μια διαφορετική προσέγγιση Ξεχωριστές λειτουργίες για την έναρξη/αρχικοποίηση της διαδικασίας διάσχισης της δομής, και για την επιστροφή του επόμενου στοιχείου Προγραμματισμός II 13 lalis@inf.uth.gr

void set_traverse_init(set_t s); void *set_traverse_nxt(set_t s); void print_students() { struct student *s printf("name\tcourses Left\tGPA\n"); set_traverse_init(students); while (1) { s = (struct student *)set_traverse_nxt(students); if (s == NULL) break; printf("%s\t", s->name); printf("%d\t", s->courses_left); printf("%f\n", s->gpa); Προγραμματισμός II 14 lalis@inf.uth.gr

void set_traverse_init(set_t s); void *set_traverse_nxt(set_t s); void count_students() { int counter; struct student *s counter = 0; set_traverse_init(students); while (1) { s = (struct student *)set_traverse_nxt(students); if (s == NULL) break; counter++; printf("nof students is %d\n",counter); Προγραμματισμός II 15 lalis@inf.uth.gr

Ροή εκτέλεσης Τι γίνεται με την ροή εκτέλεσης του προγράμματος όταν χρησιμοποιούνται συναρτήσεις ως παράμετροι άλλων συναρτήσεων; Μια κλήση συνάρτησης μέσα από άλλη συνάρτηση όπως ακριβώς με τις «καρφωτές» κλήσεις συναρτήσεων Όμως, η καλούσα συνάρτηση / καλών κώδικας δεν γνωρίζει ποιά συνάρτηση / ποιός κώδικας θα κληθεί κατά την διάρκεια της εκτέλεσης Ένας τρόπος ευέλικτης επέκτασης λογισμικού: κώδικας που γράφουμε «τώρα» μπορεί να καλέσει κώδικα που θα γραφτεί κάποια στιγμή «στο μέλλον» (πιθανώς από άλλους) Προγραμματισμός II 16 lalis@inf.uth.gr

Αντίστροφες κλήσεις up calls Η συνηθισμένη/κλασική ροή εκτέλεσης είναι το λογισμικό που βρίσκεται σε ψηλότερο «επίπεδο» (ο κώδικας γράφουμε τώρα) να καλεί το λογισμικό που βρίσκεται σε «χαμηλότερο» επίπεδο (κώδικας που έχει ήδη γραφτεί και μεταφραστεί την ώρα που γράφουμε τον παραπάνω κώδικα) down calls Με δείκτες σε συναρτήσεις, αυτή η ροή εκτέλεσης μπορεί να αντιστραφεί! Το λογισμικό που βρίσκεται σε πιο χαμηλό επίπεδο μπορεί να καλέσει λογισμικό που βρίσκεται σε πιο ψηλό επίπεδο up calls Προγραμματισμός II 17 lalis@inf.uth.gr

Down call my program (the code I have just written) call return execution code that is used by my program (available, compiled) execution time line Προγραμματισμός II 18 lalis@inf.uth.gr

Up call my program (the code I have just written) execution call return code that is used by my program (available, compiled) execution time line Προγραμματισμός II 19 lalis@inf.uth.gr

Πολυμορφικές δομές δεδομένων Προγραμματισμός II 20 lalis@inf.uth.gr

Δομές με ετερογενή στοιχεία Μια δομή μπορεί να χρησιμοποιηθεί για την διαχείριση στοιχείων διαφορετικού τύπου Πως μπορεί να υλοποιηθούν οι βασικές λειτουργίες της δομής ανεξάρτητα από τον τύπο των στοιχείων; Ορίζεται ένας βασικός τύπος με την απαραίτητη πληροφορία για την διαχείρηση της δομής, με βάση τον οποίο υλοποιούνται όλες οι λειτουργίες Ο τύπος των στοιχείων που προστίθενται στην δομή ορίζονται ως επεκτάσεις του βασικού τύπου Πως γνωρίζουμε τον τύπο του στοιχείου που επιστρέφεται π.χ. σε μια αναζήτηση; Πρέπει να προβλεφθεί επιπλέον πληροφορία τύπου (type information) που καθοδηγεί το type casting Προγραμματισμός II 21 lalis@inf.uth.gr

struct listbase { int key; /* for search/sort functionality */ int type; /* type code for data extensions */ struct listbase *nxt; /* implement a linked list */ ; struct listbase *root; void list_init(); void list_add(int v, int type, struct listbase *l); struct listbase * list_find(int v); void list_remove(int v); void list_destroy(); Προγραμματισμός II 22 lalis@inf.uth.gr

#define TYPE1 1 #define TYPE2 2 struct ext1 { struct listbase base; int data; /* data on top of extension */ ; struct ext2 { struct listbase base; char data[16]; /* data on top of extension */ ; Προγραμματισμός II 23 lalis@inf.uth.gr

for (i=0; i<n; i++) { if (i%2 == 0) { e1 = (struct ext1 *) malloc(sizeof(struct ext1)); e1->data = i; list_add(i,type1,(struct listbase *)e1); else { e2 = (struct ext2 *) malloc(sizeof(struct ext2)); sprintf(e2->data,"%d",i); list_add(i,type2,(struct listbase *)e2); Προγραμματισμός II 24 lalis@inf.uth.gr

struct listbase *l; for (i=n-1; i>=0; i--) { l = list_find(id); if (l!= NULL) { switch (l->type) { case TYPE1: { printf("%d\n",((struct ext1 *)l)->data); break; case TYPE2: { printf("%s\n",((struct ext2 *)l)->data); break; Προγραμματισμός II 25 lalis@inf.uth.gr

Επεκτασιμότητα στο λογισμικό Η χρήση αντίστροφων κλήσεων σε συνδυασμό με τις πολυμορφικές δομές είναι από τους πιο βασικούς μηχανισμούς επεκτασιμότητας Κώδικας που γράφεται «τώρα» μπορεί να καλέσει κώδικα που θα γραφτεί «αργότερα» Κώδικας που γράφεται «τώρα» μπορεί να διαχειριστεί ετερογενή στοιχεία ο πραγματικός τύπος των οποίων θα προσδιοριστεί «αργότερα» Παρόμοια λογική ανάπτυξης υποστηρίζεται, με πιο «καθαρό» τρόπο, από τις αντικειμενοστραφείς (object-oriented) γλώσσες προγραμματισμού Προγραμματισμός II 26 lalis@inf.uth.gr