Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος."— Μεταγράφημα παρουσίασης:

1 HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος Νικολάου

2 ΕΝΟΤΗΤΑ Ι ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Διάλεξη 6η

3 Περιεχόμενα Τοπικές μεταβλητές σε block Τύπος διεύθυνσης τετραδίου Εντολή κράτησης / απελευθέρωσης θέσεων

4 Τοπικές μεταβλητές σε block (1/8) Εκτός από τις μεταβλητές που δηλώνετε πριν την αρχή του προγράμματος, για τις οποίες ο υπηρέτης κάνει «κράτηση θέσεων» πριν αρχίσει να εκτελεί το πρόγραμμα, –Μπορείτε να δηλώνετε μεταβλητές και μέσα σε ένα block, αρκεί αυτές οι δηλώσεις να προηγούνται οποιασδήποτε κανονικής εντολής του συγκεκριμένου block –Αυτές τις μεταβλητές τις ονομάζουμε «τοπικές μεταβλητές σε block», ή απλώς «τοπικές μεταβλητές», –και τις ξεχωρίζουμε από τις μεταβλητές του προγράμματος τις οποίες τις ονομάζουμε καθολικές μεταβλητές –Ακολουθεί πρώτα ένα απλό παράδειγμα και έπειτα θα δούμε όλους τους κανόνες για τη δήλωση τοπικών μεταβλητών

5 Τοπικές μεταβλητές σε block (2/8) BOOLEAN x; PROGRAM_BEGIN INPUT(x); OUTPUT(x); BEGIN INTEGER x; INPUT(x); OUTPUT(x); BEGIN STRING x; INPUT(x); OUTPUT(x); END OUTPUT(x); END OUTPUT(x); PROGRAM_END Μπορούμε να δηλώνουμε μεταβλητές με οποιοδήποτε όνομα και τύπο σε ένα block, εφόσον μέσα σε αυτό δεν υπάρχει άλλη μεταβλητή με το ίδιο όνομα. Όταν γίνεται χρήση μίας μεταβλητής ο υπηρέτης θα την αντιστοιχήσει στην πιο «κοντινή» σε απόσταση δήλωση με το ίδιο όνομα. Μένει να δούμε τον τρόπο με τον οποίο ο υπηρέτης κάνει «κράτηση θέσεων» για τοπικές μεταβλητές.

6 Τοπικές μεταβλητές σε block (3/8) Για κάθε block ο υπηρέτης σημειώνει τον συνολικό αριθμό θέσεων μνήμης για τις τοπικές μεταβλητές, προσδιορίζει ένα συνεχόμενο τμήμα τετραδίου που χρειάζονται, καθώς και τη σχετική θέση της κάθε τοπικής μεταβλητής του block στο τμήμα αυτό. –Όλα αυτά δίνοντας ένα μοναδικό σειριακό αριθμό σε κάθε block BOOLEAN x; PROGRAM_BEGIN INPUT(x); OUTPUT(x); BEGIN INTEGER x; INPUT(x); OUTPUT(x); BEGIN STRING x; INPUT(x); OUTPUT(x); END OUTPUT(x); END OUTPUT(x); PROGRAM_END 2 1 Block 1, size 1, Start1? INTEGER, x, at Start1+0 Block 2, size 1, Start2 STRING, x, at Start2+0 Επίσης, υπάρχει και πληροφορία για την ακριβή θέση του block κατά την εκτέλεση, που τη σημειώνει με την ένδειξη Start και το ερωτηματικό ?, και θα δούμε σε λίγο τι ρόλο παίζει. Επιπλέον, ο υπηρέτης πέρα από τη σχετική θέση της κάθε τοπικής μεταβλητής, σημειώνει ότι αυτή θα την προσθέσει στην τιμή του Start. Άραγε τι σημαίνει αυτό?

7 Τοπικές μεταβλητές σε block (4/8) Τι κάνει ο υπηρέτης όταν αρχίσει να εκτελείται ένα block –Βάσει του αριθμού του, βρίσκει στο ειδικό ευρετήριο τον προηγούμενο πίνακα του block και διαβάζει το μέγεθος του block σε σειρές τετραδίου, έστω Ν –Βρίσκει τις πρώτες Ν συνεχόμενες θέσεις στο τετράδιο, έστω ότι αρχίζει στην (0,12), και τις «κρατάει» για το block αυτό, ενώ ταυτόχρονα σημειώνει στον πίνακα του block ως start την αρχή αυτού του τμήματος Ν θέσεων, δηλ. Start  (0,12) –Όταν γίνεται χρήση τοπικής μεταβλητής, ο υπηρέτης ανατρέχει στον πίνακα του αντίστοιχου block και βρίσκει σε ποια ακριβώς θέση μέσα στο τμήμα του block αντιστοιχεί η μεταβλητή αυτή Τι κάνει ο υπηρέτης όταν τελειώσει η εκτέλεση ενός block –Απελευθερώνει το τμήμα που κατέλαβε με τον παραπάνω τρόπο –Σβήνει την τιμή του Start και ξαναγράφει το ερωτηματικό ?

8 Τοπικές μεταβλητές σε block (5/8) BOOLEAN x; PROGRAM_BEGIN INPUT(x); OUTPUT(x); BEGIN INTEGER x; INPUT(x); OUTPUT(x); BEGIN STRING x; INPUT(x); OUTPUT(x); END OUTPUT(x); END OUTPUT(x); PROGRAM_END (0,0) BOOLEAN x, Global Block 1, size 1, Start1 INTEGER, x, at Start1+0 Block 2, size 1, Start2 STRING, x, at Start2+0 Σ1 Σ2 Σ3 Σ (0,0) BOOLEAN x, Global (0,1) Block 1 Block 1, size1, Start1(0,1) INTEGER, x, at Start1+0 (0,0) BOOLEAN x, Global (0,1) Block 1 (0,2) Block 2 Block 2,s 1, Start2(0,2) STRING, x, at Start2+0 (0,0) BOOLEAN x, Global (0,1) Block 1 Block 2, size 1, Start2 STRING, x, at Start2+0 (0,0) BOOLEAN x, Global Block 1, size 1, Start1 INTEGER, x, at Start1+0 Σ1 Σ2 Σ3 Σ4

9 Τοπικές μεταβλητές σε block (6/8) Γιατί ο υπηρέτης δουλεύει τόσο πολύπλοκα και δεν κάνει από την αρχή αντιστοίχηση όλων των τοπικών μεταβλητών σε ξεχωριστές θέσεις του τετραδίου? –Για να εξοικονομήσει χώρο τετραδίου (μνήμη), καθώς έχει καταλάβει ότι οι θέσεις του τετραδίου είναι πολύτιμες και δεν πρέπει να τις σπαταλά με «απερισκεψία» BOOLEAN x; PROGRAM_BEGIN OUTPUT(POSITIONOF(x)); BEGIN INTEGER x; OUTPUT(POSITIONOF(x)); BEGIN STRING x; OUTPUT(POSITIONOF(x)); END PROGRAM_END Το πρόγραμμα οδηγός επιβεβαιώνει τους κανόνες διαχείρισης των μεταβλητών σε block κατά την εκτέλεση από τον υπηρέτη

10 Τοπικές μεταβλητές σε block (7/8) Πότε χρησιμοποιούμε τοπικές μεταβλητές μέσα σε block? –Μόνο εάν χρειαζόμαστε μεταβλητές οι οποίες έχουν νόημα χρήσης μέσα σε αυτό το block, αλλά όχι στο υπόλοιπο του προγράμματος Αποφεύγουμε να «μαζεύουμε» δηλώσεις μεταβλητών εκτός του χώρου ενός block αν δεν χρησιμοποιούνται Κλασική περίπτωση είναι οι μετρητές για loops που έχουν νόημα ύπαρξης μόνο στην υλοποίηση του loop –Εάν το loop είναι στο κυρίως πρόγραμμα, οι μετρητές δηλώνονται στο κυρίως πρόγραμμα, αλλιώς μέσα στο block που χρησιμοποιούνται. Εάν δεν υπάρχει block, δημιουργούμε εμείς ένα για ευκολία.

11 Τοπικές μεταβλητές σε block (8/8) Εδώ φαίνεται ξεκάθαρα η τακτική να δηλώνουμε τις μεταβλητές όσο πλησιέστερα γίνεται στο σημείο (εντολές) του κώδικα που πρόκειται να χρησιμοποιηθούν.

12 Περιεχόμενα Τοπικές μεταβλητές σε block Τύπος διεύθυνσης τετραδίου Εντολή κράτησης / απελευθέρωσης θέσεων

13 Τύπος διεύθυνσης τετραδίου (1/5) Πρόκειται για έναν απλό τύπο (δηλ. θέλει μία σειρά τετραδίου), με περιεχόμενο κάπως «αναμενόμενο» –Ένα ζεύγος τιμών (σελίδα, γραμμή) που συνιστούν μία διεύθυνση του τετραδίου, π.χ. (0,1) –Π.χ. ADDRESS p(0,0); δηλώνει μία τέτοια μεταβλητή με το όνομα p που έχει αρχικά την τιμή (0,0), δηλ. περιέχει τη διεύθυνση της πρώτης γραμμής της πρώτης σελίδας. –Σε μία μεταβλητή διεύθυνσης τετραδίου μπορούμε να εκχωρήσουμε το αποτέλεσμα της POSITIONOF, αφού η τελευταία επιστρέφει διεύθυνση τετραδίου π.χ. p = POSITIONOF(x); σημαίνει ότι η μεταβλητή p έχει τώρα ως περιεχόμενο τη διεύθυνση στην οποία ο υπηρέτης αποθήκευσε αυτόματα τη μεταβλητή x –Το περιεχόμενο μίας διεύθυνσης τετραδίου είναι εκτυπώσιμο, ως ζεύγος τιμών σελίδας και γραμμής

14 Τύπος διεύθυνσης τετραδίου (2/5) Εδώ φαίνεται μία απλή χρήση μεταβλητών τύπου διεύθυνσης (προφανώς θα μπορούσαμε απευθείας να χρησιμοποιήσουμε την εντολή OUTPUT) Το ενδιαφέρον είναι ότι η μεταβλητή p στην αρχή εκχωρείται την διεύθυνση του τετραδίου στην οποία και αποθηκεύεται ή ίδια – αυτό είναι απόλυτα νόμιμο καθώς η POSITIONOF ορίζεται για κάθε μεταβλητή

15 Τύπος διεύθυνσης τετραδίου (3/5) Παρέχεται και η συνάρτηση CONTENTOF(p), με p να είναι πάντα μία τιμή ή μεταβλητή τύπου ADDRESS –Επιστρέφει το περιεχόμενο της σειράς τετραδίου στη διεύθυνση που «προσδιορίζεται» από το p –Έτσι, για κάθε μεταβλητή x, η έκφραση CONTENTOF(POSITIONOF(x)) είναι συνώνυμη έκφραση του x Μία έκφραση CONTENTOF μπορεί να χρησιμοποιηθεί ως αριστερό τμήμα μίας εκχώρησης, ως μεταβλητή PROGRAM_BEGIN INTEGER x; ADDRESS p; INPUT(x); p = POSITIONOF(x); OUTPUT(CONTENTOF(p)); CONTENTOF(p) = sqr(CONTENTOF(p)); OUTPUT(x); OUTPUT(p); OUTPUT(POSITIONOF(p)); PROGRAM_END Οι μεταβλητές τύπου διεύθυνσης είναι πολύ απλές στη χρήση, αλλά πολύ χρήσιμες όπως θα δούμε παρακάτω.

16 Τύπος διεύθυνσης τετραδίου (4/5) Για να δούμε πόσο εύκολα μπορούμε να χρησιμοποιούμε μεταβλητές τύπου ADDRESS για πιο ευέλικτη χρήση των θέσεων του τετραδίου! INTEGERi = 21; BOOLEANb = FALSE; REALr = 3.14; STRINGs = "hello"; CHARACTERc = '#'; PROGRAM_BEGIN ADDRESS p; p = POSITIONOF(i); INTEGERj; WHILE p DIFFERENT POSITIONOF(c)+1 DO BEGIN OUTPUT(CONTENTOF(p)); p = p+1; END PROGRAM_END Αυτό πρέπει να είναι (0,0) Αυτό πρέπει να είναι (0,5) Προχωράμε την διεύθυνση κατά μία σειρά Εκτυπώνουμε το περιεχόμενο στην εκάστοτε διεύθυνση του p Τι κάνει αυτό το παράξενο loop? (0,0)i (0,1)b (0,2)r (0,3)s (0,4)c (0,5)p (0,6)j Τετράδιο

17 Τύπος διεύθυνσης τετραδίου (5/5) Το προηγούμενο πρόγραμμα εκτυπώνει τα περιεχόμενα όλων των καθολικών μεταβλητών του προγράμματος, χωρίς ωστόσο να χρησιμοποιεί τις ίδιες τις μεταβλητές μέσω των αναγνωριστικών ονομάτων τους! –εκμεταλλευόμενο τις μεταβλητές τύπου ADDRESS –καθώς και γνώση των κανόνων «κράτησης θέσεων» για τις μεταβλητές από τον υπηρέτη

18 Περιεχόμενα Τοπικές μεταβλητές σε block Τύπος διεύθυνσης τετραδίου Εντολή κράτησης / απελευθέρωσης θέσεων

19 Εντολή κράτησης / απελευθέρωσης θέσεων (1/10) Μέχρι τώρα είδαμε ότι η «κράτηση θέσεων» στο τετράδιο είναι δουλειά που την κάνει ο υπηρέτης για τις μεταβλητές που δηλώνουμε Όμως υπάρχουν περιπτώσεις που κατά την κατασκευή του προγράμματος δεν μπορούμε να προβλέψουμε πόσες ακριβώς θέσεις θα χρειαστούμε για την αποθήκευση μεταβλητών. Π.χ.  Θέλουμε ένα πρόγραμμα το οποίο:  διαβάζει στην αρχή έναν αριθμό Ν  έπειτα διαβάζει N αριθμούς ακριβώς από την είσοδο  και στη συνέχεια, μόνο αφού διαβαστεί και ο τελευταίος αριθμός, εκτυπώνει τα τετράγωνά τους στην έξοδο

20 Εντολή κράτησης / απελευθέρωσης θέσεων (2/10) Δυστυχώς η εκφώνηση απαιτεί πρώτα να γίνει η είσοδος των αριθμών –πως μπορούμε να φτιάξουμε το πρόβλημα βάσει αυτής της απαίτησης; –πρέπει οπωσδήποτε να αποθηκευτούν πρώτα οι αριθμοί! Μπορούμε να δηλώσουμε πίνακα; –όχι, γιατί η δήλωση πίνακα απαιτεί σταθερά τιμή ως μέγεθος και όχι μεταβλητή του προγράμματος Τι κάνουμε λοιπόν; –Επειδή θυμόμαστε ότι μπορούμε να χρησιμοποιήσουμε το τετράδιο απευθείας με τη χρήση του συμβολισμού POSITION –βρίσκουμε μία πρώτη λύση που όπως θα δούμε δεν είναι ιδιαίτερα καλή

21 Εντολή κράτησης / απελευθέρωσης θέσεων (3/10) PROGRAM_BEGIN INTEGER i, N; CONST_INTEGER arxh = 10; /* Seira */ INPUT(N); FORi = 0; i < N; i = i+1DO INPUT(POSITION(0, arxh+i)); FORi=0; i

22 Εντολή κράτησης / απελευθέρωσης θέσεων (4/10) Η νέα ανάγκη που εμφανίζεται είναι γενικά η χρήση μνήμης ανάλογα με τις απαιτήσεις που προκύπτουν κατά την εκτέλεση του προγράμματος Αυτή η ανάγκη έρχεται σε αντιδιαστολή με την παραδοσιακή δέσμευση μνήμης συγκεκριμένου αριθμού μεταβλητών, που είναι ήδη γνωστός κατά την κατασκευή του προγράμματος –δηλ. στατικά, με την πρώτη ανάγνωση του προγράμματος από τον υπηρέτη πριν αρχίσει η εκτέλεση Χρειαζόμαστε μία εντολή προγράμματος με την οποία θα μπορούσαμε να πούμε στον υπηρέτη να κάνει κάτι που το γνωρίζει ήδη πολύ καλά, π.χ: –Βρες Ν συνεχόμενες ελεύθερες θέσεις τετραδίου και σημείωσε αυτές ως κατειλημμένες Η εντολή αυτή προσφέρεται από τη γλώσσα FLIP και είναι η GRANTPOSITIONS

23 Εντολή κράτησης / απελευθέρωσης θέσεων (5/10) PROGRAM_BEGIN INTEGER i, N; ADDRESS p; INPUT(N); GRANTPOSITIONS(p, N); FORi=0; i

24 Εντολή κράτησης / απελευθέρωσης θέσεων (6/10) Κάτι που παρατηρούμε από τον τρόπο που λειτουργεί η GRANTPOSITIONS, που ενδεχομένως να είναι πρόβλημα, είναι ότι βρίσκει απλώς σειρές τετραδίου, τις οποίες πρέπει εμείς να τις χρησιμοποιήσουμε όπως αρμόζει Τι γίνεται εάν εγώ χρειάζομαι δυναμικά θέσεις για την αποθήκευση Ν τιμών σύνθετου τύπου; Π.χ. θέλω ένα πρόγραμμα το οποίο κάνει τα εξής: –Υπολογίζει την περίμετρο οποιουδήποτε δισδιάστατου πολύπλευρου Ν  3 πλευρών, με είσοδο πρώτα το Ν και έπειτα με τη σειρά τα Ν σημεία –Εκτυπώνει την περίμετρο του και έπειτα τα σημεία με τη σειρά εισόδου

25 Εντολή κράτησης / απελευθέρωσης θέσεων (7/10) Σχεδίαση του προγράμματος –Μεταβλητές: INTEGER N, REAL d (περίμετρος), INTEGER i (μετρητής), «σημεία» –Είσοδος (αρχικά): To N –Έξοδος (στο τέλος): Το d και μετά τα «σημεία» με τη σειρά εισόδου –Loops: Ένα για την είσοδο των σημείων, Ν ανακυκλώσεις, αλλά μπορώ να προσθέτω και στην περίμετρο d μέσα σε αυτό το loop Ένα στο τέλος, Ν ανακυκλώσεις, για την εκτύπωση των σημείων –Αποθήκευση των σημείων; Μας κάνει το ADDRESS και η GRANTPOSITIONS? –Θα μπορούσαμε αλλά δεν θα είχαμε ευκολία να χρησιμοποιήσουμε τον προσφιλή τύπο RECORD με το όνομα Point

26 Εντολή κράτησης / απελευθέρωσης θέσεων (8/10) RECORD Point RECBEGIN REAL x,y; RECEND; ADDRESSEX(Point) P; INTEGER i, N; REALd = 0; PROGRAM_BEGIN OUTPUTEX("N:"); INPUTEX(N); IF N < 3 THEN STOP; GRANTPOSITIONS(P, N); FOR i=0; i

27 Εντολή κράτησης / απελευθέρωσης θέσεων (9/10) OUTPUTEX("Perimeter:"); OUTPUTEX(d); OUTPUT(LINE); FOR i=0; i

28 Εντολή κράτησης / απελευθέρωσης θέσεων (10/10) Η εντολή με την οποία ο υπηρέτης δεσμεύει μνήμη με μέγεθος που είναι γνωστό μόνο μέσω των υπολογισμών του προγράμματος (π.χ. είσοδο) είναι πολύ χρήσιμη –Καθώς μας προσφέρει μνήμη αυτόματα όταν την χρειαζόμαστε –Μας δίνεται και ο ειδικός τύπος διεύθυνσης ADDRESSEX(T) ώστε να χρησιμοποιείται η μνήμη αυτή σαν να ήταν πίνακας από στοιχεία τύπου Τ –Κάθε πρόγραμμα που χρησιμοποιεί στατικούς πίνακες, έστω ARRAY(Τ, N σταθερά τιμή ) P; μπορεί κάλλιστα να γραφεί ώστε να χρησιμοποιεί δυναμικούς πίνακες ADDRESSEX(Τ) P; πριν την 1 η εντολή στην οποία χρησιμοποιείται ο P γράφουμε την εντολή GRANTPOSITIONS(P, N σταθερά τιμή ) μετά την τελευταία εντολή στην οποία χρησιμοποιείται ο P γράφουμε την εντολή RELEASEPOSITIONS(P)

29 Εντολή κράτησης / απελευθέρωσης θέσεων - ένθετο


Κατέβασμα ppt "HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google