Вычислить четные числа в файле с помощью рекурсивной процедуры - Free Pascal
Формулировка задачи:
помгите, задача очень простая но у меня рекурсия как-то странно себя ведет, когда я выполняю программу она вываливается с ошибкой RunError(5) я так понял это от того что он обращается к процедуре с самого начала,а не с того момента где if, короче пожалуйста поправьте меня или хотя бы скажите что я не так сделал)
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this };
type tip=file of integer;
{ TMyApplication }
procedure file_import (var createfile:tip);
var i,x:byte;
begin
assign(createfile,'data.dat');
rewrite(createfile);
x:=0;
for i:=1 to 10 do begin
inc(x);
write(createfile,x);
end;
close(createfile);
end;
procedure file_output (var createfile:tip);
var count:byte;
x:integer;
begin
write('file= ');
assign(createfile,'data.dat');
reset(createfile);
for count:=1 to 10 do begin
read(createfile,x);
write(x,' ');
end;
close(createfile);
end;
procedure chet (var createfile:tip);
var sum,x:integer;
begin
sum:=0;
assign(createfile,'data.dat');
reset(createfile);
writeln;
write('sum= ');
if not eof(createfile) then
begin
read(createfile,x);
if x mod 2=0 then begin
sum:=sum+x;
end;
chet(createfile);
end;
writeln(sum);
close(createfile);
end;
var
createfile:tip;
begin
file_import(createfile);
chet(createfile);
file_output(createfile);
readln;
end.Решение задачи: «Вычислить четные числа в файле с помощью рекурсивной процедуры»
textual
Листинг программы
program RecRecRec; type tip = file of integer; const asFileName = 'Set.dat'; procedure chet(var createfile: tip); procedure Recurse; var x: integer; begin if EOF(createfile) then exit; Read(createfile, x); if not odd(x) then begin writeln(x); end; Recurse; end; begin Assign(createfile, asFileName); reset(createfile); Recurse; Close(createfile); end; var f: tip; i: integer; begin Assign(f, asFileName); rewrite(f); for i := 0 to 21 do Write(f, i); Close(f); chet(f); end.
Объяснение кода листинга программы
В данном коде представлена программа на языке Free Pascal, которая вычисляет и выводит в консоль все четные числа из файла 'Set.dat' с помощью рекурсивной процедуры.
В первой строке объявлен тип данных tip, который представляет собой файл целых чисел.
Далее, в константах, указано имя файла 'asFileName', в котором хранятся числа для обработки.
В следующей строке объявлена сама рекурсивная процедура chet, которая принимает в качестве параметра файловую переменную createfile.
Внутри процедуры chet находится вложенная рекурсивная процедура Recurse, которая выполняет следующие действия:
- Проверяет, достигнут ли конец файла (EOF). Если это так, то процедура завершается.
- Считывает из файла следующее число и сохраняет его в переменной
x. - Проверяет, является ли число четным, используя функцию
odd(если число нечетное, то оно выводится на экран). - Если число четное, то оно выводится на экран.
- Рекурсивно вызывается процедура
Recurseдля продолжения обработки следующего числа из файла. В основной части программы создается файловая переменнаяf, которая ссылается на файл 'asFileName'. Затем, в цикле, в файл записываются числа от 0 до 21. После этого файл закрывается, и вызывается процедураchet, передавая в нее файловую переменнуюf. Это приводит к запуску рекурсивного процесса обработки чисел из файла и их вывода на экран.