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

Σχετικά έγγραφα
Προγραμματισμός Η/Υ (ΤΛ2007 )

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

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

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

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

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

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

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

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

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

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

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

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

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

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

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

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

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

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

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

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

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

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

scanf() scanf() stdin scanf() printf() int float double %lf float

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

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

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

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

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

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

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

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

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

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

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

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

ΣΥΝΟΠΤΙΚΟΣ ΟΔΗΓΟΣ ΓΛΩΣΣΑΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C

Εισαγωγή στις Συναρτήσεις

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

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

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

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

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ασκήσεις Επανάληψης

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ενδεικτική περιγραφή μαθήματος

5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while)

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

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

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

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

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 2 Ο. Εισαγωγή στην C Εντολές εξόδου Εντολές εισόδου Μορφοποιητές ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΕΞΕΤΑΣΗ IOYNIOY 2018 ΘΕΜΑΤΑ Α ΟΝΟΜΑΤΕΠΩΝΥΜΟ:... ΑΕΜ: ΕΞΑΜΗΝΟ:

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

ΠΡΟΓΡΜΜΑΤΑ ΣΕ C. Γράψτε σε γλώσσα προγραμματισμού C τη συνάρτηση:

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

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

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

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

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

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

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

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

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

Transcript:

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εργαστήριο 4η σειρά ασκήσεων. Κοζάνη, 1 Νοεμβρίου 2007. Πρόγραμμα p4-1 (μεταγλώττιση και εκτέλεση) Πολύ απλό το πρώτο, για προθέρμανση! Πριν πατήσετε enter σκεφτείτε τι τιμή θα έχουν οι μεταβλητές που πρόκειται να τυπωθούν. int target; int *i, *j, *k; target = 1; i = ⌖ getchar(); printf( target = %d and *i = %d \n, target, *i); k = j = i; getchar(); printf( *j = %d and *k = %d \n, *j, *k); while (target!= 0) printf( Now, give me an integer (zero to quit): ); scanf( %d, &target); printf( Now *i = %d, *j = %d and *k = %d \n, *i, *j, *k); Πρόγραμμα p4-2 (μεταγλώττιση και εκτέλεση) Ένα πρόγραμμα που έχουμε ξαναδεί, αλλά αυτή τη φορά με χρήση πίνακα: εύρεση μέγιστου και ελάχιστου από 10 αριθμούς που εισάγουμε από το πληκτρολόγιο. Εισάγουμε και ένα νέο στοιχείο: υπολογισμό τυπικής απόκλισης σύμφωνα με τη σχέση N DAT xi x 2 i=0 s= όπου x είναι η N DAT μέση τιμή. Δείτε με προσοχή που έχει άγκιστρα και, που έχει αγκύλες [ και ], όπως και που έχει παρενθέσεις 3 1 / 5

( και ), για να μην τα μπερδεύετε! #include <math.h> #define NDAT 10 int i, numbers[ndat] = 0, min, max, x; float ave = 0.0, stdev = 0.0; printf("δώσε μου τον αριθμό %d \n", i+1); scanf("%d", &numbers[i]); min = max = numbers[0]; x = numbers[i]; if(min > x) min = x; if(max < x) max = x; ave += x; printf("ελάχιστο = %d και μέγιστο = %d \n", min, max); ave /= NDAT; stdev += pow(numbers[i] - ave,2); stdev = sqrt(stdev/ndat); printf("μέση τιμή +- τυπική απόκλιση: %f +- %f \n", ave, stdev); Πρόγραμμα p4-3 (τροποποίηση προγράμματος) Να ξαναγράψετε το προηγούμενο πρόγραμμα αλλά αντί για συμβολισμό πινάκων χρησιμοποήστε συμβολισμό δεικτών (pointers), παντού εκτός από εκεί όπου δηλώνεται ο πίνακας numbers. Υπενθυμίζεται ότι το όνομα ενός πίνακα, π.χ. a[ndat], είναι συγχρόνως και δείκτης στο πρώτο στοιχείο του, a[0]. Επίσης, η παράσταση a+i είναι δείκτης που δείχνει προς το στοιχείο a[i] και τέλος, για να πάρουμε την τιμή της μεταβλητής προς την οποία δείχνει ένας δείκτης προτάσσουμε 3 2 / 5

τον τελεστή * (βλ. και πρόγραμμα p4-1, πιο πάνω). Πρόγραμμα p4-4 (μεταγλώττιση και εκτέλεση) Πρόκειται για πρόγραμμα σχεδόν ίδιο με τα προηγούμενα δύο. Μόνο που δε χρειάζεται πια να περιοριστούμε σε ένα συγκεκριμένο μέγεθος πίνακα. Το ίδιο πρόγραμμα μπορεί να χρησιμοποιηθεί για διαφορετικό αριθμό δεδομένων κάθε φορά. Αυτό επιτυγχάνεται με τη λεγόμενη δυναμική κατανομή μνήμης (dynamic memory allocation). Η δυναμική κατανομή μνήμης είναι μία τεχνική δέσμευσης ακριβώς όσης μνήμης χρειαζόμαστε κάθε φορά κατά τη διάρκεια της εκτέλεσης του προγράμματος και αποδέσμευσης αυτής της μνήμης όταν δε χρειάζεται άλλο πια. Για να επιτύχουμε αυτού του είδους τη διαχείριση μνήμης χρησιμοποιούμε τις παρακάτω συναρτήσεις που δηλώνονται στο αρχείο stdlib.h (το οποίο επομένως πρέπει να κάνουμ ε include): malloc δεσμεύει τόσες λέξεις μνήμης όσο το όρισμα που θα της δώσουμε και επιστρέφει ένα δείκτη στην αρχή της δεσμευμένης περιοχής. Αρχικό περιεχόμενο μνήμης: απροσδιόριστο. calloc παίρνει σαν πρώτο όρισμα αριθμό στοιχείων με τόσο μέγεθος σε λέξεις μνήμης όσο το δεύτερο όρισμα και επιστρέφει ένα δείκτη στην αρχή της δεσμευμένης περιοχής. Αρχικό περιεχόμενο αυτών, η τιμή 0. realloc παίρνει σαν όρισμα ένα δείκτη που δείχνει σε περιοχή μνήμης δεσμευμένη από εντολή malloc ή calloc και την αλλάζει κατά τόσο όσο ορίζει το δεύτερο όρισμά της, χωρίς να καταστρέψει τα περιεχόμενα στο ήδη δεσμευμένο τμήμα της μνήμης. free παίρνει σαν όρισμα το δείκτη μιας δεσμευμένης περιοχής της μνήμης και την αποδεσμεύει. Το παρακάτω πρόγραμμα διαφέρει από το p4-2 στα εξής σημεία: νέα εντολή συμπερίληψης αρχείου stdlib.h #include <stdlib.h> Δεν υπάρχει η συμβολική σταθερά NDAT. Τώρα δηλώνεται μία ακέραια μεταβλητή n για τον αριθμό μεταβλητών που θέλουμε να αποθηκεύσουμε. Με το όνομα numbers δηλώνεται ένας δείκτης σε ακέραιο. Ζητείται και διαβάζεται ο αριθμός n των αριθμών που θα δοθούν και δεσμεύεται μνήμη που αντιστοιχεί σε n ακέραιους. Χρησιμοποιείται η συνάρτηση calloc, ενώ για το μέγεθος της μνήμης που αντιστοιχεί σε μία ακέραιη μεταβλητή χρησιμοποιείται η συνάρτηση sizeof. Αυτή σαν όρισμα μπορεί να πάρει όχι μόνο μια μεταβλητή αλλά και έναν τύπο π.χ. int, float, char και επιστρέφει πόση μνήμη χρειάζεται για την αποθήκευση αυτού. Στο τέλος αποδεσμεύεται η μνήμη με τη βοήθεια της συνάρτησης free, αν και στο συγκεκριμένο πρόγραμμα δεν είναι απαραίτητο. Σημείωση: Στο παρακάτω πρόγραμμα χρησιμοποιείται συμβολισμός πινάκων αλλά μπορεί να χρησιμοποιηθεί εξίσου και ο ισοδύναμος συμβολισμός δεικτών όπως στο πρόγραμμα p4-3. #include <math.h> #include <stdlib.h> int i, *numbers, n = 0, min, max, x; float ave = 0.0, stdev = 0.0; printf("πόσους αριθμούς θα βάλεις;\n"); scanf("%d", &n); 3 3 / 5

numbers = (int *) calloc(n, sizeof(int)); printf("δώσε μου τον αριθμό %d \n", i+1); scanf("%d", &numbers[i]); min = max = numbers[0]; x = numbers[i]; if(min > x) min = x; if(max < x) max = x; ave += x; ave /= n; printf("ελάχιστο = %d και μέγιστο = %d \n", min, max); stdev += pow(numbers[i] - ave,2); stdev = sqrt(stdev/n); printf("μέση τιμή +- τυπική απόκλιση: %f +- %f \n", ave, stdev); free(numbers); Πρόγραμμα p4-5 (μεταγλώττιση και εκτέλεση) Αυτό το μικρό πρόγραμμα δείχνει το συμβολισμό δεικτών όπως εφαρμόζεται σε πίνακες δύο διαστάσεων. Αν φανταστούμε έναν πίνακα a[m][n] σαν έναν πίνακα m γραμμών και κάθε γραμμή σαν έναν πίνακα n στοιχείων, τότε είναι σα να έχουμε αντί για κάθε γραμμή ένα δείκτη σε αυτή. Έτσι, χρειαζόμαστε δύο φορές τον τελεστή περιεχομένου * για να αποκτήσουμε πρόσβαση στις τιμές των στοιχείων του πίνακα: μία φορά για να εντοπίσουμε την αρχική γραμμή του πίνακα a και μια φορά για να βρούμε το αρχικό στοιχείο αυτής της γραμμής. int i, j, k, a[2][2] = 1, 2, 3, 4; k = 0; 3 4 / 5

for (i = 0; i < 2; i++) for (j = 0; j < 2; j++, k++) printf("γραμμή %d στήλη %d: στοιχείο %d με τιμή %d και ξανά: %d \n", i, j, k, a[i][j], **a+k); Δοκιμάστε να το τροποποιήσετε για να δουλεύει με πίνακα τριών διαστάσεων (για μέγεθος 2 σε κάθε διάσταση θα έχει συνολικά 8 στοιχεία). 3 5 / 5