Μέρος 3ο (προηγούμενο, επόμενο)
Τα προγράμματα σε αυτή τη σελίδα αναφέρονται σε δημοσιεύσεις που έχουν γίνει στο http://alkisg.mysch.gr/steki/index.php αλλά η διαχειριστική ομάδα του συγκεκριμένου τόπου θέλει να τα αφαιρέσει, με τη δικαιολογία ότι "αποσπούν" την προσοχή των μαθητών και των καθηγητών από τα προβλεπόμενα. Σέβομαι την άποψη του διαχειριστή που επικοινώνησε μαζί μου, και για "ιστορικούς λόγους" θα μπουν τα προγράμματα εδώ:
τα προγράμματα βρίσκονται εδώ σε αρχείο zip.
Προγράμματα:
BRAINF_CK_goodby_world.glo,
BRAINF_CK_even_odd.glo,
BRAINF_CK_fibonacci.glo
Μια και γίνεται λόγος για την ΕΠΙΛΕΞΕ τελευταία, σκέφτηκα ότι ένα σοβαρό πρόγραμμα (μεγάλο δηλαδή) που χρησιμοποιεί την επίλεξε την δικαιώνει!
Το πρόγραμμα τρέχει την γλώσσα BRAINF**K (γράφεται με διάφορους τρόπους), η οποία έχει οκτώ σύμβολα και ένα κρυφό για το τέλος προγράμματος.
Στοιχεία για τη γλώσσα μπορεί κανείς να βρει εδώ: BRAINF**K
Σύμβολο | Ερμηνεία
< μετακίνηση του δείκτη δεξιά
> μετακίνηση του δείκτη αριστερά
+ αύξηση στη μνήμη[δείκτης] κατά 1
- μείωση στη μνήμη[δείκτης] κατά 1
. εξαγωγή του συμβόλου από τη μνήμη[δείκτης]
, εισαγωγή συμβόλου στη μνήμη[δείκτης]
[ μετακίνηση προς το τέλος στη θέση μετά το αντίστοιχο ] αν στο μνήμη[δείκτης] έχουμε μηδέν
] μετακίνηση προς την αρχή στη θέση πριν το αντίστοιχο [ αν στο μνήμη[δείκτης] δεν έχουμε μηδέν
Το πρόβλημα με τη ΓΛΩΣΣΑ είναι ότι δεν έχει κατάλληλες συναρτήσεις αλφαριθμητικών. Επίσης το πρόβλημα στον διερμηνευτή είναι στην εισαγωγή στοιχείων από το αρχείο, γιατί αν θέλουμε να εισάγουμε ένα διάστημα ΔΕΝ γίνεται, γιατί καθαρίζει τα "ακόλουθα διαστήματα" ή trailing spaces, οπότε αν δώσουμε ένα διάστημα θα το "χάσουμε".
Το πρόγραμμα χρειάζεται ένα πίνακα αλφαριθμητικών (126 σε αριθμό), για να κάνει τις μετατροπές από αριθμό σε ascii 7bit (ή ANSI κωδικοποίηση) και το αντίστροφό. Οι χαρακτήρες control+J γράφονται ^J (είναι το 10, ή new line).
Αρχικά είχα φτιάξει ένα με ελληνικά (255 αλφαριθμητικά) αλλά το μείωσα σε 126 (το 0 και το 127 δεν εμφανίζονται)
Στο συνημμένο υπάρχουν τρια προγράμματα, που περιέχουν το ίδιο πρόγραμμα με διαφορετικά αρχεία εισόδου.
Σε κάθε αρχείο εισόδου υπάρχουν τα απαραίτητα για την εκτέλεση του προγράμματος.
ο κώδικας έχει τρεις σταθερές που ρυθμίζουν την έκδοση της γλώσσας, ανάλογα με το αν θέλουμε εξαγωγή Ascii, ή αριθμού, ή αν θέλουμε το μέγεθος κελιού με μέγιστο τα 126 ή 255 ή 65535 ή 2147483647 (31bit), καθώς και το μέγεθος της μνήμης (των αριθμών των κελιών)
Το πρόγραμμα γράφεται στις πρώτες θέσεις της μνήμης και ο υπόλοιπος χώρος είναι για χρήση από το πρόγραμμα. Δεν μπορούμε να γράψουμε πάνω στο πρόγραμμα.
1ο Πρόγραμμα:
2ο Πρόγραμμα
Μας ζητάει έναν αριθμό (δίνουμε enter κάθε ψηφίο και στο τέλος enter ή ^j και enter)
Μας γυρνάει 1 αν είναι μονός ή 0 αν είναι ζυγός ο αριθμός
3ο Πρόγραμμα
Ακολουθία fibonacci (αν βάλουμε και άλλα + στην αρχή θα βγάλει και άλλα νούμερα. Σε αυτό έχουμε αλλάξει το κελί και το ascii σε false για να πάρουμε άμεσα τα νούμερα.
Θα βγει μήνυμα ότι κάνει πάνω από 100000 επαναλήψεις αλλά δεν πειράζει. Η γλώσσα αυτή μόνο αυξάνει ή μειώνει κατά ένα!
Πρόγραμματα
γρηγορη_ταξινόμηση_στοίβας.glo
γρηγορη_ταξινόμηση_στοίβας2.glo
Μια στοίβα μπορεί να ταξινομηθεί χωρίς να πειράξουμε τα στοιχεία της, αλλά να την αναδιατάξουμε. Εδώ η αναδιάταξη γίνεται με δυο διαδικασίες τη ΦΕΡΕ που φέρνει στην κορυφή (στην 1 θέση) το ν-οστό στοιχείο, και τη ΦΕΡΕΠΙΣΩ που κάνει τη τρέχουσα κορυφή ως ν-οστό στοιχείο.
Για να μην έχουμε αναδρομή, χρησιμοποιούμε μια δεύτερη στοίβα, την στοίβα2, όπου βάζουμε δυάδες τιμών, το διάστημα που θα γίνει ταξινόμηση (έτσι δουλεύει η γρήγορη ταξινόμηση). Ξεκινάμε την ταξινόμηση βάζοντας στη στοίβα2 το αρχικό διάστημα (1,20), γιατί έχουμε 20 στοιχεία (20 πόλεις) για ταξινόμηση. Η δεύτερη στοίβα επειδή θα αυξομειώνεται λειτουργεί με το σύστημα ελεύθερων κόμβων. Η πρώτη στοίβα δεν αλλάζει μέγεθος, απλά γίνονται μετακινήσεις, ενώ πρόσκαιρα βγαίνει εκτός το πρώτο στοιχείο (το μεσαίο κάθε φορά του διαστήματος μου ταξινομούμε), και μετά πάει στην κανονική θέση του. Η γρήγορη ταξινόμηση για οποιοδήποτε διάστημα (μεγαλύτερο από μέγεθος 1) βρίσκει άμεσα την θέση του αρχικά "μεσαίου" στοιχείου. ενώ αφήνει το πολύ δυο λίστες, μια για τα μη ταξινομημένα στοιχεία, μικρότερα από το "μεσαίο", και τα μη ταξινομημένα στοιχεία, μεγαλύτερα του "μεσαίου". Επειδή οι ποσότητες αυτών διαφέρουν ενδέχεται να μην υπάρχει μια από τις λίστες γιατί το 'μεσαίο" θα είναι σε ένα άκρο.
Στο συνημμένο αρχείο είναι το πρόγραμμα σε ΓΛΩΣΣΑ το οποίο περιέχει και τις 20 πόλεις για ταξινόμηση! Αν αλλάξουμε το < σε > στην μοναδική σύγκριση πόλεων θα πάρουμε την ταξινόμηση σε φθίνουσα τάξη.
Υπάρχει και μια δεύτερη εκδοχή, πιο γρήγορη, με μια νέα διαδικασία που κάνει μεταφορά από το ν-οστό στο κ-οστό όταν ν<κ με ένα πέρασμα (ενώ πριν μετέφερα στη κορυφή από το ν-οστό και το προωθούσα στο κ-οστό)
Η ΓΛΩΣΣΑ δεν υποστηρίζει τα αλφαριθμητικά, παρά μόνο για συγκρίσεις. Ούτε καν για ένωση. Λείπουν βασικά πράγματα. Όμως μπορούμε να φτιάξουμε δικά μας αλφαριθμητικά και με δικές μας συναρτήσεις και διαδικασίες.
Το πρόγραμμα έχει ένα πίνακα για 100 ειδικά αλφαριθμητικά, που αρχικά έχουν μηδενικό μήκος. Επιπλέον έχει μια μνήμη 500 χαρακτήρων. Κάθε αλφαριθμητικό παίρνει από την μνήμη όσες θέσεις χρειάζεται. Κάθε χαρακτήρας έχει ένα δείκτη στον επόμενο, εκτός από τον τελευταίο που δείχνει το 0 (null). Με αυτόν τον τρόπο δεν έχουμε κατ΄ ανάγκη αλφαριθμητικά με συνεχόμενους χαρακτήρες στη μνήμη, αλλά όμως οι χαρακτήρες είναι σε διάταξη, με τους δείκτες.
Παρακάτω είναι η εξαγωγή του προγράμματος:
Εισαγωγή τριών αλφαριθμητικών - χαρακτήρα προς χαρακτήρα
ο χαρακτήρας @ είναι το τέλος εισαγωγής αλφαριθμητικού
ο χαρακτήρας @@ είναι το διάστημα ....
αλλιώς δεν το διαβάζει από το αρχείο εισόδου
1) 'αβγδ εζη'
2) 'αβγ'
3) 'δεζη'
Αντέγραψε 1ο, από 1η θέση, 2 χαρακτήρες στο 4ο 'αβ'
Πρόσθεσε 3ο, από 2η θέση, 2 χαρακτήρες στο 4ο 'αβεζ'
Διέγραψε 3ο - Μήκος 0
Αντέγραψε 1ο, από 1η θέση, 2 χαρακτήρες στο 3ο 'αβ'
Πέντε φορές: Πρόσθεσε 3ο στο 5ο και 2ο από 3η θέση και μετά στο 5ο
Πρόσθεσε τις σταθερές 'Ο', 'Κ', '.','!' στο 6ο
Πρόσθεσε τον ακέραιο -30 στο 7ο
Πρόσθεσε τον ακέραιο 123009876 στο 8ο
Εμφάνιση των 8 πρώτων αλφαριθμητικών
1) 'αβγδ εζη' με μήκος 8 χαρακτήρες
2) 'αβγ' με μήκος 3 χαρακτήρες
3) 'αβ' με μήκος 2 χαρακτήρες
4) 'αβεζ' με μήκος 4 χαρακτήρες
5) 'αβγαβγαβγαβγαβγ' με μήκος 15 χαρακτήρες
6) 'ΟΚ.!' με μήκος 4 χαρακτήρες
7) '-30' με μήκος 3 χαρακτήρες
8) ' 123009876' με μήκος 10 χαρακτήρες
Αναζήτηση του 2ου σε όλα τα αλφαριθμητικά σε όλες τις θέσεις
Βρέθηκε στο 1ο στη θέση 1
Βρέθηκε στο 2ο στη θέση 1
Βρέθηκε στο 5ο στη θέση 1
Βρέθηκε στο 5ο στη θέση 4
Βρέθηκε στο 5ο στη θέση 7
Βρέθηκε στο 5ο στη θέση 10
Βρέθηκε στο 5ο στη θέση 13
Συγκρίσεις (του 2ου με όλα)
'αβγδ εζη' > 'αβγ'
'αβγ' = 'αβγ'
'αβ' < 'αβγ'
'αβεζ' > 'αβγ'
'αβγαβγαβγαβγαβγ' > 'αβγ'
'ΟΚ.!' < 'αβγ'
'-30' < 'αβγ'
' 123009876' < 'αβγ'
Γράφουμε ανάποδα ένα προς ένα τους χαρακτήρες του 7ου αλφαριθμητικού
03-
Με χρήση της βιβλιοθήκης αλφαριθμητικών (έχουν αφαιρεθεί ό,τι δεν χρειάζονταν)
Έξοδος του προγράμματος
Μετατροπή ακεραίου 65279 σε βάση:2
αποτέλεσμα: 1111111011111111
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 65279
Μετατροπή ακεραίου 65279 σε βάση:8
αποτέλεσμα: 177377
Μετατροπή από βάση 8 σε βάση 10:
αποτέλεσμα: 65279
Μετατροπή ακεραίου 65279 σε βάση:16
αποτέλεσμα: FEFF
Μετατροπή από βάση 16 σε βάση 10:
αποτέλεσμα: 65279
Μετατροπή ακεραίου 6917529027641081871 σε βάση:2
αποτέλεσμα: 110000000000000000000000000000000000000000000000000000000001111
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 6917529027641081871
Μετατροπή ακεραίου 6917529027641081871 σε βάση:8
αποτέλεσμα: 600000000000000000017
Μετατροπή από βάση 8 σε βάση 10:
αποτέλεσμα: 6917529027641081871
Μετατροπή ακεραίου 6917529027641081871 σε βάση:16
αποτέλεσμα: 600000000000000F
Μετατροπή από βάση 16 σε βάση 10:
αποτέλεσμα: 6917529027641081871
Πράξεις XOR, AND, OR με αναπαράσταση σε δυαδικό.
ΕΛΕΥΘΕΡΑ ΑΛΦΑΡΙΘΜΗΤΙΚΑ:100
ΕΛΕΥΘΕΡΗ ΜΝΗΜΗ:500 ΧΑΡΑΚΤΗΡΕΣ
Δώσε δύο θετικούς ακέραιους
4232320808
2132133123
Μετατροπή από βάση 10 σε βάση 2, προσθήκη αρχικών 0:
Α.....11111100010001000001011100101000
B.....01111111000101011100010100000011
XOR =10000011010100011101001000101011
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 2203177515
Α.....11111100010001000001011100101000
B.....01111111000101011100010100000011
OR =11111111010101011101011100101011
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 4283815723
Α.....11111100010001000001011100101000
B.....01111111000101011100010100000011
AND =01111100000001000000010100000000
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 2080638208
ΕΛΕΥΘΕΡΑ ΑΛΦΑΡΙΘΜΗΤΙΚΑ:100
ΕΛΕΥΘΕΡΗ ΜΝΗΜΗ:500 ΧΑΡΑΚΤΗΡΕΣ
Η βιβλιοθήκη αλφαριθμητικών έχει εμπλουτιστεί. Επίσης υπάρχει σύστημα για δυναμική χρήση των αλφαριθμητικών (πριν είχαν μόνο δυναμική μνήμη χαρακτήρων). Τώρα μπορούμε σε διαδικασίες να χρησιμοποιούμε αλφαριθμητικά, και να τα απελευθερώνουμε πριν την επιστροφή.
Έχουμε 100 το πολύ αλφαριθμητικά, με 500 το πολύ χαρακτήρες. Αν ζητηθεί κάτι παραπάνω, τότε ο ΕΛ (για τους χαρακτήρες ή ΕΛ_ΑΛΦΑ (για τα αλφαριθμητικά) επειδή θα έχουν το μηδέν, θα πάνε στους πίνακες και θα βγει λάθος.
Δεν χρειάζεται να αντιμετωπιστεί το λάθος, το αφήνουμε να συμβεί. Σημαίνει ότι το πρόγραμμα έφτασε στα όριά του. Αν πχ το αντιμετωπίζαμε τότε θα έπρεπε με πολύπλοκο τρόπο να δείξουμε ένα μήνυμα ότι το πρόγραμμα δεν μπορεί να προχωρήσει! Δηλαδή το ίδιο πράγμα, θα σταματήσει το πρόγραμμα, αλλά πιο πολιτισμένο!
Παρακάτω φαίνονται οι ορισμοί των πινάκων. Οι ΚΟΜ, ΜΝΗΜΗ και η μεταβλητή ΕΛ είναι για τους χαρακτήρες, ενώ το ΑΛΦΑ περιέχει του δείκτες λιστών που κάνουμε στο ΚΟΜ, και το Δ είναι η λίστα ελεύθερων αλφαριθμητικών, με πρώτο ελεύεθερο το ΕΛ_ΑΛΦΑ
πχ αν το ΟΚ είναι γραμμένο στο ΑΛΦΑ[1] σημαίνει ότι το Δ[1] δεν ανήκει στη λίστα ελεύθερων αλφαριθμητικών. Επίσης το ΜΝΗΜΗ[ΑΛΦΑ[1]] έχει το "Ο" και το ΜΝΗΜΗ[ΚΟΜ[ΑΛΦΑ[1]]] έχει το "1". Το ΚΟΜ[ΚΟΜ[ΑΛΦΑ[1]]]=0 και σημαίνει ότι δεν έχει άλλους χαρακτήρες. θα μπορούσε το ΑΛΦΑ και το Δ να είναι το ίδιο, αλλά θα είχαμε δυο διαφορετικούς τύπους δεικτών, ένας που συνδέει λίστες έξω από τον πίνακα ΑΛΦΑ και ένας που συνδέει τα ελεύθερα στοιχεία του ΑΛΦΑ. Το πρόβλημα θα παρουσιαστεί στην αρχικοποίηση. Τώρα ο ΑΛΦΑ έχει μόνο δείκτες προς το ΚΟΜ ή το 0 που σημαίνει κενό αλφαριθμητικό. Αν κάπου γίνει λάθος θα δούμε περισσότερους ή λιγότερους χαρακτήρες, ενώ αν είχαμε και τη λίστα ελεύθερων τότε μπορεί να διαβάζαμε από λάθος δείκτη προς ελεύθερο ως δείκτη προς το ΚΟΜ, προς τους χσρακτήρες και να πάρουμε ό,τι να ειναι.
ΑΚΕΡΑΙΕΣ: ΚΟΜ[500], ΑΛΦΑ[100], ΕΛ, ΕΛ_ΑΛΦΑ, Δ[100]
ΧΑΡΑΚΤΗΡΕΣ: ΜΝΗΜΗ[500]
! ΒΙΒΛΙΟΘΗΚΗ ΑΛΦΑΡΙΘΜΗΤΙΚΩΝ BUGMAN
! ΤΜΗΜΑ ΧΕΙΡΙΣΜΟΣ ΔΥΑΔΙΚΩΝ ΑΡΙΘΜΩΝ ΩΣ ΑΛΦΑΡΙΘΜΗΤΙΚΑ
! ΔΙΑΔΙΚΑΣΙΑ ΑφαίρεσεΑρχικάΜηδέν(ΛΕΞΗ1, ΕΛ, ΚΟΜ, ΜΝΗΜΗ)
! Η ΛΕΞΗ1 είναι κάποιο ΑΛΦΑ[Χ]
! Αφαιρούμε τα 0 αριστερά από τον αριθμό. Αν ο αριθμός έχει μόνο 0 τότε αφήνει ένα
! ΔΙΑΔΙΚΑΣΙΑ ΑρχικάΜηδέν(ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, Δ, ΕΛ_ΑΛΦΑ, ΑΛΦΑ)
! Το ΠΟΥ είναι ο δείκτης στο ΑΛΦΑ[]
! Προσθέτει 0 αριστερά του αριθμού, ή κόβει τον αριθμό στα 32 δεξιά bit.
! ΔΙΑΔΙΚΑΣΙΑ ΜετατροπήΣεΔυαδικό( Α, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, Δ, ΕΛ_ΑΛΦΑ, ΑΛΦΑ)
! ΔΙΑΔΙΚΑΣΙΑ ΜετατροπήΣεΔεκαδικό( Α, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, Δ, ΕΛ_ΑΛΦΑ, ΑΛΦΑ)
! Το ΠΟΥ είναι ο δείκτης στο ΑΛΦΑ[]
! στη πρώτη δίνουμε το Α και στη δεύτερη παίρνουμε επιστροφή στο Α
! ΣΥΝΑΡΤΗΣΗ ΕΛΕΥΘΕΡΑ_ΑΛΦΑΡΙΘΜΗΤΙΚΑ(ΕΛ_ΑΛΦΑ, Δ): ΑΚΕΡΑΙΑ
! ΓΙΑ ΝΑ ΕΧΟΥΜΕ ΔΥΝΑΜΙΚΑ ΕΠΙΛΕΓΜΕΝΑ ΑΛΦΑΡΙΘΜΗΤΙΚΑ
! ΥΠΑΡΧΕΙ ΤΟ ΕΛ_ΑΛΦΑ ΠΟΥ ΔΙΝΕΙ ΤΟ ΠΡΩΤΟ ΕΛΕΥΘΕΡΟ ΑΛΦΑΡΙΘΜΗΤΙΚΟ
! ΟΣΕΣ ΔΙΑΔΙΚΑΣΙΕΣ ΧΡΗΣΙΜΟΠΟΙΟΥΝ ΤΟ ΑΛΦΑ ΩΣ ΠΑΡΑΜΕΤΡΟ,
! ΣΗΜΑΙΝΕΙ ΟΤΙ ΔΗΜΙΟΥΡΓΟΥΝ ΕΣΩΤΕΡΙΚΑ ΔΙΚΑ ΤΟΥΣ ΑΛΦΑΡΙΘΜΗΤΙΚΑ
! ΤΑ ΟΠΟΙΑ ΤΑ ΚΑΘΑΡΙΖΟΥΝ ΠΡΙΝ ΤΕΡΜΑΤΙΣΟΥΝ ΤΗΝ ΕΚΤΕΛΕΣΗ ΤΟΥΣ
! ΟΙ ΠΑΡΑΚΑΤΩ ΣΥΝΑΡΤΗΣΕΙΣ ΚΑΙ ΔΙΑΔΙΚΑΣΙΕΣ ΔΕΝ ΤΙΣ ΧΡΕΙΑΖΟΝΤΑΙ
! ΔΟΥΛΕΥΟΥΝ ΜΕ ΑΛΦΑΡΙΘΜΗΤΙΚΑ ΠΟΥ ΔΙΝΟΥΜΕ ΩΣ ΠΑΡΑΜΕΤΡΟΥΣ (ΤΟΥΣ ΔΕΙΚΤΕΣ ΤΟΥΣ)
!
! ΓΕΝΙΚΟ ΤΜΗΜΑ ΑΛΦΑΡΙΘΜΗΤΙΩΝ
! ΣΥΝΑΡΤΗΣΗ ΕΛΕΥΘΕΡΗ_ΜΝΗΜΗ(ΕΛ, ΚΟΜ): ΑΚΕΡΑΙΑ
! ΣΥΝΑΡΤΗΣΗ ΜΗΚΟΣ(Ι, ΚΟΜ, ΜΝΗΜΗ): ΑΚΕΡΑΙΑ
! ΜΗΔΕΝΙΚΟΥ ΜΗΚΟΥΣ ΑΛΦΑΡΙΘΜΗΤΙΚΟ ΕΙΝΑΙ ΑΥΤΟ ΠΟΥ ΕΧΕΙ ΤΟ ΑΛΦΑ[Χ] ΜΗΔΕΝ
!
! ΣΥΝΑΡΤΗΣΗ ΧΑΡ(Ι, ΘΕΣΗ, ΚΟΜ, ΜΝΗΜΗ): ΧΑΡΑΚΤΗΡΑΣ
! ΕΠΙΣΤΡΕΦΕΙ ΤΟ ΧΑΡΑΚΤΗΡΑ ΣΤΗ ΘΕΣΗ ΤΟΥ Ι=ΑΛΦΑ[Χ]
! ΔΙΑΔΙΚΑΣΙΑ ΕΜΦ(Ι, ΚΟΜ, ΜΝΗΜΗ)
! ΕΜΦΑΝΙΣΗ ΣΤΗΝ ΚΟΝΣΟΛΑ ΤΟΥ ΤΟΥ Ι=ΑΛΦΑ[Χ] Ι
! ΔΙΑΔΙΚΑΣΙΑ ΑΝΤΕΓΡΑΨΕ(ΛΕΞΗ1, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, ΘΕΣΗ, ΧΑΡ)
! ΑΝΤΙΓΡΑΦΗ ΑΠΟ ΤΟ ΑΛΦΑ[Χ]ΑΠΟ ΤΗ ΘΕΣΗ ΚΑΙ ΓΙΑ ΧΑΡ ΧΑΡΑΚΤΗΡΕΣ ΣΤΟ ΑΛΦΑ[Υ]
! Η ΠΡΟΗΓΟΥΜΕΝΗ ΤΙΜΗ ΤΟΥ ΑΛΦΑ[Υ] ΔΙΑΓΡΑΦΕΤΑΙ
! ΜΠΟΡΟΥΜΕ ΝΑ ΑΝΤΙΓΡΑΨΟΥΜΕ ΑΠΟ ΤΟΝ ΕΑΥΤΟ ΤΟΥ, Χ=Υ
! ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΣΘΕΣΕ(ΛΕΞΗ1, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, ΘΕΣΗ, ΧΑΡ)
! ΠΡΟΣΘΕΤΟΥΜΕ ΣΤΟ ΤΕΛΟΣ ΤΟΥ ΑΛΦΑ[Υ] ΤΟ ΑΛΦΑ[Χ] ΑΠΟ ΤΗ ΘΕΣΗ ΚΑΙ ΓΙΑ ΧΑΡ ΧΑΡΑΚΤΗΡΕΣ
! ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΣΘΕΣΕ_ΣΤΑΘΕΡΑ(ΧΑΡ, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ)
! ΠΡΟΣΘΕΤΟΥΜΕ ΕΝΑΝ ΧΑΡΑΚΤΗΡΑ ΤΟΝ ΧΑΡ ΣΤΟ ΤΕΛΟΣ ΤΟΥ ΑΛΦΑ[Υ]
! ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΣΘΕΣΕ_ΑΚΕΡΑΙΟ(Α, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ)
! ΜΕΤΑΤΡΕΠΕΙ ΕΝΑΝ ΑΡΙΘΜΟ ΣΕ ΧΑΡΑΚΤΗΡΕΣ ΚΑΙ ΤΟΝ ΒΑΖΕΙ ΣΤΟ ΤΕΛΟΣ ΤΟΥ ΑΛΦΑ[Χ]
! ΣΤΟΥΣ ΘΕΤΙΚΟΥΣ ΒΑΖΕΙ ΕΝΑ ΔΙΑΣΤΗΜΑ ΣΤΗΝ ΑΡΧΗ, ΣΤΟΥΣ ΑΡΝΗΤΙΚΟΥΣ ΔΕΝ ΒΑΖΕΙ
! ΔΙΑΔΙΚΑΣΙΑ ΔΙΕΓΡΑΨΕ(ΛΕΞΗ1, ΕΛ, ΚΟΜ, ΜΝΗΜΗ)
! ΕΠΙΣΤΡΕΦΕΙ ΟΛΟΥΣ ΤΟΥΣ ΧΑΡΑΚΤΗΡΕΣ ΣΤΟΥΣ ΕΛΕΥΘΕΡΟΥΣ
! ΤΟ ΑΛΦΑ[Χ] ΓΙΝΕΤΑΙ ΜΗΔΕΝ
! ΣΥΝΑΡΤΗΣΗ ΣΥΓΚΡΙΝΕ(ΛΕΞΗ1, ΛΕΞΗ2, ΚΟΜ, ΜΝΗΜΗ): ΑΚΕΡΑΙΑ
! ΑΝ ΤΟ ΑΛΦΑ[Χ] < ΑΛΦΑ[Υ] ΔΊΝΕΙ ΤΟ -1
! ΑΝ ΕΙΝΑΙ ΙΣΑ ΔΙΝΕΙ ΤΟ 0
! ΑΝ ΤΟ ΑΛΦΑ[Χ] > ΑΛΦΑ[Υ] ΔΙΝΕΙ ΤΟ 1
! ΣΥΝΑΡΤΗΣΗ ΑΝΑΖΗΤΗΣΗ_ΘΕΣΗΣ(ΛΕΞΗ1, ΛΕΞΗ2, ΚΟΜ, ΜΝΗΜΗ, ΑΠΟ_ΘΕΣΗ): ΑΚΕΡΑΙΑ
! ΑΝΑΖΗΤΕΙ ΣΤΗΝ ΑΛΦΑ[Χ] ΤΗΝ ΑΛΦΑ[Υ]
! ΜΠΡΟΡΟΥΜΕ ΝΑ ΟΡΙΣΟΥΜΕ ΘΕΣΗ ΑΠΟ ΤΗΝ ΟΠΟΙΑ ΘΑ ΞΕΚΙΝΑΕΙ Η ΑΝΑΖΗΤΗΣΗ, Η ΤΟ -1
! ΣΥΝΑΡΤΗΣΗ ΑΝΑΖΗΤΗΣΗ_ΘΕΣΗΣ_ΧΑΡΑΚΤΗΡΑ(ΛΕΞΗ1, ΧΑΡ, ΚΟΜ, ΜΝΗΜΗ, ΑΠΟ_ΘΕΣΗ): ΑΚΕΡΑΙΑ
! ΑΝΑΖΗΤΕΙ ΣΤΗΝ ΑΛΦΑ[Χ] ΤΟΝ ΧΑΡΑΚΤΗΡΑ ΧΑΡ
! ΜΠΡΟΡΟΥΜΕ ΝΑ ΟΡΙΣΟΥΜΕ ΘΕΣΗ ΑΠΟ ΤΗΝ ΟΠΟΙΑ ΘΑ ΞΕΚΙΝΑΕΙ Η ΑΝΑΖΗΤΗΣΗ, Η ΤΟ -1
(προηγούμενο, επόμενο)
Τα προγράμματα σε αυτή τη σελίδα αναφέρονται σε δημοσιεύσεις που έχουν γίνει στο http://alkisg.mysch.gr/steki/index.php αλλά η διαχειριστική ομάδα του συγκεκριμένου τόπου θέλει να τα αφαιρέσει, με τη δικαιολογία ότι "αποσπούν" την προσοχή των μαθητών και των καθηγητών από τα προβλεπόμενα. Σέβομαι την άποψη του διαχειριστή που επικοινώνησε μαζί μου, και για "ιστορικούς λόγους" θα μπουν τα προγράμματα εδώ:
τα προγράμματα βρίσκονται εδώ σε αρχείο zip.
BrainF_ck Interpreter σε ΓΛΩΣΣΑ
Προγράμματα:
BRAINF_CK_goodby_world.glo,
BRAINF_CK_even_odd.glo,
BRAINF_CK_fibonacci.glo
Μια και γίνεται λόγος για την ΕΠΙΛΕΞΕ τελευταία, σκέφτηκα ότι ένα σοβαρό πρόγραμμα (μεγάλο δηλαδή) που χρησιμοποιεί την επίλεξε την δικαιώνει!
Το πρόγραμμα τρέχει την γλώσσα BRAINF**K (γράφεται με διάφορους τρόπους), η οποία έχει οκτώ σύμβολα και ένα κρυφό για το τέλος προγράμματος.
Στοιχεία για τη γλώσσα μπορεί κανείς να βρει εδώ: BRAINF**K
Σύμβολο | Ερμηνεία
< μετακίνηση του δείκτη δεξιά
> μετακίνηση του δείκτη αριστερά
+ αύξηση στη μνήμη[δείκτης] κατά 1
- μείωση στη μνήμη[δείκτης] κατά 1
. εξαγωγή του συμβόλου από τη μνήμη[δείκτης]
, εισαγωγή συμβόλου στη μνήμη[δείκτης]
[ μετακίνηση προς το τέλος στη θέση μετά το αντίστοιχο ] αν στο μνήμη[δείκτης] έχουμε μηδέν
] μετακίνηση προς την αρχή στη θέση πριν το αντίστοιχο [ αν στο μνήμη[δείκτης] δεν έχουμε μηδέν
Το πρόβλημα με τη ΓΛΩΣΣΑ είναι ότι δεν έχει κατάλληλες συναρτήσεις αλφαριθμητικών. Επίσης το πρόβλημα στον διερμηνευτή είναι στην εισαγωγή στοιχείων από το αρχείο, γιατί αν θέλουμε να εισάγουμε ένα διάστημα ΔΕΝ γίνεται, γιατί καθαρίζει τα "ακόλουθα διαστήματα" ή trailing spaces, οπότε αν δώσουμε ένα διάστημα θα το "χάσουμε".
Το πρόγραμμα χρειάζεται ένα πίνακα αλφαριθμητικών (126 σε αριθμό), για να κάνει τις μετατροπές από αριθμό σε ascii 7bit (ή ANSI κωδικοποίηση) και το αντίστροφό. Οι χαρακτήρες control+J γράφονται ^J (είναι το 10, ή new line).
Αρχικά είχα φτιάξει ένα με ελληνικά (255 αλφαριθμητικά) αλλά το μείωσα σε 126 (το 0 και το 127 δεν εμφανίζονται)
Στο συνημμένο υπάρχουν τρια προγράμματα, που περιέχουν το ίδιο πρόγραμμα με διαφορετικά αρχεία εισόδου.
Σε κάθε αρχείο εισόδου υπάρχουν τα απαραίτητα για την εκτέλεση του προγράμματος.
ο κώδικας έχει τρεις σταθερές που ρυθμίζουν την έκδοση της γλώσσας, ανάλογα με το αν θέλουμε εξαγωγή Ascii, ή αριθμού, ή αν θέλουμε το μέγεθος κελιού με μέγιστο τα 126 ή 255 ή 65535 ή 2147483647 (31bit), καθώς και το μέγεθος της μνήμης (των αριθμών των κελιών)
Το πρόγραμμα γράφεται στις πρώτες θέσεις της μνήμης και ο υπόλοιπος χώρος είναι για χρήση από το πρόγραμμα. Δεν μπορούμε να γράψουμε πάνω στο πρόγραμμα.
1ο Πρόγραμμα:
Πρόγραμμα σε BrainF*ck
++++++++++[>+>+++>++++>+++++++>++++++++>
+++++++++>++++++++++>+++++++++++>+++++++
+++++<<<<<<<<<-]>>>>+.>>>>+..<.<++++++++
.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.++
+.<+++++++.--------.<<<<<+.<+++.---.
Εκτέλεση Προγράμματος
Goodbye, World!
Τέλος Εκτέλεσης
2ο Πρόγραμμα
Μας ζητάει έναν αριθμό (δίνουμε enter κάθε ψηφίο και στο τέλος enter ή ^j και enter)
Μας γυρνάει 1 αν είναι μονός ή 0 αν είναι ζυγός ο αριθμός
Πρόγραμμα σε BrainF*ck
,[>,----------]++<[->-[>+>>]>[+[-<+>]>+>
>]<<<<<]>[-]<++++++++[>++++++<-]>[>+<-]>
.
Εκτέλεση Προγράμματος
3
4
1
1
Τέλος Εκτέλεσης
3ο Πρόγραμμα
Ακολουθία fibonacci (αν βάλουμε και άλλα + στην αρχή θα βγάλει και άλλα νούμερα. Σε αυτό έχουμε αλλάξει το κελί και το ascii σε false για να πάρουμε άμεσα τα νούμερα.
Θα βγει μήνυμα ότι κάνει πάνω από 100000 επαναλήψεις αλλά δεν πειράζει. Η γλώσσα αυτή μόνο αυξάνει ή μειώνει κατά ένα!
Πρόγραμμα σε BrainF*ck
++++++++++++++++++++++>>+<<[->>.>>[-]>[-
]<<<[->>+>+<<<]>>>[-<<<+>>>]<<<<[->+>+<<
]>>[-<<+>>]<<[-]>>>[-<<<+>>>]<<<<]
Εκτέλεση Προγράμματος
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
Τέλος Εκτέλεσης
Γρήγορη Ταξινόμηση σε στοίβα με κόμβους
Πρόγραμματα
γρηγορη_ταξινόμηση_στοίβας.glo
γρηγορη_ταξινόμηση_στοίβας2.glo
Μια στοίβα μπορεί να ταξινομηθεί χωρίς να πειράξουμε τα στοιχεία της, αλλά να την αναδιατάξουμε. Εδώ η αναδιάταξη γίνεται με δυο διαδικασίες τη ΦΕΡΕ που φέρνει στην κορυφή (στην 1 θέση) το ν-οστό στοιχείο, και τη ΦΕΡΕΠΙΣΩ που κάνει τη τρέχουσα κορυφή ως ν-οστό στοιχείο.
Για να μην έχουμε αναδρομή, χρησιμοποιούμε μια δεύτερη στοίβα, την στοίβα2, όπου βάζουμε δυάδες τιμών, το διάστημα που θα γίνει ταξινόμηση (έτσι δουλεύει η γρήγορη ταξινόμηση). Ξεκινάμε την ταξινόμηση βάζοντας στη στοίβα2 το αρχικό διάστημα (1,20), γιατί έχουμε 20 στοιχεία (20 πόλεις) για ταξινόμηση. Η δεύτερη στοίβα επειδή θα αυξομειώνεται λειτουργεί με το σύστημα ελεύθερων κόμβων. Η πρώτη στοίβα δεν αλλάζει μέγεθος, απλά γίνονται μετακινήσεις, ενώ πρόσκαιρα βγαίνει εκτός το πρώτο στοιχείο (το μεσαίο κάθε φορά του διαστήματος μου ταξινομούμε), και μετά πάει στην κανονική θέση του. Η γρήγορη ταξινόμηση για οποιοδήποτε διάστημα (μεγαλύτερο από μέγεθος 1) βρίσκει άμεσα την θέση του αρχικά "μεσαίου" στοιχείου. ενώ αφήνει το πολύ δυο λίστες, μια για τα μη ταξινομημένα στοιχεία, μικρότερα από το "μεσαίο", και τα μη ταξινομημένα στοιχεία, μεγαλύτερα του "μεσαίου". Επειδή οι ποσότητες αυτών διαφέρουν ενδέχεται να μην υπάρχει μια από τις λίστες γιατί το 'μεσαίο" θα είναι σε ένα άκρο.
Στο συνημμένο αρχείο είναι το πρόγραμμα σε ΓΛΩΣΣΑ το οποίο περιέχει και τις 20 πόλεις για ταξινόμηση! Αν αλλάξουμε το < σε > στην μοναδική σύγκριση πόλεων θα πάρουμε την ταξινόμηση σε φθίνουσα τάξη.
Υπάρχει και μια δεύτερη εκδοχή, πιο γρήγορη, με μια νέα διαδικασία που κάνει μεταφορά από το ν-οστό στο κ-οστό όταν ν<κ με ένα πέρασμα (ενώ πριν μετέφερα στη κορυφή από το ν-οστό και το προωθούσα στο κ-οστό)
Συναρτήσεις και Διαδικασίες για Αλφαριθμητικά.
Πρόγραμμα ΑΛΦΑΡΙΘΜΗΤΙΚΑ_bugman.gloΗ ΓΛΩΣΣΑ δεν υποστηρίζει τα αλφαριθμητικά, παρά μόνο για συγκρίσεις. Ούτε καν για ένωση. Λείπουν βασικά πράγματα. Όμως μπορούμε να φτιάξουμε δικά μας αλφαριθμητικά και με δικές μας συναρτήσεις και διαδικασίες.
Το πρόγραμμα έχει ένα πίνακα για 100 ειδικά αλφαριθμητικά, που αρχικά έχουν μηδενικό μήκος. Επιπλέον έχει μια μνήμη 500 χαρακτήρων. Κάθε αλφαριθμητικό παίρνει από την μνήμη όσες θέσεις χρειάζεται. Κάθε χαρακτήρας έχει ένα δείκτη στον επόμενο, εκτός από τον τελευταίο που δείχνει το 0 (null). Με αυτόν τον τρόπο δεν έχουμε κατ΄ ανάγκη αλφαριθμητικά με συνεχόμενους χαρακτήρες στη μνήμη, αλλά όμως οι χαρακτήρες είναι σε διάταξη, με τους δείκτες.
Παρακάτω είναι η εξαγωγή του προγράμματος:
Εισαγωγή τριών αλφαριθμητικών - χαρακτήρα προς χαρακτήρα
ο χαρακτήρας @ είναι το τέλος εισαγωγής αλφαριθμητικού
ο χαρακτήρας @@ είναι το διάστημα ....
αλλιώς δεν το διαβάζει από το αρχείο εισόδου
1) 'αβγδ εζη'
2) 'αβγ'
3) 'δεζη'
Αντέγραψε 1ο, από 1η θέση, 2 χαρακτήρες στο 4ο 'αβ'
Πρόσθεσε 3ο, από 2η θέση, 2 χαρακτήρες στο 4ο 'αβεζ'
Διέγραψε 3ο - Μήκος 0
Αντέγραψε 1ο, από 1η θέση, 2 χαρακτήρες στο 3ο 'αβ'
Πέντε φορές: Πρόσθεσε 3ο στο 5ο και 2ο από 3η θέση και μετά στο 5ο
Πρόσθεσε τις σταθερές 'Ο', 'Κ', '.','!' στο 6ο
Πρόσθεσε τον ακέραιο -30 στο 7ο
Πρόσθεσε τον ακέραιο 123009876 στο 8ο
Εμφάνιση των 8 πρώτων αλφαριθμητικών
1) 'αβγδ εζη' με μήκος 8 χαρακτήρες
2) 'αβγ' με μήκος 3 χαρακτήρες
3) 'αβ' με μήκος 2 χαρακτήρες
4) 'αβεζ' με μήκος 4 χαρακτήρες
5) 'αβγαβγαβγαβγαβγ' με μήκος 15 χαρακτήρες
6) 'ΟΚ.!' με μήκος 4 χαρακτήρες
7) '-30' με μήκος 3 χαρακτήρες
8) ' 123009876' με μήκος 10 χαρακτήρες
Αναζήτηση του 2ου σε όλα τα αλφαριθμητικά σε όλες τις θέσεις
Βρέθηκε στο 1ο στη θέση 1
Βρέθηκε στο 2ο στη θέση 1
Βρέθηκε στο 5ο στη θέση 1
Βρέθηκε στο 5ο στη θέση 4
Βρέθηκε στο 5ο στη θέση 7
Βρέθηκε στο 5ο στη θέση 10
Βρέθηκε στο 5ο στη θέση 13
Συγκρίσεις (του 2ου με όλα)
'αβγδ εζη' > 'αβγ'
'αβγ' = 'αβγ'
'αβ' < 'αβγ'
'αβεζ' > 'αβγ'
'αβγαβγαβγαβγαβγ' > 'αβγ'
'ΟΚ.!' < 'αβγ'
'-30' < 'αβγ'
' 123009876' < 'αβγ'
Γράφουμε ανάποδα ένα προς ένα τους χαρακτήρες του 7ου αλφαριθμητικού
03-
Μετατροπές από και σε βάση 2, 8 και 16
Πρόγραμμα ΑΛΦΑΡΙΘΜΗΤΙΚΑ_bugman01.gloΜε χρήση της βιβλιοθήκης αλφαριθμητικών (έχουν αφαιρεθεί ό,τι δεν χρειάζονταν)
Έξοδος του προγράμματος
Μετατροπή ακεραίου 65279 σε βάση:2
αποτέλεσμα: 1111111011111111
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 65279
Μετατροπή ακεραίου 65279 σε βάση:8
αποτέλεσμα: 177377
Μετατροπή από βάση 8 σε βάση 10:
αποτέλεσμα: 65279
Μετατροπή ακεραίου 65279 σε βάση:16
αποτέλεσμα: FEFF
Μετατροπή από βάση 16 σε βάση 10:
αποτέλεσμα: 65279
Μετατροπή ακεραίου 6917529027641081871 σε βάση:2
αποτέλεσμα: 110000000000000000000000000000000000000000000000000000000001111
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 6917529027641081871
Μετατροπή ακεραίου 6917529027641081871 σε βάση:8
αποτέλεσμα: 600000000000000000017
Μετατροπή από βάση 8 σε βάση 10:
αποτέλεσμα: 6917529027641081871
Μετατροπή ακεραίου 6917529027641081871 σε βάση:16
αποτέλεσμα: 600000000000000F
Μετατροπή από βάση 16 σε βάση 10:
αποτέλεσμα: 6917529027641081871
Δυαδικό XOR, OR, AND για ακέραιους θετικούς.
Πρόγραμμα ΑΛΦΑΡΙΘΜΗΤΙΚΑ_bugman02.gloΠράξεις XOR, AND, OR με αναπαράσταση σε δυαδικό.
ΕΛΕΥΘΕΡΑ ΑΛΦΑΡΙΘΜΗΤΙΚΑ:100
ΕΛΕΥΘΕΡΗ ΜΝΗΜΗ:500 ΧΑΡΑΚΤΗΡΕΣ
Δώσε δύο θετικούς ακέραιους
4232320808
2132133123
Μετατροπή από βάση 10 σε βάση 2, προσθήκη αρχικών 0:
Α.....11111100010001000001011100101000
B.....01111111000101011100010100000011
XOR =10000011010100011101001000101011
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 2203177515
Α.....11111100010001000001011100101000
B.....01111111000101011100010100000011
OR =11111111010101011101011100101011
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 4283815723
Α.....11111100010001000001011100101000
B.....01111111000101011100010100000011
AND =01111100000001000000010100000000
Μετατροπή από βάση 2 σε βάση 10:
αποτέλεσμα: 2080638208
ΕΛΕΥΘΕΡΑ ΑΛΦΑΡΙΘΜΗΤΙΚΑ:100
ΕΛΕΥΘΕΡΗ ΜΝΗΜΗ:500 ΧΑΡΑΚΤΗΡΕΣ
Έχουμε 100 το πολύ αλφαριθμητικά, με 500 το πολύ χαρακτήρες. Αν ζητηθεί κάτι παραπάνω, τότε ο ΕΛ (για τους χαρακτήρες ή ΕΛ_ΑΛΦΑ (για τα αλφαριθμητικά) επειδή θα έχουν το μηδέν, θα πάνε στους πίνακες και θα βγει λάθος.
Δεν χρειάζεται να αντιμετωπιστεί το λάθος, το αφήνουμε να συμβεί. Σημαίνει ότι το πρόγραμμα έφτασε στα όριά του. Αν πχ το αντιμετωπίζαμε τότε θα έπρεπε με πολύπλοκο τρόπο να δείξουμε ένα μήνυμα ότι το πρόγραμμα δεν μπορεί να προχωρήσει! Δηλαδή το ίδιο πράγμα, θα σταματήσει το πρόγραμμα, αλλά πιο πολιτισμένο!
Παρακάτω φαίνονται οι ορισμοί των πινάκων. Οι ΚΟΜ, ΜΝΗΜΗ και η μεταβλητή ΕΛ είναι για τους χαρακτήρες, ενώ το ΑΛΦΑ περιέχει του δείκτες λιστών που κάνουμε στο ΚΟΜ, και το Δ είναι η λίστα ελεύθερων αλφαριθμητικών, με πρώτο ελεύεθερο το ΕΛ_ΑΛΦΑ
πχ αν το ΟΚ είναι γραμμένο στο ΑΛΦΑ[1] σημαίνει ότι το Δ[1] δεν ανήκει στη λίστα ελεύθερων αλφαριθμητικών. Επίσης το ΜΝΗΜΗ[ΑΛΦΑ[1]] έχει το "Ο" και το ΜΝΗΜΗ[ΚΟΜ[ΑΛΦΑ[1]]] έχει το "1". Το ΚΟΜ[ΚΟΜ[ΑΛΦΑ[1]]]=0 και σημαίνει ότι δεν έχει άλλους χαρακτήρες. θα μπορούσε το ΑΛΦΑ και το Δ να είναι το ίδιο, αλλά θα είχαμε δυο διαφορετικούς τύπους δεικτών, ένας που συνδέει λίστες έξω από τον πίνακα ΑΛΦΑ και ένας που συνδέει τα ελεύθερα στοιχεία του ΑΛΦΑ. Το πρόβλημα θα παρουσιαστεί στην αρχικοποίηση. Τώρα ο ΑΛΦΑ έχει μόνο δείκτες προς το ΚΟΜ ή το 0 που σημαίνει κενό αλφαριθμητικό. Αν κάπου γίνει λάθος θα δούμε περισσότερους ή λιγότερους χαρακτήρες, ενώ αν είχαμε και τη λίστα ελεύθερων τότε μπορεί να διαβάζαμε από λάθος δείκτη προς ελεύθερο ως δείκτη προς το ΚΟΜ, προς τους χσρακτήρες και να πάρουμε ό,τι να ειναι.
ΑΚΕΡΑΙΕΣ: ΚΟΜ[500], ΑΛΦΑ[100], ΕΛ, ΕΛ_ΑΛΦΑ, Δ[100]
ΧΑΡΑΚΤΗΡΕΣ: ΜΝΗΜΗ[500]
! ΒΙΒΛΙΟΘΗΚΗ ΑΛΦΑΡΙΘΜΗΤΙΚΩΝ BUGMAN
! ΤΜΗΜΑ ΧΕΙΡΙΣΜΟΣ ΔΥΑΔΙΚΩΝ ΑΡΙΘΜΩΝ ΩΣ ΑΛΦΑΡΙΘΜΗΤΙΚΑ
! ΔΙΑΔΙΚΑΣΙΑ ΑφαίρεσεΑρχικάΜηδέν(ΛΕΞΗ1, ΕΛ, ΚΟΜ, ΜΝΗΜΗ)
! Η ΛΕΞΗ1 είναι κάποιο ΑΛΦΑ[Χ]
! Αφαιρούμε τα 0 αριστερά από τον αριθμό. Αν ο αριθμός έχει μόνο 0 τότε αφήνει ένα
! ΔΙΑΔΙΚΑΣΙΑ ΑρχικάΜηδέν(ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, Δ, ΕΛ_ΑΛΦΑ, ΑΛΦΑ)
! Το ΠΟΥ είναι ο δείκτης στο ΑΛΦΑ[]
! Προσθέτει 0 αριστερά του αριθμού, ή κόβει τον αριθμό στα 32 δεξιά bit.
! ΔΙΑΔΙΚΑΣΙΑ ΜετατροπήΣεΔυαδικό( Α, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, Δ, ΕΛ_ΑΛΦΑ, ΑΛΦΑ)
! ΔΙΑΔΙΚΑΣΙΑ ΜετατροπήΣεΔεκαδικό( Α, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, Δ, ΕΛ_ΑΛΦΑ, ΑΛΦΑ)
! Το ΠΟΥ είναι ο δείκτης στο ΑΛΦΑ[]
! στη πρώτη δίνουμε το Α και στη δεύτερη παίρνουμε επιστροφή στο Α
! ΣΥΝΑΡΤΗΣΗ ΕΛΕΥΘΕΡΑ_ΑΛΦΑΡΙΘΜΗΤΙΚΑ(ΕΛ_ΑΛΦΑ, Δ): ΑΚΕΡΑΙΑ
! ΓΙΑ ΝΑ ΕΧΟΥΜΕ ΔΥΝΑΜΙΚΑ ΕΠΙΛΕΓΜΕΝΑ ΑΛΦΑΡΙΘΜΗΤΙΚΑ
! ΥΠΑΡΧΕΙ ΤΟ ΕΛ_ΑΛΦΑ ΠΟΥ ΔΙΝΕΙ ΤΟ ΠΡΩΤΟ ΕΛΕΥΘΕΡΟ ΑΛΦΑΡΙΘΜΗΤΙΚΟ
! ΟΣΕΣ ΔΙΑΔΙΚΑΣΙΕΣ ΧΡΗΣΙΜΟΠΟΙΟΥΝ ΤΟ ΑΛΦΑ ΩΣ ΠΑΡΑΜΕΤΡΟ,
! ΣΗΜΑΙΝΕΙ ΟΤΙ ΔΗΜΙΟΥΡΓΟΥΝ ΕΣΩΤΕΡΙΚΑ ΔΙΚΑ ΤΟΥΣ ΑΛΦΑΡΙΘΜΗΤΙΚΑ
! ΤΑ ΟΠΟΙΑ ΤΑ ΚΑΘΑΡΙΖΟΥΝ ΠΡΙΝ ΤΕΡΜΑΤΙΣΟΥΝ ΤΗΝ ΕΚΤΕΛΕΣΗ ΤΟΥΣ
! ΟΙ ΠΑΡΑΚΑΤΩ ΣΥΝΑΡΤΗΣΕΙΣ ΚΑΙ ΔΙΑΔΙΚΑΣΙΕΣ ΔΕΝ ΤΙΣ ΧΡΕΙΑΖΟΝΤΑΙ
! ΔΟΥΛΕΥΟΥΝ ΜΕ ΑΛΦΑΡΙΘΜΗΤΙΚΑ ΠΟΥ ΔΙΝΟΥΜΕ ΩΣ ΠΑΡΑΜΕΤΡΟΥΣ (ΤΟΥΣ ΔΕΙΚΤΕΣ ΤΟΥΣ)
!
! ΓΕΝΙΚΟ ΤΜΗΜΑ ΑΛΦΑΡΙΘΜΗΤΙΩΝ
! ΣΥΝΑΡΤΗΣΗ ΕΛΕΥΘΕΡΗ_ΜΝΗΜΗ(ΕΛ, ΚΟΜ): ΑΚΕΡΑΙΑ
! ΣΥΝΑΡΤΗΣΗ ΜΗΚΟΣ(Ι, ΚΟΜ, ΜΝΗΜΗ): ΑΚΕΡΑΙΑ
! ΜΗΔΕΝΙΚΟΥ ΜΗΚΟΥΣ ΑΛΦΑΡΙΘΜΗΤΙΚΟ ΕΙΝΑΙ ΑΥΤΟ ΠΟΥ ΕΧΕΙ ΤΟ ΑΛΦΑ[Χ] ΜΗΔΕΝ
!
! ΣΥΝΑΡΤΗΣΗ ΧΑΡ(Ι, ΘΕΣΗ, ΚΟΜ, ΜΝΗΜΗ): ΧΑΡΑΚΤΗΡΑΣ
! ΕΠΙΣΤΡΕΦΕΙ ΤΟ ΧΑΡΑΚΤΗΡΑ ΣΤΗ ΘΕΣΗ ΤΟΥ Ι=ΑΛΦΑ[Χ]
! ΔΙΑΔΙΚΑΣΙΑ ΕΜΦ(Ι, ΚΟΜ, ΜΝΗΜΗ)
! ΕΜΦΑΝΙΣΗ ΣΤΗΝ ΚΟΝΣΟΛΑ ΤΟΥ ΤΟΥ Ι=ΑΛΦΑ[Χ] Ι
! ΔΙΑΔΙΚΑΣΙΑ ΑΝΤΕΓΡΑΨΕ(ΛΕΞΗ1, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, ΘΕΣΗ, ΧΑΡ)
! ΑΝΤΙΓΡΑΦΗ ΑΠΟ ΤΟ ΑΛΦΑ[Χ]ΑΠΟ ΤΗ ΘΕΣΗ ΚΑΙ ΓΙΑ ΧΑΡ ΧΑΡΑΚΤΗΡΕΣ ΣΤΟ ΑΛΦΑ[Υ]
! Η ΠΡΟΗΓΟΥΜΕΝΗ ΤΙΜΗ ΤΟΥ ΑΛΦΑ[Υ] ΔΙΑΓΡΑΦΕΤΑΙ
! ΜΠΟΡΟΥΜΕ ΝΑ ΑΝΤΙΓΡΑΨΟΥΜΕ ΑΠΟ ΤΟΝ ΕΑΥΤΟ ΤΟΥ, Χ=Υ
! ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΣΘΕΣΕ(ΛΕΞΗ1, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ, ΘΕΣΗ, ΧΑΡ)
! ΠΡΟΣΘΕΤΟΥΜΕ ΣΤΟ ΤΕΛΟΣ ΤΟΥ ΑΛΦΑ[Υ] ΤΟ ΑΛΦΑ[Χ] ΑΠΟ ΤΗ ΘΕΣΗ ΚΑΙ ΓΙΑ ΧΑΡ ΧΑΡΑΚΤΗΡΕΣ
! ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΣΘΕΣΕ_ΣΤΑΘΕΡΑ(ΧΑΡ, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ)
! ΠΡΟΣΘΕΤΟΥΜΕ ΕΝΑΝ ΧΑΡΑΚΤΗΡΑ ΤΟΝ ΧΑΡ ΣΤΟ ΤΕΛΟΣ ΤΟΥ ΑΛΦΑ[Υ]
! ΔΙΑΔΙΚΑΣΙΑ ΠΡΟΣΘΕΣΕ_ΑΚΕΡΑΙΟ(Α, ΠΟΥ, ΕΛ, ΚΟΜ, ΜΝΗΜΗ)
! ΜΕΤΑΤΡΕΠΕΙ ΕΝΑΝ ΑΡΙΘΜΟ ΣΕ ΧΑΡΑΚΤΗΡΕΣ ΚΑΙ ΤΟΝ ΒΑΖΕΙ ΣΤΟ ΤΕΛΟΣ ΤΟΥ ΑΛΦΑ[Χ]
! ΣΤΟΥΣ ΘΕΤΙΚΟΥΣ ΒΑΖΕΙ ΕΝΑ ΔΙΑΣΤΗΜΑ ΣΤΗΝ ΑΡΧΗ, ΣΤΟΥΣ ΑΡΝΗΤΙΚΟΥΣ ΔΕΝ ΒΑΖΕΙ
! ΔΙΑΔΙΚΑΣΙΑ ΔΙΕΓΡΑΨΕ(ΛΕΞΗ1, ΕΛ, ΚΟΜ, ΜΝΗΜΗ)
! ΕΠΙΣΤΡΕΦΕΙ ΟΛΟΥΣ ΤΟΥΣ ΧΑΡΑΚΤΗΡΕΣ ΣΤΟΥΣ ΕΛΕΥΘΕΡΟΥΣ
! ΤΟ ΑΛΦΑ[Χ] ΓΙΝΕΤΑΙ ΜΗΔΕΝ
! ΣΥΝΑΡΤΗΣΗ ΣΥΓΚΡΙΝΕ(ΛΕΞΗ1, ΛΕΞΗ2, ΚΟΜ, ΜΝΗΜΗ): ΑΚΕΡΑΙΑ
! ΑΝ ΤΟ ΑΛΦΑ[Χ] < ΑΛΦΑ[Υ] ΔΊΝΕΙ ΤΟ -1
! ΑΝ ΕΙΝΑΙ ΙΣΑ ΔΙΝΕΙ ΤΟ 0
! ΑΝ ΤΟ ΑΛΦΑ[Χ] > ΑΛΦΑ[Υ] ΔΙΝΕΙ ΤΟ 1
! ΣΥΝΑΡΤΗΣΗ ΑΝΑΖΗΤΗΣΗ_ΘΕΣΗΣ(ΛΕΞΗ1, ΛΕΞΗ2, ΚΟΜ, ΜΝΗΜΗ, ΑΠΟ_ΘΕΣΗ): ΑΚΕΡΑΙΑ
! ΑΝΑΖΗΤΕΙ ΣΤΗΝ ΑΛΦΑ[Χ] ΤΗΝ ΑΛΦΑ[Υ]
! ΜΠΡΟΡΟΥΜΕ ΝΑ ΟΡΙΣΟΥΜΕ ΘΕΣΗ ΑΠΟ ΤΗΝ ΟΠΟΙΑ ΘΑ ΞΕΚΙΝΑΕΙ Η ΑΝΑΖΗΤΗΣΗ, Η ΤΟ -1
! ΣΥΝΑΡΤΗΣΗ ΑΝΑΖΗΤΗΣΗ_ΘΕΣΗΣ_ΧΑΡΑΚΤΗΡΑ(ΛΕΞΗ1, ΧΑΡ, ΚΟΜ, ΜΝΗΜΗ, ΑΠΟ_ΘΕΣΗ): ΑΚΕΡΑΙΑ
! ΑΝΑΖΗΤΕΙ ΣΤΗΝ ΑΛΦΑ[Χ] ΤΟΝ ΧΑΡΑΚΤΗΡΑ ΧΑΡ
! ΜΠΡΟΡΟΥΜΕ ΝΑ ΟΡΙΣΟΥΜΕ ΘΕΣΗ ΑΠΟ ΤΗΝ ΟΠΟΙΑ ΘΑ ΞΕΚΙΝΑΕΙ Η ΑΝΑΖΗΤΗΣΗ, Η ΤΟ -1
(προηγούμενο, επόμενο)
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.