Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Задача на текстовый фаил(паскаль)


Автор: nadea11 28.4.2008, 11:02
ПОжалуйста,напишите полный текст проги:
Дан текстовый фаил натуральных чисел,за которыми следует целое отрицательное число.
Используя рекурсивную подпрограмму,вычислиье сумму натуральных чисел файла
Заранее спасибо=)) 

Автор: Dobermann 28.4.2008, 14:35
Ну и где же SneG0K?!?!
Он вроде как благотворительностью занимается........

Автор: Letov 28.4.2008, 18:47
А файл в каком формате? Покажи пример файла...

Автор: mmvds 28.4.2008, 19:19
Раз файл текстовый, то используем нетипизированный формат файла.
Это пример, если числа идут через пробел:
Код

var
  i:integer;
  f:text;
  sum,ch:longint;
begin
  assign(f,'4isl.txt');
  rewrite(f);
  write(f,'1000 123 7348 2838 -100');
  close(f);
  reset(f);
  sum:=0;
  while not eof(f) do begin
  read(f,ch);
  if ch>=0 then sum:=sum+ch;
  end;
  close(f);
  writeln(sum);
end.

строчки
Код

  rewrite(f);
  write(f,'1000 123 7348 2838 -100');
  close(f);

можешь убрать, это для примера.
если каждое число одной строчкой, то read(f,ch) замени на readln(f,ch);

Автор: Letov 28.4.2008, 20:29
Вот рекурсивная функция

Код

function Sum: longint;
var ch:longint;
begin
   if not EoF(f) then
   begin
      read(f, ch);
         if ch>0 then
      Sum:=Sum+ch;
   end;
end;

поправьте, если не прав, с логикой работы функции

Автор: mmvds 28.4.2008, 21:53
сори, забыл что рекурсивная функция нужна

Автор: nadea11 29.4.2008, 11:35
Код

Program P100;
uses crt;
var i:integer;
f:text;
c,h:longint;
function sum:longint;
begin
while not eof do
begin
readln(f,c);
if c>=0 then sum:=sum+c else
if c<0 then sum:=0;
end;
end;
begin
assign(f,'file.txt');
reset(f);
h:=sum;
close(f);
writeln('summa=',h);
end;

Написала сама,учитывая ваши пожелания(но не уверена)
Прошу специалистов прокомментировать и подсказать,если что-то не так smile 

Автор: Letov 29.4.2008, 13:35
1) Пользуйся кнопкой "Код".
2) Вот тут ошибочка:
Код

function sum:longint;
begin
while not eof do
begin
readln(f,c);
if c>=0 then sum:=sum+c else
if c<0 then sum:=0;
end;
end;


Ты рекурсию "загнала" в цикл, т.е. это уже какой-то симбиоз. Я не уверен, что это будет работать правильно (или даже вообще работать)
Тут надо делать ИЛИ цикл, ИЛИ рекурсию!
3) c>=0 !!! Ноль не является натуральным числом! Над делать c>0.
4) eof - это функция, и она должна вызываться с параметром! правильно eof(f), где f: file, или f:text, или f:file of Type.

Автор: nadea11 6.5.2008, 15:42
 to letov
так это же не рекурсия.НЕ можете подсказать,как рекурсивную функцию составить

Автор: Dobermann 6.5.2008, 18:58
Код

Program Factorial; 
{$S+,N+,E+} {Включаем контроль Стека и работу сопроцессора}  
   var  n: Integer; 
   Function Fac(n: Integer): extended;   
     var  F: extended; {Буферная переменная для разгрузки стека сопроцессора} 
{Рекурсивная функция, вычисляющая п! }  
   begin {Рас}   
        if n < 0 then 
        WriteLn ('Ошибка в задании N') else 
        if n = 0 then 
        Fac := 1 else 
      begin 
         F := Fac(n-l) ; Fac := F * n 
      end 
   end {Fac} ; 
begin {main}  
   repeat 
      ReadLn (n) ; 
      WriteLn ('n! = ',Fac(n))  
   until EOF  
end {main} . 


Эта прога с рекурсивной функцией считает факториал.....
Исправить код под твоё задание - просто не поленись =)

Автор: Letov 13.5.2008, 09:55
nadea11, вот это написали Вы, и это не рекурсия (т.е. рекурсия, но не правильная)
Код

function sum:longint;
begin
while not eof do
begin
readln(f,c);
if c>=0 then sum:=sum+c else
if c<0 then sum:=0;
end;
end;


Вот это написал я http://forum.vingrad.ru/index.php?showtopic=208674&view=findpost&p=1495424. И это рекурсия для твоей задачи:
Код

function Sum: longint;
var ch:longint;
begin
   if not EoF(f) then
   begin
      read(f, ch);
         if ch>0 then
      Sum:=Sum+ch;
   end;
end;

Переменная f - файл, является глобальной.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)