Πέμπτη 9 Μαρτίου 2017

Παράδειγμα με τελεστές σε ομάδες

Το παράδειγμα εδώ (από 8 Απριλίου 2016), έχει ένα πρόγραμμα που δείχνει πως γίνονται πράξεις, αφαίρεση και πρόσθεση μεγάλων αριθμών που "μένουν" σε αλφαριθμητικά. Μπορεί κανείς να το συγκρίνει με το παλιό παράδειγμα.
Έχω ορίσει τελεστές"+", "-" και  ">". Η εντολή Class ή Κλάση είναι συνάρτηση που δίνει ως επιστροφή ένα αντικείμενο. Το τμήμα (module) Num καλείται και από την συνάρτηση Num() που απλά την καλεί με τις παραμέτρους που δώσαμε ως έχουν. Μάλιστα με την Match() κοιτάμε αν η παράμετρος είναι αλφαριθμητικό (String) και την διαβάζουμε άμεσα, ή αν είναι αριθμός και την κάνουμε αλφαριθμητικό (επειδή βολεύει στο πρόγραμμα να είναι έτσι). Ο κώδικας δεν έχει αλλάξει από τον παλιό παρά ελάχιστα. Μάλιστα το Dimension(M$(),1) θα μπορούσε να γραφτεί ως Len(M$()).

Όπου έχουμε απλό Read σε Module, Operator, Function μπορούμε να το γράψουμε και έτσι (οι παρενθέσεις με τα ορίσματα να ξεχωρίζουν από το όνομα, να ξεχωρίζει το χρώμα τους - μπαίνει αυτόματα στον διορθωτή):

Module Complement (many) {
           b$=""  : m%=1
           ....
           }


Operator ">" (A) {
           ....
           }
Η συνάρτηση Place$() θα μπορούσε να γραφτεί και έτσι σε ορισμό μιας γραμμής με την εντολή Def (απλά είναι μια ευκολία):

Def Place$(A, X)=Right$(String$(" ",X)+A.Val$,X)
 
Αναβαθμίστηκε το παράδειγμα, για να γίνει συμβατό με την έκδοση 9.2 αναθεώρηση 3. Αν και κρατάω την συμβατότητα με τα παλιά προγράμματα, εδώ έπρεπε να αλλάξει η θέση των δυο στοιχείων που θα εκτελεστούν από τον τελεστή. Στην παλαιά έκδοση το This ήταν το αριστεριό μέλος, ενώ τώρα είναι στο δεξιό (πχ το Α+Β γίνονταν με This το B και Push to Α, τώρα γίνεται αλλιώς)


Class Num {
      Val$="0"
      Module Num {
            If Match("S") then {
                  Read .Val$
            } Else {
                  .Val$<=Str$(Number,"0")
            }
      }
      Module Complement {
           read many
           b$=""  : m%=1
           If many>len(.Val$) then .Val$<=string$("0",many-len(.Val$))+.Val$
           For i=len(.Val$) to 1 {
                 m%=9-val(mid$(.Val$, i,1))+m%
                 mm%=m%-10
                 if m%<10 then {
                  b$=str$(m%,"0")+b$ : m%=0
                }   else b$=str$(mm%,"0") +b$: m%=1
           }
           .Val$<=Right$(b$, many)
      }
      Operator ">" {
            Read A
                  If Len(A.Val$)=Len(.Val$) then {
                        Push A.Val$>.Val$
                  } Else.If Len(A.Val$)<Len(.Val$) then {
                        Push True
                  } Else Push False
      }
      Operator "-" {
       Read B
       If This>B then { \\ this is the new operator ">"
            
             B.complement Len(.Val$)
             this<=B+this
             For this {
                  Many=1
                  i=len(.Val$)
                  If i>many then {
                      while many<i {
                        If mid$(.val$,many+1,1)<>"0" then exit
                        many++
                  }
                  if many=i then many--
                        .val$<=mid$(.val$, many+1)
             }
             }
       } Else Error "Error, A<B"       
      }
      Operator "+" {
            Read B
            if B.val$="0" then exit
            Dim Base 0, M$(Max.Data(len(.Val$)+1,Len(B.Val$)+1)+1)
           
            If len( B.Val$)<len(.Val$) then {
                  swap .Val$, B.Val$
            } Else.if len( B.Val$)=len(.Val$) Then {
                  If B.Val$<.Val$ then swap .Val$, B.Val$
            }          
         
            M%=0
            ofs=Len(B.Val$)-Len(.Val$)
            if ofs<0 then error "??????"
            For I=Len(.Val$) to 1 {
                  M%=M%+Val(Mid$(.Val$, I,1))+Val(Mid$(B.Val$, I+ofs,1))
                  M$(I+ofs+1)=Str$(M% mod 10,"0")
                  M%=-(M%>9)
            }
           If M%>0 Then {
                 While ofs>0 {
                          M%=M%+Val(Mid$(B.Val$, ofs,1))
                          M$(I+ofs)=Str$(M% mod 10,"0")
                          M%=-(M%>9)
                          ofs--
                 }
                 If M%>0 Then {
                      M$(0)=Str$(M% mod 10,"0")
                 }    
           }
           F$=""
           For i=0 to Dimension(M$(),1)-1 {
                 F$=F$+M$(i)
           }
           If ofs>0 Then {
                 .Num Left$(B.Val$,ofs)+F$
           } Else .Num F$
      }
}

Function Place$ {
      Read A, X
      =Right$(String$(" ",X)+A.Val$,X)
}
A=Num("20")
B=Num("3")
F=A-B \\ 17
F=F+Num(50) \\ 67
Print Place$(F,len(A.Val$)+2)
A=Num("999999999999999999999999999999999999999999999999999999999999999999999999")
B=Num("3")
M=Num(50)
'F=(M+A)-B  \\ work ok
F=(A-B)+M
Print Place$(F,len(A.Val$)+2)
Print Num(5)>Num(3) '' -1
Print Num("5")>Num("12313") '' 0
Print Place$(Num("5")+Num("10")+Num("150"), 20) ' 165
A=Num("99999")
B=Num("100001")
F=A+B
Print Place$(F,len(F.Val$)+2)
Print F>A

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

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

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