У меня возникла любопытная проблема. Делаю простейшую задачу по рекуррентным последовательностям.
Вычисляем значения аргумента от 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.




 
 