Wątek przeniesiony 2018-09-22 12:46 z Delphi i Pascal przez furious programming.

Konsola za szybko się wyłącza

0

Witam,
mam problem z napisanym przez siebie kodem. Po jego uruchomieniu w kompilatorze, konsola wyłącza się pomimo umieszczenia na końcu kodu wiersza z readln(). Próbowałem też z repeat until keypressed ale też nie pomogło. Wklejam pierwotną wersję kodu w którym umieściłem zapętlenie aż do momentu naciśnięcia klawisza. Program wcześniej działał ale po jego zmodyfikowaniu pod zadanie kolegi program przestał działać jak było zamierzone. Myślę, że to kwestia jakiegoś błędu w kodzie ale nie jestem w stanie go samodzielnie znaleźć dlatego bardzo prosiłbym o pomoc. Załączyłem również zdjęcie zadania.

program moch_1;
var k: integer;
    x: real;
    eps,a,S: single;
    l: char;

begin
repeat
writeln('Program obliczy przyblizona wartosc funkcji (1/((3k+2)*(3k+4)))*x^(3k+4)');
write('Podaj wartosc x: ');
readln(x);
write('Podaj przyblizenie z jakim ma byc obliczona wartosc funkcji: ');
readln(eps);
k:=0;
S:=(x*x*x*x)/8;
a:=(x*x*x*x)/8;
repeat
k:=k+1;
Writeln('k',k);
a:=((x*x*x)*(k+(4/3))*(k+(2/3)))/((k+(7/3))*(k+(5/3)))*a;
Writeln('a=',a);
S:=S+a;
Writeln('S=',S);
until
abs(a)<=eps;
writeln('Czy chcesz zakonczyc prace programu? Y/N');
read(l);
until
l='Y';
end.

3

Nie widzę żadnego ReadLn na końcu programu. Za to widzę Read.

Sformatuj ten kod, bo jest nieczytelny. Dodaj wcięcia, puste linie i odstępy, aby dało się go w ogóle czytać. Program wyłącza się, dlatego że w poniższej linijce leci wyjątek SIGFPE:

a:=((x*x*x)*(k+(4/3))*(k+(2/3)))/((k+(7/3))*(k+(5/3)))*a;

w którejś iteracji z kolei, a Twój program nie posiada kodu odpowiedzialnego za obsługę błędów.


Z szybkiego testu wynika, że wychodzisz poza zakres typu Single. Dla argumentów odpowiednio 2 i 2, wyjątek pojawia się w 46 iteracji. Jeśli zmieni się typ zmiennych z Single na Double, dla tych samych argumentów wyjątek leci w iteracji 346, a dla typu Extended w iteracji numer 5469.

W ten sposób dochodzę do wniosku, że pętla oraz kod znajdujący się w niej jest nieprawidłowy, bo owa pętla wykonuje się bez końca, aż do wykroczenia poza zakres. Popraw więc obliczenia, bo abs(a) z każdą iteracją rośnie, więc nigdy nie będzie mniejsze od eps. Tym bardziej, że Twój kod dupuszcza ujemny eps.

0

Dziękuję za zwrócenie uwagi na wiersz z dokładnością. Najprawdopodobniej zabrakło linijki która porównywałaby różnicę wyrazu k+1 i k z dokładnością.
Problem jest chyba rozwiązany dlatego proszę o zamknięcie wątku

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