Вычислить четные числа в файле с помощью рекурсивной процедуры - 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, которая выполняет следующие действия:

  1. Проверяет, достигнут ли конец файла (EOF). Если это так, то процедура завершается.
  2. Считывает из файла следующее число и сохраняет его в переменной x.
  3. Проверяет, является ли число четным, используя функцию odd (если число нечетное, то оно выводится на экран).
  4. Если число четное, то оно выводится на экран.
  5. Рекурсивно вызывается процедура Recurse для продолжения обработки следующего числа из файла. В основной части программы создается файловая переменная f, которая ссылается на файл 'asFileName'. Затем, в цикле, в файл записываются числа от 0 до 21. После этого файл закрывается, и вызывается процедура chet, передавая в нее файловую переменную f. Это приводит к запуску рекурсивного процесса обработки чисел из файла и их вывода на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы