Παρασκευή 8 Απριλίου 2016

Πρόσθεση ακέραιων αριθμών με όσο μέγεθος θέλουμε (Ι)

Στόχος του προγράμματος είναι να προσθέτουμε δυο αριθμούς με απεριόριστα ψηφία.
Οι αριθμοί γράφονται σε ένα αλφαριθμητικό στην δεκαδική τους μορφή σε ένα αντικείμενο τύπου Ομάδας (Group). Η Κλάση Num δημιουργεί τα αντικείμενα αυτά. Κάθε αντικείμενο θα έχει την Val$ (δημόσια), και ένα τμήμα Num με το οποίο μπορούν να περνούν τιμές ή με αλφαριθμητικό ή με νούμερο. Αν θέλουμε κάνουμε αντιγραφή ενός αντικειμένου σε ένα άλλο. Δείτε το παράδειγμα

Το πρόγραμμα υποστηρίζει μόνο >=0 αριθμούς. Για αρνητικούς πρέπει να φτιάξει κανείς την αφαίρεση!

Μια συνάρτηση Place$() παίρνει το αντικείμενο και έναν αριθμό και δίνει ένα αλφαριθμητικό με μήκος το πλάτος που δίνει ο αριθμός με δεξιά στοίχιση.

Διορθώσεις με Κίτρινο Χρώμα

Class Num {
      Val$="0"
      Module Num {
            If Match("S") then {
                  Read .Val$
            } Else {
                  .Val$<=Str$(Number,"0")
            }
      }
}

Function Place$ {
      Read A, X
      =Right$(String$(" ",X)+A.Val$,X)
}

Function AddNum {
      Read A, B
      Dim M$(Max.Data(len(A.Val$)+1,Len(B.Val$)+1)+1)
      If Len(A.Val$)>Len(B.Val$) Then {
             Push A, B : Read A, B
      } Else.If Len(A.Val$)=Len(B.Val$) then {
            If A.Val$<B.Val$ Then Push A, B : Read A, B
      }
      M%=0
      ofs=Len(B.Val$)-Len(A.Val$)
   
      For I=Len(A.Val$) to 1 {
            M%=M%+Val(Mid$(A.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 {
           A.Num Left$(B.Val$,ofs)+F$
     } Else A.Num F$
     =A
}
A=Num("999999")
B=Num("100000")

Print Place$(A,50);"+"
Print Place$(B,50)
C=AddNum(A, B)
Print Place$(C,50);"="

Print Place$(AddNum(Num("9999999999999999999999999999999999"),Num("11111111000000000000000")), 50)
Print Place$(AddNum(Num("2"),Num("9999999999999999999999999999999999")),50)
Print Place$(AddNum(Num("0"),Num("9999999999999999999999999999999999")),50)

Print Place$(AddNum(Num("0"),Num("0")),50)

For I=1 to 10 {
Print Place$(AddNum(Num("99999999999999999999999999999999999999997"),Num(I)),50)
}

C.Num 1200
\\ Copy C to A
A=C
Print Place$(A,50)
Print Place$(B,50)
C.Num "12000000000000000000000000000000000"
\\ A=C+B
A=AddNum(C,B)
Print Place$(A,50)

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

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

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