Παρασκευή, 4 Δεκεμβρίου 2015

Γενικός Απαριθμητής Συνδυασμών IIΙ (με πίνακα με κλάσεις)


Εδώ έχουμε μια μεταβλητή Bit που καθορίζουμε πόσα Bit (μετρητές) θα έχει ο δυαδικός μετρητής μας! Έχουμε μια εξωτερική συνάρτηση που βάζει αρχική κατάσταση στον μετρητή και με παραλλαγή τον αυξάνει όσο ένα νούμερο που βάζουμε.
Δεν μπορούμε να περάσουμε με αναφορά πίνακα και προς το παρόν (μάλλον θα το φτιάξω) η ισχνή αναφορά για στοιχείο πίνακα θέλει να βγάλουμε μια ισχνή αναφορά (είναι αλφαριθμητικό) σε μια μεταβλητή με ίδιο όνομα με τον πίνακα, στο ίδιο τμήμα. Μπορούμε να έχουμε με ίδιο όνομα μεταβλητές, τμήματα, συναρτήσεις, και πίνακες! Μπορούμε να δώσουμε όνομα πίνακα ίδιο με όνομα συνάρτησης και ίδιο με εσωτερική συνάρτηση. Εδώ για παράδειγμα ενώ υπάρχει η Τέλος() ως εσωτερική συνάρτηση, δείχνει το τέλος αρχείου με κάποιο αριθμό που δίνουμε, με τις τελείες στα ονόματα παρακάμπτει ο διερμηνευτής τον έλεγχο για εσωτερικές εντολές (δεν έχουν τελείες στην αρχή). Για να ξεχωρίσει την συνάρτηση από το πίνακα πρέπει να βοηθήσουμε με το @ αμέσως μετά την παρένθεση, έχουμε ή όχι παραμέτρους. Έτσι ο διερμηνευτής θα φέρει το 20 και μετά το 10 ενώ βγάζει λάθος μετά αφού δεν υπάρχει ανοικτό αρχείο 1.

Συνάρτηση Τέλος {
      =10
}
Πίνακας Τέλος(10)=20
Τύπωσε .Τέλος(3), .Τέλος(@)
Δες {
Τύπωσε  Τέλος(1)} ' eof(1)  τέλος αρχέιου 1


Ας δούμε το πρόγραμμα (αν και το βέλτιστο θα ήταν μια ομάδα με πίνακα τους μετρητές και αντί για ισχνή αναφορά με κλήση  θα είχαμε επιλογή πίνακα όπως στη πρώτη ανάρτηση, αλλά με επιπλέον πίνακες για τις μεταβλητές! Επιπλέον διαχωρίσαμε την την Μέτρησε σε ΜέτρησεΜόνο (χωρίς καμία εισαγωγή) και μια Μέτρησε με ή χωρίς εισαγωγή. Ειδικά το δεύτερο εξαρτιέται με το τι υπάρχει στο σωρό. Μια καλή πρακτική είναι να βάζουμε το Σωρός Νέος { } πριν από το πέρασμα ή μη τιμών  από μεταβλητής εισόδου εισαγωγές. Εδώ πάντως βλέπουμε την μέθοδο με τη συνάρτηση (η συνάρτηση δεν κληρονομεί το σωρό από εκεί που την καλούν -εκτός αν την καλούν με Κάλεσε). Έτσι δεν έχουμε θέμα! Άλλος τρόπος πιο ασφαλείας είναι να περνάμε στην αρχή ένα νούμερο με το πόσα στοιχεία ακολουθούν αν καλούμε τμήμα και θέλουμε μεταβλητή εισαγωγή!
Η Βαλε_Αρχική_Θέση() 
θέλει μια αναφορά σε πίνακα και ή έναν αριθμό για να μετρήσει  ή τα περιεχόμενα του μετρητή, ξεκινώντας από το πιο σημαντικό ψηφίο. Αν δώσουμε λιγότερα δεν θα έχουμε θα έχουμε πρόβλημα! Αλλά θα αλλάξουμε μόνο τα λιγότερα σημαντικά. οκ=Βαλε_Αρχική_Θέση(&Α(),1,0,0,0,0)
Εδώ θα βάλουμε το 32 (σε δυαδικό) χωρίς να πειράξουμε τα άλλα bit μέχρι το 11ο
Αν δώσουμε παραπάνω από όσα μπορεί να πάρει ο πίνακας τότε βγαίνει λάθος!

Κλάση μετρ {
      αρ,μηδ=0,μεγ=1,μεγ1=0,ισχνή$
      συνολο
      Τμήμα μετρησε {
            κ=0
            Αν Ταύτιση("Α") Τότε διαβασε κ
            \\ ένα μπλοκ με την κυκλικά κάνει επανάληψη
            \\ η εντολή κυκλικά αλλάζει μια σημαία εσωτερικά
            \\ ο έλεγχος της σημαίας γίνεται στο τέλος του μπλοκ
            {
                  κ--
                  .ΜέτρησεΜόνο
                  Αν κ>0 Τότε κυκλικά
            }
      }
      Τμήμα ΜέτρησεΜόνο {
            .αρ++
            .συνολο++
            Αν .αρ>.μεγ1 Τότε {
                  .αρ<=.μηδ
                  Αν .ισχνη$<>"" Τότε ενθεση .ισχνη$+".μέτρησε"
            }
      }
      Τμήμα μετρ {
            Αν Ταύτιση("ΑΑ") Τότε {
                  διάβασε .μηδ, .μεγ : .μεγ1<=.μεγ-1+.μηδ
                  .αρ<=.μηδ
            } Αλλιώς.Αν Ταύτιση("Α") Τότε {
                  διάβασε .μεγ : .μεγ1<=.μεγ-1
                  .αρ=.μηδ
            }
            Αν Ταύτιση("Γ") Τότε {
                  Διάβασε .ισχνη$
            }
      }
      Συνάρτηση ολαμαζί$ {
            α$=""
            Αν .ισχνη$<>"" Τότε ενθεση "α$= "+.ισχνη$+".ολαμαζι$()"
            Αν α$="" Τότε {
                  =α$+Μορφή$("{0}",.αρ)
            } Αλλιώς {
                  =α$+Μορφή$(", {0}",.αρ)
            }
      }
}
\\ θα χρησιμοποιήσουμε μια συνάρτηση για να περνάμε τιμές
\\ εξωτερική από τη κλάση. Θέλουμε να περνάμε τιμές σε όλους
\\ τους μετρητές του πίνακα
\\ Χρησιμοποιούμε Συνάρτηση
Συνάρτηση Βαλε_Αρχική_Θέση {
      Διάβασε &Χ(), Ν
      Αν μέγεθος.σωρού>0 τότε {
            Βάλε Ν '' ξαναβάζω στο σωρό!
            Ν=μέγεθος.σωρού-1
            Δες οκ {
                  Επανέλαβε {
                        Για Χ(Ν) { .αρ=
 (Αριθμός -.μηδυπολ .μεγ+.μηδ
                       }
                        Ν--
                  } μέχρι Ν<0
            }
            Αν όχι οκ τότε Άδειασε Λάθος : Λάθος "λάθος στην παράμετρο "+γραφη$(Ν)
      } αλλιώς {
            Χ(0).μέτρησε Ν
      }
      =αληθής
}


Bit=11
Πίνακας Α(Bit)=μετρ()
καθαρό ισχνή$ ' υπάρχει και το Τοπική και το Γενική που ορίζουν μεταβλητές δίχως τιμή
\\ το Για Αυτό { } φτιάχνει προσωρινές μεταβλητές
\\ το ίδιο κάνει και το Για Α(0) { } παρακάτω
Για Αυτό { τοπική Α : Βάλε : Διάβασε ισχνή$ } ' τώρα δεν υπάρχει Α
\\ η ισχνή$ έχει το "εκτελέσιμο" όνομα του τμήματος και αυτό ".Α"
\\ άρα για να βγάλουμε την ισχνή αναφορά (δείκτης με όνομα)
\\ πρέπει να προσθέσουμε παρενθέσεις και την θέση (δείκτης στο πίνακα)
Για ι= 0 έως Bit-2 {
      \\ ο κατασκευαστής μπορεί να κληθεί σαν τμήμα, χωρίς επιστροφή ομάδας!
      Α(ι).μετρ 0, 2, ισχνή$+μορφη$("({0})",ι+1)
}


Α(ι).μετρ 0, 2 ' Bit-1  - χωρίς cascade


οκ=Βαλε_Αρχική_Θέση(&Α(),1,0,0,1,1,0,0,0,0,0,0)

οκ=Βαλε_Αρχική_Θέση(&Α(),3)
\\ το σωστό είναι να είναι η επανάληψη μέσα στο άνοιγμα του Α(0)
\\ Αλλιώς προκαλούμε άνοιγμα/κλείσιμο σε κάθε επανάληψη


Για Α(0) {
      Για ι=1 Έως 10 {
            Τύπωσε .ολαμαζί$(), .συνολο
            .ΜετρησεΜόνο
      }
}


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

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