Οικονοµικό Πανεπιστήµιο Αθηνών Τµήµα ιοικητικής Επιστήµης & Τεχνολογίας ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ Κεφάλαιο 8 Προχωρηµένα Θέµατα Προγραµµατισµού C Γιώργος Γιαγλής
Περίληψη Κεφαλαίου 8 Προχωρηµένα Θέµατα Προγραµµατισµού C Πίνακες Ανάθεση τιµών στα στοιχεία µονοδιάστατου πίνακα Εκτύπωση στοιχείων µονοδιάστατου πίνακα Πολυδιάστατοι Πίνακες Ανάθεση τιµών στα στοιχεία πολυδιάστατου πίνακα Εκτύπωση στοιχείων πολυδιάστατου πίνακα Αλγόριθµοι αναζήτησης σε πίνακες Γραµµική Αναζήτηση υαδική Αναζήτηση Αλγόριθµοι ταξινόµησης σε πίνακες Ταξινόµηση µε επιλογή Ταξινόµηση φυσαλίδας οµές Εγγραφές ή οµές Πίνακες οµών 2
Πίνακες Ένας πίνακας (array) είναι µια σύνθετη δοµή δεδοµένων οµογενής δοµή δεδοµένων (στοιχεία του ίδιου τύπου) στατική δοµή δεδοµένων (έχει σταθερό µέγεθος) ήλωση πίνακα (Τύπος στοιχείων, Όνοµα Πίνακα, Πλήθος Στοιχείων σε κάθε ιάσταση) Αναφορά σε στοιχείο του Πίνακα: όνοµα του πίνακα και τη θέση του στοιχείου µέσα σε αγκύλες Int pin [4] Ορισµός ενός πίνακα 4 ακέραιων στοιχείων Float arr[10][5] Ορισµός ενός δισδιάστατου πίνακα 10*5 πραγµατικών αριθµών pin[0] Αναφορά στο στοιχείο που βρίσκεται στη θέση 0 του πίνακα pin ΠΡΟΣΟΧΗ: η αρίθµηση των στοιχείων ενός πίνακα στη C αρχίζει πάντα από το στοιχείο µηδέν Απόδοση αρχικών τιµών: arr[0][0] µέσα στο πρόγραµµα για κάθε στοιχείο ξεχωριστά Αναφορά στο πρώτο στοιχείο του πίνακα arr κατά τη δήλωση του πίνακα συγκεντρωτικά για όλα τα στοιχεία του int pin[5]={1,7,22,35,59; 3
Αλγόριθµοι Αναζήτησης Πολλές φορές αναζητούµε ένα συγκεκριµένο από τα πολλά στοιχεία ενός πίνακα. Οι αλγόριθµοι αναζήτησης εντοπίζουν τη θέση του στοιχείου µε την επιθυµητή τιµή αν υπάρχει. Αν δεν υπάρχει κανένα στοιχείο µε την τιµή αυτή τυπώνουν αντίστοιχο µήνυµα Χαρακτηριστικοί Αλγόριθµοι Αναζήτησης σε Πίνακες Γραµµική Αναζήτηση υαδική Αναζήτηση 4
Αλγόριθµοι Αναζήτησης Γραµµική Αναζήτηση ξεκινάει από το πρώτο στοιχείο του πίνακα και ελέγχει ένα-ένα τα στοιχεία µέχρι είτε να βρεθεί το ζητούµενο είτε να τελειώσει ο πίνακας εν αποτελεί αποδοτικό αλγόριθµο: Σε ένα πίνακα µεγέθους Ν απαιτούνται N/2 συγκρίσεις main() /* αλγόριθµος γραµµικής αναζήτησης της θέσης του στοιχείου x σε πίνακα µε το όνοµα pin µεγέθους Ν ακέραιων στοιχείων */ {int pin[n], x, i; i=0; /* ξεκινάµε από το πρώτο στοιχείο του πίνακα */ while ((i<n) && (pin[i]!=x)) /* όσο δεν έχει τελειώσει ο πίνακας και δεν έχουµε βρει το ζητούµενο στοιχείο */ i++; /* αυξάνουµε το µετρητή και προχωράµε στο επόµενο στοιχείο */ if (pin[i]==x) /* αν έχουµε βρει το στοιχείο */ printf( Το στοιχείο πρωτοεµφανίζεται στη θέση %d,i); else printf( Το στοιχείο δεν υπάρχει στον πίνακα ); 5
Αλγόριθµοι Αναζήτησης υαδική Αναζήτηση Πραγµατοποιεί διαδοχικές «διασπάσεις» του πίνακα στη µέση, ώστε µετά από κάθε σύγκριση να έχει αποµείνει ο µισός αριθµός στοιχείων για έλεγχο Σε περίπτωση ταξινοµηµένου πίνακα, επιταχύνεται η διαδικασία της αναζήτησης Περίπτωση αναζήτησης σε πίνακα µε στοιχεία ταξινοµηµένα σε αύξουσα σειρά Σύγκριση του ζητούµενο στοιχείου µε τη µεσαία θέση του πίνακα Αν είναι µικρότερο, τότε γνωρίζουµε ότι το στοιχείο που ζητάµε βρίσκεται στο πρώτο µισό του πίνακα Σύγκριση του στοιχείου µε το µεσαίο στοιχείο του υποπίνακα που αποµένει κοκ 6
Αλγόριθµοι Αναζήτησης υαδική Αναζήτηση Παράδειγµα Έστω πίνακας 10 θέσεων ταξινοµηµένος σε φθίνουσα σειρά, όπως φαίνεται παρακάτω, και έστω ότι αναζητούµε το στοιχείο µε τιµή 30 στον πίνακα αυτό θέση 0 1 2 3 4 5 6 7 8 9 στοιχεία 200 165 117 109 84 74 57 30 26 19 Αναζήτηση του µεσαίου στοιχείου θέση 4, τιµή 84 Σύγκριση µε ζητούµενο 30<84 Άρα το στοιχείο βρίσκεται στο δεξί τµήµα του πίνακα(θέση 5 έως θέση 9) Αναζήτηση του µεσαίου στοιχείου θέση 7, τιµή 30 Σύγκριση µε ζητούµενο 30=30 Τερµατισµός Αλγορίθµου Η ίδια διαδικασία ακολουθείται και σε περιπτώσεις που ψάχνουµε ένα στοιχείο που δεν υπάρχει 7
Αλγόριθµοι Αναζήτησης υαδική Αναζήτηση main() /* αλγόριθµος δυαδικής αναζήτησης της θέσης του στοιχείου x σε ταξινοµηµένο σε αύξουσα σειρά πίνακα µε το όνοµα pin µεγέθους Ν ακέραιων στοιχείων */ {int pin[n], x; int lower, upper; /* το κάτω και το πάνω όριο του υποπίνακα στον οποίο ψάχνουµε */ int mesaio; /* το µεσαίο στοιχείο του πιο πάνω υποπίνακα */ lower=0; upper=n-1 /* ξεκινάµε από τα όρια του πίνακα */ mesaio=(lower+upper)/2; while ((pin[mesaio]!=x) && (lower<=upper)) /* όσο δεν έχουµε βρει το ζητούµενο στοιχείο και δεν έχει εξαντληθεί ο υποπίνακας */ {if (pin[mesaio]<x); /* αν το µεσαίο στοιχείο είναι µικρότερο του ζητούµενου */ lower=mesaio+1; /* συνεχίζουµε στο πάνω µισό του πίνακα */ else /* αλλιώς */ upper=mesaio-1; /* συνεχίζουµε στο κάτω µισό του πίνακα */ mesaio=(lower+upper)/2; if (pin[mesaio]==x) /* αν έχουµε βρει το στοιχείο */ printf( Το στοιχείο πρωτοεµφανίζεται στη θέση %d,mesaio); else printf( Το στοιχείο δεν υπάρχει στον πίνακα ); 8
Αλγόριθµοι Ταξινόµησης Σε πολλές περιπτώσεις, η ταξινόµηση είναι ένα καλό πρώτο βήµα πριν την αναζήτηση ταξινόµηση εντός του ίδιου πίνακα µε αµοιβαίες αντιµεταθέσεις των στοιχείων του Αλγόριθµοι ταξινόµησης σε µονοδιάστατους πίνακές Ταξινόµηση µε επιλογή Ταξινόµηση φυσαλίδας 9
Αλγόριθµοι Ταξινόµησης Ταξινόµηση µε επιλογή 1. ιατρέχει όλα τα στοιχεία ενός πίνακα 2. Βρίσκει κάθε φορά το µικρότερο (αν θέλουµε ταξινόµηση σε αύξουσα σειρά) το µεγαλύτερο (αν θέλουµε ταξινόµηση σε φθίνουσα σειρά) αντιµεταθέτει µε το πρώτο στοιχείο που δεν έχει ελεγχθεί ακόµα 3. Αντιµεταθέτει µε το πρώτο στοιχείο που δεν έχει ελεγχθεί ακόµα 4. Η διαδικασία αυτή εκτελείται Ν-1 φορές για ένα πίνακα Ν στοιχείων και όταν τελειώσει, ο πίνακας είναι ταξινοµηµένος 10
Αλγόριθµοι Ταξινόµησης Ταξινόµηση µε επιλογή main() /* αλγόριθµος ταξινόµησης µε επιλογή σε αύξουσα σειρά πίνακα µε το όνοµα pin µεγέθους Ν ακέραιων στοιχείων */ {int pin[n]; int elaxisto, thesi; /* ελάχιστο κάθε φορά στοιχείο και η θέση του στον πίνακα */ int i, k, temp; /* βοηθητικές µεταβλητές */ for (i=0;i<n-1;i++) /* η διαδικασία εκτελείται Ν-1 φορές */ {elaxisto=pin[i]; thesi=i; /* θέτουµε αρχικά ως ελάχιστο το στοιχείο εκκίνησης */ for (k=i+1; k<n; k++) /* ελέγχουµε όλα τα υπόλοιπα στοιχεία µέχρι το τέλος */ if (pin[k]<min) /* αν το στοιχείο είναι µικρότερο του τρέχοντος ελάχιστου */ {elaxisto=pin[i]; thesi=i; /* θέσε αυτό το στοιχείο ως νέο ελάχιστο */ temp=pin[i]; pin[i]=p[thesi]; p[thesi]=temp; /* 3 εντολές για την αντιµετάθεση του στοιχείου i µε το ελάχιστο */ 11
Αλγόριθµοι Ταξινόµησης Ταξινόµηση φυσαλίδας 1. ιατρέχει τα στοιχεία ενός πίνακα 2. Συγκρίνει ανά δυο γειτονικά αντιµεταθέτοντάς τα αν δεν είναι σε σωστή σειρά 3. Μετά από Ν-1 διαπεράσεις, ο πίνακας είναι ταξινοµηµένος main() /* αλγόριθµος ταξινόµησης φυσαλίδας σε αύξουσα σειρά πίνακα µε το όνοµα pin µεγέθους Ν ακέραιων στοιχείων */ {int pin[n]; int i, k, temp; /* βοηθητικές µεταβλητές */ for (i=0;i<n-1;i++) /* η διαδικασία εκτελείται Ν-1 φορές */ for (k=ν-1; k>i; k--) /* ελέγχουµε όλα τα στοιχεία από το τέλος µέχρι το τρέχον */ if (pin[k]<pin[k-1) /* αν ένα στοιχείο είναι µικρότερο του προηγούµενου του */ {temp=pin[k]; pin[k]=p[k-1]; p[k-1]=temp; /* αντιµετάθεσε τα */ 12
Εγγραφές- οµές Κάθε Εγγραφή στη C ονοµάζεται οµή σύνθετη δοµή δεδοµένων ετερογενής δοµή δεδοµένων (οµαδοποιεί στοιχεία διαφορετικών τύπων) Κάθε στοιχείο µιας εγγραφής ονοµάζεται πεδίο (field) και χαρακτηρίζεται από το όνοµα του και τον τύπο του Ορίζεται µε την ειδική λέξη struct struct Όνοµα οµής { Τύπος1 Πεδίο1.1, Πεδίο1.2,...; Τύπος2 Πεδίο2.1, Πεδίο2.2,...;... Παράδειγµα, ο τύπος της δοµής των στοιχείων ενός φοιτητή struct StoixeiaFoithth { char AM[9], Onoma[20], Epwnymo[30]; float MesosOros; 13
Εγγραφές- οµές οµή µε στοιχεία Φοιτητή struct StoixeiaFoithth { char AM[9], Onoma[20], Epwnymo[30]; float MesosOros; Προσοχή: εν ορίζει καµία µεταβλητή ε δεσµεύει χώρο στη µνήµη. Ορίζει µόνο τη µορφή της δοµής, δηλαδή την οργάνωση της σε πεδία. Ορισµός Μεταβλητών: ειδική λέξη struct ακολουθούµενη από το όνοµα της δοµής και τα ονόµατα των µεταβλητών struct StoixeiaFoithth Foithths1, Foithths2, Foithths3; Αναφορά σε συγκεκριµένο πεδίο µιας µεταβλητής δοµής: µε τη χρήση του τελεστή. (τελεία), οποίος διαχωρίζει το όνοµα της µεταβλητής και το όνοµα του πεδίου π.χ. απόδοση αρχικών τιµών σε στοιχεία της µεταβλητής δοµής Foithths1 Foithths1.AM = 80800001 ; Foithths1.MesosOros = 9.5; 14
Πίνακες οµών (Βάσεις εδοµένων) Πίνακας οµών: Ένας πίνακας του οποίου τα στοιχεία είναι οµές Αποτελεί µια Βάση εδοµένων Παράδειγµα: Βάση εδοµένων για την αποθήκευση στοιχείων 100 φοιτητών struct StoixeiaFoithth { char AM[9], Onoma[20], Epwnymo[30]; ; float MesosOros; struct StoixeiaFoithth Foithtes[100]; 15