Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2013, 07:01   #1
Doppelganger
 
Регистрация: 12.06.2010
Сообщений: 7
По умолчанию Рекурсия и типизированный файл

Здравствуйте.
По заданию нужно создать типизированный фай, содержащий не менее 10 чисел. Затем посчитать сумму четных значений.

В моей программе загвоздка с процедурой рекурсии. Подскажите, что неверно.

Программа:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Unit1 in 'Unit1.pas';

type
  FileOfInt  = file of integer;
var
fout: FileOfInt;
N, I, m, Buf: integer;
begin
assignfile(fout, 'file1.dat');
writeln ('vvedite kol-vo chisel');
readln (N);
Rewrite(fout);
for I := 1 to N do
  begin
    writeln ('vvedite tseloe chislo');
    readln (m);
    write (fout, m);
  end;
closefile (fout);

Reset(Fout);
Seek (Fout,0);
while not eof(fout) do
begin
  Read(Fout,Buf);
  writeln (Buf);
end;






rekurs;





readln;
end.
Модуль:
Код:
unit Unit1;

interface
type
  FileOfInt  = file of integer;

  procedure rekurs;
implementation
var s, a:integer;
fout: FileOfInt;


//s:=0;
procedure rekurs ;
begin
assignfile(fout, 'file1.dat');

Seek (Fout,0);
while not eof(fout) do
begin

  read(fout,a);
  if a mod 2 = 0 then s:= s+a;
  rekurs;
  

end;

end;
end.
Doppelganger вне форума Ответить с цитированием
Старый 01.06.2013, 08:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
procedure rekurs ;
begin
if not eof(fout) do
begin
  read(fout,a);
  if a mod 2 = 0 then s:= s+a;
  rekurs;
end;
end;
А файл открывай и закрывай отдельно. Seek() вообще не нужен.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.06.2013, 08:42   #3
Doppelganger
 
Регистрация: 12.06.2010
Сообщений: 7
По умолчанию

Я сделал как вы сказали - все равно вываливается ошибка I/O 103.
Doppelganger вне форума Ответить с цитированием
Старый 01.06.2013, 16:15   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вываливается на какой строке?
И потом - покажи как написал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.06.2013, 06:39   #5
Doppelganger
 
Регистрация: 12.06.2010
Сообщений: 7
По умолчанию

Ошибка выходит на этой строке при обоих вариантах:
Код:
//while not Eof(f) do
for I := 0 to filesize(f)-1 do
Вот программа в общем:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Unit1 in 'Unit1.pas';
 //const X = 900;
type
  FileOfInt  = file of integer;
var
fout: FileOfInt;
N, I, m, Buf: integer;
//a :array [1..X] of integer;
begin
assignfile(fout, 'file1.dat');
writeln ('vvedite kol-vo chisel (>=10');
readln (N);
Rewrite(fout);
for I := 1 to N do
  begin
    writeln ('vvedite tseloe chislo');
    readln (m);
    write (fout, m);
  end;
closefile (fout);

assignfile(fout, 'file1.dat');
Reset(Fout);
rekurs;
closefile (fout);
writes;

//I:=1;
//Reset(Fout);
//Seek (Fout,0);
//while not Eof(fout) do
//begin
//read(fout,m);
//a[I]:= m;
//I:=I+1;
//end;

//for I := 1 to N do
  //begin
 //   writeln (a[I]);
// end;

//Reset(Fout);
//Seek (Fout,0);
//while not eof(fout) do
//begin
//  Read(Fout,Buf);
//  writeln (Buf);
//end;

readln;
end.
Код:
unit Unit1;

interface
type
  FileOfInt  = file of integer;

  procedure rekurs;
  procedure writes;
  
implementation
var s, a, I:integer;
f: FileOfInt;



procedure rekurs ;
begin

//while not Eof(f) do
for I := 0 to filesize(f)-1 do
  
begin
read(f,a);
if a mod 2 = 0 then s:= s+a;
rekurs;
end;
end;
procedure writes;
begin
 writeln ('summa = ', s);
end;

end.
Doppelganger вне форума Ответить с цитированием
Старый 02.06.2013, 10:02   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

зачем тут рекурсия?
eval вне форума Ответить с цитированием
Старый 02.06.2013, 10:23   #7
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Пробуйте вот так
Код:
unit Unit1;

interface
Type
   fOut = file of Integer;

procedure OpenThisFile(fName : String);
procedure CloseThisFile();
procedure rekurs(var s : Integer);
implementation
Var
  f : fOut;

procedure OpenThisFile;
Begin
  AssignFile(f, fName);
  Reset(f);
End;
procedure CloseThisFile;
Begin
  CloseFile(f)
End;
procedure rekurs;
Var
  a : Integer;
begin
if not eof(f) then
begin
  read(f,a);
  if a mod 2 = 0 then s:= s+a;
  rekurs(s);
end;
end;
end.
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Unit1 in 'Unit1.pas';

var
  summa : Integer;
Begin
  OpenThisFile('file1.dat');
  summa := 0;
  rekurs(summa);
  CloseThisFile();
  Writeln(summa);
End.
To eval
Задача похожа на простую лабораторную для уч. заведения. А преподаватели легких путей не ищут, вот и суют рекурсию к месту и не очень
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681

Последний раз редактировалось GetMax; 02.06.2013 в 10:27.
GetMax вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
типизированный файл s2dentishe Помощь студентам 2 08.04.2011 16:34
Типизированный файл с натуральными числами. Числа, встречающиеся 1 раз переписать в другой файл [Паскаль] mifomen Помощь студентам 7 16.12.2010 22:00
Типизированный файл Юляшко Паскаль, Turbo Pascal, PascalABC.NET 1 28.04.2010 16:15
Типизированный файл aleksandrdss Помощь студентам 0 08.04.2009 05:01
Типизированный файл Лубышев Помощь студентам 2 11.10.2008 11:08