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

Σχετικά έγγραφα
Δομημένος Προγραμματισμός (ΤΛ1006)

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

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

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

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός ΙI (Θ)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός ΙI (Θ)

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 19η: Δομές δεδομένων

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

Τύποι Δεδομένων Είσοδος/Έξοδος

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

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

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

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

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

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

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

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

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

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

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

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

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

Αναφορές, είκτες και Αλφαριθμητικά

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

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

Transcript:

Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής Εφαρμογών (npet@chania.teicrete.gr) Δέκατη (10 η ) τρίωρη διάλεξη. Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/courses/el106 Εξάμηνο: Χειμερινό 2018-19

Κι άλλα παραδείγματα Συνάρτηση που να επιστρέφει τον ν-οστό όρο της ακολουθίας Fibonacci, όταν γνωρίζουμε ότι ο κάθε όρος προκύπτει από το άθροισμα των δύο προηγούμενων όρων και ότι ο πρώτος όρος ισούται με μηδέν (0), ενώ ο δεύτερος με ένα (1). Υλοποίηση ενός στοιχειώδους κατανεμητή μνήμης με συναρτήσεις για δέσμευση, alloc(n), και αποδέσμευση, afree(p), μνήμης. Οι λύσεις, που δόθηκαν στον πίνακα, υπάρχουν στις σημειώσεις της θεωρίας. 2

Συμβολοσειρές χωρίς πίνακες Ξέρουμε ότι μία συμβολοσειρά δηλώνεται από διάταξη (πίνακα) χαρακτήρων και ένα μηδενικό χαρακτήρα στο τέλος. Τι θα γινόταν αν μπορούσατε να βρείτε κάποιο χώρο στη μνήμη χωρίς να έχει κατανεμηθεί μία διάταξη; Θα μπορούσαμε να αποθηκεύσουμε μία συμβολοσειρά εκεί. Ένας δείκτης στον πρώτο χαρακτήρα θα μπορούσε να καθορίζει την αρχή μίας συμβολοσειράς ακριβώς όπως αν η συμβολοσειρά είχε εκχωρηθεί σε διάταξη. Η συνάρτηση malloc() κατανέμει χώρο ενώ εκτελείται το πρόγραμμα, δυναμική κατανομή. 3

Κατανομή χώρου συμβολοσειράς στη μεταγλώττιση char *message; // δείκτης σε τύπο char char *message = "hello world"; Η συμβολοσειρά hello world με '\0' αποθηκεύεται κάπου στη μνήμη, και ο δείκτης message λαμβάνει τη διεύθυνση του πρώτου χαρακτήρα της συμβολοσειράς. Οι *message και message[] είναι ισοδύναμες εκφράσεις Ο προηγούμενος τρόπος καταχώρισης συμβολοσειράς είναι πολύ καλός αλλά κάποιες φορές το πρόγραμμα έχει κυμαινόμενες ανάγκες αποθήκευσης συμβολοσειρών, π.χ. ανάλογα με την είσοδο του χρήστη Τότε χρησιμοποιούμε τη συνάρτηση malloc() η οποία μας επιτρέπει να κατανείμουμε αποθηκευτικό χώρο στη πορεία του προγράμματος (δυναμικά). 4

Συνάρτηση malloc() Στη malloc() διοχετεύουμε τον αριθμό των ψηφιολέξεων (bytes) μνήμης που απαιτούνται. Η συνάρτηση βρίσκει και δεσμεύει ένα μπλοκ μνήμης του επιθυμητού μεγέθους και επιστρέφει τη διεύθυνση του πρώτου byte του μπλοκ. Δηλαδή επιστρέφει ένα δείκτη τύπου void ο οποίος είναι συμβατός με όλους τους τύπους δεδομένων. Εάν δεν υπάρχει αρκετή μνήμη διαθέσιμη, η malloc() επιστρέφει 0 (NULL = μηδενικός δείκτης διεύθυνσης). Θα πρέπει να ελέγχεται ότι η απαιτούμενη μνήμη έχει κατανεμηθεί με επιτυχία, ως προς τη σταθερά NULL η οποία δηλώνεται στη <stdlib.h> 5

Χρήση της malloc() #include <stdlib.h> void *malloc(size_t size); //πρωτότυπο συνάρτησης Η malloc() κατανείμει ένα μπλοκ μνήμης που είναι ο αριθμός των bytes που δηλώθηκαν από την παράμετρο size Έτσι χρησιμοποιούμε πιο αποδοτικά τη μνήμη του υπολογιστή. /*Κατανέμει μνήμη για μία διάταξη 50 ακέραιων*/ int *numbers; numbers = (int *) malloc(50 * sizeof(int)); /*Κατανέμει μνήμη για μία διάταξη 10 float */ float *numbers; numbers = (float *) malloc(10 * sizeof(float)); 6

Χρήση της malloc() /* malloc() για κατανομή μνήμης για αποθήκευση ενός απλού char */ char *ptr; ptr = malloc(1); /* κατανομή μνήμης ενός byte και εκχώρηση της διεύθυνσής του στη ptr */ *ptr = 'x'; char *ptr; ptr = malloc(100); /* ίδιο με char ptr[100]; */ 7

H συνάρτηση puts() H συνάρτηση puts() προβάλλει μία συμβολοσειρά στην οθόνη. Το όρισμα που δέχεται είναι ένας δείκτης στη συμβολοσειρά που πρόκειται να προβληθεί. Η puts() εισάγει αυτόματα ένα χαρακτήρα νέας γραμμής στο τέλος κάθε συμβολοσειράς που προβάλλει. 8

H συνάρτηση printf() char *str = "A message to display"; printf("%s", str); 9

H συνάρτηση gets() H συνάρτηση gets() διαβάζει όλους τους χαρακτήρες από το πληκτρολόγιο μέχρι τον πρώτο χαρακτήρα νέας γραμμής (Enter). H συνάρτηση αφαιρεί το χαρακτήρα νέας γραμμής και προσθέτει ένα μηδενικό χαρακτήρα ('\0'). Η συμβολοσειρά αποθηκεύεται στη θέση που δηλώνει ένας δείκτης τύπου char, o oποίος διοχετεύεται στη gets(). 10

Eρωτήσεις Τι θα συμβεί αν χρησιμοποιήσω τον τελεστή διεύθυνσης σε ένα δείκτη? Οι μεταβλητές πάντα αποθηκεύονται στην ίδια θέση? 11

Δομές Δεδομένων (Data Structures) Δομή δεδομένων είναι η συλλογή από δύο ή περισσότερες μεταβλητές, πιθανότατα διαφορετικού τύπου δεδομένων, που ομαδοποιούνται με ένα μόνο όνομα για ευκολία στον χειρισμό τους. Οι μεταβλητές αυτές αποτελούν τα μέλη (members) της δομής. Στη C μπορούμε να δηλώσουμε μεταβλητές τύπου δομής με τρεις τρόπους. Παράδειγμα: Έστω ότι θέλουμε μεταβλητές τύπου δομής με τρία μέλη για την ενοποίηση του ονόματος, του αρχικού πατρώνυμου και του επωνύμου. 12

Τρόποι δήλωσης μιας Δομής α) άμεση δήλωση μεταβλητών τύπου δομής struct { char first[10]; /* μικρό όνομα */ char midinit; /* αρχικό πατρώνυμο */ char last[15]; /* επώνυμο */ } aname, bname; /* μεταβλητές τύπου δομής */ β) δήλωση δομής με ετικέτα (tag) struct Namet { /* ετικέτα (tag) */ char first[10]; char midinit; char last[15]; }; struct Namet aname, bname; /* μεταβλητές τύπου δομής */ γ) ορισμός νέου τύπου δεδομένων typedef struct { char first[10]; char midinit; char last[15]; }NameType; /* νέος τύπος δεδομένων */ NameType aname, bname; /* μεταβλητές τύπου δομής */ 13

Δομές Δεδομένων (συνέχεια) Μέχρι τώρα έχουμε δει μεταβλητές που ο τύπος τους είναι ένας από τους βασικούς τύπους που υποστηρίζει η C (π.χ. int, char, float, double, unsigned short int, κλπ). Μια σχετική εξαίρεση ήταν oι διατάξεις (πίνακες) που λίγοπολύ μοιάζουν με «δεξαμενές» που μπορούμε να αποθηκεύσουμε δεδομένα (ενός μόνο συγκεκριμένου τύπου) σε μια ακολουθιακή μορφή. Η δομή δεδομένων είναι μια νέα μορφή μεταβλητής που και αυτή μοιάζει με «δεξαμενή» αλλά: 1. Επιτρέπει να αποθηκευτούν δεδομένα διαφορετικών τύπων 2. Είναι πιο δομημένη από την απλή ακολουθιακή μορφή των διανυσμάτων 14

Παράδειγμα Ετικέτα struct person { int number; int sex; char name[10]; char address[40]; int age; }; Δομή Δεδομένων Η λέξη struct προσδιορίζει την αρχή ενός ορισμού δομής και ακολουθείται από το όνομα της δομής ή την ετικέτα (tag). Εδώ ορίζεται μια δομή δεδομένων αλλά δεν δημιουργείται ένα στιγμιότυπο δομής, δε δηλώνεται ή δε δεσμεύεται χώρος μνήμης για να εισαχθούν δεδομένα. Τα μέλη της δομής 15

Παράδειγμα struct person { int number; int sex; char name[10]; char address[40]; int age; } maleperson, femaleperson; Εδώ ορίζουμε τη δομή με ετικέτα person και δηλώνουμε δύο μεταβλητές, τις maleperson, femaleperson τύπου δομής person. Μεταβλητές τύπου δομής 16

Παράδειγμα struct person { int number; Η ετικέτα δομής είναι ένα int sex; συμβολικό όνομα που ορίζει μία συγκεκριμένη δομή π.χ. char name[10]; char address[40]; int age; }; /* και όπου χρειαζόμαστε μεταβλητές */ struct person maleperson, femaleperson; Μεταβλητές τύπου δομής 17

Κι άλλα παραδείγματα struct { int number; int sex; char name[20]; char address[40]; int age; } person1, person2; struct { int number; char name[15]; int yearsofemployment; } employee1; 18

Απόδοση αρχικών τιμών σε δομές Όπως και στις διατάξεις, έτσι και μία δομή μπορεί να πάρει αρχικές τιμές κατά τη δήλωση της, π.χ. struct { int number; int sex; char name[20]; } person1 = {154, 1, "Donald Trump"}, person2 = {180, 2, "Angela Merkel"}; Δηλώνουμε και συγχρόνως δίνουμε αρχική τιμή σε μεταβλητές τύπου δομής. 154 1 Donald Trump 180 2 Angela Merkel 19

Λειτουργίες σε δομές Όπως και στα διανύσματα, έτσι και στις δομές, η πιο κοινή λειτουργία είναι να προσπελάσουμε κάποιο στοιχείο τους Τα μέλη δομών προσπελαύνονται με τη χρήση του τελεστή μέλους δομής (.) που λέγεται και τελεστής τελεία (dot operator) και τοποθετείται ανάμεσα στο όνομα της δομής και στο όνομα του μέλους. printf("the name of person %d is %s", person1.number, person1.name); Δομή (μεταβλητή) Τελεστής Πρόσβασης Μέλος της Δομής 20

Παράδειγμα scanf("%d", &person1.number); /* Διαβάζουμε το μέλος number */ person1 = person2; /* Αποθέτουμε τις τιμές όλων των μελών της person2, στα αντίστοιχα μέλη της person1 */ Όταν το πρόγραμμά σας χρησιμοποιεί πολύπλοκες δομές, με πολλά μέλη, αυτή η σημειογραφία μας δίνει μεγάλο κέρδος χρόνου. 21

Ορισμός νέου τύπου δεδομένων τύπου δομής δεδομένων Μέχρι τώρα είδαμε πως να δηλώνουμε μεταβλητές που ήταν δομές. Ας υποθέσουμε ότι σε ένα πρόγραμμα θέλουμε να δηλώσουμε πολλές μεταβλητές που έχουν την ίδια δομή (ίδια μέλη). Εάν όλες αυτές οι μεταβλητές μπορούν να δηλωθούν μαζί τότε το πρόβλημα δεν είναι μεγάλο. Εάν όμως δηλώνονται σε διάφορα σημεία του προγράμματος τότε τα πράγματα είναι πιο δύσκολα (πρέπει να επαναλαμβάνουμε τη δήλωση της δομής). Ιδανικά, θα θέλαμε να έχουμε την ευχέρεια να δηλώσουμε τον δικό μας τύπο και απλά να χρησιμοποιούμε το όνομά του όπως θα χρησιμοποιούσαμε int, float, double, κλπ. Αυτό επιτυγχάνεται με την εντολή typedef 22

Παράδειγμα typedef struct { int idnumber; char descr[100]; int avail; } SparePartType; Η κατασκευή του Τύπου Το όνομα του Τύπου SparePartType var1 = {123, "Wheel", 1}; Δήλωση και αρχικοποίηση μεταβλητής 23