Σάββατο 26 Σεπτεμβρίου 2015

Αντικείμενο Χρήστες - Λίστα με κωδικούς (Μ2000)


Το έγγραφο στη Μ2000 ως δομή (τύπος μεταβλητής)

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

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

Έτσι με μια Διάβασε Όνομα$, Κωδικός$, ΑριθμόςΠροσδιορισμού έχουμε τα στοιχεία σε μεταβλητές
Για να πακετάρουμε τα στοιχεία μπορούμε να χρησιμοποιήσουμε την Παράθεση$()
στη γραμμή εντολών (το > είναι το σημάδι εισαγωγής εντολής)

>Τύπωσε Παράθεση$("αλφα "+"βήτα", "@!83_34", 10+2)
"αλφα βήτα", "@!83_34", 12

Προσέξτε πως στην Καταχώρηση βάζουμε και την αλλαγή γραμμής, ώστε να αλλάξει την γραμμή, και όχι όσους χαρακτήρες "πατήσει". Η εντολή Καταχώρηση έχει στην Μ2000 την αντίστοιχη αγγλική Overwrite  (αν και δεν ταυτίζονται οι λέξεις εκτός κειμένου, στο προγραμματισμό έχουν την ίδια έννοια αν η καταχώρηση γίνεται πάνω σε άλλο κείμενο, η άλλη εντολή που καταχωρεί με άλλο τρόπο είναι η Παρεμβολή, η οποία παρεμβάλει χαρακτήρες ή και παραγράφους, και στα αγγλικά υπάρχει αυτή η εντολή ως Insert)

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

Χρειάζεται την αναθεώρηση 54 (διόρθωσα την Τύπωσε #κ,.... (ήθελε διπλό ## και το έφτιαξα).
Προσθήκες/αλλαγές με κίτρινο

Η κλάση Χρήστες έχει μεθόδους:

Νέος.Προσδιορισμός όνομα$, αριθμός   \\ αν υπάρχει ο αριθμός βγάζει λάθος
Χρήστης όνομα$, κωδικός$  \\ αν το όνομα υπάρχει ή αν δεν είναι εντός προδιαγραφών βγάζει λάθος
Αλλαγή.Ομάδας όνομα$, όνομα_ομάδας$  \\ έλεγχος λαθών
Αλλαγή.Κωδικού όνομα$, νέος_κωδικό$  \\ έλεγχος λαθών
Λίστα.Χρηστών    \\ αν έχει υπάρχει τίποτα
Σώσε.Δεδομένα   \\ θα σώσει ακόμα και με κενή λίστα ονομάτων (θα σώσει τους προσδιορισμούς)
Φόρτωσε.Δεδομένα     \\ αν δεν υπάρχει το αρχείο ή είναι κενό βγάζει λάθος

Η κλάση Χρήστες έχει συναρτήσεις:

Προσδιορισμός(όνομα$)  δίνει τον αριθμό, αν δεν υπάρχει βγάζει λάθος
Προσδιορισμός$(αριθμός) δίνει όνομα, αν δεν υπάρχει αριθμός βγάζει λάθος
Καλός.Κωδικός(όνομα$, κωδικός_για_σύγκριση$)  \\ γίνεται έλεγχος (προδιαγραφών-ύπαρξης)

Βοηθητικά Τμήματα:

χρησιμοποιείται ο κατασκευαστής (τμήμα με όνομα αυτό της κλάσης) καθώς και τα κάτω εσωτερικά
ΒρεςΕσωτ1 κάτι_για_αναζήτηση$  \\ επιστρέφει στο σωρό τον αριθμό σειράς παραγράφου.
\\ η ΒρεςΕσωτ1 χρησιμοποιείται σαν συνάρτηση, αφού επιστρέφει μια τιμή. Αλλά περνάμε την
\\ τιμή που ήδη υπάρχει στο σωρό. Άρα το κάνουμε έτσι για οικονομία!
Καλό.Όνομα &όνομα$, ,μέγιστο_μήκος_ονόματος, τίτλος_λάθους$ \\  με αναφορά η όνομα$
Καθάρισε  \\ Καθαρίζει τον αποθηκευτικό χώρο (χρησιμοποιείται στην Φόρτωσε_Δεδομένα)
(αν και δεν έχουμε ιδιωτικά τμήματα στις ομάδες, η ιδέα περί ιδιωτικού εδώ έχει να κάνει με το κρύψιμο, και το κρύψιμο μπορεί να γίνει αν η ομάδα που παράγει η κλάση μπει σε ένα στοιχείο πίνακα, δηλαδή γίνει πτητική όπως λέγεται ομάδα και η οποία εμφανίζεται μόνο στην κλήση της, έτσι οι μέθοδες της δεν βρίσκονται σε ετοιμότητα για κλήση στη λίστα τμημάτων/συναρτήσεων, ομοίως και τα δεδομένα της. Με αυτό το τρόπο μια πτητική ομάδα μπορεί να μετακινείται σε άλλα τμήματα, συναρτήσεις ακόμα και να μένει στο σωρό και να αντιγράφεται - η αντιγραφή είναι πλήρης. Μια πτητική ομάδα δεν μπορεί να πάρει αναφορά, πρέπει να βρει έδαφος και αυτό το κάνει η Για ομάδα { } η οποία δουλεύει και για τις κανονικές ομάδες. Έτσι το "έδαφος" το βρίσκει μόνο για ένα μπλοκ εντολών, με όνομα που παίρνει αυτόματα από το μεταφραστή και εμείς προγραμματιστικά μπορούμε να χρησιμοποιήσουμε το Αυτό.)

Το πρόγραμμα (αντιγράψτε το σε ένα τμήμα):

Κλάση Χρήστες {
νεα_γραμμη$={
}
μέγιστο_ονόματος=20, μέγιστο_κωδικού=10
όνομα_αρχείου$="users.save"
έγγραφο αρχείο_στη_μνήμη$
έγγραφο Προσδιορισμός$
Τμήμα Χρήστες {       \\ ο κατασκευαστής
      .Νέος.Προσδιορισμός "Διαγραμμένος",0
      .Νέος.Προσδιορισμός "Εγγεγραμμένος Χρήστης",1
      .Νέος.Προσδιορισμός "Συντονιστής",2
      .Νέος.Προσδιορισμός "Διαxειριστής",3  \\ μπορούμε να δώσουμε άλλο νούμερο
}                                                                          \\ π.χ. 300
Τμήμα ΒρεςΕσωτ1 {  \\ τμήμα που το χρησιμοποιούμε σαν ρουτίνα
      Διάβασε Ποιός$
      εύρεση .Προσδιορισμός$, Ποιός$
      Αν αριθμός=0 τότε Λάθος "Δεν υπάρχει τέτοιος προσδιορισμός"
      \\\ Διάβασε Παρ, ΘέσηΣτηΠαρ αφήνουμε τα στοιχεία ως έχουν
}
Τμήμα Νέος.Προσδιορισμός {
      φερε 2 \\ περιστρέφει την κορυφή του σωρού με το δεύτερο από τη κορυφή.
      \\ ο σωρός στην Μ2000 λέγεται για άλλους στοίβα. Όμως είναι πολύ ανώτερος
      \\ είναι δυναμική λίστα. Η φέρε μπορεί να φέρει κάποιο στοιχείο από το βάθος 
      \\ με μια κίνηση. Η φερεπισω κάνει το ανάποδο! Η πάνω βγάζει αντίγραφο και 
      \\ αν είναι ομάδα ή πίνακας θα φτιάξει αντίγραφο, όπως για οποιαδήποτε μεταβλητή.
      \\ η πέτα πετάει ένα ή περισσότερα στοιχεία από την κορυφή
      \\ Η βάλε βάζει στοιχεία στην κορυφή και η Σειρά βάζει στο τέλος.
      \\ Η Διάβασε διαβάζει από την κορυφή πάντα. 
      \\ Τμήματα και συναρτήσεις περνούν παραμέτρους στο σωρό.
      \\ Οι συναρτήσεις έχουν δικό τους σωρό, ενώ τα τμήματα έχουν κοινό, 
      \\ αν είναι στην ίδια σειρά κλήσης. Σπάει η σειρά αν ένα τμήμα κληθεί από συνάρτηση
      \\ Όταν καλούμε ένα τμήμα μιας ομάδας (αντικείμενο της Μ2000) δίνουμε τον σωρό
      \\ αυτού που κάλεσε. Έτσι μπορεί η ομάδα να γυρίσει πολλές τιμές σε μια κλήση.

      διάβασε Ν
      \\ αν δεν υπάρχει το νούμερο βγαίνει λάθος άρα δεν αλλάζει το οκ, άρα είμαστε εντάξει!
      δες { οκ=αληθές : Σωρός Νέος { .βρεςεσωτ1 μορφή$("#{0}",Ν) }  :  οκ=Λάθος<>0 }         
      \\ με τη Πέτα πετάμε το αλφαριθητικό στο σωρό αν δεν το χρειαζόμαστε
      Αν οχι οκ τότε πέτα : ΛΑΘΟΣ "Υπάρχει αυτός ο αριθμός"
      \\ Προσοχή στην μεταβλητή της κλάσης χρησιμοποιούμε το <= για αντικατάσταση
      .Προσδιορισμός$<=Μορφή$("{0}#{1}",Γράμμα$, Ν)+.νεα_γραμμή$
}
Συνάρτηση Προσδιορισμός {
      \\ η παράμετρος είναι στο σωρό   \\ ζητάμε εδώ το νούμερο π.χ. 300
      \\ αλλά τα τμήματα κληρονομούν το πατρικό σωρό!
      .βρεςεσωτ1
      \\ η Αριθμός διαβάζει από το σωρό. Εδώ θα διαβάσει αριθμό παραγράφου
      \\ από το έγγραφο .Προσδιορισμός$
      \\ η ΔεξιΜέρος$(α$,β$) γυρνάει το δεξιό μέρος του α$ πριν το β$..(αν υπάρχει το β$ στο α$)
      \\ Η Τιμή(α$) δίνει την τιμή. Για εκφράσεις υπάρχει η Εκφρ("2+5") που κάνει τις πράξεις.
      =Τιμή(ΔεξιΜέρος$(Παράγραφος$(.Προσδιορισμός$, Αριθμός ),"#"))
      \\ το επιπλέον στοιχείο θα διαγραφεί με το πέρας της συνάρτησης
      \\ γιατί οι συναρτήσεις έχουν δικό τους σωρό!
}
Συνάρτηση Προσδιορισμός$ {
      Βάλε μορφη$("#{0}",Αριθμός) \\διαβάζει και βάζει στο σωρό σε μια εντολή
      .ΒρεςΕσωτ1
      =ΑριστεροΜέρος$(Παράγραφος$(.Προσδιορισμός$, Αριθμός ),"#")
}
Τμήμα Καλό.Όνομα {  \\ τμήμα που το χρησιμοποιούμε σαν ρουτίνα
     διαβασε &ονομ$, μέγεθος, λ$
     α=μήκος(ονομ$)
     αν α<3 ή α>μέγεθος ή α<>μήκος(φιλτρο$(ονομ$," "+chr$(34)+.νεα_γραμμή$))  τοτε λάθος λ$
 }
Τμήμα Χρήστης {
      διαβασε ονομ$, κωδ$
      .Καλό.Όνομα &ονομ$, .μέγιστο_ονόματος, "Το όνομα δεν είναι αποδεκτό"
      .Καλό.Όνομα &κωδ$, .μέγιστο_κωδικού, "Ο κωδικός δεν είναι αποδεκτός"
      ευρεση  .αρχείο_στη_μνήμη$, παραθεση$(ονομ$)
      αν αριθμός>0 τότε πέτα 2 : λάθος "Ο χρήστης υπάρχει"
     .αρχείο_στη_μνήμη$<=μορφη$({"{0}","{1}", 1}, ονομ$, κωδ$)+.νεα_γραμμή$  \\προσθέτει γραμμή
}
Τμήμα Αλλαγή.Ομάδας {
      Διάβασε όνομ$, ομαδ$ 
      .Καλό.Όνομα &ονομ$, .μέγιστο_ονόματος, "Το όνομα δεν είναι αποδεκτό"      
      ευρεση  .αρχείο_στη_μνήμη$, παραθεση$(ονομ$)
      αν Αριθμός>0 τότε {
      Διάβασε παρ
            Πέτα
            σωρός νέος {
                  Σωρός  παράγραφος$(.αρχείο_στη_μνήμη$,παρ)
                  \\ ? παράγραφος$(.αρχείο_στη_μνήμη$,παρ)
                  Πέτα : Διάβασε κωδ$ 
                  Καταχώρηση παρ  .αρχείο_στη_μνήμη$=μορφη$({"{0}","{1}", {2}}, ονομ$, κωδ$, .προσδιορισμός(ομαδ$)) + .νεα_γραμμή$
                  \\ ? παράγραφος$(.αρχείο_στη_μνήμη$,παρ)
                  }
      }
}
Τμήμα Αλλαγή.Κωδικού {
      Διάβασε όνομ$, κωδ$ 
      .Καλό.Όνομα &ονομ$, .μέγιστο_ονόματος, "Το όνομα δεν είναι αποδεκτό"      
      .Καλό.Όνομα &κωδ$, .μέγιστο_κωδικού, "Ο κωδικός δεν είναι αποδεκτός"
      ευρεση  .αρχείο_στη_μνήμη$, παραθεση$(ονομ$)
      αν Αριθμός>0 τότε {
      Διάβασε παρ
      Πέτα   \\ πετάμε τη τιμή από το σωρό αντί να την βάλουμε σε μεταβλητή
            σωρός νέος {
                  Σωρός  παράγραφος$(.αρχείο_στη_μνήμη$,παρ)
                  \\ ? παράγραφος$(.αρχείο_στη_μνήμη$,παρ)
                  Πέτα 2 : Διάβασε  τι                  
                  Καταχώρηση παρ  .αρχείο_στη_μνήμη$=μορφη$({"{0}","{1}", {2}}, ονομ$, κωδ$,τι) + .νεα_γραμμή$
                  \\ ? παράγραφος$(.αρχείο_στη_μνήμη$,παρ)
                  }
      }
}
Συνάρτηση Καλός.Κωδικός {
      Διάβασε όνομ$, κωδ$ 
      .Καλό.Όνομα &ονομ$, .μέγιστο_ονόματος, "Το όνομα δεν είναι αποδεκτό"      
      .Καλό.Όνομα &κωδ$, .μέγιστο_κωδικού, "Ο κωδικός δεν είναι αποδεκτός"
      ευρεση  .αρχείο_στη_μνήμη$, παραθεση$(ονομ$)
      αν Αριθμός>0 τότε {
      Διάβασε παρ
      \\\  Πέτα    \\\ δεν χρειάζεται γιατί η συνάρτηση πετάει το σωρό της στην επιστροφή
            σωρός νέος {
                  Σωρός  παράγραφος$(.αρχείο_στη_μνήμη$,παρ)
                  \\ ? παράγραφος$(.αρχείο_στη_μνήμη$,παρ)
                  Πέτα  : Διάβασε  αυτό_τον_κωδικό$
                  }
      }
      =αυτό_τον_κωδικό$=κωδ$
}
Τμήμα Λίστα.Χρηστών {
    αν εγγράφου.μήκος(.αρχείο_στη_μνήμη$)=0 τότε έξοδος
    για ι=1 έως εγγράφου.παρ(.αρχείο_στη_μνήμη$)-1
     σωρός νέος {
          Σωρός  παράγραφος$(.αρχείο_στη_μνήμη$, ι)
          Διάβασε ονομ$, κωδ$, τι
          \\ 7=αναλογική γραφή στοίχιση στη στήλη αριστερά, 4=μήκος στήλης
          \\ 5=αναλογική γραφή στοίχιση δεξιά, 10 το μήκος
          \\ Στην τύπωσε μέρος οι αλλαγές χάνονται στην επόμενη εντολή!
          \\ Δεν έχει αλλαγή γραμμή στο χαρακτήρα όπως η απλή τύπωσε.
          \\ Κάθε φορά που θέτουμε πλάτος στήλης λαμβάνει την τωρινή θέση για αρχή στηλών.
          \\ αυτό γίνεται μόνο στην τριάδα Τύπωσε Πάνω, Τύπωσε Μέρος και Τύπωσε Υπο
          τύπωσε  μέρος $(7,4),γραφη$(ι,"#\)\ ") , $(5,20),ονομ$, $(4,10), .προσδιορισμός$(τι)
          τύπωσε
      }
    επόμενο ι
}
Τμήμα Σώσε.Δεδομένα {
      κ=1
     Ανοιξε  .όνομα_αρχείου$ για ευρεια εξαγωγη ως κ
     \\ η κρυφο$() κάνει κρυπτογράφηση, διπλασιάζει το μήκος
     \\ και κάνει όλους τους χαρακτήρες μεγαλύτερους από 127
     \\ έτσι δεν περιέχει μέσα την αλλαγή γραμμής!
     \\ βάζουμε εν τέλει δυο γραμμές
     Τύπωσε #κ, κρυφο$(.αρχείο_στη_μνήμη$,"1@3434_%2344",1234)
     Τύπωσε #κ, κρυφο$(.Προσδιορισμός$,"1@3434_%2344",4332)   
     Κλείσε #κ
}
Τμήμα Φόρτωσε.Δεδομένα {
     κ=2
     αν δεν υπάρχει(.όνομα_αρχείου$) τότε Λάθος "Δεν υπάρχει αρχείο να φορτώσω"
     αν αρχειου.μηκος(.όνομα_αρχείου$)=0 τότε Λάθος "Το αρχείο δεν έχει τίποτα"
      \\ ευρεια εισαγωγή λέμε εδώ την εισαγωγή Unicode σε UTF16LE
      \\ για τα έγγραφα υπάρχει η Σώσε.Έγγραφο που σώνει με τέσσερις διαφορετικούς τρόπους.
      \\ UTF-8, UTF16BE, UTF16LE, ANSI. δείτε εδώ:
      \\ http://georgekarras.blogspot.gr/2015/08/2000-1.html
     Ανοιξε  .όνομα_αρχείου$ για ευρεια εισαγωγή ως κ
           Γραμμή Εισαγωγής #κ, κάτι$
           Γραμμή Εισαγωγής #κ, κάτι2$
     Κλείσε #κ
     .Καθάρισε    \\ αλλιώς θα κάνουμε συμπλήρωση και όχι αντικατάσταση
     \\ τα έγγραφα με = ή <= κάνουν συμπλήρωση.
     \\ το <= το θέλουμε γιατί αλλιώς ο μεταφραστής θα φτιάξει τοπική μεταβλητή
    .αρχείο_στη_μνήμη$<=φανερό$(κάτι$,"1@3434_%2344",1234)
    .Προσδιορισμός$<=φανερό$(κάτι2$,"1@3434_%2344",4332)
}
Τμήμα Καθάρισε { \\ τμήμα που το χρησιμοποιούμε σαν ρουτίνα
      \\ τα έγγραφα σβήνουν με την εντολή Καθαρό
      Καθαρό .αρχείο_στη_μνήμη$, .Προσδιορισμός$
}
}

\\ Αφού σώσεις το αρχείο από την βήτα, "ξεσκέπασε" τις 4 παρακάτω γραμμές και τρέξε το πρόγραμμα.

\\άλφα=Χρήστες()
\\άλφα.φόρτωσε.δεδομένα
\\άλφα.λίστα.χρηστών
\\έξοδος

βήτα=Χρήστες()

\\\αναφορά βήτα.προσδιορισμός$
Για βήτα {
      \\ το $(4) κάνει αναλογική τη γραφή και 'ότι δεν χωράει σε στήλη πιάνει και άλλη!
      \\ το περιβάλλον δίνει πολλούς τρόπους χρήσης στηλών, ακόμα και άνισου πλάτους!
      \\ ενώ το $(0) την κάνει κλασική το ένα γράμμα κάτω από το άλλο (εξ ορισμού είναι το 0)
      Τύπωσε $(4), "Διαχειριστής", .Προσδιορισμός("Διαxειριστής")
      Τύπωσε .Προσδιορισμός$(3), 3
      Τύπωσε .Προσδιορισμός$(2), 2
     δες ok {  .Νέος.Προσδιορισμός "Παθιασμένος Χρήστης",1
           \\ βγάζει λάθος γιατί υπάρχει το νούμερο
      }
      Αν Λάθος τότε Τύπωσε Λάθος$       
      \\ η Δες {} χωρίς μεταβλητή πετάει το όποιο λάθος, άρα δεν μας κάνει εδώ!
      δες οκ {  .Χρήστης "Γιώργος Καρράς", "12@?34@#1" 
            \\ η οκ δεν θα αλλάξει γιατί το λάθος θα γίνει εσωτερικά στην .Χρήστης
            \\ όμως το διαβάζουμε στη λάθος
      }
      Αν Λάθος τότε Τύπωσε Λάθος$ 
      \\ η λάθος σβήνει όταν την διαβάσουμε         
      .Χρήστης "Γιώργος", "12@?34@#1"
      .Χρήστης "Γιάννης", "12@4334@#1"
      δες οκ {  .Χρήστης "Γιώργος", "12@?34@#1" 
            \\ Βγάζει λάθος γιατί υπάρχει χρήστης με το ίδιο όνομα
      }
      Αν Λάθος τότε Τύπωσε Λάθος$ 
      .Χρήστης "Πέτρος", "324@@43"
      .Αλλαγή.Ομάδας "Γιάννης", "Συντονιστής"

      .Λίστα.Χρηστών     
      .Αλλαγή.Κωδικού "Γιώργος","45@#64"

      .Λίστα.Χρηστών
      Αν .Καλός.Κωδικός("Γιάννης", "12@4334@#1") Τότε Τύπωσε "Ο κωδικός είναι εντάξει"
      Αν Όχι .Καλός.Κωδικός("Γιάννης", "12@5334@#1") Τότε Τύπωσε "Ο κωδικός δεν είναι εντάξει"
      \\ η αναφορά τυπώνει αναλογικό κείμενο με αναδίπλωση λέξεων
      \\ δεν ασχολείται με στήλες
      \\ το 2 σημαίνει κεντραρισμένο κείμενο
      αναφορά 2, "Αποθήκευση στο δίσκο"
      .Σώσε.Δεδομένα
      Αναφορά 2, "Ανάγνωση από το δίσκο"
      .Φόρτωσε.Δεδομένα
      .Λίστα.Χρηστών     

}


Το πρόγραμμα περιέχει το Ευρεία και όχι το ευρία που από λάθος είχε γραφτεί σαν σήμανση εντολής. Παραμένει και το ευρια αλλά εδώ διορθώθηκε στο σωστό Ευρεία (αναθεώρηση 60, έκδοση 8).
Δείτε εδώ σχετικά

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.