Dzielenie liczb zapisanych jako ciąg znaków string

Odpowiedz Nowy wątek
2011-08-30 14:55
0

Witajcie. Problem polega na napisaniu programu który dzieli liczby zapisane jako ciąg(string). Np. wrowadzamy 122394823058439( max do 100znaków) i drugi ciąg przez który dzielimy (np 1232534989), obie liczby są zapisane jako typ string. Póki co mam takie coś, ale gdzieś jest błąd. Może ma ktoś jakieś sugestie? Z góry dzięki za pomoc.

Program string;
uses crt;

var
s1,s2: string;
i,j: integer;
v1,v2,v3,v4: longint;
c: char;

Procedure Dzielenie;
begin
 v3:=v1 div v2;
 v1:=v1-(v3*v2);
 v1:=v1*10;
end;

Procedure WczytajZmienne;
begin
 clrscr;
 writeln('Pierwszy string:');
 readln(s1);
 writeln('Drugi string:');
 readln(s2);
 clrscr;
 for i:=1 to length(s1) do
  v1:=v1*10+ord(s1[i]);
 for i:=1 to length(s2) do
  v2:=v2*10+ord(s2[i]);
 writeln('Twoj wynik to:');
 for i:=1 to j do
  begin
   Dzielenie;
   write(abs(v3));
   if i=1 then write(',');
  end;
 readkey;
end;

Procedure LiczbyPo;
begin
 clrscr;
 writeln('Ile chcesz liczb po przecinku?');
 readln(j);
end;

procedure Menu;
 begin
  clrscr;
  c:=' ';
  v1:=0;
  v2:=0;
  v3:=0;
  writeln('1. Wykonaj dzielenie');
  writeln('2. Zmien ilosc liczb po przeciknu --> ',j);
  writeln('0. Wyjdz');
  c:=readkey;
  case c of
   '1': WczytajZmienne;
   '2': LiczbyPo;
  end;
 end;

begin
 j:=10;
 c:=' ';
 while (c<>'0') and (ord(c)<>27) do
  begin
   Menu;
  end;
end. 

Pozostało 580 znaków

2011-08-30 15:08
0

Póki co mam takie coś, ale gdzieś jest błąd.

Pierwsza myśl: użyj debuggera i podglądu zmiennych.


Pozostało 580 znaków

2011-08-30 15:59
0

Ja się dołączam do Patryka27, ale dodatko radzę się nauczyć pisać proceduralnie, bo to co dałeś jest nieczytelne. Na dodatek jedziesz tylko na zmiennych globalnych, powinni za to obcinać ręce.


Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.
edytowany 1x, ostatnio: payl, 2011-08-30 15:59

Pozostało 580 znaków

2011-08-30 23:41
0
Program string;

Nazwą programu nie może być string, bo to jest słowo kluczowe i jako takie jest zastrzeżone, tzn. nie może być zdefiniowane przez programistę.

for i:= 1 to length(s1) do v1:= v1*10+ord(s1[i]);

Jeżeli chcesz w ten sposób zamienić łańcuch znakowy na liczbę, to jeszcze musisz odejmować 48. Kod będzie wyglądał tak (mam nadzieję, że się domyślisz dlaczego). Oczywiście to samo dotyczy zmiennej s2

for i:= 1 to length(s1) do v1:= v1*10+ord(s1[i])-48;

Aby otrzymać n miejsc po przecinku, pętla musi być do n+1, więc odpowiedni fragment procedury WczytajZmienne będzie taki

for i:= 1 to j+1 do

Jak to poprawisz, to program będzie obliczał poprawnie iloraz wprowadzonych liczb. Jest jednak małe ale.

Abaddon664 napisał(a)

Np. wprowadzamy 122394823058439 (max do 100 znaków)

Niestety, ale dla takich dużych liczb ten sposób nie zadziała. Arytmetyka dużych liczb (w szczególności dzielenie) jest trochę bardziej skomplikowana. Twój algorytm zadziała tylko dla liczb, które mieszczą się w zakresie Longint

Pozostało 580 znaków

2011-08-31 08:30
0

Dzięki za wszelkie sugestie. Czy metoda dzielenia pisemnego sprawdzi się w tym przypadku? Może jest jakiś inny sprawdzony sposób na dzielenie tak dużych liczb?

Dzielenie pisemne jest właśnie takim "sprawdzonym sposobem" którego się używa... - Shalom 2011-08-31 09:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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