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

Σχετικά έγγραφα
Εισαγωγή στον Προγραμματισμό

Προγραμματισμός H/Y Ενότητα 4: Δείκτες. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Εισαγωγή στους Αλγορίθμους

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

Εισαγωγή στους Αλγορίθμους

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Νέες Τεχνολογίες και Καλλιτεχνική Δημιουργία

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Μαθηματική Ανάλυση Ι

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Τεχνολογία & Καινοτομία - Αρχές Βιομηχανικής Επιστήμης

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

Εισαγωγή στους Αλγορίθμους

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Τεχνοοικονομική Μελέτη

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Μαθηματική Ανάλυση ΙI

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Διοικητική Λογιστική

Νέες Τεχνολογίες και Καλλιτεχνική Δημιουργία

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

Εισαγωγή στην πληροφορική

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Μηχανολογικό Σχέδιο Ι

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Ιστορία της μετάφρασης

Εκκλησιαστικό Δίκαιο. Ενότητα 10η: Ιερά Σύνοδος της Ιεραρχίας και Διαρκής Ιερά Σύνοδος Κυριάκος Κυριαζόπουλος Τμήμα Νομικής Α.Π.Θ.

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους (1)

Μαθηματική Ανάλυση Ι

Προγραμματισμός H/Y Ενότητα 6: Δομές (structures) Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Λογιστική Κόστους Ενότητα 10: Ασκήσεις Προτύπου Κόστους Αποκλίσεων.

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους

ΗΛΕΚΤΡΟΝΙΚΗ ΙIΙ Ενότητα 6

Γενικά Μαθηματικά Ι. Ενότητα 12: Κριτήρια Σύγκλισης Σειρών. Λουκάς Βλάχος Τμήμα Φυσικής ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

Κοινωνιολογία της Εκπαίδευσης

Εισαγωγή στην πληροφορική

Μαθηματική Ανάλυση Ι

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Βάσεις Δεδομένων. Ενότητα 1: Εισαγωγή στις Βάσεις δεδομένων. Πασχαλίδης Δημοσθένης Τμήμα Ιερατικών σπουδών

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

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

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Μαθηματική Ανάλυση Ι

Μαθηματική Ανάλυση ΙI

Γενικά Μαθηματικά Ι. Ενότητα 15: Ολοκληρώματα Με Ρητές Και Τριγωνομετρικές Συναρτήσεις Λουκάς Βλάχος Τμήμα Φυσικής

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

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Μεθοδολογία Έρευνας Κοινωνικών Επιστημών Ενότητα 2: ΣΥΓΚΕΝΤΡΩΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΜΑΡΚΕΤΙΝΓΚ Λοίζου Ευστράτιος Τμήμα Τεχνολόγων Γεωπόνων-Kατεύθυνση

Εισαγωγή στην Διοίκηση Επιχειρήσεων

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

Μαθηματική Ανάλυση Ι

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

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

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Προγραμματισμός H/Y Ενότητα 3: Πίνακες αριθμών και χαρακτήρων. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Μαθηματική Ανάλυση Ι

Μαθηματική Ανάλυση ΙI

Βέλτιστος Έλεγχος Συστημάτων

Μαθηματική Ανάλυση Ι

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανολόγων Μηχανικών. Χημεία. Ενότητα 14: Χημική ισορροπία

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 1

Διοίκηση Επιχειρήσεων

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

Αρχιτεκτονική Υπολογιστών

Εισαγωγή στους Αλγορίθμους Ενότητα 11η Άσκηση - Σταθμισμένος Χρονοπρογραμματισμός Διαστημάτων

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών. Διακριτά Μαθηματικά. Ενότητα 7: Σχέσεις και Συναρτήσεις

Θεσμοί Ευρωπαϊκών Λαών Ι 19 ος -20 ος αιώνας

ΟΙΚΟΝΟΜΕΤΡΙΑ. Ενότητα 1: Εκτιμητές και Ιδιότητες. Αναπλ. Καθηγητής Νικόλαος Σαριαννίδης Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

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

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανολόγων Μηχανικών. Χημεία. Ενότητα 9: Υβριδισμός. Τόλης Ευάγγελος

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Έννοιες φυσικών επιστημών Ι και αναπαραστάσεις

Μάρκετινγκ Αγροτικών Προϊόντων

Διοίκηση Εξωτερικής Εμπορικής Δραστηριότητας

Μαθηματική Ανάλυση Ι

Τεχνολογία και Καινοτομία - Οικονομική Επιστήμη και Επιχειρηματικότητα

Διδακτική της Πληροφορικής

Προγραμματισμός H/Y Ενότητα 7: Αρχεία. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Κοινωνιολογία της Εκπαίδευσης

Εκκλησιαστικό Δίκαιο

Δομές Δεδομένων Ενότητα 1

Κβαντική Επεξεργασία Πληροφορίας

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 4: Συναρτήσεις

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

Transcript:

Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Εισαγωγή στον δομημένο προγραμματισμό Ενότητα 12 η : Δυναμική Ανάθεση Θέσης Αν. καθηγητής Στεργίου Κώστας e-mail: kstergiou@uowm.gr Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ψηφιακά Μαθήματα στο Πανεπιστήμιο Δυτικής Μακεδονίας» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3

Στόχοι της διάλεξης Περιγραφή της διαδικασίας δυναμικής δέσμευσης μνήμης και των σχετικών εντολών της C. 4

Περιεχόμενα Δυναμικές μεταβλητές. Δυναμική δέσμευση μνήμης. Malloc. Αποδέσμευση μνήμης. Free. Επανακαθορισμός δυναμικά δεσμευμένης μνήμης. Realloc. 5

Στατική Δέσμευση Μνήμης Με τη δήλωση απλών μεταβλητών ο χώρος μνήμης που τους αποδίδεται παραμένει δεσμευμένος. μέχρι το τέλος του προγράμματος. ή μέχρι το τέλος του μπλοκ εντολών στο οποίο δηλώθηκαν. Η πρακτική αυτή ονομάζεται στατική δέσμευση μνήμης. Παρουσιάζει ιδιαίτερα προβλήματα εκμετάλλευσης της υπάρχουσας μνήμης καθώς δεν είναι πάντα εκ των προτέρων γνωστός ο όγκος της μνήμης τον οποίο θα κληθεί το κάθε πρόγραμμα να διαχειριστεί. 6

Παράδειγμα 1 ο Εκτιμούμε ότι ένα πρόγραμμα απαιτεί 100 πίνακες, διαστάσεων ο καθένας 10x10 το πολύ. Άρα χρειαζόμαστε αποθηκευτικό χώρο για 10.000 στοιχεία. Δηλώνουμε 100 διακριτούς πίνακες 10x10. Κατά την διάρκεια της εκτέλεσης αποδεικνύεται ότι χρειαζόμαστε μόνο 10 πίνακες 11x10. Το πρόγραμμά αποτυγχάνει παρότι επιθυμούμε να εκμεταλλευτούμε μόνο 1.100 στοιχεία από τα 10.000 που έχουμε ήδη δεσμεύσει. Αντιθέτως, εάν είχαμε δεσμεύσει χώρο για 10.000 στοιχεία σε μια «αποθηκευτική δομή», θα μπορούσαμε πολύ εύκολα να αναθέσουμε τους 10 πίνακες 11x10. 7

Δυναμικές Μεταβλητές Οι μεταβλητές που δημιουργούνται κατά τη διάρκεια της εκτέλεσης ενός προγράμματος ονομάζονται δυναμικές μεταβλητές. Δημιουργούνται με κλήση στην συνάρτηση malloc για την ανάθεση συγκεκριμένου όγκου μνήμης. η malloc βρίσκεται στο βασικό αρχείο stdlib.h Οι δυναμικές μεταβλητές ισχύουν μέχρι να δοθεί εντολή καταστροφής τους ή τον τερματισμό του προγράμματος. Οι δυναμικές μεταβλητές εκμεταλλεύονται πιο ευέλικτα τον διαθέσιμο χώρο μνήμης. 8

Δέσμευση Μνήμης <όνομα δείκτη μεταβλητής> = malloc (χώρος μνήμης); Η malloc επιστρέφει τη διεύθυνση της μνήμης που δέσμευσε ή NULL αν αποτύχει. Πριν την κλήση της malloc πρέπει να: αποφασισθεί ο τύπος των δεδομένων τα οποία πρόκειται να αποθηκεύσουμε στη μεταβλητή. δηλωθεί μια μεταβλητή δείκτη τύπου δεδομένων όμοιου με τον τύπο της δυναμικής μεταβλητής. Μετά την κλήση της malloc: αποδίδεται στη μεταβλητή δείκτη η διεύθυνση της τοποθεσίας της μνήμης η οποία έχει δεσμευθεί για την αποθήκευση της δυναμικής μεταβλητής. Για την εύρεση του ζητούμενου χώρου μνήμης συνήθως καλείται η συνάρτηση sizeof(). 9

Παράδειγμα 2 ο /* Δήλωση ενός δείκτη σε χαρακτήρα */ char *x; /* Δέσμευση χώρου μνήμης y χαρακτήρων */ x = malloc(sizeof(char)*y); /* Στο δείκτη x αποθηκεύεται η διεύθυνση της μνήμης που δεσμεύτηκε */ if (x == NULL) /* η δέσμευση απέτυχε */ printf( Η δέσμευση απέτυχε\n ); 10

Τype Cast Παρότι αρκετοί compilers δεν το απαιτούν θα μπορούσε επίσης να υπάρχει η δήλωση μετατροπής (char*) για τον επιστρεφόμενο τύπο της malloc. x = (char*)malloc(sizeof(char)*y); η malloc επιστρέφει ένα δείκτη τύπου void ο οποίος για να αποδοθεί σε ένα δείκτη τύπου char πρέπει να μετατραπεί. 11

Αποδέσμευση Μνήμης Όταν η διαθέσιμη μνήμη είναι περιορισμένη ή οι δυναμικές αναθέσεις που ζητάμε είναι μεγάλων απαιτήσεων σε όγκο απαιτείται η ρητή ελευθέρωση των κομματιών της μνήμης που αποδόθηκαν δυναμικά και δεν είναι πλέον χρήσιμα στο πρόγραμμα. Για να αποδεσμεύσουμε τη μνήμη που δεσμεύτηκε με την κλήση της malloc χρησιμοποιούμε τη συνάρτηση free. Βρίσκεται στο βασικό αρχείο stdlib.h. free (<όνομα δείκτη μεταβλητής>); Μετά την κλήση της free συνίσταται η καταχώρηση της τιμής NULL στον δείκτη της μεταβλητής. ο δείκτης συνεχίζει να υφίσταται και περιέχει μια διεύθυνση η οποία όμως δε μπορεί να χρησιμοποιηθεί. <όνομα δείκτη μεταβλητής> = NULL; 12

Παράδειγμα 3 ο /* Δέσμευση μνήμης y χαρακτήρων */ char *x; x = malloc(sizeof(char)*y); /* Αποδέσμευση μνήμης y χαρακτήρων */ free(x); x = NULL; 13

Επανακαθορισμός Δέσμευσης Μνήμης Όταν έχουμε δεσμεύσει ένα χώρο μνήμης με κλήση της malloc, μπορούμε να επανακαθορίσουμε το μέγεθος της δεσμευμένης μνήμης με την συνάρτηση realloc. Βρίσκεται στο βασικό αρχείο <stdlib.h> <νεός δείκτης> = realloc(<παλιός δείκτης>, <νέο μέγεθος>); Αν ζητάμε αύξηση του χώρου μνήμης και υπάρχει δυνατότητα να γίνει στην παλιά θέση, επιστρέφεται η παλιά διεύθυνση πάλι, αλλιώς επιστρέφεται νέα διεύθυνση. Συνιστάται η αποθήκευση του νέου δείκτη σε νέα μεταβλητή ώστε να μην υπάρχει κίνδυνος να χαθεί ο παλιός χώρος μνήμης (αν η realloc επιστρέψει NULL). 14

Παράδειγμα 4 ο /* Δέσμευση μνήμης y χαρακτήρων */ char *x, *x1; x = malloc(sizeof(char)*y); /* Επανακαθορισμός δεσμευμένης μνήμης */ y1=y*2; x1 = realloc(x,sizeof(char)*y1); if (x1!= NULL) x = x1; else printf("den uparxei arketi diathesimi mnimi\n"); 15

Παράδειγμα: Δυναμική Δέσμευση Μνήμης για Μονοδιάστατο Πίνακα /* Διάβασμα μεγέθους πίνακα */ int megethos; int *pinakas; scanf( %d,&megethos); /* Δέσμευση ανάλογου χώρου μνήμης */ pinakas = malloc(megethos*sizeof(int)); /* Απόδοση τιμών σε στοιχεία του πίνακα */ pinakas[0]=5; scanf( %d, &pinakas[1]); /* Υπενθύμιση: pinakas[i]==*(pinakas+i) */ 16

Άσκηση 1 η Να γραφεί πρόγραμμα σε C που να ζητά από το χρήστη να καθορίσει ένα αριθμό n και να διαβάζει n πραγματικούς αριθμούς από την standard είσοδο. Στη συνέχεια, υπολογίζει το μέσο όρο των αριθμών αυτών και μετά για τον καθένα αριθμό το τετράγωνο της διαφοράς μεταξύ του αριθμού και του μέσου όρου (τυπική απόκλιση). Αν υποθέσουμε ότι το n είναι 3 και οι αριθμοί είναι 10, 5 και 3: Ο μέσος όρος είναι 18/3 = 6. Τα τετράγωνα των διαφορών είναι: (10-6)(10-6) = 16, (5-6)(5-6) = 1, and (3-6)(3-6) = 9. Έτσι, η τυπική απόκλιση είναι (16+1+9)/3 = 26/3 = 8.6667. 17

Άσκηση 2 η #include <stdio.h> #include <stdlib.h> main() { int n, i; double *values; double avg; double variance; printf( Set the amount of values: ); scanf( %d,&n); if (n >= 0) values = (double *) malloc(sizeof(double)*n); for (i = 0; i < n; i++) scanf("%lf", &values[i]); avg = 0; for (i = 0; i < n; i++) avg += values[i]; avg /= n; variance = 0; for (i = 0; i < n; i++) variance += ((values[i]-avg)*(values[i]-avg)); variance /= n; printf("average: %lf\n", avg); printf("variance: %lf\n", variance); free (values); } 18

Παράδειγμα: Δέσμευση Μνήμης Πίνακα Δομών struct book { char *title; /* Τίτλος */ char *writer; /* Συγγραφέας */ int isbn; /* Αριθμός ISBN */ int code; /* Κωδικός βιβλιοθήκης */ }; typedef struct book BOOK; BOOK *books; int amount; printf( Δώσε πλήθος βιβλίων: ); scanf( %d, &amount); books = (BOOK *) malloc(amount*(sizeof(book)); if (books == NULL) printf( Η δέσμευση μνήμης απέτυχε\n ); 19

Τέλος Ενότητας 20

Σημείωμα Αναφοράς Copyright, Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών, Στεργίου Κωνσταντίνος. «Εισαγωγή στον Δομημένο Προγραμματισμό». Έκδοση: 1.0. Κοζάνη 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: https: //eclass.uowm.gr/courses/icte258/ 21

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Όχι Παράγωγα Έργα Μη Εμπορική Χρήση 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] h t t p ://creativecommons.org/licenses/by-nc-nd/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό 22

Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους. 23