Προς το περιεχόμενο

Ενημέρωση για τη Μ2000 (Γλώσσα προγραμματισμού)


M2000

Προτεινόμενες αναρτήσεις

Έριξα μία ματιά στο πρόγραμμα με goto.

 

Πάλι καλά που είχες και την υλοποίηση χωρίς goto ώστε να αντιληφθεί αμέσως κανείς πως η goto μόνο πόνο στον εγκέφαλο προκαλεί όταν χρησιμοποιείται έτσι.

 

Τέλος ο καλύτερος τρόπος για να λύσεις τέτοια προβλήματα (σαν αυτό που έθεσες) είναι να υλοποιήσεις και να προγραμματίσεις ένα DFA.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 308
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δηλαδή τώρα δεν το χοντραίνεις το θέμα; (αστειεύομαι βέβαια)

 

Είδες και το δεύτερο πρόγραμμα με goto (το τελευταίο ή τρίτο). Αυτό που διαβάζει και την επιστημονική μορφή!

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

 

Μου ήταν πάντως πιο εύκολο στο παράδειγμα να μετατρέψω την αρχική ρουτίνα με πέντε γραμμές να βρίσκει και την επιστημονική μορφή αριθμών, παρά να το φτιάξω με σειρά repeat until, ή άλλων "προκαθορισμένων" επαναλήψεων.

Μέσα στο διερμηνευτή της Μ2000 δεν χρησιμοποιώ goto στις ρουτίνες που κοιτάνε για αριθμό. Αυτή η ρουτίνα που έδωσα εδώ δεν κοιτάει απλά έναν αριθμό σε μια εισαγωγή αλλά μια σειρά αριθμών, είναι δηλαδή πιο ειδικευμένη. Στο διερμηνευτή αριθμός είναι και το 0ΧFF (βλέπει και δεκαεξαδικούς), και μάλιστα να έχουμε σειρά προσήμων δεν τον πειράζει, τα ζυγά - τα κάνει +. Εκεί λοιπόν δεν χρησιμοποιώ goto όχι γιατί με πονάει αλλά γιατί δεν χρειάστηκε! Όπου χρειάζεται δηλαδή το goto το χρησιμοποιούμε. Και καταλαβαίνουμε πότε όταν αντιλαμβανόμαστε ότι μια λύση θα μας περιορίσει αργότερα αν θέλουμε να προσθέσουμε λογική. Στη Μ2000 έχω κάνει το εξής, αν θέλω να φτιάξω κάτι άλλο παραπλήσιο, φτιάχνω νέο κώδικα προσαρμοσμένο για αυτό, άρα δεν πειράζω το προηγούμενο, Υπάρχουν 9 functions που ξεκινούν με το IsNumber στο κώδικα της Μ2000. Καθένα χρησιμοποιείται για άλλη δουλειά! (υπάρχουν και ρουτίνες που δεν χρησιμοποιούνται πια, απλά έχουν μείνει στο κώδικα).. Π.χ. το IsNumberQuery χρησιμοποιείται για να κάνει validation εισαγωγή από το πληκτρολόγιο, κατά τη διάρκεια που γράφουμε, δηλαδή ελέγχει κάτι που δεν έχει ολοκληρωθεί και επιτρέπει ή όχι το πλήκτρο που πατάμε.

Δοκίμασε το Input ! A, 30 μπορείς να το δώσεις και στην γραμμή εντολών. Κάνει εισαγωγή αριθμού (double), σε πλάτος 30 χαρακτήρων (μη αναλογικών) αλλά εμφανίζει ουσιαστικά ένα δικό μου textbox, και  μπορείς να πηγαίνεις με το δρομέα όπου θέλεις, αλλά δεν μπορείς να πατήσεις ότι θέλεις, αφού ελέγχει αν αυτό που γράφεις μπορεί να γίνει αριθμός (π.χ. μπορείς να βάλεις ένα - και αυτό το πρόσημο το δέχεται ως αρχή αριθμού).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το κακό με τις goto είναι πως είναι πολύ εύκολο και κατανοητό για τον συγγραφέα να λύσει ένα πρόβλημα με αυτές. Το πρόβλημα είναι πως ένας τρίτος δε θα μπλέξει με τη μακαρονάδα. Επίσης και ο ίδιος ο συγγραφέας μετά από λίγο καιρό δε θα καταλαβαίνει τι σκεφτόταν όταν το έγραφε.

 

Μία σημαντική μετρική για ποιότητα κώδικα μπορεί να φανεί στην υπογραφή μου.

 

Εντάξει, μπορεί να θεωρήσεις ότι έχω μπει σε ένα καλούπι, το οποίο με περιορίζει να δω τί πραγματικά προσφέρει η goto. Αλλά αν το σκεφτείς καλά, ακόμη και οι compilers, χρησιμοποιούν τα unconditional branches με τέτοιο τρόπο ώστε να υλοποιήσουν δομημένες εντολές. Όπως και να έχει, όσα open-source project έχω διαβάσει σε κανένα από αυτά δεν έχω εντοπίσει goto. Ούτε για αστείο. Εγώ θα τη χρησιμοποιήσω μόνο για το λόγο που είπα (single return point).

 

Όσον αφορά το πρόβλημα που έθεσες, ένα dfa έχει ένα στάνταρ template, το οποίο αλλάζεις για να πετύχεις αυτό που θες με cases. Αν το πάρεις κυριολεκτικά, οι goto είναι πιο κοντά στη λύση, αλλά δεν είναι ανθρώπινες.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έριξα μία ματιά στο πρόγραμμα με goto.

 

Πάλι καλά που είχες και την υλοποίηση χωρίς goto ώστε να αντιληφθεί αμέσως κανείς πως η goto μόνο πόνο στον εγκέφαλο προκαλεί όταν χρησιμοποιείται έτσι.

 

Τέλος ο καλύτερος τρόπος για να λύσεις τέτοια προβλήματα (σαν αυτό που έθεσες) είναι να υλοποιήσεις και να προγραμματίσεις ένα DFA.

 

DFA έχει κάνει εκεί με τις goto, απλά δεν το ξέρει. Anyway, goto. :/

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

defacer, ευχαριστώ για την διευκρίνηση!

 

Σωστά τα λες gon1332. Στο κώδικα της Μ2000 χρησιμοποιώ τα cases, σε ανάλογες περιπτώσεις (πολύ σπάνια τα goto). Απλά έπεσε ένα ερώτημα από ένα μέλος για το πότε τα goto χρησιμεύουν.

 

Λίγα λόγια, ακόμα, για τα προγράμματα παραπάνω:

Ο operator ~ στα αλφαριθμητικά είναι το Like της vb6...(πολύ ωραίο). Το "[0123456789]" έχει μέσα τα [ ] που λένε στη Like για τους χαρακτήρες που μπορεί να υπάρχουν σε μια θέση χαρακτήρα. Μια ιδέα είναι να γραφτεί το παραπάνω πρόγραμμα με ένα κεντρικό like, και το πρότυπο να αλλάζει βάσει flags...(π.χ. στην αρχή να κοιτάει για τελεία πρόσημα και αριθμούς)

 

Ο unary operator ~ σε μεταβλητές είναι το not, δηλαδή το Α~ είναι το A = Not A. Unary operators δεν μπορούμε να έχουμε σε εκφράσεις. Δηλαδή το Α--*5 θα γίνει Α*5

? 5+-+*+-+-5
? 5+-+*+-+-*5

Το πρώτο θα δώσει 25 το δεύτερο συντακτικό λάθος!

Υπάρχει το -! δηλαδή το Α-! είναι το Α=-Α

Καθώς και τα ++ -- += -= *= /=   (δεν έχω mod= ή κάπως έτσι %=, δεν το έχω χρησιμοποιήσει ποτέ και ίσως είναι ο λόγος που δεν το  έβαλα).

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

Το παρακάτω δουλεύει (δίνει -1 ενώ αν σβήσουμε το -100 δίνει 0)

Τύπωσε 6>5 και "A"<="ΑΑΑ" και 10+5>50-100

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

(βαριόμουν να απαντήσω στο άλλο thread όταν το διάβαζα οπότε απαντάω εδώ μια και καλή)

 

Αυτό που είχες γράψει στο άλλο thread (και στη συνέχεια το έκανες blog post) είναι ένα DFA και το goto είναι ένας απ' τους τρόπους για να το υλοποιήσεις. Δεν είναι όμως ο μόνος τρόπος και, παρόλο που πρακτικά έχεις goto, όλες οι υλοποιήσεις που είδα το είχαν κρυμμένο (μιλάω για C πάντα γιατί θεωρώ αστείο να έχεις goto σε κάποια πιο high level γλώσσα).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η Μ2000 έχει την Goto γιατί ήθελα να μπορεί να ξεκινάει να  φτιάχνει κανείς προγράμματα σε στυλ Basic και να δει τον τρόπο χρήσης τους, και μετά να πάει σε κάτι πιο σοβαρό, π.χ. τμήματα, συναρτήσεις, ρουτίνες.

Τα goto, η χρήση flags και if είναι η αρχική ιδέα του τι είναι προγραμματισμός. Δεν μας υποχρεώνει κάποιος να μείνουμε εκεί. Ούτε όμως η χρήση τους θεωρείται απαγορευμένη, ή ανήθικη!

 

 

Στην Μ2000 οι ρουτίνες (Subs) και τα τμήματα (Modules) δεν είναι ίδιο πράγμα! Στη Μ2000 δεν μαθαίνεις απλά να χρησιμοποιείς διαδικασίες και συναρτήσεις, αλλά αντιλαμβάνεσαι τι είναι το αντικείμενο εκτέλεσης (η Μ2000 έχει νήματα, με δικά τους αντικείμενα εκτέλεσης, αλλά στο ίδιο όνομα χώρου, στο τμήμα ή συνάρτηση που δημιουργήθηκαν, και μπορούν να τρέχουν πολλά αντικείμενα εκτέλεσης μαζί). Τα τμήματα και οι συναρτήσεις είναι αντικείμενα εκτέλεσης, ενώ οι ρουτίνες δεν είναι. Goto δεν γίνεται από ένα αντικείμενο σε άλλο! Όταν ένα τμήμα καλέσει ένα άλλο, τότε ξεκινάει νέο αντικείμενο εκτέλεσης.

Μπορεί ένα νήμα να περιμένει εισαγωγή με μια Input A$ και ένα άλλο να τρέχει στο περιθώριο. Τα αντικείμενα εκτέλεσης τα χειρίζεται το πρόγραμμα που έχω φτιάξει, και κάποτε θα τρέχουν σε ξεχωριστό επεξεργαστή! (αυτό δεν το έχω κάνει ακόμα, ελπίζω κάποιος άλλος να εξερευνήσει το δυναμικό της γλώσσας με υλοποίηση πραγματικήq πολυεπεξεργασίας, ενώ τώρα ουσιαστικά υπάρχει ένας task manager μέσα στην Μ2000, που χειρίζεται τα νήματα, εκτός από αυτά των τμημάτων χειρίζεται νήματα για νότες midi και για pipes)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έβαλα και μια ανάρτηση για τα XML αρχεία. Η Μ2000 μπορεί να χρησιμοποιεί αντικείμενα των Windows, όπως το Msxml2.DOMDocument.6.0

Εκτός από τα δικά της αντικείμενα, τις ομάδες/groups μπορεί να χειριστεί αντικείμενα μέσω του Link.png Site: idispatch_interface

 

http://georgekarras.blogspot.gr/2016/02/xml.html

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αναθεώρηση 152, έβαλα και προβολή διαστηματων/nbsp/figure space στον διορθωτή. Αυτή είναι η έκδοση με τους πίνακες κατακερματισμού για την εύρεση ονομάτων (μεταβλητών/πινάκων/τμημάτων/συναρτήσεων). Είναι η πιο γρήγορη. Έχω διαμορφώσει το stack και μπορεί να κάνει σε συναρτήσεις περί της 14300 κλήσεις (το έχω δοκιμάσει και σε κάθε κλήση φτιάχνει ένα πίνακα με τριάντα στοιχεία και έξι ακόμα μεταβλητές, στην αναθεώρηση 148 η απόκριση ήταν εκθετική, εδώ είναι γραμμική λόγω πίνακα κατακερματισμού)

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μετά από μερικές ώρες (όλο το βράδυ για την ακρίβεια)...το κατάφερα. Έχουμε λοιπόν ιδιωτικές και δημόσιες μεταβλητές, συναρτήσεις, τμήματα, πίνακες και άλλες ομάδες στην αναθεώρηση 153.

Στο blog έχω ανεβάσει και ένα πρόγραμμα (Χειριστής Γεγονότων, τρίτη έκδοση) όπου κάνω χρήση αυτών των χαρακτηριστικών (είναι στα ελληνικά). Τις δύο ετικέτες τις έφτιαξα αλά c++.

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

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

 

class alfa {
private:
      a=10, george$="George"
      dim v(10)=4
      Function Ok {
            =.a*.klm
      }
public:
      klm=1010
      Module Add {
            .a++
            read b$
            .george$<=.george$+b$
            Print .george$
      }
      Function ShowName$ {
            =.george$
      }
      Module showme {
            Print .a, .george$
            Print .v(3) '4
            Print .Ok()
      }
}
b=alfa()
b.showme
list    ' only klm is visible
Print valid(b.a) ' 0 false
dim a(10)=alfa()
a(4).showme
a(3).add " Hello"
Print a(3).ShowName$()

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Με το σύστημα που έχει η Μ2000 μπορεί η Β να καλεί την Α πριν αυτή τερματίσει (αφού η Α της έδωσε μια ειδική συνάρτηση, άρα να καλεί από ένα σημείο "επαφής" ) και να τρέχει κώδικας της Α και να αλλάζει τιμές σε μεταβλητές και πίνακες βάσει της τρέχουσας κατάστασης στο Α ή και εδώ είναι το ενδιαφέρον, η κλήση της Β πίσω στην Α μπορεί να γίνει με πέρασμα Αναφορών. Η ειδική συνάρτηση μετατρέπεται στην Α μεν αλλά ο χώρος μεταβλητών είναι προσωρινός. Έτσι αν φτιάξουμε αναφορές με μια Διάβασε Νέο &Χ (θα βγάλει νέα μεταβλητή, που θα σκιάσει τυχόν ίδια και θα την συνδέσει με μια μεταβλητή του Β, και στο πέρας της κλήσης θα διαγραφεί), θα έχουμε την Α να αλλάζει τιμές στη Β που κάλεσε! Έτσι και στο παράδειγμα βάζουμε την Α να ταξινομήσει τις τιμές της Β, αφού καλέσουμε τη Β και εκείνη κάνει την προεργασία και καλέσει πίσω για εργασία, χωρίς να τερματίσει. Παρόλα αυτά το Α έχει καλέσει το Β και το Β καλεί το Α και πρέπει κάποια στιγμή το Β να τερματίσει. Όταν τερματίσει το Β ότι είχε χάνεται, εκτός και ήταν μέρος ενός αντικειμένου και ότι είχε τα καταχώρησε σε αυτό. Αυτή είναι και μια από τις χρησιμότητες των αντικειμένων. Αν το δούμε αλλιώς, το Α με το Β έχουν επικοινωνία, όσο έγινε η πρώτη επαφή, με τη κλήση της Α στη μέθοδο Β ενός αντικειμένου (και η Α μπορεί να είναι από κάποιο άλλο αντικείμενο). Η επικοινωνία θα ήταν απλή αν γίνονταν σε μια δόση Α->Β ενώ εδώ έχουμε Α->Β και Β->Α όσες φορές θέλουμε πριν τερματίσει το Α->Β. Και σε κάθε Β->Α μπορούμε αν θέλουμε να περνάμε κάτι με αναφορά άρα να έχουμε πάλι Α->Β επικοινωνία. Στο παρακάτω σύνδεσμο έχω δυο προγράμματα. το δεύτερο είναι η ταξινόμηση και το πρώτο παραδείγματα σε αυτά που αναφέρω εδώ.

 

 

Link.png Site: Παράδειγμα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

Δείτε ότι κάνει ταξινόμηση σε λέξεις που τις γυρνάει σε κεφαλαία χωρίς τόνους. Το Άρτα γράφεται μετά το Αθήνα.

 

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

Το παρακάτω το γράφουμε σε ένα τμήμα έστω Α. Στο Α δεν βλέπουμ την συνάρτηση κοίτα(),ούτε τη ρουτίνα Ταξινόμηση_Λέξεων()  γιατί δεν υπάρχουν, και θα υπάρξουν όταν κληθεί το τμήμα. Ουσιαστικά όταν πάμε στο φτιάξεμε (είναι ετικέτα και επιστρέφουμε με το Επιστροφή, αγγλικά Gosub- Return), απλά ο διερμηνευτής φτιάχνει στη λίστα τμημάτων ένα τμήμα που ανήκει στο Α, ως μια εγγραφή με τον κώδικα χωρίς να τον πειράξει, ή να ασχοληθεί μαζί του. Όταν καλέσουμε το τμήμα Ταξινόμησε τότε είναι σαν να ξεκινάει άλλο πρόγραμμα και διαβάζει από το σωρό τιμών την "παραγγελία". Ανάλογα με αυτή, σε μια Επίλεξε Με αποφασίζει να φτιάξει μια συνάρτηση κοίτα() (στις Με μπορούμε να βάζουμε μια εντολή ή αγκύλες με πολλές εντολές αλλά όχι κενές γραμμές). Για την Ταξινόμησε δεν υπάρχει καμία "ιδέα" ή σύνδεση που να λέει το ποιός την κάλεσε. Μόνο τις δικές της μεταβλητές/ανανγωριστικά γνωρίζει και ότι έχει δηλωθεί γενικό (μπορούμε να έχουμε γενικές ομάδες, τμήματα, συναρτήσεις, μεταβλητές, πίνακες)

, αν και προτεραιότητα έχουν τα αναγνωριστικά που δηλώθηκαν τοπικά. Ότι δηλώνουμε στα τμήματα είναι τοπικό εκτός αν το δηλώσουμε διαφοτετικά. Μπορούμε αν θέλουμε να γράψουμε Τοπικές Α,Β=3,Γ θα δουλέψει.

Δείτε μετά την ρουτίνα. Αυτή δεν είναι τμήμα, δεν έχει όνομα το οποίο δημιουργεί όνομα χώρου, έτσι ότι τοπικές κάνουμε "σκιάζουν" τις τοπικές του τμήματος, αλλά στο πέρας εκτέλεσης των ρουτινών, ότι φτιάξαμε διαγράφεται.Επειδή έχουν κοινό όνομα χώρου με το τμήμα, βλέπουν συναρτήσεις και μεταβλητές, και άλλα τμήματα, σαν να είναι δικά τους, άρα σαν να είναι στατικά. Αυτό είναι το ενδιαφέρον με τις ρουτίνες, όπως επίσης ότι έχουν δυνατότητα αναδρομή (recursion.). Υπάρχει όριο αναδρομής αλλά για τις ρουτίνες μπορεί να αλλάξει, και να μπει όσο θέλουμε, π.χ. 100 χιλιάδες κλήσεις. (εντολή Όριο.Αναδρομής 100000)

 

 
Διαμέσου φτιάξεμε \\ φτιάχνω το τμήμα και τις μεταβλητές
Σωρός Νέος {
      \\ ανοίγουμε έναν νέο σωρό - ο αρχικό έχει το 1,2,3
      Σειρά "Πρέβεζα", "Αθήνα", "Πάτρα","Ιωάννινα","Καβάλα","Βόλος", "Καλαμάτα","Τρίπολη","Πύργος","Ναύπλιο","Ρόδος"
      Σειρά "Λαμία","Λάρισα","Άρτα","Κόρινθος","Σπάρτη","Ηγουμενίτσα","Μεσολόγγι","Θήβα","Χαλκίδα"
      Ταξινόμησε Αύξουσα$
      Σωρός
      Ταξινόμησε Φθίνουσα$
      Σωρός
      \\ η Σωρός μας δείχνει τι έχει ο σωρός τιμών     
      \\ το παρακάτω (βγάλτε την Σημ : και δείτε) αφαιρεί τα στοιχεία από το σωρό
       Σημ : Ενώ Όχι Κενό { Διάβασε Α$ : Τύπωσε Α$ }
}
Τέλος
φτιάξεμε:
Αύξουσα$="+"
Φθίνουσα$="-"
Τμήμα Ταξινόμησε {
      Διάβασε Α$
      Α$=Κεφ$(Α$)
      Επίλεξε με Α$
      Με "ΑΥΞΟΥΣΑ","+"
            Κάνε κοίτα(Α$,Β$)=Α$<Β$
      Με "ΦΘΙΝΟΥΣΑ","-"
            Κάνε κοίτα(Α$,Β$)=Α$>Β$
      Αλλιώς
            Έξοδος
      Τέλος Επιλογής
Ταξινόμηση_Λέξεων(1,Μέγεθος.Σωρού)
Ρουτίνα Ταξινόμηση_Λέξεων(αρχικό, τελικό)
      Τοπικές πράγμα$, κεφ_π$, ι=αρχικό, όριο=τελικό+1
      Αν όριο >2 Τότε Φέρε (όριο+ι) Δια 2
      Διάβασε πράγμα$
      όριο--
      κεφ_π$=κεφ$(πράγμα$)
      Ενώ ι<όριο {
            Αν κοίτα(κεφ_π$,κεφ$(ΤιμήΣωρού$(ι))) Τότε {
                  όριο--
                  Αν ι>1 Τότε Φέρε ι
                  ΦέρεΠίσω όριο
            }  Αλλιώς ι++
      }
      Αν ι>όριο Τότε ι=όριο
      Βάλε πράγμα$ : ΦέρεΠίσω ι
      Αν ι>αρχικό Τότε Ταξινόμηση_Λέξεων(αρχικό,ι-1)
      Αν τελικό>ι Τότε Ταξινόμηση_Λέξεων(ι,τελικό)
Τέλος Ρουτίνας
}
Επιστροφή

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στην αναθεώρηση 157 έφτιαξα το πρόγραμμα της M2000, το M2000.exe να τρέχει και σε υπολογιστές που δεν έχουν προεπιλογή τα Ελληνικά για τα μη Unicode προγράμματα.

Κανονικά εφαρμογές που είναι γραμμένες σε Vb6, θέλουν επιλογή Link.png Site: ελληνικά για να χειρίζονται τα αλφαριθμητικά στις εμφανίσεις (εσωτερικά η Vb6 τα κρατάει ως UTF-16LE, με 2 bytes όμως, δεν παίζει το τετραπλό). Έκανα μια διόρθωση και τώρα παίζει κανονικά τα ελληνικά.

Σειριακα αρχεία στο δίσκο μπορούμε να γράψουμε σε οποιοδήποτε μηχάνημα χρησιμοποιώντας την εξαγωγή σε Unicode. Εδώ είναι παράδειγμα για εξαγωγή cvs και εξαγωγή κειμένου (εξαγωγή γίνεται και με μια εντολή από μεταβλητές τύπου έγγραφο, και εκεί μπορεί να επιλεχθεί UTF8, UTF16LE, UTF16BE, ANSI)

 

 

 

 

\\ Παράδειγμα 1
κ=1
\\ αρχείο unicode με διαχωρισμό εξαγωγής σε αριθμούς-γράμματα
\\ https://en.wikipedia.org/wiki/Comma-separated_values
Άνοιξε "αλφα.cvs" για ευρεία εξαγωγή ως κ
Γράψε #κ, "Ένα όνομα", 100, 3213, "Привет игровая площадка!"
Κλείσε #κ
Αναμονή 100
Άνοιξε "αλφα.cvs" για ευρεία εισαγωγή ως κ
Ενώ όχι Τέλος(#κ) {
      Εισαγωγή #κ, Α$,Α, Β, Β$
      Τύπωσε Α$,Α, Β, Β$
}
Κλείσε #κ
\\ Παράδειγμα 2
κ=1
\\ χωρίς χρήση BOM (ενδεικτικού χαρακτήρα)
Άνοιξε "αλφα.txt" για ευρεία εξαγωγή ως κ
Τύπωσε #κ, "Γεια χαρά ! == Привет игровая площадка!"
Κλείσε #κ
Αναμονή 100
Άνοιξε "αλφα.txt" για ευρεία εισαγωγή ως κ
Ενώ όχι Τέλος(#κ) {
      Γραμμή Εισαγωγής #κ, Α$
      Τύπωσε Α$
}
Κλείσε #κ

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...