Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача на текстовый фаил(паскаль) 
:(
    Опции темы
nadea11
Дата 28.4.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.4.2008

Репутация: нет
Всего: нет



ПОжалуйста,напишите полный текст проги:
Дан текстовый фаил натуральных чисел,за которыми следует целое отрицательное число.
Используя рекурсивную подпрограмму,вычислиье сумму натуральных чисел файла
Заранее спасибо=)) 
PM MAIL   Вверх
Dobermann
Дата 28.4.2008, 14:35 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Ну и где же SneG0K?!?!
Он вроде как благотворительностью занимается........
PM   Вверх
Letov
Дата 28.4.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 22.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 4



А файл в каком формате? Покажи пример файла...


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
mmvds
Дата 28.4.2008, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 22.12.2007

Репутация: нет
Всего: 6



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

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);

Это сообщение отредактировал(а) mmvds - 28.4.2008, 19:21
PM MAIL ICQ   Вверх
Letov
Дата 28.4.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 22.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 4



Вот рекурсивная функция

Код

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;

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

Это сообщение отредактировал(а) Letov - 28.4.2008, 20:54


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
mmvds
Дата 28.4.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 22.12.2007

Репутация: нет
Всего: 6



сори, забыл что рекурсивная функция нужна
PM MAIL ICQ   Вверх
nadea11
Дата 29.4.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.4.2008

Репутация: нет
Всего: нет



Код

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 

Это сообщение отредактировал(а) volvo877 - 29.4.2008, 14:16
PM MAIL   Вверх
Letov
Дата 29.4.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 22.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 4



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.

Это сообщение отредактировал(а) Letov - 29.4.2008, 13:38


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
nadea11
Дата 6.5.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.4.2008

Репутация: нет
Всего: нет



 to letov
так это же не рекурсия.НЕ можете подсказать,как рекурсивную функцию составить
PM MAIL   Вверх
Dobermann
Дата 6.5.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Код

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} . 


Эта прога с рекурсивной функцией считает факториал.....
Исправить код под твоё задание - просто не поленись =)
PM   Вверх
Letov
Дата 13.5.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 22.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 4



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;


Вот это написал я тут. И это рекурсия для твоей задачи:
Код

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 - файл, является глобальной.


--------------------
Не бывает плохих языков программирования. Бывают плохие программисты...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.