Προγραμματιςμόσ Μεκόδων Επίλυςθσ Προβλθμάτων 21. Δομζς Ιωάννθσ Κατάκθσ Διαφάνειεσ: Βαςικζσ Αρχζσ Προγραμματιςμοφ Α.Π.Θ. Δθμιτρθσ Βράκασ
Τφποι Δεδομζνων Οριηόμενοι από το Χριςτθ o Πζρα από τουσ απλοφσ τφπουσ δεδομζνων και τουσ πίνακεσ, θ C παρζχει πζντε τρόπουσ για τθ δθμιουργία άλλων τφπων από τον προγραμματιςτι o Οι τφποι αυτοί ανικουν ςτισ ακόλουκεσ κατθγορίεσ: Δομζσ (structures) Πεδία bit (bit fields) Ενώςεισ (unions) Απαρικμιςεισ (Enumerations) Μετονομαςία με τθν typedef
Δομζσ o Μία δομή είναι μια ςυλλογι από μεταβλθτζσ διάφορων τφπων δεδομζνων οι οποίεσ καλοφνται πεδία (fields) o Ζςτω για παράδειγμα ζνα πρόγραμμα το οποίο κα διαχειρίηεται τα ςτοιχεία ενόσ τθλεφωνικοφ καταλόγου Για κάκε καταχώρθςθ πρζπει να κρατάμε διάφορα ςτοιχεία (όνομα, τθλζφωνο, φφλλο) τα οποία ςχετίηονται μεταξφ τουσ Οι δομζσ μασ επιτρζπουν να ομαδοποιιςουμε όλα αυτά τα ςτοιχεία ςε μία μεταβλθτι ώςτε να γίνεται ευκολότερθ θ διαχείριςθ τουσ
Οριςμόσ Δομισ o Για να ορίςουμε μια δομι χρθςιμοποιοφμε τθν πρόταςθ struct o Η γενικι μορφι διλωςθσ μιασ δομισ είναι θ ακόλουκθ: struct όλοκα ηύπος πεδίο1; ηύπος πεδίο2;... ηύπος πεδίον; [κεηαβιεηή1, κεηαβιεηή2,..,κεηαβιεηήν];
Παραδείγματα Δομών o Ζςτω ότι κζλουμε ζνα πρόγραμμα διαχείριςθσ τθλεφωνικοφ καταλόγου, όπου για κάκε καταχώρθςθ χρειαηόμαςτε τα ακόλουκα: Ονοματεπώνυμο Διεφκυνςθ Τθλζφωνο Ηλικία o Μία δομι που περιζχει τα παραπάνω πεδία: struct person char name[30]; char addr[20]; char phone[15]; int age; ; Με τθν παραπάνω διλωςθ δθλώνεται ζνασ νζοσ τφποσ δεδομζνων (όπωσ για παράδειγμα το double ι το char) Το person δεν είναι μεταβλθτι αλλά τφποσ δεδομζνων και τα name,addr κ.τ.λ. είναι πεδία του τφπου person
Οριςμόσ μεταβλθτών από τφπο struct #include<stdio.h> struct person ; main() char name[30]; char addr[20]; char phone[15]; int age; int k, m; // Ορίδοληαη οη κεηαβιεηές k,m ηοσ ηύποσ int struct person principle, student1, student2; //Ορίδοληαη οη κεηαβιεηές principle, student1,student2 //ηοσ ηύποσ person
Οριςμόσ μεταβλθτών μαηί με τον τφπο struct #include<stdio.h> struct person char name[30]; char addr[20]; char phone[12]; int age; principle; main() struct person student1, student2; o Οι principle, student1 και student2 είναι όλεσ μεταβλθτζσ του τφπου struct person Στθν παραπάνω περίπτωςθ βζβαια θ principle είναι κακολικι μεταβλθτι κακώσ δθλώνεται ζξω από τθ main o sizeof(person) 66 (30+20+12+4)
Διλωςθ Κακολικοφ τφπου struct #include<stdio.h> struct person //Ο person είλαη θαζοιηθός ηύπος δεδοκέλωλ ; char name[30]; char addr[20]; char phone[12]; int age; void print_data() struct person p; main() struct person myperson;
Διλωςθ Τοπικοφ τφπου struct #include<stdio.h> void print_data() struct person //Ο person είλαη ηοπηθός ηύπος δεδοκέλωλ //ηες print_data char name[30]; char addr[20]; char phone[12]; int age; ; struct person p;... main()... // Η main δελ κπορεί λα δειώζεη κεηαβιεηές struct //person
Αναφορά ςτα πεδία μιασ δομισ Η αναφορά ςε ζνα πεδίο μιασ μεταβλθτισ τφπου δομισ γίνεται γράφοντασ το όνομα τθσ μεταβλθτισ, τον τελεςτι τελεία. και το όνομα του πεδίου #include<stdio.h> #include<string.h> struct person ; main() char name[30]; char addr[20]; char phone[12]; int age; struct person myperson; myperson.age=30; strcpy(myperson.name, Dimitris ); printf( %d\n, myperson.age);
Τελεςτζσ ανάκεςθσ & ςφγκριςθσ struct point int x; int y; char name[10]; ; int main() struct point a,b; strcpy(a.name,"pointa"); a.x=5; a.y=3; 5, 3, PointA Same point Press any key to continue... b=a; // Οη ηηκές ηωλ κειώλ ηοσ a αληηγράθοληαη ζηα κέιε ηοσ b printf("%d, %d, %s\n",b.x,b.y,b.name); if (a.x==b.x && a.y==b.y && strcmp(a.name,b.name)==0)// Ότη a==b printf("same point\n"); system("pause"); return 0;
Πίνακεσ δομών o Με τον ίδιο τρόπο που δθλώνεται ζνασ πίνακασ οποιουδιποτε απλοφ τφπου δεδομζνων, μπορεί να δθλωκεί και ζνασ πίνακασ από δομζσ o struct όνομα_δομισ μεταβλθτι*ν]; o Π.χ. struct point int x; int y; char name[10]; ; main() struct point a[100]; // πίλαθας 100 ζέζεωλ από struct point a[73].x=10; strcpy(a[5].name, Z );
Χειριςμόσ πινάκων δομών struct person char name[20]; int age; ; int main() int i; struct person friends[10]; for (i=0;i<3;i++) printf("give name: "); gets(friends[i].name); printf("give age: "); scanf("%d",&friends[i].age); fflush(stdin);//αθαίρεζε ηοσ //ταραθηήρα \n από ηο Give name: Kostas Give age: 27 Give name: Mary Give age: 24 Give name: Dimitris Give age: 30 Kostas -> 27 Mary -> 24 Dimitris -> 30 Press any key to continue... printf("\n"); //input stream for (i=0;i<3;i++) printf("%s -> %d\n",friends[i].name,friends[i].age); system("pause"); return 0;
Μεταβίβαςθ πεδίων δομών ςε ςυναρτιςεισ struct vector double x; double y; double length; ; double find_length(double a, double b) return sqrt(pow(a,2) + pow(b,2)); int main() int i; struct vector vec[10]; for (i=0;i<10;i++) printf("give coordinates of vector: "); scanf("%lf %lf",&vec[i].x, &vec[i].y); vec[i].length = find_length(vec[i].x, vec[i].y); system("pause"); return 0;
Μεταβίβαςθ δομών ςε ςυναρτιςεισ struct vector double x; double y; double length; ; double find_length(struct vector k) return sqrt(pow(k.x,2) + pow(k.y,2)); Η μεηαβίβαζη δομών ζε ζςναπηήζειρ γίνεηαι με ηιμή (by value) οπόηε η ζςνάπηηζη δεν μποπεί να αλλάξει ηα πεπιεσόμενα ηηρ δομήρ int main() int i; struct vector vec[10]; for (i=0;i<10;i++) printf("give coordinates of vector: "); scanf("%lf %lf",&vec[i].x, &vec[i].y); vec[i].length = find_length(vec[i]); system("pause"); return 0;
Συναρτιςεισ που επιςτρζφουν δομι struct vector double x; double y; double length; ; struct vector find_length(struct vector k) k.length = sqrt(pow(k.x,2) + pow(k.y,2)); return k; int main() int i; struct vector vec[10]; for (i=0;i<2;i++) printf("give coordinates of vector: "); scanf("%lf %lf",&vec[i].x, &vec[i].y); vec[i]= find_length(vec[i]); system("pause"); return 0;
Δομζσ μζςα ςε δομζσ o Ζνα πεδίο μιασ δομισ μπορεί να είναι οποιουδιποτε τφπου δεδομζνων: απλοφ (int, char, float) πίνακα άλλθσ δομισ κ.α. struct address char road[20]; short number; int zipcode; struct person char name[30]; struct address addr; char phone[12]; int age; me; me.age=18; me.addr.number=21;
Τζλοσ διάλεξθσ