[pascal] stringi, odejmowanie

0

chcialem odejmowanie koniecznie na duzych stringach zrobic. No i zrobilem (ale nie zawsze mi dziala poprawnie). Chciałbym żeby ktos rzucil okiem na kod i wytknal jakies bledy, podpowiedzial jakies poprawki (tak zeby zawsze dzialalo). W koncu na błędach człowiek sie uczy, a zapytać kogo nie mam, bo w mojej wsi to sie nikt nie zna.

function toDigit(x : Char) : Byte;
begin
  toDigit:=Ord(x) - 48;
end;

function toChar(x : Byte) : Char;
begin
  toChar:=Chr(x + 48);
end;

function Compare(a, b : String) : Integer;
{
  -1 : a < b
   0 : a = b
   1 : a > b
}
var
  temp : Integer;
begin
  if length(a) < length(b) then temp:=-1;
  if length(b) > length(b) then temp:=1;
  if length(a) = length(b) then
  begin
    if a > b then temp:=1;
    if a < b then temp:=-1;
    if a = b then temp:=0;
  end;
  Compare:=temp;
end;

function substraction(a, b : String) : String;
var
  i, j, temp : Byte;
  S : String;
  flag : Boolean;
begin
  flag:=TRUE;
  if Compare(a, b) = -1 then
  begin
    Replace(a, b);
    flag:=FALSE;
  end;
  while length(a) > length(b) do
    b:='0' + b;
  while length(b) > length(a) do
    a:='0' + a;
  for i:=length(a) downto 1 do
  begin
    if toDigit(b[i]) > toDigit(a[i]) then
    begin
      if toDigit(a[i - 1]) > 0 then
      begin
        temp:=toDigit(a[i]) + 10 - toDigit(b[i]);
        a[i - 1]:=toChar(toDigit(a[i - 1]) - 1);
      end else if toDigit(a[i - 1]) = 0 then
      begin
        j:=i;
        while toDigit(a[j]) = 0 do
        begin
          a[j]:=toChar(9);
          dec(j);
        end;
        a[j]:=toChar(toDigit(a[j]) - 1);
        temp:=10 - toDigit(b[i]);
      end
    end else if toDigit(b[i]) <= toDigit(a[i]) then
      temp:=toDigit(a[i]) - toDigit(b[i]);
    S:=toChar(temp) + S;
  end;
  if flag = FALSE then
    S:='-' + S;
  substraction:=S;
end;
0

np. dla a=555 i b=555 wyskoczy mi 3 zera i taka smieszna buźka:|
albo np. jak a=4567854, a b=346578 to nie wychodzi prawidlowy wynik. why??

0

Z ciekawości napisałem sobie taki kodzik:

var l1,l2,s1,s2: String;
    dalej: Boolean;
    RDlugosci,i,w1: Integer;
    wynik:string;
begin
  dalej:=False;
  l1:='2223';
  l2:='13';
  s1:=ReverseString(l1); //odrwacamy
  s2:=ReverseString(l2);

  if Length(s1)>length(s2) then             //wyrównujemy długośc
    for i:=1 to (length(s1)-length(s2)) do
      s2:=s2+'0';
  if Length(s1)<length(s2) then
    for i:=1 to (length(s2)-length(s1)) do
      s1:=s1+'0';



  for i:= 1 to length(s1) do
    begin
      if dalej then
        begin
          s2[i]:=Chr(Ord(s2[i])+1);
          dalej:=False;
        end;

      if s2[i]<=s1[i] then w1:=StrToInt(s1[i])-StrToInt(s2[i])
      else
        begin
          w1:=10-(abs(StrToInt(s1[i])-StrToInt(s2[i])));
          dalej:=True;
        end;
      wynik:=wynik+IntToStr(w1);
    end;
  wynik:=ReverseString(wynik);
  Label1.Caption:=wynik;
end;

i chyba działa, ale tylko dla wyników dodatnich. Nad ujemnymi siądę w poniedziałek :p

0

no to licze endrique ze podzielisz sie swoimi refleksjami rowniez w poniedzialek ;)

0

No wiesz.. opisał byś chociaż poszczególne funkcje - do czego są .. co nie działa itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1