Вычислить четные числа в файле с помощью рекурсивной процедуры - 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
. Это приводит к запуску рекурсивного процесса обработки чисел из файла и их вывода на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д