Program integ; const a=0; b=1; E=0.0001; var R,S,Si:real; x,h:real; n,i:integer; function F(x:real):real;
begin F:=sin(x+x*x*x); end; Function Sim(n:integer):real; begin h:=abs(b-a)/n; S:=0;x:=a; for i:=1 to n do begin Si:=(f(x)+4*f(x+h/2)+f(x+h))*h/6; S:=S+Si; x:=x+h; end; Sim:=S; end; Begin n:=1; R:=abs(Sim(n)-Sim(n*2))/15; while(R>E) do n:=2*n; writeln('S=',Sim(n):7:10); readln; end.
TarasBer
9.11.2011 19:53
На какой строчке программа вылетает?
IUnknown
9.11.2011 20:57
[telepathy on]
Цитата
while(R>E) do n:=2*n;
Здесь проблема? Правильно делает, что вылетает: у тебя в цикле не изменяются значения R и E, условие всегда истинно. А вот n очень быстро переполняется, как только оно перестанет помещаться в отведенные 2 байта (ну, или какой там у тебя размер Integer) - тут же произойдет переполнение... [/telepathy off]
Buka
10.11.2011 1:52
Везде поменяла на extended, кроме i, и всё заработало! Спасибо за помощь)
TarasBer
10.11.2011 13:03
После одной лишь замены типа цикл перестал уходить в бесконечность?! Чудеса...
Lapp
10.11.2011 14:13
Цитата(Buka @ 9.11.2011 16:35)
Не могу понять почему не работает
Внимательно вглядись вот в эту строчку: while(R>E) do n:=2*n; - и я уверен, через некоторое время поймешь )).
Вот тебе исправленный (и правильно отформатированный) твой же код:
Program integ; const a= 0; b= 1; E= 0.0001; var R,S,Si: real; x,h: real; n,i: integer;
function F(x: real): real; begin F:= sin(x+x*x*x); end;
Function Sim(n: integer): real; begin h:= abs(b-a)/n; S:= 0; x:= a; for i:=1 to n do begin Si:= (f(x)+4*f(x+h/2)+f(x+h))*h/6; S:= S+Si; x:= x+h; end; Sim:= S; end;
Begin n:= 1; repeat n:= n*2; R:= abs(Sim(n div 2)-Sim(n))/15; until R<=E; writeln('S=',Sim(n):7:10); readln end.
Добавлено через 3 мин. Ой, я, кажется, не обновил браузер.. Мужики, извините, стирать уже не буду.. ))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.