Η δοµή «Shift register» 1. Η δοµή «Shift register» εισάγεται στο βρόγχο for-loop αλλά και σε άλλους βρόγχους που θα δούµε στη συνέχεια, όπως ο βρόγχος «While loop». Ο τρόπος εισαγωγής και λειτουργίας της παραµένει ο ίδιος σε όλους τους βρόγχους. Στη συνέχεια θα παρουσιαστεί για το βρόγχο for-loop. 2. Η δοµή shift register εισάγεται σε ένα βρόγχο for-loop µε δεξί κλικ πάνω στο αριστερό ή στο δεξί κατακόρυφο περίγραµµα του βρόγχου και επιλογή της εντολής «Add Shift Register» από το αναδυόµενο µενού (σχήµα 3.1). Με την εκτέλεση της εντολής θα εµφανιστούν στα δύο κατακακόρυφα περιγράµµατα του βρόγχου for-loop δύο τετράγωνα µε δύο βελάκια µε φορά προς τα κάτω το αριστερό και προς τα πάνω το δεξί. Αρχικά και τα δύο βελάκια έχουν µαύρο χρώµα (σχήµα 3.1). Σχήµα 3.1: Εισαγωγή shift register σε βρόγχο for-loop. 3. Η εργασία που κάνει η δοµή shift register είναι το ότι µεταφέρει το δεδοµένο το οποίο καλωδιώνουµε στο δεξί βελάκι στο τέλος µιας επανάληψης του βρόγχου for-loop, στο αριστερό βελάκι στην αρχή της επόµενης επανάληψης του βρόγχου for-loop. Έτσι σε κάθε επανάληψη του βρόγχου µπορεί να
εκτελείται η ίδια διαδικασία µε δεδοµένο εισαγωγής όµως που ενηµερώνεται και ανανεώνεται σε κάθε επανάληψη του βρόγχου. 4. Είναι προφανές ότι θα δύο βελάκια της shift register θα πρέπει να είναι καλωδιωµένα µε τον ίδιο τύπο δεδοµένων, δηλαδή απλοί πραγµατικοί ή ακέραιοι αριθµοί, µονοδιάστατα ή διδιάστατα arrays κλπ. Το χρώµα που τελικά θα πάρουν τα βελάκια της shift register θα καθοριστεί από τον τύπο των δεδοµένων που θα καλωδιώσουµε σε αυτά (π.χ. µπλε για ακέραιους αριθµούς ή arrays, πορτοκαλί για πραγµατικούς αριθµούς ή arrays). 5. Μία δοµή shift register πρέπει να αρχικοποιηθεί, δηλαδή να δώσουµε µία αρχική τιµή στο αριστερό βελάκι, η οποία θα αποτελέσει την είσοδο της συνάρτησης για την πρώτη επανάληψη που θα εκτελέσει. Τούτο γίνεται απλά ορίζοντας την αρχική αυτή τιµή σε µία αριθµητική σταθερά ή σταθερά array και καλωδιώνοντας το αριστερό βελάκι έξω από το βρόγχο for-loop. 6. Για παράδειγµα, στο σχήµα 3.2 η δοµή shift register έχει αρχικοποιηθεί µε την ακέραια σταθερά 0. Τούτο αυτοµάτως καθορίζει τον τύπο των δεδοµένων που θα ανακυκλώνονται µέσω της shift register, που θα είναι ακέραιοι αριθµοί. Επίσης τούτο συνεπάγεται ότι στην πρώτη εκτέλεση του βρόγχου το αριστερό βελάκι θα δώσει µέσα στο βρόγχο για την εκτέλεση των όποιων πράξεων την τιµή 0. Με το τέλος της πρώτης εκτέλεσης στο δεξί βελάκι θα αποδοθεί η τιµή 0 + 5 = 5. Αυτή η τιµή θα ανακυκλωθεί και θα έρθει στο αριστερό βελάκι κατά τη δεύτερη επανάληψη του βρόγχου. Έτσι η είσοδος στο βρόγχο από το αριστερό βελάκι στη δεύτερη εκτέλεσή του θα είναι ίση µε 5, ενώ στο τέλος της δεύτερης εκτέλεσης του βρόγχου στο δεξί βελάκι θα αποδοθεί η τιµή 5 + 5 = 10, η οποία θα επιστρέψει στο αριστερό βελάκι κατά την τρίτη εκτέλεση του βρόγχου. Η διαδικασία θα επαναληφθεί για τον αριθµό των επαναλήψεων που έχουν οριστεί για τη for-loop. Σχήµα 3.2: Παράδειγµα shift register σε βρόγχο for-loop.
Συναρτήσεις (functions) για τα arrays Όλες οι συναρτήσεις που απευθύνονται στα arrays προσεγγίζονται µε δεξί κλικ στο Block diagram και επιλογή τους από το µενού «Array» Η συνάρτηση «Build array» 1. Η επιλογή της συνάρτηση Build array από το µενού «Array» παρουσιάζεται στο σχήµα 3.3. Σχήµα 3.3: Επιλογή της συνάρτησης Build array από το µενού «Array». 2. Η συνάρτηση build array χρησιµοποιεί τις εισόδους στα αριστερά της για να «κτίσει» ένα πίνακα. Με την εισαγωγή µιας build array στο block diagram, τούτη εµφανίζεται µε µία µόνο είσοδο. Μπορούµε να αυξήσουµε τις εισόδους στα αριστερά της build array τραβώντας τους µοχλούς χειρισµού του εικονιδίου προς τα πάνω ή προς τα κάτω. Στη συνέχεια µπορούµε απλά να καλωδιώσουµε τιµές στις εισόδους στα αριστερά της build array και να κτίσουµε έτσι ένα array. Όλα τα ανωτέρω παρουσιάζονται στο σχήµα 3.4. 3. Στο σχήµα 3.4 κατασκευάσαµε ένα µονοδιάστατο array µε πραγµατικές τιµές σε αυτό. Η συνάρτηση Build array τοποθετεί τη µία τιµή κάτω από την άλλη και κτίζει έτσι το array.
Σχήµα 3.4: Καθορισµός διαστάσεων και αρχικοποίηση της συνάρτησης Build. 4. Εκτός από σταθερές, στις εισόδους µίας Build array µπορούµε να καλωδιώσουµε numeric controls ή indicators. 5. Επίσης, στις εισόδους µιας Build array µπορούµε να καλωδιώσουµε άλλα arrays, ή και συνδυασµούς arrays και σταθερών, όπως φαίνεται στο παράθυρο βοήθειας της συνάρτησης, στο σχήµα 3.5. Το αποτέλεσµα που θα πάρουµε κάθε φορά εξαρτάται από τα δεδοµένα εισόδου της συνάρτησης Σχήµα 3.5: Το παράθυρο βοήθειας για τη συνάρτηση Build array. 6. Είδαµε ήδη πως όταν εισάγουµε στις εισόδους της Build array απλούς αριθµούς, δηλαδή numeric constants, controls ή indicators, το αποτέλεσµα είναι ένα µονοδιάστατο array (σχήµα 3.4). 7. Επίσης, όταν εισάγουµε σε µία build array µονοδιάστατα arrays και απλούς αριθµούς, το αποτέλεσµα είναι και πάλι ένα µονοδιάστατο array (σχήµα 3.5). Οι τιµές εισόδου τοποθετούνται η µία κάτω από την άλλη και σε αυτή την περίπτωση. 8. Αν εισάγουµε σε µία build array µόνο arrays, τότε το αποτέλεσµα µπορεί να είναι:
a. Ένα νέο µονοδιάστατο array, όταν είναι ενεργοποιηµένη η επιλογή «Concatenate inputs» που εµφανίζεται στο αναδυόµενο µενού µε δεξί κλικ πάνω στη συνάρτηση Build array. Στην περίπτωση αυτή η συνάρτηση Build array απλά τοποθετεί τα arrays εισόδου το ένα κάτω από το άλλο και κτίζει έτσι και πάλι ένα µονοδιάστατο array. b. Ένα νέο διδιάστατο array, όταν είναι δεν ενεργοποιηµένη η επιλογή «Concatenate inputs» που εµφανίζεται στο αναδυόµενο µενού µε δεξί κλικ πάνω στη συνάρτηση Build array. Στην περίπτωση αυτή η συνάρτηση Build array τοποθετεί τα arrays εισόδου το ένα δίπλα στο άλλο και κτίζει έτσι ένα διδιάστατο array. Τα ανωτέρω παρουσιάζονται στο σχήµα 3.6. Σχήµα 3.6: Εναλλακτική λειτουργία της Build array µέσω της επιλογής «Concatenate inputs». 9. Προς ανακεφαλαίωση των ανωτέρω ας δούµε το παράδειγµα του σχήµατος 3.7. Αρχικά, στον αριστερό βρόγχο for-loop κατασκευάζεται ένα µονοδιάστατο array µε µέγεθος 24 τιµών και τιµές από 1 έως 24, αυξανόµενες κατά 1 σε κάθε κελί. Στη συνέχεια στο δεξί βρόγχο for-loop έχουµε εισάγει δύο shift register. Η πρώτη έχει αρχικοποιηθεί µε ένα µονοδιάστατο κενό array πραγµατικών αριθµών, ενώ η δεύτερη έχει αρχικοποιηθεί µε ένα διδιάστατο κενό array πραγµατικών αριθµών. Σχήµα 3.7: Παράδειγµα συνδυασµένης χρήσης shift register και build array.
Εντός του δεύτερου βρόγχου for-loop έχουµε εισάγει δύο συναρτήσεις build array. Στην πιο πάνω από αυτές είναι ενεργοποιηµένη η επιλογή «Concatenate inputs», ενώ στην πιο κάτω δεν είναι ενεργοποιηµένη η επιλογή αυτή. Σε κάθε µία build array εισάγεται το µονοδιάστατο array που έχει δηµιουργηθεί από τον αριστερό βρόγχο for-loop. Ο δεξιός βρόγχος for-loop θα επαναληφθεί 365 φορές. Με την πάνω build array κτιστεί ένα µονοδιάστατο array που θα περιέχει το array 1-24, 365 φορές, τη µία κάτω από την άλλη. Το πλήθος των στοιχείων του µονοδιάστατου αυτού array θα είναι 24 x 365 = 8.760. Με την κάτω build array θα κτιστεί ένα διδιάστατο array, το οποίο θα έχει σε 365 γραµµές το διάνυσµα 1-24. Παρατηρείται στο σχήµα 3.7 ότι πριν την είσοδο του διδιάστατου array στο indicator «Array 1» έχει εισαχθεί µία ακόµα συνάρτηση. Η συνάρτηση αυτή είναι η «Transpose 2D array» και το αποτέλεσµά της είναι να κάνει τις γραµµές του αρχικού array στήλες και τις στήλες γραµµές. Έτσι το τελικό αποτέλεσµα που τελικά θα εισαχθεί στο Indicator «Array 1» θα είναι ένα διδιάστατο array µε το array 1-24 να εµφανίζεται σε 365 στήλες. 10. Η εισαγωγή της συνάρτησης «Transpose 2D array» από το µενού «Array» παρουσιάζεται στο σχήµα 3.8. Στο ίδιο σχήµα παρουσιάζεται το µενού βοήθειας της ίδιας συνάρτησης. Σχήµα 3.8: Εισαγωγή της συνάρτησης «Transpose 2D array» στο Block diagram και το µενού βοήθειας.
Η συνάρτηση «Array size» 1. Η συνάρτηση «Array size» επιστρέφει το πλήθος των στοιχείων που περιέχονται σε ένα array. Η εισαγωγή της στο Block diagram και το µενού βοήθειας παρουσιάζονται στο σχήµα 3.9. Σχήµα 3.9: Εισαγωγή της συνάρτησης «Array size» στο Block diagram και το µενού βοήθειας. 2. Στην περίπτωση µονοδιάστατου array η συνάρτηση αυτή επιστρέφει ένα numeric indicator, µε το πλήθος των τιµών του µονοδιάστατου array. Στην περίπτωση ενός διδιάστατου array, η συνάρτηση επιστρέφει ένα µονοδιάστατο array µε δύο τιµές, κατά σειρά το πλήθος των γραµµών και των στηλών του διδιάστατου array (σχήµα 3.10). Σχήµα 3.10: Λειτουργία της συνάρτησης build array µε µονοδιάστατο και διδιάστατο array.
Η συνάρτηση «Max & Min» 1. Η συνάρτηση «Max & Min» επιστρέφει τη µέγιστη και την ελάχιστη τιµή ενός array, µαζί µε τη θέση (index) των τιµών αυτών εντός του array. Η σύνταξή της είναι απλή και δίνεται στο µενού βοήθειας της συνάρτησης που παρουσιάζεται στο σχήµα 3.11. Στο ίδιο σχήµα παρουσιάζεται και η εισαγωγή της συνάρτησης αυτής στο block diagram από το µενού «Array». Σχήµα 3.11: Εισαγωγή της συνάρτησης «Max & Min» στο Block diagram και το µενού βοήθειας. Η συνάρτηση «Delete From Array» 1. Η συνάρτηση «Delete From Array» διαγράφει ένα συγκριµένο µέρος ενός array. 2. Οι απαιτούµενες είσοδοι της συνάρτησης, σύµφωνα µε το µενού βοήθειας, είναι το αρχικό array, το µήκος (length) του τµήµατος που θέλουµε να διαγράψουµε και η θέση (index) από την οποία ξεκινάει αυτό το µήκος. Υπενθυµίζεται ότι το πρώτο στοιχείο ενός µονοδιάστατου array έχει index ίσο µε 0, ενώ το index του πρώτου στοιχείου ενός διδιάστατου array είναι το (0, 0). 3. Η συνάρτηση «Delete From Array» επιστρέφει τόσο το µέρος του array που αποµένει µετά τη διαγραφή, όσο και το τµήµα του array που διαγράφηκε. 4. Η σύνταξή της είναι απλή και δίνεται στο µενού βοήθειας της συνάρτησης που παρουσιάζεται στο σχήµα 3.12. Στο ίδιο σχήµα παρουσιάζεται και η εισαγωγή της συνάρτησης αυτής στο block diagram από το µενού «Array».
Σχήµα 3.12: Εισαγωγή της συνάρτησης «Delete From Array» στο Block diagram και το µενού βοήθειας. Παράδειγµα 1. Στο σχήµα 3.13 παρουσιάζεται ένα παράδειγµα που ανακεφαλαιώνει τα όσα έχουν παρουσιαστεί παραπάνω. Με τη δοµή του σχήµατος αυτού ταξινοµούνται τα στοιχεία ενός µονοδιάστατο array σε φθίνουσα σειρά, δηλαδή από το µεγαλύτερο προς το µικρότερο. Στη συνέχεια περιγράφεται η λογική του παραδείγµατος. 2. Καταρχήν το µονοδιάστατο array στο οποίο θέλουµε να ταξινοµήσουµε τα στοιχεία του σε φθίνουσα σειρά είναι το array 1. Με τη συνάρτηση «Array Size» παίρνουµε το πλήθος των στοιχείων του array αυτού και το δίνουµε στη σταθερά Ν του βρόγχου for-loop. Έτσι εξασφαλίζουµε ότι ο βρόγχος for-loop θα εκτελεστεί τόσες φορές, όσο είναι το πλήθος των στοιχείων του array 1. Σχήµα 3.13: Παράδειγµα ταξινόµησης των τιµών ενός µονοδιάστατου array σε φθίνουσα σειρά. 3. Εισάγουµε στη συνέχεια δύο δοµές shift register στο βρόγχο for-loop. Την πρώτη την αρχικοποιούµε µε το array 1, ενώ τη δεύτερη την αρχικοποιούµε µε ένα κενό µονοδιάστατο array.
4. Από την πρώτη shift register στην πρώτη εκτέλεση του βρόγχου παίρνουµε το array 1 και το εισάγουµε στη συνάρτηση «Max & Min». Έτσι στην πρώτη εκτέλεση του βρόγχου παίρνουµε από τη συνάρτηση «Max & Min» τη µέγιστη τιµή και τη θέση της (index) του αρχικού array 1. Στη συνέχεια το array 1, ως περιεχόµενο της shift register στην πρώτη εκτέλεση του βρόγχου οδηγείται στη συνάρτηση «Delete From Array». Στη συνάρτηση αυτή έχουµε καλωδιώσει το index της µέγιστης τιµής του array 1, όπως δίνεται απότ η συνάρτηση «Max & Min» και έχουµε επίσης ορίσει µήκος διαγραφής ίσο µε 1. Έτσι, το αποτέλεσµα της συνάρτησης «Delete From Array» θα είναι ένα διάνυσµα που προκύπτει από το αρχικό array 1, εφόσον διαγράψουµε τη µέγιστη τιµή του. Το διάνυσµα αυτό το καλωδιώνουµε στο δεξί βελάκι της πρώτης shift register, ώστε να αποτελέσει την είσοδο για την εκτέλεση της ανωτέρω διαδικασίας κατά τη δεύτερη επανάληψη του βρόγχου for-loop. 5. Ταυτόχρονα, εισάγουµε τη µέγιστη τιµή που έχουµε εντοπίσει από το αρχικό διάνυσµα array 1 σε µία συνάρτηση «Build array», στην οποία επίσης έχουµε καλωδιώσει την αρχική τιµή της δεύτερης shift register, δηλαδή το µονοδιάστατο κενό array, µε το οποίο την έχουµε αρχικοποιήσει. Έτσι, η έξοδος από τη δεύτερη shift register κατά την πρώτη εκτέλεση του βρόγχου θα είναι ένα µονοδιάστατο διάνυσµα µε µόνη τιµή τη µέγιστη τιµή από το αρχικό διάνυσµα array 1. 6. Κατά τη δεύτερη εκτέλεση του βρόγχου η ανωτέρω διαδικασία θα επαναληφθεί µε µόνες διαφορές τις τιµές τις οποίες φέρουν τα δύο δεξιά βελάκια των δοµών shift register. Η πρώτη shift register περιέχει πλέον το αρχικό array 1 χωρίς όµως τη µέγιστη τιµή του. Έτσι η επανάληψης της διαδικασίας θα οδηγήσει στον εντοπισµό της επόµενης µέγιστης τιµή του νέου array και στην αφαίρεσή της από αυτό. Η δεύτερη shift register περιέχει ήδη ένα µονοδιάστατο array µε µόνη τιµή τη µέγιστη τιµή από το αρχικό διάνυσµα array 1. Η επανάληψη της διαδικασίας θα έχει ως αποτέλεσµα την προσθήκη σε αυτό το array της δεύτερης µέγιστης τιµής του αρχικού διανύσµατος. 7. Η ανωτέρω διαδικασία επαναλαµβάνεται τόσες φορές, όσο είναι το πλήθος των στοιχείων του αρχικού διανύσµατος array 1. Το αποτέλεσµα θα είναι ένα νέο διάνυσµα, το array 2, που θα το πάρουµε από την έξοδο της δεύτερης shift register, στο οποίο θα περιέχονται οι τιµές του αρχικού διανύσµατος array 1 ταξινοµηµένες σε φθίνουσα σειρά. 8. Αν θέλαµα να πάρουµε τις τιµές του διανύσµατος array 1 σε αύξουσα σειρά, τότε θα έπρεπε στη συνάρτηση «Max & Min» να πάρουµε τις εξόδους που δίνουν την ελάχιστη τιµή του διανύσµατος και τη θέση της µέσα στο array.