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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2009, 18:34   #1
ТРОЯН=)
Пользователь
 
Регистрация: 06.12.2008
Сообщений: 58
По умолчанию Создать файл с данными на основе другого файла. Паскаль))

Всем привет, и вот в очёредной раз мне нужна ваша помощь,как обьяснить незнаю лучше условие задачи напишу:
Дано число К(<10) и текстовый файл содержащий более к строк. Создать новый файл содержащий к последних строк исходного файла.


Как из кол. строк отнять вот эт К и потом его вписать,а то он мне вписывает в файл колю строк а не саи строки((((

Код:
program file8;
 uses crt;
  var
  f,f1:text;
  l,c,k,k:integer;
  fn,n:string;
begin
 textcolor(yellow);
 writeln('BBeDuTe qpAuJI');
 readln(fn);
 assign(f,fn);
 reset(f);
while not eof(f) do
 begin
 readln(f,n);
 c:=c+length(n);
 l:=l+1; {Тут я нахожу кол. строк }
end;
 begin
l:=l-k;
 writeln('KoJLu4ecTBO cTPok  ',l);
 assign(f1,'123221123123123231.txt');
 rewrite(f1);
begin
 writeln(f1,л); {Сдесь я пытаюсь их записать}
end;
 close(f1);
 readln;
end;
end.
From Stilet: Неужели фантазии не хватило назвать нормально?

Последний раз редактировалось Stilet; 16.04.2009 в 08:34.
ТРОЯН=) вне форума Ответить с цитированием
Старый 14.04.2009, 18:39   #2
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Заводится массив строк (array[1 .. 10] of string), поскольку K < 10 (< или <= ?), далее последовательно считываются строки из входного файла. После того, как считана строка, весь массив сдвигается, то есть a[1] := a[2]; a[2] := a[3]; ... a[k - 1] := a[k]; затем на место a[k] присваивается свежесчитанная строка. Так продолжается, пока есть строки.

Когда будет считана последняя строка, в массиве будут находиться как раз последние строки, так что их и вывести.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 14.04.2009, 22:24   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
весь массив сдвигается, то есть a[1] := a[2]; a[2] := a[3]; ... a[k - 1] := a[k]; затем на место a[k] присваивается свежесчитанная строка.
КРАЙНЕ НЕЭФФЕКТИВНО!.
Достаточно организовать циклическую очередь
Код:
MasPointer := 0;
KolString := 0;
while Not Eof(f) do begin
  Readln(f,s);
  inc(KolString);
  inc(MasPointer);
  if MasPointer>10 then MasPointer := 1;
  a[MasPointer] := s;
end;
p.s. KolString можно и не использовать - т.к. по условию задачи в файле количество строк более k

тогда вывод строк в новый файл будет выглядеть так:
Код:
if (k<=KolString) and (MasPointer>0)  then 
begin
 StartPointer := MasPointer - k + 1;
 if StartPointer<1 then StartPointer := StartPointer + 10;
 for i:=1 to k do  begin
   WriteLn(fOut, a[StartPointer]);
   Inc(StartPointer);
   if StartPointer>10 then StartPointer := 1;
 end; 
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.04.2009, 03:08   #4
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
КРАЙНЕ НЕЭФФЕКТИВНО!.
Охотно верю, но для начала сойдёт.


Правда, к Delphi и FPC это не относится, там строки указателями хранятся
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 15.04.2009, 10:09   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Охотно верю, но для начала сойдёт.
ну разве что так... хотя, лучше сразу учится делать как надо!

Цитата:
Правда, к Delphi и FPC это не относится, там строки указателями хранятся
Относится. вы же при записи КАЖДОЙ строки вынуждены сделать 10 присвоений. Это по любому на порядок больше. (Даже если при присвоении идёт просто запись указателя!! кстати, 1) смотря какие строки! shortstring - это то же самое, что и в Pascal,а во-вторых, не забывайте, что AnsiString в Дельфи- это объект с управляемым временем жизни (lifetime-managed) и работает механизм сборки мусора ( garbage collect) - почитать об этом можно, например в "Стив Тейксейра, Ксавье Пачеко. Borland Delphi 5 Руководство разработчика (часть 1)" стр. 68)
А если нужно не 10 последних строчек, а, допустим, 30... в 30 раз больше будет операций сравнения? ;-)

Поэтому, всё таки, лучше использовать эффективные алгоритмы, а не надеяться на 4-х ядерные процессоры и сверхбыстрое железо...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.04.2009, 10:34   #6
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну разве что так... хотя, лучше сразу учится делать как надо!
Не соглашусь. Нужно стремиться к тому, чтобы в каждый момент приходилось решать как можно меньше задач. Прямо как в поговорке: не класть две горошины на одну ложку.

Исходя из своей практики программирования, нужно поскорее добиваться работающего кода. Когда будет работающий код, отталкиваясь от него, можно улучшать, при этом код как можно чаще должен оказываться в рабочем состоянии. У меня иногда бывает, что нужно написать много текста, и оно не заработает, пока всё не напишешь. Всё то время, что я пишу код, я вынужден держать в голове, как он работает, что, где и как, и могу сказать, это работа напряжённая, да ещё и отлаживать каждый раз приходится. Обязательно где–нибудь ошибка будет. Но как только всё отлажено, можно сбросить буферы, и уже дальше решать, что делать. Улучшать можно в разные стороны. А можно и не улучшать.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Относится. вы же при записи КАЖДОЙ строки вынуждены сделать 10 присвоений. Это по любому на порядок больше.
Не смертельно. 10 присвоений — это намного меньше, чем 10*256 копирований байта (или 10*128 копирований слова). Тут смысл в очевидности для ТС. Если понятен метод, то и с круговой очередью всё просто. А вот так вот с ходу навалиться всеми подробностями не очень понятно получится.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
смотря какие строки! shortstring - это то же самое, что и в Pascal,а во-вторых, не забывайте, что AnsiString в Дельфи- это объект с управляемым временем жизни (lifetime-managed) и работает механизм сборки мусора ( garbage collect)
А ещё я знаю, что у WideString нет счётчика ссылок, зато их можно использовать в функциях DLL. (AFAIK в Delphi 2009 их переименовали в OLEString, а WideString теперь тоже со счётчиком ссылок, а в FPC счётчик ссылок для WideString был с самого начала)
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 15.04.2009, 17:32   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Не соглашусь. Нужно стремиться к тому, чтобы в каждый момент приходилось решать как можно меньше задач.
Погодите-ка... давайте не будем уходить в дебри теорий.
Конкрентно. Приведённый мною код не работает? (честно скажу - я его не проверял и даже не компилировал!!) Или запись в массив "по кругу" используя указатель - это сложно для понимания/отладки?!

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

p.s. мне, например, очень удивителен Ваш спор, т.к. на мой взгляд, сложность предложенного мною алогоритма не больше, чем с переносом элементов массива, а эффективность очевидно выше... впрочем, думаю, что это как раз пример разных взглядов у разных программистов...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2009, 02:37   #8
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.s. мне, например, очень удивителен Ваш спор, т.к. на мой взгляд, сложность предложенного мною алогоритма не больше, чем с переносом элементов массива
Я не за себя спорю, мне всё очевидно, я пытаюсь быть адвокатом ТС. Впрочем, без самого ТС в теме это не может быть всерьёз.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 16.04.2009, 02:44   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

А что, с конца файла нельзя считать k строк?!

(Да ещё их там может и не оказаться, да?)
Sasha_Smirnov вне форума Ответить с цитированием
Старый 16.04.2009, 05:53   #10
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Можно (кстати, вот и наглядная демонстрация, почему можно было не делать циклическую очередь), только в разделе «Помощь студентам» это вряд ли прокатит.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BMP-файл внутри другого файла Pashan Общие вопросы C/C++ 0 08.04.2009 16:37
Помогите создать компонент на основе PageControl SibBear Компоненты Delphi 5 23.03.2009 16:28
Паскаль, файл с данными Алина-малина Помощь студентам 11 13.12.2008 21:38
Два XL файла, данные 1-го файла являются частью другого в формуле 2-го Кот Microsoft Office Excel 2 14.08.2007 16:56
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15