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

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Από τη C στη C++ Hy240b project 2014 Phase 1.
Advertisements

Δομές στην C (επανάληψη)
Το αλφαριθμητικό (string)
Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση.
Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη Java • Ακέραιοι.
POINTERS, AGGREGATION, COMPOSITION. POINTERS TO OBJECTS.
Πίνακες-Αλφαριθμητικά
Πινακες (Arrays) Σημασια Συνταξη Αρχικοποιηση Προσβαση Παραμετροι
ΜΑΘ3122/106 Γλώσσα Προγραμματισμού
Δείκτες, Πίνακες και Δείκτες, Δείκτες σε Συναρτήσεις
Αντικειμενοστραφής Προγραμματισμός
Μάθημα : Βασικά Στοιχεία της Γλώσσας Java
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΙΑΔΙΚΑΣΤΙΚΟ ΠΡΟΓΡΑΜMΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ – ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Συναρτήσεις Κληση/Επιστροφη Παραμετροι
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φροντιστήρια Εισηγητής: Σπύρος Αργυρόπουλος Μέλος ΕΤΕΠ Εργαστήριο Προγραμματισμού & Τεχνολογίας Ευφυών Συστημάτων.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις.
ΜΕΤΑΒΛΗΤΕΣ - ΤΥΠΟΙ ΜΑΘΗΜΑ 3.
1 Ολυμπιάδα Πληροφορικής Μάθημα 7. 2 Στόχοι μαθήματος Δημιουργία συναρτήσεων από το χρήστη Δομή προγράμματος με συναρτήσεις Συναρτήσεις και παράμετροι.
ΣΥΝΑΡΤΗΣΕΙΣ.
Δείκτες (Pointers) – Δομές (Structs)
MΑΘ 106/3122Ξενοφών Ζαμπούλης ΜΑΘ 106/3122 Γλώσσα Προγραμματισμού Δείκτες (Pointers)
ΜΑΘΗΜΑ: ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Τμ.
ΗΥ150 – Προγραμματισμός Ξ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Δομές Δεδομένων.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Πολυμορφισμός.
ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Πέρασμα παραμέτρων, συναρτήσεις δόμησης και αποδόμησης.
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 Δείκτες σε συναρτήσεις Δείκτης σε συνάρτηση – Περιέχει τη διεύθυνση του κώδικα της συνάρτησης – Ό π ως ένας.
Υπερφόρτωση Τελεστών (Συνέχεια) Αντικειμενοστραφής Προγραμματισμός.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
1 Κεφάλαιο 2 Εισαγωγή στον αντικειμενοστραφή προγραμματισμό.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ -150 Προγραμματισμός Δομές Δεδομένων.
ΗΥ150 – ΠρογραμματισμόςΞ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Αρχεία.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αλφαριθμητικά (Strings)
Βασικά στοιχεία της Java
ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Δείκτες (Pointers) (1/2)
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
TEXNΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ – ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ.
ΜΑΘ106/3122 – Γλώσσα Προγραμματισμού Ξ. Ζαμπούλης ΜΑΘ106/3122 Γλώσσα Προγραμματισμού Δομές Δεδομένων.
ΔΠΘ-ΤΜΗΜΑ ΜΠΔ: ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ 1 Εισαγωγή στη γλώσσα Προγραμματισμού C ΠΙΝΑΚΕΣ (arrays)
ΜΕΤΑΒΛΗΤΕΣ-ΣΤΑΘΕΡΕΣ -ΕΚΦΡΑΣΕΙΣ
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
Βασικές Έννοιες Εισόδου-Εξόδου Πίνακες και Δείκτες
Πίνακες και αλφαριθμητικά
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Τεχνολογία και Προγραμματισμός Υπολογιστών
Δομές.
Δείκτες 1/4 Σύμβαση Τελεστής &
Κλάσεις και αντικείμενα
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ( ΓΛΩΣΣΑ C )
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Τύποι Μεταβλητών.
Τεχνολογία και Προγραμματισμός Υπολογιστών
ΣΥΝΑΡΤΗΣΕΙΣ (Functions)
Ενότητα 9: Δείκτες και Δυναμική Διαχείριση Μνήμης.
Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος
Ειδικά Θέματα στον Προγραμματισμό Υπολογιστών
Πίνακας Συμβόλων Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής.
Εισαγωγή στον Προγ/μό Υπολογιστών
Εισαγωγή στον Αντικειμενοστραφή Προγραμματισμό
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
[Μονοδιάστατοι πίνακες]
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
ΑΣΚΗΣΕΙΣ.
Μεταγράφημα παρουσίασης:

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C Δομές (structs) ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δομές - Structures Οι πίνακες διατηρούν στοιχεία του ιδίου τύπου Τι θα συμβεί αν θέλουμε να διατηρήσουμε ενιαία στοιχεία που ανήκουν σε διαφορετικούς τύπους δεδομένων; Για παράδειγμα: ο τίτλος, ο συνθέτης και η τιμή CD σε ένα κατάστημα Το είδος κινητήρα ενός οχήματος, ο κυβισμός του, η ισχύς του και η χώρα κατασκευής Το όνομα, ο αριθμός μητρώου και οι βαθμοί ενός φοιτητή ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δομές (structures) Μια δομή (struct) είναι μια μέθοδος αποθήκευσης δεδομένων που σχεδιάζεται από το χρήστη, ώστε να καλύπτει τις ανάγκες του προγράμματος. Είναι μια συλλογή μιας ή περισσοτέρων μεταβλητών (σταθερού πλήθους), ίδιου ή συνήθως διαφορετικού τύπου, που ομαδοποιούνται κάτω από ένα κοινό όνομα, ώστε να είναι εύκολη η διαχείρισή τους. Μία δομή είναι μία ΔΟΜΗ ΔΕΔΟΜΕΝΩΝ που συντίθεται από πολλαπλούς τύπους, καθένας από τους οποίους είναι γνωστός ως ΜΕΛΟΣ (member) της δομής. Κάθε μέλος έχει το δικό του μοναδικό όνομα και έναν προσδιοριζόμενο τύπο ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δομές (structures) - συνέχεια Οι μεταβλητές που απαρτίζουν μια δομή μπορούν να είναι του ίδιου ή διαφορετικού τύπου (διαφορά με τους πίνακες). Σε μια δομή μπορούν να περιλαμβάνονται όλοι οι γνωστοί τύποι δεδομένων της C, καθώς και άλλες δομές. Παραδείγματα δήλωσης δομών: struct coord { float x,y; }; struct complex { float real,imaginary; }; ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Παραδείγματα struct coord { int x; int y; } Δήλωση μεταβλητών αυτού του τύπου - struct coord first, second; Δήλωση αρχικών τιμών σε μια δομή first={12,17}; Αναφορά στα μέλη μιας δομής first.x, second.y Όνομα της δομής (tag) ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δήλωση Structures Κάθε δομή χρειάζεται ένα όνομα struct friendStr { char name[MAXNAME]; long phoneNumber; char street[MAXSTREET]; }; Τα συστατικά της δομής αναφέρονται ως μέλη (members) Η δήλωση καθορίζει τον τύπο (type of structure), αλλά ΔΕΝ δημιουργεί μεταβλητή ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δήλωση structures Για τη δημιουργία μιας δομής στη μνήμη του υπολογιστή απαιτείται η δήλωση μιας structure variable: struct friendStr f; Όνομα της μεταβλητής Όνομα του τύπου ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Προσπέλαση σε structures Για να υπάρχει πρόσβαση σε ένα μέλος μιας δομής χρησιμοποιείται ο τελεστής '.': struct friendStr f; …… f.name f.phoneNumber f.street Αποκτάται πρόσβαση στην τιμή του μέλους name ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Αρχικοποίηση δομών struct friendStr { char name[MAXNAME]; long phoneNumber; char street[MAXSTREET]; }; struct friendStr f; scanf("%s",f.name); scanf("%ld",&f.phoneNumber); scanf("%s",f.street); ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Προσπέλαση structures struct friendStr sarah; scanf("%s",f.name); scanf("%ld",&f.phoneNumber); scanf("%s",f.street); printf("Name is %s\n",f.name); printf("Phone is %d\n",f.phoneNumber); printf("Street is %s\n",f.street); ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Προσπέλαση structures Ένα μέλος μιας δομής είναι μια κανονική μεταβλητή εκτός από τον τρόπο πρόσβασης : Απαιτείται το όνομα της δομής να υπάρχει πριν από το όνομα της μεταβλητής με τελεστή διαχωρισμού την τελεία f.phoneNumber = 55559999; strcpy(f.name,"Sarah Finch"); strcpy(f.street,"Firthsmith St"); ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Απευθείας δήλωση μεταβλητών struct coord { int x; int y; } first, second; ΠΑΡΑΔΕΙΓΜΑΤΑ : struct-1.cpp, struct-2.cpp ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Παρατηρήσεις στις δομές Οι μεταβλητές τύπου struct δεν μπορούν να συγκριθούν Μπορούν να γίνουν συγκρίσεις μόνον με τα μέλη των δομών if (studA == studB) { printf(“Duplicate data.\n”); } if (strcmp(studA.lastname, studB.lastname) == 0 && (studA.mark == studB.mark) ) { printf(“Duplicate data.\n”); } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Παρατηρήσεις στις δομές Μπορούμε να δηλώσουμε μια δομή καθώς και στιγμιότυπα (instances) της δομής struct StudentRec { char lastname[MAXLEN]; float mark; }; struct StudentRec studA, studB, class[MAXN]; ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δομές που περιέχουν δομές struct rectangle { struct coord top_left; struct coord bottom_right; } mybox; …… mybox.top_left.x=10; mybox.top_left.y=25; mybox.bottom_right.x=100; mybox.bottom_right.y=180; ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δομές που περιέχουν πίνακες struct data { int x[4]; char y[8]; }; struct data record; Παράδειγμα : struct-3.cpp record.x[0] record.x record.y record.y[7] record ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Πίνακες δομών (arrays of structures) struct phone_list { char fname[10]; char lname[12]; char phone[8]; }; struct phone_list list[500]; list[0] list[1] list[2] ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Πίνακες δομών Μπορούμε να έχουμε έναν πίνακα δομών (array of structs) Κάθε στοιχείο του πίνακα είναι μια ολόκληρη δομή, με όλα τα μέλη της. Για την προσπέλαση μιας τιμής, απαιτείται να γνωρίζουμε το ακριβές στοιχείο του πίνακα καθώς και ποιο είναι το μέλος της δομής : studentList[0].name studentList[i].id ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Array of structs studentList id:123456789 name: "fred" id:123456788 1 name: "ralph" id: 123456787 name: "fong" id: 123456786 name: "rachel" 1 2 3 ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

studentList[0]gives you the whole struct Array of structs studentList[0]gives you the whole struct studentList id:123456789 name: "fred" id:123456788 name: "ralph" id: 123456787 name: "fong" id: 123456786 name: "rachel" 1 2 3 ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

studentList[3].name gives you the struct member Array of structs studentList id:123456789 name: "fred" id:123456788 name: "ralph" id: 123456787 name: "fong" id: 123456786 name: "rachel" 1 2 3 studentList[3].name gives you the struct member ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Arrays of structs struct { long int id; char name[20]; } Student; ... Student sem2Class[150]; ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Arrays of structs Student sem2Class[MAXCLASS]; int i; for (i=0;i<MAXCLASS;i++) { printf("enter name\n"); scanf("%s",sem2Class[i].name); printf("enter id\n"); scanf("%d",&(sem2Class[i].id)); } name of array ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Arrays of structs Student sem2Class[MAXCLASS]; int i; for (i=0;i<MAXCLASS;i++) { printf("enter name\n"); scanf("%s",sem2Class[i].name); printf("enter id\n"); scanf("%d",&(sem2Class[i].id)); } index into array ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

the structure at this position in the array Arrays of structs Student sem2Class[MAXCLASS]; int i; for (i=0;i<MAXCLASS;i++) { printf("enter name\n"); scanf("%s",sem2Class[i].name); printf("enter id\n"); scanf("%d",&(sem2Class[i].id)); } the structure at this position in the array ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

name of the member of the structure at that position in the array Arrays of structs Student sem2Class[MAXCLASS]; int i; for (i=0;i<MAXCLASS;i++) { printf("enter name\n"); scanf("%s",sem2Class[i].name); printf("enter id\n"); scanf("%d",&(sem2Class[i].id)); } name of the member of the structure at that position in the array ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δομές ως Παράμετροι Συναρτήσεων Μπορούμε να μεταβιβάσουμε δομές ως παραμέτρους σε συναρτήσεις. Μεταβίβαση ως παράμετρος: void foo(struct point x, struct point y) {…} Ο τύπος της παραμέτρου μπορεί να περιέχει και τη δεσμευμένη λέξη struct ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Οι συναρτήσεις μπορούν να επιστρέφουν δομές. struct point createPoint(int a, int b) { struct point temp; temp.x = a; temp.y = b; return temp; } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Παράδειγμα struct σε συνάρτηση #include <stdio.h> struct point { int x; int y; }; void getStruct(struct point); void output(struct point); void main( ) { struct point y = {0, 0}; getStruct(y); output(y); } void getStruct(struct point p) { scanf("%d", &p.x); scanf("%d", &p.y); printf("%d, %d", p.x, p.y); } void output(struct point p) { Χρησιμοποιούμε πολλαπλές εντολές scanf, μία για κάθε μέλος της δομής Ποιες θα είναι οι τιμές για τα μέλη της δομής y; ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

ΔΟΜΕΣ ΚΑΙ ΔΕΙΚΤΕΣ (POINTERS) Όπως συμβαίνει με όλους τους τύπους μεταβλητών μπορώ να ορίσω ένα δείκτη σε δομή. Μπορώ επίσης να ορίσω δείκτες ως μέλη μιας δομής! ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

ps=&s; (απόδοση αρχικής τιμής στον δείκτη, στην main() ) struct student { char name[30]; int studnum; } s; struct student { } s , *ps; ps=&s; (απόδοση αρχικής τιμής στον δείκτη, στην main() ) ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δομές και Δείκτες (structures and pointers) δείκτες ως μέλη μιας δομής struct data { int *value; int *rate; } first; … first.value=&cost; (Η ΔΙΕΥΘΥΝΣΗ ΤΗΣ ΑΡΧΗΣ ΤΗΣ cost αντιστοιχίζεται στην μεταβλητή value) first.rate=&x; (Η ΔΙΕΥΘΥΝΣΗ ΤΗΣ ΑΡΧΗΣ ΤΗΣ x αντιστοιχίζεται στην μεταβλητή rate) ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

structures and pointers struct msg { char *p1; char *p2; } myptrs; myptrs.p1=“Programming in C”; myptrs.p2=“DUTH Publications 2015”; ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δείκτες σε δομές (pointers to structures) struct part { int number; char name[10]; }; struct part *p_part; Ο τελεστής * ορίζει ότι ο p_part είναι ένας δείκτης στον τύπο part Ο δείκτης p_part μπορεί να οριστεί τώρα; ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Απάντηση Ο δείκτης δεν μπορεί να οριστεί τώρα διότι η δομή part έχει οριστεί αλλά δεν υπάρχει κάποια μεταβλητή αυτού του τύπου Ένας δείκτης χρειάζεται μια διεύθυνση μνήμης στην οποία δείχνει, έτσι πρέπει να οριστεί μια μεταβλητή του τύπου part πριν οτιδήποτε δείξει σε αυτήν π.χ. struct part id; Τώρα μπορεί να πραγματοποιηθεί η αρχικοποίηση του δείκτη (pointer initialization) : p_part=&id; ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Ο δείκτης δείχνει στο πρώτο byte της δομής ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Ο δείκτης p_part δείχνει στη δομή id και έτσι ο Ο δείκτης p_part δείχνει στη δομή id και έτσι ο *p_part αναφέρεται στο id. Πρόσβαση στα μέλη της δομής : (*p_part).number=100 Οι παρενθέσεις είναι απαραίτητες διότι ο τελεστής (.) έχει μεγαλύτερη προτεραιότητα από τον τελεστή (*) Με χρήση του indirect membership operator -> p_part -> number=100 ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

str.member (*p_str).member p_str->member ΠΑΡΑΤΗΡΗΣΕΙΣ Αν str είναι μια δομή (structure), member είναι ένα μέλος (στοιχείο) της δομής και p_str είναι ένας δείκτης (pointer) στο str , τότε οι επόμενες εκφράσεις είναι ισοδύναμες : str.member (*p_str).member p_str->member ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Χρήση πινάκων και δεικτών Some struct: s[13] An item in some struct: s[4].age A character in some name: s[7].name[3] Address of some struct: &(s[2]) An item in some struct pointed to: (*sptr).age Address of above: &((*sptr).age) This is an address within a struct ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Παράδειγμα (χωρίς χρήση pointers) #include <stdio.h> #include <math.h> /* needed to use sqrt() square root */ struct coord { float x,y; }; /* declare structure coord as having x and y members */ /* function prototypes */ float distance(struct coord a, struct coord b); coord getcoord(); ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

void main() { coord origin, cursor; float separation; printf("enter details for origin:\n"); origin=getcoord(); printf("enter details for cursor:\n"); cursor=getcoord(); separation=distance(origin,cursor); printf("the distance between origin and cursor is %f\n",separation); } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

float distance(coord a, coord b){ /* calculate distance between a and b */ float z,vert,horiz; /* z = distance, vert = y1 - y2, horiz = x1 - x2 */ horiz=a.x - b.x; /* the horizontal distance */ vert=a.y - b.y; /* the vertical distance */ /* calculate z as the hypotenuse of a right angle triangle */ z=sqrt((horiz*horiz) + (vert*vert)); /* Pythagorus theorem: */ return z; /* z*z = x*x + y*y */ } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

coord getcoord(){ /. note returned type is struct coord. / / coord getcoord(){ /* note returned type is struct coord */ /* prompts for and returns a coordinate */ coord temp; printf("Enter x and y coordinates \n"); scanf_s("%f%f",&temp.x,&temp.y); return temp; } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Παράδειγμα (με χρήση pointers) #include <stdio.h> #include <math.h> /* needed to use sqrt() square root */ struct coord { float x,y; }; /* function prototypes*/ float distance(coord *a, coord *b); /* a and b are now pointers to coord */ void getcoord(coord *t); /* inputs coordinate through coord* pointer t */ ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

void main() { coord origin, cursor,. orig, void main() { coord origin, cursor, *orig,*curs; orig=&origin; curs=&cursor; /* store addresses in pointers orig and curs */ float separation; printf("enter details for origin:\n"); getcoord(orig); printf("enter details for cursor:\n"); getcoord(curs); separation=distance(orig,curs); printf("the distance between origin and cursor %f\n" ,separation); } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

float distance(coord *a, coord *b){ /* calculate distance between a and b */ float z,vert,horiz; /* z = distance, vert = y1 - y2, horiz = x1 - x2 */ horiz=a->x - b->x; /* horizontal distance note -> pointer syntax */ vert=a->y - b->y; /* the vertical distance */ /* calculate z as the hypotenuese of a right angle triangle */ z=sqrt((horiz*horiz) + (vert*vert)); /* pythagorus theorem: */ return z; /* z*z = x*x + y*y */ } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

void getcoord(coord *t) { /* inputs x-y coordinate using pointers */ printf("please enter x and y coordinates\n"); scanf_s("%f%f",&t->x,&t->y); /* -> has higher precedence than & */ } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Δήλωση ενός πίνακα δομών τύπου coord: struct coord { float x,y; } ; coord graph[10]; Εισαγωγή δεδομένων: for(int i=0;i<10;i++){ printf("Enter x value for coordinate%d\n" ,i+1); scanf("%f",&graph[i].x); printf("Enter y value for coordinate%d\n" ,i+1); scanf("%f",&graph[i].y); } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Εισαγωγή δεδομένων με χρήση pointers: for(int i=0;i<10;i++) { printf("Enter x value for coordinate%d\n" ,i+1); scanf("%f",&(graph+i)->x); /* -> has higher precedence than & */ printf("Enter y value for coordinate%d\n" ,i+1); scanf("%f",&(graph+i)->y); } ΔΠΘ - ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ-ΓΛΩΣΣΑ C / 05

Παραδείγματα struct-4.cpp, struct-5.cpp, struct-6.cpp, struct-7.cpp,