ΑΛΓΟΡΙΘΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ ΠΕΡΙΒΑΛΛΟΝ MATLAB

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "ΑΛΓΟΡΙΘΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ ΠΕΡΙΒΑΛΛΟΝ MATLAB"

Transcript

1 Γιάννης Καλατζής ΑΛΓΟΡΙΘΜΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ ΠΕΡΙΒΑΛΛΟΝ MATLAB ` ΘΕΩΡΙΑ 2014

2 Το εγχειρίδιο αυτό περιέχει τις βασικές αρχές προγραμματισμού των ηλεκτρονικών υπολογιστών, χωρίς καμία προαπαιτούμενη γνώση, για χρήση κυρίως από προπτυχιακούς φοιτητές τμημάτων μηχανικών και θετικών επιστημών. Ως γλώσσα προγραμματισμού επιλέχθηκε αυτή του περιβάλλοντος MATLAB της εταιρείας MathWorks. Παρόλ αυτά, ο κύριος στόχος δεν είναι η εκμάθηση του MATLAB, αλλά του γενικού αλγοριθμικού προγραμματισμού. Για το λόγο αυτό παραλείπονται αρχικά πολλές από τις εξαιρετικά χρήσιμες και ιδιαίτερες δυνατότητες του MATLAB (οι οποίες όμως αναφέρονται στη συνέχεια σε ιδιαίτερες παραγράφους). Με τον τρόπο αυτό δίνεται έμφαση στην ανάπτυξη απλού κώδικα, ώστε οι φοιτητές να διδαχτούν τις γενικές αρχές του αλγοριθμικού προγραμματισμού, και να μπορούν εύκολα αν επιθυμούν να προχωρήσουν στην εκμάθηση κλασσικότερων γλωσσών προγραμματισμού, όπως η C (γενικότερα) ή η Fortran (ειδικότερα), με τις οποίες εξάλλου το MATLAB μοιράζεται πολλά κοινά στοιχεία. Στο τέλος κάθε κεφαλαίου υπάρχει σειρά ερωτήσεων θεωρίας και ασκήσεων ανάπτυξης κώδικα. Οι ερωτήσεις και οι ασκήσεις περιορίζονται στα θέματα των απλών προγραμματιστικών διαδικασιών που αναφέρθηκαν προηγουμένως με σκοπό τη χρήση τους στα πλαίσια σειράς μαθημάτων εκμάθησης των εννοιών του κλασσικού προγραμματισμού, και όχι στις ιδιαίτερες δυνατότητες του MATLAB, οι οποίες αναπτύσσονται στη συνέχεια σε άλλα κεφάλαια ώστε όποιος επιθυμεί να μπορεί να εμβαθύνει και σε αυτές, αφού όμως εξοικειωθεί με τον βασικό τρόπο ανάπτυξης κώδικα. Η επιλογή του MATLAB ως εργαλείου εκμάθησης προγραμματισμού Η/Υ έγινε λόγω της ευκολίας στη σύνταξη της γλώσσας προγραμματισμού του καθώς και του σύγχρονου γραφικού του περιβάλλοντος, δυο στοιχεία που ελκύουν και δεν αποθαρρύνουν τον αρχάριο. Ταυτόχρονα, δίνεται η δυνατότητα στους φοιτητές να εξοικειωθούν με ένα πολύ δυνατό περιβάλλον ανάπτυξης προγραμμάτων και εφαρμογών, που αποτελεί σημαντική γνώση τόσο για αρκετά από τα υπόλοιπα μαθήματά τους κατά τη διάρκεια των σπουδών τους, όσο και κατά την σταδιοδρομία τους ως μηχανικών και επιστημόνων, ενώ τέλος αποτελεί ισχυρότατο εργαλείο στην περίπτωση που επιλέξουν να ασχοληθούν με την ακαδημαϊκή έρευνα. Γ. Κ.

3 ΠΕΡΙΕΧΟΜΕΝΑ 1 Γενικά περί Ηλεκτρονικών Υπολογιστών Ο ηλεκτρονικός υπολογιστής Φυσική δομή Η/Υ: Υλικό (hardware) Λειτουργία Η/Υ: Λογισμικό (software) Δυαδικό σύστημα Κωδικοποίηση χαρακτήρων σε αριθμούς: ASCII και Unicode Οργάνωση αρχείων Ερωτήσεις Ασκήσεις Αλγόριθμοι και Προγραμματισμός Αλγόριθμοι Γλώσσες προγραμματισμού Δημιουργία ενός προγράμματος Ερωτήσεις Ασκήσεις Το περιβάλλον και ο τρόπος λειτουργίας του MATLAB Το περιβάλλον του MATLAB Ο τρόπος λειτουργίας του MATLAB Χρήσιμες συντομεύσεις πληκτρολογίου Συνοπτική παρουσίαση εντολών γενικής χρήσης του MATLAB: general Ερωτήσεις Βασικά στοιχεία προγραμματισμού Στοιχεία του κώδικα ενός προγράμματος Μεταβλητές Τελεστές και Πράξεις Συνοπτική παρουσίαση τελεστών και ειδικών χαρακτήρων του MATLAB: ops Ερωτήσεις Ασκήσεις Βασικές εντολές Γενικά Εντολή ανάθεσης Εντολές μορφοποίησης του Command Window Εντολές μεταβλητών Εντολές εισόδου δεδομένων από τo πληκτρολόγιο Εντολές εξόδου αποτελεσμάτων στην οθόνη (στο Command Window) Ερωτήσεις Ασκήσεις Εντολές διακλάδωσης της ροής του προγράμματος Εντολή επιλογής IF Εντολή επιλογής SWITCH Συνοπτική παρουσίαση εντολών προγραμματισμού του MATLAB: lang Ερωτήσεις Ασκήσεις Επαναληπτικοί βρόχοι... 47

4 7.1 Εντολή επανάληψης FOR Εντολή επανάληψης WHILE Εντολή διακοπής επαναληπτικού βρόχου: BREAK Εντολή μετάβασης στην επόμενη επανάληψη βρόχου: CONTINUE Συνοπτική παρουσίαση εντολών προγραμματισμού του MATLAB: lang Μεταβλητές συγκεκριμένης χρήσης Βασικά παραδείγματα εφαρμογής εντολών επιλογής και επανάληψης Ερωτήσεις Ασκήσεις Πίνακες Γενικά για τους πίνακες Μονοδιάστατοι πίνακες Δισδιάστατοι πίνακες Συναρτήσεις πινάκων Σύγκριση ισότητας πινάκων Συνοπτική παρουσίαση απλών εντολών χειρισμού πινάκων του MATLAB: elmat Ερωτήσεις Ασκήσεις Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Τελεστής «'» Τελεστής «:» Αναφορά στα στοιχεία πίνακα με μοναδικό δείκτη Χρήση του ως τελικού δείκτη Δημιουργία πινάκων με χρήση άλλων πινάκων Εύρεση στοιχείων πίνακα υπό συνθήκες. Συνάρτηση find Σύγκριση πινάκων και των στοιχείων τους Συναρτήσεις ταξινόμησης πίνακα Συναρτήσεις και τελεστές χειρισμού πινάκων Αλγεβρικές πράξεις πινάκων Στοιχείο-προς-στοιχείο πολλαπλασιαστικές πράξεις πινάκων στο MATLAB Δημιουργία ειδικών πινάκων Συναρτήσεις εύρεσης συγκεντρωτικών μεγεθών από τα στοιχεία ενός πίνακα Αραιοί (sparse) πίνακες Συνοπτική παρουσίαση εντολών και συναρτήσεων πινάκων και διαδικασιών γραμμικής άλγεβρας με το σύστημα βοηθείας του MATLAB: elmat και matfun Συμβολοσειρές Ανάθεση τιμών συμβολοσειράς Συναρτήσεις συμβολοσειρών Συνοπτική παρουσίαση συναρτήσεων συμβολοσειρών του MATLAB: strfun Ερωτήσεις Ασκήσεις Συναρτήσεις Γενικά: functions και scripts στο MATLAB Τοπικές μεταβλητές Δημιουργία συνάρτησης Κλήση συνάρτησης Έξοδος από συνάρτηση (εντολή return) Υποσυναρτήσεις Σειρά αναζήτησης μιας συνάρτησης από το MATLAB Δομή ενός αρχείου συνάρτησης... 88

5 11.9 Εμφωλευμένες συναρτήσεις (nested functions) Ανώνυμες συναρτήσεις (anonymous functions) Ιδιωτικές συναρτήσεις (private functions) Μεταβλητό πλήθος ορισμάτων εισόδου ή εξόδου σε συναρτήσεις Εφαρμογή συνάρτησης σε πολλαπλές μεταβλητές: arrayfun, structfun, cellfun Ερωτήσεις Ασκήσεις Δομές Απλή δομή Πίνακας Δομών (Structure Array) Ιδιαίτερα είδη δομών του MATLAB: Πίνακες Κελιών (Cell Arrays) Ερωτήσεις Ασκήσεις Αρχεία Είδη αρχείων Άνοιγμα και κλείσιμο αρχείου Αρχεία κειμένου Δυαδικά αρχεία Έλεγχος του δείκτη θέσης σε αρχείο Παραδείγματα τρόπου εργασίας με αρχεία κειμένου Ιδιαίτερες συναρτήσεις του MATLAB για χειρισμό αρχείων Ιδιαίτερες συναρτήσεις του MATLAB για χειρισμό φακέλων Ερωτήσεις Ασκήσεις Γραφικά Γραφικές παραστάσεις Συναρτήσεις παραμετροποίησης γραφημάτων Εικόνες Λήψη συντεταγμένων σημείων γραφήματος Συνοπτική παρουσίαση συναρτήσεων γραφικών του MATLAB: graphics, graph2d, graph3d, specgraph Χρήσιμες συναρτήσεις του MATLAB Εντολές βοήθειας Αρχεία εντολών εκκίνησης και τερματισμού του MATLAB Συναρτήσεις διακοπής και επαναφοράς της ροής του προγράμματος Μαθηματικές συναρτήσεις Συναρτήσεις χρόνου Συναρτήσεις αρχείων Παράλληλη επεξεργασία σε CPUs Πλεονεκτήματα παράλληλης και κατανεμημένης επεξεργασίας matlabpool: Δημιουργία «κοινοπραξίας» για παράλληλη επεξεργασία σε CPUs parfor: Παράλληλο for spmd: Single Program Multiple Data Παράλληλη επεξεργασία στη GPU Απαιτήσεις Προϋποθέσεις Διαδικασία χρήσης GPU από το MATLAB

6 17.4 Ένα απλό παράδειγμα Ένα τεστ χρόνου Βελτιστοποίηση κώδικα Έλεγχος χρόνου εκτέλεσης Εντολές tic - toc Profiler Προδέσμευση πίνακα στη μνήμη (preallocation) Σάρωση πίνακα κατά στήλες Διανυσματοποίηση (vectorization) Παράλληλη επεξεργασία Άλλες τεχνικές επιτάχυνσης χρόνου εκτέλεσης Βελτιστοποίηση μνήμης Σύστημα υποδείξεων σφαλμάτων και βελτίωσης κώδικα MATLAB Αποσφαλμάτωση Είδη σφαλμάτων Συντακτικά σφάλματα Εύρεση του σφάλματος: Διακοπή προγράμματος και απεικόνιση μεταβλητών Εύρεση του σφάλματος: Η λειτουργία αποσφαλμάτωσης του MATLAB Σύστημα υποδείξεων σφαλμάτων και βελτίωσης κώδικα MATLAB Δημιουργία και εκτέλεση αυτόνομης εφαρμογής Δημιουργία αυτόνομης εφαρμογής Εκτέλεση της αυτόνομης εφαρμογής Μετατροπή κώδικα MATLAB σε C/C Από τη C στο MATLAB Γρήγορος οδηγός του MATLAB για προγραμματιστές γλώσσας C Διαφορές και αντιστοιχίες μεταξύ C και MATLAB

7 1.1 Ο ηλεκτρονικός υπολογιστής 1 Γενικά περί Ηλεκτρονικών Υπολογιστών Ο ηλεκτρονικός υπολογιστής είναι μια διάταξη η οποία τροφοδοτείται με ηλεκτρικά σήματα, τα επεξεργάζεται, και εξάγει ως αποτέλεσμα τα επεξεργασμένα σήματα. Με άλλα λόγια, ο υπολογιστής μετασχηματίζει την πληροφορία ή το πληροφοριακό περιεχόμενο ενός σήματος (όπως, για παράδειγμα, μια μηχανή είναι μια διάταξη η οποία μετασχηματίζει την ενέργεια από μια μορφή σε άλλη). Πρόγραμμα ονομάζεται μια σειρά εντολών προς τον υπολογιστή (για την είσοδο των δεδομένων, για την επεξεργασία τους καθώς και για την έξοδο των αποτελεσμάτων), που προετοιμάζονται, ομαδοποιούνται και αποθηκεύονται στον υπολογιστή ώστε να εκτελεστούν όποτε επιθυμεί ο χρήστης του υπολογιστή. Είσοδος Επεξεργασία Έξοδος Καθολικός υπολογιστής: Οι επεξεργαστές των σύγχρονων ηλεκτρονικών υπολογιστών είναι εφοδιασμένοι με κατάλληλες ομάδες εντολών, ώστε να μπορούν θεωρητικά να επιλύσουν οποιοδήποτε αλγοριθμικό πρόβλημα, αρκεί να τροφοδοτηθούν με το κατάλληλο πρόγραμμα. Διατάξεις με αυτήν την ιδιότητα ονομάζονται καθολικοί υπολογιστές. Οι ηλεκτρονικοί υπολογιστές αποτελούνται από το υλικό (hardware) και το λογισμικό (software). Ως υλικό εννοούμε τα φυσικά μέρη από τα οποία αποτελείται ο υπολογιστής, ενώ ως λογισμικό εννοούμε το σύνολο των εντολών με τις οποίες λειτουργεί και επεξεργάζεται τις πληροφορίες. Στην πραγματικότητα το λογισμικό σε στοιχειώδες επίπεδο δεν είναι τίποτε άλλο παρά μεταβολές ηλεκτρικών σημάτων στο υλικό, δηλαδή στα ηλεκτρονικά κυκλώματα του επεξεργαστή και της μνήμης του υπολογιστή. 1.2 Φυσική δομή Η/Υ: Υλικό (hardware) Συσκευές εισόδου: Για εισαγωγή εντολών και δεδομένων (π.χ. πληκτρολόγιο, ποντίκι). Κεντρική μονάδα επεξεργασίας (Central Processing Unit, CPU): Για την επεξεργασία των δεδομένων, μέσω των εντολών του προγράμματος. Η επεξεργασία γίνεται από τον επεξεργαστή με τη βοήθεια της κύριας μνήμης (μνήμη RAM, Random Access Memory). Η μνήμη RAM είναι προσωρινή, δηλ. τα δεδομένα της χάνονται με διακοπή της τροφοδοσίας. Συσκευές εξόδου: Για την έξοδο των αποτελεσμάτων (π.χ. οθόνη, εκτυπωτής). Μόνιμα αποθηκευτικά μέσα: Για τη μόνιμη αποθήκευση των προγραμμάτων, των δεδομένων εισόδου και των αποτελεσμάτων εξόδου (π.χ. μαγνητικά μέσα: σκληρός δίσκος, δισκέτα, μνήμες τύπου flash, ψηφιακές ταινίες, ή οπτικά μέσα: CD, DVD, BLU RAY). Στους σύγχρονους προσωπικούς Η/Υ οι σκληροί δίσκοι χρησιμεύουν επίσης και για «εικονική» αύξηση της μνήμης RAM (παρόμοια δυνατότητα υπάρχει και στις μνήμες τύπου USB flash). Τα μόνιμα αποθηκευτικά μέσα χρησιμεύουν τόσο ως συσκευές εισόδου όσο και ως συσκευές εξόδου. Συσκευές εισόδου (πληκτρολόγιο, ποντίκι) Μονάδα επεξεργασίας (επεξεργαστής, κύρια μνήμη RAM) Μόνιμα αποθηκευτικά μέσα (σκληρός δίσκος) Συσκευές εξόδου (οθόνη, εκτυπωτής)

8 8 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 1.3 Λειτουργία Η/Υ: Λογισμικό (software) BIOS: Κατά την εκκίνηση του υπολογιστή τον έλεγχο αναλαμβάνει ένα μικρό κομμάτι βασικών εντολών που ελέγχουν την καλή λειτουργία των βασικών υποσυστημάτων εισόδου και εξόδου του υπολογιστή. Οι αρχικές αυτές βασικές εντολές αποτελούν το BIOS (Basic Input-Output System), το οποίο είναι αποθηκευμένο σε ένα τμήμα μιας μικρής μόνιμης μνήμης (μνήμη ROM, Read Only Memory). Λειτουργικό σύστημα: Στη συνέχεια τον έλεγχο αναλαμβάνει το λειτουργικό σύστημα, το βασικότερο κομμάτι του λογισμικού των σύγχρονων ηλεκτρονικών υπολογιστών. Ο ρόλος του λειτουργικού συστήματος είναι (α) να ελέγχει τη ροή των δεδομένων από και προς τις συσκευές εισόδου-εξόδου, τον επεξεργαστή, την κύρια μνήμη και τα μόνιμα αποθηκευτικά μέσα, (β) να φροντίζει για την ορθή επικοινωνία των υπόλοιπων προγραμμάτων με τον υπολογιστή, και (γ) να συντονίζει την επικοινωνία με άλλους υπολογιστές (δίκτυα υπολογιστών). Οι περισσότεροι προσωπικοί υπολογιστές χρησιμοποιούν σήμερα το λειτουργικό σύστημα Microsoft Windows. Ένα από τα παλαιότερα και ισχυρότερα λειτουργικά συστήματα είναι το Unix που, μαζί με την παραλλαγή του Linux, χρησιμοποιείται μέχρι και σήμερα, από προσωπικούς υπολογιστές για ακαδημαϊκή έρευνα μέχρι πολύ ισχυρούς υπολογιστές ιδιαίτερα απαιτητικών εφαρμογών. Προγράμματα εφαρμογών: Το ανώτερο τμήμα της λειτουργίας του υπολογιστή είναι τα προγράμματα εφαρμογών που απευθύνονται στον τελικό χρήστη του υπολογιστή. Ως παραδείγματα εφαρμογών μπορούν να αναφερθούν: Εφαρμογές γραφείου (που περιλαμβάνουν προγράμματα επεξεργασίας κειμένου, λογιστικών φύλλων και παρουσιάσεων). Προγράμματα προβολής και επεξεργασίας εικόνας, κινούμενης εικόνας (video) και ήχου. Γλώσσες προγραμματισμού (δηλαδή προγράμματα δημιουργίας νέων προγραμμάτων). ΛΟΓΙΣΜΙΚΟ (SOFTWARE) Εφαρμογές τελικού χρήστη Λειτουργικό σύστημα B.I.O.S. ΥΛΙΚΟ (HARDWARE) Συσκευές εισόδου CPU Συσκευές εξόδου HD RAM

9 Γενικά περί Ηλεκτρονικών Υπολογιστών Δυαδικό σύστημα Στο σύνηθες σύστημα αρίθμησης, που έχει βάση το 10, κάθε αριθμός απεικονίζεται ως μια σειρά ψηφίων (από 0 έως 9) που καθένα πολλαπλασιάζεται με μια δύναμη του 10. Παράδειγμα: 5204 = = Παρόμοια, σε ένα σύστημα αρίθμησης με βάση το 2, ένας αριθμός απεικονίζεται ως μια σειρά ψηφίων (0 ή 1) που καθένα πολλαπλασιάζεται με μια δύναμη του 2. Παράδειγμα: 13 = = = 1101 (2). Η λειτουργία του υπολογιστή στηρίζεται στο δυαδικό σύστημα αρίθμησης, διότι εσωτερικά ο υπολογιστής λειτουργεί με σειρές ηλεκτρικών σημάτων, που για λόγους απλότητας σχεδιασμού και μεγαλύτερης αξιοπιστίας είναι αποκλειστικά δύο ειδών («απουσία» ή «παρουσία» ρεύματος ή τάσης, π.χ. 0Volt ή +5Volt) που συμβολίζονται ως 0 ή 1. Bits & Bytes: Bit (σύμβολο b, binary digit, δυαδικό ψηφίο), ονομάζεται κάθε ένα από τα ψηφία 0 ή 1. Byte (σύμβολο Β) ονομάζεται μια ακολουθία από 8 bit: 1 Byte = 8 bit (1B = 8b). Για τα πολλαπλάσια του bit συνήθως χρησιμοποιείται το 1000, ενώ για τα πολλαπλάσια του Byte συνήθως χρησιμοποιείται το 1024 (που τυπικά λέγεται Kibi (kilo binary) και αρχικά είχε επιλεχθεί γιατί είναι δύναμη του 2 (1024=2 10 ), ενώ ταυτόχρονα είναι κοντά στο 1000): Πολλαπλάσια bit (b) Byte (B) Kilo (k) 1 kb = 1000 b = 10 3 b 1 KiB = 1024 B = 2 10 B Mega (M) 1 Mb = 1000 kb = 10 6 b 1 MiB = 1024 kib = 2 20 B Giga (G) 1 Gb = 1000 Mb = 10 9 b 1 GiB = 1024 MiB = 2 30 B Tera (T) 1 Tb = 1000 Gb = b 1 TiB = 1024 GiB = 2 40 B Π.χ. Σε σύνδεση ADSL ταχύτητας 1024 kbps, η ταχύτητα μεταφοράς είναι 1024 kbits per sec, δηλαδή bits/sec = /8 Bytes/sec = B/s = /1024 kib/s = 125 kib/s Μετατροπή από δυαδικό σε δεκαδικό σύστημα αρίθμησης: Τα ψηφία 0/1 σε ένα δυαδικό αριθμό πολλαπλασιάζονται με διαδοχικές δυνάμεις του 2, ξεκινώντας από τη δύναμη 0 στο δεξί μέρος. Παράδειγμα: Μετατροπή του δυαδικού σε δεκαδική μορφή: (2) = = = 105 (10) Μετατροπή από δεκαδικό σε δυαδικό σύστημα αρίθμησης: 1 ος τρόπος: Γράφουμε τις δυνάμεις του 2 (με αντίστροφη σειρά) και στη συνέχεια βρίσκουμε ποιες από αυτές τις δυνάμεις πρέπει να προσθέσουμε για να σχηματίσουμε τον αριθμό. Στις θέσεις αυτών των δυνάμεων βρίσκεται το ψηφίο «1», και στις θέσεις των υπόλοιπων συνάμεων το ψηφίο «0». Παράδειγμα: Μετατροπή του δεκαδικού 105 σε δυαδική μορφή: Γράφουμε τις δυνάμεις του 2 με αντίστροφη σειρά, και μετά γράφουμε «1» κάτω από όσες πρέπει να προσθέσουμε για να σχηματιστεί το 105 και «0» κάτω από τις υπόλοιπες: Ή, αλλιώς: 105 (10) = = = (2)

10 10 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 2 ος τρόπος: Ο αριθμός, και στη συνέχεια τα διαδοχικά πηλίκα, διαιρούνται συνεχώς με το 2 μέχρι το πηλίκο να γίνει 0. Τότε τα διαδοχικά υπόλοιπα των διαιρέσεων, σε αντίστροφη σειρά, είναι ο αριθμός σε δυαδική μορφή. Παράδειγμα: Μετατροπή του 13 σε δυαδική μορφή: Το 13, και μετά τα διαδοχικά πηλίκα, διαιρούνται με το 2. Τα πηλίκα γράφονται από κάτω και τα διαδοχικά υπόλοιπα δεξιά. Όταν το πηλίκο γίνει 0, η δυαδική αναπαράσταση του αριθμού είναι η δεξιά στήλη, σε αντίστροφη σειρά: 13 (10) = 1101 (2) Συνήθως χρησιμοποιούνται πολλαπλάσια του 1 Byte (δηλ. των 8 bits), οπότε αν χρειαστεί συμπληρώνουμε με 0, δηλαδή ο παραπάνω αριθμός γράφεται ως (2), δηλαδή: (2) = = 13 (10) Οκταδικό και Δεκαεξαδικό σύστημα Η ανάλυση σε δυνάμεις βάσης εφαρμόζεται σε όλα τα θεσιακά συστήματα αρίθμησης (όπως στο δεκαδικό σύστημα, π.χ = ), δηλαδή σε αυτά στα οποία η θέση ενός ψηφίου καθορίζει την «αξία» του, και συγκεκριμένα τον εκθέτη της δύναμης με την οποία πολλαπλασιάζεται (σε αντίθεση π.χ. με το ρωμαϊκό σύστημα αρίθμησης: XII = 12, XIV = 14, C = 100, ). Κάθε αριθμός μπορεί να εκφραστεί σε σύστημα αρίθμησης οποιασδήποτε βάσης (Ν). Τότε, η απεικόνιση του αριθμού γίνεται με μια σειρά ψηφίων (από 0 έως Ν-1), που καθένα πολλαπλασιάζεται με μια δύναμη του Ν. Στον προγραμματισμό, εκτός από το δυαδικό, χρησιμοποιούνται επίσης το οκταδικό (octal) και το δεκαεξαδικό σύστημα (hexadecimal, hex): Οκταδικό σύστημα: Τα 8 ψηφία του είναι τα 0, 1, 2, 3, 4, 5, 6, 7. Π.χ.: 204 (10) = = 314 (8) Δεκαεξαδικό σύστημα: Απαιτούνται 16 ψηφία (από 0 έως 15), έτσι χρησιμοποιούνται τα συνήθη ψηφία 0 έως 9, καθώς και τα λατινικά γράμματα A έως F ως σύμβολα των 10 έως 15. Δηλαδή, τα 16 ψηφία του είναι τα 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Π.χ.: (10) = = 2A31F (16)

11 Γενικά περί Ηλεκτρονικών Υπολογιστών Κωδικοποίηση χαρακτήρων σε αριθμούς: ASCII και Unicode Ο ηλεκτρονικός υπολογιστής είναι ένας αριθμητικός υπολογιστής. Έτσι, η απεικόνιση των χαρακτήρων (γράμματα του αλφαβήτου, σύμβολα των αριθμητικών ψηφίων, σημεία στίξης) στην οθόνη, στον εκτυπωτή κλπ γίνεται μέσω της αντιστοίχισής τους σε αριθμούς. ASCII: Το γνωστότερο διεθνές πρότυπο κωδικοποίησης χαρακτήρων σε αριθμούς είναι μέσω του κώδικα ASCII (American Standard Code for Information Interchange), ο οποίος χρησιμοποιεί 7 bits, αντιστοιχώντας έτσι συνολικά 2 7 =128 χαρακτήρες ή σύμβολα στους α- ριθμούς 0 έως 127. Στις θέσεις 0 έως 31 και 127 βρίσκονται οι λεγόμενοι μη εκτυπώσιμοι χαρακτήρες του κώδικα ASCII, οι οποίοι αντιστοιχούν σε στοιχειώδεις λειτουργίες (π.χ.: 0=null character, 7=bell, 8=backspace, 9=tab, 10=line feed, 13=carriage return, 27=escape, 127=delete). Στις υπόλοιπες θέσεις, 32 έως 126, βρίσκονται οι εκτυπώσιμοι χαρακτήρες του πίνακα ASCII, οι οποίοι είναι τα πεζά και κεφαλαία γράμματα του λατινικού αλφαβήτου (a z, A Z), τα αριθμητικά ψηφία (0 9) και διάφορα άλλα σύμβολα (σημεία στίξης, παρενθέσεις, σύμβολα αριθμητικών πράξεων κλπ), όπως φαίνεται στον παρακάτω πίνακα: 32 (space) F 89 Y 108 l 33! G 90 Z 109 m 34 " H 91 [ 110 n 35 # I 92 \ 111 o 36 $ J 93 ] 112 p 37 % K 94 ^ 113 q 38 & L 95 _ 114 r 39 ' 58 : 77 M 96 ` 115 s 40 ( 59 ; 78 N 97 a 116 t 41 ) 60 < 79 O 98 b 117 u 42 * 61 = 80 P 99 c 118 v > 81 Q 100 d 119 w 44, 63? 82 R 101 e 120 x 83 S 102 f 121 y A 84 T 103 g 122 z 47 / 66 B 85 U 104 h 123 { C 86 V 105 i D 87 W 106 j 125 } E 88 X 107 k 126 ~ Exted ASCII: Επέκταση του ASCII αποτελεί το Exted ASCII, που χρησιμοποιεί 8 bits (επομένως έχει δυνατότητα για αντιστοίχιση 2 8 =256 θέσεων). Οι πρώτες 128 (0-127) θέσεις του Exted ASCII έχουν την ίδια αντιστοίχιση με αυτήν του 7-bit ASCII, ενώ οι θέσεις 128 έως 255 εκχωρούνται σε επιπλέον χαρακτήρες αλφαβήτων άλλων γλωσσών και α- πλών γραφικών συμβόλων. Το Exted ASCII αναφέρεται πλέον απλά ως ASCII. Unicode: Πλήρης λύσης για την κωδικοποίηση των χαρακτήρων όλων των διεθνών αλφαβήτων, καθώς και πάρα πολλών επιπλέον συμβόλων, δόθηκε με την κωδικοποίηση Unicode. Η κωδικοποίηση Unicode είναι 16-bit κι έτσι μπορεί να κωδικοποιήσει συνολικά 2 16 =65536 χαρακτήρες ή σύμβολα. Για παράδειγμα, οι χαρακτήρες του ελληνικού μονοτονικού αλφαβήτου βρίσκονται στις θέσεις , το σύμβολο του ευρώ ( ) στη θέση 8364 κλπ. Παρά την ύπαρξη του Unicode ως διεθνούς προτύπου, υπάρχουν ακόμη προβλήματα εμφάνισης λανθασμένων χαρακτήρων σε αρκετές περιπτώσεις, λόγω κατασκευής πολλών προγραμμάτων λογισμικού ως μη συμβατών με το Unicode.

12 12 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 1.6 Οργάνωση αρχείων Ένα αρχείο είναι μια ομάδα πληροφοριών αποθηκευμένη με ένα όνομα σε κάποιο αποθηκευτικό μέσο. Ονόματα αρχείων Τα ονόματα των αρχείων αποτελούνται από δύο μέρη, το κυρίως όνομα και την επέκταση, που χωρίζονται μεταξύ τους από μία τελεία (.). Η επέκταση χρησιμοποιείται από εμάς και από τα προγράμματα για τη διάκριση του είδους του αρχείου. Στο λειτουργικό σύστημα MS-DOS, το κυρίως όνομα πρέπει να είναι από 1 μέχρι 8 χαρακτήρες και η επέκταση από 0 μέχρι 3 χαρακτήρες. Οι χαρακτήρες του ονόματος ή της επέκτασης μπορεί να είναι λατινικά γράμματα (a z, A Z), ψηφία (0 9) ή σύμβολα (όλοι οι εκτυπώσιμοι χαρακτήρες του 7-bit ASCII, εκτός από τα \ / : *? " < >. και το κενό διάστημα (space), το οποίο πολλές φορές στα γραπτά κείμενα το συμβολίζουμε ως ). Στο λειτουργικό σύστημα Microsoft Windows ο μόνος περιορισμός μήκους χαρακτήρων είναι ότι το κυρίως όνομα μαζί με την επέκταση αλλά και μαζί με τη λογική διαδρομή -pathαποθήκευσής του στο δίσκο είναι μέχρι 255 χαρακτήρες. Επιπλέον, επιτρέπονται σχεδόν όλοι οι εκτυπώσιμοι χαρακτήρες του Unicode, όπως και οι ελληνικοί ή άλλων γλωσσών χαρακτήρες, η τελεία (.) και το κενό διάστημα, με εξαίρεση τους \ / : *? " < > οι οποίοι α- παγορεύονται. Το DOS και τα Windows δεν κάνουν διάκριση μεταξύ πεζών και κεφαλαίων γραμμάτων στα ονόματα των αρχείων (σε αντίθεση π.χ. με τα Unix και Linux). Είδη αρχείων Εκτελέσιμα αρχεία: Είναι αρχεία εντολών προς τον υπολογιστή. Η επέκτασή τους είναι συνήθως.exe ή.com («προγράμματα», executables, commands),.bat (batch files ή αρχεία δέσμης, περιέχουν μια ομάδα («δέσμη») απλών εντολών του λειτουργικού συστήματος), κλπ. Βοηθητικά αρχεία: Είναι αρχεία υποβοηθητικά για τη λειτουργία των προγραμμάτων ή του λειτουργικού συστήματος. Αρχεία δεδομένων: Είναι αρχεία που δημιουργούνται από εμάς συνήθως, με τη βοήθεια ενός εκτελέσιμου αρχείου (προγράμματος). Η κατάληξή τους, για λόγους οργάνωσης και ευκολίας, εξαρτάται από το πρόγραμμα που τα δημιούργησε και που μπορεί να τα αναγνώσει και τα εμφανίσει τα περιεχόμενά τους. Παραδείγματα:.DOC: Έγγραφα (documents), από το MS-Word..PDF: Έγγραφα (documents), από το Adobe Acrobat..XLS: Λογιστικά φύλλα (spreadsheets), από το MS-Excel..TXT: Αρχεία απλού κειμένου (plain text). Μπορούν να δημιουργηθούν και να αναγνωστούν από απλά προγράμματα που λέγονται διορθωτές (editors), όπως π.χ. το Notepad..C: Κώδικας προγράμματος γλώσσας προγραμματισμού C. Είναι απλό αρχείο κειμένου και μπορεί να δημιουργηθεί από απλό διορθωτή, όπως το Notepad, ή συνηθέστερα από το διορθωτή ενός περιβάλλοντος για ανάπτυξη προγραμμάτων σε γλώσσα C..M: Κώδικας προγράμματος γλώσσας προγραμματισμού MATLAB. Είναι απλό αρχείο κειμένου και μπορεί να δημιουργηθεί από απλό διορθωτή, όπως το Notepad, ή συνηθέστερα από το διορθωτή του περιβάλλοντος MATLAB..HTML: Αρχείο ιστοσελίδας. Είναι απλό αρχείο κειμένου και μπορεί να δημιουργηθεί από απλό διορθωτή, όπως το Notepad, ή συνηθέστερα από πιο εξειδικευμένα προγράμματα

13 Γενικά περί Ηλεκτρονικών Υπολογιστών 13 (π.χ. FrontPage, DreamWeaver), ενώ αναπαράγεται με τα προγράμματα πλοήγησης στο διαδίκτυο (π.χ. Internet Explorer, Mozilla Firefox, Chrome, Opera, Safari)..BMP,.JPG,.TIF, GIF: Αρχεία εικόνων. Δημιουργούνται και διαβάζονται από προγράμματα επεξεργασίας εικόνων, όπως το Paint ή το Adobe Photoshop, ή από τα προγράμματα που χειρίζονται τις συσκευών εισόδου εικόνας (ψηφιακές κάμερες κλπ)..wav,.mp3: Αρχεία ήχου. Δημιουργούνται συνήθως από τα προγράμματα που χειρίζονται τις συσκευές εισόδων ήχου (μικρόφωνο κλπ) και αναπαράγονται ή επεξεργάζονται από κατάλληλα προγράμματα (Windows Media Player, WinAmp κλπ)..avi,.mpg,.mp4: Αρχεία video. Δημιουργούνται συνήθως από τα προγράμματα που χειρίζονται τις συσκευές εισόδων ήχου και εικόνας και αναπαράγονται ή επεξεργάζονται από κατάλληλα προγράμματα (Windows Media Player, QuickTime κλπ). Μορφή αρχείων Αρχεία κειμένου (text files): Περιέχουν απλό κείμενο χωρίς καμία μορφοποίηση (π.χ. αρχεία με κατάληξη.bat,.txt,.c,.m,.html), με απλούς χαρακτήρες του κώδικα ASCII. Δυαδικά αρχεία (binary files): Οι πληροφορίες που περιέχουν είναι σε στοιχειώδη δυαδική μορφή, μη αναγνώσιμη με άμεσο ή απλό τρόπο. Αν είναι εκτελέσιμα αρχεία (με επέκταση π.χ..exe), δεν μπορούμε να δούμε τις εντολές που περιέχουν, παρά μόνο να τα εκτελέσουμε και να δούμε το αποτέλεσμα. Αν είναι αρχεία δεδομένων (π.χ. με επεκτάσεις.doc,.xls,.pdf) μπορούμε να δούμε τα περιεχόμενά τους μόνο με το κατάλληλο πρόγραμμα που τα δημιούργησε ή που μπορεί να αναγνωρίσει την κωδικοποίηση των πληροφοριών τους (MS- Word, MS-Excel, Adobe Acrobat αντίστοιχα). Σύστημα οργάνωσης αρχείων Μόνιμα αποθηκευτικά μέσα: Τα αρχεία αποθηκεύονται μόνιμα σε μαγνητικούς δίσκους όπως σκληρούς δίσκους και (πολύ σπάνια πλέον) εύκαμπτες δισκέτες, σε οπτικούς δίσκους όπως CD και DVD εγγραφής (R) ή μόνο ανάγνωσης (ROM), σε μαγνητοοπτικούς δίσκους όπως CD και DVD επανεγγραφής (RW), σε μνήμες flash (USB sticks, SSD) ή σε μαγνητικές ταινίες. Τα ονόματα των μόνιμων αποθηκευτικών μέσων αποτελούνται από έναν λατινικό χαρακτήρα (πεζό ή κεφαλαίο) ακολουθούμενο από άνω-κάτω τελεία (:). Παραδείγματα: A:, B: Δισκέτα (Floppy disk, FDD). Χωρητικότητα 1.44MB (σχεδόν σε αχρηστία πλέον). C: Δίσκος συστήματος (σκληρός δίσκος, hard disk drive, HDD, π.χ. 80GB - 2TB ή «δίσκος» SSD, solid state drive, 32GB-256GB). Στο δίσκο αυτό εγκαθίσταται συνήθως το λειτουργικό σύστημα και οι εφαρμογές. D:, E:, F:, Z: Επιπλέον σκληροί δίσκοι ή SSD, συσκευές ανάγνωσης για CD ( MB) και για DVD (4.77GB, σπανιότερα 2 επιπέδων ή και 2 πλευρών), μνήμες flash (π.χ. 256MB- 32GB, συνήθως συνδεόμενες στις θύρες USB), ψηφιακές μαγνητικές ταινίες (digital tapes). Φάκελοι: Για καλύτερη οργάνωση, τα αρχεία ομαδοποιούνται σε φακέλους (folders, στα Windows) ή καταλόγους (directories, παλαιότερη ονομασία προερχόμενη από το λειτουργικό σύστημα MS-DOS). Τα ονόματα των φακέλων ακολουθούν τους ίδιους κανόνες με τα ονόματα των αρχείων (π.χ. 8+3 στο MS-DOS ή 255 χαρακτήρες στα Windows). Παλαιότερα για λόγους εύκολου διαχωρισμού συνήθως τους δινόταν όνομα με κεφαλαία γράμματα και χωρίς επέκταση (π.χ. MSDOS, WINDOWS, WINNT, SYSTEM κλπ), χωρίς αυτό να είναι υποχρεωτικό (π.χ. My Documents, Program Files κλπ). Η δομή των καταλόγων/φακέλων είναι «δενδροειδής». Ο αρχικός φάκελος λέγεται ριζικός (root) και συμβολίζεται με το σύμβολο «\» (ανάποδη κάθετος, backslash). Το ίδιο σύμβολο χρησιμοποιείται για να χωρίζουν και οι υποφάκελοι μεταξύ τους. Η ακολουθία των υποφακέλων λέγεται διαδρομή (path).

14 14 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Π.χ. Έστω η δομή φακέλων του διπλανού σχήματος. Στην περίπτωση αυτή υπάρχουν οι εξής κατάλογοι: C:\ C:\ (root) Windows C:\Windows\ C:\Program Files\ C:\Program Files\Matlab71\ C:\Program Files\Matlab71\work\ C:\My Documents\ C:\My Documents\Letters\ C:\My Documents\Photos\ Program Files Matlab71 My Documents work Letters Photos Βασικές εντολές γραμμής εντολών (command prompt) περιβάλλοντος Windows Η είσοδος σε περιβάλλον γραμμής εντολών στα Windows γίνεται από το κουμπί έναρξης των Windows > All Programs > Accessories > Command Prompt. Εντολές φακέλων (καταλόγων): Ο τρέχων φάκελος/κατάλογος (current folder/directory) συμβολίζεται με μια τελεία (.), ενώ ο φάκελος του αμέσως ανωτέρω επιπέδου (parent folder) με δύο τελείες (..). dir = εμφάνιση στην οθόνη μιας λίστας των ονομάτων των αρχείων και των υποφακέλων που περιέχει ο τρέχων φάκελος (κατάλογος, directory). md (make directory) = δημιουργία ενός φακέλου. rd (remove directory) = διαγραφή ενός (άδειου, για λόγους ασφαλείας) φακέλου. cd (change directory) = αλλαγή του τρέχοντος φακέλου. Π.χ.1: dir *.txt = εμφάνιση των αρχείων με επέκταση.txt Π.χ.2: Αν είμαστε στο C:\DATA\ και δώσουμε md LETTERS και μετά cd LETTERS, τότε θα βρεθούμε στον C:\DATA\LETTERS\. Με cd.. θα βρεθούμε ξανά στο C:\DATA\ Εντολές αρχείων: Ο χαρακτήρας «?» χρησιμοποιείται για να δηλώσει μόνο έναν οποιονδήποτε χαρακτήρα, ενώ ο χαρακτήρας «*» χρησιμοποιείται για να δηλώσει οποιουσδήποτε/οσουσδήποτε χαρακτήρες. Π.χ.: *.txt = όλα τα αρχεία με επέκταση.txt, *.* = όλα τα αρχεία (με οποιαδήποτε επέκταση), *. = όλα τα αρχεία χωρίς επέκταση May*.doc = May1.doc, May2.doc, May14.doc, MayLettr.doc, κλπ. May??.doc = May01.doc, May_K.doc κλπ. (αλλά όχι May1.doc, MayLettr.doc κλπ.) copy = αντιγραφή αρχείων (π.χ. copy *.txt a:\ σημαίνει αντιγραφή όλων των αρχείων με επέκταση.txt στη δισκέτα a:, ενώ copy c:\programs\prog1.m. σημαίνει α- ντιγραφή του prog1.txt από το φάκελο c:\programs\ στον τρέχοντα φάκελο ) del = διαγραφή αρχείων. Π.χ. del *.* σημαίνει διαγραφή όλων των αρχείων του τρέχοντος φακέλου. ren = μετονομασία αρχείων. Π.χ. ren john.doc john1.doc (προφανής μετονομασία), ενώ ren *.txt *.m σημαίνει μετονομασία όλων των αρχείων με επέκταση.txt σε αρχεία με το ίδιο όνομα αλλά με επέκταση.m (εντολή κατάλληλη για μαζική αλλαγή επέκτασης).

15 Γενικά περί Ηλεκτρονικών Υπολογιστών 15 Ερωτήσεις 1.1 Τι είναι ένας υπολογιστής, και τι ένας καθολικός υπολογιστής; 1.2 Από ποια γενικά τμήματα αποτελείται η φυσική δομή (hardware) ενός ηλεκτρονικού υπολογιστή, και ποιος ο ρόλος του καθενός; 1.3 Από ποια γενικά τμήματα αποτελείται το λογισμικό (software) ενός ηλεκτρονικού υπολογιστή, και ποιος ο ρόλος του καθενός; 1.4 Τι ονομάζουμε bit και τι byte; 1.5 Να αναφερθούν 4 πολλαπλάσια του bit και του byte. 1.6 Τι είναι τα θεσιακά συστήματα αρίθμησης; Να αναφερθούν 3 παραδείγματα. 1.7 Τι είναι η κωδικοποιήσεις ASCII και Unicode; Πόσα bits χρησιμοποιούν τα ASCII, Exted ASCII και Unicode, και κατά συνέπεια πόσοι είναι οι χαρακτήρες που μπορούν να κωδικοποιηθούν σε αυτά; 1.8 Ποια είναι τα γενικά είδη των ηλεκτρονικών αρχείων; Σε ποιες μορφές μπορούν να είναι αποθηκευμένα τα περιεχόμενα των αρχείων; 1.9 Να περιγρεφεί συνοπτικά η δομή του συστήματος αρχείων των συνηθισμένων λειτουργικών συστημάτων (DOS, Windows, Unix, Linux κλπ) Οι χαρακτήρες * και? είναι επιτρεπτοί για χρήση σε ονόματα αρχείων; Τι αντιπροσωπεύουν αυτοί οι χαρακτήρες, όταν χρησιμοποιούνται σε εντολές του λειτουργικού συστήματος που αναφέρονται σε ονόματα αρχείων; Ασκήσεις 1.11 Να βρεθούν οι δεκαδικές αναπαραστάσεις των παρακάτω αριθμών του δυαδικού συστήματος: , 101, 00101, Να βρεθούν οι δυαδικές αναπαραστάσεις των παρακάτω αριθμών του δεκαδικού συστήματος (οι δυαδικοί αριθμοί να γραφτούν με 8 bits = 1 Byte): 128, 255, 0, Να βρεθούν οι δεκαδικές αναπαραστάσεις των παρακάτω αριθμών του δεκαεξαδικού συστήματος: 0, 1, 9, A, F, 10, 11, 12, 19, 1A, 1F, 20, 2A, FF 1.14 Να βρεθούν οι δεκαεξαδικές αναπαραστάσεις των παρακάτω αριθμών του δεκαδικού συστήματος: 0, 15, 16, 255, 256

16 2.1 Αλγόριθμοι Αλγόριθμοι και προγραμματισμός 2 Αλγόριθμοι και Προγραμματισμός Αλγόριθμος είναι μια πεπερασμένη σειρά βημάτων για την επίλυση ενός προβλήματος. Ο προγραμματισμός δεν είναι παρά η κατάλληλη «μετάφραση» ενός αλγορίθμου στις ε- ντολές μιας γλώσσας προγραμματισμού. Ή αλλιώς, ένα πρόγραμμα είναι πάντα η «υλοποίηση» ενός αλγορίθμου στον υπολογιστή. Για παράδειγμα, η υλοποίηση του βήματος «τύπωσε στην οθόνη τη λέξη Hello!» στη γλώσσα προγραμματισμού του MATLAB μπορεί να γίνει με την εντολή: fprintf('hello!'); Βασικά στοιχεία αλγορίθμων Τα βασικά στοιχεία ενός αλγορίθμου, με τα οποία αποδεικνύεται ότι μπορεί να λυθεί οποιοδήποτε πρόβλημα (και μπορούν να χρησιμοποιηθούν κατά την δημιουργία οποιουδήποτε προγράμματος), είναι: 1. Ανάθεση 2. Επιλογή 3. Επανάληψη Τα παραπάνω στοιχεία εφαρμόζονται και στα 3 τμήματα ενός προγράμματος, δηλαδή στην είσοδο των δεδομένων, στην επεξεργασία τους και στην έξοδο των αποτελεσμάτων. Παράδειγμα: Επίλυση πρωτοβάθμιας εξίσωσης: Ανάθεση Θέσε την τιμή της μεταβλητής a ίση με 3. Είσοδος Ανάθεση Θέσε την τιμή της μεταβλητής b ίση με 12. Είσοδος Επιλογή Αν a 0, Ανάθεση Επιλογή Αν a=0, Επιλογή Θέσε στη μεταβλητή x το πηλίκο -b/a. Τύπωσε στην οθόνη την τιμή της x. Επεξεργασία Έξοδος Αν b=0, τύπωσε στην οθόνη το μήνυμα «Η εξίσωση Έξοδος είναι αόριστη». Επιλογή Αν b 0, τύπωσε στην οθόνη το μήνυμα «Η εξίσωση Έξοδος είναι αδύνατη». Άσκηση: Να κατασκευαστεί παρόμοιος αλγόριθμος που να επιλύει τη δευτεροβάθμια εξίσωση. Παράδειγμα: Εύρεση του αθροίσματος S των ακεραίων από 1 έως N: Ανάθεση Ζήτησε από το πληκτρολόγιο έναν θετικό ακέραιο και θέσε την Είσοδος τιμή του στη μεταβλητή N. Ανάθεση Θέσε στη μεταβλητή S την αρχική τιμή 0. Επεξεργασία Επανάληψη Επανάλαβε την παρακάτω διαδικασία θέτοντας διαδοχικά την τιμή της μεταβλητής i από 1 έως N Ανάθεση Θέσε στη μεταβλητή S την προηγούμενη τιμή της Επεξεργασία αυξημένη κατά i Τύπωσε την τιμή της μεταβλητής S. Έξοδος Άσκηση: Να βελτιωθεί ο παραπάνω αλγόριθμος, ώστε η ακολουθία να ξεκινάει από οποιοδήποτε ακέραιο k και να προχωράει με οποιοδήποτε βήμα a. Τα k και a πρέπει να δίνονται από το πληκτρολόγιο, όπως το N (στο προηγούμενο παράδειγμα ήταν k=1 και a=1).

17 Το περιβάλλον προγραμματισμού του MATLAB Γλώσσες προγραμματισμού Γλώσσα προγραμματισμού είναι ένα σύνολο εντολών, από τις οποίες επιλέγονται όσες α- παιτούνται και τοποθετούνται με κατάλληλη σειρά κατά τη συγγραφή ενός προγράμματος. Γλώσσα μηχανής είναι ο τρόπος ελέγχου του υπολογιστή με σειρές δυαδικών ψηφίων (0 ή 1). Όπως καταλαβαίνουμε, ακόμα και οι απλούστερες εντολές προς τον υπολογιστή δημιουργούν πολύ μακρές σειρές δυαδικών ψηφίων, με αποτέλεσμα να είναι πρακτικά αδύνατος ο προγραμματισμός σε γλώσσα μηχανής. Για το λόγο αυτό, είναι αναγκαίος ο συμβολισμός των εντολών σε μια «γλώσσα» πιο κατανοητή και πιο εύχρηστη από τον άνθρωπο. Assembly είναι μια συμβολική γλώσσα για τον έλεγχο του υπολογιστή, στην οποία γίνεται απ ευθείας αντιστοίχιση των βασικότερων εντολών της γλώσσας μηχανής σε πιο εύχρηστα σύμβολα. Το αποτέλεσμα ενός προγράμματος σε assembly είναι πολύ γρήγορο καθώς είναι πολύ κοντά στη γλώσσα μηχανής. Παρόλ αυτά, η assembly δεν παύει να είναι ακόμη πολύ στοιχειώδης και δύσχρηστη, όπως φαίνεται στο παρακάτω παράδειγμα: Γλώσσα C, PASCAL, MATLAB Γλώσσα Assembly Γλώσσα Μηχανής c = a + b add $c, $a, $b Γλώσσες προγραμματισμού ανωτέρου επιπέδου: Για να γίνει δυνατή η κατασκευή προγραμμάτων για επίλυση συνθετότερων προβλημάτων αναπτύχθηκαν γλώσσες ανωτέρου επιπέδου, όπως Basic, Cobol, Fortran, Pascal, C, C++, Python κλπ. Η Basic θεωρείτο κατάλληλη για εισαγωγή στον προγραμματισμό, η Cobol είχε αναπτυχθεί με εξειδίκευση σε εμπορικές εφαρμογές, η Fortran είναι βελτιστοποιημένη για επίλυση προβλημάτων αριθμητικής ανάλυσης, ενώ η Pascal και η C είναι πλούσιες γενικές γλώσσες για πολλών ειδών εφαρμογές. Επιπλέον, έχουν αναπτυχθεί και γλώσσες για εξειδικευμένες περιοχές, όπως Lisp (τεχνητή νοημοσύνη), Matlab και Mathematica (τεχνικός και επιστημονικός προγραμματισμός), Java (διαδικτυακός προγραμματισμός και επικοινωνία συσκευών) κλπ. Την τελευταία δεκαετία έχει γίνει ανάπτυξη των παραπάνω γλωσσών σε περιβάλλον Windows και έχουν εμπλουτιστεί με πολλές «βιβλιοθήκες» (σύνολα εντολών και συναρτήσεων) για επαγγελματική ανάπτυξη ε- φαρμογών. Οι γλώσσες προγραμματισμού ανωτέρου επιπέδου χωρίζονται σε γλώσσες που υλοποιούν αλγοριθμικό προγραμματισμό (με υποκατηγορίες για διαδικασιακό (π.χ. Fortran, C), αντικειμενοστραφή (π.χ. C++, Java) και παράλληλο (π.χ. Java) προγραμματισμό) και σε γλώσσες που υλοποιούν δηλωτικό προγραμματισμό (με υποκατηγορίες για λογικό (π.χ. Prolog), συναρτησιακό (π.χ. Haskell, Lisp) και βάσεων δεδομένων (π.χ. SQL) προγραμματισμό). 2.3 Δημιουργία ενός προγράμματος 1. Δημιουργία του αλγορίθμου: Μετά από ανάλυση των απαιτήσεων του προβλήματος και διαίρεσή του σε απλά τμήματα γίνεται η κατασκευή του αλγορίθμου (στο «χαρτί» ή νοητά, ανάλογα με την πολυπλοκότητα, καθώς ο προγραμματιστής έχει πάντα στο μυαλό του, ενσυνείδητα ή υποσυνείδητα, τα βήματα που πρόκειται να ακολουθήσει). 2. Γράψιμο του κώδικα του προγράμματος: Αυτό γίνεται σε χρησιμοποιώντας απλά προγράμματα στον υπολογιστή, ειδικά για να συγγραφή απλού κειμένου, που λέγονται διορθωτές (editors). Το κείμενο που δημιουργείται από το διορθωτή και που περιέχει τις εντολές του προγράμματος λέγεται πηγαίος κώδικας (source code) ή απλά κώδικας του προγράμματος. 3. Μεταγλώττιση (compilation) ή διερμηνεία (interpretation): Είναι η μετατροπή του προγράμματος από τη μορφή του πηγαίου κώδικα στη γλώσσα μηχανής, έτοιμο να εκτελεστεί από τον υπολογιστή. Αυτό γίνεται με τη χρήση ειδικών προγραμμάτων που λέγονται μεταγλωττιστές (compilers) ή διερμηνείς (interpreters) της γλώσσας που χρησιμοποιούμε. Μια διαφορά μεταξύ τους είναι ότι ο compiler δημιουργεί ένα πρόγραμμα που μπορεί να τρέξει

18 18 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB αυτόνομα στον υπολογιστή (εκτελέσιμο αρχείο), ενώ ο interpreter εκτελεί το πρόγραμμα γραμμή-γραμμή, συνήθως μέσα από το περιβάλλον του interpreter. Κατά τη διάρκεια της τελευταίας διαδικασίας εμφανίζονται και τα τυχόν σφάλματα (bugs) του προγράμματος, οπότε εδώ πρέπει να προστεθεί και η πολύ σημαντική διαδικασία της α- ποσφαλμάτωσης (debugging). Ερωτήσεις 2.1 Τι είναι αλγόριθμος; Ποια η σχέση ενός αλγόριθμου με ένα πρόγραμμα στον υπολογιστή; 2.2 Τι από τα παρακάτω πλησιάζει περισσότερο την έννοια του αλγορίθμου: [ ] Ένα πρόγραμμα στον υπολογιστή. [ ] Οι εντολές ενός προγράμματος στον υπολογιστή. [ ] Τα απλά βήματα ενός προγράμματος στον υπολογιστή. [ ] Τα απλά βήματα για την επίλυση ενός προβλήματος. 2.3 Ένα πρόγραμμα στον υπολογιστή: [ ] Είναι ένας αλγόριθμος. [ ] Είναι η υλοποίηση ενός αλγορίθμου. [ ] Δεν έχει καμία σχέση με έναν αλγόριθμο. [ ] Αποτελεί τη βάση για την κατασκευή ενός αλγόριθμου. 2.4 Ποια είναι τα βασικά στοιχεία ενός αλγορίθμου; 2.5 Ποια είναι τα βήματα κατά τη δημιουργία ενός προγράμματος στον υπολογιστή; 2.6 Τι είναι η γλώσσα μηχανής και τι η assembly; Να αναφερθούν τρία παραδείγματα γλωσσών προγραμματισμού, με το πεδίο στο οποίο συνήθως χρησιμοποιούνται. 2.7 Να σημειωθούν ποιες από τις παρακάτω είναι γλώσσες προγραμματισμού ανωτέρου ε- πιπέδου: [ ] Basic [ ] Assembly [ ] Γλώσσα μηχανής [ ] Fortran [ ] Pascal [ ] C Ασκήσεις 2.8 Χρησιμοποιώντας τα βασικά στοιχεία ενός αλγορίθμου (ανάθεση, επιλογή, επανάληψη), να γραφτούν τα απλά βήματα με τα οποία ένας αλγόριθμος υπολογίζει το n- παραγοντικό (n!=1 2 3 n), αν το n είναι θετικός ακέραιος, ή τυπώνει μήνυμα «Ακατάλληλος αριθμός» σε αντίθετη περίπτωση. 2.9 Να γραφτεί ένας αλγόριθμος που υπολογίζει το μέσο όρο μιας ομάδας αριθμών (i) Να γραφτεί ένας αλγόριθμος που υπολογίζει και τυπώνει κατάλληλο μήνυμα με (α) το μέγιστο και (β) τον ελάχιστο αριθμό από ένα δοσμένο σύνολο. (ii) Να βελτιωθούν οι παραπάνω αλγορίθμοι, ώστε σε περίπτωση πολλαπλής εμφάνισης του μεγίστου ή του ελαχίστου να τυπώνουν και το πλήθος αυτών των επαναλήψεων (π.χ. «Ο ελάχιστος α- ριθμός είναι το -12 και εμφανίζεται 2 φορές») Δίνεται ένα σύνολο από βαθμολογίες φοιτητών. Να γραφτεί κατάλληλος αλγόριθμος ο οποίος βρίσκει το πλήθος των φοιτητών που πέρασαν το μάθημα (βαθμός 5) καθώς και των φοιτητών που αρίστευσαν (βαθμός 8.5).

19 Το περιβάλλον προγραμματισμού του MATLAB 19 3 Το περιβάλλον και ο τρόπος λειτουργίας του MATLAB Το MATLAB είναι μια γλώσσα προγραμματισμού ανώτερου επιπέδου, με εγγενείς ιδιαίτερες δυνατότητες χειρισμού πινάκων και απεικόνισης γραφικών. Ταυτόχρονα, περιέχει μια σειρά από έτοιμες συναρτήσεις που μπορούν να χρησιμοποιηθούν σε προγράμματα διαφόρων εφαρμογών. Το MATLAB χρησιμοποιείται παγκοσμίως για ανάπτυξη ακόμη και ιδιαιτέρως απαιτητικών ερευνητικών, τεχνικών και μηχανολογικών εφαρμογών. Τα περισσότερα από όσα αναφέρονται στη συνέχεια βασίζονται στην έκδοση 7.1 του MATLAB, αν και σχεδόν όλα ισχύουν και για μερικές προηγούμενες καθώς και επόμενες εκδόσεις. 3.1 Το περιβάλλον του MATLAB Μετά την πρώτη εγκατάσταση και εκτέλεση του MATLAB, εμφανίζεται το γραφικό περιβάλλον αλληλεπίδρασης με το χρήστη, που ονομάζεται Επιφάνεια Εργασίας (Desktop) του MATLAB, όπως φαίνεται στο σχήμα: Στο Desktop του MATLAB μπορούν να βρίσκονται τα εξής τμήματα (παράθυρα), που μπορούμε να επιλέξουμε την εμφάνισή τους ή όχι από την επιλογή Desktop του μενού, όπως φαίνεται στην παραπάνω εικόνα: Command Window Command History Current Directory (ή Current Folder, αναλόγως της έκδοσης του MATLAB) Workspace Help Profiler Αν και δεν φαίνονται στην παραπάνω εικόνα, μπορεί επίσης να είναι «ανοιχτό» το παράθυρο του Διορθωτή (Editor), που χρησιμεύει για να γράφουμε προγράμματα σε MATLAB, ενώ τέλος μπορεί να υπάρχουν και παράθυρα απεικόνισης γραφικών (Figures), δηλαδή εικόνων, γραφικών παραστάσεων ή άλλων γραφημάτων: Editor Figure

20 20 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Περιγραφή παραθύρων του Desktop Παρακάτω περιγράφονται τα παράθυρα που μπορεί να βρίσκονται ανοιχτά ή όχι στο Desktop του MATLAB, με σειρά σπουδαιότητας που έχουν σε σχέση με τους σκοπούς του εγχειριδίου αυτού: Editor Χρήση: Για συγγραφή και επεξεργασία κώδικα προγράμματος. Στον Editor μπορούν να βρίσκονται «ανοιχτά» ένα ή περισσότερα παράθυρα με προγράμματα. Ένα νέο παράθυρο για συγγραφή κώδικα δημιουργείται με την επιλογή New M-File του μενού File (συντόμευση πληκτολογίου: Control-N). Command Window Κύρια χρήση: (α) Εμφάνιση αποτελεσμάτων εκτύπωσης κειμένου στην οθόνη (όπου στη συνέχεια αναφέρεται «εκτύπωση στην οθόνη» θα εννοείται «εκτύπωση στο Command Window»). (β) Άμεση εκτέλεση εντολών. Με τον τρόπο αυτό μπορεί να δοκιμάζεται ο τρόπος λειτουργίας μιας εντολής πριν χρησιμοποιηθεί σε πρόγραμμα. Άλλες χρήσεις: Συνδυάζοντας τα δύο προηγούμενα μπορεί να γίνει αποσφαλμάτωση των προγραμμάτων. Επίσης, γράφοντας help εντολή δίνεται μια σύντομη περιγραφή λειτουργίας της συγκεκριμένης εντολής (ενώ με doc εντολή εμφανίζεται το παράθυρο Help με πολύ περισσότερες δυνατότητες βοήθειας για την εντολή αυτή). Τα δύο παραπάνω παράθυρα είναι τα περισσότερο χρήσιμα στην αρχή, οπότε συνιστάται να υπάρχουν μόνο αυτά μέχρι κάποιος να εξοικειωθεί με το MATLAB (τα άλλα παράθυρα μπορούν αρχικά να «κλείσουν», και να «ξανανοίξουν» αν χρειαστεί, από το μενού Desktop). Help Εμφάνιση βοήθειας για όλο το περιβάλλον, τις εντολές, τις συναρτήσεις και τα toolbox του MATLAB. Η έννοια για την οποία θέλουμε βοήθεια είτε ανευρίσκεται στην καρτέλα Contents, είτε γράφεται σε κατάλληλο πεδίο που βρίσκεται στην καρτέλα Index. Ιδιαιτέρως σημαντικό είναι το τμήμα Getting Started, ακολουθώντας τα βήματα του οποίου μπορεί κάποιος να μάθει εύκολα τις δυνατότητες του MATLAB. Το παράθυρο του Help μπορεί να εμφανιστεί και από το μενού Help. Workspace Εμφανίζονται οι μεταβλητές του MATLAB που βρίσκονται στη μνήμη του υπολογιστή. Έτσι μπορούμε να δούμε συνεχώς τις τιμές τους, ακόμα και κατά τη διάρκεια εκτέλεσης ενός προγράμματος, διότι το παράθυρο αυτό ενημερώνεται σε πραγματικό χρόνο. Current Directory/Current Folder Εκεί εμφανίζονται όλα τα αρχεία που βρίσκονται στο Current Directory/Current Folder. Command History Εμφανίζονται όλες οι προηγούμενες εντολές που έχουμε δώσει στο Command Window. Αυτό χρησιμεύει όταν εργαζόμαστε κυρίως από το Command Window (αντί του Editor). Profiler Πρόκειται για το παράθυρο μιας ενσωματωμένης εφαρμογής η οποία μας δίνει το χρόνο που απαιτείται για την εκτέλεση κάθε εντολής και συνάρτησης σε ένα πρόγραμμα. Είναι μια πολύ χρήσιμη εφαρμογή όταν θέλουμε να βρούμε τα σημεία στα οποία υπάρχουν καθυστερήσεις. Ένα παράθυρο μπορεί να μετακινηθεί σε άλλη θέση μετά από πίεση και μετακίνηση με το α- ριστερό πλήκτρο του ποντικιού στην μπάρα τίτλου του (που είναι μια οριζόντια ράβδος στο άνω τμήμα του παραθύρου με τον τίτλο του αριστερά, π.χ. ). Επίσης, με τα κουμπιά, ή που βρίσκονται στο δεξί μέρος της μπάρας τίτλου μπορεί να γίνει αποσύνδεση (undock) του παραθύρου από το Desktop, σύνδεση (dock) του παραθύρου στο Desktop, ή κλείσιμο του παραθύρου αντίστοιχα.

21 Το περιβάλλον προγραμματισμού του MATLAB Ο τρόπος λειτουργίας του MATLAB Εντολές: Το MATLAB λειτουργεί με εντολές, οι οποίες είτε δίνονται απ ευθείας στο Command Window, είτε γράφονται σε κώδικα προγράμματος με τη βοήθεια του Editor. Μεταβλητές και Workspace: Οι μεταβλητές είναι θέσεις στη μνήμη του υπολογιστή, οι οποίες περιέχουν τιμές που μεταβάλλονται με τη βοήθεια εντολών. Οι μεταβλητές βρίσκονται σε μια περιοχή της μνήμης του MATLAB που ονομάζεται Workspace. Current Directory/Folder, Path: Για να μπορεί να εκτελεστεί ένα πρόγραμμα, πρέπει αυτό να βρίσκεται σ ένα φάκελο που λέγεται Τρέχων Φάκελος (Current Folder) (φαίνεται σ ένα ειδικό χώρο κάτω από το μενού, βλ. παρακάτω εικόνα). Π.χ. ο Current Folder μπορεί να είναι C:\Program Files\Matlab\work ή C:\My Documents\Matlab Για καλύτερη οργάνωση, τα προγράμματα που φτιάχνει ο χρήστης μπορούν να αποθηκευτούν και σε διαφορετικούς φακέλους (δηλαδή όχι μόνο στον Current Folder). Τότε, για να μπορούν να εκτελεστούν, πρέπει η διαδρομή αυτών των φακέλων να προστεθεί σε μια ειδική ομάδα που λέγεται Path (και βρίσκεται στο μενού File Set Path). Το MATLAB ε- λέγχει αρχικά τον Current Folder, και μετά ελέγχει το Path με τη σειρά προτεραιότητας όπως φαίνεται στο File Set Path. Η σειρά προτεραιότητας μπορεί να αλλάξει με Move Up ή Move Down (βλ. παρακάτω εικόνα). Συναρτήσεις και Toolboxes: Στο MATLAB υπάρχουν πολλές έτοιμες συναρτήσεις (ουσιαστικά «εντολές» που εμπλουτίζουν τις λειτουργίες του). Οι συναρτήσεις του MATLAB είναι οργανωμένες σε ομάδες, κάθε μια σχετική με μια εξειδικευμένη θεματική περιοχή. Κάθε ομάδα τέτοιων συναρτήσεων ονομάζεται Toolbox (π.χ. Statistics, Signal Processing, Image Processing, Communications, Financial,, όπως φαίνεται στην παρακάτω εικόνα).

22 22 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Προγράμματα στο MATLAB: Scripts και Functions Τα αρχεία προγραμμάτων στο MATLAB ονομάζονται m-files, καθώς έχουν επέκταση.m. Το MATLAB διακρίνει δύο είδη m-files: Scripts (προγράμματα) και functions (συναρτήσεις). Scripts: Ακολουθίες εντολών. Μοιράζονται το τρέχον workspace, δηλαδή μπορούν να χρησιμοποιήσουν μεταβλητές που ήδη υπάρχουν στο workspace, και οι μεταβλητές που δημιουργούν παραμένουν με τις τιμές τους στο workspace. Functions: Ακολουθίες εντολών, που συνήθως δεν εκτελούνται άμεσα από το περιβάλλον του MATLAB (όπως συνήθως τα scripts) αλλά «καλούνται» με το όνομά τους από άλλα προγράμματα ή το Command Window. Μπορούν να δεχθούν τιμές μεταβλητών ως είσοδο και να εξάγουν νέες τιμές ως έξοδο. Δημιουργούν το δικό τους ανεξάρτητο workspace, που είναι εντελώς απομονωμένο από του υπόλοιπου συστήματος, και «αντιλαμβάνονται» μόνο τις μεταβλητές που εισάγονται ως είσοδοι καθώς και αυτές που δημιουργούνται στο εσωτερικό τους. Έτσι ο κώδικας είναι «καθαρότερος» και τα σφάλματα λιγότερα. Δημιουργία, αποθήκευση και εκτέλεση προγράμματος στο MATLAB Ο κώδικας ενός προγράμματος στο MATLAB γράφεται με τη βοήθεια του ενσωματωμένου Editor. Με τη βοήθεια της επιλογής File του μενού μπορούμε να δημιουργήσουμε ένα νέο αρχείο προγράμματος (File New M-File), να το αποθηκεύσουμε (File Save ή Save As ) ή να ανοίξουμε (File Open ) ένα υπάρχον αρχείο. Προσοχή: Οι εντολές αφορούν κάθε φορά το ενεργό παράθυρο (διακρίνεται από την έγχρωμη μπλε μπάρα τίτλου). Για παράδειγμα, για αποθήκευση του προγράμματος πρέπει να είναι ενεργό το παράθυρο του Editor, και όχι π.χ. του Command Window. Όταν γραφτεί ο κώδικας, το πρόγραμμα εκτελείται («τρέχει») με την επιλογή Run του μενού Debug (συντόμευση πληκτρολογίου: F5). Η αποθήκευση γίνεται τότε αυτόματα, εκτός από την πρώτη φορά, οπότε ζητείται το όνομα του αρχείου του προγράμματος. Το όνομα του αρχείου πρέπει να περιέχει μόνο λατινικά γράμματα (a z, A Z), αριθμητικά ψηφία (0 9) και κάτω παύλα (_, underscore), καθώς και ο πρώτος χαρακτήρας να είναι γράμμα (είναι οι ίδιοι περιορισμοί με αυτούς των ονομάτων των μεταβλητών βλ. και 4.2). Σε αντίθετη περίπτωση, το αρχείο πιθανόν να αποθηκευτεί, αλλά δεν θα μπορεί να χρησιμοποιηθεί σωστά από το MATLAB. Κατά τη συγγραφή του ο κώδικας πρέπει να αποθηκεύεται τακτικά (με τη συντόμευση πληκτρολογίου: Ctrl+S, ή πατώντας στο κατάλληλο εικονίδιο: ). Χρήσιμες είναι επίσης και οι λειτουργίες Copy-Paste (Ctrl+C και Ctrl+V) και Undo (Ctrl+Z).

23 Το περιβάλλον προγραμματισμού του MATLAB Χρήσιμες συντομεύσεις πληκτρολογίου Control+N (New): Νέο αρχείο προγράμματος στον editor Control+S (Save): Αποθήκευση προγράμματος Control+A: Επιλογή όλου του τρέχοντος προγράμματος Control+Ι: Εσοχές (indentation) στο επιλεγμένο τμήμα του κώδικα Control+R ή Control+T: Σχολιασμός ή αποσχολιασμός επιλεγμένου τμήματος Control+Break με focus στο Command Window: Διακοπή εκτέλεσης προγράμματος F5 (save and run): Αποθήκευση και εκτέλεση προγράμματος F9 (run selected): Άμεση εκτέλεση των εντολών του επιλεγμένου τμήματος κώδικα F12 (breakpoints): Τοποθέτηση (ή διαγραφή) σημείου διακοπής για debugging F10 (step): Εκτέλεση εντολών γραμμή-γραμμή κατά το debugging F11 (step-in): Είσοδος μέσα στις συναρτήσεις κατά το debugging Shift + F11 (step-out): Έξοδος από τις συναρτήσεις κατά το debugging Shift + F5: Τερματισμός λειτουργίας debugging 3.4 Συνοπτική παρουσίαση εντολών γενικής χρήσης του MATLAB: general Λίστα με τις εντολές γενικής χρήσης του MATLAB εμφανίζεται στο Command Window με την εντολή help general (ή doc general, στο παράθυρο της Βοήθειας).

24 24 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 3.1 Ποιο παράθυρο της Επιφάνειας Εργασίας (Desktop) του MATLAB πρέπει να ανοιχθεί, ώστε: - να εκτελεστεί απ ευθείας μια εντολή:... - να δοκιμαστεί ο τρόπος λειτουργίας μιας εντολής:... - να γραφτούν πολλές εντολές που να εκτελεστούν αργότερα:... - να αποθηκευτεί σειρά διαδοχικών εντολών στο δίσκο:... - να βρεθεί μια εντολή που δώσατε προηγουμένως:... - να ζητηθεί πλήρη βοήθεια για μια εντολή:... - να γίνει διαχείριση των αρχείων του τρέχοντος καταλόγου εργασίας:... - να δείτε τις τιμές των μεταβλητών:... (Μπορεί να υπάρχει το ίδιο παράθυρο σε περισσότερες από μία απαντήσεις) 3.2 Σε ποιο από τα παράθυρα του Desktop του MATLAB μπορούν να γραφτούν εντολές α) οι οποίες μπορούν να εκτελεστούν απ ευθείας;... β) οι οποίες να συνθέτουν κώδικα προγράμματος; Να περιγραφεί η λειτουργία του Command Window. 3.4 Τι είναι το workspace του MATLAB; Τι περιέχει το αντίστοιχο παράθυρο; 3.5 Να περιγραφεί συνοπτικά ο τρόπος λειτουργίας του MATLAB, και συγκεκριμένα: α) Πού γράφονται οι εντολές και πώς εκτελούνται; β) Πού αποθηκεύονται οι μεταβλητές με τις τιμές τους; γ) Τι είναι το Current Directory (ή Current Folder) και τι το Path, και ποιος ο ρόλος καθενός; 3.6 Τι είναι τα Toolboxes; 3.7 Τι είναι τα scripts και τι οι functions; 3.8 Να γραφτεί ένα πλεονέκτημα των συναρτήσεων (functions) σε σχέση με τα απλά προγράμματα (scripts). 3.9 Ποιοι είναι οι περιορισμοί για ένα όνομα αρχείου με κώδικα προγράμματος σε MATLAB; 3.10 Ποια από τα παρακάτω ονόματα αρχείου με κώδικα MATLAB είναι αποδεκτά: [ ] program1.m Αν όχι, γιατί; [ ] _program.m Αν όχι, γιατί; [ ] 1program.m Αν όχι, γιατί; [ ] 1_program.m Αν όχι, γιατί; [ ] my program.m Αν όχι, γιατί; [ ] my-program.m Αν όχι, γιατί; [ ] my_program.m Αν όχι, γιατί; [ ] my_program.c Αν όχι, γιατί; [ ] προγραμμα.m Αν όχι, γιατί;

25 4.1 Στοιχεία του κώδικα ενός προγράμματος 4 Βασικά στοιχεία προγραμματισμού Τα στοιχεία που χρησιμοποιούνται κατά τη συγγραφή του κώδικα ενός προγράμματος είναι οι μεταβλητές, οι τελεστές και οι εντολές. Συνοπτικά: Μεταβλητές: Αντιστοιχούν σε θέσεις στη μνήμη του υπολογιστή για προσωρινή αποθήκευση δεδομένων και αποτελεσμάτων. Οι βασικοί τύποι μεταβλητών είναι μεταβλητές χαρακτήρων, αριθμητικές μεταβλητές (ακέραιες και "κινητής υποδιαστολής") και λογικές μεταβλητές: Μεταβλητές χαρακτήρα (character variables): Είναι μεταβλητές στις οποίες αποθηκεύονται γράμματα της αλφαβήτου, αριθμητικά ψηφία και διάφορα σύμβολα (π.χ. 'a', '3', '!'). Σειρές συνεχόμενων χαρακτήρων σχηματίζουν τις συμβολοσειρές (ή αλφαριθμητικές μεταβλητές ή strings), π.χ. 'Hello'. Ακέραιες μεταβλητές (integer variables): Είναι αριθμητικές μεταβλητές στις οποίες αποθηκεύονται ακέραιοι, π.χ. 3, 54, -21, 0. Μεταβλητές κινητής υποδιαστολής (floating point variables): Είναι μεταβλητές στις ο- ποίες αποθηκεύονται αριθμοί με δεκαδικά ψηφία, π.χ , , 0.5, 1.0. Λογικές μεταβλητές: Είναι μεταβλητές στις οποίες αποθηκεύονται οι λογικές τιμές true ή false («αλήθεια» ή «ψεύδος»), και αποδίδονται με 1 ή 0 αντίστοιχα. Τελεστές: Είναι σύμβολα που παριστάνουν πράξεις ή συναρτήσεις με τις οποίες ο υπολογιστής συσχετίζει τις μεταβλητές (π.χ. κάνει αριθμητικές πράξεις με αυτές, τις συγκρίνει κλπ). Οι βασικοί τελεστές είναι: Αριθμητικοί: +, -, *, /, ^ Συγκριτικοί: == (ίσο), ~= (άνισο), >= (μεγαλύτερο ή ίσο), <=, >, < Λογικοί: & (και), (ή), ~ (όχι) Εντολές: Είναι οι οδηγίες προς τον υπολογιστή. Στις εντολές πρέπει να συμπεριλάβουμε και τις συναρτήσεις, που είναι σύνολα εντολών (ή άλλων συναρτήσεων) που συμπεριφέρονται ως μια νέα εντολή, που δέχεται ως είσοδο τιμές μεταβλητών και εξάγει νέες τιμές. Οι συναρτήσεις επεκτείνουν πάρα πολύ τις δυνατότητες προγραμματισμού, και εκτός από τις ενσωματωμένες συναρτήσεις του MATLAB, μπορεί ο προγραμματιστής να δημιουργήσει και τις δικές του. Οι βασικότερες εντολές είναι: Ανάθεση: = π.χ. a = 4; b = 2*a; a = a + 1; Επιλογή: if και switch π.χ. if a~=0, x=b/a; Επανάληψη: for και while π.χ. for i=1:10, sum = sum + i; Βασικές συναρτήσεις εισόδου-εξόδου είναι: Είσοδος (εισαγωγή τιμών από το πληκτρολόγιο): input π.χ. w = input('input your weight'); Έξοδος (εκτύπωση αποτελεσμάτων στην οθόνη): disp και fprintf π.χ. disp(x); fprintf('the weight is %d', x); Στη συνέχεια θα αναπτυχθούν αναλυτικότερα τα περί μεταβλητών, τελεστών και εντολών.

26 26 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 4.2 Μεταβλητές Στον προγραμματισμό ως «μεταβλητή» εννοείται μια καταχώρηση στη μνήμη του υπολογιστή, που περιέχει το όνομα της μεταβλητής, τον τύπο της και την τιμή της. Ονόματα μεταβλητών Το όνομα μιας μεταβλητής στο MATLAB πρέπει να ξεκινάει από λατινικό γράμμα και μπορεί να περιέχει λατινικά γράμματα (a-z, A-Z), ψηφία (0-9) και την κάτω παύλα (_, underscore). Τα πεζά θεωρούνται διαφορετικά από τα κεφαλαία (το MATLAB είναι "case sensitive"). Το μήκος του ονόματος μπορεί να είναι μέχρι 63 χαρακτήρες (namelengthmax). Επίσης, το όνομα μιας μεταβλητής δεν μπορεί να είναι μια από τις δεσμευμένες λέξεις του MATLAB, που είναι οι: break, case, catch, continue, else, elseif,, for, function, global, if, otherwise, persistent, return, switch, try και while. ** Τέλος, το όνομα μιας μεταβλητής δεν μπορεί να είναι ίδιο με το όνομα του προγράμματος ή της συνάρτησης όπου ορίζεται και χρησιμοποιείται η μεταβλητή. Τύποι μεταβλητών Μεταβλητές χαρακτήρα (character variables) Είναι μεταβλητές στις οποίες αποθηκεύονται χαρακτήρες (γράμματα, ψηφία, σύμβολα). Κάθε μεταβλητή χαρακτήρα καταλαμβάνει 2 bytes (δηλαδή υπάρχουν διαθέσιμοι 2 16 =65536 διαφορετικοί χαρακτήρες), διότι το MATLAB υποστηρίζει το σύνολο χαρακτήρων Unicode. Ακέραιες μεταβλητές (integer variables) Είναι μεταβλητές στις οποίες αποθηκεύονται ακέραιοι αριθμοί. Το MATLAB υποστηρίζει ακεραίους που καταλαμβάνουν 1, 2, 4, ή 8 Bytes μνήμης, σύμφωνα με τον παρακάτω πίνακα: Όνομα και συνάρτηση μετατροπής Είδος ακεραίου Εύρος τιμών int8 integer 8-bit (1 Byte) ( ) uint8 unsigned integer 8-bit (0 255) int16 integer 16-bit (2 Bytes) ( ) uint16 unsigned integer 16-bit ( ) int32 integer 32-bit (4 Bytes) ( ) uint32 unsigned integer 32-bit ( ) int64 integer 64-bit (8 Bytes) ( ) uint64 unsigned integer 64-bit ( ) Μεταβλητές κινητής υποδιαστολής (floating point variables) Είναι μεταβλητές στις οποίες αποθηκεύονται αριθμοί με δεκαδικά ψηφία. Χωρίζονται σε μονής ακρίβειας (single, 4 Bytes) και διπλής ακρίβειας (double, 8 Bytes): Όνομα και συνάρτηση μετατροπής single double Είδος κινητής υποδιαστολής Μέγεθος στη μνήμη Ακρίβεια Single-precision 4 Bytes = 32 bits Ακρίβεια 7 δεκαδικών ψηφίων Double-precision 8 Bytes = 64 bits Ακρίβεια 15 δεκαδικών ψηφίων Εύρος τιμών Προσεγγιστικό εύρος τιμών με δυνάμεις του 10 Κατανομή bits στη μνήμη -( ) και ( ) περίπου και sign exponent (8 bits) fraction (23 bits) ( ) και ( ) περίπου και sign exponent (11 bits) fraction (52 bits) Λογικές μεταβλητές (logical variables) Είναι μεταβλητές στις οποίες αποθηκεύονται οι λογικές τιμές true ή false («αλήθεια» ή «ψεύδος»), που αντιστοιχούν στις τιμές 1 ή 0 αντίστοιχα με μέγεθος 1 byte. ** Επίσης, καλό είναι μια μεταβλητή να μην έχει το όνομα μιας συνάρτησης, γιατί τότε αυτή η συνάρτηση δεν θα μπορεί να χρησιμοποιηθεί μέχρι η μεταβλητή να καθαρίσει με clear από τη μνήμη. Ο σχετικός έλεγχος μπορεί να γίνει με την εντολή which <όνομα> ή με help <όνομα> (π.χ.which float ή help float), οπότε η απάντηση "not found" δηλώνει ότι το <όνομα> δεν χρησιμοποιείται για όνομα συνάρτησης.

27 Βασικά στοιχεία προγραμματισμού 27 Μετατροπή μεταβλητών σε άλλους τύπους Αν δεν οριστούν διαφορετικά, το MATLAB αποθηκεύει στη μνήμη του υπολογιστή όλες τις αριθμητικές μεταβλητές ως double. Στα απλά προγράμματα δεν χρειάζεται μετατροπή σε άλλο τύπο, παρά μόνο (α) σε περιπτώσεις υπερβολικής κατανάλωσης της διαθέσιμης μνήμης, ή (β) σε περιπτώσεις απαίτησης συγκεκριμένων τύπων μεταβλητών στα ορίσματα εισόδου ή εξόδου μιας συνάρτησης. Η μετατροπή μιας μεταβλητής σε άλλο τύπο γίνεται με τις συναρτήσεις μετατροπής (βλέπε προηγούμενο πίνακα). Παραδείγματα: x = single(x); Α = int8(200); B = int16(a); Ο έλεγχος του τύπου μιας μεταβλητής μπορεί να γίνει με την εντολή: whos μεταβλητή. Στις περιπτώσεις μεταβλητών άλλου τύπου εκτός από double, χρειάζεται προσοχή στα εξής: Πράξη αριθμού με λογική μεταβλητή ή αριθμού με χαρακτήρα δίνει double. Πράξη μεταξύ single και double δίνει single. Οι ακέραιοι μπορούν να κάνουν πράξεις μόνο με ακέραιο ίδιου τύπου ή με double, και τότε δίνουν ακέραιο ίδιου τύπου. Π.χ. η πράξη x=int8(15)+3.7 δίνει αποτέλεσμα x=19, όπου η x είναι τύπου int8. Υπέρβαση ορίων τύπου μεταβλητής Σε περίπτωση προσπάθειας υπέρβασης της ελάχιστης ή της μέγιστης επιτρεπόμενης τιμής του τύπου μιας αριθμητικής μεταβλητής, τότε η μεταβλητή παίρνει ακριβώς αυτήν την ελάχιστη ή μέγιστη τιμή. Παράδειγμα: Οι ακέραιες μεταβλητές uint8 (unsigned integer 8-bits) παίρνουν τιμές από 0 έως 255. Aν a = uint8(200) (δηλαδή η a είναι ίση με 200, καταλαμβάνοντας 8-bits) τότε η εντολή a = a + 60 δίνει στο a την τιμή 255 (τη μέγιστη τιμή του uint8), ενώ η a = a 300 δίνει στο a την τιμή 0 (την ελάχιστη τιμή του uint8). Η ελάχιστη και μέγιστη θετική τιμή κινητής υποδιαστολής βρίσκεται με τις συναρτήσεις: realmin('single'), realmin('double') Η ελάχιστη και μέγιστη τιμή των ακεραίων βρίσκεται με τις συναρτήσεις: intmin('int8'), intmin('int16'), intmin('int32'), intmin('int64') intmax('int8'), intmax('int16'), intmax('int32'), intmax('int64') intmin('uint8'), intmin('uint16'), intmin('uint32'), intmin('uint64') intmax('uint8'), intmax('uint16'), intmax('uint32'), intmax('uint64') Ειδικές μεταβλητές Το MATLAB διαθέτει κάποιες μεταβλητές που έχουν ειδικές προκαθορισμένες τιμές: ans προσωρινή μεταβλητή με το αποτέλεσμα της πιο πρόσφατης πράξης, αν δεν έχει ανατεθεί σε άλλη συγκεκριμένη μεταβλητή. Inf άπειρο (Infinity): το αποτέλεσμα της διαίρεσης 1/0. NaN αόριστο (Not a Number): το αποτέλεσμα της διαίρεσης 0/0. pi (το π με ακρίβεια 14 δεκαδικών ψηφίων). i, j η φανταστική μονάδα ( 1 ), για χρήση σε μιγαδικούς αριθμούς. realmax ο μεγαλύτερος θετικός αριθμός κινητής υποδιαστολής. realmin ο μικρότερος θετικός αριθμός κινητής υποδιαστολής. eps η ακρίβεια των δεκαδικών ψηφίων των αριθμών κινητής υποδιαστολής. Στις ειδικές αυτές μεταβλητές μπορούν να ανατεθούν και άλλες τιμές μέσα σε ένα πρόγραμμα (για παράδειγμα οι i, j χρησιμοποιούνται συνήθως ως δείκτες στην εντολή for). Στην περίπτωση αυτή η εντολή clear τις επαναφέρει στις αρχικές ειδικές τιμές τους.

28 28 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 4.3 Τελεστές και Πράξεις Οι τελεστές είναι σύμβολα που παριστάνουν πράξεις ή συναρτήσεις. Η έννοια της πράξης έχει εδώ γενικότερη έννοια, και σημαίνει την επεξεργασία των τιμών κάποιων μεταβλητών σύμφωνα με ορισμένους κανόνες και την εξαγωγή ενός αποτελέσματος. Αριθμητικές πράξεις / Αριθμητικοί τελεστές Οι αριθμητικές πράξεις λειτουργούν ως συναρτήσεις, με είσοδο δύο αριθμητικές μεταβλητές και έξοδο μια αριθμητική τιμή. Οι αριθμητικές πράξεις με τους τελεστές τους είναι: Αριθμητική πράξη Τελεστής Αποτέλεσμα Παράδειγμα Αποτέλεσμα Πρόσθεση + Αριθμός Αφαίρεση - Αριθμός Πολλαπλασιασμός * Αριθμός 3*4 12 Διαίρεση / Αριθμός 3/ Ύψωση σε δύναμη ^ Αριθμός 3^4 81 Υπάρχουν μερικές εξαιρέσεις απ τα γενικώς προφανή αποτελέσματα των αριθμητικών πράξεων: - Η διαίρεση ακεραίων μεταβλητών έχει ως αποτέλεσμα πάντα ακέραιο (με στρογγυλοποίηση στον πλησιέστερο). Π.χ. η πράξη int8(5)/int8(6) έχει ως αποτέλεσμα 1. Άλλα παραδείγματα: int8(10)/int8(3) 3, int8(5)/int8(2) 3, int8(1)/int8(3) 0. - Για την εύρεση των ριζών των αρνητικών αριθμών πρέπει να χρησιμοποιούνται οι συναρτήσεις sqrt (τετραγωνική ρίζα) και nthroot (νιοστή ρίζα), αντί για ύψωση σε δύναμη. Π.χ. sqrt(-4) και nthroot(-8,3), αντί για (-4)^0.5 και (-8)^(1/3). Η προτεραιότητα των αριθμητικών πράξεων είναι (από τη μεγαλύτερη προς τη μικρότερη): ^ : Ύψωση σε δύναμη. - : Αλλαγή προσήμου *, / : Πολλαπλασιασμός και διαίρεση (ίδια προτεραιότητα). +, - : Πρόσθεση και αφαίρεση (ίδια προτεραιότητα). Για αλλαγή στη σειρά προτεραιότητας, χρησιμοποιούμε παρενθέσεις ( ). Σε τελεστές με ίδια προτεραιότητα, οι πράξεις γίνονται από αριστερά προς τα δεξιά. Π.χ.: 2*3^2= 18, (2*3)^2=36, -3^2=-9, (-3)^2=9, 2^-2+1=1.25, 2^-(2+1)= Συγκριτικές πράξεις / Συγκριτικοί (σχεσιακοί) τελεστές Οι συγκριτικές πράξεις λειτουργούν ως συναρτήσεις, με είσοδο δύο αριθμητικές μεταβλητές και έξοδο μια λογική τιμή (true ή false, 1 ή 0), ανάλογα με το αποτέλεσμα της σύγκρισης. Οι συγκριτικές πράξεις με τους τελεστές τους είναι: Συγκριτική πράξη Τελεστής Αποτέλεσμα Παράδειγμα Αποτέλεσμα Σύγκριση ισότητας == true ή false 5==9 0 Σύγκριση ανισότητας ~= true ή false 5~=9 1 Σύγκριση για μεγαλύτερο > true ή false 5>9 0 Σύγκριση για μικρότερο < true ή false 5<9 1 Σύγκριση για μεγαλύτερο ή ίσο >= true ή false 5>=9 0 Σύγκριση για μικρότερο ή ίσο <= true ή false 5<=9 1 Οι συγκριτικές πράξεις διαφέρουν από τις αριθμητικές μόνο ως προς είδος του αποτελέσματος κατά τα άλλα, γίνονται παρόμοια. Π.χ. Μετά την εντολή a = 1+2, η μεταβλητή a έχει την αριθμητική τιμή 3. Παρομοίως, μετά την εντολή a = 1>2, η μεταβλητή a έχει τη λογική τιμή 0 (ή false), ως αποτέλεσμα της συγκριτικής πράξης 1>2. Σε συνδυασμό τελεστών σύγκρισης, η προτεραιότητα είναι από αριστερά προς τα δεξιά, εκτός αν χρησιμοποιηθούν παρενθέσεις ( ).

29 Βασικά στοιχεία προγραμματισμού 29 Λογικές πράξεις / Λογικοί τελεστές Οι λογικές πράξεις λειτουργούν ως συναρτήσεις, με είσοδο λογικές μεταβλητές και έξοδο μια λογική τιμή (true ή false, 1 ή 0), ανάλογα με το αποτέλεσμα της λογικής πράξης. Οι λογικές πράξεις είναι οι εξής: Πράξη and (τελεστές: & ή &&) Το αποτέλεσμα είναι 1 αν και οι δύο είσοδοι είναι 1, και 0 σε κάθε άλλη περίπτωση. Η διαφορά των δύο τελεστών είναι ότι με τον && (που στο MATLAB λέγεται short-circuit AND), αν η 1η είσοδος είναι ψευδής, δεν εξετάζεται η 2η (αφού δεν είναι α- ναγκαίο). Έτσι, επιταχύνεται η ροή του προγράμματος. Πίνακας αληθείας and A B A & B Πράξη or (τελεστές: ή ) Το αποτέλεσμα είναι 1 αν μία τουλάχιστον είσοδος είναι 0, και 0 αν και οι δύο είσοδοι είναι 0. Η διαφορά των δύο τελεστών είναι ότι με τον (που στο MATLAB λέγεται short-circuit OR), αν η 1η είσοδος είναι αληθής, δεν εξετάζεται η 2η (αφού δεν είναι αναγκαίο). Έτσι, επιταχύνεται η ροή του προγράμματος. Πίνακας αληθείας or A B A B Πράξη not (τελεστής: ~) Η πράξη NOT έχει μόνο μία είσοδο, και ως έξοδο το α- ντίθετό της (δηλαδή η NOT αντιστρέφει την είσοδό της): Το αποτέλεσμα είναι 1 αν η είσοδος είναι 0 και αντιστρόφως. Πίνακας αληθείας not A ~A Προτεραιότητα λογικών πράξεων 1. not (~) 2. and (& ή &&) 3. or ( ή ) Για αλλαγή στη σειρά προτεραιότητας, χρησιμοποιούμε παρενθέσεις ( ). Σε τελεστές με ίδια προτεραιότητα, οι πράξεις γίνονται από αριστερά προς τα δεξιά. Σημειώσεις: 1. Εκτός από το short-circuit, μια ακόμη διαφορά των τελεστών & και από τους && και είναι ότι οι πρώτοι (& και ) εφαρμόζονται απ ευθείας και σε πίνακες (ίδιων διαστάσεων), εξετάζοντάς τους στοιχείο-προς-στοιχείο και παράγοντας ένα νέο πίνακα (ίδιων διαστάσεων) με τα λογικά αποτελέσματα στις αντίστοιχες θέσεις. 2. Η λογική πράξη XOR (exclusive OR) μπορεί να εφαρμοστεί με τη συνάρτηση xor (π.χ. xor(a,b)). 4.4 Συνοπτική παρουσίαση τελεστών και ειδικών χαρακτήρων του MATLAB: ops Λίστα με τους τελεστές και τους ειδκούς χαρακτήρες του MATLAB εμφανίζεται στο Command Window με την εντολή help ops (ή doc ops, στο παράθυρο της Βοήθειας).

30 30 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 4.1 Ποια είναι τα τρία βασικά στοιχεία που χρησιμοποιούνται κατά τη συγγραφή ενός προγράμματος; 4.2 Να αναφέρετε τα βασικά είδη μεταβλητών με μερικά παραδείγματα από κάθε είδος. 4.3 Να αναφερθούν τα βασικά είδη των τελεστών με παραδείγματα από κάθε είδος. 4.4 Να αναφερθούν τις 3 βασικές εντολές στον προγραμματισμό καθώς και την αντιστοιχία τους με τα βασικά στοιχεία ενός αλγορίθμου. 4.5 Ποιοι είναι οι περιορισμοί για το όνομα μιας μεταβλητής στο MATLAB; 4.6 Να σημειωθούν ποια από τα παρακάτω ονόματα μεταβλητών στο MATLAB είναι σωστά [Σ] και ποια λανθασμένα [Λ]: [ ] hello [ ] x1 [ ] x_1 [ ] 1_x [ ] for [ ] MyV [ ] iloveu [ ] abc [ ] if [ ] _y2 [ ] 12a [ ] b1c 4.7 Πόσο χώρο στη μνήμη του υπολογιστή καταλαμβάνει μια μεταβλητή χαρακτήρα στο MATLAB, και κατά συνέπεια πόσες διαφορετικές μεταβλητές χαρακτήρα είναι διαθέσιμες; 4.8 Να σημειωθούν οι σωστές [Σ] και οι λανθασμένες [Λ] προτάσεις. Στις μεταβλητές χαρακτήρα στο MATLAB: [ ] μπορούν να αποθηκευτούν μόνο γράμματα (πεζά και κεφαλαία) [ ] μπορούν να αποθηκευτούν γράμματα και σύμβολα αλλά όχι αριθμητικά ψηφία [ ] μπορούν να αποθηκευτούν μόνο λατινικά γράμματα, ψηφία καθώς και το σύμβολο της κάτω παύλας ( _, underscore) [ ] μπορούν να αποθηκευτούν μέχρι 256 διαφορετικοί χαρακτήρες 4.9 Ποια είναι τα είδη των ακέραιων μεταβλητών στο MATLAB; Να γραφτεί (α) ο χώρος στη μνήμη που καταλαμβάνει κάθε είδος, (β) το πλήθος των διαφορετικών τιμών ακεραίων που μπορούν να αποθηκευτούν σε κάθε είδος και (γ) η μέγιστη και η ελάχιστη τιμή κάθε είδους Ποια είναι τα είδη των μεταβλητών κινητής υποδιαστολής στο MATLAB; Να γραφτεί (α) ο χώρος στη μνήμη που καταλαμβάνει κάθε είδος, (β) η ακρίβεια των δεκαδικών ψηφίων κάθε είδους και (γ) κατά προσέγγιση η μέγιστη και η ελάχιστη τιμή κάθε είδους ως δύναμη του Πόσο χώρο στη μνήμη του υπολογιστή καταλαμβάνει μια λογική μεταβλητή; Ασκήσεις 4.12 Να γραφούν οι τιμές των παρακάτω μεταβλητών μετά την εκτέλεση των παρακάτω α- ριθμητικών πράξεων: α) x = 16^1/2 β) y = 16^0.5 γ) z = 10/2*5 δ) a = 10+2* Να γραφούν οι τιμές των παρακάτω μεταβλητών μετά την εκτέλεση των παρακάτω α- ριθμητικών πράξεων: α) x = int8(4)/int8(2); β) y = int8(5)/int8(2); γ) z = int8(5)/int8(3); δ) r = int8(5.7)/int8(4);

31 Βασικά στοιχεία προγραμματισμού 31 ε) s = int8(0.9)/int8(2); στ) t = int8(0.3)/int8(3); 4.14 Να γραφούν οι τιμές των μεταβλητών a, b, c, d, x, y μετά την εκτέλεση της παρακάτω συνεχόμενης σειράς εντολών: a = 100; x = a/2; b = int8(a); c = b + 300; d = a + 300; a = b 300; y = a/2; 4.15 Να γραφούν οι τιμές των παρακάτω μεταβλητών (a, b, x, y, z, i, pi, ans,) μετά την εκτέλεση των εντολών: α) a = 100/0; β) b = 0/0; γ) x = realmax + 1; δ) y = -realmin realmax; δ) z = -realmax 1; ε) i = 1; clear i; στ) pi = 5; clear pi; ζ) 3+2; ans = ans + 1; 4.16 Να γραφούν οι τιμές των παρακάτω λογικών μεταβλητών μετά την εκτέλεση των παρακάτω συγκριτικών πράξεων: α) x = 4<5 β) y = 4==5 γ) z = 4>=5 δ) r = 4<=5 ε) s = 4>5 στ) t = 4~= Να γραφούν οι τιμές των παρακάτω λογικών μεταβλητών μετά την εκτέλεση των παρακάτω λογικών πράξεων: α) x = ~ (1 & 0) β) y = (~ 1) & 0 γ) z = ~ 1 & 0 δ) r = (1 0) & 0 ε) s = 1 (0 & 0) στ) t = 1 0 & Να γραφούν οι τιμές των παρακάτω λογικών μεταβλητών μετά την εκτέλεση των παρακάτω συγκριτικών και λογικών πράξεων: α) x = 5>3 & 1<2 β) y = 1==2 3>=1 γ) z = 3~=4 2==3 δ) r = 3<=4 & ~(1~=2) ε) s = ~(4>1) στ) a = 5; t = a>0 & a<3 a>4 & a<10 ζ) u = 9==int8(9.1) η) v = 9.1==int8(9.1) & 9.1==9.1 θ) w = int8(9.9)==10 9.1== Παράδειγμα: Έστω x ο βαθμός ενός φοιτητή. Επιθυμούμε η λογική μεταβλητή r να λάβει τιμή true αν ο βαθμός είναι μικρότερος του 5, και false στην αντίθετη περίπτωση. Απάντηση: r = x<5

32 32 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Σύμφωνα με το παραπάνω απλό παράδειγμα, να αποδοθεί η τιμή true σε μια λογική μεταβλητή της επιλογής σας, α) αν ο βαθμός x του φοιτητή είναι άριστα (δηλαδή τουλάχιστον ίσος με 8.5). β) αν η τιμή v μιας εργαστηριακής εξέτασης ενός ασθενούς είναι τουλάχιστον ίση με 2.5 και μικρότερη του 3.0. γ) αν η τιμή ind ενός κλινικού εργαστηριακού δείκτη είναι εντός της περιοχής τιμών 4 και 17 (ελάχιστη και μέγιστη επιτρεπόμενη τιμή αντίστοιχα). δ) αν η τιμή ind του ανωτέρω εργαστηριακού δείκτη είναι εκτός της περιοχής τιμών 4 και 17. ε) αν η τιμή ind του δείκτη είναι θετική και εκτός της περιοχής [4, 17], με μέγιστη τιμή το Να γραφούν οι μεταβλητές που υπάρχουν στο workspace του MATLAB μετά την εκτέλεση των παρακάτω εντολών στις δύο περιπτώσεις (α) και (β). Επίσης να γραφτούν τι τύπου είναι οι μεταβλητές αυτές και ποιες είναι οι τιμές τους. (α) clear; x = 5; y = int8(x) + 2; z = int8(x) + 200; x + 3; (β) clear; pi = 7; x = pi + 3; clear; x = pi + 3; Σημείωση: η εντολή clear καθαρίζει τη μνήμη από τις μεταβλητές.

33 5 Βασικές εντολές 5.1 Γενικά Διαχωρισμός εντολών Οι εντολές ενός προγράμματος στο MATLAB χωρίζονται με έναν από τους εξής τρόπους: Με ελληνικό ερωτηματικό «;» Με κόμμα «,» Με αλλαγή γραμμής (δηλαδή πατώντας Enter στο πληκτρολόγιο). Οι παραπάνω τρόποι είναι λειτουργικά ισοδύναμοι. Στην περίπτωση που απουσιάζει το ελληνικό ερωτηματικό «;», τότε αν τεθεί ή αλλάξει η τιμή κάποιας μεταβλητής γίνεται ταυτόχρονα και απεικόνισή της στην οθόνη (δηλαδή στο Command Window). Αυτή η λειτουργία είναι πολύ χρήσιμη για τον εύκολο και γρήγορο έλεγχο τιμών και αποτελεσμάτων, καθώς και για ανεύρεση σφαλμάτων κατά τη διαδικασία της αποσφαλμάτωσης (debugging). Παραδείγματα x = 4 x = y = -3.1; Αποτελέσματα 4 a = x + 1, b = 2; a = c = a + b c = 5 7 Συνέχιση εντολής στην επόμενη σειρά Αν στο τέλος μιας γραμμής γραφτούν 3 τελείες «...», τότε η εντολή συνεχίζεται στην επόμενη γραμμή. Παράδειγμα: y = a*x^4 + b*x^3*y + c*x^2*y^ d*x*y^3 + e*y^4 + f; Εσοχές (indent) Οι εντολές που είναι «εσωτερικές» μιας εντολής διακλάδωσης της ροής του προγράμματος ή ενός επαναληπτικού βρόχου συνιστάται να τοποθετούνται με εσοχή 2-4 χαρακτήρων (με χρήση του πλήκτρου κενού διαστήματος (space) ή με χρήση του πλήκτρου TAB στο πληκτρολόγιο). Αν και αυτό δεν είναι τυπικά υποχρεωτικό, είναι σχεδόν απαραίτητο για τον εύκολο οπτικό έλεγχο της λειτουργίας του κώδικα του προγράμματος. Παράδειγμα: if a~=0 x = b/a; disp(x); Σχόλια Συνήθως σε κάθε πρόγραμμα ο προγραμματιστής προσθέτει σχόλια, δηλαδή κείμενο το οποίο δεν λαμβάνεται υπ όψιν από τον υπολογιστή και προστίθεται μόνο για καλύτερη κατανόηση του προγράμματος από τον προγραμματιστή. Στο MATLAB οτιδήποτε βρίσκεται μετά από το σύμβολο «%» στην ίδια γραμμή του κώδικα του προγράμματος, δεν λαμβάνεται υπ όψιν κατά την εκτέλεση του προγράμματος. Παράδειγμα: % Edo dinontai ta stoixeia tou asthenous w = input('input patient s weight'); % Eisagogi barous asthenous h = input('input patient s height'); % Eisagogi ipsous asthenous

34 34 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 5.2 Εντολή ανάθεσης Για την ανάθεση μιας τιμής σε μια μεταβλητή χρησιμοποιείται ως τελεστής το σύμβολο της ισότητας (=), π.χ. x = 4. Εδώ, το σύμβολο της ισότητας δεν έχει καθόλου την έννοια που έχει στα μαθηματικά, αλλά σημαίνει ότι σε μια θέση μνήμης του υπολογιστή (που σχετίζεται με ένα όνομα μεταβλητής, π.χ. το x), αποθηκεύεται μια συγκεκριμένη τιμή (π.χ. το 4). Σε μια μεταβλητή μπορούν να ανατεθούν (α) τιμές αριθμών, (β) χαρακτήρες (μέσα σε 'μονά' εισαγωγικά), (γ) αποτελέσματα παραστάσεων. Οι παραστάσεις περιέχουν πράξεις με αριθμούς, μεταβλητές ή συναρτήσεις. Ακόμη, μια παράσταση μπορεί να περιέχει και την ίδια τη μεταβλητή στην οποία πρόκειται να γίνει η ανάθεση. Τότε, οι πράξεις γίνονται με την αρχική τιμή της μεταβλητής, και μετά γίνεται αντικατάσταση της τιμής της μεταβλητής με το αποτέλεσμα της παράστασης. Παραδείγματα: α) Ανάθεση αριθμού: μεταβλητή = αριθμός Π.χ.: x = 4 β) Ανάθεση χαρακτήρα: μεταβλητή = 'χαρακτήρας' Π.χ.: c = 'A' γ) Ανάθεση αποτελέσματος πράξεων: μεταβλητή = παράσταση με πράξεις Π.χ.: y = -2*x + 4 δ) Ανάθεση αποτελέσματος πράξεων με αντικατάσταση της τιμής της μεταβλητής: Π.χ.: x = 2*x Στην τελευταία περίπτωση έχουμε αλλαγή της τιμής μιας μεταβλητής, χρησιμοποιώντας μια παράσταση στην οποία περιέχεται και η ίδια η μεταβλητή. Αυτό σημαίνει ότι στο δεξί μέρος του συμβόλου «=» γίνονται οι πράξεις με την αρχική τιμή της μεταβλητής, και στη συνέχεια το αποτέλεσμα αποθηκεύεται στην ίδια μεταβλητή, που αποκτά τώρα τη νέα τιμή. Η παλαιά τιμή δεν μπορεί να ανακτηθεί, καθώς η νέα τιμή εγγράφεται στην ίδια θέση μνήμης. Παρατήρηση: Η περίπτωση (δ) είναι κατάλληλη για να γίνει κατανοητή η διαφορά μεταξύ του συμβόλου «=» στα μαθηματικά (σύμβολο της ισότητας, που δηλώνει ότι δύο ποσότητες είναι ίσες) με το σύμβολο «=» στον προγραμματισμό (που είναι το σύμβολο της εντολής της ανάθεσης, που δηλώνει ότι σε μια θέση μνήμης, που συμβολίζεται με το όνομα της μεταβλητής στο αριστερό μέρος, αποθηκεύεται η τιμή της παράστασης στο δεξί μέρος). Σημείωση: Αν μια εντολή ανάθεσης λήγει με κόμμα (,) ή με αλλαγή γραμμής ( Enter), τότε γίνεται ταυτόχρονα και απεικόνιση του αποτελέσματος στην οθόνη (δηλαδή στο Command Window). Αν η εντολή ανάθεσης λήγει με ελληνικό ερωτηματικό (;), τότε το αποτέλεσμα δεν εμφανίζεται. Αυτό πρόκειται για ένα ιδιαίτερο χαρακτηριστικό του MATLAB. Παραδείγματα % Ανάθεση αριθμών x = -3.1; t = 12; y = 4 % Ανάθεση χαρακτήρων char1 = 'A', char2 = '!'; char3 = 'h'; % Ανάθεση παράστασης z = x + 2*y 3 % Ανάθεση παράστασης με αντικατάσταση z = z + 1 Αποτελέσματα y = 4 char1 = A z = -5.2 z = -4.2

35 Βασικές εντολές Εντολές μορφοποίησης του Command Window Ακολουθούν μερικές εντολές που αφορούν στην εμφάνιση του Command Window: clc Καθαρισμός του Command Window. format 1ο είδος σύνταξης: με παράμετρο loose ή compact format loose format compact Οι εκτυπώσεις στο Command Window αφήνουν (loose) ή δεν αφήνουν (compact) κενές γραμμές ανάμεσά τους. Παράδειγμα format loose x = 5 Αποτέλεσμα x = 5 format compact x = 5 x = 5 2ο είδος σύνταξης: με παράμετρο long ή short format long Εμφάνιση αριθμών κινητής υποδιαστολής στο Command Window με το πλήρες πλήθος δεκαδικών ψηφίων (15 δεκαδικά ψηφία για μεταβλητές τύπου double και 7 για single). format short Εμφάνιση αριθμών κινητής υποδιαστολής στο Command Window με 4 δεκαδικά ψηφία. * Παράδειγμα format long x = pi y = single(x) Αποτέλεσμα x = y = format short x = pi x = Προσοχή: Με την εντολή αυτή αλλάζει μόνο το πλήθος των δεκαδικών ψηφίων που εμφανίζονται, και δεν επηρεάζονται καθόλου οι τιμές των μεταβλητών. * Η εντολή format short/long συνδυάζεται και με τις παραμέτρους g ή e, με αποτέλεσμα απεικόνιση χωρίς τα μη σημαντικά μηδενικά ψηφία (π.χ. η format short g δίνει 1.3 αντί για ) ή απεικόνιση σε εκθετική μορφή (π.χ. η format short e δίνει ως απεικόνιση 1.25e-002 αντί για , δηλαδή ένα ψηφίο αριστερά της υποδιαστολής και μετά ένας αριθμός που είναι ο εκθέτης του 10).

36 36 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 5.4 Εντολές μεταβλητών Ακολουθούν παραδείγματα εντολών για χειρισμό μεταβλητών (βλ. και 15.4): clear <μεταβλητή> clear all Καθαρισμός μιας μεταβλητής ή όλων (all) των μεταβλητών απ τη μνήμη. who και whos Εμφάνιση των μεταβλητών του workspace, με πληροφορίες (whos) ή χωρίς (who). Σημείωση: Ο τύπος και το είδος μιας μεταβλητής μπορεί να ελεγχθεί πιο ειδικά και με τις συναρτήσεις ischar, isnumeric, isinteger, isfloat, isfinite, isinf, isnan, isvector, isscalar, class. Στις εντολές is*, το αποτέλεσμα είναι true ή false (λογικό 1 ή 0). rem <υπόλοιπο> = rem(<διαιρετέος>, <διαιρέτης>) Υπόλοιπο ακέραιης διαίρεσης. Παράδειγμα r = rem(45, 2) r = Αποτέλεσμα Η συνάρτηση rem είναι χρήσιμη για τον έλεγχο του εάν ένας αριθμός είναι άρτιος ή περιττός, διότι rem(άρτιος,2)=0 και rem(περιττός,2)=1. 1 round <στρογγυλοποιημένη_μεταβλητή> = round(<μεταβλητή>) Στρογγυλοποίηση στον πλησιέστερο ακέραιο (το 0.5 στρογγυλοποιείται προς τα «πάνω», δηλαδή προς τον αμέσως μεγαλύτερο ακέραιο κατ απόλυτη τιμή). Παράδειγμα y = round(-3.5) y = Αποτέλεσμα -4 Στρογγυλοποίηση γίνεται και με τις συναρτήσεις fix, floor και ceil, με τη διαφορά ότι η στρογγυλοποίηση γίνεται προς το 0, προς το ή προς το + αντίστοιχα. Η fix μπορεί να χρησιμοποιηθεί σε συνδυασμό με τη rem για να βρεθούν το πηλίκο και το υπόλοιπο διαίρεσης ακεραίων. q = fix(17/5) q = r = rem(17,5) r = 3 2 rand <μεταβλητή> = rand Παραγωγή ενός «τυχαίου» * αριθμού από 0 έως 1. Παράδειγμα x = rand x = Αποτέλεσμα * Οι αριθμοί που παράγονται από τη rand λέγονται ψευδοτυχαίοι, καθώς δημιουργούνται με χρήση αλγορίθμου. Οι αλγόριθμοι που χρησιμοποιεί το MATLAB παράγουν κάθε φορά έναν από 2 32 αριθμούς, που εμφανίζονται με ίδια σειρά σε κάθε εκκίνηση του MATLAB (βλ. επίσης 9.12 και 15.4).

37 Βασικές εντολές Εντολές εισόδου δεδομένων από τo πληκτρολόγιο Για είσοδο δεδομένων (αριθμών ή χαρακτήρων) από το πληκτρολόγιο χρησιμοποιείται η εντολή input: Σύνταξη της εντολής input: <μεταβλητή> = input('μήνυμα κειμένου') Εισαγωγή αριθμού από το πληκτρολόγιο. Ο αριθμός που εισάγεται αποθηκεύεται στη μεταβλητή. Το 'μήνυμα κειμένου' είναι απλά για διευκόλυνση του χρήστη (όπου μπορεί να περιέχεται και ο ειδικός χαρακτήρας αλλαγής γραμμής \n). Π.χ. x = input('give me a number:'); <μεταβλητή> = input('μήνυμα κειμένου', 's') Εισαγωγή σειράς χαρακτήρων από το πληκτρολόγιο (απαιτείται η παράμετρος 's'). * Η σειρά χαρακτήρων που εισάγεται αποθηκεύεται στη μεταβλητή. Ως σειρά χαρακτήρων (συμβολοσειρά, string) εννοείται σειρά γραμμάτων, συμβόλων ή αριθμητικών ψηφίων (τα τελευταία αντιμετωπίζονται ως σύμβολα, δηλαδή χωρίς την αριθμητική τους αξία). Π.χ. Name = input('give me your name:','s'); Προσοχή: Μια μεταβλητή πρέπει να εισάγεται ως αριθμητική μόνο όταν έχει νόημα ο ποσοτικός χαρακτήρας της (δηλαδή όταν μπορεί να υφίσταται ποσοτικές συγκρίσεις τύπου «μεγαλύτερο» ή «μικρότερο» ή όταν έχουν νόημα οι συνήθεις αριθμητικές πράξεις με αυτήν). Σε αντίθετη περίπτωση, η μεταβλητή πρέπει να αντιμετωπίζεται ως χαρακτήρας ή ως σειρά χαρακτήρων. Για παράδειγμα, ένας αριθμός τηλεφώνου πρέπει να αντιμετωπίζεται ως σειρά χαρακτήρων (και να εισάγεται με παράμετρο 's'). Παραδείγματα x = input('what is your age? '); Αποτελέσματα What is your age? (και αναμονή για εισαγωγή αριθμού, π.χ.:) What is your age? 18 (και μετά Enter) N = input('what is your name? ','s'); What is your name? (και αναμονή για εισαγωγή συμβολοσειράς, π.χ.) What is your name? John (και Enter) * Αλφαριθμητικοί χαρακτήρες μπορούν να εισαχθούν και με την πρώτο τρόπο σύνταξης της input (χωρίς 's'), αλλά τότε οι χαρακτήρες πρέπει να τοποθετηθούν μέσα σε μονά εισαγωγικά (' '). Π.χ.: N = input('what is your name? ','s'); >> What is your name? 'John' (και Enter)

38 38 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 5.6 Εντολές εξόδου αποτελεσμάτων στην οθόνη (στο Command Window) Η έξοδος των αποτελεσμάτων στην οθόνη (δηλαδή στο Command Window) στο MATLAB γίνεται με τις εντολές disp και fprintf: Σύνταξη της εντολής disp: disp(<μεταβλητή>) ή disp('κείμενο') Απεικόνιση (α) της τιμής μιας μεταβλητής ή (β) κειμένου, δηλαδή σειράς χαρακτήρων. Η σειρά χαρακτήρων μπαίνει πάντα ανάμεσα σε 'μονά' εισαγωγικά (διαφορετικά θα θεωρηθεί όνομα μεταβλητής), εκτός αν είναι αποθηκευμένη σε όνομα μεταβλητής. Υπενθυμίζεται ότι εναλλακτικός τρόπος στο MATLAB για την απεικόνιση της τιμής μιας μεταβλητής είναι απλά η χρήση της μεταβλητής χωρίς ελληνικό ερωτηματικό στο τέλος. Παράδειγμα Αποτέλεσμα x = x = Απεικόνιση του ονόματος της μεταβλητής (x) 5 μαζί με το αποτέλεσμα (5) x x = Απεικόνιση του ονόματος της μεταβλητής (x) 5 μαζί με την τιμή της (5) disp(x) 5 Απεικόνιση της τιμής της μεταβλητής disp(2*x-17) -7 Απεικόνιση του αποτελέσματος disp('x') x Απεικόνιση του χαρακτήρα 'x' disp('hello') Hello Απεικόνιση της σειράς χαρακτήρων 'Hello' Σύνταξη της εντολής fprintf: fprintf('παράσταση', <μεταβλητές>) Απεικόνιση κειμένου, που μπορεί να περιέχει (προαιρετικά) και τιμές μεταβλητών. Η 'παράσταση' μπορεί να περιέχει (μέσα σε 'μονά' εισαγωγικά): κείμενο ειδικούς χαρακτήρες μορφής, που δηλώνουν σε ποια μορφή θα εκτυπωθούν οι τιμές των μεταβλητών (αν υπάρχουν) και που μπαίνουν στην 'παράσταση', στη θέση και με τη σειρά όπου θέλουμε να εκτυπωθούν οι μεταβλητές. Οι βασικότεροι είναι: %c = χαρακτήρας %s = σειρά χαρακτήρων (συμβολοσειρά, string, character array) %d = ακέραιος (με βάση το δεκαδικό -decimal- σύστημα αρίθμησης) %f = κινητής υποδιαστολής, με 6 δεκαδικά ψηφία ακριβώς. %X.Yf = κινητής υποδιαστολής, με X χαρακτήρες τουλάχιστον (συνολικά, μαζί με την υποδιαστολή και το πρόσημο) και με Y δεκαδικά ψηφία ακριβώς. %.Yf = κινητής υποδιαστολής, με Y δεκαδικά ψηφία ακριβώς. %e = κινητής υποδιαστολής, σε εκθετική μορφή (π.χ e-002) %g = κινητής υποδιαστολής, στην πιο συμπαγή μορφή από τις %f ή %e. %.Yg = κινητής υποδιαστολής, με Y σημαντικά ψηφία (π.χ. %.2g: ). ειδικούς χαρακτήρες θέσης, που δηλώνουν κάποια ειδική λειτουργία για τη θέση όπου θα γίνει η εκτύπωση του κειμένου. Οι βασικότεροι είναι: \n = αλλαγή γραμμής (new line) \t = στηλοθέτης (tab) χρησιμεύει συνήθως για στοίχιση σε στήλες \b = σβήσιμο του προηγούμενου χαρακτήρα (backspace) Επειδή επιτελούν ειδικές λειτουργίες μέσα στην παράσταση, οι χαρακτήρες ', %, \ δεν μπορούν να απεικονιστούν. Αν αυτό απαιτείται, πρέπει να γραφτούν διπλοί ('', %%, \\). Μετά από μια εντολή fprintf, η επόμενη θέση εκτύπωσης είναι δεξιά του τελευταίου χαρακτήρα της 'παράστασης' (εκτός αν η 'παράσταση' λήγει σε \n).

39 Βασικές εντολές 39 Παραδείγματα age = 25; fprintf('i''m %d years old', age); h = 1.80; w = 75; fprintf('height=%.2f, weight=%.0f', h, w); x = 3/4; fprintf('success = %.0f%%',100*x); Αποτελέσματα I'm 25 years old Height=1.80, weight=75 Success = 75% w1 = 2; w2 = 75; fprintf('cat is: %2dkg\nMan is: %dkg', w1, w2); name = 'John'; letter = 'J'; fprintf('1st letter of %s is %c', name, letter); fprintf('hi'); fprintf('lovely'); fprintf('hi\n'); fprintf('lovely') fprintf('hi'); fprintf('\n'); fprintf('lovely'); Cat is: 2kg Man is: 75kg 1st letter of John is J Hilovely Hi Lovely Hi lovely Οι ειδικοί χαρακτήρες μορφής μπορούν να χρησιμοποιηθούν και για απεικόνιση μιας μεταβλητής σε μορφή άλλου τύπου (με εξαίρεση την περίπτωση μετατροπής αριθμού κινητής υ- ποδιαστολής σε ακέραιο). Η απεικόνιση σε άλλη μορφή γίνεται μόνο κατά την εκτύπωση και δεν επηρεάζει την τιμή της μεταβλητής. Παραδείγματα: Παραδείγματα Αποτελέσματα Σκοπός fprintf('%c',65); fprintf('%d','a'); fprintf('%.2f',-3); fprintf('%8.2f',-3); A Απεικόνιση αριθμού ως χαρακτήρα (με τον ASCII ή Unicode χαρακτήρα) Απεικόνιση χαρακτήρα με τη μορφή α- ριθμού (σε ASCII ή Unicode) Απεικόνιση ακεραίου ως αριθμού κινητής υποδιαστολής με 2 μηδενικά Απεικόνιση ακεραίου ως αριθμού κινητής υποδιαστολής με 2 μηδενικά και συνολικό μήκος 8 θέσεις (μαζί με το πρόσημο και μαζί με τα δεκαδικά) Σημείωση: Εκτός από την οθόνη, η fprintf μπορεί να εξάγει τα αποτελέσματά της και σε αρχείο αποθηκεύοντάς τα σε μόνιμο μαγνητικό μέσο (π.χ. στο σκληρό δίσκο), αλλά αυτή η περίπτωση εξετάζεται αργότερα, στα περί αρχείων (βλ. 13.3).

40 40 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 5.1 Να σημειωθεί αν οι παρακάτω ομάδες εντολών είναι σωστές [Σ] ή λανθασμένες [Λ]: [ ] x = 4; [ ] x = 4 y = 2*x - 5; y = -2*x - 5 [ ] x = 4, y = 2*x - 5 [ ] x = 4 y = -2*x - 5; [ ] x = 4, y = -2*x - 5; [ ] x = 4, y = -2*x - 5 [ ] x = 4, y = -2*x - 5, [ ] x = 4; y = -2*x - 5; [ ] x = 4 y = -2*x - 5; [ ] x = 4 y = -2*x Να περιγραφεί συνοπτικά η διαφορά των εντολών x = a και x = 'a'. Είναι δυνατόν να είναι γνωστός ο τύπος της μεταβλητής x σε κάθε μία από τις δύο περιπτώσεις; 5.3 Να σημειωθεί αν οι παρακάτω εντολές είναι σωστές [Σ] ή λανθασμένες [Λ]: [ ] x = 4; [ ] 4 = x; [ ] x = '4'; [ ] '4' = x; [ ] x = a; [ ] a = x; [ ] x = 'a'; [ ] 'a' = x; [ ] y = x + 2; [ ] x = x + 2; Ασκήσεις 5.4 Να συμπληρωθούν κατάλληλα οι παρακάτω γραμμές εντολών ώστε να είναι ορθές: b = 7.5 Sxolio: Edw dinetai o bathmos enos foititi y = 3*x + 4*x^2 0.2*x^3 + 12*x^4 6.1*x^5 + 8*x^6 x^7 + 3*x^8 z = 2 x + 3 z 5.5 Δίνονται οι παρακάτω εντολές προγράμματος: a = 5; b = 6; c = (a+b)/2; fprintf('η μέση τιμή των και είναι ', a, b, c); Να συμπληρωθεί η εντολή fprintf, ώστε να τυπωθεί στο Command Window το ε- ξής: Η μέση τιμή των 5 και 6 είναι Να συμπληρωθεί η ακόλουθη εντολή fprintf, ώστε η τετραγωνική ρίζα της μεταβλητής x (που είναι 1/ 2 x x 0.5 x ) να τυπώνεται με δύο δεκαδικά ψηφία: x = 5; fprintf('the square root of is ', x, x^0.5); 5.7 Δίνονται οι παρακάτω εντολές ενός προγράμματος: a = input( ); fprintf(' ', ); Να συμπληρωθούν οι προηγούμενες εντολές input και fprintf, ώστε μετά την ε-

41 Βασικές εντολές 41 κτέλεσή τους να φαίνονται στο Command Window τα εξής (αν υποθέσουμε ότι στην εντολή input δώσουμε τον αριθμό 7 από το πληκτρολόγιο): Give me a number: 7 x^2 = Δίνονται οι παρακάτω εντολές ενός προγράμματος: x = input( ); y = input( ); fprintf(' ',,, ); Να συμπληρωθούν οι προηγούμενες εντολές input και fprintf, ώστε μετά την ε- κτέλεσή τους να φαίνονται στο Command Window τα εξής*: Give me a number: 4 Give me another number: 3 4^3 = 64 *Υποθέτουμε ότι στις δύο εντολές input δώσαμε τους αριθμούς 4 και 3 από το πληκτρολόγιο. 5.9 Δίνονται οι παρακάτω εντολές ενός προγράμματος: a = 'X-ray'; b = 'Ultrasound'; c = 'CT scan'; fprintf(,a,b,c); s = input( ); Να συμπληρωθούν οι προηγούμενες εντολές input και fprintf, ώστε μετά την ε- κτέλεσή τους να φαίνονται στο Command Window τα εξής: * MENU * 1. X-ray 2. Ultrasound 3. CT scan Select: _ 5.10 Δίνονται οι παρακάτω εντολές προγράμματος: name = input( ); age = input( ); fprintf(, name); fprintf(, age); Να συμπληρωθούν οι εντολές input και fprintf, ώστε μετά την εκτέλεσή τους να φαίνονται στο Command Window τα εξής: Patient name: Papadopoulos Patient age : 64 Patient Papadopoulos: Age: 64 *Υποθέτουμε ότι στις δύο εντολές input δώσαμε τη συμβολοσειρά Papadopoulos και τον αριθμό 64 από το πληκτρολόγιο αντίστοιχα Δίνονται οι παρακάτω εντολές προγράμματος: d = 8.5; r = 0.125; fprintf(, d, r); Να συμπληρωθεί η εντολή fprintf, ώστε να τυπωθεί στο Command Window το ε- ξής: Το ποσοστό των σπουδαστών με βαθμό άνω του 8.5 είναι 12.5% Δίνονται οι παρακάτω εντολές προγράμματος: x = 'B'; fprintf('τhe ASCII number of character is.', x, x); Να συμπληρωθεί η εντολή fprintf, ώστε να τυπωθεί στο Command Window το ε- ξής: Τhe ASCII number of character 'B' is 66.

42 6 Εντολές διακλάδωσης της ροής του προγράμματος Ένα από τα βασικά στοιχεία στον προγραμματισμό είναι η δυνατότητα διακλάδωσης της ροής του προγράμματος σε διαφορετική κατεύθυνση, ανάλογα με το αν ικανοποιείται κάποια συνθήκη ή όχι. Οι βασικές εντολές επιλογής (δηλαδή επιλογής εκτέλεσης διαφορετικής ομάδας εντολών, αναλόγως της αλήθειας μιας συνθήκης) είναι η if και η switch. 6.1 Εντολή επιλογής IF Σύνταξη της εντολής if (και των παραλλαγών της if-else και if-elseif-else): Σύνταξη if: Διακλάδωση: if <συνθήκη> <εντολές> Οι εντολές που βρίσκονται ανάμεσα στο if και στο εκτελούνται μόνο αν η συνθήκη είναι αληθής. Το πρόγραμμα συνεχίζεται στην επόμενη εντολή μετά το. Σύνταξη if - else: Διακλάδωση με εναλλακτική επιλογή: if <συνθήκη> <εντολές1> else <εντολές2> Αν ικανοποιείται η συνθήκη εκτελούνται οι εντολές1, αλλιώς εκτελούνται οι εντολές2. Σύνταξη if - elseif - else: Πολλαπλή διακλάδωση: if <συνθήκη1> <εντολές1> elseif <συνθήκη2> <εντολές2> elseif <συνθήκη3> <εντολές3>... else <εντολές> Αν ικανοποιείται η συνθήκη1 εκτελούνται οι εντολές1, αλλιώς αν ικανοποιείται η συνθήκη2 εκτελούνται οι εντολές2, κ.ο.κ. Αν δεν ικανοποιείται καμία από τις συνθήκες, εκτελούνται οι εντολές του else (αν υπάρχει). Αν αληθεύουν περισσότερες από μία συνθήκες, εκτελούνται μόνο οι εντολές της πρώτης από αυτές. Σημείωση: Η συνθήκη σε ένα βρόχο επιλογής μπορεί να είναι είτε απλή είτε σύνθετη, οπότε χρησιμοποιούνται οι αντίστοιχοι τελεστές, π.χ. & (AND) ή (OR).

43 Εντολές διακλάδωσης της ροής ενός προγράμματος 43 Παραδείγματα %%%%%%% if example %%%%%%% a = input('nominator? '); b = input('denominator? '); if b~=0 x = a/b Αποτελέσματα Nominator? 10 Denominator? 2 x = 5 if b==0 & a~=0 disp('infinity'); if b==0 & a==0 disp('no specific number'); % Τα δύο τελευταία if θα μπορούσαν % να αντικατασταθούν από: if b==0 if a~=0 disp('infinity'); if a==0 disp('no specific number'); %%%%%%% if-else example %%%%%%% a = input('nominator? '); b = input('denominator? '); if b~=0 x = a/b else disp('warning! Denominator is zero!'); Nominator? 5 Denominator? 0 Warning! Denominator is zero! %%%%%%% if-elseif-else example %%%%%%% disp('1. New patient'); disp('2. Edit a patient'); disp('3. Display patients'); disp('press any other key to exit'); s = input('select: '); 1. New patient 2. Edit a patient 3. Display patients Press any other key to exit Select: 0 Bye bye if s==1 disp('add a new patient'); elseif s==2 disp('edit an existing patient'); elseif s==3 disp('display all patients'); else disp('bye bye');

44 44 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 6.2 Εντολή επιλογής SWITCH Η εντολή switch προσφέρει έναν απλό τρόπο επιλογής της ομάδας εντολών που θα ε- κτελεστούν, ανάλογα με την τιμή μιας μεταβλητής. Η διαφορά της switch από την if είναι ότι με τη switch μπορούμε να επιλέξουμε τιμές μεταβλητών μόνο από διακριτό σύνολο τιμών, ενώ με την if μπορούμε να επιλέξουμε τιμές μεταβλητών είτε από διακριτό σύνολο τιμών (αν χρησιμοποιηθεί συνθήκη ισότητας) είτε από συνεχές σύνολο τιμών (αν χρησιμοποιηθεί συνθήκη ανισότητας). Σύνταξη της εντολής switch-case: switch μεταβλητή case <τιμή1> <εντολές1> case <τιμή2> <εντολές2>... otherwise <εντολές> Αν η μεταβλητή έχει την τιμή1 εκτελούνται οι εντολές1, αλλιώς αν έχει την τιμή2 εκτελούνται οι εντολές2, κ.ο.κ. Αν η μεταβλητή δεν έχει καμία από αυτές τις τιμές, εκτελούνται οι εντολές του otherwise (αν υπάρχει). Η μεταβλητή μπορεί να είναι είτε απλή αριθμητική μεταβλητή είτε συμβολοσειρά (string). Μια συνήθης χρήση της switch είναι στην υλοποίηση ενός μενού επιλογών. Σημείωση: Το switch-case μπορεί πάντα να αντικατασταθεί από μια ακολουθία ifelseif-else (όπου οι συνθήκες είναι συνθήκες ισότητας μεταξύ της μεταβλητής και των διαφόρων τιμών της) αλλά το αντίστροφο δεν μπορεί να γίνει πάντα. Παράδειγμα disp('1. New patient'); disp('2. Edit a patient'); disp('3. Display patients'); disp('press any other key to exit'); disp(' '); % Για μια κενή σειρά s = input('select: '); disp(' '); % Για μια κενή σειρά switch s case 1 disp('add a new patient'); case 2 disp('edit an existing patient'); case 3 disp('display all patients'); otherwise disp('bye bye'); Αποτέλεσμα 1. New patient 2. Edit a patient 3. Display patients Press any other key to exit Select: 1 Add a new patient 6.3 Συνοπτική παρουσίαση εντολών προγραμματισμού του MATLAB: lang Λίστα με τις εντολές προγραμματισμού του MATLAB εμφανίζεται στο Command Window με την εντολή help lang (ή doc lang, στο παράθυρο της Βοήθειας).

45 Εντολές διακλάδωσης της ροής ενός προγράμματος 45 Ερωτήσεις 6.1 Ποια είναι η διαφορά των εντολών επιλογής if και switch, και κατά συνέπεια ποια από τις δύο εντολές είναι γενικότερη; 6.2 α) Η if μπορεί πάντα να αντικαταστήσει μια switch. Να δοθεί ένα παράδειγμα. β) Η switch δεν μπορεί πάντα να αντικαταστήσει μια if. Να δοθεί ένα παράδειγμα. Ασκήσεις 6.3 Γράψτε ένα πρόγραμμα το οποίο διαβάζει από το πληκτρολόγιο την τιμή του αιματοκρίτη ενός ασθενούς και ακολούθως υπολογίζει και εμφανίζει στο Command Window την απαραίτητη δοσολογία ενός φαρμάκου σύμφωνα με τους κανόνες: - Εάν ο αιματοκρίτης > 45 τότε δεν πρέπει να ληφθεί καθόλου φάρμακο - Εάν 40 αιματοκρίτης 45 τότε θα πρέπει να ληφθούν 10 mg φαρμάκου - Εάν αιματοκρίτης < 40 τότε θα πρέπει να ληφθούν 100 mg φαρμάκου 6.4 Να γραφτεί πρόγραμμα το οποίο να τυπώνει με κατάλληλο μήνυμα με fprintf στο Command Window τον μεγαλύτερο από 2 αριθμούς οι οποίοι θα εισάγονται από το πληκτρολόγιο, όπως στο παράδειγμα: Dwse enan ari8mo: 6 Dwse allo enan ari8mo: 3 O megalyteros einai o 6! Σημείωση: Αν οι αριθμοί είναι ίσοι, θα τυπώνεται κατάλληλο μήνυμα, π.χ.: Oi dyo ari8moi einai isoi. 6.5 Γράψτε ένα πρόγραμμα το οποίο να διαβάζει από το πληκτρολόγιο την τιμή της συγκέντρωσης γλυκόζης (G) στο αίμα ενός ασθενούς που πάσχει από διαβήτη και ακολούθως να υπολογίζει και να εμφανίζει στο Command Window την ποσότητα ινσουλίνης (I) που θα πρέπει να λάβει ο ασθενής, σύμφωνα με τους κανόνες: - Αν G 15, τότε I= (G-10) ( G 15)/20 - Αν 15<G 30, τότε I 1500 e G/10 I e - Αν G>30, τότε 6.6 Να γραφτεί πρόγραμμα το οποίο να υπολογίζει και να τυπώνει στο Command Window με χρήση της fprintf τις δύο ρίζες ενός δευτεροβάθμιου τριωνύμου. Οι συντελεστές του τριωνύμου πρέπει να εισάγονται από το πληκτρολόγιο. Στην περίπτωση οι οι ρίζες δεν είναι πραγματικές, πρέπει να τυπώνεται κατάλληλο μήνυμα. 6.7 Να γραφτεί πρόγραμμα στο οποίο να εισάγεται ο βαθμός πτυχίου ενός σπουδαστή από το πληκτρολόγιο και να τυπώνεται κατάλληλο μήνυμα στο Command Window: Βαθμός < 0 ή Βαθμός > 10: Μήνυμα: Lan8asmeni ba8mologia 0 Βαθμός < 5: Μήνυμα: Apotyxwn 5.0 Βαθμός < 6.5: Μήνυμα: Kalws 6.5 Βαθμός < 8.5: Μήνυμα: Lian Kalws 8.5 Βαθμός 10: Μήνυμα: Arista 6.8 Να γράψετε τι ακριβώς θα τυπωθεί θα τυπωθεί στο Command Window σε κάθε μία από τις δύο επόμενες περιπτώσεις: (α) (b) x = 9; x = 9; if x>=8.5 if x>=8.5 disp('arista'); disp('arista'); elseif x>=6.5 disp('lian kalws'); if x>=6.5 disp('lian kalws');

46 46 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 6.9 Να βρεθεί η τιμή της μεταβλητής message μετά την εκτέλεση των παρακάτω διαδοχικών εντολών, στις περιπτώσεις (α) και (β): (α) (b) x = 9; x = 9; if x>=5 if x>=5 message = 'Epityxws'; message = 'Epityxws'; elseif x>=8.5 message = 'Arista'; if x>=8.5 message = 'Arista'; 6.10 Να γίνει μετατροπή του τρόπου διακλάδωσης της ροής του παρακάτω προγράμματος με χρήση switch, αντί για if: x = input('select: ); if x==1 disp('add new patient'); elseif x==2 disp('display all patients'); elseif x==0 disp('exit'); else disp('error'); 6.11 Να γίνει μετατροπή του τρόπου διακλάδωσης της ροής του παρακάτω προγράμματος με χρήση if, αντί για switch: NumberOfFeet = input('posa podia eixe to ar8ropodo? ); switch NumberOfFeet case 6 disp('entomo'); case 8 disp('araxni'); otherwise disp('polypodo');

47 7 Επαναληπτικοί βρόχοι Το τρίτο βασικό στοιχείο ενός αλγορίθμου, και κατά συνέπεια και του προγράμματος που τον υλοποιεί, είναι η δυνατότητα επανάληψης μιας ομάδας εντολών (τα άλλα δύο βασικά στοιχεία είναι η ανάθεση και η επιλογή). Οι βασικές εντολές δημιουργίας επαναληπτικών βρόχων είναι η for και η while. Η διαφορά τους είναι ότι η for προκαλεί εκτέλεση μιας ομάδας εντολών για συγκεκριμένο αριθμό επαναλήψεων, ενώ με τη while η ομάδα εντολών εκτελείται επαναληπτικά συνεχώς όσο ικανοποιείται μια συγκεκριμένη συνθήκη. 7.1 Εντολή επανάληψης FOR Βασική σύνταξη της εντολής for: for δείκτης = <αρχική_τιμή> : <τελική_τιμή> <εντολές> Μια μεταβλητή που χρησιμοποιείται ως δείκτης παίρνει την αρχική_τιμή και οι <εντολές> εκτελούνται για πρώτη φορά. Μετά ο δείκτης αυξάνεται κάθε φορά κατά ένα (1) και οι <εντολές> επαναλαμβάνονται για όσο ο δείκτης βρίσκεται ανάμεσα στην αρχική_ και στην τελική_τιμή. Σύνταξη της εντολής for για οποιοδήποτε βήμα: for δείκτης = <αρχική_τιμή> : <βήμα> : <τελική_τιμή> <εντολές> Εδώ ο δείκτης μεταβάλλεται κάθε φορά κατά το βήμα και οι εντολές επαναλαμβάνονται για όσο ο δείκτης βρίσκεται ανάμεσα στην αρχική_ και στην τελική_τιμή. Το βήμα μπορεί να είναι θετικό ή αρνητικό, ακέραιος ή κινητής υποδιαστολής. Εάν το βήμα παραλείπεται, θεωρείται ίσο με τη μονάδα (όπως στον πρώτο τρόπο σύνταξης). Παραδείγματα % Θετικό βήμα (ίσο με 1, αν παραλείπεται) for i=1:3 disp('hello'); Αποτελέσματα Hello Hello Hello % Αρνητικό βήμα for i=4:-2:1 disp(i); 4 2 % Δεκαδικό βήμα for i=2:0.4:3 fprintf('%.1f, ',i); 2.0, 2.4, 2.8, % Εύρεση αθροίσματος από το 1 έως το 100 s = 0; % Μηδενισμός μεταβλητής-αθροιστή for i=1:100 s = s + i; s s = 5050

48 48 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 7.2 Εντολή επανάληψης WHILE Η while είναι πολύ βασική εντολή επανάληψης. Με τη while ο αριθμός των επαναλήψεων δεν είναι συγκεκριμένος, όπως με τη for, αλλά ο βρόχος επαναλαμβάνεται συνεχώς όσο ικανοποιείται μια συγκεκριμένη συνθήκη. Σύνταξη της εντολής while: while <συνθήκη> <εντολές>... Οι εντολές εκτελούνται επαναληπτικά και συνεχώς για όσο ικανοποιείται η συνθήκη. Σημείωση: Ένας επαναληπτικός βρόχος for μπορεί πάντα να αντικατασταθεί από κατάλληλο βρόχο while, αλλά το αντίστροφο δεν είναι πάντα δυνατόν. Παραδείγματα % Επαναληπτική προτροπή για πίεση του πλήκτρου 0 x = input('press 0, then <enter>: '); while x~=0 x = input('press 0, then <enter>: '); disp('thanks!'); % Παράδειγμα αντικατάστασης του for από while disp('loop "for":') for i=1:5 disp(i); disp('loop "while":') i = 1; while i<=5 disp(i); i = i + 1; Αποτελέσματα Press 0, then <enter>: 4 Press 0, then <enter>: 2 Press 0, then <enter>: 7 Press 0, then <enter>: 1 Press 0, then <enter>: 0 Thanks! loop "for": loop "while": Ο πραγματικός ρόλος της συνθήκης στις εντολές if και while Στην πραγματικότητα, στη θέση της συνθήκης στις εντολές if και while πρέπει να υπάρχει μια λογική τιμή (1 ή 0, true ή false). Αυτό στην πράξη επιτυγχάνεται με μια συνθήκη, η οποία έχει ως αποτέλεσμα μια τέτοια λογική τιμή. Π.χ.1: Οι εντολές while true, <εντολές>; ή while 1, <εντολές>; προκαλούν ατέρμονη επανάληψη (infinite loop) των εσωτερικών εντολών, ενώ οι εντολές while false, <εντολές>; ή while 0, <εντολές>; δεν προκαλούν καμία επανάληψη. Π.χ.2: Η εντολή rem(x,y) δίνει το υπόλοιπο της διαίρεσης x/y. Με το παρακάτω παράδειγμα μπορούμε να ελέγξουμε αν ο αριθμός που εισάγεται είναι άρτιος: n = input('input an integer: '); ypoloipo = rem(n,2); if ~ypoloipo fprintf('o ari8mos %d einai artios',n);

49 Επαναληπτικοί βρόχοι Εντολή διακοπής επαναληπτικού βρόχου: BREAK Σύνταξη της εντολής break: break Η break προκαλεί την άμεση έξοδο από ένα επαναληπτικό βρόχο (for ή while). Παράδειγμα for x=-2:2 if x==0 break fprintf('x = %d, 1/x = %.1f\n',x,1/x); Αποτέλεσμα x = -2, 1/x = -0.5 x = -1, 1/x = -1.0 >> 7.4 Εντολή μετάβασης στην επόμενη επανάληψη βρόχου: CONTINUE Σύνταξη της εντολής continue: continue Η continue προκαλεί την άμεση μετάβαση στην επόμενη επανάληψη ενός επαναληπτικού βρόχο (for ή while). Παράδειγμα for x=-2:2 if x==0 continue fprintf('x = %d, 1/x = %.1f\n',x,1/x); Αποτέλεσμα x = -2, 1/x = -0.5 x = -1, 1/x = -1.0 x = 1, 1/x = 1.0 x = 2, 1/x = 0.5 >> 7.5 Συνοπτική παρουσίαση εντολών προγραμματισμού του MATLAB: lang Λίστα με τις εντολές προγραμματισμού του MATLAB εμφανίζεται στο Command Window με την εντολή help lang (ή doc lang, στο παράθυρο της Βοήθειας).

50 50 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 7.6 Μεταβλητές συγκεκριμένης χρήσης Στους βρόχους επανάληψης και επιλογής εμφανίζονται συχνά μεταβλητές με συγκεκριμένη χρήση. Οι συνηθέστερες τέτοιου είδους χρήσεις μεταβλητών είναι οι εξής: Δείκτης (index): Χρησιμοποιείται στους βρόχους for για τον έλεγχο της έναρξης και του τερματισμού των διαδοχικών επαναλήψεων. Δεν συμμετέχει πάντοτε στις εσωτερικές εντολές του βρόχου, ενώ σχεδόν ποτέ δεν πρέπει να μεταβάλλεται από εντολές στο εσωτερικό του βρόχου. Παράδειγμα Αποτέλεσμα % Δείκτης (i) for i=1:4 disp(i); Μετρητής (counter): Χρησιμοποιείται στους βρόχους επανάληψης (for και while) για τη μέτρηση του αριθμού των επαναλήψεων. Ο μετρητής πρέπει να μηδενίζεται πριν από την είσοδο στο βρόχο. Παράδειγμα % Μετρητής (n) n = 0; for i=1:1000 if rem(i,7)==0 n = n + 1; fprintf('yparxoun %d pollaplasia toy 7 apo 1 ews 1000', n); Αποτέλεσμα Yparxoun 142 pollaplasia toy 7 apo 1 ews 1000 Αθροιστής (adder): Χρησιμοποιείται στους βρόχους επανάληψης (for και while) για την εύρεση ενός αθροίσματος. Ο αθροιστής πρέπει να μηδενίζεται πριν απ την είσοδο στο βρόχο. Παράδειγμα % Αθροιστής (s) s = 0; for i=1:100 s = s + i; disp(s); Αποτέλεσμα 5050 Σημείωση: Μεταβλητή με παρόμοια χρήση μπορεί να χρησιμοποιηθεί και για την εύρεση ενός γινομένου, αλλά προφανώς τότε η αρχική της τιμή δεν είναι το 0, αλλά το 1.

51 Επαναληπτικοί βρόχοι 51 Ένδειξη ή «σημαία» (flag): Χρησιμοποιείται ως ένδειξη για τον έλεγχο της εκτέλεσης μιας εντολής ή όχι. Πολλές φορές πρόκειται για λογική μεταβλητή, ή απλά μια μεταβλητή με δύο τιμές ( flag up, flag down ). Συχνά παίρνει μια αρχική τιμή στην αρχή του προγράμματος,, και συνήθως η κατάστασή της αλλάζει με την ικανοποίηση μιας συνθήκης, ώστε αυτό να γίνει γνωστό αργότερα στο πρόγραμμα. Δεν χρησιμοποιείται αναγκαστικά σε βρόχους. Παραδείγματα % Flag "displayresults" % Εύρεση του αθροίσματος από 1 έως 100 displayresults = 1; s = 0; for i=1:100 s = s + i; if displayresults==1 fprintf('sum from 1 to 100: %d\n',n); % Flag "primefound" % Εύρεση του 1ου πρώτου αριθμού μετά από % ένα συγκεκριμένο αριθμό (θα χρησιμοποιηθεί % η συνάρτηση του MATLAB "isprime", η οποία % ελέγχει αν ένας αριθμός είναι πρώτος ή όχι). primefound = 0; n = 1000; while primefound==0 n = n + 1; if isprime(n)==1 primefound = 1; if primefound==1 fprintf(1st prime after 1000: %d',n); Αποτελέσματα Sum from 1 to 100: st prime after 1000: 1009

52 52 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 7.7 Βασικά παραδείγματα εφαρμογής εντολών επιλογής και επανάληψης Παρακάτω περιγράφονται, μέσω παραδειγμάτων, οι πιο βασικές εφαρμογές αλγορίθμων στους οποίους χρησιμοποιούνται εντολές επιλογής και επανάληψης, δηλαδή (α) εύρεση α- θροίσματος και μέσης τιμής (β) εύρεση μέγιστης και ελάχιστης τιμής, (γ) απαρίθμηση, και (δ) έλεγχος εγκυρότητας κατά την εισαγωγή τιμών: α) Εύρεση αθροίσματος και μέσης τιμής Πρόβλημα: Να γραφτεί πρόγραμμα στο οποίο να γίνεται εισαγωγή από το πληκτρολόγιο 100 βαθμών σπουδαστών και να τυπώνεται η μέση τιμή τους. Λύση: Πρόγραμμα s = 0; % Αρχικοποίηση αθροιστή for i=1:100 x = input('ba8mos? '); s = s + x; mo = s/100; fprintf('mesos oros = %.1f\n', mo); Αποτέλεσμα Ba8mos? 8 Ba8mos? 6.5 Ba8mos? 7... Ba8mos? 6 Mesos oros = 7.2 β) Εύρεση μέγιστης (ή ελάχιστης) τιμής Πρόβλημα: Να γραφτεί πρόγραμμα στο οποίο να βρίσκονται και να τυπώνονται η μέγιστη από 365 τιμές θερμοκρασίας (μία για κάθε μέρα του έτους) που εισάγονται από το πληκτρολόγιο. Επίσης πρέπει να τυπώνεται και ο αριθμός της ημέρας στην οποία βρέθηκε η μέγιστη θερμοκρασία. Λύση: Πρόγραμμα for i=1:365 fprintf('temperature for day %d: ', i); T = input(''); if i==1 MaxT = T; % Αρχικοποίηση της μεταβλητής της μέγιστης θερμοκρασίας if T > MaxT MaxT = T; DayOfMaxT = i; End fprintf('maximum temperature is %d, in day %d\n', MaxT, DayOfMaxT); Αποτέλεσμα Temperature for day 1: 21 Temperature for day 2: 18 Temperature for day 3: Temperature for day 3: 16 Maximum temperature is 37, in day 209 Σημείωση: Για εύρεση της ελάχιστης τιμής, πρέπει να αλλάξει η φορά της ανισότητας.

53 Επαναληπτικοί βρόχοι 53 γ) Απαρίθμηση Πρόβλημα: Να γραφτεί πρόγραμμα στο οποίο να γίνεται εισαγωγή από το πληκτρολόγιο 100 τιμών βάρους και ύψους για ισάριθμους ασθενείς. Το πρόγραμμα πρέπει να υπολογίζει και να τυπώνει το Δείκτη Σωματικού Βάρους κάθε ασθενούς και στο τέλος να τυπώνει το πλήθος των ασθενών που έχουν κανονικό βάρος (βλ. παρακάτω πίνακα). Σημείωση: Ο Δείκτης Σωματικού Βάρους (Body Mass Index, BMI) είναι ένας στατιστικός δείκτης για την εκτίμηση της παχυσαρκίας σε ενήλικες και ισούται με το πηλίκο του βάρους του ατόμου (σε kg) προς το τετράγωνο του ύψους του (σε m): Βάρος (kg) BMI = Ύψος (m) 2 Οι κατηγορίες του BMI είναι (http://www.nhlbisupport.com/bmi/): Λιπόβαρος: BMI< 18.5 Κανονικό βάρος: 18.5 BMI < 25 Υπέρβαρος: 25 BMI < 30 Παχύσαρκος: BMI 30 Λύση: Πρόγραμμα n = 0; % Αρχικοποίηση μετρητή for i=1:100 fprintf('\npatient %d:\n', i); weight = input('weight(kg)? '); height = input('height(m)? '); bmi = weight/height^2; if bmi>=18.5 & bmi<25 n = n + 1; fprintf('bmi = %.1f', bmi); fprintf('number of patients with normal BMI: %d\n', n); Αποτέλεσμα Patient 1: Weight(kg)? 82 Height(m)? 1.70 BMI = 28.4 Patient 2: Weight(kg)? 75 Height(m)? 1.72 BMI = Patient 100: Weight(kg)? 96 Height(m)? 1.80 BMI = 29.6 Number of patients with normal BMI: 67

54 54 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB δ) Έλεγχος εγκυρότητας κατά την εισαγωγή τιμών Πρόβλημα: Να γραφτεί πρόγραμμα στο οποίο (α) να γίνεται εισαγωγή από το πληκτρολόγιο 100 βαθμών σπουδαστών και (β) στο τέλος να απεικονίζεται ο μέγιστος βαθμός. Στο πρόγραμμα πρέπει να γίνεται επανάληψη της εισαγωγής του βαθμού, σε περίπτωση που αυτός δεν είναι έγκυρος (πρέπει: 0 βαθμός 10). Λύση: Πρόγραμμα for i=1:100 fprintf('ba8mos %d? ',i); x = input(''); while x<0 x>10 fprintf('la8os eisagwgi. Ba8mos %d? ',i); x = input(''); if i==1, MaxBa8mos = x; % Αρχικοποίηση μεταβλητής μικρότερου βαθμού if x>maxba8mos MaxBa8mos = x; fprintf('megalyteros ba8mos: %d\n', MaxBa8mos); Αποτέλεσμα Ba8mos 1? 9 Ba8mos 2? 7 Ba8mos 3? 11 La8os eisagwgi. Ba8mos 3? 1 Ba8mos 4? 8... Ba8mos 100? 8 Megalyteros ba8mos: 9

55 Επαναληπτικοί βρόχοι 55 Ερωτήσεις 7.1 Ποια είναι η διαφορά των εντολών επιλογής for και while, και κατά συνέπεια ποια από τις δύο εντολές είναι γενικότερη; 7.2 α) Η while μπορεί πάντα να αντικαταστήσει μια for. Να δοθεί ένα παράδειγμα. β) Η for δεν μπορεί πάντα να αντικαταστήσει μια while. Να δοθεί ένα παράδειγμα. 7.3 Να γράψετε τι θα τυπωθεί στο Command Window μετά την εκτέλεση των παρακάτω εντολών σε κάθε μία από τις δύο περιπτώσεις: (α) (b) for i=0:2:10 for i=1:2:10 x = i^2; x = i^2; disp(x); disp(x); Ασκήσεις 7.4 Να γραφτεί πρόγραμμα στο οποίο (α) θα υπολογίζεται το άθροισμα των πρώτων Ν θετικών ακεραίων (το Ν θα εισάγεται από το πληκτρολόγιο) και (β) το αποτέλεσμα θα τυπώνεται στο Command Window με χρήση της fprintf. 7.5 Να γραφτεί πρόγραμμα το οποίο να υπολογίζει το Ν! (Ν παραγοντικό), δηλαδή το γινόμενο 1 2 N (το Ν θα εισάγεται από το πληκτρολόγιο, και το αποτέλεσμα θα τυπώνεται στο Command Window με χρήση της fprintf). 7.6 Να γραφτεί πρόγραμμα το οποίο να υπολογίζει τη μέση τιμή Ν αριθμών οι οποίοι θα εισάγονται από το πληκτρολόγιο (το Ν θα εισάγεται επίσης από το πληκτρολόγιο). 7.7 Να γραφτεί πρόγραμμα το οποίο να υπολογίζει τη μέγιστη και την ελάχιστη τιμή Ν α- ριθμών οι οποίοι θα εισάγονται από το πληκτρολόγιο (το Ν θα εισάγεται επίσης από το πληκτρολόγιο). 7.8 Να γραφτεί πρόγραμμα στο οποίο (α) να γίνεται εισαγωγή από το πληκτρολόγιο 100 βαθμών σπουδαστών και (β) να υπολογίζεται και να τυπώνεται η μέση τιμή μόνο των προβιβάσιμων βαθμών (μεγαλύτερων ή ίσων του 5). 7.9 Να γραφτεί πρόγραμμα το οποίο να τυπώνει στο Command Window έναν πίνακα αντιστοιχιών μεταξύ θερμοκρασιών Κελσίου και Φαρενάιτ σε δύο στήλες: Στην πρώτη στήλη θα βρίσκονται οι θερμοκρασίες σε βαθμούς Κελσίου από 0 έως 100 ανά 5 βαθμούς, και στη δεύτερη στήλη θα βρίσκονται οι αντίστοιχες θερμοκρασίες σε Φαρενάιτ. 9 Η σχέση των κλιμάκων θερμοκρασιών Κελσίου και Φαρενάιτ είναι: T T Σύμφωνα με το μύθο, ο σοφός βραχμάνος Σίσσα ζήτησε ως αμοιβή για την εφεύρεση ενός νέου παιχνιδιού με 64 τετράγωνα, που του είχε παραγγείλει ο Ινδός βασιλιάς Μπαλχάιτ, 1 κόκκο στάρι για το πρώτο τετράγωνο, 2 για το δεύτερο, 4 για το τρίτο, 8 για το τέταρτο, κ.ο.κ., διπλασιάζοντας έτσι μέχρι και το τελευταίο. Να κατασκευάσετε ένα πρόγραμμα που να υπολογίζει και να απεικονίζει (α) το σύνολο των κόκκων σταριού που θα έπαιρνε ως αμοιβή ο σοφός και (β) το βάρος του σταριού που θα προέκυπτε (σε τόνους), αν δεχθούμε ότι κάθε κόκκος σταριού ζυγίζει γραμμάρια Να γραφτεί πρόγραμμα το οποίο να τυπώνει στο Command Window το μεγαλύτερο α- κέραιο του οποίου το τετράγωνο είναι μικρότερο του Να γραφτεί πρόγραμμα το οποίο να καταγράφει το πλήθος των θετικών (P) και το πλήθος των αρνητικών (N) αριθμών που εισάγονται από το πληκτρολόγιο. Η εισαγωγή και F 5 C

56 56 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB καταγραφή των αριθμών θα συνεχίζεται μέχρι να εισαχθεί ο αριθμός 0, και τότε οι α- ριθμοί P και N θα τυπώνονται στο Command Window με κατάλληλο μήνυμα Να γραφτεί πρόγραμμα στο οποίο να γίνεται συνεχώς εισαγωγή βαθμών σπουδαστών από το πληκτρολόγιο. Εάν ο βαθμός είναι προβιβάσιμος (μεγαλύτερος ή ίσος του 5), τότε πρέπει να τυπώνεται το μήνυμα Pass, αλλιώς πρέπει να τυπώνεται Not pass. Η διαδικασία θα διακόπτεται όταν εισαχθεί κάποιος αρνητικός αριθμός (π.χ. -1). Στη συνέχεια, πρέπει να τυπώνεται η μέση τιμή των βαθμών που εισήχθησαν Να γραφτεί πρόγραμμα με το οποίο να απεικονίζονται στο Command Window όλοι οι αριθμοί της σειράς Fibonacci που δεν υπερβαίνουν το 100 (στη σειρά Fibonacci, κάθε αριθμός είναι ίσος με το άθροισμα των δύο προηγούμενών του: ) Να γίνει μετατροπή του τρόπου διακλάδωσης της ροής του παρακάτω προγράμματος με χρήση βρόχου while, αντί του βρόχου for (να παρατηρηθεί επίσης η τελική τιμή της μεταβλητής i σε κάθε μία από τις περιπτώσεις, που απεικονίζεται με την disp της τελευταίας γραμμής): for i=1:100 disp(i^2); disp(i); 7.16 Να γίνει μετατροπή του τρόπου διακλάδωσης της ροής του παρακάτω προγράμματος με χρήση βρόχου for, αντί του βρόχου while (να παρατηρηθεί επίσης η τελική τιμή της μεταβλητής n σε κάθε μία από τις περιπτώσεις, που απεικονίζεται με την disp της τελευταίας γραμμής): n = 100; while n>0 n = n 4; disp(n^0.5); disp(n);

57 8 Πίνακες Στις προηγούμενες ενότητες περιγράφηκαν τα βασικά περί προγραμματισμού καθώς και μια εισαγωγή στο περιβάλλον του MATLAB. Παρόλο που με τα ελάχιστα βασικά στοιχεία που ήδη δόθηκαν (1. απλές μεταβλητές αριθμών και χαρακτήρων, 2. τελεστές αριθμητικών, συγκριτικών και λογικών πράξεων, και 3. εντολές ανάθεσης, επιλογής και επανάληψης) μπορεί θεωρητικά να γραφτούν προγράμματα που επιλύουν οποιοδήποτε πρόβλημα, στην πραγματικότητα υπάρχουν πολύ περισσότερα στοιχεία σε κάθε γλώσσα προγραμματισμού που κάνουν ευκολότερη και συνεκτικότερη την υλοποίηση των σύνθετων αλγορίθμων. 8.1 Γενικά για τους πίνακες Στα μαθηματικά (στο πεδίο της γραμμικής άλγεβρας) ως πίνακα εννοούμε μια ορθογώνια διάταξη αριθμών σε γραμμές και στήλες. Στον προγραμματισμό, στους πίνακες μπορούν να αποθηκευτούν και άλλοι τύποι μεταβλητών (όχι μόνο αριθμοί), π.χ. χαρακτήρες. Πίνακας (matrix, array) ονομάζεται μια ομάδα μεταβλητών ίδιου τύπου με ένα κοινό ό- νομα. Στοιχεία του πίνακα λέγονται οι επιμέρους απλές μεταβλητές που ανήκουν στον πίνακα. Δείκτες ενός στοιχείου του πίνακα λέγονται οι θετικοί διαδοχικοί ακέραιοι (ένας ή περισσότεροι, αναλόγως του πλήθους των διαστάσεων του πίνακα) που δείχνουν τη θέση του στοιχείου στον πίνακα. Οι συνήθεις πίνακες είναι δύο διαστάσεων (δισδιάστατοι πίνακες). Αναφερόμενοι σε έ- ναν πίνακα Μ Ν, εννοούμε έναν πίνακα με Μ γραμμές και Ν στήλες. Ως ειδικές περιπτώσεις πινάκων μπορούμε να θεωρήσουμε τους απλούς αριθμούς (πίνακες 1 1), που λέγονται και βαθμωτά μεγέθη, καθώς και τους πίνακες μιας γραμμής (1 Ν) ή μιας στήλης (Μ 1) που λέγονται μονοδιάστατοι πίνακες (vectors, διανύσματα). Επεκτείνοντας την έννοια του πίνακα, έχουμε πίνακες τριών ή και περισσοτέρων διαστάσεων (πολυδιάστατοι πίνακες). Το πλήθος των διαστάσεων ενός πίνακα λέγεται διαστατικότητα (dimensionality). Το πλήθος των στοιχείων ενός πίνακα ονομάζεται μέγεθος του πίνακα και ισούται με το γινόμενο των διαστάσεών του. Η προσπέλαση όλων των στοιχείων ενός πίνακα διαδοχικά λέγεται σάρωση του πίνακα Πίνακας μιας διάστασης Πίνακας δύο διαστάσεων Πίνακας τριών διαστάσεων

58 58 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 8.2 Μονοδιάστατοι πίνακες Ένας πίνακας μιας διάστασης μπορεί να είναι πίνακας-γραμμή ή πίνακας-στήλη, ανάλογα με το πώς διατάσσονται τα στοιχεία του. Το πλήθος των στοιχείων ενός μονοδιάστατου πίνακα λέγεται και μήκος του πίνακα. Κάθε στοιχείο ενός μονοδιάστατου πίνακα χαρακτηρίζεται από το όνομα του πίνακα και από τον δείκτη του στοιχείου, που παίρνει τιμές από 1 έως το μήκος του πίνακα..χ. Αν Α είναι ο μονοδιάστατος πίνακας μήκους 5: , τότε Α(2)=3. Ανάθεση τιμών σε μονοδιάστατο πίνακα: Η ανάθεση των τιμών ενός μονοδιάστατου πίνακα γίνεται απ ευθείας μέσα σε αγκύλες [...], ως εξής: Σε πίνακα-γραμμή, τα στοιχεία χωρίζονται μεταξύ τους με κόμμα (,) ή κενό διάστημα, π.χ. A = [8 7 5] ή A = [8,7,5]. Σε πίνακα-στήλη, τα στοιχεία χωρίζονται με ελληνικό ερωτηματικό (;) ή αλλαγή γραμμής (με Enter), π.χ. B = [-1;0;4]. Αναφορά σε στοιχείο μονοδιάστατου πίνακα: Σε ένα στοιχείο του πίνακα αναφερόμαστε με το όνομα του πίνακα και σε παρένθεση το δείκτη του στοιχείου: όνομα(δείκτης) Σάρωση μονοδιάστατου πίνακα: Γίνεται με ένα επαναληπτικό βρόχο, όπως τύπου for. Παραδείγματα % Ορισμοί πινάκων A = [ ] % Πίνακας-γραμμή B = [-1;0;4] % Πίνακας-στήλη C = [12-3] % Πίνακας-στήλη % Αντικατάσταση στοιχείων πίνακα A(2) = 9; A(3) = -7 % Πράξεις με στοιχεία πινάκων x = 2*A(5) B(3) + 1 % Αρχικοποίηση πίνακα με σάρωση και % μηδενισμό των στοιχείων του for i=1:5 B(i) = 0; disp(b); % Εύρεση μέσης τιμής στοιχείων πίνακα s = 0; for i=1:5 s = s + A(i); m = s / 5 % Άθροισμα πινάκων στοιχείο-προς-στοιχείο A = [ ]; B = [ ]; for i=1:5 C(i) = A(i) + B(i); C Αποτελέσματα A = B = C = 12-3 A = x = m = C =

59 Πίνακες Δισδιάστατοι πίνακες Ανάθεση τιμών σε δισδιάστατο πίνακα: Οι τιμές τοποθετούνται μέσα σε αγκύλες [...]. Τα στοιχεία της ίδιας γραμμής χωρίζονται με κόμμα (,) ή κενό διάστημα (space). Οι γραμμές χωρίζονται μεταξύ τους με ελληνικό ερωτηματικό (;) ή με αλλαγή γραμμής ( Enter): όνομα = [α11, α12, α13 ; α21, α22, α23] ή όνομα = [α11 α12 α13 α21 α22 α23] Αναφορά σε στοιχείο δισδιάστατου πίνακα: Οι δείκτες είναι δύο, μπαίνουν σε παρένθεση και χωρίζονται με κόμμα: Ο πρώτος δείκτης αναφέρεται στη γραμμή στην οποία ανήκει το στοιχείο και ο δεύτερος στη στήλη: όνομα(δείκτης_γραμμής, δείκτης_στήλης). Π.χ. Το στοιχείο που ανήκει στην τρίτη γραμμή και δεύτερη στήλη ενός πίνακα Α είναι το Α(3,2). Αποθήκευση πίνακα στη μνήμη: Η αποθήκευση ενός πίνακα στη μνήμη γίνεται σε συνεχόμενες θέσεις (διευθύνσεις) μνήμης. Αρχικά αποθηκεύονται πληροφορίες σχετικά με τις διαστάσεις του πίνακα και τον τύπο των μεταβλητών (περιοχή header). Στη συνέχεια αποθηκεύονται οι τιμές των στοιχείων του πίνακα (περιοχή data). Στο MATLAB (καθώς και στη γλώσσα Fortran, σε αντίθεση όμως με τη γλώσσα C και τις περισσότερες γλώσσες προγραμματισμού) η αποθήκευση των στοιχείων γίνεται. «κατά στήλες»: Πρώτα τα στοιχεία της 1 ης στήλης, στη συνέχεια τα στοιχεία της 2 ης στήλης κ.ο.κ.. *. Για παράδειγμα, έστω ο πίνακας: α α α α A= α α α α Η αποθήκευση των στοιχείων του πίνακα στη μνήμη γίνεται στο MATLAB κατά στήλες, σε συνεχόμενες θέσεις μνήμης: α 11 α 21 α 31 α 41 α 12 α 22 α 32 α 42 Ταχεία σάρωση πίνακα: Επειδή στο MATLAB οι πίνακες αποθηκεύονται κατά στήλες σε συνεχόμενες διευθύνσεις στη μνήμη του υπολογιστή, η σάρωσή τους γίνεται ταχύτερα κατά στήλες παρά κατά γραμμές. Αυτό συμβαίνει διότι οι σύγχρονοι επεξεργαστές, όταν ζητηθεί από τη μνήμη RAM μια μεταβλητή, αποθηκεύουν μαζί με αυτήν και τις επόμενες διαδοχικές θέσεις σε μια μικρή μνήμη γρήγορης προσπέλασης που λέγεται cache. Έτσι, όταν ζητηθεί η μεταβλητή της επόμενης θέσης, αυτή θα διαβαστεί από την μνήμη cache και όχι από τη RAM. Έτσι, στη σάρωση κατά στήλες (α 11, α 21, α 31, ) γίνονται λιγότερα αιτήματα προς τη μνήμη RAM σε σχέση με τη σάρωση κατά γραμμές (α 11, α 12, α 21, α 22, α 31, α 32, ). α α α α A= α α α α α α α α A= α α α α κ.λ.π. α 11 α 21 α 31 α 41 α 12 α 22 α 32 α 42 α 11 α 21 α 31 α 41 α 12 α 22 α 32 α 42 * Γενικεύοντας σε πίνακες οποιασδήποτε διάστασης, η αποθήκευση ενός πίνακα στο MATLAB γίνεται έτσι ώστε να αυξάνεται πρώτος ο δείκτης που βρίσκεται πιο αριστερά, και τελευταίος αυτός που είναι πιο δεξιά.

60 60 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Παραδείγματα Αποτελέσματα Παράδειγμα 1: α) Εισαγωγή στοιχείων σε δισδιάστατο πίνακα από το πληκτρολόγιο: Στο παράδειγμα εισάγονται από το πληκτρολόγιο 5 βαθμοί για 2 μαθητές σε έναν πίνακα 2x5 (2 γραμμών και 5 στηλών). % Εισαγωγή 5 βαθμών 2 μαθητών % από το πληκτρολόγιο (5 βαθμοί ανά γραμμή) for i=1:2 for j=1:5 D(i,j) = input('degree? '); Degree? 8 Degree? 9 Degree? 5... Έστω ότι εισήχθησαν οι βαθμοί: D D = β) Εύρεση του μέσου όρου των βαθμών του 2 ου μαθητή (2 η γραμμή του πίνακα): s = 0; % Αρχικοποίηση αθροιστή for j=1:5 s = s + D(2,j); m = s/5 Παράδειγμα 2: Σάρωση κατά γραμμές και μετά κατά στήλες για ανάδειξη της διαφοράς χρόνου. Θα γίνει χρήση των εντολών tic (έναρξη χρονόμετρου) και toc (λήξη χρονόμετρου και απεικόνιση του χρόνου που πέρασε στο Command Window): clc; clear all; L = 1000; % Πλήθος γραμμών M = 1000; % Πλήθος στηλών A = rand(l,m); % Δημιουργία πίνακα A 1000x1000 με τυχαίους αριθμούς m = 6 % Σάρωση κατά γραμμές tic % Έναρξη χρονόμετρου s = 0; for i=1:l for j=1:m s = s + A(i,j); toc % Λήξη χρονόμετρου % Σάρωση κατά στήλες tic % Έναρξη χρονόμετρου s = 0; for j=1:m for i=1:l s = s + A(i,j); toc % Λήξη χρονόμετρου >> Elapsed time is seconds. >> Elapsed time is seconds.

61 Πίνακες Συναρτήσεις πινάκων Ακολουθούν μερικές χρήσιμες συναρτήσεις (εντολές) για χειρισμό πινάκων στο MATLAB: length length(πίνακας) Δίνει το μέγεθος της μεγαλύτερης διάστασης του πίνακα. Χρησιμοποιείται συνήθως στους μονοδιάστατους πίνακες, γιατί δίνει απ ευθείας το πλήθος των στοιχείων τους. Παραδείγματα A = [ ]; B = [ ]; length(a), length(b) Αποτελέσματα ans = 6 ans = 3 % Εύρεση μέσης τιμής μονοδιάστατου πίνακα A = [ ]; s = 0; for i=1:length(a) s = s + A(i); m = s / length(a) m = 3 % Εύρεση μέγιστης τιμής μονοδιάστατου πίνακα A = [ ]; Max = A(1); for i=1:length(a) if A(i)>Max, Max = A(i); disp(max); 7 size size(πίνακας) Δίνει το μέγεθος των διαστάσεων του πίνακα (σε μορφή μονοδιάστατου πίνακαγραμμής). Σε πίνακες δύο διαστάσεων, η πρώτη αντιστοιχεί στις γραμμές και η δεύτερη στις στήλες. Π.χ. αν ο πίνακας A έχει 2 γραμμές και 3 στήλες, τότε η size(a) έχει ως αποτέλεσμα τον πίνακα [2 3]. ή size(πίνακας,n) Δίνει το μέγεθος της n-οστής διάστασης του πίνακα. Για παράδειγμα, σε έναν πίνακα Α δύο διαστάσεων, η size(a,1) δίνει το πλήθος των γραμμών και η size(a,2) δίνει το πλήθος των στηλών. Συνήθεις χρήσεις της size είναι η αυτόματη εύρεση της τελικής τιμής των βρόχων for κατά τη σάρωση ενός πίνακα, καθώς και η γρήγορη εύρεση του πλήθους των στοιχείων του πίνακα (ισούται με το γινόμενο των διαστάσεών του, π.χ. size(a,1)* size(a,2)). Παραδείγματα Αποτελέσματα A = [4-1 3;0 7 8] A =

62 62 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB % Εύρεση διαστάσεων και αποθήκευση σε πίνακα dimensions = size(a) dimensions = 2 3 % Εύρεση πλήθους στοιχείων του A με τη size n = size(a,1)*size(a,2) % Εύρεση πλήθους στοιχείων του A με σάρωση n = 0; for i=1:size(a,1) for j=1:size(a,2) n = n + 1; n n = n = 6 6 % Εύρεση της μέσης τιμής του πίνακα Α s = 0; for i=1:size(a,1) for j=1:size(a,2) s = s + A(i,j); m = s / (size(a,1)*size(a,2)) % Εύρεση μέγιστης και ελάχιστης τιμής πίνακα Min = A(1,1); Max = A(1,1); for i=1:size(a,1) for j=1:size(a,2) if A(i,j)>Max, Max = A(i,j); if A(i,j)<Min, Min = A(i,j); Min, Max m = Min = Max = det ορίζουσα = det(πίνακας) Δίνει την ορίζουσα ενός τετράγωνου πίνακα (με ίσο αριθμό γραμμών και στηλών). inv αντίστροφος = inv(πίνακας) Δίνει τον αντίστροφο ενός τετράγωνου πίνακα. Αντίστροφος ενός πίνακα λέγεται αυτός που αν πολλαπλασιαστεί με τον αρχικό πίνακα έχει ως αποτέλεσμα το μοναδιαίο πίνακα (δηλαδή έναν πίνακα που έχει στην κύρια διαγώνιο μονάδες και παντού αλλού μηδενικά): A*B = I ή A*A -1 = I Παραδείγματα Αποτελέσματα >> A = [ ] >> B = inv(a) >> D = det(a) A = B = D =

63 Πίνακες 63 Παράδειγμα: Επίλυση συστήματος γραμμικών εξισώσεων (βλ. και παράδειγμα 9.10): Έστω το σύστημα γραμμικών εξισώσεων: 2x 1 + 3x 1 = 6 4x 2 + 9x 2 = 15 Επίλυση του συστήματος με ορίζουσες: Αν D= η ορίζουσα συστήματος και D= 1, D= 2 οι ορίζουσες των x 1, x 2, τότε: x1 = και x1 =. Εύρεση της λύσης με τη βοήθεια του MATLAB: D = [ ]; D1 = [ ]; D2 = [ ]; Αποτελέσματα: x1 = 1.5 x1 = det(d1)/det(d) x2 = det(d2)/det(d) x2 = Σύγκριση ισότητας πινάκων Δυο πίνακες είναι ίσοι όταν έχουν ίσες διαστάσεις και τα αντίστοιχα στοιχεία τους είναι ίσα ένα προς ένα. Η σύγκριση ισότητας δύο πινάκων μπορεί να γίνει με συγγραφή κατάλληλου προγράμματος όπου να γίνεται απ ευθείας σύγκριση των διαστάσεων των πινάκων και στη συνέχεια των αντίστοιχων στοιχείων τους. Παράδειγμα Αποτέλεσμα equalityflag = 1; % μεταβλητή ελέγχου ισότητας % Έλεγχος ισότητας διαστάεων if size(a,1)~= size(b,1) size(a,2)~=size(b,2) equalityflag = 0; % Έλεγχος ισότητας στοιχείων if equalityflag==1 for i=1:size(a,1) for j=1:size(a,2) if A(i,j)~=B(i,j), equalityflag = 0; if equalityflag==1 disp('a is equal to B'); else disp('a is not equal to B'); A is not equal to B 8.6 Συνοπτική παρουσίαση απλών εντολών χειρισμού πινάκων του MATLAB: elmat Λίστα με τις απλές εντολές χειρισμού πινάκων του MATLAB εμφανίζεται στο Command Window με την εντολή help elmat (ή doc elmat, στο παράθυρο της Βοήθειας).

64 64 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 8.1 Τι ονομάζουμε (α) πίνακα, (β) στοιχεία πίνακα, (γ) δείκτες πίνακα, (δ) διαστατικότητα πίνακα, (ε) μέγεθος πίνακα, (στ) σάρωση πίνακα; 8.2 α) Πώς αποθηκεύονται τα στοιχεία ενός πίνακα στη μνήμη του υπολογιστή; Να δοθεί παράδειγμα για δισδιάστατο πίνακα. β) Πώς πρέπει να σαρωθεί ένας πίνακας, ώστε η σάρωση να γίνει ταχύτερα; Γιατί; 8.3 α) Τι αποτέλεσμα δίνει η εντολή (συνάρτηση) length σε μονοδιάστατο, και τι σε δισδιάστατο πίνακα; β) Τι αποτέλεσμα δίνει η εντολή (συνάρτηση) size σε μονοδιάστατο, και τι σε δισδιάστατο πίνακα; γ) Να γραφτεί κατάλληλη γραμμή κώδικα, για την εύρεση του πλήθους των στοιχείων: (i) μονοδιάστατου πίνακα: (ii) δισδιάστατου πίνακα: 8.4 Να συμπληρωθούν τα κενά ( ) ώστε ο πίνακας Α να σαρώνεται με τον ταχύτερο τρόπο: for =1:size(A, ) for =1:size(A, ) s = s + A(i,j) Ασκήσεις 8.5 Δίνεται ο μονοδιάστατος πίνακας Α = [3, 0, -5, 2, 7, 12, 4, 1]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB με το οποίο: α) Να υπολογίζεται το άθροισμα και η μέση τιμή των στοιχείων του πίνακα Α. β) Οι ανωτέρω τιμές να τυπώνονται στο Command Window με κατάλληλη χρήση της εντολής fprintf (το άθροισμα ως ακέραιος και η μέση τιμή με 2 δεκαδικά ψηφία) π.χ.: "Sum=23, Mean=3.29". 8.6 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) να ζητούνται από το πληκτρολόγιο το πλήθος στοιχείων ενός μονοδιάστατου πίνακα, β) να εισάγονται από το πληκτρολόγιο τα στοιχεία του πίνακα, γ) να υπολογίζεται η μέγιστη και η ελάχιστη τιμή των στοιχείων του πίνακα. 8.7 Δίνεται ο μονοδιάστατος πίνακας Α = [3, 2, 2, 5, 3, 2, 3, 4, 6, 5, 4, 3, 3, 5, 4, 2]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο κάθε στοιχείο του πίνακα να αντικαθίσταται από τη μέση τιμή του εαυτού του και των δύο γειτονικών του (εξομάλυνση (smoothing) με τοπικό μέσο τριών σημείων). Για το πρώτο και το τελευταίο στοιχείο, να βρίσκεται η μέση τιμή του στοιχείου με το δεύτερο και το προτελευταίο αντίστοιχα. 8.8 Δίνεται ο δισδιάστατος πίνακας Α = [3, 0, -5, 2; 7, 12, 4, 1; -1, 3, 7, 0]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB το οποίο να υπολογίζει τη μέση τιμή των στοιχείων του πίνακα Α. Μετά τον υπολογισμό, η μέση τιμή πρέπει να τυπώνεται με ένα δεκαδικό ψηφίο, με κατάλληλη χρήση της εντολής fprintf. 8.9 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) να ζητούνται από το πληκτρολόγιο το πλήθος των γραμμών και των στηλών ενός δισδιάστατου πίνακα Α, β) να εισάγονται από το πληκτρολόγιο τα στοιχεία του πίνακα Α και γ) να υπολογίζεται η μέγιστη και η ελάχιστη τιμή των στοιχείων του Α.

65 Πίνακες Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB το οποίο να αποθηκεύει τις τιμές των στοιχείων της κύριας διαγωνίου ενός τετράγωνου πίνακα Α (δηλ. ενός δισδιάστατου πίνακα με ίδιο πλήθος γραμμών και στηλών) σε ένα νέο μονοδιάστατο πίνακα Β. Για ε- φαρμογή να χρησιμοποιήσετε πίνακα Α της επιλογής σας Δίνεται ο δισδιάστατος πίνακας Α = [3, 0, -5, 2; 7, 12, 4, 1; -1, 3, 7, 0]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) να βρίσκεται η μέση τιμή της 2 ης γραμμής του πίνακα. β) να βρίσκεται η μέγιστη τιμή των στηλών 3 και 4 του πίνακα Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: (α) να ορίζεται δισδιάστατος πίνακας της επιλογής σας και (β) να καταμετράται το πλήθος των θετικών, των αρνητικών και των μηδενικών στοιχείων του πίνακα, τα οποία στο τέλος να τυπώνονται στο Command Window με κατάλληλη εντολή fprintf Δίνεται ο δισδιάστατος πίνακας Α = [3, -2, -5, 2; 7, -7, 0, 1; -1, 0, 7, -4]. Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB με το οποίο να αντικαθίστανται τα αρνητικά στοιχεία του πίνακα με τον αριθμό -1 και τα θετικά με τον αριθμό Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) Αρχικά πρέπει να ζητούνται από το πληκτρολόγιο οι βαθμοί 5 μαθημάτων για 3 σπουδαστές, οι οποίοι να αποθηκεύονται σε έναν δισδιάστατο πίνακα Α του οποίου κάθε γραμμή θα περιέχει τους βαθμούς κάθε σπουδαστή. β) Στη συνέχεια, οι βαθμοί των σπουδαστών που «πέρασαν» το μάθημα (βαθμός 5) πρέπει να αποθηκεύονται σε ένα νέο μονοδιάστατο πίνακα Β. γ) Τέλος, πρέπει να υπολογίζεται το ποσοστό των σπουδαστών που «πέρασαν» το μάθημα και να τυπώνεται με κατάλληλη χρήση της εντολής fprintf, όπως στο παράδειγμα: To pososto twn spoydastwn poy perasan to ma8ima itan 80% Η σχέση μεταξύ των θερμοκρασιών σε βαθμούς Κελσίου και Φαρενάιτ είναι η εξής: 9 F C 32, όπου C η θερμοκρασία σε βαθμούς Κελσίου και F σε Φαρενάιτ. 5 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο: α) Να δημιουργηθεί ένας δισδιάστατος πίνακας Α του οποίου η πρώτη στήλη θα περιέχει βαθμούς θερμοκρασίας από 0 έως 100 ανά 5 βαθμούς Κελσίου (0, 5, 10, 15,, 100), ενώ η δεύτερη στήλη θα περιέχει τους αντίστοιχους βαθμούς σε Φαρενάιτ (32, 41, 50,, 212). β) Να υπολογιστεί η μέση τιμή των θερμοκρασιών σε βαθμούς Κελσίου και Φαρενάιτ του πίνακα Α οι οποίες να αποθηκευτούν σε ένα μονοδιάστατο πίνακα Β. γ) Να απεικονιστούν στο Command Window (i) ο πίνακας Α με disp, και (ii) οι τιμές του πίνακα Β με fprintf ώστε να εμφανίζεται το παρακάτω μήνυμα: Mean temperature is 50 Celcius or 122 Fahrenheit.

66 9 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Το MATLAB (MATrix LABoratory) έχει ιδιαίτερες και πολύ ισχυρές εγγενείς δυνατότητες χειρισμού πινάκων, που κάνει τον κώδικα συνεκτικό, σαφή και πολύ αποδοτικό. 9.1 Τελεστής «'» Ο τελεστής «'» δίπλα στον πίνακα δίνει τον ανάστροφό του (transpose: γραμμές ως στήλες και αντιστρόφως). Παραδείγματα Αποτελέσματα a = [2 5]' b = a' a = b = Τελεστής «:» Στο MATLAB ο τελεστής «:» σημαίνει ένα από τα εξής, αναλόγως της θέσης του: Ομάδα αριθμών μεταξύ ορίων. Π.χ. Α=[5:9] σημαίνει Α=[ ]. Όλα τα στοιχεία (όταν χρησιμοποιείται στη θέση του δείκτη των γραμμών ή των στηλών) Π.χ.: Α(2,:)=όλα τα στοιχεία της 2 ης γραμμής, A(:,:) = όλα τα στοιχεία. Μετατροπή σε πίνακα-στήλη (πρώτα η 1 η στήλη, μετά η 2 η κ.ο.κ.). Π.χ.: Α(:) Παραδείγματα Αποτελέσματα % Χρήση του τελεστή «:» για δημιουργία πίνακα A = [1:2:10 ; 2:2:10] A = % Χρήση του τελεστή «:» για επιλογή υποπεριοχής πίνακα B = A(2,1:3) C = A(:,3) D = A(2,:) E = A(1:2, 3:4) B = C = D = E = % Χρήση του τελεστή «:» για μετατροπή πίνακα 2 διαστάσεων σε πίνακα-στήλη: % Μετατροπή σε πίνακα-στήλη F = E(:) % Αντικατάσταση όλων των τιμών πίνακα χωρίς αλλαγή των διαστάσεών του. E(:) = 0; F = E =

67 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Αναφορά στα στοιχεία πίνακα με μοναδικό δείκτη Είναι δυνατή η αναφορά σε ένα στοιχείο ενός οποιουδήποτε πίνακα με ένα μοναδικό δείκτη, ανεξάρτητα από το αν ο πίνακας είναι μονοδιάστατος, δισδιάστατος κλπ. Αυτό γίνεται γιατί το MATLAB αποθηκεύει τον πίνακα σε συνεχόμενες διευθύνσεις μνήμης, που αποτελείται από τις στήλες του πίνακα, τη μία κάτω από την άλλη. Αυτό γίνεται φανερό με τη μετατροπή του πίνακα σε πίνακα-στήλη με τον τελεστή «:»: Παράδειγμα G = [ ] G(:) G(2) G(3) Αποτελέσματα G = ans = ans = 4 ans = Χρήση του ως τελικού δείκτη Η δεσμευμένη λέξη, όταν χρησιμοποιείται σε πίνακα., εννοεί τον τελευταίο δείκτη. Στα επόμενα παραδείγματα θεωρούνται γνωστοί οι πίνακες της παραγράφου 9.2. Παραδείγματα Αποτελέσματα x = A(1,3:) x = y = G(2:-1) y = Z = G() z = 6 filename = 'brain.bmp'; ext = filename(-3:) ext =.bmp 9.5 Δημιουργία πινάκων με χρήση άλλων πινάκων Στο MATLAB μπορούν να δημιουργηθούν πίνακες με άμεση χρήση άλλων πινάκων: Παραδείγματα % Άμεση ανάθεση ολόκληρου πίνακα L = G Αποτελέσματα L = % Ορισμός με χρήση πίνακα M = [L ; 7 8 9] M =

68 68 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 9.6 Εύρεση στοιχείων πίνακα υπό συνθήκες. Συνάρτηση find Η εύρεση των στοιχείων ενός πίνακα που υπακούουν σε μια συνθήκη γίνεται με δύο τρόπους: - Χρήση της συνθήκης στον πίνακα, με αποτέλεσμα ένα πίνακα ίδιων διαστάσεων, με λογικές τιμές 1 ή 0 (true ή false), ανάλογα με το αν το κάθε στοιχείο ικανοποιεί τη συνθήκη Π.χ.: Έστω ages = [ ]. Τότε η ages>30 δίνει [ ]. - Χρήση της συνάρτησης find, η οποία επιστρέφει αποτέλεσμα τους δείκτες του πίνακα που ικανοποιούν τη συνθήκη. Π.χ.: Έστω ages = [ ]. Τότε η find(ages>30) δίνει [2 3 6]. Στη συνέχεια, αν το αποτέλεσμα κάποιου από τους δύο παραπάνω τρόπους εφαρμοστεί στον πίνακα (ή και σε άλλον), παίρνουμε τις τιμές αυτού του πίνακα που αντιστοιχούν στους δείκτες που ικανοποιούν τη συνθήκη στον αρχικό πίνακα. Π.χ.: Έστω ages = [ ] και weights = [ ]. Τότε: ages(ages>30) [ ] ages(find(ages>30)) [ ] weights(ages>30) [ ] weights(find(ages>30)) [ ] find γραμμικοί_δείκτες = find(λογική συνθήκη σε πίνακα) Επιστρέφονται οι γραμμικοί δείκτες του πίνακα (δηλαδή οι δείκτες που αναφέρονται στον πίνακα ως μοναδική στήλη, βλ. 9.3), για τα οποία αληθεύει η συνθήκη. ή [γραμμές, στήλες] = find(λογική συνθήκη σε πίνακα) Επιστρέφονται οι δείκτες των γραμμών και των στηλών των στοιχείων του πίνακα για τα οποία αληθεύει η συνθήκη. Παραδείγματα Αποτελέσματα A = [ ]; index = find(a<0) [i,j] = find(a<0) ages = [ ] weights = [ ] weights(find(ages>30)) ages(find(ages>30)) index = ans = ages = weights = ans = ans =

69 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Σύγκριση πινάκων και των στοιχείων τους Το MATLAB διαθέτει συναρτήσεις για έλεγχο τόσο της ισότητας δύο πινάκων όσο και για τον έλεγχο της σχέσης των αντίστοιχων στοιχείων τους ένα προς ένα. a) Σύγκριση ισότητας πινάκων: Συνάρτηση isequal H συνάρτηση isequal δίνει με αποτέλεσμα λογικό 1 (true) ή 0 (false), αναλόγως με το αν 2 ή περισσότεροι πίνακες είναι ίσοι ή όχι. Σύνταξη: isequal(a, B, C,...). β) Σύγκριση πινάκων στοιχείο προς στοιχείο Οι σχεσιακοί τελεστές (==, ~=, <, >, <=, >=) μπορούν να εφαρμοστούν σε δύο πίνακες ίσων διαστάσεων, με αποτέλεσμα ένα πίνακα ίδιων επίσης διαστάσεων που σε κάθε θέση του έχει μια λογική μεταβλητή (1 ή 0), ανάλογα με το αν η σχέση ανάμεσα στα αντίστοιχα στοιχεία είναι αληθής ή όχι. Π.χ. [3 4 1] < [5 6 7] [1 1 0] γ) Έλεγχος αληθείας σχέσεων στοιχείων πινάκων: όλων (all) ή τουλάχιστον ενός (any) Η συνάρτηση all δέχεται ως είσοδο μια σχέση μεταξύ δύο πινάκων (==, ~=, <, >, <=, >=) και δίνει ως αποτέλεσμα λογικό 1 (true) αν η σχέση αληθεύει για όλα τα αντίστοιχα στοιχεία των δύο πινάκων. Παρόμοια, η συνάρτηση any δίνει αποτέλεσμα λογικό 1 αν η σχέση αληθεύει για τουλάχιστον ένα οποιοδήποτε ζεύγος στοιχείων των δύο πινάκων. Σημ: Οι συναρτήσεις all και any εφαρμόζονται με τον παραπάνω τρόπο σε δύο μονοδιάστατους πίνακες. Σε δισδιάστατους πίνακες, η εφαρμογή γίνεται κατά ζεύγη στηλών, παράγοντας έναν πίνακα γραμμή. Παράδειγμα Αποτελέσματα % Έστω ΟΙ πίνακες: A = [1 2 3] B = [0 2 3] A = B = % α) Σύγκριση ισότητας πινάκων: isequal(a,b) ans = 0 % β) Σύγκριση πινάκων στοιχείο προς στοιχείο: A==B A>B % γ) Έλεγχος αληθείας όλων ή μιας τουλάχιστον σχέσης all(a>b) any(a>b) ans = ans = ans = 0 ans = 1

70 70 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 9.8 Συναρτήσεις ταξινόμησης πίνακα Ακολουθεί περιγραφή συναρτήσεων ταξινόμησης των στοιχείων ενός πίνακα: sort Y = sort(x) Αύξουσα ταξινόμηση κάθε στήλης (ξεχωριστά) του πίνακα X. Y = sort(x,n,'asc') ή Y = sort(x,n,'desc') Αύξουσα ('asc') ή φθίνουσα ταξινόμηση του πίνακα X κατά τη διάσταση n. [Y Ι] = sort( ) Επιστροφή του ταξινομημένου πίνακα στον Y και των αρχικών δεικτών στον Ι. sortrows Υ = sortrows(x) Ταξινόμηση των γραμμών του πίνακα X σύμφωνα με τις τιμές της πρώτης στήλης. Υ = sortrows(x,c) Ταξινόμηση των γραμμών του πίνακα X σύμφωνα με τις τιμές της στήλης C. Αν C>0, η ταξινόμηση είναι αύξουσα, αν C<0, η ταξινόμηση είναι φθίνουσα. Αν ο C είναι πίνακας-γραμμή, γίνεται ταξινόμηση πρώτα ως προς το πρώτο στοιχείο του C, μετά ως προς το δεύτερο κλπ. [Y Ι] = sortrows( ) Επιστροφή του ταξινομημένου πίνακα στον Y και των αρχικών δεικτών στον Ι. Παραδείγματα Αποτελέσματα A = [7 5-6;4-2 3] A = B = sort(a) B = [B I] = sort(a) B = I = B = sortrows(a) B = [B I] = sortrows(a) B = I = B = sortrows(a,-2) B =

71 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Συναρτήσεις και τελεστές χειρισμού πινάκων Ακολουθούν χρήσιμες συναρτήσεις και τελεστές του ΜATLAB για χειρισμό πινάκων: ' (μονό εισαγωγικό: τελεστής ανάστροφου πίνακα) ανάστροφος = πίνακας' Δημιουργία του ανάστροφου (transpose) του πίνακα (γραμμές ως στήλες και αντιστρόφως), π.χ. B = A' : Σημαίνει (α) ομάδα αριθμών ή (β) όλα τα στοιχεία μιας διάστασης ή (γ) μετατροπή σε στήλη Παραδείγματα (βλ. και 9.4): i / A(2,3:6) A(2:5,3:4) ii / A(2,:) A(:,3:4) iii / A(:) (τελευταίος δείκτης) Παράδειγμα (βλ και 9.1): A(2,3:) reshape πίνακαςpq = reshape(πίνακαςmn,p,q) Μετασχηματίζει έναν m n πίνακα σε p q, αρκεί να ισχύει m n=p q (π.χ. από 2 6 σε 3 4). repmat πίνακας2 = repmat(πίνακας1,m,n) Δημιουργία του πίνακα2 που αποτελείται από m n επαναλήψεις του πίνακα1. fliplr πίνακας2 = fliplr(πίνακας1) Δημιουργία του κατοπτρικού δεξιά-αριστερά ενός πίνακα. flipud πίνακας2 = flipud(πίνακας1) Δημιουργία του κατοπτρικού άνω-κάτω ενός πίνακα. rot90 πίνακας2 = rot90(πίνακας1) Περιστροφή πίνακα κατά 90 αριστερόστροφα. tril πίνακας2 = tril(πίνακας1) Δημιουργία του πίνακα2 με το κάτω αριστερά τριγωνικό τμήμα του πίνακα1. triu πίνακας2 = triu(πίνακας1) Δημιουργία του πίνακα2 με το άνω δεξιά τριγωνικό τμήμα του πίνακα1. diag πίνακαςστήλη = diag(πίνακας) Δημιουργία πίνακα-στήλη με την κύρια διαγώνιο του πίνακα. ή πίνακας = diag(μονοδιάστατοςπίνακας) Δημιουργία πίνακα που έχει ως κύρια διαγώνιο ένα μονοδιάστατο πίνακα.

72 72 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Παραδείγματα Αποτελέσματα >> A = [ ] A = >> A' ans = >> repmat(a,1,2) ans = >> reshape(a,2,6) ans = >> fliplr(a) ans = >> flipud(a) ans = >> rot90(a) ans = >> tril(a) ans = >> triu(a) ans = >> diag(a) ans = >> diag([ ]) ans =

73 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Αλγεβρικές πράξεις πινάκων Οι αριθμητικές πράξεις μπορούν να γίνουν στο MATLAB κατ ευθείαν ανάμεσα σε ολόκληρους πίνακες. Ο πολλαπλασιασμός, η ύψωση σε δύναμη και η διαίρεση πινάκων γίνονται με τους γνωστούς αλγεβρικούς τρόπους, (από το μαθηματικό πεδίο της γραμμικής άλγεβρας): Πράξεις πίνακα με αριθμό (+, -, *, /) Η πράξη γίνεται στοιχείο προς στοιχείο με τον αριθμό. A = [ ] B = A+2 C = A-4 D = 2*A E = A/2 % προσοχή, όχι 2/A A = B = C = D = E = Πρόσθεση και αφαίρεση πινάκων (+, -) Οι πίνακες πρέπει να έχουν ίδιες διαστάσεις και η πράξη γίνεται στοιχείο προς στοιχείο. A = [1 2 3;4 5 6] B = -A; C = A + B A = C = Πολλαπλασιασμός πινάκων (A*B) Αν ο Α είναι m n, τότε ο Β πρέπει να είναι n k, και τότε το γινόμενό τους είναι m k. A = [1 2 3;4 5 6]; B = [3-4 ;-1 6 ; 2 0]; C = A * B C = Ύψωση πίνακα σε δύναμη (^) Ο πίνακας πρέπει να είναι τετράγωνος. Όταν η δύναμη είναι θετικός ακέραιος, η ύψωση πίνακα σε δύναμη είναι ισοδύναμη με τον πολλαπλασιασμό του πίνακα με τον εαυτό του. Όταν η δύναμη είναι -1, το αποτέλεσμα είναι ο αντίστροφος του πίνακα (ισοδύναμο με χρήση της inv). A = [1 2;0 5]; % Ύψωση στο τετράγωνο B = A^2 % Εύρεση αντιστρόφου (ισοδύναμο με inv) C = Α^(-1) Διαίρεση πινάκων (A/B) B = C = Είναι ισοδύναμη με τον πολλαπλασιασμό του Α με τον αντίστροφο του Β (A*inv(B)), π.χ. η λύση του συστήματος X B =A είναι η X=A/B. Ο αντίστροφος του B (που ορίζεται μόνο αν ο πίνακας είναι τετράγωνος) βρίσκεται με τη συνάρτηση inv, είτε με ύψωση στη δύναμη -1. A = [1 2;3 4;5 6]; B = [3-4 ;-1 6]; D = A / B D =

74 74 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Αντίστροφη διαίρεση πινάκων (A\B) Είναι ισοδύναμη με τον πολλαπλασιασμό του αντίστροφου του Α με τον Β (inv(a)*b), αλλά είναι ταχύτερη και μεγαλύτερης ακρίβειας, γιατί χρησιμοποιείται διαφορετική μέθοδος διαίρεσης, χωρίς ενδιάμεση εύρεση του αντιστρόφου του Α. Είναι η συνιστώμενη μέθοδος για λύση του συστήματος A X=B, δηλ. X=A\B. Παράδειγμα: Έστω το σύστημα γραμμικών εξισώσεων (βλ. και παράδειγμα 8.4): 2x 1 + 3x 1 = 6 4x 2 + 9x 2 = 15 Επίλυση συστήματος με χρήση πινάκων: Το σύστημα μπορεί να γραφτεί σε μορφή πινάκων ως: 2 3 AX = B, όπου A=, 6 x1 B= και X= x 2 Πολλαπλασιάζοντας από αριστερά με A -1, η λύση του συστήματος είναι η: X = A -1 B Εύρεση της λύσης με τη βοήθεια του MATLAB: A = [ ]; B = [6 15]; Χ = inv(a)*b % ή Χ = A^(-1)*B % ή Χ = A\B % (συνιστώμενη μέθοδος) X = Στοιχείο-προς-στοιχείο πολλαπλασιαστικές πράξεις πινάκων στο MATLAB Στο MATLAB είναι δυνατή η απ ευθείας στοιχείο-προς-στοιχείο εκτέλεση πολλαπλασιασμού, ύψωσης σε δύναμη και διαίρεσης μεταξύ πινάκων. Οι τελεστές που χρησιμοποιούνται είναι οι ίδιοι με των αντίστοιχων αλγεβρικών πράξεων, μαζί με μια τελεία (.*.^./) Πολλαπλασιασμός, Ύψωση σε δύναμη, και Διαίρεση στοιχείο-προς-στοιχείο (.*.^./) Η πράξη γίνεται ανάμεσα στους πίνακες, στοιχείο προς στοιχείο. A = [1 2 3;4 5 6]; B = -A; C = C = A.* B D = A./ B E = A.^ 2 D = E =

75 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Δημιουργία ειδικών πινάκων Το ΜATLAB διαθέτει συναρτήσεις που παράγουν με απλό τρόπο χρήσιμους πίνακες: zeros <πίνακας> = zeros(m,n) Δημιουργία μηδενικού πίνακα m n. Χρησιμοποιείται συχνά και για αρχική δέσμευση του πίνακα στη μνήμη (pre-allocation), για αύξηση της ταχύτητας σάρωσης. ones <πίνακας> = ones(m,n) Δημιουργία πίνακα m n με όλα τα στοιχεία ίσα με τη μονάδα. eye <πίνακας> = eye(m) Δημιουργία μοναδιαίου πίνακα m m (δηλαδή τετράγωνου πίνακα με τα στοιχεία της κύριας διαγωνίου του ίσα με τη μονάδα και παντού αλλού μηδέν). rand, randn, randi <πίνακας> = rand(m,n) <πίνακας> = randn(m,n) <πίνακας> = randi([a b],m,n) Δίνει πίνακα m n με τυχαίους αριθμούς, είτε ομοιόμορφης κατανομής από 0 έως 1 (rand), είτε κανονικής κατανομής με μέση τιμή 0 και τυπική απόκλιση 1 (randn), είτε ακέραιους από a έως και b (randi). Oι αριθμοί που παράγονται από τις rand, randn, randi είναι ψευδοτυχαίοι, δηλαδή δημιουργούνται από συγκεκριμένο αλγόριθμο και επαναλαμβάνονται με περίοδο που (στο MATLAB) είναι Σε κάθε εκκίνηση του MATLAB, οι ψευδοτυχαίοι αριθμοί ξεκινούν από το ίδιο σημείο. Αν απαιτείται παραγωγή διαφορετικού ψευδοτυχαίου κατά την εκκίνηση του MATLAB, η rand/randn πρέπει να τεθεί σε άλλη αρχική κατάσταση, με την εντολή: rand('state',n), όπου n ένας ακέραιος από 0 έως magic <πίνακας> = magic(ν) Δημιουργία «μαγικού τετραγώνου» Ν Ν (τετράγωνος πίνακας με όλους τους ακέραιους από 1 έως Ν^2 και με ίσο άθροισμα σε κάθε γραμμή, στήλη και διαγώνιο. linspace <πίνακας_γραμμή> = linspace(a,b,n) Δημιουργία πίνακα-γραμμής με n ακεραίους από a έως b που ισαπέχουν. Παραδείγματα Αποτελέσματα A = zeros(2,3) A = B = ones(1,4) B = I = eye(2) I = R = rand(2,3) R =

76 76 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB % Αρχικοποίηση του rand από διαφορετική κατάσταση κάθε φορά: rand('state',sum(100*clock)); % Παραγωγή τυχαίων ακέραιων από 1 έως n n = 75; R = ceil(n*rand(100,1)); % Παραγωγή τυχαίων αριθμών από a έως b a = 10; b = 50; x = a + (b-a) * rand(5); % Παραγωγή 5 ακεραίων από 0 έως 100 % που ισαπέχουν linspace(0,100,5) ans = % Παραγωγή «μαγικών» τετραγώνων % (με ίδιο άθροισμα γραμμών, στηλών % και διαγωνίων) A = magic(3) A = Συναρτήσεις εύρεσης συγκεντρωτικών μεγεθών από τα στοιχεία ενός πίνακα Το MATLAB διαθέτει μεγάλο πλήθος έτοιμων συναρτήσεων για υπολογισμό συγκεντρωτικών και στατιστικών μεγεθών από τα στοιχεία ενός πίνακα (βλ. και κεφ. 15). Π.χ.: min(a), max(a): Ελάχιστη τιμή, Μέγιστη τιμή sum(a), prod(a): Άθροισμα, Γινόμενο mean(a), std(a): Μέση τιμή, Τυπική απόκλιση Οι παραπάνω συναρτήσεις εφαρμόζονται στα στοιχεία ενός πίνακα (A) ως εξής: Αν ο πίνακας είναι μονοδιάστατος, τότε η συνάρτηση εφαρμόζεται σε όλα τα στοιχεία του (π.χ. sum([3 1 5]) 9, min([3 1 5]) 1). Αν ο πίνακας είναι δύο διαστάσεων, τότε η συνάρτηση εφαρμόζεται σε κάθε στήλη του πίνακα ξεχωριστά, και τα αποτελέσματα εξάγονται σε έναν πίνακα-γραμμή: Παράδειγμα A = [ ] Αποτέλεσμα A = B = min(a) C = sum(a) B = C = Για να εφαρμοστούν οι συναρτήσεις αυτές σε όλα τα στοιχεία ενός δισδιάστατου πίνακα, πρέπει αυτός να μετατραπεί πρώτα σε μονοδιάστατο (π.χ. με χρήση του τελεστή «:» που μετατρέπει έναν πίνακα σε πίνακα-στήλη, βλ. και 9.2). Π.χ: D = sum(a(:)) D = 21

77 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Αραιοί (sparse) πίνακες Όταν το πλήθος των μηδενικών στοιχείων σε έναν πίνακα είναι μεγάλο (π.χ. άνω του 75%) γίνεται σημαντική εξοικονόμηση μνήμης όταν ο πίνακας μετατραπεί σε αραιό (sparse). Οι αραιοί πίνακες δεν είναι διαφορετικοί, απλώς αλλάζει ο τρόπος αποθήκευσής τους στη μνήμη: Συγκεκριμένα, αποθηκεύονται μόνο τα μη μηδενικά στοιχεία με τους αντίστοιχους δείκτες τους. Οι πράξεις με τους αραιούς πίνακες γίνονται όπως και με τους κοινούς (πλήρεις). Μετατροπή πίνακα σε αραιό (δηλαδή, αλλαγή του τρόπου αποθήκευσης στη μνήμη, με αποθήκευση μόνο των μη μηδενικών στοιχείων του πίνακα και των αντίστοιχων δεικτών τους): Υ = sparse(x) Μετατροπή του πίνακα X στον αραιό πίνακα Υ. Π.χ.: >> X = [ ; ; ] X = >> Υ = sparse(x) whos Y = (3,2) 12 (1,4) 8 Name Size Bytes Class Attributes X 4x3 96 double Υ 4x3 64 double sparse X = full(y) Μετατροπή του αραιού πίνακα Y στον πλήρη X. Δημιουργία αραιού πίνακα εξ αρχής (η δυνατότητα μετατροπής ενός πλήρους πίνακα σε αραιό ίσως να μην λύνει πάντα ένα πρόβλημα μνήμης, γιατί μπορεί ο πλήρης πίνακας να μην μπορεί καν να δημιουργηθεί λόγω μεγέθους): Υ = sparse(i,j,s,m,n), όπου i = πίνακας με τους δείκτες των γραμμών των μη μηδενικών στοιχείων (ή ο δείκτης μόνο μιας γραμμής, αν δεν υπάρχουν μη μηδενικά στοιχεία σε άλλες). j = πίνακας με τους δείκτες των στηλών των μη μηδενικών στοιχείων (ή ο δείκτης μόνο μιας στήλης, αν δεν υπάρχουν μη μηδενικά στοιχεία σε άλλες). s = πίνακας με τις τιμές των μη μηδενικών στοιχείων (ή μόνο μια τιμή, αν είναι ίδια παντού). m,n = οι διαστάσεις του πίνακα (είναι προαιρετικές: αν λείπουν, λαμβάνονται ίσες με τους μεγαλύτερους δείκτες των i, j: m=max(i), n = max(j)). Π.χ.1: Δημιουργία του παραπάνω αραιού πίνακα Y εξ αρχής (χωρίς μετατροπή από τον Χ): >> i = [3 1]; >> j = [2 4]; >> s = [12 8]; >> S = sparse(i,j,s) >> full(s) S = (3,2) 12 (1,4) 8 ans =

78 78 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Π.χ.2: Δημιουργία αραιού πίνακα 3 4 με τα στοιχεία της 2 ης στήλης ίσα με -1: >> S = sparse(1:3,2,-1,3,4) >> full(s) S = (1,2) -1 (2,2) -1 (3,2) -1 ans = Π.χ.3: Δημιουργία του μοναδιαίου πίνακα 3 3 (στοιχεία κύριας διαγωνίου = 1): >> S = sparse(1:3,1:3,1) S = (1,1) 1 (2,2) 1 (3,3) 1 >> full(s) Π.χ.4: Δημιουργία μηδενικού πίνακα 3 4: >> S = sparse([],[],0,3,4) ans = S = All zero sparse: 3-by-4 >> full(s) ans = Δημιουργία αραιού πίνακα με προδέσμευση επιπλέον στοιχείων (με σκοπό την ταχύτερη προσθήκη επιπλέον στοιχείων αργότερα): Υ = sparse(i,j,s,m,n,nzmax) Με τον τρόπο αυτό γίνεται προδέσμευση μνήμης για ταχύτερη προσθήκη επιπλέον στοιχείων αργότερα. Το nzmax πρέπει να είναι μεγαλύτερο από το πλήθος των μη μηδενικών στοιχείων (=length(s)). Το πλήθος των θέσεων που προδεσμεύονται είναι ίσο με τη διαφορά nzmax - length(s). Π.χ.1: Δημιουργία αραιού πίνακα N 3 με Ν μονάδες στη 2 η στήλη. Μετά, προσθήκη Ν τυχαίων στοιχείων. N = ; tic x = sparse(1:n,2,1,n,3); for i=1:n, x(i,3) = rand; ; toc Elapsed time is seconds. Π.χ.2: Το ίδιο παράδειγμα με προηγουμένως, αλλά με δέσμευση για 2*N στοιχεία (δηλαδή τα N υπάρχοντα στη 2 η στήλη, και τα N που πρόκειται να προστεθούν στην 3 η στήλη). Στην περίπτωση αυτή, οι θέσεις των N στοιχείων της 3 ης στήλης είναι προδεσμευμένες και η προσθήκη τους γίνεται πολύ ταχύτερα. N = ; tic x = sparse(1:n,2,1,n,3,2*n); for i=1:n, x(i,3) = rand; ; toc Elapsed time is seconds.

79 Ιδιαίτερος χειρισμός των πινάκων στο MATLAB Συνοπτική παρουσίαση εντολών και συναρτήσεων πινάκων και διαδικασιών γραμμικής άλγεβρας με το σύστημα βοηθείας του MATLAB: elmat και matfun Λίστα με τις απλές εντολές χειρισμού πινάκων του MATLAB εμφανίζεται στο Command Window με την εντολή help elmat (ή doc elmat, στο παράθυρο της Βοήθειας). Επίσης, λίστα με περισσότερο προχωρημένες συναρτήσεις πινάκων και διαδικασίες γραμμικής άλγεβρας στο MATLAB εμφανίζεται στο Command Window με την εντολή help matfun (ή doc matfun, στο παράθυρο της Βοήθειας).

80 10 Συμβολοσειρές Οι συμβολοσειρές (πίνακες χαρακτήρων, σειρές χαρακτήρων, character arrays, strings) είναι ομάδες αλφαριθμητικών χαρακτήρων. Μια συμβολοσειρά είναι στην πραγματικότητα έ- νας πίνακας που τα στοιχεία του είναι μεταβλητές χαρακτήρα. Αν και οι πίνακες χαρακτήρων μπορούν να είναι πολλών διαστάσεων, συνήθως χρησιμοποιούνται οι μίας διάστασης. Στο εξής με τον όρο «συμβολοσειρές» θα εννοούμε τους μονοδιάστατους πίνακες χαρακτήρων. Επειδή οι συμβολοσειρές είναι πίνακες, εφαρμόζονται σ αυτές όλες οι συναρτήσεις των αριθμητικών πινάκων (π.χ. η length(s) δίνει το πλήθος των χαρακτήρων μιας μονοδιάστατης συμβολοσειράς S). Όμως, υπάρχουν και επιπλέον συναρτήσεις, με χρήση αποκλειστικά σε συμβολοσειρές (π.χ. η strcmp, για σύγκριση δύο συμβολοσειρών) Ανάθεση τιμών συμβολοσειράς Η ανάθεση μιας συμβολοσειράς σε μια μεταβλητή μπορεί να γίνει ως ανάθεση μεμονωμένων χαρακτήρων σε έναν πίνακα, αλλά γίνεται και απλούστερα. Τα παρακάτω παραδείγματα παράγουν την ίδια συμβολοσειρά: S = ['H', 'e', 'l', 'l', 'o']; S = ['Hello']; S = 'Hello'; 10.2 Συναρτήσεις συμβολοσειρών strcat <συμβολοσειρά> = strcat(<συμβ1>, <συμβ2>, <συμβ3>,...) Συνένωση (concatenation) συμβολοσειρών με εξαφάνιση των κενών διαστημάτων στο τέλος τους. Για τη διατήρηση των κενών διαστημάτων τέλους, οι συμβολοσειρές πρέπει να συνενωθούν ως εξής: <συμβολοσειρά> = [<συμβ1>, <συμβ2>, <συμβ3>,...] Παραδείγματα S1 = 'John'; S2 = strcat('hello ', S1) S3 = ['Hello ', S1] Αποτελέσματα S2 = HelloJohn S3 = Hello John strcmp strcmp(<συμβολοσειρά1>, <συμβολοσειρά>) Σύγκριση συμβολοσειρών: Δίνει ως αποτέλεσμα λογικό 1 αν οι συμβολοσειρές είναι ίδιες και 0 αν όχι. Οι πεζοί χαρακτήρες θεωρούνται διαφορετικοί από τους κεφαλαίους. (Παρόμοια σύγκριση μπορεί να γίνει και με την isequal, βλ. 9.7). strcmpi strcmpi(<συμβολοσειρά1>, <συμβολοσειρά2>) Σύγκριση συμβολοσειρών χωρίς διαφορά πεζών-κεφαλαίων: Δίνει ως αποτέλεσμα λογικό 1 αν οι συμβολοσειρές είναι ίδιες και 0 αν όχι, όπου όμως η διαφορά πεζώνκεφαλαίων δεν λαμβάνεται υπ όψιν. Για το λόγο αυτό, η strcmpi είναι περισσότερο χρήσιμη σε περιπτώσεις όπως έρευνας σε βάση δεδομένων π.χ. με βάση το όνομα ενός ασθενούς, σε περιπτώσεις αλφαβητικής ταξινόμησης κλπ. Παραδείγματα Αποτελέσματα strcmp('face','face') ans = 0 strcmpi('face','face') ans = 1

81 Συμβολοσειρές 81 str2num <αριθμητική_μεταβλητή> = str2num('σειρά_χαρακτήρων') Μετατροπή της 'σειράς_χαρακτήρων' στην αριθμητική της αναπαράσταση, αν αυτό είναι δυνατόν. Η σειρά χαρακτήρων μπορεί να περιέχει τα ψηφία (0...9), την υποδιαστολή (.), το πρόσημο (+ ή -), τα σύμβολα των πράξεων (+, -, *, /) και τον τελεστή e (ύψωση σε δύναμη με βάση 10). num2str <μεταβλητή_συμβολοσειράς>= num2str(<αριθμητική_μεταβλητή>, 'μορφή') Μετατροπή της τιμής της αριθμητικής μεταβλητής σε συμβολοσειρά. Η 'μορφή' (αν υπάρχει) δηλώνει σε ποια μορφή θα μετατραπεί η αριθμητική μεταβλητή (%d, %f, %c, %s, κλπ, βλέπε στους ειδικούς χαρακτήρες μορφής της fprintf, 5.6). Παραδείγματα Αποτελέσματα x = str2num('2*11-5') x = 17 pi314 = num2str(pi,'%.2f') pi314 = 3.14 sprintf <συμβολοσειρά> = sprintf('παράσταση', <μεταβλητές>) Δημιουργία συμβολοσειράς με τη βοήθεια της 'παράστασης' και των μεταβλητών. H 'παράσταση' περιέχει κείμενο καθώς και προαιρετικά ειδικούς χαρακτήρες μορφής και θέσης (όπως ακριβώς και στην fprintf). Σημείωση 1: Αν η sprintf χρησιμοποιηθεί χωρίς ελληνικό ερωτηματικό στο τέλος, τότε έχει παρόμοια αποτελέσματα με τη συνάρτηση fprintf (ειδικά σε συνδυασμό με τη disp, δηλαδή disp(sprintf(...)). Σημείωση: Η διαφορά των sprintf και fprintf από την disp είναι ότι στη disp δεν «λειτουργούν» οι ειδικοί χαρακτήρες μορφής και θέσης των sprintf και fprintf (δηλαδή οι \n, %d, %f κλπ). Σημείωση 2: Η sprintf μπορεί να χρησιμοποιηθεί για την εύρεση του ASCII κωδικού (σε μορφή χαρακτήρων) ενός χαρακτήρα, και το αντίστροφο, ως εξής: <ASCII κωδικός σε μορφή χαρακτήρων> = sprintf('%d',<χαρακτήρας>) <χαρακτήρας> = sprintf('%c',<ακέραιος>) Το παραπάνω παράδειγμα δείχνει και την πραγματική λειτουργία των ειδικών χαρακτήρων μορφής (%c, %d, %f κλπ) που χρησιμοποιούνται στην 'παράσταση' των sprintf και fprintf, η οποία είναι η «μετατροπή» της μεταβλητής σε άλλη μορφή. Παράδειγμα: c = sprintf('%c',65); % Στη μεταβλητή c αποθηκεύεται ο χαρακτήρας 'Α' x = sprintf('%d','a'); % Στη μεταβλητή x αποθηκεύεται το string '65' Στη συνέχεια, με str2num(x) μπορεί να ληφθεί ο κωδικός ASCII σε αριθμητική μορφή. Παραδείγματα % Δημιουργία σύνθετης συμβολοσειράς name = 'John'; age = 40; phrase = sprintf('%s is %d years old',name,age) % Απεικόνιση των εκτυπώσιμων ASCII χαρακτήρων for i=32:126 fprintf('%d: %c\n',i,i); Αποτελέσματα phrase = John is 40 years old 32: 33:!... 65: Α 66: Β : } 126: ~

82 82 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 10.3 Συνοπτική παρουσίαση συναρτήσεων συμβολοσειρών του MATLAB: strfun Λίστα με τις συναρτήσεις συμβολοσειρών του MATLAB εμφανίζεται στο Command Window με την εντολή help strfun (ή doc strfun, στο παράθυρο της Βοήθειας). Ερωτήσεις 10.1 Να αναφερθούν δύο τρόποι συνένωσης συμβολοσειρών μαζί με μία διαφορά μεταξύ τους Πρόκειται να γραφτεί ένα πρόγραμμα το οποίο, ανάμεσα στα άλλα, θα ανευρίσκει έ- ναν ασθενή, με βάση το επώνυμό του, από μια βάση δεδομένων ενός νοσοκομείου. Να αναφερθεί ποια από τις δύο συναρτήσεις, strcmp ή strcmpi, θα πρέπει να χρησιμοποιηθεί, και γιατί Να σημειωθούν στις αγκύλες με [Χ] όσες προτάσεις είναι σωστές: [ ] Οι συμβολοσειρές είναι πίνακες. [ ] Μια συμβολοσειρά δεν μπορεί να περιέχει τα σύμβολα \ και %. [ ] Στις συμβολοσειρές αποθηκεύονται χαρακτήρες (γράμματα a z, A Z και σύμβολα) αλλά όχι αριθμητικά ψηφία (0 9). [ ] Ο πρώτος χαρακτήρας μιας μονοδιάστατης συμβολοσειράς S είναι ο S(0). [ ] Ο τελευταίος χαρακτήρας μιας μονοδιάστατης συμβολοσειράς S είναι ο S(length(S)). [ ] Η εντολή (συνάρτηση) strcmp('patient',' #4') έχει ως αποτέλεσμα τη συνένωση των δύο συμβολοσειρών σε μία ('Patient #4'). [ ] Η εντολή (συνάρτηση) strcat χρησιμοποιείται για τη σύγκριση ισότητας δύο συμβολοσειρών. [ ] Η str2num δέχεται ως είσοδο αριθμητικές μεταβλητές Να σημειωθούν με [Σ] οι σωστές και με [Λ] οι λανθασμένες απαντήσεις (σωστές μπορεί να είναι μία, καμία, ή περισσότερες από μία απαντήσεις): α) Το πλήθος των στοιχείων μιας μονοδιάστασης συμβολοσειράς Α ισούται με: [ ] length(a) [ ] size(a) [ ] size(a,1) [ ] size(a,2) β) Ο δεύτερος χαρακτήρας μιας μονοδιάστατης συμβολοσειράς S είναι ο: [ ] S(1,2) [ ] S(2,1) [ ] S(2,2) γ) Έστω η συμβολοσειρά S = 'anna'. Η εντολή strcmpi(s,'anna') δίνει: [ ] 1 [ ] 0 [ ] true [ ] false [ ] Μήνυμα σφάλματος

83 Συμβολοσειρές 83 Ασκήσεις 10.5 Έστω οι εντολές: name = 'John'; w = 85; h = 182; Έστω ότι πρέπει, με βάση τις προηγούμενες μεταβλητές, να δημιουργηθεί η ακόλουθη σύνθετη συμβολοσειρά με όνομα message: message = 'Patient John weights 85kg and has height 1.82m' α) Να δημιουργηθεί η παραπάνω συμβολοσειρά με κατάλληλη χρήση της συνάρτησης sprintf : message = sprintf(' '); β) Να δημιουργηθεί η παραπάνω συμβολοσειρά με κατάλληλη χρήση αγκυλών ([ ])με σκοπό τη συνένωση επιμέρους συμβολοσειρών (απαιτείται και χρήση της συνάρτησης num2str): message = [ ]; 10.6 Να συμπληρωθούν οι παρακάτω εντολές, με τις οποίες ζητούνται από το πληκτρολόγιο το όνομα και η επέκταση ενός αρχείου, τα οποία στη συνέχεια συνενώνονται, χωρισμένα με τελεία (.), σε μία νέα συμβολοσειρά που να περιέχει το πλήρες όνομα του αρχείου. Η συνένωση γίνεται (α) με χρήση αγκυλών ([ ]) και (β) με τη συνάρτηση sprintf: name = input( ); % Π.χ. έστω ότι εισαχθεί 'brain' ext = input( ); % Π.χ. έστω ότι εισαχθεί 'jpg' % Π.χ. πρέπει να δημιουργηθεί το όνομα 'brain.bmp': filename = [ ]; filename = sprintf( ); 10.7 Έστω οι εντολές: path = 'c:\patientdata'; name = 'brain'; extension = 'jpg'; Έστω ότι πρέπει, με βάση τις προηγούμενες μεταβλητές, να δημιουργηθεί η ακόλουθη σύνθετη συμβολοσειρά με όνομα fullname: fullname = ' c:\patientdata\brain.jpg' α) Να δημιουργηθεί η παραπάνω συμβολοσειρά με κατάλληλη χρήση της συνάρτησης sprintf : message = sprintf(' '); β) Να δημιουργηθεί η παραπάνω συμβολοσειρά με κατάλληλη χρήση αγκυλών ([ ]) με σκοπό τη συνένωση επιμέρους συμβολοσειρών: message = [ ]; 10.8 Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB με το οποίο α) θα ζητείται με input το όνομά σας και θα αποθηκεύεται σε μια μεταβλητή β) θα αποθηκεύεται με sprintf σε μια νέα μεταβλητή το ακόλουθο μήνυμα: The name has characters όπου στις τελίτσες ( ) βρίσκεται το όνομα που θα δίνετε από το πληκτρολόγιο και στις παυλίτσες (------) θα βρίσκεται το πλήθος των χαρακτήρων του ονόματος. γ) Η νέα αυτή μεταβλητή θα τυπώνεται με disp στην οθόνη Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB με το οποίο α) να ζητείται από το πληκτρολόγιο μια συμβολοσειρά μιας διάστασης και

84 84 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB β) στη συνέχεια οι χαρακτήρες της συμβολοσειράς να τυπώνονται ο ένας κάτω από τον άλλον με fprintf στο Command Window Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο α) να ζητείται από το πληκτρολόγιο μια συμβολοσειρά και β) στη συνέχεια να τυπώνονται με fprintf στο Command Window ο κωδικός ASCII του κάθε χαρακτήρα της συμβολοσειράς, ο ένας κάτω από τον άλλον Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB στο οποίο α) να ζητούνται από το πληκτρολόγιο δύο συμβολοσειρές, β) στη συνέχεια συμβολοσειρές να συγκρίνονται και γ) τέλος, να τυπώνεται με fprintf στο Command Window ένα από τα δύο παρακάτω μηνύματα: String <str1> is equal to string <str2> String <str1> is NOT equal to string <str2> αναλόγως αν με τη σύγκριση οι συμβολοσειρές προέκυψαν ίσες ή όχι (προσοχή: στη θέση των <str1> και <str2> πρέπει να βρίσκονται οι συμβολοσειρές που εισήχθησαν από το πληκτρολόγιο) Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB μέσα στο οποίο να ζητούνται το ό- νομα και το επώνυμο ενός ασθενούς (με δύο διαδοχικές input) και στη συνέχεια να τυπώνεται στο Command Window με fprintf το μήνυμα: The name <Onoma> <Epwnymo> has initials <O>. <E>. (στη θέση των <Onoma> και <Epwnymo> πρέπει να βρίσκονται το όνομα και το επώνυμο του ασθενούς, όπως εισήχθησαν από το πληκτρολόγιο με τις δύο input, ενώ στη θέση των <O> και <E> πρέπει να βρίσκονται τα αρχικά του ονόματος και του επωνύμου) Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB το οποίο να μετατρέπει τη θερμοκρασία από βαθμούς Κελσίου σε Φαρενάιτ και το αντίστροφο. Η θερμοκρασία πρέπει να δίνεται από το πληκτρολόγιο (input) μαζί με τις μονάδες της (π.χ. 100C ή 451F) και το πρόγραμμα πρέπει να αναγνωρίζει αυτόματα αν είναι Κελσίου ή Φαρενάιτ από τον τελευταίο χαρακτρήρα (C ή F) και να κάνει αυτόματα την κατάλληλη μετατροπή. 9 Η σχέση των κλιμάκων θερμοκρασιών Κελσίου και Φαρενάιτ είναι: TF 5 TC 32 Υπόδειξη: Η εισαγωγή της θερμοκρασίας με τη μονάδα της πρέπει να γίνεται ως συμβολοσειρά. Στη συνέχεια θα αναγνωρίζεται ο τελευταίος χαρακτήρας της (C ή F), ενώ το υπόλοιπο τμήμα της συμβολοσειράς θα μετατρέπεται με κατάλληλη συνάρτηση σε αριθμό. Τέλος, θα ακολουθεί η μετατροπή των μονάδων Να γραφτεί κατάλληλο πρόγραμμα σε MATLAB το οποίο να καταμετρά τη συχνότητα εμφάνισης κάθε χαρακτήρα μιας πρότασης που θα δίνεται από το πληκτρολόγιο. Π.χ. το αποτέλεσμα της εκτέλεσης του προγράμματος θα μπορούσε να είναι ως εξής: Give me a sentence: The Beatles The following characters appear in the sentence "The Beatles": a 1 time b 1 time e 3 times h 1 time l 1 time s 1 time t 2 times

85 11.1 Γενικά: functions και scripts στο MATLAB 11 Συναρτήσεις Συναρτήσεις (functions) ονομάζονται αυτόνομα τμήματα κώδικα, ξεχωριστά από το κυρίως πρόγραμμα, που εκτελούν μια συγκεκριμένη λειτουργία. Για την εκτέλεση της λειτουργίας αυτής, οι συναρτήσεις μπορεί να απαιτούν κάποιες μεταβλητές ως είσοδο (ορίσματα εισόδου), και μπορεί να εξάγουν κάποιες άλλες μεταβλητές ως έξοδο (ορίσματα εξόδου). Για παράδειγμα, μπορεί να δημιουργηθεί μια συνάρτηση που να υπολογίζει της ρίζες ενός δευτεροβάθμιου τριωνύμου. Όπως ξέρουμε, για τη λειτουργία αυτή απαιτούνται οι συντελεστές του τριωνύμου (α, β, γ), με τη βοήθεια των οποίων υπολογίζονται οι δύο λύσεις (x 1, x 2 ). Έτσι, μπορεί να κατασκευαστεί μια συνάρτηση, η οποία να έχει ως ορίσματα εισόδου 3 μεταβλητές με ονόματα a, b, c και ως ορίσματα εξόδου 2 μεταβλητές με ονόματα x1 και x2. Οι συναρτήσεις δεν «τρέχουν» από μόνες τους, όπως τα απλά προγράμματα (που ονομάζονται scripts), αλλά «καλούνται» με το όνομά τους (α) από άλλα προγράμματα ή (β) από άλλες συναρτήσεις ή (γ) από το Command Window. Παράδειγμα δημιουργίας μιας απλής συνάρτησης: Ο παρακάτω κώδικας γράφεται στον Editor και αποθηκεύεται ως αρχείο MATLAB με όνομα addition.m. function c = addition(a,b) c = a + b; Εκτέλεση (κλήση) της συνάρτησης, π.χ. από το Command Window: >> x = addition(3,4) x = 7 >> y = addition(x,x^2) y = 56 Η μεγάλη διαφορά των συναρτήσεων (functions) από τα απλά τμήματα κώδικα (scripts) είναι ότι δημιουργούν το δικό τους χώρο μνήμης (workspace), που είναι εντελώς απομονωμένος από χώρο μνήμης του υπόλοιπου προγράμματος από το οποίο «καλούνται», με αποτέλεσμα να είναι πιο ξεκάθαρος ο τρόπος λειτουργίας τους και με μικρότερη πιθανότητα σφάλματος. Αυτό σημαίνει ότι μια συνάρτηση «γνωρίζει» μόνο τις μεταβλητές που ορίζονται μέσα σ αυτήν (τοπικές μεταβλητές), καθώς και αυτές που εισάγονται σ αυτήν ως ορίσματα εισόδου. Τα πλεονεκτήματα των συναρτήσεων είναι: Καλύτερη οργάνωση του κυρίως προγράμματος: Το κυρίως πρόγραμμα είναι μικρότερο σε μέγεθος, άρα περισσότερο κατανοητό και ευκολότερο στην αποσφαλμάτωση. Εύκολη χρήση του κώδικά τους: Ο κώδικας των συναρτήσεων γράφεται μόνο μια φορά, και μπορούν να κληθούν από το κυρίως πρόγραμμα πολλές φορές (και μάλιστα με διαφορετικές τιμές μεταβλητών εισόδου), με απλή αναφορά του ονόματός τους, χωρίς να επαναλαμβάνεται συνεχώς ο ίδιος κώδικας μέσα στο κυρίως πρόγραμμα. Εύκολη αποσφαλμάτωση του κυρίως προγράμματος: Σε περίπτωση που χρειαστεί να μεταβληθεί ή να διορθωθεί ο κώδικας μιας συνάρτησης, αυτό γίνεται μόνο μια φορά, στη θέση όπου ορίζεται η συνάρτηση. Χρήση από άλλα προγράμματα: Οι συναρτήσεις μπορούν να κληθούν από πολλά διαφορετικά προγράμματα. για το λόγο αυτό μπορούν να δημιουργηθούν ομάδες συναρτήσεων που εκτελούν λειτουργίες ενός θεματικού πεδίου (π.χ. ομάδες συναρτήσεων στατιστικής ανάλυσης, ή επεξεργασίας εικόνας, κλπ). Κάθε τέτοιο σύνολο συναρτήσεων στο MATLAB έχει το ιδιαίτερο όνομα toolbox (βλ. παράγρ. 3.2).

86 86 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 11.2 Τοπικές μεταβλητές Οι μεταβλητές που τυχόν οριστούν μέσα σε μία συνάρτηση λέγονται τοπικές μεταβλητές (local variables) και δημιουργούνται μόνο κατά την κλήση της συνάρτησης, ενώ διαγράφονται όταν τελειώσει η εκτέλεσή της. Οι τοπικές μεταβλητές μπορούν να έχουν ακόμα και ίδιο όνομα με μεταβλητές του προγράμματος από το οποίο καλούνται, ενώ στην πραγματικότητα είναι εντελώς διαφορετικές μεταβλητές. Στην περίπτωση αυτή δεν δημιουργείται κανένα πρόβλημα, λόγω του ξεχωριστού χώρου μνήμης στον οποίο εκτελείται κάθε συνάρτηση Δημιουργία συνάρτησης Μια συνάρτηση χαρακτηρίζεται από το όνομά της και από τα ορίσματα εισόδου και εξόδου. Στο MATLAB, μια συνάρτηση μπορεί να έχει (ένα ή περισσότερα) ορίσματα εισόδου ή και εξόδου, ή να μην έχει. Η πρώτη γραμμή του κώδικα μιας συνάρτησης αρχίζει υποχρεωτικά από τη λέξη function, και ακολουθεί το όνομά της (μαζί με τα τυχόν ορίσματα εισόδου και εξόδου, αν έχει). Τα ορίσματα εισόδου μπαίνουν εντός παρεθέσεων και χωρίζονται με κόμμα, π.χ. (a,b,c). Τα ορίσματα εξόδου μπαίνουν μέσα σε αγκύλες, και χωρίζονται επίσης με κόμμα, π.χ. [x1,x2]. Αν υπάρχει μόνο ένα όρισμα εξόδου, οι αγκύλες μπορεί να παραλειφθούν. Γενικά: function [μεταβλητές εξόδου] = function_name(μεταβλητές εισόδου) ( ακολουθεί ο κώδικας της συνάρτησης ) Μια συνάρτηση γράφεται στον Editor και αποθηκεύεται κανονικά όπως κάθε άλλο πρόγραμμα στο MATLAB, ως αρχείο επέκτασης.m. Για να μην γίνεται σύγχυση, καλό είναι το όνομα του αρχείου στο οποίο αποθηκεύεται μια συνάρτηση να είναι ίδιο με το όνομα της συνάρτησης. Τα ονόματα των ορισμάτων ειδόσου και εξόδου, τα ονόματα των συναρτήσεων, καθώς και τα ονόματα των αρχείων των συναρτήσεων, πρέπει να ακολουθούν τους κανόνες των ονομάτων των μεταβλητών (βλ. 4.2), δηλαδή πρέπει να αρχίζουν από γράμμα (του λατινικού αλφαβήτου) και μπορεί να περιέχουν μόνο γράμματα, αριθμούς καθώς και την κάτω παύλα (_, underscore). Παράδειγμα δημιουργίας συνάρτησης: Έστω ότι πρέπει να δημιουργηθεί μια συνάρτηση που να δέχεται ως είσοδο μια τιμή θερμοκρασίας σε βαθμούς Κελσίου και να εξάγει την αντίστοιχη τιμή θερμοκρασίας σε Φαρενάιτ. Για τη δημιουργία της, γράφεται ο παρακάτω κώδικας στον Editor, και αποθηκεύεται με όνομα Celcius2Fahrenheit.m. function F = Celcius2Fahrenheit(C) F = (9/5)*C + 32; Στο παράδειγμα αυτό, το όνομα της συνάρτησης είναι Celcius2Fahrenheit, η μεταβλητή C είναι το όρισμα εισόδου της συνάρτησης, και η μεταβλητή F είναι το όρισμα εξόδου.

87 Συναρτήσεις Κλήση συνάρτησης Η κλήση (δηλαδή η εκτέλεση) μιας συνάρτησης γίνεται με το όνομα του αρχείου της. Γενικά: [μεταβλητές εξόδου] = function_name(μεταβλητές εισόδου); Παράδειγμα: Το επόμενο πρόγραμμα (που γράφεται στον Editor και αποθηκεύεται με οποιοδήποτε όνομα) καλεί τη συνάρτηση Celcius2Fahrenheit, που έχει δημιουργηθεί στο προηγούμενο παράδειγμα. TC = input('give temperature in Celcius: '); TF = Celcius2Fahrenheit(TC); fprintf('%.1f Celcius = %.1f Fahrenheit', TC, TF); Επεξήγηση του παραπάνω παραδείγματος: Αρχικά, ζητείται από το χρήστη με input η εισαγωγή μιας τιμής θερμοκρασίας σε βαθμούς Κελσίου, σε μια μεταβλητή με όνομα TC. Στη συνέχεια, καλείται η συνάρτηση Celcius2Fahrenheit, με είσοδο τη μεταβλητη TC και έξοδο τη μεταβλητή με όνομα TF. Τέλος, το αποτέλεσμα τυπώνεται με κατάλληλο μήνυμα με χρήση fprintf στο Command Window Έξοδος από συνάρτηση (εντολή return) Στην περίπτωση που είναι επιθυμητή η έξοδος από τη συνάρτηση πριν από το τέλος της, μπορεί να χρησιμοποιηθεί η εντολή return. Η εντολή return μπορεί επίσης να χρησιμοποιηθεί και για τον πρόωρο τερματισμό ενός script Υποσυναρτήσεις Μέσα σε μια συνάρτηση μπορούν να δημιουργηθούν και άλλες συναρτήσεις, υποβοηθητικές για τη λειτουργία της, που λέγονται υποσυναρτήσεις. Ο ορισμός των υποσυναρτήσεων γίνεται μετά το τέλος της κύριας συνάρτησης, με οποιαδήποτε σειρά. Μια υποσυνάρτηση μπορεί να κληθεί μόνο από την κύρια συνάρτηση του αρχείου μέσα στο οποίο ορίζεται, ή από άλλη υποσυνάρτηση του ίδιου αρχείου, ανεξαρτήτως θέσης Σειρά αναζήτησης μιας συνάρτησης από το MATLAB Γενικά, όταν κληθεί μια συνάρτηση, το MATLAB την αναζητά: πρώτα στο πρόγραμμα/συνάρτηση από το οποίο καλείται (ελέγχει δηλαδή πρώτα αν είναι υποσυνάρτηση), μετά στο Current Directory / Current Folder και τέλος στους φακέλους του Path, με τη σειρά που αυτοί έχουν δηλωθεί εκεί (βλ. παράγρ. 3.2). Το Path βρίσκεται από το μενού του MATLAB: File > Set Path

88 88 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 11.8 Δομή ενός αρχείου συνάρτησης Συνοψίζοντας τα προηγούμενα, η δομή ενός αρχείου συνάρτησης είναι όπως παρακάτω: Αρχείο: main_function.m function [output] = main_function(input) % Κώδικας κύριας συνάρτησης function [output] = subfunction1(input) % Κώδικας υποσυνάρτησης 1 function [output] = subfunction2(input) % Κώδικας υποσυνάρτησης 2 1o παράδειγμα: Αρχείο συνάρτησης με υποσυναρτήσεις: Αν είναι επιθυμητό το πρόγραμμα να είναι αυτόνομο, και να μην απαιτεί άλλα αρχεία για την εκτέλεσή του, τότε οι συναρτήσεις που θα χρησιμοποιηθούν πρέπει να οριστούν μέσα στο κυρίως πρόγραμμα (υποσυναρτήσεις). Όμως, στην περίπτωση αυτή το πρόγραμμα πρέπει α- ναγκαστικά να είναι κι αυτό συνάρτηση. Έτσι, συνήθως δίνεται ένα αυθαίρετο όνομα συνάρτησης στην 1 η γραμμή του κυρίως προγράμματος, για παράδειγμα function main. function main % Το πρόγραμμα αυτό καλεί τις συναρτήσεις bmicalculation και % bmimessage, που ορίζονται ως υποσυναρτήσεις μέσα στο πρόγραμμα. %%% MAIN PROGRAM %%% clc; clear all; weight = input('input patient's weight: '); % Είσοδος βάρους ασθενούς height = input('input patient's height: '); % Είσοδος ύψους ασθενούς bmi = bmicalculation(weight,height); % Υπολογισμός bmi message = bmimessage(bmi); % Υπολογισμός μηνύματος disp(message); % Εκτύπωση μηνύματος %%% SUBFUNCTIONS %%% Αρχείο κύριας συνάρτησης: main.m function bmi = bmicalculation(weight,height) bmi = weight/height^2; function message = bmimessage(bmi) if bmi<18 message = 'Underweight'; elseif bmi>=18 & bmi<25 message = 'Normal weight'; elseif bmi>=25 & bmi<30 message = 'Overweight'; else message = 'Obesity';

89 Συναρτήσεις 89 2o παράδειγμα: Συναρτήσεις ως ξεχωριστά αρχεία που καλούνται από το κυρίως πρόγραμμα: Στην περίπτωση αυτή οι συναρτήσεις μπορούν να κληθούν με το όνομά τους από οποιοδήποτε πρόγραμμα, είτε αυτό είναι script είτε άλλη συνάρτηση. Το μειονέκτημα είναι ότι το κυρίως πρόγραμμα δεν είναι ενιαίο αρχείο (χρειάζεται και τα αρχεία των συναρτήσεων). Μια συνάρτηση που είναι ξεχωριστό αρχείο καλείται με το όνομα του αρχείου στο οποίο αποθηκεύεται. Για το λόγο αυτό καλό είναι τα ονόματα των αρχείων των συναρτήσεων να είναι ίδια με τα ονόματα των συναρτήσεων, όπως φαίνεται και παρακάτω: Αρχείο κυρίως προγράμματος: bmiprogram.m % Το πρόγραμμα αυτό καλεί τις συναρτήσεις bmicalculation και % bmimessage, που ορίζονται εξωτερικά, ως αυτόνομα αρχεία. clc; clear all; weight = input('input patient's weight: '); height = input('input patient's height: '); bmi = bmicalculation(weight,height); message = bmimessage(bmi); disp(message); Στο παραπάνω κυρίως πρόγραμμα καλούνται οι συναρτήσεις bmicalculation και bmimessage που ορίζονται παρακάτω και που αποθηκεύονται ως ξεχωριστά αρχεία. Το κυρίως πρόγραμμα αναζητά τις συναρτήσεις στο δίσκο, με το όνομα του αρχείου τους (bmicalculation.m και bmimessage.m), πρώτα στο φάκελο του Current Directory / Current Folder και μετά (αν δεν βρεθούν εκεί) στους φακέλους του Path. Αρχείο συνάρτησης: bmicalculation.m function bmi = bmicalculation(weight, height) % Υπολογισμός Δείκτη Σωματικού Βάρους (Body Mass Index). bmi = weight/height^2; function message = bmimessage(bmi) % Μήνυμα σχετικά με το Δείκτη Σωματικού Βάρους (Body Mass Index). if bmi<18 message = 'Underweight'; elseif bmi>=18 & bmi<25 message = 'Normal weight'; elseif bmi>=25 & bmi<30 message = 'Overweight'; else message = 'Obesity'; Αρχείο συνάρτησης: bmimessage.m

90 90 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 11.9 Εμφωλευμένες συναρτήσεις (nested functions) Στο MATLAB είναι δυνατόν να οριστούν συναρτήσεις στο εσωτερικό άλλων συναρτήσεων (όχι μετά το τέλος τους, όπως οι υποσυναρτήσεις). Οι εσωτερικά οριζόμενες συναρτήσεις ονομάζονται εμφωλευμένες (nested) και ο ορισμός τους τελειώνει με. Τότε, πρέπει να τελειώνει με και ο ορισμός κάθε άλλης συνάρτησης (και της κύριας). Οι εμφωλευμένες συναρτήσεις μπορούν να οριστούν σε οποιοδήποτε σημείο (εκτός από το εσωτερικό βρόχων επιλογής ή επανάληψης), ακόμη και μέσα σε άλλες εμφωλευμένες συναρτήσεις. Ένα σημαντικό χαρακτηριστικό τους είναι ότι «γνωρίζουν» όσες μεταβλητές οριστούν στη συνάρτηση μέσα στην οποία εμφωλεύονται (χωρίς οι μεταβλητές αυτές να ανήκουν στα ορίσματα εισόδου τους). Η χρήση τους συστήνεται μόνο σε ειδικές και συγκεκριμένες περιπτώσεις (π.χ. χρήση λιγότερων ορισμάτων εισόδου για κατανάλωση λιγότερης μνήμης επίσης βλ. σχόλια 8, 16 του καθώς και σχόλια 7, 15 για πλεονεκτήματα των εμφωλευμένων ή σχόλια 10, 11, 14 για μειονεκτήματα ). Η κλήση μιας εμφωλευμένης συνάρτησης μπορεί να γίνει από οποιοδήποτε σημείο έξω από την εμφωλευμένη συνάρτηση (είτε πριν, είτε μετά από τον ορισμό της). Όμως, έξω από μια εμφωλευμένη συνάρτηση δεν είναι δυνατή η κλήση άλλων εμφωλευμένων που ορίζονται εντός της εμφωλευμένης (βλ. Ακολουθεί παράδειγμα συνάρτησης με εμφωλευμένη συνάρτηση: function main % Η bmicalculation είναι υποσυνάρτηση της κύριας συνάρτησης main, διότι % ορίζεται μετά το τέλος της. % Η bmimessage είναι εμφωλευμένη συνάρτηση της main, διότι ορίζεται % στο εσωτερικό της. % Παρατηρούμε ότι η μεταβλητή bmi ορίζεται στην main και γίνεται γνωστή % στην εμφωλευμένη της (bmimessage) χωρίς να αποτελεί όρισμα εισόδου % σ αυτήν (εξάλλου η bmimessage δεν έχει ορίσματα εισόδου). % Κάθε συνάρτηση (κύρια, υποσυνάρτηση, εμφωλευμένη) τελειώνει με. Αρχείο κύριας συνάρτησης: main.m % Κώδικας κύριας συνάρτησης. n = input('input patient name: ','s'); w = input('input patient weight (kg): '); h = input('input patient height (m): '); bmi = bmicalculation(w, h); message = bmimessage; % Ορισμός εμφωλευμένης συνάρτησης (μέσα στην κύρια συνάρτηση). function message = bmimessage if bmi<18, message = 'Underweight'; elseif bmi>=18 & bmi<25, message = 'Normal weight'; elseif bmi>=25 & bmi<30, message = 'Overweight'; else message = 'Obesity'; % Συνέχιση του κώδικα της κύριας συνάρτησης. fprintf('patient %s: BMI=%.1f (%s)\n', n, bmi, message); % Ορισμός υποσυνάρτησης (μετά το τέλος της κύριας συνάρτησης). function bmi = bmi_calculation(weight, height) bmi = weight/height^2;

91 Συναρτήσεις Ανώνυμες συναρτήσεις (anonymous functions) Στο MATLAB είναι δυνατός ο ορισμός συναρτήσεων κατευθείαν σε μία γραμμή εντολής (in line functions). Οι συναρτήσεις αυτές ονομάζονται ανώνυμες (anonymous), διότι δεν έ- χουν όνομα, αλλά καλούνται με το όρισμα εξόδου τους. Προσοχή: Ο ορισμός μιας ανώνυμης συνάρτησης πρέπει να προηγείται της κλήσης της. Ορισμός ανώνυμης συνάρτησης: όρισμα_εξόδου Π.χ. y Κλήση ανώνυμης συνάρτησης: μεταβλητή = όρισμα_εξόδου(ορίσματα_εισόδου) Π.χ. z = y(4); Παραδείγματα: Π.χ. 1: Εκτύπωση των βαθμών θερμοκρασίας Κελσίου από 0 έως 100 ανά 5 με τους αντίστοιχους βαθμούς Φαρενάιτ: F + 32; for C=0:5:100 fprintf('%d\t%d\n',c,f(c)); Π.χ. 2: Γραφική παράσταση παραβολής: y hold on; for x=1:100 plot(x,y(x)); Π.χ. 3: Υπολογισμός και εκτύπωση του δείκτη σωματικού βάρους (bmi): bmi w = input('input your weight (kg): '); h = input('input your height (m): '); b = bmi(w,h); fprintf('your Body Mass Index is %.1f', b); Ιδιωτικές συναρτήσεις (private functions) Πρόκειται για συνήθη για αρχεία συναρτήσεων (m-files) που βρίσκονται σε έναν φάκελο με όνομα private. Οι συναρτήσεις αυτές γίνονται γνωστές μόνο στις συναρτήσεις που βρίσκονται στο φάκελο του αμέσως ανωτέρου επιπέδου, και μάλιστα με προτεραιότητα κλήσης έναντι όλων των m-files με ίδιο όνομα (που μπορεί να βρίσκονται ακόμα και στον ίδιο φάκελο με την καλούσα συνάρτηση ή σε οποιοδήποτε φάκελο του path ή στον current folder κλπ). Αυτή η ιδιότητα των ιδιωτικών συναρτήσεων είναι μια από τις κύριες χρήσεις τους (όπως όταν χρειάζεται να δημιουργηθεί μια προσωρινή έκδοση μιας άλλης συνάρτησης με ίδιο όνομα: τότε, θα κληθεί η συνάρτηση που βρίσκεται μέσα στον υποφάκελο private). Παράδειγμα: Μέσα στο φάκελο common βρίσκεται η συνάρτηση calculations.m, καθώς και ο φάκελος private, μέσα στον οποίο υπάρχει η συνάρτηση mean.m. Τότε, αν η calculations καλέσει την mean, θα κληθεί η mean του φακέλου private και όχι η γνωστή mean του MATLAB.

92 92 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Μεταβλητό πλήθος ορισμάτων εισόδου ή εξόδου σε συναρτήσεις Στο MATLAB είναι δυνατόν μια συνάρτηση να μπορεί να καλείται χωρίς να είναι αυστηρά καθορισμένο το πλήθος (και ο τύπος) των ορισμάτων εισόδου ή εξόδου. α) Μεταβλητό πλήθος ορισμάτων εισόδου: varargin, nargin Κατά τον ορισμό της συνάρτησης, τα ορίσματα εισόδου πρέπει να οριστούν ως στοιχεία του πίνακα κελιών varargin. Η μεταβλητή nargin είναι αυτομάτως ίση με το πλήθος των ορισμάτων εισόδου και μπορεί να χρησιμοποιηθεί για τον έλεγχό τους. Η κλήση της συνάρτησης γίνεται κατά το συνήθη τρόπο. Ορισμός συνάρτησης με μεταβλητό πλήθος ορισμάτων εισόδου: function [ορίσματα_εξόδου] = όνομα_συνάρτησης(varargin) <ορισμός μεταβλητών με βάση τα κελιά varargin{1}, varargin{2} κλπ> <κώδικας συνάρτησης> Για παράδειγμα, έστω η συνάρτηση average η οποία θα υπολογίζει το συνολικό βαθμό ενός μαθήματος ως τη μέση τιμή των βαθμών θεωρίας και εργαστηρίου. Η μέση τιμή θα υπολογίζεται με σχετικά βάρη (π.χ. 60% θεωρία και 40% εργαστήριο), οπότε η συνάρτηση θα έχει 4 ορίσματα εισόδου (2 βαθμούς και 2 βάρη). Για λόγους απλότητας, σε περίπτωση που τα σχετικά βάρη είναι ίσα (50%-50%), θα πρέπει να είναι δυνατόν κατά την κλήση της συνάρτησης να εισάγονται μόνο οι δύο βαθμοί (μόνο 2 ορίσματα εισόδου): Ορισμός συνάρτησης function m = average(varargin) % d1, d2 = βαθμοί θεωρίας και εργαστηρίου % w1, w2 = σχετικά βάρη για τον υπολογισμό της μέσης τιμής % m = μέση τιμή βαθμών θεωρίας και εργαστηρίου (m = d1*w1 + d2*w2) % Καθορισμός ορισμάτων εισόδου % αναλόγως του πλήθους τους κατά την κλήση d1 = varargin{1}; d2 = varargin{2}; if nargin==2 w1 = 0.5; w2 = 0.5; if nargin==4 w1 = varargin{3}; w2 = varargin{4}; % Πράξεις κυρίως συνάρτησης m = d1*w1 + d2*w2; Κλήση συνάρτησης Αποτέλεσμα >> m1 = average(9, 7) >> m2 = average(9, 7, 0.6, 0.4) m1 = m2 = 8 8.2

93 Συναρτήσεις 93 β) Μεταβλητό πλήθος ορισμάτων εξόδου: varargout, nargout Κατά τον ορισμό της συνάρτησης, τα ορίσματα εξόδου πρέπει να οριστούν ως στοιχεία του πίνακα κελιών varargout. Η μεταβλητή nargout είναι αυτομάτως ίση με το πλήθος των ορισμάτων εξόδου και μπορεί να χρησιμοποιηθεί για τον έλεγχό τους. Η κλήση της συνάρτησης γίνεται κατά το συνήθη τρόπο. Ορισμός συνάρτησης με μεταβλητό πλήθος ορισμάτων εξόδου: function varargout = όνομα_συνάρτησης(ορίσματα_εισόδου) <κώδικας συνάρτησης> <ορισμός κελιών varargout{1}, varargout{2} κλπ> Για παράδειγμα, έστω η συνάρτηση stats, με είσοδο έναν πίνακα, και έξοδο τη μέση τιμή των στοιχείων του (αν κληθεί με 1 όρισμα εξόδου) ή τη μέση τιμή και το άθροισμα των στοιχείων του (αν κληθεί με 2 ορίσματα εξόδου): Ορισμός συνάρτησης function varargout = stats(a) % A = πίνακας % m = μέση τιμή πίνακα % s = άθροισμα στοιχείων πίνακα % Κυρίως συνάρτηση s = 0; for i=1:size(a,1) for j=1:size(a,2) s = s + A(i,j); m = s/(size(a,1)*size(a,2)); % Καθορισμός ορισμάτων εξόδου % αναλόγως του πλήθους τους κατά την κλήση if nargout==1 varargout{1} = m; if nargout==2 varargout{1} = m; varargout{2} = s; Κλήση συνάρτησης Αποτέλεσμα >> x = [1 2 3 ; 4 5 6]; >> mx = stats(x) mx = 3.5 >> [m, s] = stats(x) m = s =

94 94 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Εφαρμογή συνάρτησης σε πολλαπλές μεταβλητές: arrayfun, structfun, cellfun Στο MATLAB είναι δυνατή η εφαρμογή μιας συνάρτησης σε πολλαπλές μεταβλητές: arrayfun: Εφαρμογή συνάρτησης σε κάθε στοιχείο ενός πίνακα. Στην απλούστερη περίπτωση επιστρέφεται πίνακας αποτελεσμάτων ίδιας διάστασης με τον αρχικό. Παράδειγμα Αποτέλεσμα >> x = [9.1 pi ]; >> y = x) y = structfun: Εφαρμογή συνάρτησης σε κάθε πεδίο μιας δομής. Στην απλούστερη περίπτωση τα αποτελέσματα επιστρέφονται σε πίνακα. Παράδειγμα Αποτέλεσμα >> n.a = 0; >> n.b = [1:10]; >> n.c = rand(1000,1)}; >> m = n) m = cellfun: Εφαρμογή συνάρτησης σε κάθε κελί ενός cell array. Στην απλούστερη περίπτωση, πρέπει να επιστρέφονται βαθμωτές (απλές) μεταβλητές (όχι πίνακες κλπ), οι οποίες επιστρέφονται ως στοιχεία πίνακα. Παράδειγμα Αποτέλεσμα >> n = {0, [1:10], rand(1000,1)}; >> m = n) m =

95 Συναρτήσεις 95 Ερωτήσεις 11.1 Να αναφερθούν δύο διαφορές μεταξύ απλών προγραμμάτων (scripts) και συναρτήσεων (functions) Να αναφερθούν 3 πλεονεκτήματα της ανάπτυξης ενός σύνθετου προγράμματος με χρήση συναρτήσεων Να αναφέρετε μια περίπτωση στην οποία εξυπηρετεί η δημιουργία συναρτήσεων ως ξεχωριστά αρχεία καθώς και μια άλλη περίπτωση στην οποία εξυπηρετεί η δημιουργία συναρτήσεων ως υποσυναρτήσεις Να σημειωθούν με [Σ] οι σωστές και με [Λ] οι λανθασμένες απαντήσεις: [ ] Οι τοπικές μεταβλητές γίνονται γνωστές τόσο στη συνάρτηση όσο και στο πρόγραμμα που την καλεί. [ ] Οι συναρτήσεις εκτελούνται στο δικό τους ανεξάρτητο χώρο μνήμης. [ ] Μια συνάρτηση έχει υποχρεωτικά ως είσοδο μία ή περισσότερες μεταβλητές. [ ] Μια συνάρτηση έχει υποχρεωτικά ως έξοδο μία ή περισσότερες μεταβλητές. [ ] Μια συνάρτηση είναι δυνατόν να μην έχει ορίσματα εισόδου. Ασκήσεις 11.5 Να γραφτεί κατάλληλη συνάρτηση η οποία να υπολογίζει τη μέση τιμή ενός πίνακα. Υπόδειξη: Η συνάρτηση πρέπει να έχει ως όρισμα εισόδου τον πίνακα και ως όρισμα εξόδου τη μέση τιμή του Να γραφτεί κατάλληλη συνάρτηση η οποία να υπολογίζει τη μέγιστη και την ελ τιμή ενός πίνακα. Υπόδειξη: Η συνάρτηση πρέπει να έχει ως όρισμα εισόδου τον πίνακα και ως ορίσματα εξόδου τη μέγιστη και την ελάχιστη τιμή του Να γραφτεί κατάλληλη συνάρτηση η οποία να υπολογίζει το πλήθος των θετικών και το πλήθος των αρνητικών στοιχείων ενός πίνακα α) Να γραφτεί κατάλληλη συνάρτηση που να εξάγει έναν τυχαίο ακέραιο αριθμό από 1 έως 6, προσομοιώνοντας τη ρίψη ενός ζαριού. Υπόδειξη: Χρησιμοποιήστε κατάλληλα τις συναρτήσεις rand, η οποία επιστρέφει ένα τυχαίο αριθμό (όχι ακέραιο) από 0 έως 1, και τη round, για τη στρογγυλοποίηση σε ακέραιο. Η συνάρτηση δεν έχει όρισμα εισόδου. β) Να γραφτεί κατάλληλη συνάρτηση που να παράγει ρίψη 2 ζαριών. Να χρησιμοποιηθεί η συνάρτηση του ερωτήματος (α). γ) Να γραφτεί κατάλληλη συνάρτηση που να παράγει ρίψη Ν ζαριών (το Ν θα είναι είσοδος της συνάρτησης). Να χρησιμοποιηθεί η συνάρτηση του ερωτήματος (α) Να γραφτεί ο κώδικας κατάλληλης συνάρτησης η οποία να υπολογίζει το άθροισμα N όρων μιας αριθμητικής προόδου (οι όροι της προόδου είναι οι a, a+s, a+2s, a+3s, ). Υπόδειξη: Τα ορίσματα εισόδου της συνάρτησης πρέπει να είναι τα a, s και N, ενώ όρισμα εξόδου πρέπει να είναι το ζητούμενο άθροισμα Να γραφτούν δύο συναρτήσεις που θα τυπώνουν N αστερίσκους (*) στο Command Window, όπου Ν θα είναι το όρισμα εισόδου της συνάρτησης (η μία συνάρτηση πρέπει να τυπώνει τους αστερίσκους οριζοντίως, και η άλλη καθέτως). Υπόδειξη: Κάθε μία από τις συναρτήσεις πρέπει να έχει ως όρισμα εισόδου το πλήθος των αστερίσκων. Οι συναρτήσεις αυτές δεν έχουν όρισμα εξόδου (απλώς τυπώνονται οι αστερίσκοι στο Command Window) Να γραφτεί πρόγραμμα στο οποίο: α) θα ζητείται από το πληκτρολόγιο μια τιμή θερμοκρασίας σε βαθμούς Κελσίου. β) θα υπολογίζεται η αντίστοιχη τιμή θερμοκρασίας σε βαθμούς Φαρενάιτ.

96 96 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB γ) Οι δύο τιμές θερμοκρασίας θα τυπώνονται με κατάλληλο μήνυμα στο Command Window, π.χ.: 100 Celcius = 212 Fahrenheit Η μετατροπή της θερμοκρασίας από Κελσίου σε Φαρενάιτ πρέπει να γίνεται με κατάλληλη συνάρτηση, η οποία να είναι ενσωματωμένη στο πρόγραμμα. Η σχέση των δύο θερμοκρασιών είναι η εξής: 9 T T 32, όπου T C η θερμοκρασία σε βαθμούς Κελσίου και T F σε Φαρενάιτ. F 5 C Να γραφτεί κατάλληλη συνάρτηση που να έχει ως είσοδο μια συμβολοσειρά και ως έξοδο έναν αριθμητικό πίνακα 26 θέσεων που σε κάθε θέση θα περιέχει τη συχνότητα εμφάνισης κάθε γράμματος της συμβολοσειράς (π.χ. στην πρώτη θέση θα περιέχει το πλήθος των 'a', στη δεύτερη θέση των 'b' κλπ). Σημείωση: Για να αποφύγετε τη διάκριση πεζών-κεφαλαίων, μπορείτε να χρησιμοποιήσετε τη συνάρτηση (του MATLAB) upper, η οποία μετατρέπει τους χαρακτήρες μιας συμβολοσειράς σε πεζούς (για παράδειγμα upper('hello') 'HELLO') Να γραφτεί κατάλληλη συνάρτηση η οποία θα υπολογίζει το Ν! (Ν παραγοντικό), δηλαδή το γινόμενο 1 2 N, και να την αποθηκεύσετε σε αρχείο με όνομα fact.m Να γραφτεί ένα πρόγραμμα το οποίο, καλώντας κατάλληλα την συνάρτηση της προηγούμενης άσκησης (fact.m ) να υπολογίζει το πλήθος των συνδυασμών n αντικειμένων ανά k, το οποίο δίνεται από τη σχέση: n n! k k!( n k)! Για παράδειγμα, οι συνδυασμοί των 4 γραμμάτων {a,b,c,d} ανά 2 είναι οι: {a,b}, {a,c}, {a,d}, {b,c}, {b,d} και {c,d}. Τ το πλήθος των συνδυασμών αυτών μπορεί να υπολογιστεί από τον παραπάνω τύπο ως εξής: 4 4! !(4 2)!

97 12 Δομές Δομή (structure) ονομάζεται μια ομάδα μεταβλητών, ακόμα και διαφορετικών τύπων, με ένα κοινό όνομα. Οι μεταβλητές αυτές ονομάζονται πεδία (fields) της δομής. Ένα πεδίο μιας δομής μπορεί να οποιουδήποτε τύπου, ακόμη και πίνακας (ή ακόμα και άλλη δομή). Το όνομα των πεδίων της δομής χωρίζεται από το όνομα της δομής με μια τελεία (.) Απλή δομή Ανάθεση τιμών σε πεδία δομής: domi.pedio = <τιμή> domi.pedio(<δείκτης>) = <τιμή> Π.χ.: Έστω η δομή Student, με πεδία τα Name (αλφαριθμητικό), Phone (αλφαριθμητικό) και Degrees (αριθμητικός πίνακας). Τότε: Η δομή Η δομή: Student Τα πεδία: Name Phone Degrees Οι μεταβλητές: Student.Name Student.Phone Student.Degrees(1) Student.Degrees(2) Student.Degrees(3) Student Name: Nicolas Phone: Degrees: 7, 9, 5 Τα πεδία Οι τιμές των πεδίων Παραδείγματα % Δημιουργία δομής και απεικόνιση ενός πεδίου patient.name = 'John'; patient.height = 1.80; disp(patient.name); % Χρήση της μεταβλητής ενός πεδίου της δομής heightincentimeters = 100*patient.height; disp(heightincentimeters); % Πρόσθεση επιπλέον πεδίου σε μια υπάρχουσα δομή patient.weight = 75; patient.bmi = patient.weight/patient.height^2; patient Δημιουργία δομής με πεδίο που είναι πίνακας Student.Name = 'Nicolas'; Student.Phone = ' '; Student.Degrees(1) = 7; Student.Degrees(2) = 9; Student.Degrees(3) = 5; Student mo = 0; for i=1:3 mo = mo + Student.Degrees(i); mo = mo / length(student.degrees) Αποτελέσματα John 180 patient = name: 'John' height: 1.8 weight: 75 bmi: Student = Name: 'Nicolas' Phone: ' ' Degrees: [7 9 5] mo = 7

98 98 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 12.2 Πίνακας Δομών (Structure Array) Ένας πίνακας μπορεί να αποτελείται από στοιχεία που είναι τύπου δομής. Αυτό σημαίνει ότι τα πεδία της ίδιας δομής επαναλαμβάνονται με διαφορετική ομάδα τιμών κάθε φορά. Τότε ο πίνακας αποτελεί μια βάση δεδομένων (database), και κάθε στοιχείο του λέγεται εγγραφή (record). Ανάθεση τιμών σε πεδία πίνακα δομών: domi(<δείκτης>).pedio = <τιμή> domi(<δείκτης>).pedio(<δείκτης>) = <τιμή> Π.χ.: Έστω η δομή Students, με πεδία Name (αλφαριθμητικό), Phone (αλφαριθμητικό) και Degrees (αριθμητικός πίνακας). Τότε: Ο πίνακας δομών: Students Τα πεδία: Name Weight Height Οι μεταβλητές: Students(1).Name Students(1).Phone Students(1).Degrees(1) Students(1).Degrees(2) Students(1).Degrees(3) Students(2).Name Students(2).Phone Students(2).Degrees(1) Students(2).Degrees(2) Students(2).Degrees(3)... Students(3) Name: Georgiou Ioannis Phone: Students(2) Degrees: 5, 7, 4 Name: Tetsi Maria Phone: Students(1) Degrees: 8, 6, 10 Name: Neos Nicolaos Phone: Degrees: 7, 9, 5 Εγγραφή 1 Εγγραφή 2 Εγγραφή 3 Παραδείγματα % Εισαγωγή 5 εγγραφών της βάσης δεδομένων for i=1:5 fprintf('patient #%d\n', i); Patients(i).Name = input('name : ', 's'); Patients(i).LDL = input('ldl value : '); Patients(i).HDL = input('hdl value : '); Patients(i).LH = Patients(i).LDL/Patients(i).HDL; fprintf('\n'); Αποτελέσματα Patient #1 Name : John LDL value: 190 HDL value: 16 Patient #2 Name : George LDL value: 130 HDL value: 40...e.t.c... % Εκτύπωση των ασθενών υψηλού κινδύνου όλης της βάσης for i=1:length(patients) if Patients(i).LH > 11 fprintf('%s: High risk\n', Patients(i).Name); fprintf('(hdl/ldl = %.1f)\n\n', Patients(i).LH); John: High risk (HDL/LDL = 11.9) Nicolas: High risk (HDL/LDL = 12.3)

99 Δομές Ιδιαίτερα είδη δομών του MATLAB: Πίνακες Κελιών (Cell Arrays) Εκτός από τις κλασσικές δομές (structures), που υπάρχουν με παρόμοια μορφή και σε άλλες γλώσσες προγραμματισμού, όπως η C, το MATLAB προσφέρει και έναν ιδιαίτερο τύπο μεταβλητής τύπου δομών που λέγεται πίνακας κελιών (cell array). Τα cell arrays του MATLAB είναι μια συλλογή μεταβλητών οργανωμένων σε μορφή πινάκων, των οποίων τα στοιχεία ονομάζονται «κελιά» και, αντίθετα από τους «κανονικούς» πίνακες, μπορεί να περιέχουν μεταβλητές διαφορετικού τύπου (όπως στις δομές). Η διαφορά από τις δομές είναι ότι οι επιμέρους μεταβλητές των cell arrays χαρακτηρίζονται από δείκτες όπως στους πίνακες, αντί για ονόματα πεδίων όπως στις δομές. Έτσι, τα cell arrays συνδυάζουν την ευελιξία των διαφορετικών τύπων μεταβλητών (όπως στις δομές), με την ευκολία προσπέλασης και σάρωσης των κελιών τους με δείκτες (όπως στους πίνακες). Στο MATLAB, οι δομές θεωρούνται ειδικές περιπτώσεις των cell arrays. Για παράδειγμα, μια απλή δομή Ν πεδίων αποθηκεύεται στη μνήμη με τον ίδιο τρόπο όπως ένα cell array μεγέθους 1 Ν. Τα κελιά των cell arrays μπορεί να περιέχουν οποιοδήποτε τύπο μεταβλητής, όπως απλές μεταβλητές, πίνακες, συμβολοσειρές, δομές ή ακόμα και άλλα cell arrays. Μια απλή συχνή χρήση των cell arrays είναι ως πίνακες αποθήκευσης συμβολοσειρών. Τόσο η ανάθεση τιμών σε κελιά ενός cell array όσο και η αναφορά σ αυτά γίνεται με άγκιστρα ({}). Ανάθεση τιμών σε cell array: Οι τιμές τοποθετούνται μέσα σε άγκιστρα {...}, και διευθετούνται σε γραμμές και στήλες με τον ίδιο τρόπο που γίνεται στους πίνακες: τα στοιχεία μιας γραμμής χωρίζονται μεταξύ τους με κενό ή κόμμα, ενώ οι γραμμές χωρίζονται με ερωτηματικό ή με αλλαγή γραμμής ( Enter),π.χ. A = {'John',75 ; 1.80,[ ]}. Αναφορά σε κελί ενός cell array: Οι δείκτες των κελιών μπαίνουν επίσης σε άγκιστρα, χωρισμένοι με κόμμα. Π.χ. το στοιχείο A{2,2} του προηγούμενου παραδείγματος είναι ο πίνακας [ ]. Ακολουθούν παραδείγματα ανάθεσης και αναφοράς κελιών σε cell arrays: Παραδείγματα % Ορισμός / Ανάθεση τιμών cell array students={'john', 75, 1.80, [ ] 'Nic', 82, 1.75, [10 7 8] 'Anna', 58, 1.70, [ ]} % Αναφορά στα κελιά ενός cell array AnnaWeight = students{3,2} John2ndDegree = students{1,4}(2) AnnaName = students{3,1} Anna4thLetter = students{3,1}(4) % Εύρεση μέσου όρου του 2ου βαθμού μεταξύ % των μαθητών mo = 0; for i=1:3 mo = mo + students{i,4}(2); ; mo = mo/3 Αποτελέσματα students = 'John' [75] [ 1.8] [1x3 double] 'Nic' [82] [1.75] [1x3 double] 'Anna' [58] [ 1.7] [1x3 double] AnnaWeight = 58 John2ndDegree = 9 AnnaName = Anna Anna4thLetter = a mo = 7.5 Σημείωση: Στο πρώτο παράδειγμα το cell array με όνομα students χρησιμοποιήθηκε ως βάση δεδομένων (με κάθε γραμμή να είναι και από μια εγγραφή, και οι στήλες να περιέχουν τα πεδία της βάσης), αυτό όμως δεν είναι υποχρεωτικό (π.χ. δεν είναι ανάγκη τα στοιχεία της πρώτης στήλης ενός cell array να περιέχουν όλα συμβολοσειρές).

100 100 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Συναρτήσεις για cell arrays Ακολουθούν λίγες βασικές συναρτήσεις για τα cell arrays: cell A = cell(m,n,...) Δημιουργία ενός κενού cell array με όνομα A και διαστάσεις m n... celldisp celldisp(a) Απεικόνιση ενός cell array: Η celldisp προκαλεί την απεικόνιση όλων των στοιχείων ενός cell array, καθώς η «απλή» disp (ή η παράλειψη του ελληνικού ερωτηματικού στο τέλος) προκαλεί μόνο συνοπτική παρουσίαση των περιεχομένων του. cellplot cellplot(c) Γραφική απεικόνιση ενός cell array: Η cellplot εμφανίζει ένα παράθυρο γραφικών (figure) με μια γραφική απεικόνιση του cell array, όπου κάθε τύπος μεταβλητής απεικονίζεται με διαφορετικό τρόπο με σκοπό το γρήγορο οπτικό έλεγχο του είδους των περιεχομένων του. Παραδείγματα struct.a = 143; struct.b = {'W';7}; C = {'Nic', struct, {150;44}}; disp('1. disp(c):'); disp(c); disp(' '); disp('2. celldisp(c):'); celldisp(c); Αποτελέσματα 1. disp(c): 'Nic' [1x1 struct] {2x1 cell} 2. celldisp(c): C{1} = Nic C{2} = a: 143 b: {2x1 cell} C{3}{1} = 150 C{3}{2} = 44 cellplot(c);

101 Δομές 101 Ερωτήσεις 12.1 Να οριστούν οι έννοιες: δομή, πεδίο, πίνακας δομών, εγγραφή, βάση δεδομένων Να προσδιοριστεί μια διαφορά των δομών από τους πίνακες Να υπολογιστεί το μέγεθος (σε bytes) της δομής που ορίστηκε στο MATLAB με τις παρακάτω εντολές στο Command Window: >> Patient.Name = 'John'; >> Patient.Age = 35; >> Patient.Weight = 85; >> Patient.Height = 1.80; >> Patient.ExamValues = [ ]; 12.4 Πρόκειται να δημιουργηθεί μια βάση δεδομένων με δημογραφικά στοιχεία ασθενών. Κάθε εγγραφή της βάσης θα έχει δύο πεδία: το όνομα και την ηλικία του ασθενούς. Ποιός από τους δύο παρακάτω πίνακες δομών είναι λογικά καταλληλότερος για την ανάπτυξη της βάσης, και γιατί; Πίνακας δομών #1: Patient.Name(1) = 'John'; Patient.Age(1) = 35; Patient.Name(2) = 'Mary'; Patient.Age(2) = 24; Πίνακας δομών #2: Patient(1).Name = 'John'; Patient(1).Age = 35; Patient(2).Name = 'Mary'; Patient(2).Age = 24; 12.5 Να σημειωθούν με [Σ] οι σωστές και με [Λ] οι λανθασμένες απαντήσεις: [ ] Στα πεδία μιας δομής αποθηκεύονται μεταβλητές πάντοτε ίδιου τύπου. [ ] Ένας πίνακας δεν είναι δυνατόν να είναι πεδίο μιας δομής. [ ] Ένα πεδίο μιας δομής μπορεί να περιέχει συμβολοσειρά. [ ] Η εντολή "struct.field(1) = 40;" ορίζει το πρώτο στοιχείο ενός πίνακα, ο οποίος είναι πεδίο δομής (ποιο είναι το όνομα του πίνακα και ποιο της δομής;). [ ] Η εντολή "struct(1).field = 40;" ορίζει ένα πεδίο της πρώτης εγγραφής ε- νός πίνακα δομών (ποιο είναι το όνομα του πίνακα δομών και ποιο του πεδίου;) Στο παρακάτω τμήμα κώδικα προγράμματος αρχικά ορίζεται μια δομή με δύο πεδία, το όνομα (συμβολοσειρά) και οι βαθμοί (αριθμητικός πίνακας) ενός σπουδαστή. Στη συνέχεια επιχειρείται να βρεθεί η μέση τιμή των βαθμών του σπουδαστή, να αποθηκευτεί σε ένα νέο πεδίο της δομής και να απεικονιστεί με fprintf με κατάλληλο μήνυμα. Να βρεθούν τα σφάλματα του προγράμματος και να γραφτεί ο διορθωμένος κώδικας στις κενές γραμμές στο δεξιό τμήμα: stud.name = 'John'; stud.degr = [8 10 7]; s = 0; for i=1:length(stud.degr) s = s + degr(i); stud.mean = s/length(degr); fprintf('mean degree of %s is %f',name,mean);

102 102 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ασκήσεις 12.7 α) Να δημιουργηθεί με κατάλληλες εντολές στο Command Window μια δομή η οποία να περιέχει το όνομα, το επώνυμο, την ηλικία, το βάρος και το ύψος ενός ασθενούς. β) Στη συνέχεια, με μία κατάλληλη εντολή fprintf, να τυπωθεί στο Command Window ένα μήνυμα όπως στο επόμενο παράδειγμα με τυχαίες τιμές των στοιχείων ενός ασθενούς: Patient John is 45 age old Να γραφτεί κατάλληλο πρόγραμμα στο οποίο: α) Θα ζητούνται από το πληκτρολόγιο τα παρακάτω στοιχεία ενός σπουδαστή, τα ο- ποία θα αποθηκεύονται σε κατάλληλα αντίστοιχα πεδία μιας δομής: Όνομα (συμβολοσειρά) Αριθμός Μητρώου (συμβολοσειρά) Εξάμηνο (συμβολοσειρά) Βαθμοί (αριθμητικός πίνακας με 5 στοιχεία, για βαθμούς 5 μαθημάτων) β) Θα υπολογίζεται η μέση τιμή των βαθμών του σπουδαστή, η οποία θα αποθηκεύεται σε κατάλληλο επόμενο πεδίο της δομής Να τροποποιηθεί το πρόγραμμα της άσκησης 12.8 με χρήση πίνακα δομών αντί απλής δομής, ώστε να είναι δυνατή η εισαγωγή στοιχείων για 100 σπουδαστές. Στη συνέχεια να τυπωθούν τα στοιχεία των σπουδαστών στο Command Window, με μία γραμμή ανά σπουδαστή, όπως στο ακόλουθο παράδειγμα: Nikos Nikolaidis (AM=1074). Mesi timi bathmwn = Να δημιουργείται μια δομή με τα εξής πεδία σπουδαστών: Όνομα (συμβολοσειρά), Αριθμός Μητρώου (συμβολοσειρά), Εξάμηνο (χαρακτήρας), Βαθμοί (αριθμητικός πίνακας), Μέση τιμή βαθμών (αριθμός) Ο Δείκτης Σωματικού Βάρους (Body Mass Index, BMI) ενός ατόμου ισούται με το πηλίκο του βάρους του (σε kg) προς το τετράγωνο του ύψους του (σε m): Βάρος (kg) BMI = Ύψος (m) 2 Ο Δείκτης Σωματικού Βάρους είναι ένας στατιστικός δείκτης για την εκτίμηση της παχυσαρκίας σε ενήλικες. Οι κατηγορίες του BMI είναι (http://www.nhlbisupport.com/bmi/): Λιπόβαρος: BMI < 18.5 Κανονικό βάρος: 18.5 BMI < 25 Υπέρβαρος: 25 BMI < 30 Παχύσαρκος: BMI 30 α) Να γραφτεί κατάλληλο πρόγραμμα για την εισαγωγή από το πληκτρολόγιο των στοιχείων 100 ασθενών, τα οποία θα αποθηκεύονται στα πεδία ενός πίνακα δομών 100 στοιχείων. Τα πεδία του πίνακα δομών πρέπει να είναι: όνομα, επώνυμο, ηλικία, βάρος, ύψος και δείκτης σωματικού βάρους (bmi). β) Ο δείκτης σωματικού βάρους δεν θα εισάγεται από το πληκτρολόγιο, αλλά θα υπολογίζεται από το βάρος και το ύψος του ασθενούς, και θα αποθηκεύεται στο κατάλληλο πεδίο του πίνακα δομών. γ) Μετά την εισαγωγή των στοιχείων των ασθενών, θα γίνεται εκτύπωση των στοιχείων τους στο Command Window, σε μία γραμμή ανά ασθενή, όπως στο ακόλουθο παράδειγμα: Patient: John Kalatzis. BMI = 27.8

103 13 Αρχεία 13.1 Είδη αρχείων Οι τιμές των μεταβλητών ενός προγράμματος μπορούν να αποθηκεύονται στα μέσα μόνιμης αποθήκευσης σε ομάδες δεδομένων που ονομάζονται αρχεία. Τα δεδομένα μπορούν να αποθηκευτούν στα αρχεία με δύο μορφές: α) ως δυαδικοί αριθμοί που αντιστοιχούν σε χαρακτήρες κειμένου του πίνακα ASCII (βλ. 1.5), οπότε τα αρχεία ονομάζονται αρχεία κειμένου (text files), ή β) ως δυαδικοί αριθμοί που δεν αντιστοιχούν αναγκαστικά σε χαρακτήρες ASCII, οπότε τα αρχεία ονομάζονται δυαδικά αρχεία (binary files). Τα αρχεία κειμένου είναι εύκολα αναγνώσιμα με οποιονδήποτε διορθωτή αρχείων κειμένου (editor) όπως το Notepad (Σημειωματάριο) των Windows. Στη συνέχεια θα δειχθεί πώς είναι δυνατόν να εγγραφούν τιμές μεταβλητών σε μαγνητικά μέσα (σκληρός δίσκος, δισκέτα, μνήμη flash), καθώς και το αντίστροφο (πώς να αναγνωστούν από το δίσκο σε μεταβλητές) Άνοιγμα και κλείσιμο αρχείου Πριν χρησιμοποιηθεί ένα αρχείο πρέπει να «ανοιχθεί» (δηλαδή να δεσμευτεί το όνομά του για αποκλειστική χρήση), ενώ μετά πρέπει να «κλείσει» (δηλαδή να αποδεσμευτεί). fopen <μεταβλητή_αρχείου> = fopen('όνομα_αρχείου', 'επιλογές') Άνοιγμα αρχείου για ανάγνωση ή εγγραφή: Η μεταβλητή_αρχείου (file identifier) α- ντιπροσωπεύει μέσα στο πρόγραμμα το 'αρχείο'. Μπορούν να είναι ανοιχτά πολλά αρχεία ταυτόχρονα, με διαφορετικές μεταβλητές_αρχείου. Αν και δεν είναι υποχρεωτικό, συστήνεται να χρησιμοποιείται η επέκταση '.txt' στα αρχεία κειμένου που δημιουργεί ο χρήστης στα Windows, για να γίνεται εύκολα ο έλεγχός τους με τη βοήθεια π.χ. του Notepad (Σημειωματάριο). Η παράμετρος 'επιλογές' δηλώνει με ποιόν τρόπο θα χρησιμοποιηθεί το αρχείο. Οι συνήθεις τιμές της είναι 'w' για εγγραφή (write), 'a' για προσθήκη (app) ή 'r' για ανάγνωση (read), σε συνδυασμό με τις 't' για αρχείο κειμένου (text) ή 'b' για δυαδικό αρχείο (binary) αντίστοιχα: Τρόπος χρήσης αρχείου Για αρχεία κειμένου Για δυαδικά αρχεία Άνοιγμα αρχείου για εγγραφή (write) 'wt' 'wb' Άνοιγμα αρχείου για προσθήκη (app) δεδομένων 'at' 'ab' Άνοιγμα αρχείου για ανάγνωση (read) 'rt' 'rb' Η διαφορά της εγγραφής (write) από την προσθήκη (app) είναι ότι, αν το αρχείο υπάρχει στο δίσκο, η εγγραφή ('w') το σβήνει και το ξαναδημιουργεί με τα νέα δεδομένα, ενώ η προσθήκη ('a') έχει ως αποτέλεσμα την προσθήκη των νέων δεδομένων μετά το τέλος των προηγουμένων. fclose fclose(<μεταβλητή_αρχείου>) Κλείσιμο του αρχείου μετά τη χρήση του. Παράδειγμα % Π.χ.1: Άνοιγμα για εγγραφή αρχείου κειμένου στο Current Directory. fid = fopen('mydata.txt', 'wt'); % Π.χ.2: Άνοιγμα για προσθήκη νέων δεδομένων σε δυαδικό αρχείο στη δισκέτα. fid = fopen('a:\mydata.dat', 'ab'); % Π.χ.3: Κλείσιμο αρχείου. fclose(fid);

104 104 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 13.3 Αρχεία κειμένου Για εγγραφή (αποθήκευση τιμών μεταβλητών σε μαγνητικό μέσο) και ανάγνωση (ανάκτηση τιμών από μαγνητικό μέσο σε μεταβλητές) αρχείων κειμένου μπορούν να χρησιμοποιηθούν οι συναρτήσεις fprintf και fscanf: fprintf (σε μορφή για εγγραφή σε αρχείο κειμένου) fprintf(<μεταβλητή_αρχείου>, 'παράσταση', <μεταβλητές>) Εγγραφή τιμών μεταβλητών σε αρχείο κειμένου: H μεταβλητή_αρχείου είναι αυτή με την οποία έχει ανοιχθεί το αρχείο με την fopen. Κατά τα άλλα η fprintf λειτουργεί όμοια όπως για εκτύπωση στην οθόνη (η 'παράσταση' περιέχει κείμενο και ειδικούς χαρακτήρες, \n, %d, %f, %c, %s). fscanf <μεταβλητή> = fscanf(<μεταβλητή_αρχείου>, 'μορφή', <πλήθος>) Ανάγνωση τιμών από αρχείο σε μεταβλητές κειμένου: Διαβάζονται τόσα στοιχεία από το αρχείο όσα δηλώνει το πλήθος (που μπορεί να είναι και ίσο με Inf, οπότε το αρχείο διαβάζεται μέχρι το τέλος του), και αποθηκεύονται στη μεταβλητή με μορφή κειμένου. Εάν επαναληφθεί η fscanf πριν κλείσει το αρχείο, η ανάγνωση συνεχίζεται από το σημείο που είχε σταματήσει προηγουμένως. Η 'μορφή' δηλώνει τον τύπο των δεδομένων, δηλαδή ακέραιος (%d), κινητής υποδιαστολής (%f), χαρακτήρας (%c) ή συμβολοσειρά (%s). Ο τύπος %s αγνοεί τους «λευκούς» χαρακτήρες (δηλαδή κενό διάστημα/space, στηλοθέτες/tab και αλλαγή γραμμής/enter), οι οποίοι μπορούν να διαβαστούν μόνο με %c. Παραδείγματα Αποτελέσματα name = 'John'; w = 85.2; % Άνοιγμα για εγγραφή, Εγγραφή, Κλείσιμο fid = fopen('mydata.txt', 'wt'); fprintf(fid, '%s weights %.1f kg.', name, w); fclose(fid); Έχει δημιουργηθεί ένα αρχείο στο current directory με όνομα mydata.txt, στο οποίο έχει γραφτεί: John weights 85.2 kg. % Άνοιγμα για διάβασμα, Διάβασμα, Κλείσιμο fid = fopen('mydata.txt', 'rt'); a = fscanf(fid, '%c', 12); b = fscanf(fid, '%f', 1); fclose(fid); % Εκτύπωση μεταβλητών στην οθόνη disp(a); disp(b); fid = fopen('mydata.txt', 'rt'); a = fscanf(fid, '%s', 2) b = fscanf(fid, '%d', 1) fclose(fid); John weights 85.2 A = Johnweights b = 85

105 Αρχεία 105 Οι επόμενες δύο συναρτήσεις του MATLAB είναι πολύ χρήσιμες για ανάγνωση ολόκληρων γραμμών από αρχεία κειμένου: fgetl <μεταβλητή> = fgetl(<μεταβλητή_αρχείου>) Διαβάζει μια γραμμή κειμένου από το αρχείο που σχετίζεται με μια μεταβλητη_αρχείου και την αποθηκεύει στη μεταβλητή. fgets <μεταβλητή> = fgets(<μεταβλητή_αρχείου>) Διαβάζει μια γραμμή κειμένου, μαζί με το χαρακτήρα αλλαγής γραμμής, από το αρχείο που σχετίζεται με μια μεταβλητή_αρχείου και την αποθηκεύει στη μεταβλητή. Η μόνη διαφορά των δύο συναρτήσεων είναι ότι η fgets διαβάζει και το χαρακτήρα αλλαγής γραμμής (enter), ενώ η fgetl όχι. Παράδειγμα 1 % Έστω το αρχείο days.txt που περιέχει τις % ημέρες της εβδομάδας, μία σε κάθε γραμμή. fid = fopen('days.txt', 'rt'); for i=1:7 day = fgetl(fid); if day(1)=='s' disp('week!'); else disp([day ' is a weekday']); fclose(fid); Αποτέλεσμα Week! Monday is a weekday Tuesday is a weekday Wednesday is a weekday Thursday is a weekday Friday is a weekday Week! >> Παράδειγμα 2 % Ανάγνωση της 1ης γραμμής του αρχείου days.txt με getl: fid = fopen('days.txt', 'rt'); s1 = fgetl(fid); fclose(fid); % Ανάγνωση της 1ης γραμμής του αρχείου days.txt με gets: fid = fopen('days.txt', 'rt'); s2 = fgets(fid); fclose(fid); % Απεικόνιση των τελευταίων χαρακτήρων των μεταβλητών s1 και s2 s1(length(s1)) s2(length(s2)) Αποτέλεσμα ans = y ans = >> Σχόλιο: Στις συμβολοσειρές s1 και s2 περιέχεται η πρώτη γραμμή του αρχείου days.txt, π.χ. Sunday. ο τελευταίος χαρακτήρας της συμβολοσειράς s1 είναι ο χαρακτήρας 'y', διότι έχει διαβαστεί με την fgetl. Αντίθετα, ο τελευταίος χαρακτήρας της συμβολοσειράς s2 είναι ο χαρακτήρας αλλαγής γραμμής, γιατί έχει διαβαστεί με την fgets.

106 106 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 13.4 Δυαδικά αρχεία Για εγγραφή δεδομένων σε δυαδική μορφή μπορεί να χρησιμοποιηθεί η συνάρτηση fwrite. Για ανάγνωση δεδομένων από δυαδικό αρχείο μπορεί να χρησιμοποιηθεί η συνάρτηση fread, αρκεί να είναι γνωστός ο τρόπος που έχει γίνει η εγγραφή. fwrite fwrite(<μεταβλητή_αρχείου>, <μεταβλητή>, 'ακρίβεια') Εγγραφή σε δυαδικό αρχείο: Η μεταβλητή μπορεί να είναι μόνο απλή μεταβλητή ή πίνακας (υπενθυμίζεται ότι, αν και μια δομή δεν είναι απλή μεταβλητή, εν τούτοις τα πεδία της είναι βλ. και παράδειγμα παρακάτω). Η 'ακρίβεια' καθορίζει πόσα bytes θα δεσμευτούν στο μέσο εγγραφής για τη μεταβλητή. Συνήθεις χρήσιμες τιμές της είναι: 'char' χαρακτήρας, 1 byte 'int' ακέραιος, 4 bytes 'float' κινητής υποδιαστολής, 4 bytes 'double' κινητής υποδιαστολής, 8 bytes fread <μεταβλητή> = fread(<μεταβλητή_αρχείου>, <πλήθος>, 'ακρίβεια') Ανάγνωση από δυαδικό αρχείο: Διαβάζονται τόσα στοιχεία από το αρχείο όσα δηλώνει το πλήθος (που μπορεί να είναι και ίσο με Inf, οπότε το αρχείο διαβάζεται μέχρι το τέλος του), και αποθηκεύονται στη μεταβλητή. Εάν επαναληφθεί η fread πριν κλείσει το αρχείο, η ανάγνωση συνεχίζεται από το σημείο που είχε σταματήσει προηγουμένως. H 'ακρίβεια' πρέπει να είναι αυτή με την οποία γράφτηκαν οι μεταβλητές με την fwrite ('char' 1byte, 'int' 4bytes, 'float' 4bytes ή 'double' 8bytes). Σημείωση: Ειδικά για τις μεταβλητές χαρακτήρα, αν θέλουμε να επιστραφούν με μορφή χαρακτήρα, πρέπει να θέσουμε την 'ακρίβεια' ίση με '*char', αλλιώς επιστρέφεται ο ASCII κωδικός τους. Παραδείγματα data.name = 'Nicolas'; data.weight = 85.2; % Άνοιγμα για εγγραφή, Εγγραφή, Κλείσιμο fid = fopen('h:mydata.bin', 'wb'); fwrite(fid, data.name, 'char'); fwrite(fid, data.weight, 'float'); fclose(fid); Αποτελέσματα Έχει δημιουργηθεί ένα αρχείο στη μονάδα H: (π.χ. USB stick) με όνομα mydata.bin. Το αρχείο έχει μέγεθος 11 bytes (7 bytes για τη μεταβλητή data.name='nicolas' ως τύπου 'char' και 4 bytes για τη μεταβλητή 'float'). % Άνοιγμα για διάβασμα, Διάβασμα, Κλείσιμο fid = fopen('mydata.bin', 'rb'); a = fread(fid, 7, '*char')' b = fread(fid, 1, 'float')' fclose(fid); a = Nicolas b = 85.2

107 Αρχεία Έλεγχος του δείκτη θέσης σε αρχείο Κατά την ανάγνωση ενός αρχείου είναι χρήσιμη η γνώση του δείκτη θέσης, δηλαδή του σημείου όπου έχει σταματήσει η ανάγνωση. Επίσης είναι χρήσιμη και η δυνατότητα μετακίνησης του δείκτη σε άλλη θέση, ώστε να μπορεί να συνεχιστεί η ανάγνωση από άλλο σημείο. ftell <θέση> = ftell(<μεταβλητή_αρχείου>) Δείκτης θέσης σε αρχείο: Επιστρέφεται η θέση μέσα στο αρχείο στην οποία έχει σταματήσει η ανάγνωση, με τη μορφή ενός θετικού ακέραιου που ξεκινάει από το μηδέν και δείχνει την «απόσταση» σε bytes του δείκτη θέσης από την αρχή του αρχείου. Παράδειγμα fid = fopen('mydata.txt', 'rt'); a = fscanf(fid, '%c', 6); position1 = ftell(fid) b = fscanf(fid, '%c', 1); position2 = ftell(fid) fclose(fid); Αποτέλεσμα position1 = 6 position2 = 7 fseek fseek(<μεταβλητή_αρχείου>, <μετακίνηση>, 'αφετηρία') Μετακίνηση του δείκτη θέσης: Ο δείκτης θέσης μετακινείται κατά τόσα bytes όσα ορίζει η μετακίνηση σε σχέση με την 'αφετηρία'. Η μετακίνηση μπορεί να είναι θετική (μετακίνηση προς το τέλος του αρχείου), αρνητική (μετακίνηση προς την αρχή του αρχείου) ή μηδέν (καμία μετακίνηση). Η 'αφετηρία' μπορεί να είναι 'bof' (beginning of file, αρχή του αρχείου) 'cof' (current position, τρέχουσα θέση) ή 'eof' ( of file, τέλος του αρχείου). Παραδείγματα % Απεικόνιση του τελευταίου χαρακτήρα του αρχείου fid = fopen('mydata.txt', 'rt'); fseek(fid, -1,'eof'); lastcharacter = fscanf(fid, '%c', 1) fclose(fid); Αποτέλεσμα (Διάβασμα από το 'mydata.txt' του τελευταίου χαρακτήρα του αρχείου και απεικόνισή του στο Command Window.) % Επαναφορά του δείκτη θέσης στην αρχή fseek(fid, 0,'bof'); % Η επαναφορά του δείκτη θέσης στην αρχή γίνεται και με την εντολή frewind: frewind(fid); feof <έλεγχος_τέλους> = feof(<μεταβλητή_αρχείου>) Έλεγχος του τέλους του αρχείου (-of-file): Η feof επιστρέφει τη λογική τιμή 1 (true) αν ο δείκτης θέσης του αρχείου είναι στο τέλος, αλλιώς επιστρέφει 0 (false). Παράδειγμα % Read till the -of-file fid = fopen('mydata.txt', 'rt'); while ~feof(fid) a = fscanf(fid, '%c', 1); fprintf('%c',a); fclose(fid); Αποτέλεσμα John weights 85.2 kg.

108 108 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 13.6 Παραδείγματα τρόπου εργασίας με αρχεία κειμένου α) Παράδειγμα εγγραφής δεδομένων από πίνακα δομών σε αρχείο κειμένου: Έστω ότι επιθυμούμε (i) να εισάγουμε σε ένα πίνακα δομών τα εξής στοιχεία για 100 σπουδαστές: Όνομα, Αριθμός μητρώου, Βαθμοί 5 μαθημάτων και (ii) την εγγραφή των στοιχείων αυτών σε ένα αρχείο κειμένου, σε 3 γραμμές για κάθε σπουδαστή (το όνομα στην 1 η γραμμή, ο αριθμός μητρώου στη 2 η και οι 5 βαθμοί στην 3 η, χωρισμένοι με κενό διάστημα (space). Για παράδειγμα, το αρχείο με τα στοιχεία των σπουδαστών μπορεί να είναι ως εξής: students.txt Nikolaou Georgiou Anagnostopoulos Ο κώδικας του προγράμματος, που υλοποιεί το παραπάνω πρόβλημα, μπορεί να είναι ο εξής: students_write.m clc; clear all; N = 100; % Πλήθος σπουδαστών n = 5; % Πλήθος βαθμών % Εισαγωγή στοιχείων σε πίνακα δομών for i=1:n s(i).n = input('name: ', 's'); s(i).am = input('am: ', 's'); for j=1:n message = sprintf('degree %d: ',j); s(i).d(j) = input(message); fprintf('\n'); % Εγγραφή πίνακα δομών σε αρχείο κειμένου fid = fopen('students.txt', 'wt'); for i=1:n fprintf(fid,'%s\n',s(i).n); fprintf(fid,'%s\n',s(i).am); for j=1:n fprintf(fid,'%.1f ',s(i).d(j)); if i<n fprintf(fid,'\n'); Αποτελέσματα Name: Nikolaou AM: Degree 1: 8.5 Degree 2: 6 Degree 3: 9 Degree 4: 10 Degree 5: 7.5 Name: Georgiou AM: Degree 1: 7 Degree 2: 5 Degree 3: 8 Degree 4: 6.5 Degree 5: 9 Name: Anagnostopoulos AM: Degree 1: 6.5 Degree 2: 7 Degree 3: 9.5 Degree 4: 10 Degree 5: >> fclose(fid);

109 Αρχεία 109 Παρατήρηση: Κατά την εγγραφή των στοιχείων κάθε σπουδαστή, μετά από τους 5 βαθμούς εγγράφεται ένας χαρακτήρας αλλαγής γραμμής. Αυτό γίνεται σε όλους τους σπουδαστές, ε- κτός από την τελευταία επανάληψη (if i<n...). Αυτό γίνεται ώστε να μην υπάρχει μια α- κόμα γραμμή (έστω και κενή) μετά το τέλος των δεδομένων, καθώς αυτό θα δυσκόλευε την κατασκευή του προγράμματος ανάγνωσης του αρχείου (βλέπε επόμενο παράδειγμα). β) Παράδειγμα ανάγνωσης δεδομένων από αρχείο κειμένου σε πίνακα δομών: Έστω ότι διαθέτουμε το αρχείο students.txt που δημιουργήθηκε με το προηγούμενο παράδειγμα, και ότι επιθυμούμε να διαβάσουμε τα δεδομένα που περιέχει και να τα εισάγουμε σε έναν πίνακα δομών. Ο κώδικας του προγράμματος, που υλοποιεί το παραπάνω πρόβλημα (που ουσιαστικά είναι το αντίστροφο του προηγούμενου παραδείγματος), μπορεί ναι είναι ο εξής: students_read.m clc; clear all; n = 5; % Ανάγνωση δεδομένων από το αρχείο κειμένου % και εισαγωγή τους σε πίνακα δομών. fid = fopen('students1.txt', 'rt'); i = 0; while ~feof(fid) i = i + 1; s(i).n = fgetl(fid); s(i).am = fgetl(fid); for j=1:n s(i).d(j) = fscanf(fid,'%f',1); temp = fscanf(fid,'%c',1); Αποτελέσματα Nikolaou (AM: 06042) Degrees: Georgiou (AM: 04134) Degrees: Anagnostopoulos (AM: 05206) Degrees: >> fclose(fid); % Απεικόνιση των στοιχείων των σπουδαστών N = length(s); for i=1:n fprintf('%s (AM: %s)\n', s(i).n, s(i).am); fprintf('degrees:'); for j=1:n fprintf(' %.1f',s(i).d(j)); fprintf('\n\n'); Παρατήρηση: Κατά την ανάγνωση των στοιχείων κάθε σπουδαστή, μετά από τους 5 βαθμούς διαβάζεται ένας ακόμα χαρακτήρας. Αυτός είναι ο χαρακτήρας αλλαγής γραμμής, που δεν είναι δυνατόν να διαβαστεί με την fscanf(fid,'%f',1), γιατί είναι τύπου %c και όχι %f. Επειδή αυτός ο χαρακτήρας δεν μας χρειάζεται, εισάγεται σε μια προσωρινή μεταβλητή που δεν χρησιμοποιείται (temp).

110 110 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 13.7 Ιδιαίτερες συναρτήσεις του MATLAB για χειρισμό αρχείων Εκτός από τον κλασσικό τρόπο χειρισμού των αρχείων που προαναφέρθηκε, και που με μικρές διαφορές εφαρμόζεται και σε άλλες γλώσσες προγραμματισμού (όπως η C), το MATLAB προσφέρει και ιδιαίτερες εξειδικευμένες συναρτήσεις με σκοπό τον εύκολο χειρισμό αρχείων (με τις οποίες όμως ο προγραμματιστής δεν έχει απόλυτο έλεγχο της εγγραφής ή της ανάγνωσης των δεδομένων). Στις παρακάτω συναρτήσεις δεν απαιτείται άνοιγμα και κλείσιμο του αρχείου (γίνεται αυτόματα στο εσωτερικό τους). Βλ. και save (αναφέρεται μόνο η περίπτωση αποθήκευσης δεδομένων σε αρχεία κειμένου) save('αρχείο', 'μεταβλητή', '-ascii') save('αρχείο', 'μεταβλητή', '-ascii', '-app') Εγγραφή απλών μεταβλητών και πινάκων σε μαγνητικό μέσο: Η 'μεταβλητή' γράφεται στο 'αρχείο'. Αν και δεν είναι υποχρεωτικό, συστήνεται να χρησιμοποιείται η επέκταση '.txt' στα αρχεία κειμένου που δημιουργεί ο χρήστης στα Windows, για να γίνεται εύκολα ο έλεγχός τους με τη βοήθεια π.χ. του Notepad. Η παράμετρος '-ascii' καθορίζει ότι η εγγραφή θα γίνει σε μορφή κειμένου. Η εγγραφή γίνεται αποκλειστικά σε αριθμητική μορφή (οι μη αριθμητικοί χαρακτήρες αντικαθίστανται από τον αντίστοιχο κωδικό ASCII ή Unicode). Προσοχή: Σε περίπτωση που ήδη υπάρχει το αρχείο, τότε αυτό διαγράφεται και επαναδημιουργείται με εγγραφή μόνο των νέων μεταβλητών, εκτός αν υπάρχει η παράμετρος '-app', οπότε νέα δεδομένα εγγράφονται μετά το τέλος των προηγούμενων. save('αρχείο', '-struct', 'δομή', '-ascii') save('αρχείο', '-struct', 'δομή', 'πεδίο1', 'πεδίο2',..., '-ascii') Εγγραφή απλών δομών (δηλαδή όχι δομών-πινάκων) σε μαγνητικό μέσο: Η 'δομή' γράφεται στο 'αρχείο'. Με το δεύτερο τρόπο σύνταξης εγγράφονται μόνο τα συγκεκριμένα πεδία 'πεδίο1', 'πεδίο2' κλπ. Παράδειγμα % Εγγραφή της μεταβλητής DataX σε αρχείο κειμένου. save('mydata.txt', 'DataX', '-ascii'); % Δήλωση του ονόματος και της διαδρομής του αρχείου με συμβολοσειρά. name_and_path = 'c:\matlab7\work\mydata.txt'; save(name_and_path, 'DataX', '-ascii'); % Εγγραφή δομής-πίνακα, μετά το τέλος των προηγουμένων δεδομένων. save('patientsdata.txt', '-struct', 'patients', '-ascii', '-app'); % Εγγραφή των συγκεκριμένων πεδίων name και BMI μιας δομής-πίνακα. save('patientsdata.txt', '-struct', 'patients', 'name', 'BMI', '-ascii'); load (αναφέρεται μόνο η περίπτωση ανάγνωσης αρχείων κειμένου) <πίνακας> = load('αρχείο') Ανάγνωση αριθμητικών μεταβλητών από αρχείο κειμένου. Τα περιεχόμενα του αρχείου αποθηκεύονται στον πίνακα. Το αρχείο πρέπει να περιέχει μόνο αριθμητικά δεδομένα σε μορφή πίνακα, δηλαδή σε γραμμές με ίδιο πλήθος στοιχείων η κάθε μια, που χωρίζονται με κενό (space), στηλοθέτη (tab), κόμμα (,) ή ελληνικό ερωτηματικό (;). Παράδειγμα Έστω ότι το αρχείο mydata.txt περιέχει τα εξής αριθμητικά δεδομένα: Τότε η συνάρτηση load φορτώνει τα δεδομένα και τα αποθηκεύει σε έναν πίνακα: A = load('mydata.txt');

111 Αρχεία 111 Συναρτήσεις ελέγχου του πλήρους ονόματος ενός αρχείου (διαδρομή-όνομα-επέκταση): fileparts [διαδρομή, κυρίωςόνομα, επέκταση] = fileparts(πλήρες_όνομα_αρχείου) Διαχωρισμός του πλήρους ονόματος ενός αρχείου στα επιμέρους στοιχεία του: Η διαδρομή, το κυρίως όνομα και η επέκταση του αρχείου αποθηεύονται στις αντίστοιχες μεταβλητές με μορφή συμβολοσειράς (string). fullfile πλήρες_όνομα_αρχείου = fullfile(φάκελος1, φάκελος2,, όνομααρχείου) Δημιουργία του πλήρους ονόματος ενός αρχείου με διασύνδεση της διαδρομής από επιμέρους φακέλους και του ονόματος του αρχείου. Το πλήρες_όνομα_αρχείου αποθηκεύεται με μορφή συμβολοσειράς (string). Παράδειγμα [pathstring, name, ext] = fileparts('c:\my Documents\Examples\mydata.txt'); newname = fullfile(pathstring, 'today', [name '.dat']) Αποτέλεσμα newname = C:\My Documents\Examples\today\mydata.dat Συνάρτηση λήψης ονομάτων αρχείου μέσω παραθύρου διαλόγου: uigetfile Π.χ. για λήψη των ονομάτων (File) και της διαδρομής (Path) πολλών αρχείων: [Files, Path] = uigetfile({'*.txt;','text files (*.txt)';'*.*','all files (*.*)'},'Select files','multiselect','on'); 13.8 Ιδιαίτερες συναρτήσεις του MATLAB για χειρισμό φακέλων Απεικόνιση καταλόγου με τα ονόματα των αρχείων ενός φακέλου dir Απεικόνιση των αρχείων του current directory/folder dir('directory_name') Απεικόνιση των αρχείων του φακέλου με όνομα directory_name files = dir('directory_name') Αποθήκευση σε έναν πίνακα δομών των ιδιοτήτων των αρχείων (όνομα, μέγεθος, ημερομηνία, αν το αρχείο είναι φάκελος ή όχι) του φακέλου με όνομα directory_name. Σημείωση: Η συνάρτηση dir ΔΕΝ είναι η εντολή dir της γραμμής εντολών. Για κλήση των εντολών του λειτουργικού συστήματος χρησιμοποιούμε το πρόθεμα «!», π.χ.!dir Απεικόνιση ή αλλαγή του current directory/folder cd Απεικόνιση του current directory/folder. w = cd Αποθήκευση του current directory/folder στη συμβολοειρά w. cd('new_current_directory') Αλλαγή του current directory στο new_current_directory. 'Αλλες χρήσιμες συναρτήσεις χειρισμού φακέλων matlabroot Συνάρτηση που επιστρέφει το όνομα του φακέλου εγκατάστασης του Matlab. winopen Συνάρτηση η οποία ανοίγει έναν φάκελο σε περιβάλλον Windows. Παραδείγματα: winopen(matlabroot) Ανοίγει ο φάκελος εγκατάστασης του Matlab. winopen(cd) Ανοίγει ο φάκελος του current directory/folder.

112 112 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Ερωτήσεις 13.1 Ποια η διαφορά μεταξύ αρχείων κειμένου και δυαδικών αρχείων; Να αναφερθεί η χρησιμότητα κάθε μιας από τις παραμέτρους w, a, r, t και b στη συνάρτηση fopen. Ποιες από αυτές τις παραμέτρους χρησιμοποιούνται σε συνδυασμό; 13.3 Ποια η διαφορά των παραμέτρων w και a της συνάρτησης fopen; 13.4 Να σημειωθούν με [Σ] οι σωστές και με [Λ] οι λανθασμένες απαντήσεις: [ ] Η εντολή (συνάρτηση) fprintf χρησιμεύει για την απεικόνιση στην οθόνη (στο Command Window) καθώς και για εγγραφή σε αρχείο. [ ] Μεταβλητές τύπου χαρακτήρα μπορούν να γραφτούν μόνο σε αρχεία κειμένου και όχι σε δυαδικά αρχεία. [ ] Μεταβλητές τύπου κινητής υποδιαστολής χαρακτήρα μπορούν να εγγραφούν τόσο σε σε αρχεία κειμένου όσο και σε δυαδικά αρχεία Να περιγραφεί η διαφορά των δύο επόμενων εντολών ανοίγματος αρχείου: Εντολή 1: fid = fopen('data.txt', 'wt'); και Εντολή 2: fid = fopen('data.txt', 'at'); Ασκήσεις 13.6 Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να δημιουργείται ένα αρχείο κειμένου με όνομα "numbers.txt" όπου να γράφονται, σε μία γραμμή, οι ακέραιοι αριθμοί από 1 έως 100, χωρισμένοι ο ένας από τον άλλον με κενό (space) Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να «ανοίγει» για ανάγνωση το αρχείο κειμένου που δημιουργήθηκε στην άσκηση 13.6 (letters.txt) και να διαβάζονται οι πρώτοι 10 ακέραιοι, οι οποίοι και να αποθηκεύονται στις 10 θέσεις ενός πίνακα Να γραφτεί κατάλληλο πρόγραμμα με το οποίο α) αρχικά να «ανοίγει» για ανάγνωση το αρχείο κειμένου που δημιουργήθηκε στην άσκηση 13.6 (letters.txt), β) στη συνέχεια να διαβάζεται ο 50ός χαρακτήρας του αρχείου (να χρησιμοποιηθεί η fseek) ο οποίος και να τυπώνεται με disp στο Command Window Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να αποθηκεύεται στο σκληρό δίσκο ένα αρχείο κειμένου (temperatures.txt) μια λίστα θερμοκρασιών από 0 έως 100 ανά 5 βαθμών Κελσίου, με τις αντίστοιχες τιμές σε Φαρενάιτ, ως εξής: Η σχέση των θερμοκρασιών σε βαθμούς Κελσίου και Φαρενάιτ είναι: T 9 T 32, όπου T C η θερμοκρασία σε βαθμούς Κελσίου και T F σε Φαρενάιτ. F 5 C Για την εγγραφή να χρησιμοποιηθεί η συνάρτηση fprintf. Οι θερμοκρασίες σε Κελσίου (πρώτη στήλη) πρέπει να χωρίζονται από τις θερμοκρασίες σε Φαρενάιτ (δεύτερη στήλη) με στηλοθέτη (tab, \t στην fprintf) Να γραφτεί κατάλληλη συνάρτηση με όρισμα εισόδου μια τιμή θερμοκρασίας σε βαθμούς Κελσίου και έξοδο την αντίστοιχη τιμή θερμοκρασίας σε Φαρενάιτ. Η τιμή Φαρενάιτ πρέπει να βρίσκεται με τη βοήθεια του αρχείου αντιστοίχησης βαθμών θερμοκρασίας που δημιουργήθηκε στην άσκηση Συγκεκριμένα, θα διαβάζονται με τη σειρά οι τιμές της πρώτης στήλης, και όταν βρεθεί η τιμή Κελσίου που είναι ίση με την είσοδο της συνάρτησης, θα διαβάζεται και θα επιστρέφεται ως έξοδος η τιμή της

113 Αρχεία 113 δεύτερης στήλης. Σε περίπτωση μη εύρεσης της θερμοκρασίας Κελσίου μέχρι το τέλος του αρχείου (π.χ. αν δοθεί τιμή Κελσίου που δεν είναι πολλαπλάσιο του 5, ή αν δοθεί τιμή άνω των 100 βαθμών Κελσίου) πρέπει να εμφανίζεται κατάλληλλο μήνυμα σφάλματος Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να αποθηκεύεται στο σκληρό δίσκο ένα αρχείο κειμένου (letters.txt) που να περιέχει, σε μία γραμμή, όλα τα πεζά γράμματα του λατινικού αλφαβήτου (a, b,, z). Υπόδειξη: Να χρησιμοποιηθεί fprintf μέσα σε επαναληπτικο βρόχο for, σε συνδυασμό με το γεγονός ότι τα πεζά γράμματα του λατινικού αλφαβήτου βρίσκονται στις θέσεις από 97 έως 122 του πίνακα ASCII (βλ. και τη σημείωση 2 της συνάρτησης sprintf, 10.2) Να γραφτεί κατάλληλο πρόγραμμα με το οποίο να διαβάζεται το αρχείο κειμένου που δημιουργήθηκε στην άσκηση (letters.txt). Συγκεκριμένα, πρέπει να διαβάζονται ένας-ένας οι χαρακτήρες του αρχείου και μετά να τυπώνονται ο ένας κάτω από τον άλλον στο Command Window Να γραφτεί κατάλληλη συνάρτηση με όρισμα εισόδου έναν αριθμό n από 1 έως 26 και όρισμα εξόδου το n-οστό χαρακτήρα από το αρχείο letters.txt που δημιουργήθηκε στην άσκηση Να χρησιμοποιηθεί η συνάρτηση fseek.

114 14 Γραφικά Στην ενότητα αυτή περιγράφονται οι βασικές συναρτήσεις που υποστηρίζουν τις γραφικές δυνατότητες του MATLAB, δηλαδή τη διαχείριση (α) γραφικών παραστάσεων & (β) εικόνων. Τα γραφικά του MATLAB εμφανίζονται σε ιδιαίτερα παράθυρα που λέγονται figures Γραφικές παραστάσεις Η δημιουργία γραφικών παραστάσεων σε 2 ή 3 άξονες είναι πολύ εύκολη στο MATLAB, λόγω των ενσωματωμένων συναρτήσεων. Καμπύλη σε 2 διαστάσεις της μορφής y=f(x) plot plot(x,y) Γραφική παράσταση των τιμών των μονοδιάστατων πινάκων x και y. Π.χ.: x = [0:0.1:2*pi]; y = sin(x); plot(x,y); plot(x,y,'προδιαγραφές_γραμμής') Οι 'προδιαγραφές_γραμμής' (line specifications) είναι σύμβολα που προδιαγράφουν το είδος και το χρώμα της γραμμής και των σημείων που σχεδιάζονται. Είδος γραμμής: / -- / : /. (συνεχής / διακεκομμένη / με τελίτσες / διακεκομμένη με τελίτσες, αντίστοιχα). Αν λείπει το είδος της γραμμής σχεδιάζονται μόνο σημεία. Είδος σημείου: + / ο / * /. / x / s / d / p / h / ^ / v / > / < (σταυρός / κύκλος / αστερίσκος / τελεία / χί / τετράγωνο / ρόμβος / πεντάγωνο / εξάγωνο / τρίγωνα, αντίστοιχα). Χρώμα γραμμής και σημείων: r / g / b / c / m / y / k / w (κόκκινο /πράσινο / μπλε / κυανό / ματζέντα / κίτρινο / μαύρο / άσπρο, αντίστοιχα). Π.χ.: plot(x,y,'bo-'); % μπλε κύκλοι που ενώνονται με συνεχή γραμμή plot(x,y,'bo'); % μπλε κύκλοι που δεν ενώνονται (χωρίς γραμμή) plot(x, y, 'property1', value1, 'property2', value2,...) Για περισσότερο έλεγχο στις γραμμές και στα σημεία (π.χ. διαφορετικό χρώμα της γραμμής από το σημείο) χρησιμοποιούνται οι ιδιότητες (properties). Οι ιδιότητες με τις τιμές τους (property_value) είναι: 'Marker': Είδος σημείου ('+', 'ο', '*', '.', 'x', 's', 'd', 'p', 'h', '^', 'v', '>', '<', 'none'). 'MarkerEdgeColor': Χρώμα περιγράμματος σημείου. 'MarkerFaceColor': Χρώμα εσωτερικού του σημείου. 'MarkerSize': Μέγεθος σημείου (σε points=1/72 της ίντσας). 'LineStyle': Είδος γραμμής ('-', '--', ':', '-.', 'none') 'Color': Χρώμα γραμμής. 'LineWidth': Πάχος γραμμής (σε points=1/72 της ίντσας). Οι τιμές των χρωμάτων των σημείων και των γραμμών μπορεί να είναι: 'r', 'g', 'b', 'c', 'm', 'y', 'k', 'none' (εκτός της ιδιότητας 'Color' που δεν δέχεται 'none') ή [R G B], δηλαδή μια τριάδα τιμών με το ποσοστό κάθε χρώματος RGB (red, green, blue). Για παράδειγμα: άσπρο=[1 1 1], μαύρο=[0 0 0], γκρι=[ ], κόκκινο=[1 0 0], πράσινο: [0 1 0], μπλέ=[0 0 1], πορτοκαλί=[ ] κλπ). Π.χ.: plot(x,y,'marker','s','markeredgecolor','r','markersize',3,'color','b');

115 Γραφικά 115 Αντί της plot μπορούν να χρησιμοποιηθούν με όμοιο τρόπο οι συναρτήσεις semilogx, semilogy και loglog για ημιλογαριθμικούς ή λογαριθμικούς άξονες. Παράδειγμα 1: % Στοιχειώδης plot: % Σημείο προς σημείο for x=-10:0.1:10 y = x^2; plot(x,y); hold on Παράδειγμα 2: % Διακρότημα (άθροισμα ταλαντώσεων με πολύ μικρή διαφορά συχνότητας) f1 = 10; f2 = 11; t = [0:0.001:4*pi]; y = 10*sin(f1*t) + 10*sin(f2*t); plot(t,y,'r'); Παράδειγμα 3: % Σύνθεση ταλαντώσεων ίδιας συχνότητας, με διαφορά φάσης π/6 x = [0:0.001:4*pi]; y1 = 5*sin(x+pi/6); y2 = 7*sin(x); y = y1 + y2; plot(x,y1,'b--'); hold on; plot(x,y2,'k:','linewidth',2); plot(x,y,'r'); axis([0 4*pi ]); leg('y_1','y_2','y'); grid on;

116 116 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Επιφάνεια σε 3 διαστάσεις της μορφής z=f(x,y) Συνοπτικά, η απεικόνιση μιας επιφάνειας που ορίζεται αναλυτικά με εξίσωση της μορφής z = f(x,y) γίνεται σε 3 στάδια: - Αρχικά δημιουργείται ένα «πλέγμα» με τα ζεύγη των τιμών x και y, που γίνεται με τη συνάρτηση meshgrid. - Στη συνέχεια, βρίσκονται οι τιμές της μεταβλητής z για κάθε ζεύγος (x,y) του «πλέγματος», με τη βοήθεια της εξίσωσης z = f(x,y). - Τέλος, γίνεται τρισδιάστατη απεικόνιση των τριάδων (x, y, z) με μία από τις συναρτήσεις surf ή mesh. meshgrid [X,Y] = meshgrid(x,y) Δημιουργία «πλέγματος» με όλα τα ζεύγη των τιμών (x,y): Δημιουργούνται οι δισδιάστατοι πινάκες X και Υ, που τα αντίστοιχα στοιχεία τους περιέχουν όλα τα ζεύγη των τιμών των μονοδιάστατων πινάκων x και y, με σκοπό την τρισδιάστατη απεικόνιση της επιφάνειας z=f(x,y) μέσω της κατάλληλα διαμορφωμένης εξίσωσης Z=f(X,Y). Παράδειγμα Αποτέλεσμα x = [1 2 3] y = [40 50] [X,Y] = meshgrid(x,y) X = Y = surf surf(x,y,z) Δημιουργία της επιφάνειας που ορίζεται από τις τριάδες που βρίσκονται στα αντίστοιχα στοιχεία των δισδιάστατων πινάκων X, Υ και Z. Για δημιουργία «διαφάνειας» ώστε να εμφανίζονται τα τμήματα της επιφάνειας που βρίσκονται «πίσω» από κάποια άλλα, χρησιμοποιείται η εντολή aplha. Παράδειγμα Αποτέλεσμα x = [-2:0.2:2]; y = [-2:0.2:2]; [X,Y] = meshgrid(x,y); Z = X.* exp(-x.^2 - Y.^2); surf(x,y,z); alpha(0.6);

117 Γραφικά 117 mesh mesh(x,y,z) Δημιουργία της επιφάνειας με μορφή «δικτυωτού πλαισίου» (wireframe) που ορίζεται από τις τριάδες που βρίσκονται στα αντίστοιχα στοιχεία των δισδιάστατων πινάκων X, Υ και Z. Για να αποκρύπτεται ή όχι το τμήμα της επιφάνειας που βρίσκονται «πίσω» από κάποια άλλα, χρησιμοποιείται η εντολή hidden. Παράδειγμα Αποτέλεσμα x = [-2:0.2:2]; y = [-2:0.2:2]; [X,Y] = meshgrid(x,y); Z = X.* exp(-x.^2 - Y.^2); mesh(x,y,z); hidden off Οι δύο παρακάτω συναρτήσεις χρησιμοποιούνται για εμφάνιση ή απόκρυψη τμημάτων που βρίσκονται πίσω από άλλα τμήματα της επιφάνειας σε μια τρισδιάστατη απεικόνιση: hidden hidden on / off Απόκρυψη / Εμφάνιση του τμήματος της επιφάνειας που βρίσκεται «πίσω» από άλλα τμήματα, σε επιφάνειες που έχουν δημιουργηθεί με τη συνάρτηση mesh. alpha alpha(ποσοστό) Δημιουργία «διαφάνειας», ώστε να εμφανίζονται τα τμήματα της επιφάνειας που βρίσκονται πίσω από κάποια άλλα σε επιφάνειες που έχουν δημιουργηθεί με mesh ή surf. Το ποσοστό μπορεί να είναι από 0 έως 1 (όσο μικρότερο τόσο μεγαλύτερη η διαφάνεια).

118 118 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Επιφάνεια σε 3 διαστάσεις από δεδομένα συντεταγμένων (x,y,z): Τριγωνοποίηση Αν οι συντεταγμένες των προς απεικόνιση σημείων μιας επιφάνειας βρίσκονται σε μορφή πίνακα (π.χ. πίνακας N 3, για N σημεία με τις συντεταγμένες x,y,z, σε 3 στήλες), τότε μπορεί να γίνει απεικόνιση είτε (α) μόνο των σημείων, είτε (β) μιας επιφάνειας που μπορεί να δημιουργηθεί από τα σημεία αυτά. α) Απεικόνιση των σημείων: Τα σημεία μπορούν να απεικονιστούν με απλό τρόπο με τη συνάρτηση plot3 (βλ. και σελ. 121), π.χ.: plot3(x,y,z,'.'); όπου x,y,z μονοδιάστατοι πίνακες με τις συντεταγμένες των σημείων. Παράδειγμα Αποτέλεσμα % Φόρτωμα έτοιμων δεδομένων επιφάνειας του MATLAB (φορτώνονται οι συντεταγμένες τους x,y,z): load seamount % Απεικόνιση των σημείων μέσω των συντεταγμένων τους με την plot3: plot3(x,y,z,'.'); β) Απεικόνιση της επιφάνειας: Η επιφάνεια μπορεί να δημιουργηθεί με χρήση μεθόδων παρεμβολής (interpolation) ή τριγωνοποίησης (triangulation) και στη συνέχεια να απεικονιστεί. Οι μέθοδος τριγωνοποίησης Delaunay συνίσταται στην εύρεση των μικρότερων δυνατων τριγώνων με κορυφές τα σημεία της επιφάνειας (είναι αυτά στα οποία οι περιγεγραμμένοι κύκλοι τους δεν περιλαμβάνουν άλλα σημεία στο εσωτερικό τους): - Αρχικά δημιουργούνται οι δείκτες των συντεταγμένων των τριγώνων με τη συνάρτηση delaunay. - Στη συνέχεια, γίνεται η απεικόνιση της επιφάνειας με τη βοήθεια της συνάρτησης trisurf (η οποία επιπλέον χρωματίζει την επιφάνεια ανάλογα με τις τιμές της συντεταγμένης z, σύμφωνα με μια χρωματική κλίμακα). Παράδειγμα Αποτέλεσμα % Φόρτωμα έτοιμων δεδομένων επιφάνειας του MATLAB (φορτώνονται οι συντεταγμένες τους x,y,z): load seamount % Δημιουργία τριγώνων με τη μέθοδο Delaunay: tri = delaunay(x,y); % Απεικόνιση επιφάνειας trisurf(tri,x,y,z);

119 Γραφικά 119 Καμπύλη σε 2 διαστάσεις της μορφής f(x,y)=0 Σε περίπτωση που δεν είναι δυνατή η αναλυτική λύση της f(x,y) = 0 ως προς y, δεν είναι δυνατή η απεικόνιση της γραφικής παράστασης x-y με τη συνάρτηση plot. Στην περίπτωση αυτή η απεικόνιση γίνεται με έμμεσο τρόπο με ένα κατάλληλο «τρυκ», χρησιμοποιώντας τη συνάρτηση contour που δίνει την τομή μιας επιφάνειας z = f(x,y) με ένα επίπεδο: contour contour(x,y,z,[z 0 z 0 ]) Γραφική παράσταση των σημείων (x,y) που επαληθεύουν την εξίσωση f(x,y) = z 0 (ή αλλιώς, των σημείων της τομής της επιφάνειας z = f(x,y) με ένα σε επίπεδο παράλληλο προς το επίπεδο x-y που τέμνει τον άξονα z σε ένα σημείο z 0 ). Αν επιλεγεί z 0 = 0, τότε προκύπτει η γραφική παράσταση της καμπύλης f(x,y) = 0. contour(x,y,z,[z 0 z 0 ],'προδιαγραφές_γραμμής') Προδιαγραφές γραμμής και σημείων: όπως στην plot. contour(x,y,z,[z 0 z 0 ],'property1',property_value1,...) Ιδιότητες γραμμής και σημείων: όπως στην plot. Παράδειγμα: Έστω ότι θέλουμε να απεικονίσουμε την εξίσωση sin(x) e -x 0.1 cos(y) = 0: [X,Y] = meshgrid([0:0.1:10], [0:0.1:10]); % Δημιουργία του «πλέγματος» (x,y) Z = sin(x).*exp(-x)-0.1*cos(y); %Υπολογισμός των τιμών Ζ για κάθε ζεύγος (x,y) figure(1); contour(x,y,z,[0 0],'b'); %Απεικόνιση της προβολής του Ζ στο Ζ 0 =0 figure(2); surfc(x,y,z); alpha(0.5); %Απεικόνιση και της επιφάνειας Z=f(X,Y), % με χρήση της συνάρτησης surfc, που % απεικονίζει και τομές της επιφάνειας % με το επίπεδο x-y Figure 1 Απεικόνιση της f(x,y) = 0: sin(x) e -x 0.1 cos(y) = 0 Figure 1 (μετά από κατάλληλη περιστροφή σε 3 διαστάσεις, για να φανεί το επίπεδο τομής με το γράφημα του Figure 2) Figure 2 Απεικόνιση της z = f(x,y): z = sin(x) e -x 0.1 cos(y) μαζί με μερικές προβολές της

120 120 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Επιφάνεια σε 3 διαστάσεις της μορφής f(x,y,z)=0 Σε περίπτωση που δεν είναι δυνατή η αναλυτική λύση της f(x,y,z) = 0 ως προς z, δεν είναι δυνατή η απεικόνιση της γραφικής παράστασης x-y-z με τις συναρτήσεις surf ή mesh. Στην περίπτωση αυτή η απεικόνιση γίνεται με ένα «τρυκ» παρόμοιο με αυτό της contour, χρησιμοποιώντας τη συνάρτηση isosurface, η οποία δίνει την τομή μιας 4-διάστατης ιδεατής «υπερεπιφάνειας» v = f(x,y,z) με το χώρο των 3 διαστάσεων: isosurface isosurface(x,y,z,v,v 0 ) Γραφική παράσταση των σημείων (x,y,z) που επαληθεύουν την εξίσωση f(x,y,z) = v 0. Αν επιλεγεί v 0 = 0, τότε προκύπτει η γραφική παράσταση της επιφάνειας f(x,y,z) = 0. Η isosurface είναι η τρισδιάστατη «εκδοχή» της contour. Η εφαρμογή ιδιοτήτων όπως χρώμα επιφάνειας κλπ γίνεται με τη συνάρτηση patch ως εξής: p = patch(isosurface(x,y,z,v,v 0 )) set(p, 'property1', value2, 'property2', value2,...); Παράδειγμα: Έστω ότι θέλουμε να απεικονίσουμε την εξίσωση (x y z + x y ) e -z = 0: [X,Y,Z] = meshgrid([0:0.1:10], [0:0.1:10], [0:0.1:10]); V = (X - Y.*Z.^2 + X.^Y).*exp(-Z); p = patch(isosurface(x,y,z,v,0)); set(p,'facecolor','r','edgecolor','none'); % πρόσθεση χρώματος επιφάνειας camlight left; lighting phong; % πρόσθεση φωτισμού grid on; alpha(0.8); % πρόσθεση πλέγματος και διαφάνειας

121 Γραφικά 121 Καμπύλη σε 3 διαστάσεις της μορφής x=f(t), y=g(t), z=h(t) Στη συνέχεια επεξηγείται πώς μπορούμε να απεικονίσουμε γραφικά μια παραμετρική εξίσωση καμπύλης σε 3 διαστάσεις: plot3 plot3(x,y,z) Τρισδιάστατη γραφική παράσταση των τιμών των μονοδιάστατων πινάκων x, y, z. Χρησιμοποιείται συνήθως σε παραμετρικές εξισώσεις, όπου t η παράμετρος, δηλαδή: x = f(t), y = g(t), z = h(t) plot3(x,y,z,'προδιαγραφές_γραμμής') Προδιαγραφές γραμμής και σημείων: όπως στην plot. plot3(x,y,z,'property1',property_value1,'property2',property_value2,...) Ιδιότητες γραμμής και σημείων: όπως στην plot. Παράδειγμα t = [0:0.1:80*pi]; x = exp(-t/10).*sin(2*t); y = exp(-t/10).*cos(2*t); z = exp(-t/10); plot3(x,y,z); grid on

122 122 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB 14.2 Συναρτήσεις παραμετροποίησης γραφημάτων Ακολουθούν βασικές συναρτήσεις μορφοποίησης και παραμετροποίησης των γραφημάτων του MATLAB, που εφαρμόζονται σε figures είτε με γραφικές παραστάσεις είτε με εικόνες: Γενικές συναρτήσεις γραφικών figure Δημιουργία ενός νέου παραθύρου γραφικών (figure). figure(n) Δημιουργία ενός νέου figure με αύξοντα αριθμό n (ή ενεργοποίησή του, αν υπάρχει ήδη). Αλλαγή των προεπιλεγμένων ιδιοτήτων ενός figure: h = figure(n); % figure window handle variable set(h,'position',[x y w h],... % x,y=position, w,h=width,height 'NumberTitle','off',... % Figure numbering: 'on'/'off' 'Name',string,... % Figure name (as a string variable) 'Menubar','none',... % Menu: 'none'/'figure' 'ToolBar','auto',... % Toolbar: 'none'/'auto'/'figure' 'Color',[r g b],... % Figure color (numbers between 0 and 1) 'Resize','on',... % Figure resize: 'on'/'off' 'Visible','on',... % Figure visibility: 'on'/'off' 'WindowStyle','normal'); % Window type: 'normal'/'modal'/'docked' close Κλείσιμο του τρέχοντος figure. close(n) Κλείσιμο του figure με αύξοντα αριθμό n. close all Κλείσιμο όλων των figures. clf Σβήσιμο του γραφήματος από το τρέχον figure (χωρίς κλείσιμο του figure). drawnow Άμεση απεικόνιση ενός γραφήματος σε ένα figure: Για να μην υπάρχουν καθυστερήσεις λόγω απεικόνισης γραφικών, το MATLAB δίνει προτεραιότητα στην εκτέλεση των άλλων εντολών, αναβάλλοντας την απεικόνιση. Έτσι, αν πρέπει να προκληθεί άμεσα απεικόνιση, χρησιμοποιείται η drawnow (με επιβάρυνση στο χρόνο εκτέλεσης του προγράμματος). hold hold on Απεικόνιση νέου γραφήματος στο ίδιο figure, χωρίς σβήσιμο του προηγούμενου γραφήματος (εφαρμόζεται σε κάθε figure χωριστά). hold off Απεικόνιση νέου γραφήματος στο ίδιο figure, με σβήσιμο του προηγούμενου γραφήματος. scrsize = get(0,'screensize');% Screen size [1 1 width height] figsize = get(1,'position'); % Figure size [xpos ypos width height] Λήψη της θέσης και των διαστάσεων της οθόνης (0) ή του figure(1) σε pixels. Π.χ.: scr = get(0,'screensize'); fig = get(1,'position'); h = figure(gcf); set(h,'position',scr); % get fig. handle & set full screen set(gcf,'position',[1 scr(4)/2 scr(3)/2 scr(4)/2]); % set quarter screen % Centered window and resized with ratio "r": r = 0.5; set(gcf,'position',[scr(3)*(1-r)/2 scr(4)*(1-r)/2 scr(3)*r scr(4)*r]); % Centered window and resized to the image matrix I dimensions:ι = imread(filename); set(gcf,'position',[(scr(3)-size(i,2))/2 (scr(4)-size(i,1))/2 size(i,2) size(i,1)]); set(h,'windowstyle','docked'); % Dock the figure window

123 Γραφικά 123 Άξονες axis Ακολουθούν βασικές συναρτήσεις χειρισμού αξόνων: axis on/off Ενεργοποίηση ή Απενεργοποίηση των αξόνων. axis ij/xy Αρχή των αξόνων: ij = πάνω αριστερά (π.χ. για εικόνες), xy = κάτω αριστερά (π.χ. για γραφικές παραστάσεις). axis equal/square/image axis equal = Ίσες μονάδες αξόνων, axis square = Ίσα μήκη αξόνων, axis image = Ίσα μήκη αξόνων με εφαρμοστό στα δεδομένα περίγραμμα. axis([xmin xmax ymin max]) ή axis([xmin xmax ymin ymax zmin zmax]) Χειροκίνητα όρια αξόνων v = axis Αποθήκευση των ορίων των αξόνων στο διάνυσμα v, το οποίο μπορεί να χρησιμοποιηθεί στη συνέχεια για χειροκίνητα όρια αξόνων ως axis([v(1) v(2) v(3) v(4)]) ή ως axis([v(1) v(2) v(3) v(4) v(5) v(6)]). axis manual/auto manual = «Πάγωμα» των ορίων των αξόνων, ώστε σε επόμενη απεικόνιση στο ίδιο figure με hold on να μείνουν τα όρια σταθερά, auto = Επαναφορά στην αυτόματη ρύθμιση. grid grid on/off Ενεργοποίηση / Απενεργοποίηση του πλέγματος. Αλλαγή ενδεικτικών σημείων στους άξονες και των ετικετών τους: set(gca,'xtick',τιμές) ή set(gca,'υtick',τιμές) Αλλαγή των ενδεικτικών σημείων τιμών στους άξονες: Οι τιμές είναι πίνακες που περιέχουν τις τιμές του αντίστοιχου άξονα στις οποίες θα υπάρχουν ενδεικτικά σημεία. set(gca,'xticklabel',{ετικέτες},'yticklabel',{ετικέτες}) Αλλαγή των ετικετών των ενδεικτικών σημείων τιμών στους άξονες: Οι {ετικέτες} είναι cell arrays που περιέχουν τις ετικέτες των ενδεικτικών σημείων τιμές του αντίστοιχου άξονα. x = [0:0.1:3*pi]; y = sin(x); plot(x,y); grid on set(gca,'xtick',[0 pi/2 pi 3*pi/2 2*pi]) set(gca,'xticklabel',{'0', 'pi/2', 'pi', '3pi/2', '2pi'})

124 124 Ι. Καλατζής - Αλγοριθμικός προγραμματισμός σε περιβάλλον MATLAB Επισημείωση γραφημάτων Ακολουθούν οι βασικότερες συναρτήσεις με τις οποίες μπορούμε να προσθέσουμε κείμενο σε διάφορες περιοχές ενός γραφήματος: title title('κείμενο') Τίτλος του γραφήματος. xlabel / ylabel / zlabel xlabel('κείμενο') ή ylabel('κείμενο') ή zlabel('κείμενο') Ετικέτες αξόνων. leg leg('string1', 'string2', 'string3',...) Υπόμνημα γραφήματος: Το πλήθος των συμβολοσειρών ('string1/2/3/...') πρέπει να ταυτίζεται με το πλήθος των γραφημάτων που έχουν γίνει στο ίδιο figure (με hold on). text text(x,y,'κείμενο') ή text(x,y,z,'κείμενο') Απεικόνιση 'κειμένου' στις συντεταγμένες x,y (ή και z) του γραφήματος. text(x,y,'κείμενο') ή text(x,y,z,'κείμενο','ιδιότητες',τιμές, ) Απεικόνιση 'κειμένου' με συγκεκριμένες ιδιότητε&sig