Παρασκευή 25 Σεπτεμβρίου 2015

Προγραμματισμός 0003- Από PowerBasic σε M2000

1. Νέα Αναθεώρηση 53
Μια διόρθωση στη κλήση από την γραμμή εντολών γενικής (σφαιρικής) συνάρτησης (είχε σπάσει όπως λέμε στην έκδοση 51).
Επιπλέον η Ένωση ενώνει (με αναφορά) και συνάρτηση μέσα σε τμήμα ομάδας (και η συνάρτηση επίσης της ομάδας ). (εδώ μπορούμε να λέμε όπου ομάδα και κλάση, η κλάση είναι ο κατασκευαστής, το αντικείμενο είναι η ομάδα)

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

class alfa {
      kapa
      dim a(1)
      module putone {
            read .a(0)
            print type$(.a(0))
      }
      module doit2 {
            print "doit2"
            .a(0).doit
            print .a(0).kapa
      }
      module doit {
             \\ change <= with = t
            for .kapa<=1 to 10 { \\here <= needed
            }
      }
}


beta=alfa()
beta.doit
print beta.kapa
dim a(10)
a(2)=alfa()
for a(2) { for .kapa=1 to 100 {} } \\ no <= needed
print a(2).kapa
a(2).doit
print a(2).kapa
a(2).putone beta

a(2).doit2

2. Ένα ζήτημα με το Για διευθετήθηκε.
Η νορμάλ λειτουργία κάνει το ι να παραμένει 1 μετά την εκτέλεση του Για, γιατί δεν έχει επιλεγεί κανένα βήμα.
Για ι=1 έως 1 { }
Στη νέα αναθεώρηση έχουμε επιπλέον αυτό
Για ι=1 έως 1 ανά 1 { }
εκτελεί μια φορά το μπλοκ και δίνει 2 στην έξοδο
Για ι=1 έως 1 ανά -1 { }
εκτελεί μια φορά το μπλοκ και δίνει 0 στην έξοδο
Κανονικά δεν λογαριάζει πρόσημο η Για στην ανά, επειδή λαμβάνει την κατεύθυνση από το πρώτο στο δεύτερο αριθμό. Το πρόβλημα που λύθηκε θα παρουσιαστεί αν ο πρώτος αριθμός είναι μεταβλητή και αλλάζει τιμές και κάποια στιγμή πάρει τιμή ίση με τον δεύτερο. Και αυτό γιατί μπορεί μέσα στο μπλοκ να έχουμε έναν έλεγχο συνθήκης και να κάνουμε έξοδο ή όχι και ανάλογα να κοιτάμε στην έξοδο του Για αν η μεταβλητή του είναι +1 ή -1 ανάλογα από την τελευταία τιμή. Μόλις λοιπόν πάρει στη μεταβλητή στη θέση του πρώτου αριθμού τιμή ίση με το δεύτερο τότε το +1 και -1 δεν έρχεται άρα υποθέτει το επόμενο τμήμα ότι είχαμε ένα "οκ" από έξοδο μέσα στο Για.
Έτσι αν βάλουμε το ανά 1 ή ανά -1 (μπορεί να είναι και άλλο νούμερο), θα έχουμε σίγουρα αλλαγή της μεταβλητής σε σχέση με το δεύτερο - το τελικό νούμερο.
Σε μερικές γλώσσες αν έχουμε αρνητικό βήμα και ο πρώτος είναι μικρότερος από το δεύτερο δεν εκτελείται το μπλοκ εντολών. Στη Μ2000 πάντα θα εκτελεστεί μια φορά το μπλοκ (ακόμα και αν βρει μια εντολή που λέει έξοδος, και εκτελέσει μόνο αυτή, θεωρούμε ότι το μπλοκ εκτελέστηκε)

3. Συνάρτηση Round()
Δεν υπάρχει ενσωματωμένη (εδώ σε μια γραμμή ορισμός κατά το πρότυπο της Basic)
Υπάρχει πια αλλά κάνει κάτι άλλο!(στρογγυλεύει στο 13ο δεκαδικό, ή σε κάποιο μικρότερο αν δώσουμε δεύτερη παράμετρο, όμως όχι για να το κάνει ακέραιο!)

Def Round1(x)=Int(X+.5)
κάνε Στρογγύλεψη(Χ)=Ακ(Χ+.5)
Print Round1(4.999)
Τύπωσε Στρογγύλεψη(4.999)


Η εντολή κάνε μετατρέπει την γραμμή σε πραγματική συνάρτηση
Συνάρτηση Στρογγύλεψη {
     Διάβασε Χ
     =Ακ(Χ+.5)
}

Αυτό σημαίνει ότι μπορούμε να την περάσουμε με αναφορά:

Τμήμα ΠάρεΝούμερα {
      διάβασε &Πώς()
      ενώ όχι κενό { Τύπωσε Πώς(Αριθμός) }
}
Βάλε 100
Σωρός Νέος { \\ ζητάω νέο σωρό γιατί αλλιώς θα πάρει και το 100
ΠάρεΝούμερα &Στρογγύλεψη(), 1.56, 2.34,14.89
}


Τύπωσε Αριθμός

4. Μετατροπή από PowerBasic σε M2000
Οι θέσεις ν βασιλισσών σε σκακιέρα ν x ν

\\ adaptation from Power Basic
\\ option base 1 change to +1 for each dim
\\ all If Goto change to If Then Goto
\\ incr change to variable++
\\decr change to variable--
\\ return all solutions
   input "n=",n
   dim a(n+1), s(n+1), u(4*n-2+1)
   for i=1 to n: a(i)=i: next i
   for i=1 to 4*n-2: u(i)=0: next i
   m=0
   i=1
   r=2*n-1
   goto 20
10 s(i)=j
   u(p)=1
   u(q+r)=1
    i++
20 if i>n then goto 60
   j=i
30 z=a(i)
   y=a(j)
   p=i-y+n
   q=i+y-1
   a(i)=y
   a(j)=z
   if u(p)=0 and u(q+r)=0 then goto 10
40 j++
   if j<=n then goto 30
50 j--
   if j=i then goto 70
   swap a(i),a(j)
   goto 50
60 m++
   for k=1 to n: print a(k);: next k : print
70 i--
   if i=0 then goto 80
   p=i-a(i)+n
   q=i+a(i)-1
   j=s(i)
   u(p)=0
   u(q+r)=0
   goto 40
80 print m






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

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

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