οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

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

Περιεχόμενα. Πρόλογος...7. Πρόλογος της πρώτης έκδοσης Εισαγωγή...13

Εργαστήριο 2: Πίνακες

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

οµές (structures) και Eνώσεις (unions)

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

Εργαστήριο 6: Αναζήτηση, Ανάλυση Πολυπλοκότητας

Προγραμματισμό για ΗΜΥ

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

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

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

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 3-2

είκτες και Πίνακες (2)

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

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

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

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

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

Αντικειµενοστρεφής Προγραµµατισµός

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

Προγραμματισμό για ΗΜΥ

Χpήσιµες Βιβλιοθήκες της γλώσσας C

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

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

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

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

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

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

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

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

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

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

Προγραμματισμός Υπολογιστών με C++

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

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

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

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

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

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

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

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

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

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

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

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

Εργαστήριο 9: Αρχεία

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

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

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

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

ΕΠΛ 032.3: Προγραµµατισµός ΜεθόδωνΕπίλυσηςΠροβληµάτων

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

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

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

Η Γλώσσα C Μία Σφαιρική Ανασκόπηση

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

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

Προγραμματισμός Υπολογιστών με C++

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

C: Από τη Θεωρία στην Εφαρμογή

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

Ερώτημα Α 1. Να γράψετε τις εντολές που πραγματοποιούν τα ακόλουθα:

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

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

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

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

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

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

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

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

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

Οντοκεντρικός Προγραμματισμός

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

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

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

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

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

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

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

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

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

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

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

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Κεφάλαιο : Εισαγωγή στην C. ( ιαλέξεις 3-4) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Ενδεικτικές λύσεις και στατιστικά

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

Κεφάλαιο : Εισαγωγή στην C: (Διαλέξεις 3-4)

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

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

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Αλγόριθμοι Ταξινόμησης Μέρος 1

Transcript:

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1

Παράδειγµα Πρόβληµα: Να γράψετε πρόγραµµα το οποίο παίρνει ως όρισµα ένα αρχείο και µετρά τις εµφανίσεις όλων των δεσµευµένων λέξεων της γλώσσας C που περιέχονται στο αρχείο. Το πρόγραµµα θα πρέπει να γνωρίζει τις λέξεις που µας ενδιαφέρει να µετρήσουµε και να διατηρεί για κάθε µια από αυτές ένα µετρητή (µια µεταβλητή τύπου int) όπου να φυλάγεται ο αριθµός των εµφανίσεων της λέξης που έχει παρατηρηθεί άνα πάσα στιγµή κατά τη διάρκεια της εκτέλεσης. Αυτή η συσχέτιση µεταξύ λέξεων - αριθµού εµφανίσεων µπορεί να επιτευχθεί µέσω παράλληλων πινάκων, ή, για καλύτερη οργάνωση, οµαδοποιώντας τα ζεύγη που µας ενδιαφέρουν µέσω µιας δοµής: struct key{ char *word; int count; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2

Παράδειγµα (συν.) Εποµένως οι τιµές τύπου struct key που µας ενδιαφέρουν θα διατηρούνται σε ένα πίνακα τύπου struct key, ο οποίος µπορεί να δηλωθεί ως εξωτερική µεταβλητή και να αρχικοποιηθεί ως εξής: struct key keytab[] = { ; auto, 0, break, 0, case, 0, char, 0, const, 0,... unsigned, 0, void, 0, volatile, 0, while, 0 ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 3

οµή πιθανής λύσης: Παράδειγµα (συν.) άνοιξε το αρχείο; while (δεν έχεις φτάσει στο τέλος του αρχείου) if (η επόµενη λέξη είναι µια από τις δεσµευµένες λέξεις της C) αύξησε την τιµή του µετρητή που αντιστοιχεί στη λέξη κατά ένα κλείσε το αρχείο; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 4

Παράδειγµα (συν.) Θα χρειαστούµε δύο συναρτήσεις: συνάρτηση η οποία θα πρέπει να βρίσκει και να επιστρέφει την επόµενη λέξη του αρχείου που επεξεργαζόµαστε, και µια διαδικασία που θα ψάχνει να βρεί κάθε λέξη του αρχείου στον πίνακα keytab. Υποθέτοντας ότι ο πίνακας είναι ταξινοµηµένος σε αλφαβητική σειρά, µπορούµε να υλοποιήσουµε αυτή τη διαδικασία χρησιµοποιώντας δυαδική αναζήτηση. Έτσι θα ορίσουµε τις συναρτήσεις int getword(char *word, FILE *inp, int lim) η οποία παίρνει σαν παράµετρους (1) ένα πίνακα χαρακτήρων, (2) ένα δείκτη σε αρχείο και (3) ένα ακέραιο, και θα φυλάει την επόµενη λέξη του αρχείου που δείχνεται από το δείκτη inp, (µέχρι lim χαρακτήρες) στον πίνακα word. int binsearch(char *word, struct key tab[], int n) η οποία συκρίνει τη συµβολοσειρά word µε τα πεδία word των πρώτων n στοιχείων του πίνακα tab, και αν η word συµπίπτει µε κάποιο από αυτά τα πεδία µας επιστρέφει τη θέση του στον πίνακα. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 5

Παράδειγµα (συν.) Συνάρτηση main: int main(int argc, char *argv[]) { int n; char word[20]; FILE *inp; if (argc!= 2) { printf("error in the use of the program\n"); exit(1); inp = fopen(argv[argc-1], "r"); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 6

Παράδειγµα (συν.) while (getword(word, inp, 20)!= EOF) if (isalpha(word[0])) if ((n = binsearch(word, keytab, NKEYS)) >= 0) keytab[n].count++; for (n = 0; n < NKEYS; n++) if (keytab[n].count > 0) printf("%4d %s\n", keytab[n].count, keytab[n].word); fclose(inp); return(0); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 7

Παράδειγµα (συν.) Η ποσότητα NKEYS είναι ο αριθµός των δεσµευµένων λέξεων στο keytab. Θα µπορούσαµε να υπολογίσουµε την τιµή της απλά µετρώντας τις λέξεις του πίνακα, και να τη δηλώσουµε ως εξωτερική µεταβλητή int ΝΚΕΥS = 10; ιαφορετικά, µπορούµε να χρησιµοποιήσουµε τον τελεστή της C sizeof ο οποίος µας επιστρέφει το µέγεθος οποιουδήποτε αντικειµένου (δηλ. µεταβλητής, πίνακα, δοµής) ή τύπου. Έτσι, για παράδειγµα sizeof(stuct key) sizeof keytab µας επιστρέφουν έναν ακέραιο ίσο µε τα byte που καθορίζουν το µέγεθος της δοµής struct key και του πίνακα keytab, αντίστοιχα. Eποµένως: #define ΝΚΕΥS (sizeof keytab /sizeof(struct key)) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 8

Παράδειγµα (συν.) int getword(char *word, FILE *inp, int lim){ int c; char *w = word; while (isspace(c = getc(inp))) ; if (c!= EOF) *w++ = c; if (!isalpha(c)){ *w = '\0'; return c; while (--lim > 0){ if (!isalnum(*w = getc(inp))) w++; *w = '\0'; return word[0]; break; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 9

Παράδειγµα (συν.) Συνάρτηση δυαδικής διερεύνησης: αναζήτηση της λέξης word στον πίνακα τύπου struct key, tab[]. int binsearch(char *word, struct key tab[], int n){ int cond; int low, mid, high; low = 0; high = n 1; while (low <= high){ mid = (high + low) / 2; if ((cond = strcmp(word, tab[mid].word)) < 0) high = mid 1; else if (cond > 0) low = mid + 1; else return mid; return 1 ; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 10

Άσκηση Να ξαναγράψετε το πρόγραµµα µέτρησης δεσµευµένων λέξεων χρησιµοποιώντας δείκτες διευθύνσεων για αναφορά στα στοιχεία του πίνακα keytab. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 11

Aυτοαναφορικές δοµές struct Employee { char[20] name; int age; struct Employee manager; ; Ποιο είναι το πρόβληµα µε τον πιο πάνω ορισµό δοµής; Εντούτις µπορούµε να ορίσουµε δοµές που αναφέρονται στον εαυτό τους, όπως στην προκειµένη περίπτωση δοµή Employee όπου για κάθε στοιχείο της έχουµε πεδίο που αναφέρεται στον διευθυντή του εργοδοτηµένου, χρησιµοποιώντας δείκτες: struct Employee { char[20] name; int age; struct Employee *manager; ; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 12

Αυτοαναφορικές δοµές (συν.) Παρόµοια µπορούµε να ορίσουµε παραλλαγή αυτοαναφορικών δοµών όπου δύο δοµές αναφέρονται η µια στην άλλη. Αυτό αντιµετωπίζεται ως εξής: struct s1 {... struct s2 *p;... ; struct s2 {... struct s1 *q;... ; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 13

typedef H C διαθέτει την typedef για δηµιουργία νέων ονοµάτων τύπων δεδοµένων, π.χ. typedef int Length; typedef char *String; Παρόµοια µπορεί να χρησιµοποιηθεί για να δώσει oνóµατα σε δοµές: typedef struct { char firstname[15]; char lastname[15]; char gender; /* M ή F */ int age; Person;... Person p; p.age = 12;... ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 14