θα δούμε πως με τρεις αριθμούς μπορούμε με απλό τρόπο να τους βάλουμε σε μια σειρά από τον μικρότερο στον μεγαλύτερο!
Ξεκινάμε τη γλώσσα (κλικ στο m2000.exe) και γράφουμε μετά το >
>edit A
και ανοίγει ο διορθωτής και αντιγράφουμε το παρακάτω:
Read a, b, c
Local mx, md, mn
If a>b Then {
If a>c Then {
mx=a : If b>c Then { md=b : mn=c } Else { md=c : mn=b }
} Else {mx=c : md=a : mn=b}
} Else.if a>c Then {
mx=b : md=a : mn=c
} Else.if b>c Then {
mx=b : md=c : mn=a
} Else {
mx=c : md=b : mn=a
}
Print "min", mn
Print "middle", md
Print "max", mx
με πλήκτρο Esc γυρνάμε στη γραμμή εντολών
δοκιμάζουμε με το A και τρια νούμερα (χωρίζοντάς τα με κόμμα ",")
>A 1,4,3
Παραλαγή χωρίς τη χρήση τοπικών μεταβλητών, αλλά με τη χρήση του σωρού. Η εντολή Push (Βάλε) βάζει πάντα στην κορυφή, οπότε Push 1,2 θα έχει το 2 στην κορυφή (τελευταίο που μπαίνει θα βγαίνει πρώτο LIFO)
>edit b
Read a, b, c
If a>b Then {
If a>c Then {
Push a : If b>c Then { Push b,c } Else Push c,b
} Else Push c, a, b
} Else.if a>c Then {
Push b, a, c
} Else.if b>c Then {
Push b, c, a
} Else Push c, b, a
Print "min", Number
Print "middle", Number
Print "max", Number
με πλήκτρο Esc γυρνάμε στη γραμμή εντολών
>B 4,100,24
Παρατηρούμε ότι και στα δυο προγράμματα οι λύσεις είναι έξι, και αν προσέξουμε το κάθε πρόγραμμα θα τις δούμε. Παρακάτω με πλάγια γράμματα. (το πρώτο Push a θα μπορούσε να πάει στα άλλα δύο ως Push a,b,c και Push a,c,b)
Πράγματι δεν μπορούμε να έχουμε περισσότερους συνδυασμούς (λύσεις) για τρια νούμερα.
Read a, b, c
If a>b Then {
If a>c Then {
If b>c Then { Push α,b,c } Else Push α,c,b
} Else Push c, a, b
} Else.if a>c Then {
Push b, a, c
} Else.if b>c Then {
Push b, c, a
} Else Push c, b, a
Print "min", Number
Print "middle", Number
Print "max", Number
Ο Σωρός τιμών κρατάει τις τιμές μέχρι να τις πάρουμε ή να τον αδειάσουμε. Εδώ δίνουμε εντολές στη γραμμή εντολών της Μ2000: (μετά το σήμα > )
>Push 1,2,3
>Stack
3 2 1
>Read A
>Print A
3
>Stack
2 1
>Flush
>Stack
δεν μας δείχνει τίποτα (κενή γραμμή), οι τιμές 2 και 1 χάθηκαν πια.
Παρατηρούμε ότι τα προγράμματα Α και Β διαφέρουν ουσιαστικά στην χρήση ή μη τριών μεταβλητών, των mx, md, mn. Δηλώνονται τοπικές στη Β με έναν απλό τρόπο με την εντολή local. Ουσιαστικά το Α έχει τρεις τοπικές, τις a,b,c ενώ το B έχει έξι (a,b,c,mx,md,mn).
Στη Β γίνεται χρήση του σωρού τιμών, του ίδιου σωρού που περνάμε τιμές στη B (ή το τμήμα B κατά την ορολογία της Μ2000). Κάθε φορά που θέλουμε να διαβάσουμε το νούμερο-αποτέλεσμα χρησιμοποιούμε την Number (Αριθμός) η οποία βγάζει την κορυφή του σωρού (Δίνει λάθος αν ο σωρός είναι άδειος ή αν η κορυφή δεν είναι αριθμός).
Ο Σωρός τιμών στην Μ2000 παίρνει διάφορα είδη εκτός από αριθμούς και δεν λέγεται στοίβα που φαίνεται να είναι καταλληλότερη ονομασία ως LIFO, γιατί είναι πιο σύνθετος, για τέσσερις λόγους: Πρώτον έχει FIFO λειτουργία άμεσα, δεύτερον έχει ανάγνωση από θέση, τρίτον έχει μετακίνηση από και προς την κορυφή οποιουδήποτε στοιχείου, ή ομάδα στοιχείων, και τέλος τέταρτον τα στοιχεία μποορεί να μην είναι ίδιου είδους. Στοιχείο μπορεί να είναι αριθμός, αλφαριθμητικό, έγγραφο (είδος αντικειμένου), ομάδα (το βασικό αντικείμενο της Μ2000), λάμδα συνάρτηση, γεγονός (άλλο αντικείμενο), πίνακας, κατάσταση (είδος λίστας), διάρθρωση (είδος λίστας). Για το λόγο αυτό λέμε ότι έχουμε Σωρό τιμών και όχι στοίβα. Παρόλα αυτά στα αγγλικά χρησιμοποιώ την εντολή Σωρός ως Stack (στοίβα). Αυτό δεν είναι απαραίτητα λάθος. Στα αναγνωριστικά των εντολών δεν παίζει άμεσο ρόλο η ερμηνεία ενός λεξικού αλλά η ερμηνεία του εγχειριδίου της γλώσσας.
>Flush
>Push 1,2,3
Μπορούμε να χρησιμοποιούμε το ? για Print ή Τύπωσε
>? stackitem(1), stackitem(2)
3 2
Διαβάσαμε με δείκτη (η κορυφή είναι πάντα στο 1), αλλά δεν σηκώσαμε κάτι
>Drop
>? stackitem(1), stackitem(2)
2 1
Τώρα πετάξαμε τη κορυφή 3 και έχουμε νέα κορυφή το 2 και ακολουθεί το 1
>Data 0, -1
>Stack
2 1 0 -1
Η εντολή Data βάζει πάντα στο τέλος! Οπότε το τελευταίο που βάζει θα είναι τελευταίο στο σωρό (ή στοίβα αν θέλετε)
Τώρα το Α θα το αλλάξουμε έτσι:
Local mx, md, mn
If stackitem(1)>stackitem(2) Then {
If stackitem(1)>stackitem(3) Then {
read mx : If stackitem(1)>stackitem(2) Then { read md, mn } Else { read mn, md }
} Else { read md, mn, mx}
} Else.if stackitem(1)>stackitem(3) Then {
read md, mx, mn
} Else.if stackitem(2)>stackitem(3) Then {
read mn, mx, md
} Else {
read mn, md,mx
}
Print "min", mn
Print "middle", md
Print "max", mx
Βλέπουμε ότι δεν διαβάζουμε τα a,b,c και τα αφήνουμε όπως έχουν για να τα διαβάσουμε στις τελικές μεταβλητές mn, md, mx
Μπορούμε όμως να μην χρησιμοποιήσουμε ούτε τις τρεις μεταβλητές, παρά μόνο το σωρό τιμών! Την κορυφή την σηκώνουμε με την Number αλλά την διαβάζουμε με την stacitem(1), και μπορούμε με την shift να την μεταθέσουμε στην Ν θέση, και με την shiftback να φέρουμε ως κορυφή το στοιχείο στη Ν θέση (δεύτερη παράμετρος σημαίνει πόσες φορές θέλουμε να γίνει)
Μπορούμε να γράψουμε το τμήμα c
>edit c
If stackitem(1)>stackitem(2) Then {
If stackitem(1)>stackitem(3) Then {
shiftback 3 : If stackitem(1)>stackitem(2) then shiftback 2
} Else { shiftback 2}
} Else.if stackitem(1)>stackitem(3) Then {
shiftback 2,2
} Else.if stackitem(2)>stackitem(3) Then {
shift 3
shiftback 2
}
Print "min", Number
Print "middle", Number
Print "max", Number
με Esc βγαίνουμε από τον διορθωτή
΄Φαίνεται πιο μαζεμένος ο κώδικας, αλλά σίγουρα πιο δυσνόητος. Αφαιρέσαμε πολλά ονόματα και αντικαταστήσαμε με ονόματα με δείκτες.
βάλτε εντολές Stack να δείτε τις μετακινήσεις μετά από τις Shift και ShiftBack.
Μπορείτε να σώσεται ότι έχετε γράψει, να το σβήσετε στον μεταφραστή, να αδειάσετε τον σωρό και να το ξαναφορτώσετε. (με Ctrl + A ξανασώνουμε ό,τι έχουμε φορτώσει με την Load)
>Save example1
>New
>Flush
>Load example1
>Modules ?
Επίσης κάθε τμήμα που τρέχουμε μπορεί να τρέξει με την Test (έστω ονομάσαμε c το τελευταίο τμήμα)
>Test c 1,4,2
Θα ανοίξει μια φόρμα και κάνουμε βηματική εκκίνηση. Παρατηρούμε το σωρό (αν κάνουμε αριστερό κλικ πάνω στην επιγραφή Next θα αλλάξει η προβολή από σωρό σε κώδικα που εκτελείται, ενώ στα κίτρινα "πλήκτρα", το Next Step κάνει εκτέλεση του επόμενου βήματος).
(Μπορούμε να αλλάζουμε τη φόρμα του τερματικού της Μ2000 σε αριθμό γραμμών και χαρακτήρων με την εντολή Form. Πχ Form 80,60 θα δώσει φόρμα με 80 χαρακτήρες με 60 γραμμές)
Ξεκινάμε τη γλώσσα (κλικ στο m2000.exe) και γράφουμε μετά το >
>edit A
και ανοίγει ο διορθωτής και αντιγράφουμε το παρακάτω:
Read a, b, c
Local mx, md, mn
If a>b Then {
If a>c Then {
mx=a : If b>c Then { md=b : mn=c } Else { md=c : mn=b }
} Else {mx=c : md=a : mn=b}
} Else.if a>c Then {
mx=b : md=a : mn=c
} Else.if b>c Then {
mx=b : md=c : mn=a
} Else {
mx=c : md=b : mn=a
}
Print "min", mn
Print "middle", md
Print "max", mx
με πλήκτρο Esc γυρνάμε στη γραμμή εντολών
δοκιμάζουμε με το A και τρια νούμερα (χωρίζοντάς τα με κόμμα ",")
>A 1,4,3
Παραλαγή χωρίς τη χρήση τοπικών μεταβλητών, αλλά με τη χρήση του σωρού. Η εντολή Push (Βάλε) βάζει πάντα στην κορυφή, οπότε Push 1,2 θα έχει το 2 στην κορυφή (τελευταίο που μπαίνει θα βγαίνει πρώτο LIFO)
>edit b
Read a, b, c
If a>b Then {
If a>c Then {
Push a : If b>c Then { Push b,c } Else Push c,b
} Else Push c, a, b
} Else.if a>c Then {
Push b, a, c
} Else.if b>c Then {
Push b, c, a
} Else Push c, b, a
Print "min", Number
Print "middle", Number
Print "max", Number
με πλήκτρο Esc γυρνάμε στη γραμμή εντολών
>B 4,100,24
Παρατηρούμε ότι και στα δυο προγράμματα οι λύσεις είναι έξι, και αν προσέξουμε το κάθε πρόγραμμα θα τις δούμε. Παρακάτω με πλάγια γράμματα. (το πρώτο Push a θα μπορούσε να πάει στα άλλα δύο ως Push a,b,c και Push a,c,b)
Πράγματι δεν μπορούμε να έχουμε περισσότερους συνδυασμούς (λύσεις) για τρια νούμερα.
Read a, b, c
If a>b Then {
If a>c Then {
If b>c Then { Push α,b,c } Else Push α,c,b
} Else Push c, a, b
} Else.if a>c Then {
Push b, a, c
} Else.if b>c Then {
Push b, c, a
} Else Push c, b, a
Print "min", Number
Print "middle", Number
Print "max", Number
Ο Σωρός τιμών κρατάει τις τιμές μέχρι να τις πάρουμε ή να τον αδειάσουμε. Εδώ δίνουμε εντολές στη γραμμή εντολών της Μ2000: (μετά το σήμα > )
>Push 1,2,3
>Stack
3 2 1
>Read A
>Print A
3
>Stack
2 1
>Flush
>Stack
δεν μας δείχνει τίποτα (κενή γραμμή), οι τιμές 2 και 1 χάθηκαν πια.
Παρατηρούμε ότι τα προγράμματα Α και Β διαφέρουν ουσιαστικά στην χρήση ή μη τριών μεταβλητών, των mx, md, mn. Δηλώνονται τοπικές στη Β με έναν απλό τρόπο με την εντολή local. Ουσιαστικά το Α έχει τρεις τοπικές, τις a,b,c ενώ το B έχει έξι (a,b,c,mx,md,mn).
Στη Β γίνεται χρήση του σωρού τιμών, του ίδιου σωρού που περνάμε τιμές στη B (ή το τμήμα B κατά την ορολογία της Μ2000). Κάθε φορά που θέλουμε να διαβάσουμε το νούμερο-αποτέλεσμα χρησιμοποιούμε την Number (Αριθμός) η οποία βγάζει την κορυφή του σωρού (Δίνει λάθος αν ο σωρός είναι άδειος ή αν η κορυφή δεν είναι αριθμός).
Ο Σωρός τιμών στην Μ2000 παίρνει διάφορα είδη εκτός από αριθμούς και δεν λέγεται στοίβα που φαίνεται να είναι καταλληλότερη ονομασία ως LIFO, γιατί είναι πιο σύνθετος, για τέσσερις λόγους: Πρώτον έχει FIFO λειτουργία άμεσα, δεύτερον έχει ανάγνωση από θέση, τρίτον έχει μετακίνηση από και προς την κορυφή οποιουδήποτε στοιχείου, ή ομάδα στοιχείων, και τέλος τέταρτον τα στοιχεία μποορεί να μην είναι ίδιου είδους. Στοιχείο μπορεί να είναι αριθμός, αλφαριθμητικό, έγγραφο (είδος αντικειμένου), ομάδα (το βασικό αντικείμενο της Μ2000), λάμδα συνάρτηση, γεγονός (άλλο αντικείμενο), πίνακας, κατάσταση (είδος λίστας), διάρθρωση (είδος λίστας). Για το λόγο αυτό λέμε ότι έχουμε Σωρό τιμών και όχι στοίβα. Παρόλα αυτά στα αγγλικά χρησιμοποιώ την εντολή Σωρός ως Stack (στοίβα). Αυτό δεν είναι απαραίτητα λάθος. Στα αναγνωριστικά των εντολών δεν παίζει άμεσο ρόλο η ερμηνεία ενός λεξικού αλλά η ερμηνεία του εγχειριδίου της γλώσσας.
>Flush
>Push 1,2,3
Μπορούμε να χρησιμοποιούμε το ? για Print ή Τύπωσε
>? stackitem(1), stackitem(2)
3 2
Διαβάσαμε με δείκτη (η κορυφή είναι πάντα στο 1), αλλά δεν σηκώσαμε κάτι
>Drop
>? stackitem(1), stackitem(2)
2 1
Τώρα πετάξαμε τη κορυφή 3 και έχουμε νέα κορυφή το 2 και ακολουθεί το 1
>Data 0, -1
>Stack
2 1 0 -1
Η εντολή Data βάζει πάντα στο τέλος! Οπότε το τελευταίο που βάζει θα είναι τελευταίο στο σωρό (ή στοίβα αν θέλετε)
Τώρα το Α θα το αλλάξουμε έτσι:
Local mx, md, mn
If stackitem(1)>stackitem(2) Then {
If stackitem(1)>stackitem(3) Then {
read mx : If stackitem(1)>stackitem(2) Then { read md, mn } Else { read mn, md }
} Else { read md, mn, mx}
} Else.if stackitem(1)>stackitem(3) Then {
read md, mx, mn
} Else.if stackitem(2)>stackitem(3) Then {
read mn, mx, md
} Else {
read mn, md,mx
}
Print "min", mn
Print "middle", md
Print "max", mx
Βλέπουμε ότι δεν διαβάζουμε τα a,b,c και τα αφήνουμε όπως έχουν για να τα διαβάσουμε στις τελικές μεταβλητές mn, md, mx
Μπορούμε όμως να μην χρησιμοποιήσουμε ούτε τις τρεις μεταβλητές, παρά μόνο το σωρό τιμών! Την κορυφή την σηκώνουμε με την Number αλλά την διαβάζουμε με την stacitem(1), και μπορούμε με την shift να την μεταθέσουμε στην Ν θέση, και με την shiftback να φέρουμε ως κορυφή το στοιχείο στη Ν θέση (δεύτερη παράμετρος σημαίνει πόσες φορές θέλουμε να γίνει)
Μπορούμε να γράψουμε το τμήμα c
>edit c
If stackitem(1)>stackitem(2) Then {
If stackitem(1)>stackitem(3) Then {
shiftback 3 : If stackitem(1)>stackitem(2) then shiftback 2
} Else { shiftback 2}
} Else.if stackitem(1)>stackitem(3) Then {
shiftback 2,2
} Else.if stackitem(2)>stackitem(3) Then {
shift 3
shiftback 2
}
Print "min", Number
Print "middle", Number
Print "max", Number
με Esc βγαίνουμε από τον διορθωτή
΄Φαίνεται πιο μαζεμένος ο κώδικας, αλλά σίγουρα πιο δυσνόητος. Αφαιρέσαμε πολλά ονόματα και αντικαταστήσαμε με ονόματα με δείκτες.
βάλτε εντολές Stack να δείτε τις μετακινήσεις μετά από τις Shift και ShiftBack.
Μπορείτε να σώσεται ότι έχετε γράψει, να το σβήσετε στον μεταφραστή, να αδειάσετε τον σωρό και να το ξαναφορτώσετε. (με Ctrl + A ξανασώνουμε ό,τι έχουμε φορτώσει με την Load)
>Save example1
>New
>Flush
>Load example1
>Modules ?
Επίσης κάθε τμήμα που τρέχουμε μπορεί να τρέξει με την Test (έστω ονομάσαμε c το τελευταίο τμήμα)
>Test c 1,4,2
Θα ανοίξει μια φόρμα και κάνουμε βηματική εκκίνηση. Παρατηρούμε το σωρό (αν κάνουμε αριστερό κλικ πάνω στην επιγραφή Next θα αλλάξει η προβολή από σωρό σε κώδικα που εκτελείται, ενώ στα κίτρινα "πλήκτρα", το Next Step κάνει εκτέλεση του επόμενου βήματος).
(Μπορούμε να αλλάζουμε τη φόρμα του τερματικού της Μ2000 σε αριθμό γραμμών και χαρακτήρων με την εντολή Form. Πχ Form 80,60 θα δώσει φόρμα με 80 χαρακτήρες με 60 γραμμές)
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.