У меня возникла любопытная проблема. Делаю простейшую задачу по рекуррентным последовательностям.
Вычисляем значения аргумента от 1 до 20 в десяти равноотстоящий друг от друга точках с шестью заданными точностями вычислений. Результаты вычислений пишутся в текстовый файл.
Есть два варианта решения задачи: программа пользователя и графическое приложение на LCL. В первом варианте все работает на ура, а в графическом приложении с абсолютно тем же самым кодом возникает что-то непонятное. В конец файла не дописывается часть информации: вся последняя строка и часть предыдущей.
Все вычисления были отслежены пошагово, все они выполняются. Проблема возникает только с записью в файл.
Программа проверялась на версии 0.9.28 на win7 и 0.9.22 на winXP.
Код первой:
- Код: Выделить всё
var s, x, gran1, gran2, d, a, eps: real;
i: integer;
tab: TextFile;
begin
writeln ('Vvedite granicy diapazona:');
readln (gran1, gran2); {прочитаем начало и конец диапазона}
d:=(gran2-gran1)/9; {вычислим длину одного отрезка}
x:=gran1; {присваиваем х начальную точку}
AssignFile (tab, 'iteratio.txt');
Rewrite (tab); {создаем текстовый файлик}
while x<=gran2 do {перебираем точки}
begin
eps:=0.1; {задаем первую точность - 1E-1}
while eps>=0.000001 do {пока точность не достигнет 1E-6...}
begin
s:=0; {обнуляем сумму}
i:=0; {задаем k нулевое}
a:=(-1)*x; {задаем а такое, чтобы первый член вышел корректно}
while abs(a)>=eps do {если необходимая точность достигнута, прерываемся}
begin
a:=a*(-1)*(2*i-1)/(2*i+1)/sqr(x); {считаем i-ое слагаемое}
s:=s+a; {сумма + новый член}
i:=i+1; {следующий круг цикла}
end;
s:=pi/2+s; {считаем конечное значение функции}
writeln ('x=', x:11:8, ', tochnost=', eps:8:6, ', arktangens=', s:10:8, ', vsego ciklov=', i+1);
writeln (tab, x:11:8, ' ', eps:8:6, ' ', s:10:8, ' ', i+1); {пишем результаты в файл}
eps:=eps/10; {следующая точность}
end;
// writeln (tab, arctan(x):12:8);
x:=x+d; {следующая точка}
end;
CloseFile (tab); {закрываем файл}
readln;
end.
Код второй:
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var x, eps, s, a, d, gran1, gran2: real;
i: integer;
tab: TextFile;
begin
gran1:=StrToFloat (Edit1.Text);
gran2:=StrToFloat (Edit2.Text);
d:=(gran2-gran1)/9; {вычислим длину одного отрезка}
x:=gran1; {присваиваем х начальную точку}
AssignFile (tab, 'iteratio.txt');
Rewrite (tab); {создаем текстовый файлик}
while x<=gran2 do {перебираем точки}
begin
eps:=0.1; {задаем первую точность - 1E-1}
while eps>=0.000001 do {пока точность не достигнет 1E-6...}
begin
s:=0; {обнуляем сумму}
i:=0; {задаем k нулевое}
a:=(-1)*x; {задаем а такое, чтобы первый член вышел корректно}
while abs(a)>=eps do {если необходимая точность достигнута, прерываемся}
begin
a:=a*(-1)*(2*i-1)/(2*i+1)/sqr(x); {считаем i-ое слагаемое}
s:=s+a; {сумма + новый член}
i:=i+1; {следующий круг цикла}
end;
s:=pi/2+s; {считаем конечное значение функции}
writeln (tab, x:11:8, ' ', eps:8:6, ' ', s:10:8, ' ', i+1); {пишем результаты в файл}
eps:=eps/10; {следующая точность}
end;
// writeln (tab, arctan(x):12:8); {рабочая строка - эталон функции}
x:=x+d; {следующая точка}
Label4.Caption:='Результаты записаны в файл iteratio.txt';
end;
end;
Результат в файле первой, последние две строки:
20.00000000 0.000010 1.52083793 4
20.00000000 0.000001 1.52083793 4
Результат в файле второй по этим же двум строкам:
20.