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

Σχετικά έγγραφα
Διαδικαστικός Προγραμματισμός

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Κεφάλαιο V: Δομές και ενώσεις. 5.1 Δομές.

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

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

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

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

Εισαγωγή στους πίνακες

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

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

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

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

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

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

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

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

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

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

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

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

ΕΠΛ 034: Εισαγωγή στον Προγραμματισμό για ΗΜΥ

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

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

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

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

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

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

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

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

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

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

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

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

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι είναι ; Συναρτήσεις. Παράδειγμα #1. double convert ( double cm ) { double inch;

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

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

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

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

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

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

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

Συναρτήσεις και διαδικασίες

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

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

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

Προγραµµατιστικές τεχνικές

10 η Διάλεξη C++ - Πίνακες. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

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

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

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 10 Ο. Δομές Ενώσεις Απαριθμητοί τύποι δεδομένων ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

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

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

Πανεπιστήμιο Δυτικής Μακεδονίας Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών. ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Δομές

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

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

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

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

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

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

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

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

Εργαστηριακή Άσκηση 1

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

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

Ασκήσεις - Μελέτες περίπτωσης για το μάθημα Προγραμματισμός II

Κλάσεις και αντικείμενα #include <iostream.h<

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

Προγραμματιστικές τεχνικές

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

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

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

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

Transcript:

ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Διαδικαστικός Προγραμματισμός Α Εξάμηνο Μάθημα 10 ο : Εγγραφές/Δομές

Στόχοι μαθήματος Να κατανοήσετε την έννοια της εγγραφής/δομής και τη σημασία της για τον προγραμματισμό. Να αντιληφθείτε τη διαφορά μεταξύ του ορισμού ενός τύπου εγγραφής και της δήλωσης μιας μεταβλητής εγγραφής. Να μπορείτε να χειρίζεστε εγγραφές χρησιμοποιώντας τον τελεστή τελεία (dot). Να μάθετε πώς να δηλώνετε και να χρησιμοποιείτε πίνακες εγγραφών και εγγραφές με πίνακες ως πεδία. 2

Η έννοια της εγγραφής δεδομένων (1) Οι πίνακες, όπως έχουμε ήδη αναφέρει επιτρέπουν την αποθήκευση διατεταγμένων συλλογών ομοιογενών τιμών. Στο μάθημα αυτό θα παρουσιαστεί η έννοια της δομής (structure) ή εγγραφής (record), η οποία επιτρέπει την αποθήκευση μη διατεταγμένων και ανομοιογενών στοιχείων ως μιας συλλογής. Δομή ή εγγραφή, λοιπόν, ονομάζεται μια συλλογή μη διατεταγμένων και ετερογενών τιμών που θεωρούνται μια οντότητα. 3

Η έννοια της εγγραφής δεδομένων (2) Παράδειγμα: ας υποθέσουμε ότι σε μια εταιρεία πρέπει να γνωρίζουμε το όνομα κάθε υπαλλήλου, τη θέση εργασίας του, τον αριθμό κοινωνικής ασφάλισης, τον ακαθάριστο μισθό του και το ποσοστό των κρατήσεων, για να μπορούμε -για παράδειγμα- να εκτυπώνουμε τις επιταγές μισθοδοσίας. Όλες οι παραπάνω πληροφορίες απαρτίζουν την εγγραφή δεδομένων κάθε υπαλλήλου. Με τι μοιάζουν όμως οι εγγραφές των υπαλλήλων; Όνομα Θέση Αριθμ. κοιν. Ασφ. Ακαθ. μισθός John Smith Accountant 271-82-8183 1300 0.20 Pappa Maria Manager 314-15-9265 2500 0.25 Ποσοστό κρατήσεων 4

Η έννοια της εγγραφής δεδομένων (3) Όνομα Θέση Αριθμ. κοιν. Ασφ. Ακαθ. μισθός John Smith Accountant 271-82-8183 1300 0.20 Pappa Maria Manager 314-15-9265 2500 0.25 Ποσοστό κρατήσεων Κάθε εγγραφή διαιρείται σε μεμονωμένα συστατικά στοιχεία, καθένα από τα οποία παρέχει μια συγκεκριμένη πληροφορία για ένα υπάλληλο. Τα μεμονωμένα συστατικά στοιχεία μιας εγγραφής ονομάζονται πεδία (fields) ή, όπως συνηθίζεται στη C, μέλη (members). Κάθε πεδίο σχετίζεται με έναν τύπο δεδομένων, ο οποίος μπορεί να είναι διαφορετικός για τα διάφορα πεδία της εγγραφής. Βέβαια, παρά το γεγονός ότι μια εγγραφή απαρτίζεται από μεμονωμένα πεδία, θα πρέπει να έχει νόημα και ως συνεκτικό σύνολο, όπως στο παράδειγμα όπου μια εγγραφή αναπαριστά έναν υπάλληλο. 5

Δημιουργία δεδομένων εγγραφών (1) Για να δημιουργήσετε δεδομένα εγγραφών στη C, πρέπει να ακολουθήσετε μια διαδικασία δύο βημάτων: 1. Να ορίσετε ένα νέο τύπο δομής: Πριν δηλώσετε οποιεσδήποτε εγγραφές, θα πρέπει να έχετε δηλώσει ένα νέο τύπο δομής. Στον ορισμό του τύπου καθορίζονται τα πεδία από τα οποία θα αποτελείται η δομή, ποια θα είναι τα ονόματά τους, και ποιος είναι ο τύπος πληροφοριών που θα περιέχει κάθε πεδίο. Αυτός ο τύπος δομής θα αποτελεί το μοντέλο για όλες τις μεταβλητές αυτού του νέου τύπου, αλλά από μόνος του δεν δεσμεύει χώρο στη μνήμη. 2. Να δηλώσετε μεταβλητές του νέου τύπου. Αφού ορίσετε το νέο τύπο, το επόμενο βήμα σας είναι η δήλωση μεταβλητών αυτού του τύπου ώστε να μπορείτε να αποθηκεύσετε σε αυτές πραγματικές τιμές δεδομένων. 6

Δημιουργία δεδομένων εγγραφών (2) Ορισμός νέου τύπου εγγραφής/δομής typedef struct { δηλώσεις_πεδίων όνομα_νέου_τύπου; όπου: - δηλώσεις_πεδίων είναι καθιερωμένες δηλώσεις μεταβλητών οι οποίες χρησιμοποιούνται εδώ για τον ορισμό των πεδίων της δομής - όνομα_νέου_τύπου είναι το όνομα του τύπου που ορίζετε typedef struct{ char name[30]; char jobtitle[20]; char secnumber[10]; double salary; double percentage; employeet; 7

Δημιουργία δεδομένων εγγραφών (3) Δήλωση μεταβλητών εγγραφών/δομών Με δεδομένο τον τύπο employeet μπορούμε να δηλώσουμε μια μεταβλητή, έστω emp, αυτού του τύπου ως εξής: typedef struct{ char name[30]; char jobtitle[20]; char secnumber[10]; double salary; double percentage; employeet; int main(){ employeet emp; emp name secnumber salary jobtitle percentage 8

Δημιουργία δεδομένων εγγραφών (4) Δήλωση μεταβλητών εγγραφών/δομών(άλλοι τρόποι) Μπορούμε να δηλώσουν μια δομή με 3 τρόπους a)δήλωση τύπου και στη συνέχεια δήλωση της μεταβλητής typedef struct { char name[30]; char jobtitle[20]; char secnumber[10]; double salary; double percentage; employeet; employeet emp; Προτείνεται η χρήση του α) τρόπου b) Δήλωση μεταβλητής μαζί με τη δήλωση του τύπου struct employeet{ char name[30]; char jobtitle[20]; char secnumber[10]; double salary; double percentage; emp; c) Δήλωση μόνο μεταβλητής όχι τύπο struct { char name[30]; char jobtitle[20]; char secnumber[10]; double salary; double percentage; emp; 9

Επιλογή εγγραφών Μετά τη δήλωση της μεταβλητής emp : employeet emp; θα μπορείτε να αναφέρεστε στη μεταβλητή συνολικά χρησιμοποιώντας απλά το όνομά της. Κάποια στιγμή, ωστόσο, θα χρειαστεί να αναφερθείτε σε συγκεκριμένα πεδία της εγγραφής. Η αναφορά σε συγκεκριμένα πεδία μιας εγγραφής γίνεται γράφοντας το όνομα της μεταβλητής της εγγραφής, μια τελεία και το όνομα του πεδίου: emp.title; Όταν χρησιμοποιείται σε αυτά τα πλαίσια, η τελεία ονομάζεται τελεστής τελεία (dot). Η επιλογή ενός πεδίου με τη χρήση του τελεστή τελεία ονομάζεται επιλογή εγγραφής (record selection). 10

Ανάθεση αρχικών τιμών σε εγγραφές Όπως και με οποιονδήποτε άλλο τύπο μεταβλητής, μπορείτε να αναθέσετε αρχικές τιμές στα περιεχόμενα μιας μεταβλητής εγγραφής αναθέτοντας αρχικές τιμές στα συστατικά της στοιχεία. Για το παράδειγμα μας, θα έχουμε: strcpy(emp.name, John Smith ); strcpy(emp.jobtitle, Accountant ); strcpy(emp.secnumber, 271-82-8183 ); emp.salary = 1300; emp.percentage = 0.25; Φυσικά, τα πεδία μιας εγγραφής μπορούν να πάρουν τιμές από το πληκτρολόγιο, χρησιμοποιώντας τις γνωστές συναρτήσεις GetInteger(), GetReal() κτλ. Στην περίπτωση δήλωσης ενός πεδίου ως πίνακα χαρακτήρων, μπορούμε να διαβάσουμε σε αυτό τιμή από το πληκτρολόγιο με τη διαδικασία gets(). 11

Ανάθεση αρχικών τιμών σε εγγραφές Σε μια μεταβλητή εγγραφής στη δήλωση της μπορείτε να αναθέσετε αρχικές τιμές με την ίδια σύνταξη που χρησιμοποιήσατε για τους πίνακες. Για το παράδειγμα μας, θα έχουμε: employeet manager ={ John Smith, Accountant, 271-82-8183, 1300,0.25 ; Επίσης μπορείτε να αναθέσετε το περιεχόμενο μιας εγγραφής σε μια άλλη εγγραφή αντί να αναθέτετε το περιεχόμενο κάθε πεδίου. employeet Employee1, Employee2; Employee1 = Employee2; //είναι ισοδύναμο με /* strcpy(employee1.name, Employee2.name); strcpy(employee1.jobtitle, Employee2.jobTitle); strcpy(employee1.secnumber, Employee2.secNumber); Employee1.salary = Employee2.salary; Employee1.percentage = Employee2.percentage; */ 12

Απλές εγγραφές (1) Τύπος εγγραφής για την αναπαράσταση ενός σημείου με συντεταγμένες x και y: typedef struct{ double x, y; pointt; Στη συνέχεια, μπορείτε να γράψετε συναρτήσεις και διαδικασίες, οι οποίες χειρίζονται τιμές τύπου pointt : pointt CreatePoint( double x, double y) { pointt p; p.x = x; p.y = y; return (p); 13

Απλές εγγραφές (2) Στη συνέχεια, μπορείτε να χρησιμοποιήσετε αυτή τη συνάρτηση για να αναθέσετε αρχική τιμή σε μια μεταβλητή τύπου pointt : pointt origin; origin = CreatePoint(0, 0); Οι εγγραφές είναι δυνατό επίσης να μεταβιβάζονται ως ορίσματα σε συναρτήσεις: pointt AddPoint( pointt p1, pointt p2) { pointt p; p.x = p1.x + p2.x; p.y = p1.y + p2.y; return (p); 14

Απλές εγγραφές (3) Αν εκτελέσετε την κλήση AddPoint(p1, p2), όπου p1 και p2 είναι τιμές τύπου pointt, η συνάρτηση θα επιστρέψει την τιμή τύπου pointt της οποίας οι συντεταγμένες αποτελούν το άθροισμα των αντίστοιχων συντεταγμένων των τιμών p1 και p2. Όταν καλείτε μια συνάρτηση η οποία δέχεται ως όρισμα κάποια εγγραφή, η τιμή της εγγραφής αντιγράφεται στην αντίστοιχη τυπική παράμετρο της συνάρτησης. Αν στο εσωτερικό μιας συνάρτησης τροποποιηθεί η τιμή της τυπικής παραμέτρου ή οι τιμές οποιονδήποτε από τα εσωτερικά της πεδία, το όρισμα με το οποίο κλήθηκε η συνάρτηση θα διατηρήσει την αρχική του τιμή. Αυτή η συμπεριφορά είναι συνεπής με τον τρόπο με τον οποίο χειρίζεται η C όλες τις παραμέτρους εκτός από τους πίνακες. 15

Συνδυασμός εγγραφών και πινάκων (1) Συχνά, είναι χρήσιμος ο ορισμός πινάκων από εγγραφές ή ακόμα και εγγραφών που περιέχουν πίνακες. Μπορούμε για παράδειγμα να δηλώσουμε με το γνωστό τρόπο- ένα πίνακα όπου κάθε στοιχείο του θα είναι τύπου employeet: #define MaxEmployees 100 /*σταθερά που δηλώνει το μέγιστο πλήθος στοιχείων του πίνακα*/ int main(){ employeet staff[maxemployees]; /*πίνακας 100 εγγραφών τύπου employeet */ int nemployees; /*μεταβλητή που αποθηκεύει το τρέχον πλήθος εγγραφών του πίνακα*/ 16

Συνδυασμός εγγραφών και πινάκων (2) Συνάρτηση για την εμφάνιση στην οθόνη των ονομάτων όλων των υπαλλήλων, μαζί με τους τίτλους εργασίας τους: typedef struct{ char name[30]; char jobtitle[20]; char secnumber[10]; double salary; double percentage; employeet; void ListEmployees(int nemployees, employeet staff[]) { int i; for(i = 0; i < nemployees; i++){ printf( %s (%s)\n, staff[i].name, staff[i].jobtitle); 17

Συνδυασμός εγγραφών και πινάκων (3) Συνάρτηση για τoν υπολογισμό και την επιστροφή του μέσου μισθού όλων των υπαλλήλων: typedef struct{ char name[30]; char jobtitle[20]; char secnumber[10]; double salary; double percentage; employeet; double AverageSalary(int nemployees, employeet staff[]) { double total, average; int i; total = 0; for(i = 0; i < nemployees; i++){ total = total + staff[i].salary; average = total/nemployees; return (average); 18

Συνδυασμός εγγραφών και πινάκων (4) Συνάρτηση που επιστρέφει εγγραφή/δομή : Βρίσκει τον υπάλληλο με το μικρότερο μισθό και επιστρέφει την εγγραφή του employeet empminsalary(int nemployees, employeet staff[]) { double minsalary; int i; employeet emp; minsalary=staff[0].salary; emp=staff[0]; for(i = 1; i < nemployees; i++) if (minsalary>staff[i].salary) { minsalary=staff[i].salary; emp=staff[i]; return emp; 19

Δείκτες σε εγγραφές Εφόσον οι εγγραφές είναι μεταβλητές, μπορώ να έχω δείκτη σε μια εγγραφή. Για παράδειγμα έστω η παρακάτω εγγραφή (δομή): typedef struct{ double x, y; pointt; Μεταβλητή τύπου pointt pointt p1; Μεταβλητή δείκτη pointt *pp; Διεύθυνση μεταβλητής pp = &p1; Αποαναφορά (*pp).x ίδιο με p1.x Παράδειγμα: Η ακόλουθη συνάρτηση αυξάνει τις συντεταγμένες x κατά ένα. void movepointleft(pointt *p){ (*p).x = (*p).x + 1; 20

Δείκτες σε εγγραφές Δείκτες σε εγγραφές χρησιμοποιούνται πολύ συχνά. Ειδική σημειογραφία τελεστής -> pp -> x ταυτίζεται με το (*pp).x Παράδειγμα: Η ακόλουθη συνάρτηση αυξάνει τις συντεταγμένες y κατά ένα. void movepointright(pointt *p){ p->y = p->y + 1; 21

Συνδυασμός εγγραφών,δεικτών και πινάκων Συνάρτηση που μεταβιβάζει εγγραφή/δομή με αναφορά: Βρίσκει τον υπάλληλο με το μικρότερο ποσοστό και επιστρέφει την εγγραφή του με αναφορά 1 ος τρόπος void empminper(int nemployees,employeet staff[],eployeet *AnEmployee) { int i; double minper; int index; { minper = staff[0].percentage; index = 0; for(i = 1; i < nemployees; i++) if (minper > staff[i].percentage) minper = staff[i].percentage; index = i; *AnEmployee = staff[index]; 1 ος τρόπος: Χρήση 2 βοηθητικών μεταβλητών για να αποθηκεύσω το μικρότερο ποσοστό (minper ) και σε ποιον υπάλληλο αντιστοιχεί (index) και δε χρησιμοποιώ την αναφερόμενη από το δείκτη μεταβλητή τύπου δομής *AnEmployee, όπως γίνεται στο 2ο τρόπο 22

Συνδυασμός εγγραφών και πινάκων Συνάρτηση που μεταβιβάζει εγγραφή/δομή με αναφορά: Βρίσκει τον υπάλληλο με το μικρότερο μισθό και επιστρέφει την εγγραφή του με αναφορά 2 ος τρόπος void empminper(int nemployees,employeet staff[],employeet *AnEmployee) { int i; { *AnEmployee = staff[0]; for(i = 1; i < nemployees; i++) if ((*AnEmployee).percentage > staff[i].percentage) (*AnEmployee).percentage = staff[i].percentage; *AnEmployee = staff[i]; 2 ος τρόπος: Χρησιμοποιώ την αναφερόμενη από το δείκτη μεταβλητή τύπου δομής *AnEmployee. 23

Συνδυασμός εγγραφών και πινάκων (6) #define Elements 56 /*σταθερά που δηλώνει το μέγιστο πλήθος στοιχείων του πίνακα*/ typedef struct{ double timi; char xroma[20]; char iliko[20]; char etairia[30]; chairt; void ReadAchair(chairT *k); //μεταβιβάζω με αναφορά μια μεταβλητή τύπου δομής chairt void ReadChairs(int size, chairt k[]); //μεταβιβάζω με αναφορά ένα στοιχείο του πίνακα που είναι μια μεταβλητή τύπου δομής chairt void PrintChairs(int size, chairt k[]); //μεταβιβάζω ολόκληρο τον πίνακα που ο τύπος κάθε στοιχείου του πίνακα είναι τύπου δομής chairt main() { chairt kareklitsa; chairt karekles[elements]; printf("stoixeia karekla 1\n"); //μεταβιβάζω με αναφορά μια μεταβλητή τύπου δομής chairt ReadAchair(&kareklitsa); printf("%.2f, %s, %s, %s\n", kareklitsa.timi, kareklitsa.xroma, kareklitsa.iliko, kareklitsa.etairia); printf("stoixeia karekla 10\n"); //μεταβιβάζω με αναφορά ένα στοιχείο του πίνακα που είναι μια μεταβλητή τύπου δομής chairt ReadAchair(&karekles[10]); printf("%.2f, %s, %s, %s\n", karekles[10].timi, karekles[10].xroma, karekles[10].iliko, karekles[10].etairia); Από το compus κατεβάστε και μελετήστε ολοκληρωμένο το πρόγραμμα chair.c printf("stoixeia karekles treis\n"); //μεταβιβάζω ολόκληρο τον πίνακα που ο τύπος κάθε στοιχείου του πίνακα είναι τύπου δομής chairt ReadChairs(3, karekles); PrintChairs(3, karekles); system("pause"); 24