Ĺadny brzuch
Witajcie.
Znowu mam problem z pascalem.
Rysunek chyba wszystko wyjaśni:
www.krolnet.pl/xx.png
ew. tłumaczę:
b - zaokrąglona zmienna rata;
potem w warunku sprawdzam czy b = rata.
jezeli się równa powinien wyswietlic się jeszcze "x" i powinien zajsc warunek. a nie zachodzi.
b, rata: real;
Użytkownik DJ Mentos edytował ten post 21 wrzesień 2008, 10:26
Podaj najlepiej cały kod, bo nie wiadomo, co się tutaj dzieje. IMO przy porównywaniu ratę też powinieneś zaokrąglać.
var y, zostalo, rata: real; x, i, tmp, calosc: integer; b: real; begin ReadLn(x); zostalo:=x; for i:=1 to 50 do begin rata:= 0.02*x + 0.01*zostalo; zostalo:=zostalo - 0.02*x; WriteLn('kolejka'); b:= Round(rata); WriteLn(rata); WriteLn(b); if rata = b then begin tmp := Round(rata); writeln('x'); end else tmp := Trunc(Rata)+1; calosc:=calosc + tmp; end; WriteLn(calosc); ReadLn;
własnie chodzi o to, że rata nie moze być zaokrąglona.
program ma wykryć przypadki (niedużo ich jest ale są) kiedy zachodzi ten waunek i ma je inaczej potraktowac
Domyślam się, że chcesz wykonać warunek, gdy rata nie nie posiada części ułamkowej.
Nie możesz porównywać liczb zmiennoprzecinkowych w taki sposób. Robi się to tak:
if abs(rata - trunc(rata)) < eps then
Za "eps" wstawiasz małą liczbę (np. 0.0001). Im bardziej zależy Ci na dokładności tym otoczenie powinno być mniejsze, ale nie możesz przesadzać, bo wyjdziesz poza zakres zmiennej, a wtedy otoczenie będzie równe zeru.
Skoro obliczasz raty w złotówkach, to otoczenie będzie zależało od tego jak zakrąglasz grosze. Domyślam się, że jeśli rata wyniesie np. 0.005 zł, to zakrąglisz w górę (0.01 zł). W taki razie odrzucasz wszystko co jest mniejsze od 0.005. Taką wartość możesz podstawić za "eps".
Użytkownik Kozack edytował ten post 21 wrzesień 2008, 22:33
dzięki. teraz działa poprawnie.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Znowu mam problem z pascalem.
Rysunek chyba wszystko wyjaśni:
www.krolnet.pl/xx.png
ew. tłumaczę:
b - zaokrąglona zmienna rata;
potem w warunku sprawdzam czy b = rata.
jezeli się równa powinien wyswietlic się jeszcze "x" i powinien zajsc warunek. a nie zachodzi.
b, rata: real;
Użytkownik DJ Mentos edytował ten post 21 wrzesień 2008, 10:26
Podaj najlepiej cały kod, bo nie wiadomo, co się tutaj dzieje. IMO przy porównywaniu ratę też powinieneś zaokrąglać.
var y, zostalo, rata: real; x, i, tmp, calosc: integer; b: real; begin ReadLn(x); zostalo:=x; for i:=1 to 50 do begin rata:= 0.02*x + 0.01*zostalo; zostalo:=zostalo - 0.02*x; WriteLn('kolejka'); b:= Round(rata); WriteLn(rata); WriteLn(b); if rata = b then begin tmp := Round(rata); writeln('x'); end else tmp := Trunc(Rata)+1; calosc:=calosc + tmp; end; WriteLn(calosc); ReadLn;
własnie chodzi o to, że rata nie moze być zaokrąglona.
program ma wykryć przypadki (niedużo ich jest ale są) kiedy zachodzi ten waunek i ma je inaczej potraktowac
Domyślam się, że chcesz wykonać warunek, gdy rata nie nie posiada części ułamkowej.
Nie możesz porównywać liczb zmiennoprzecinkowych w taki sposób. Robi się to tak:
if abs(rata - trunc(rata)) < eps then
Za "eps" wstawiasz małą liczbę (np. 0.0001). Im bardziej zależy Ci na dokładności tym otoczenie powinno być mniejsze, ale nie możesz przesadzać, bo wyjdziesz poza zakres zmiennej, a wtedy otoczenie będzie równe zeru.
Skoro obliczasz raty w złotówkach, to otoczenie będzie zależało od tego jak zakrąglasz grosze. Domyślam się, że jeśli rata wyniesie np. 0.005 zł, to zakrąglisz w górę (0.01 zł). W taki razie odrzucasz wszystko co jest mniejsze od 0.005. Taką wartość możesz podstawić za "eps".
Użytkownik Kozack edytował ten post 21 wrzesień 2008, 22:33
dzięki. teraz działa poprawnie.