Παρασκευή, 26 Μαΐου 2017

Παράδειγμα με διαμόρφωση τμημάτων (decoration)

Στο παράδειγμα έχουμε ένα τμήμα Εμφάνιση και έστω ότι είναι ένα ξένο τμήμα, στο οποίο γνωρίζουμε ότι δέχεται δυο αριθμούς και δίνει ένα αποτέλεσμα βάσει ενός τρόπου που καθορίζουμε με διαμόρφωση απ' έξω, δηλαδή του λέμε το τμήμα τρόπος που περιέχει ότι θα έχει μια άλλη λειτουργία. Αν δεν δώσουμε εξωτερικό τρόπο τότε το τμήμα το γνωρίζει με την χρήση μια γενικής που φτιάχνει τοπικά, άρα με θέαση μόνο εντός του τμήματος Εμφάνιση, και για ότι άλλο έχει εκεί, άρα και για τον τρόπο. Ο ορισμός γενικής Κ σκιάζει όποια γενική Κ υπήρχε μέχρι να τερματίσει το τμήμα.

Στη Μ2000 τα τμήματα δεν ελέγχουν τον αριθμό ορισμάτων στην κλήση, αλλά οφείλει ο προγραμματιστής να δει τι θα κάνει για αυτά. Τα ορίσματα κατά τη κλήση βρίσκονται σε ένα σωρό τιμών. Μπορούμε άμεσα να τα διαβάσουμε σε μεταβλητές. Αν έχουμε λάθος τύπο, θα βγει λάθος στο διάβασμα, Σε άλλες γλώσσες το πρόβλημα του λάθους βρίσκεται στην πλευρά της κλήσης, ενώ στη Μ2000 στη πλευρά του τμήματος που καλέστηκε. Αν ένα τμήμα δεν διαβάσει τα ορίσματα, και δεν πειράξει το σωρό τιμών τότε θα παραμείνουν εκεί.

Στο τμήμα Εμφάνιση αν δεν δώσουμε ορίσματα και δεν έχουμε επιλέξει τρόπο εξωτερικά με την χρήση της διαμόρφωσης, τότε ο εσωτερικός τρόπος θα πετάξει μέχρι δυο "οτιδήποτε", δηλαδή δυο στοιχεία (αυτό μπορεί να είναι κακό αν έχουμε τιμές που χρειαζόμαστε), και θα εμφανίσει σε όλο το πλάτος στήλης παύλες.  Μπορούμε βέβαια να δώσουμε τιμές το ? δυο φορές, δηλαδή το Εμφάνιση ?, ? που σημαίνει "αδιάφορο" αλλά ότι θα μπουν δυο "κάτι" στο σωρό, και αυτό είναι πιο σωστό!

Μετά φτιάχνουμε τμήματα που αναλογούν στον τρόπο. Δηλαδή διαβάζουν δυο τιμές (ορίσματα) σε δυο μεταβλητές (παραμέτρους) και εκτελούν έναν υπολογισμό βάζοντας το αποτέλεσμα στο σωρό.

Κάθε τμήμα κληρονομεί το πατρικό σωρό, και μπορεί να αφήνει τιμές σε αυτόν. Έτσι η εξαγωγή του ενός τμήματος γίνεται εισαγωγή για το επόμενο. Οι συναρτήσεις έχουν δικό τους σωρό τιμών, και αν έχουν δικά τους τμήματα τότε και αυτά κληρονομούν τον σωρό του πατρικού, εδώ της συνάρτησης.

Ουσιαστικά σωρός τιμών είναι ένα ρεύμα εισόδου/εξόδου, ως μια στοίβα, από την οποία διαβάζουμε και στην οποία βάζουμε τιμές (με την Βάλε στην κορυφή της, ενώ με την Σειρά βάζουμε στο τέλος της, ή στο πυθμένα)
Το Βάλε 5, 3 θα βάλει τελικά το 3 στην κορυφή και το 5 ένα κάτω από την κορυφή.
Το Σειρά 4,2 θα βάλει το 2 στο τέλος και το 4 ένα από το τέλος (ή πυθμένα της στοίβας, ή σωρού τιμών όπως την λέμε στη Μ2000).

Ο σωρός τιμών έχει ενδιαφέροντα χαρακτηριστικά, μπορεί να πάρει αριθμούς, αλφαριθμητικά, αντικείμενα, και στα αντικείμενα μπορεί να είναι αντικείμενα σωροί επίσης. Μια απλούστευση της ιδέας του σωρού είναι ότι έχουμε μια γραμμική διάταξη στοιχείων με δυνατότητα μετακίνησης χωρίς κόστος. Βάζουμε και βγάζουμε με μεγάλη ευκολία! Εδώ δεν μας ενδιαφέρουν άλλα χαρακτηριστικά και δεν θα δούμε άλλα. Αυτό που μας ενδιαφέρει είναι ότι εντολές για το σωρό εκτελούνται σε αυτό που λέμε τρέχον σωρός τιμών. Η Μέγεθος.Σωρού μας λέει πόσα στοιχεία έχει ο σωρός (ένας πίνακας εγγράφεται στο σωρό ως ένα στοιχείο, ενώ μπορεί να έχει χιλιάδες), δηλαδή πόσα είναι διατεταγμένα σε αυτόν. Η εντολή Πέτα χωρίς όρισμα είναι ισοδύναμη με την Πέτα 1, και θα πετάξει την κορυφή και το αμέσως επόμενο θα γίνει η νέα κορυφή. Αν δεν υπάρχει όμως στοιχείο να πετάξει θα βγάλει λάθος. Η Πέτα 0 δεν βγάζει λάθος. Μπορεί να φαίνεται άχρηστο αλλά στη θέση του 0 μπορούμε να έχουμε αριθμητική παράσταση, και να προκύπτει πότε 0 ή πότε κάτι άλλο.

Η Αριθμός τραβάει τη κορυφή του σωρού τιμών, αν έχουμε αριθμός αλλιώς βγάζει λάθος. Η Γράμμα$ δίνει το αλφαριθμητικό στη κορυφή του σωρού αλλιώς βγάζει λάθος.

Όταν καλούμε ένα τμήμα έστω εδώ την Εμφάνιση με ορίσματα έστω το 5 και το 7 τότε ο διερμηνευτής βάζει αυτά σε ένα σωρό πρόσκαιρο, με την εντολή Σειρά, δηλαδή το 7 θα είναι τελευταίο και μετά κάνει ένωση σωρών, βάζοντας τον πρόσκαιρο στη κορυφή του τρέχοντος σωρού. Έτσι το 5 θα είναι στη κορυφή, μετά το 7 και μετά ότι ήδη υπήρχε στο σωρό.

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

Μετά φτιάχνουμε την ΝέαΕμφάνιση όπου εκεί βάζουμε και ένα στάδιο ακόμα, την προσαρμογή. Έχουμε μια Εμφάνισε εσωτερική που απευθείας δίνει τις παύλες όσο το μήκος στήλης εκτύπωσης στην οθόνη μας. Η Στήλη μας λέει πόσους χαρακτήρες έχει η στήλη. Αυτές καθορίζονται αυτόματα με την Φόρμα Χ, Υ αλλά μπορούμε να την αλλάξουμε, γιατί υπάρχει ως δεύτερη παράμετρος σε μια $(), μια εσωτερική συνάρτηση της Τύπωσε.

Στο παράδειγμα έχουμε το πρόσθετο τμήμα για προσαρμογή τιμών εισόδου, το οποίο διαβάζει αλφαριθμητικά και τα μετατρέπει σε αριθμούς, αλλά και άλλα όπως αυτό που μετατρέπει σε ακέραιες τιμές, καθώς και μια άλλη που κάνει στρογγυλοποίηση. Δεν είναι το ίδιο με τη προσαρμογή ακεραίου., διότι η Στρογγ(2.2, 0) στρογγυλοποιεί στο πενηνταράκι όπως λέμε ενώ ο Ακ() δίνει τον αμέσως μικρότερο ακέραιο.
Το Στρογγ(-2.2, 0) θα δώσει το -2, ενώ το Ακ(-2.2) θα δώσει το -3

Οι εικόνες είναι από linux με Wine. Αναφέρει ο διερμηνευτής ότι είναι Windows 7 επειδή αυτό δείχνει το Wine, και ορθώς αναφέρει ότι είναι 64bit το λειτουργικό γιατί 64bit είναι το Linux  στον υπολογιστή δοκιμής!
(ο χρωματισμός στον διορθωτή διαφέρει ανάλογα με το αν έχουμε σκούρο ή φωτεινό φόντο. Στην εξαγωγή σε Html (με απλή αντιγραφή στο πρόχειρο το κάνει) χρησιμοποιεί τον χρωματισμό που έχει οριστεί στις Ρυθμίσεις - υπάρχει τέτοια εντολή). Σε Linux την εξαγωγή σε html την διαβάζει το Libreoffice και το χρησιμοποιούμε ως ενδιάμεσο για να το ξανά αντιγράψουμε και μετά να το επικολλήσουμε στο Blogger εδώ, ενώ σε Windows δεν θέλουμε ενδιάμεσο.

Ο διορθωτής φαίνεται περιορισμένος στο κάτω τμήμα (ολίσθησης). Αν δώσουμε Οθόνη , 0 τότε η ολίσθηση θα πιάσει όλη την οθόνη και θα ανοίξει το παράθυρο του διορθωτή σε όλη την οθόνη (δεν γράφει πάνω στην οθόνη, αλλά σε δικό του χώρο, οπότε με Esc γυρνάμε στη κονσόλα και βλέπουμε ότι είχε). Με Οθόνη , -10 δηλαδή με αρνητικό το δεύτερο νούμερο λέμε να έχουμε ολίσθηση στις δέκα τελευταίες γραμμές, άρα δίνουμε δέκα γραμμές στον διορθωτή μαζί με την επικεφαλίδα (το πρώτο δεν το δίνουμε εδώ και είναι το χρώμα φόντου)
Με Ctrl +C  καθαρίζουμε την κονσόλα (είναι ίδιο με το CLS ή Οθόνη)





Τμήμα Εμφάνιση {
      Γενική Κ=Αληθές
      Τμήμα τρόπος {
            Αν Μέγεθος.Σωρού>=2 Τότε Πέτα 2
            Κ<=Ψευδές
      }
      τρόπος
      \\ το $(4)  βάζει αναλογική γραφή. το $(0) επαναφέρει σε μη αναλογική
      Αν Κ Τότε {
            Τύπωσε $("0.00"), $(4), Αριθμός
            Τύπωσε $(""),$(0),
      } Αλλιώς {
            Τύπωσε Επαν$("-", Στήλη)
      }
}
Εμφάνιση 10,2
Τμήμα Διαίρεση (χ,υ) {
      αν υ==0 Τότε Βάλε 0 : έξοδος
      Βάλε χ/υ
}
Τμήμα Γινόμενο (χ,υ) {
      Βάλε χ*υ
}
Τμήμα Διαφορά (χ, υ) {
      Βάλε χ-υ
}
Τμήμα Σούμα (χ,υ) {
      Βάλε χ+υ
}
Εμφάνιση 5, 7 ; τρόπος ως διαίρεση
Εμφάνιση 5, 7 ; τρόπος ως γινόμενο
Εμφάνιση 5, 7 ; τρόπος ως διαφορά
Εμφάνιση 5, 7 ; τρόπος ως σούμα
Τμήμα ΑριθμοίΩςΧαρακτήρες {
      Διάβασε α$, β$
      Βάλε Τιμή(β$),Τιμή(α$)
}
Τμήμα ΝέαΕμφάνιση {
      Τμήμα Προσαρμογή {}
      Τμήμα Εμφάνιση {
            Τύπωσε Επαν$("-", Στήλη)
      }
      Προσαρμογή
      Εμφάνιση ; τρόπος
}
ΝέαΕμφάνιση "5", "7" ; Εμφάνιση, τρόπος ως σούμα, προσαρμογή ως ΑριθμοίΩςΧαρακτήρες
ΝέαΕμφάνιση 5, 7 ; Εμφάνιση, τρόπος ως γινόμενο
Τμήμα ΕμφάνισηΩςΧαρακτήρες {
      Γενική Κ=Αληθές
      Τμήμα τρόπος {
            Αν Μέγεθος.Σωρού>=2 Τότε Πέτα 2
            Κ<=Ψευδές
      }
      τρόπος
      Αν Κ Τότε {
            Τύπωσε $(4),Γραφη$(Αριθμός, "0.00")
            Τύπωσε $(0),
      } Αλλιώς {
            Τύπωσε Επαν$("-", Στήλη)
      }
}
ΝέαΕμφάνιση 5, 7 ; Εμφάνιση ως ΕμφάνισηΩςΧαρακτήρες, τρόπος ως διαίρεση
Τμήμα Ακέραιοι {
      Διάβασε χ, υ
      Βάλε Ακ(υ), Ακ(χ)
}
Τμήμα ΑκέραιοιΜεΣτρογγυλοποίηση {
      Διάβασε χ, υ
      Βάλε Στρογγ(υ,0), Στρογγ(χ,0)
}
ΝέαΕμφάνιση 5.5, 7.8 ; Εμφάνιση, τρόπος ως σούμα, προσαρμογή ως ακέραιοι
ΝέαΕμφάνιση 5.5, 7.8 ; Εμφάνιση, τρόπος ως σούμα, προσαρμογή ως ΑκέραιοιΜεΣτρογγυλοποίηση
ΝέαΕμφάνιση 5.5, 7.8 ; Εμφάνιση, τρόπος ως σούμα
Τμήμα ΕμφάνισηΜεΜονάδες {
      Γενική Κ=Αληθές
      Τμήμα τρόπος {
            Αν Μέγεθος.Σωρού>=2 Τότε Πέτα 2
            Κ<=Ψευδές
      }
      τρόπος
      Αν Κ Τότε {
            Τύπωσε $(7),Γραφη$(Αριθμός, "0.00 ")+Γράμμα$
            Τύπωσε $(0),
      } Αλλιώς {
            Τύπωσε Επαν$("-", Στήλη)
      }
}
ΝέαΕμφάνιση
ΝέαΕμφάνιση 5,7, "Km" ; Εμφάνιση ως ΕμφάνισηΜεΜονάδες, τρόπος ως γινόμενο
ΝέαΕμφάνιση 5,7, "Km" ; Εμφάνιση ως ΕμφάνισηΜεΜονάδες, τρόπος ως σούμα
ΝέαΕμφάνιση