Στόχος του προγράμματος είναι να προσθέτουμε δυο αριθμούς με απεριόριστα ψηφία.
Οι αριθμοί γράφονται σε ένα αλφαριθμητικό στην δεκαδική τους μορφή σε ένα αντικείμενο τύπου Ομάδας (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)
Οι αριθμοί γράφονται σε ένα αλφαριθμητικό στην δεκαδική τους μορφή σε ένα αντικείμενο τύπου Ομάδας (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.