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

Σχετικά έγγραφα
ιαφάνειες παρουσίασης #6 (α)

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

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

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

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

Στοίβες με Δυναμική Δέσμευση Μνήμης

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

ιαφάνειες παρουσίασης #11

ιαφάνειες παρουσίασης #3

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

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

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

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

Γράφοι. Ορολογία. Ορισµός: G = (V, E) όπου. Ορολογία (συνέχεια) γράφος ή γράφηµα (graph) V:ένα σύνολο E:µια διµελής σχέση στο V

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

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

Δείκτες και Δομές. Info. Link. typedef struct NodeTag { InfoField Info; struct NodeTag *Link; } NodeType;

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

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

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

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

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

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

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

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

ιαφάνειες παρουσίασης #3

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

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

Βασικές οµές εδοµένων

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

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

ιαφάνειες παρουσίασης #4

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

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

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

Αναδρομικοί Αλγόριθμοι

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

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

Βασικές Δομές Δεδομένων

Βασικές Έννοιες Δοµών Δεδοµένων

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

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

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

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

ιαφάνειες παρουσίασης #2

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

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

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

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

DRAFT ιαφάνειες παρουσιάσεων

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

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

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

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

Μεταγλωττιστές Βελτιστοποίηση

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

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

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

Δομές δεδομένων ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

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

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

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

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

ιαφάνειες παρουσίασης #6

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

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

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

ιαφάνειες παρουσίασης #4

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

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

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

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

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

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

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

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

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

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

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

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

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

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

Προχωρημένες έννοιες προγραμματισμού σε C

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

Μεταβλητές. Έστω η μεταβλητή

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

Διάλεξη 9: Αφηρημένοι Τύποι Δεδομένων. Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

Transcript:

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ http://www.softlab.ntua.gr/~nickie/courses/progtech/ ιδάσκοντες: Γιάννης Μαΐστρος (maistros@cs.ntua.gr) Στάθης Ζάχος (zachos@cs.ntua.gr) (nickie@softlab.ntua.gr) ιαφάνειες παρουσίασης #5 (β)! είκτες (συνέχεια)!μετατροπές τύπων! υναµική παραχώρηση µνήµης! υναµικοί ΣΤ!Απλά συνδεδεµένες λίστες!ουρές 1

Κενός δείκτης και δείκτης σε κενό " Ο κενός δείκτης: NULL # Απαγορεύεται να αποδεικτοδοτηθεί! int *p = NULL; *p = 42; /* wrong! */ # Ο µόνος δείκτης που αντιστοιχεί στην ψευδή λογική τιµή, όταν χρησιµοποιείται σε συνθήκη " Ο δείκτης σε κενό: void * # Γενική µορφή δείκτη # Απαγορεύεται να αποδεικτοδοτηθεί! # Απαγορεύεται η αριθµητική δεικτών! 2

είκτες αντί περάσµατος µε αναφορά " Κώδικας Pascal procedure inc (var x : integer); begin x := x+1 end;... inc(a)... " Ισοδύναµος κώδικας C void inc (int * px) { (*px)++; }... inc(&a)... 3

είκτες σε εγγραφές " Συντοµογραφία p->x είναι ισοδύναµο µε (*p).x " Παράδειγµα struct { int x, y; } coordinates, *p; coordinates.x = 1; coordinates.y = 3; p = &coordinates; printf("%d\n", p->x); printf("%d\n", p->y); 4

Μετατροπές τύπων (i) " Έµµεσες (coercions) double d = 3; int x = 3.14; int f (int x); f(3.14); " Άµεσες (type casting) ( τύπος ) έκφραση (double) 3 (int) 3.14 (int *) NULL (µε ανάθεση) (µε πέρασµα παραµέτρου) 5

Μετατροπές τύπων (ii) " Πρόβληµα: πώς µπορώ να τυπώσω το αποτέλεσµα της πραγµατικής διαίρεσης δυο ακεραίων αριθµών, χωρίς νέες µεταβλητές; int x = 5, y = 3; " Λάθος λύση #1: printf("%d", x/y); " Λάθος λύση #2: printf("%lf", x/y); " Σωστές λύσεις: printf("%lf", 1.0 * x / y); printf("%lf", (double) x / (double) y); printf("%lf", (double) x / y); 6

υναµική παραχώρηση µνήµης (i) " Συναρτήσεις βιβλιοθήκης <stdlib.h> # void * malloc (size_t n); υναµική παραχώρηση µνήµης µήκους n bytes. Το αποτέλεσµα πρέπει να µετατραπεί στο σωστό τύπο. Επιστρέφεται NULL αν εξαντληθεί η µνήµη. # void free (void * p); Αποδέσµευση της µνήµης στην οποία δείχνει το p. Το p πρέπει να έχει δηµιουργηθεί µε προηγούµενη κλήση στη malloc. " Πόσα bytes χρειάζονται; # sizeof(type) π.χ. sizeof(int) # sizeof(variable) π.χ. sizeof(x) 7

υναµική παραχώρηση µνήµης (ii) " Παράδειγµα int *p; int i; p = (int *) malloc(sizeof(int)); *p = 42; free(p); p = (int *) malloc(10 * sizeof(int)); for (i = 0; i < 10; i++) p[i] = 42; free(p); Το αποτέλεσµα της malloc πρέπει να ελεγχθεί ότι δεν είναι NULL! 8

υναµικοί ΣΤ (i) " Χρησιµοποιούνται για την υλοποίηση ΑΤ " Παραδείγµατα # συνδεδεµένες λίστες # δέντρα # γράφοι " Πώς υλοποιούνται στη C; # µε κατάλληλο συνδυασµό δοµών (struct) και δεικτών (pointers), και # µε δυναµική παραχώρηση µνήµης 9

υναµικοί ΣΤ (ii) " Πλεονεκτήµατα έναντι στατικών ΣΤ # εν επιβάλλουν περιορισµούς στο µέγιστο πλήθος των δεδοµένων # Η µνήµη που χρησιµοποιείται είναι ανάλογη του πραγµατικού πλήθους των δεδοµένων # Κάποιες πράξεις υλοποιούνται αποδοτικότερα " Μειονεκτήµατα έναντι στατικών ΣΤ # Για σταθερό και γνωστό πλήθος δεδοµένων, χρησιµοποιούν συνήθως περισσότερη µνήµη # Κάποιες πράξεις υλοποιούνται λιγότερο αποδοτικά 10

υναµικοί ΣΤ (iii) " Ιδέα # Κατασκευάζεται ένα σύνολο κόµβων # Κάθε κόµβος περιέχει πληροφορίες και συνδέσµους προς άλλους κόµβους Π Σ 11

Απλά συνδεδεµένες λίστες (i) " Είναι γραµµικές διατάξεις " Κάθε κόµβος περιέχει ένα σύνδεσµο στον επόµενο κόµβο " Ο τελευταίος κόµβος έχει κενό σύνδεσµο 12

Απλά συνδεδεµένες λίστες (ii) " Παράδειγµα: λίστα ακεραίων struct node_tag { int data; struct node_tag * next; }; typedef struct node_tag Node, * LinkedList; " Κενή λίστα 13

Απλά συνδεδεµένες λίστες " Προσθήκη στοιχείων # απόφαση πού θα προστεθεί # δηµιουργία νέου κόµβου # αντιγραφή πληροφορίας # σύνδεση νέου κόµβου i εδώ (iii) 14

Απλά συνδεδεµένες λίστες (iv) " Αφαίρεση στοιχείων # απόφαση ποιο στοιχείο θα αφαιρεθεί # καταστροφή κόµβου # σύνδεση υπόλοιπων κόµβων αυτό 15

Ουρές (i) " First In First Out (FIFO) ό,τι µπαίνει πρώτο, βγαίνει πρώτο " Ουρά ακεραίων # ΑΤ : queue # const queue queueempty; # void queueinsert (queue * qp, int t); # int queueremove (queue * qp); # int queuehead (queue q); 16

Ουρές (ii) " Υλοποίηση µε απλά συνδεδεµένη λίστα first last 17

Υλοποίηση ουράς σε C (i) " Υλοποίηση µε απλά συνδεδεµένη λίστα typedef struct list_tag { int data; struct list_tag * next; } ListNode; " Τύπος queue typedef struct { ListNode * first; ListNode * last; } queue; 18

Υλοποίηση ουράς σε C (ii) " Άδεια ουρά const queue queueempty = { NULL, NULL }; " Εισαγωγή στοιχείου void queueinsert (queue * qp, int t) { ListNode * n = (ListNode *) malloc(sizeof(listnode)); if (n == NULL) { printf("out of memory\n"); exit(1); } 19

Υλοποίηση ουράς σε C (iii) " Εισαγωγή στοιχείου (συνέχεια) } n->data = t; n->next = NULL; if (qp->last == NULL) qp->first = qp->last = n; else { qp->last->next = n; qp->last = n; } 20