Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.08.2013
Сообщений: 43
1

Вычислить четные числа в файле с помощью рекурсивной процедуры

22.09.2015, 09:40. Показов 1357. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
помгите, задача очень простая но у меня рекурсия как-то странно себя ведет, когда я выполняю программу она вываливается с ошибкой RunError(5) я так понял это от того что он обращается к процедуре с самого начала,а не с того момента где if, короче пожалуйста поправьте меня или хотя бы скажите что я не так сделал)

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2015, 09:40
Ответы с готовыми решениями:

С помощью рекурсивной функции сложить все четные начиная с 2 до n
Помогите пожалуйста, с решением двух задач 1)С помощью рекурсивной функции сложить все четные...

Получить изображение с не закрашенных квадратов с помощью рекурсивной процедуры
Получить изображение с не закрашенных квадратов с помощью рекурсивной процедуры считая заданным...

Вычислить факториал заданного целого числа с помощью процедуры
вычислить факториал заданного целого числа с помощью процедуры

Вычисление гиперболического косинуса через разложение в ряд Тейлора с помощью рекурсивной процедуры
Мне нужно написать рекурсию на примере Ряда Тэйлора на гиперболический косинус , вообще не...

7
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
22.09.2015, 10:14 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вам, наверное, нужно сделать со вложенными процедурами.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure chet (var createfile:tip);
  procedure Recurse;
  var
    x: integer;
  begin
    if eof(createfile) then
      exit;
    read(createfile, x);
    if условие, которое требуется then
    begin
      writeln(x);
    end;
    Recurse;
  end;
begin
  assign(createfile, 'jhjgjh');
  reset(createfile);
  Recurse;
  close(createfile);
end;
0
Заблокирован
22.09.2015, 18:36 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

спасибо, помогло) но все равно почему то считает не так как надо, мне показывает 10 когда должно быть другое число :/

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure chet (var createfile:tip);
procedure recursive(var sum:integer);
   var x:integer;
   begin
   if not eof(createfile) then
   begin
   read(createfile,x);
 
   if x mod 2=0 then
   sum:=sum+x;
   writeln(x);
 
   Recursive(sum);
   end;
end;
 var sum:integer;
   begin
   writeln;
   write('sum= ');
   assign(createfile, 'data.txt');
   reset(createfile);
   writeln(sum);
   close(createfile);
   end;
может кто с этим поможет)

p.s параметр пробовал убирать, не помогает
p.p.s не очень ясно почему в примере выше вы еще раз вызвали рекурсивную функцию из под основной) ну и с ней у меня тоже 10 выходит почему-то..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
22.09.2015, 18:41 4
У тебя вызова Recursive вообще нет нигде в строках от 16 до 24-ой, так что в файл пишется мусор, который хранился в локальной переменной sum на момент вызова процедуры chet.

Переменную sum в любом случае нужно будет обнулить.
0
Заблокирован
22.09.2015, 19:29 5
volvo, так в моем понимании эта функция и должна вызывать только внутри recursive, иначе я делаю 2 рекурсии, причем вторая непонятно зачем и вывод соответсвующий получается anyway даже если я ее пишу перед 23-й строкой вывод захламляется
переменную sum я так понимаю надо обнулять перед 5-й строкой, но ведь тогда она в каждом цикле будет обнуляться или нет? опять же и это я попробовал и тогда просто нолик добавляет если рекурсивную процедуру вызвать еще раз в основной, и 10 если не вызывать

я так понимаю мне надо вытянуть из рекурсивной процедуры в основую этот sum, но он мне показывает 10
p.s извиняюсь если в чем-то туплю
p.p.s вывод -
Вычислить четные числа в файле с помощью рекурсивной процедуры


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure chet (var createfile:tip);
procedure recursive(var sum:integer);
   var x:integer;
   begin
   sum:=0;
   if not eof(createfile) then
   begin
   read(createfile,x);
   if x mod 2=0 then
   sum:=sum+x;
   writeln(x);
   Recursive(sum);
   end;
end;
 var sum:integer;
   begin
   writeln;
   write('sum= ');
   assign(createfile, 'data.txt');
   reset(createfile);
   recursive(sum);
   writeln(sum);
 
   close(createfile);
   end;
0
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
22.09.2015, 22:01 6
mefisto74, m3fisto, и кто здесь ТС? Клоны что-ль?
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
22.09.2015, 23:05 7
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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.
chet - это оболочка над Recurse, т.к. последняя использует файловую переменную, с которой нужно проводить некие разовые манипуляции (открыть/закрыть). Если не делать обёртки, то потребуется глобальная переменная, а это нехорошо. Я поддался вашему стилю передачи параметров в процедуру, хотя сам бы ограничился отправкой не файловой переменной, а только имени этого файла.
1
0 / 0 / 0
Регистрация: 04.08.2013
Сообщений: 43
24.09.2015, 09:25  [ТС] 8
спасибо) все работает)
0
24.09.2015, 09:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2015, 09:25
Помогаю со студенческими работами здесь

Вычислить с использованием рекурсивной процедуры сумму факториалов
вычислить с использованием рекурсивной процедуры сумму факториалов s = 1!+3!+5!+...+n!

С помощью рекурсивной функции вычислить сумму
Дано натуральное n, действительные a1,a2,...,an.С помощью рекурсивной функции вычислить сумму...

С помощью рекурсивной функции вычислить значение выражения
С помощью рекурсивной функции вычислить x^n по формуле: x^n=1 при n=1, x^n=1/x^|n| при n<0, ...

Вычислить значение выражения с помощью рекурсивной функции
Есть условие: нужно вычислить значение выражения типа V1+V2+Vn, с помощью рекурсивной функции. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru