H ΓΛΩΣΣΑ C. Μάθηµα 12: υναµική έσµευση Μνήµης. ηµήτρης Ψούνης

Σχετικά έγγραφα
H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης

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

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 8: είκτες. ηµήτρης Ψούνης

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

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

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

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

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

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

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

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

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

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

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

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

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

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

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

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

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

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

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

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

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα. ηµήτρης Ψούνης

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

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

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

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

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

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

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

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

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

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

Sheet1_2. - Δεν απελευθερώνεις τη δυναµικά δεσµευµένη µνήµη. - Η έξοδος του προγράµµατός σου δεν είναι ακριβώς όπως ζητούσε η άσκηση.

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

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

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

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

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

Τμήμα Εφαρμοσμένης Πληροφορικής

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

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

Η Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 6 Εντολές Επανάληψης Ασκήσεις. Γιώργος Λαμπρινίδης

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

H ΓΛΩΣΣΑ C. Μάθηµα 15: Είσοδος/Έξοδος: Συναρτήσεις Εισόδου. ηµήτρης Ψούνης

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

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

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

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

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

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

ΗΥ-150. Πίνακες (Arrays)

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

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

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

Η γλώσσα C. Δείκτες και Διαχείριση Μνήμης (memory management)

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

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

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

ΗΥ-150. Προγραµµατισµός. Πίνακες (Arrays)

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

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

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

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

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

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

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

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

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 4: Τελεστές και η οµή Ελέγχου (if$else) ηµήτρης Ψούνης

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

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

Εξοικ Εξ ε οικ ίωση ε με το το πρόγ ραμμα πρόγ DEV C++ Επικοι Επικ νωνία οι Χρήσ Χρήστη τη Υπολ Υπο ογισ λ τή

H ΓΛΩΣΣΑ C. Μάθηµα 16: Είσοδος/Έξοδος: Συναρτήσεις Eξόδου. ηµήτρης Ψούνης

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

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

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

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

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

5ο σετ σημειώσεων - Δείκτες

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

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

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

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

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

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

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

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

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

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

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

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

Transcript:

H ΓΛΩΣΣΑ C Μάθηµα 12: υναµική έσµευση Μνήµης ηµήτρης Ψούνης

2 Περιεχόµενα Μαθήµατος 1. Στατική έσµευση Μνήµης 1. Η συνάρτηση malloc 2. Η συνάρτηση free 3. έσµευση Μεταβλητής 4. έσµευση Μονοδιάστατου Πίνακα 5. έσµευση ιδιάστατου Πίνακα Β. Ασκήσεις

3 1. Στατική έσµευση Μνήµης Οι τρόποι που έχουµε δει για να δηλώνουµε έναν πίνακα (άρα και µία συµβολοσειρά) είναι να δηλώσουµε εκ των προτέρων το µέγεθος του. Το γεγονός αυτό κάνει το πρόγραµµα µας να µην είναι πολύ ευέλικτο. Είναι συχνό, να καταλαβαίνουµε κατά τον χρόνο εκτέλεσης πόσο θα θέλουµε να είναι το µέγεθος του πίνακα µας. Ο τρόπος δήλωσης ενός πίνακα µε τον τρόπο αυτό, δεσµεύει στατικά τον χώρο µνήµης. Συνεπώς µε τον όρο στατική δέσµευση µνήµης αναφερόµαστε στην δήλωση µιας µεταβλητής µε τον συνηθισµένο τρόπο, π.χ.: int x; ή και στον συνηθισµένο τρόπο για την δήλωση ενός πίνακα, π.χ.: int pinakas[10];

4 1. Η συνάρτηση malloc Η συνάρτηση malloc: void *malloc(size_t size) εσµεύει δυναµικά τόσα bytes όσα και το όρισµα που της διοχετεύουµε. Έχει οριστεί στην βιβλιοθήκη συναρτήσεων: stdlib.h Επιστρέφει είτε έναν δείκτη στην αρχή του χώρου µνήµης που δεσµεύθηκε δυναµικά. Είτε την τιµή NULL, αν δεν βρέθηκε κατάλληλος χώρος µνήµης. Θα πρέπει πάντα να ελέγχουµε αν η mallocκατάφερε να δεσµεύσει τον χώρο και δεν επέστρεψε NULL Μέσω της συνάρτησης malloc, µπορούµε κατά τον χρόνο εκτέλεσης (όταν δηλαδή τρέχει το πρόγραµµα) να βρίσκουµε τον χώρο µνήµης που θα χρειαστούν οι µεταβλητές.

5 2. Η συνάρτηση free Η συνάρτηση free: void free(void *ptr) Απελευθερώνει τα bytes που είχαµε δεσµεύσει δυναµικά µε την συνάρτηση malloc, στην αρχή των οποίων δείχνει ο δείκτης ptr. Έχει οριστεί στην βιβλιοθήκη συναρτήσεων: stdlib.h Θα πρέπει να γνωρίζουµε ότι ΠΑΝΤΑ θα πρέπει να απελευθερώνουµε όση µνήµη δεσµεύσαµε δυναµικά µε την malloc. Θεωρείται σηµαντικό προγραµµατιστικό λάθος να µην αποδεσµεύουµε τον χώρο που έχουµε δεσµεύσει δυναµικά µε την malloc κάνοντας κατάλληλη χρήση της εντολής free.

6 3. έσµευση Μεταβλητής Για να δεσµεύσουµε µνήµη για µια µεταβλητή, δηλώνουµε έναν δείκτη στην µεταβλητή. Έπειτα κάνουµε χρήση της mallocκαι δεσµεύουµε τόσο χώρο όσο πιάνει ο αντίστοιχος τύπος δεδοµένων στην µνήµη. Για να το κάνουµε αυτό χρησιµοποιούµε τον τελεστή sizeof Χρησιµοποιούµε κανονικά την µεταβλητή µας µέσω του δείκτη. εν ξεχνάµε ποτέ να αποδεσµεύσουµε τον χώρο που δεσµεύσαµε µε την free. Ας δούµε ένα παράδειγµα για την χρήση µε µία µεταβλητή: int *p; //Εδώ δηλώνουµε τον δείκτη στην µεταβλητή. p=malloc(sizeof(int)); // εσµεύουµε δυναµικά την µνήµη για τον ακέραιο *p=4; //Εδώ µπορούµε να κάνουµε χρήση του ακεραίου free(p); //αποδεσµεύουµε τον χώρο µνήµης

7 3. έσµευση Μεταβλητής Τελείως αντίστοιχα θα δουλεύαµε και για έναν float: float *p; //Εδώ δηλώνουµε τον δείκτη στην µεταβλητή. p=malloc(sizeof(float)); // εσµεύουµε δυναµικά την µνήµη για τον float *p=10.4; //Εδώ µπορούµε να κάνουµε χρήση του float free(p); //αποδεσµεύουµε τον χώρο µνήµης ή για έναν long long *p; //Εδώ δηλώνουµε τον δείκτη στην µεταβλητή. p=malloc(sizeof(long)); // εσµεύουµε δυναµικά την µνήµη για τον long *p=1132; //Εδώ µπορούµε να κάνουµε χρήση του long free(p); //αποδεσµεύουµε τον χώρο µνήµης Και εντελώς όµοια µπορούµε να κάνουµε το ίδιο και για οποιοδήποτε άλλο τύπο δεδοµένων

8 3. έσµευση Μεταβλητής Πρέπει πάντα να ελέγχουµε αν η εκτέλεση της mallocπέτυχε (δηλαδή ότι δεσµευτηκεο απαιτούµενος χώρος στη µνήµη) Αυτό γίνεται µε τον έλεγχο της επιστρεφόµενης τιµής: Αν είναι NULL τότε είχαµε αποτυχία στη δέσµευση της µνήµης Αν δεν είναι NULL τότε όλα πήγαν καλά. Θα ακολουθήσουµε και την ακόλουθη µορφή όταν θα δεσµεύουµε τη µνήµη µε την malloc p=malloc(sizeof(int) if (!p) { printf( Apotyxia Desmeysis Mnimis ); exit(0); } Όπου ελέγχουµε επιτόπου αν δεσµεύτηκε χώρος στη µνήµη και σε περίπτωση αποτυχίας προκαλούµε βίαιο τερµατισµό στο πρόγραµµά µας.

9 3. έσµευση Μεταβλητής Συνολικά λοιπόν ένα πρόγραµµα που αναδεικνύει την δυναµική δέσµευση µνήµης για µία µεταβλητή είναι το ακόλουθο /*malloc_var.c Deixnei pws desmeuoume xwro gia mia metavliti */ #include <stdio.h> #include <stdlib.h> main() { int *p; p=malloc(sizeof(int)); if (!p) { printf("adynamia desmeusis mnimis"); exit(0); } printf("dwse enan akeraio arithmo: "); scanf("%d",p); printf("pliktrologisate %d",*p); } free(p);

10 3. έσµευση Μεταβλητής Ο τρόπος που διαχειριστήκαµε την µεταβλητή (δήλωση δείκτη, δέσµευση χώρου, ανάθεση τιµής) αντιστοιχεί στην εξής εικόνα της µνήµης: είκτης p 5 Ο τρόπος χρήσης είναι ελαφρά ανισόρροπος. Η χρήση της δυναµικής δέσµευσης µνήµης γίνεται συνήθως για τους πίνακες και όχι για µεταβλητές.

11 4. έσµευση Μονοδιάστατου Πίνακα Η πραγµατική χρησιµότητα της δυναµικής δέσµευσης µνήµης είναι η δυναµική δέσµευση µνήµης για έναν πίνακα. Κάνουµε χρήση της mallocκαι δεσµεύουµε τόσο χώρο όσο πιάνει ο αντίστοιχος τύπος δεδοµένων (επί) το πλήθος των θέσεων του πίνακα Για να το κάνουµε αυτό χρησιµοποιούµε τον τελεστή sizeof Χρησιµοποιούµε κανονικά τον πίνακά µας όπως έχουµε µάθει. εν ξεχνάµε ποτέ να αποδεσµεύσουµε τον χώρο που δεσµεύσαµε µε την free. Βλέπουµε ένα παράδειγµα µε πίνακα ακεραίων: int *p; //Εδώ δηλώνουµε τον δείκτη σε ακέραια µεταβλητή. p=malloc(sizeof(int)*10); // εσµεύουµε δυναµικά χώρο για πίνακα 10 ακεραίων p[3]=5; //Εδώ κάνουµε χρήση του πίνακα όπως έχουµε µάθει free(p); //αποδεσµεύουµε τον χώρο µνήµης Και αντίστοιχα δουλεύουµε για οποιοδήποτε άλλο τύπο δεδοµένων

12 4. έσµευση Μονοδιάστατου Πίνακα Το ακόλουθο πρόγραµµα επιδεικνύει έναν συνήθη κώδικα για την δυναµική δέσµευση ενός µονοδιάστατου πίνακα: /*malloc_1d-array.c Deixnei pws desmeuoume xwro gia enan monodiastato pinaka */ #include <stdio.h> #include <stdlib.h> main() { int *p; //Dilwsi deikti int i,n; /* Diavasma Diastasis Pinaka */ printf("dwse ti diastasi tou pinaka: "); scanf("%d",&n); συνεχίζεται...

13 4. έσµευση Μονοδιάστατου Πίνακα /* Dynamiki Desmeysi mnimis */ p=malloc(sizeof(int)*n); if (!p) { printf("adynamia desmeusis mnimis"); exit(0); } /* Kapoios Ypologismos ston pinaka */ for (i=0; i<n; i++) { p[i]=i*i*i; printf("\np[%d]=%d",i,p[i]); } } /* Apodesmeysi Mnimis */ free(p);

14 4. έσµευση Μονοδιάστατου Πίνακα Ο τρόπος που διαχειριστήκαµε την δέσµευση του πίνακα αντιστοιχεί στην εξής εικόνα της µνήµης (π.χ. αν ο χρήστης εισήγαγε το Ν=4 και τις τιµές 5,2,3,3) φαίνεται στο σχήµα: Ν είκτης p 4 5 2 3 3 Και αντιστοιχεί στην κωδικοποίηση του πίνακα 5 2 3 3 Ο τρόπος χρήσης είναι ελαφρά ανισόρροπος. Η χρήση της δυναµικής δέσµευσης µνήµης γίνεται συνήθως για τους πίνακες και όχι για µεταβλητές.

15 4. έσµευση Μονοδιάστατου Πίνακα Καταλαβαίνουµε ότι µε τον τρόπο αυτό µπορούµε να δεσµεύσουµε όσο χώρο θέλουµε κατά τον χρόνο εκτέλεσης. Π.χ. Μπορεί ο χρήστης να εισάγει ότι θέλει έναν πίνακα 10 ακεραίων, οπότε εµείς προγραµµατιστικά µπορούµε να δεσµεύσουµε ακριβώς όσα δεδοµένα χρειαζόµαστε. Αυτό ακριβώς είναι η δυναµική δέσµευση µνήµης σε αντίθεση µε την στατική δέσµευση µνήµης που καθορίζουµε κατά το χρόνο µεταγλώττισης ποιο θα είναι το µέγεθος του πίνακα. Αυτό είναι ιδιαίτερα χρήσιµο και µε τις συµβολοσειρές που το µέγεθος τους µπορεί να είναι µεταβλητό και δεν θέλουµε να κάνουµε καταχρήσεις µε την µνήµη µας.

5. έσµευση ιδιάστατου Πίνακα 16 Αντίστοιχα µπορούµε να εργαστούµε για έναν διδιάστατο πίνακα. Ένας διδιάστατοςπίνακας µπορεί να ειδωθεί ως ένας πίνακας που περιέχει µονοδιάστατους πίνακες: pin Ν=6 στήλες pin[0] pin[1] 1 5 2 4 3 2 6 4 6 9 3 4 pin[0][4] pin[2] 2 5 9 4 6 2 M=7 γραµµές pin[3] pin[4] 1 8 9 6 2 3 9 1 5 1 6 7 pin[3][3] pin[5] 9 8 4 1 3 5 pin[6] 1 9 7 6 4 2 pin[6][0]

17 5. έσµευση ιδιάστατου Πίνακα Με άλλα λόγια θέλουµε έναν πίνακα (pin) του οποίου κάθε στοιχείο θα είναι δείκτης! Έτσι αντίστοιχα µε το γεγονός ότι για να δεσµεύσουµε δυναµικά έναν πίνακα ακεραίων, δηλώνουµε έναν δείκτη σε ακέραιο και κάνουµε δέσµευση Ν ακεραίων. Έτσι για να δεσµεύσουµε δυναµικά έναν πίνακα δεικτών ακεραίων, θα δηλώσουµε έναν δείκτη σε δείκτη ακεραίων και κάνουµε δέσµευση Μ δεικτών ακεραίων! Ο δείκτης σε δείκτη ακεραίου θα αναφέρεται ως διπλός δείκτης και θα δηλώνεται µε την εντολή: int **p; Η δέσµευση θα γίνεται µε τις ακόλουθες εντολές: p=malloc(sizeof(int*)*m); for (i=0; i<m; i++) p[i]=malloc(sizeof(int)*n); Και η αποδέσµευση θα γίνει µε τις εντολές: for (i=0; i<m; i++) free (p[i]); free(p);

18 5. έσµευση ιδιάστατου Πίνακα Το ακόλουθο πρόγραµµα επιδεικνύει έναν συνήθη κώδικα για την δυναµική δέσµευση ενός διδιάστατου πίνακα: *malloc_2d-array.c Deixnei pws desmeuoume xwro gia enan didiastato pinaka */ #include <stdio.h> #include <stdlib.h> main() { int **p; //Dilwsi diplou deikti-pinaka int i,j,m,n; /* Diavasma Diastasewn Pinaka */ printf("dwse to plithos twn grammwn tou pinaka: "); scanf("%d",&m); printf("dwse to plithos twn stilwn tou pinaka: "); scanf("%d",&n); συνεχίζεται...

19 5. έσµευση ιδιάστατου Πίνακα /* Dynamiki Desmeysi mnimis */ p=malloc(sizeof(int*)*m); if (!p) { printf("adynamia desmeusis mnimis"); exit(0); } for (i=0; i<m; i++) { p[i]=malloc(sizeof(int)*n); if (!p[i]) { printf("adynamia desmeusis mnimis"); exit(0); } } συνεχίζεται...

20 5. έσµευση ιδιάστατου Πίνακα /* Kapoios Ypologismos ston pinaka */ for (i=0; i<m; i++) { for (j=0; j<n; j++) { p[i][j]=1+(i+j)%5; printf("%2d ",p[i][j]); } printf("\n"); } } /* Apodesmeysi Mnimis */ for (i=0; i<m; i++) free (p[i]); free(p);

21 Γ. Ασκήσεις 1. Χώρος Αποθήκευσης ιδιάστατου Πίνακα Κατασκευάστε ένα πρόγραµµα C το οποίο να κάνει µια µελέτη του χώρου αποθήκευσης ενός διδιάστατου πίνακα: Να ζητάει από τον χρήστη να εισάγει το πλήθος των γραµµών (Μ) και το πλήθος των στηλών (Ν). Να δεσµεύει δυναµικά τον χώρο αποθήκευσης για έναν πίνακα double ΜxN Να υπολογίζει το µέγεθος σε bytes που απαιτήθηκαν για την αποθήκευση του πίνακα και να τυπώνει το αποτέλεσµα Να αποδεσµεύει τον χώρο µνήµης που δεσµεύθηκε δυναµικά.

22 Γ. Ασκήσεις 2. Κάτω Τριγωνικός Πίνακας Στα µαθηµατικά, ένας κάτω τριγωνικός πίνακας, είναι ένας πίνακας διάστασης NxNπου τα στοιχεία κάτω από την κύρια διαγώνιο είναι ίσα µε το 0. Για παράδειγµα ο ακόλουθος πίνακας είναι ένας 4x4 κάτω τριγωνικός πίνακας: Α 1 0 0 0 2 2 0 0 4 5 4 0 3 1 3 2 Να κατασκευαστεί ένα πρόγραµµα το οποίο να διαχειρίζεται κάτω τριγωνικούς πίνακες: Να δεσµεύει στατικά και να δηλώνει έναν κάτω τριγωνικό πίνακα Α διάστασης ΝxN (το Ν να εισάγεται από το χρήστη µε τιµή 5..20). Να αρχικοποιεί τα στοιχεία του πίνακα µε τυχαίους αριθµούς στο εύρος [1..9] Να δεσµεύει δυναµικά έναν κάτω τριγωνικό πίνακα Β διάστασης ΝxN. Προσοχή! Να δεσµευτεί χώρος µόνο για τα στοιχεία του πίνακα και όχι για τα στοιχεία που γνωρίζουµε ότι δεν είναι πάντα µηδενικά!

23 Γ. Ασκήσεις 3. Κάτω Τριγωνικός Πίνακας (συνέχεια) Να επεκταθεί το πρόγραµµα της προηγούµενης εφαρµογής έτσι ώστε: 1. Να αντιγράφονται τα στοιχεία του πίνακα Α στον πίνακα Β. 2. Να γίνεται εκτύπωση των στοιχείων των δύο πινάκων.

24 Γ. Ασκήσεις 4. Ένας Πίνακας από Λέξεις Να γραφεί πρόγραµµα το οποίο θα διαβάζει ακριβώς 10 λέξεις και θα τις αποθηκεύει σε µία δυναµική δοµή δεδοµένων: 1. Να δηλώνει έναν πίνακα Ν=10 συµβολοσειρών (χωρίς να δεσµεύεται χώρος για κάθε συµβολοσειρά) 2. Να διαβάζονται οι διαδοχικά οι λέξεις µε τον εξής τρόπο: 1. Να αποθηκεύεται σε έναν προσωρινό χώρο µνήµης 2. Να ελέγχεται ότι ο χρήστης έχει εισάγει λέξη. Στην εφαρµογή αυτή ως λέξη εννοούµε µία συµβολοσειρά που αποτελείται από µόνο µικρούς λατινικούς χαρακτήρες (χρησιµοποιείστε την συνάρτηση που κατασκευάσαµε στο «Μάθηµα 10: Χαρακτήρες και Συµβολοσειρές Εφαρµογή 5» ). Σε αντίθετη περίπτωση να τερµατίζει το πρόγραµµα. 3. Να δεσµεύεται χώρος στον πίνακα σύµφωνος µε το µήκος της λέξης (χρησιµοποιείστε τη συνάρτηση που κατασκευάσαµε στο «Μάθηµα 10: Χαρακτήρες και Συµβολοσειρές Εφαρµογή 1»). 4. Να αντιγράφεται η συµβολοσειρά στην αντίστοιχη θέση του πίνακα (χρησιµοποιείστε τη συνάρτηση που κατασκευάσαµε στο «Μάθηµα 10: Χαρακτήρες και Συµβολοσειρές Εφαρµογή 2»). 3. Να γίνεται εκτύπωση των 10 λέξεων που διαβάστηκαν 4. Να αποδεσµεύεται ο χώρος στη µνήµη.