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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2012, 21:04   #1
wOOp
Пользователь
 
Регистрация: 29.03.2012
Сообщений: 23
По умолчанию Работа с файлами

Помогите пжл с задачкой
Дан строковый файл, содержащий даты в формате «день/месяц/год», Создать два файла целых чисел, первый из которых содержит значения месяцев, а второй значения лет для дат из исходного строкового файла (в обратном порядке).
(Pascal)
Заранее спс =)
wOOp вне форума Ответить с цитированием
Старый 10.04.2012, 02:26   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Код:
uses
  CRT;

var
  f1: text;
  f2, f3: file of integer;

procedure reader;
var
  s: string;
  mon, year, code: integer;
begin
  if eof(f1) then
    exit;
  readln(f1, s);
  s := copy(s, pos('/', s) + 1, length(s) - pos('/', s));
  val(copy(s, 1, pos('/', s) - 1), mon, code);
  val(copy(s, pos('/', s) + 1, length(s) - pos('/', s)), year, code);
  reader;
  write(f2, mon);
  write(f3, year);
end;

begin
  assign(f1, 'in.txt');
  assign(f2, 'month.txt');
  assign(f3, 'year.txt');
  reset(f1);
  rewrite(f2);
  rewrite(f3);
  reader;
  close(f1);
  close(f2);
  close(f3);
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.04.2012, 09:37   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

BDA, хороший код.
вот только имхо, Вы забыли про
Цитата:
из исходного строкового файла (в обратном порядке).
с этим условием сложность решения данной задачи резко возрастает - ведь текстовые файлы не являются файлами прямого доступа...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.04.2012, 10:16   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Serge_Bliznykov, это условие учтено. Чтение происходит рекурсивно.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.04.2012, 10:39   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Serge_Bliznykov, это условие учтено. Чтение происходит рекурсивно.
Ага. Точно! я проглядел очевидное.
Приношу свои извинения - я был неправ.


И для экономии памяти в стеке я бы рекомендовал описать переменную s так:
Код:
var s: string[10];
- всё таки более чем в 20 раз выигрыш в памяти получается.


p.s. кстати, а стек не переполнится, если файлик будет хотя бы 100 кбайтный?! не-не, я понимаю, что задача учебная и что в исходном текстовом файле больше, чем несколько сотен/тысяч записей не предполагается, просто такой теоретический вопрос возник...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.04.2012, 12:31   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Serge_Bliznykov, да, совсем не экономлю
Стек переполнится
В Паскале стек на 64 кбайта, вроде.
Чтобы обойти это ограничение можно сделать так:
Код:
uses
  CRT;

var
  f1: text;
  f2, f3: file of integer;
  s: string[20];
  mon, year, code, i, tmp: integer;

begin
  assign(f1, 'in.txt');
  assign(f2, 'month.txt');
  assign(f3, 'year.txt');
  reset(f1);
  rewrite(f2);
  rewrite(f3);
  while not eof(f1) do
  begin
    readln(f1, s);
    s := copy(s, pos('/', s) + 1, length(s) - pos('/', s));
    val(copy(s, 1, pos('/', s) - 1), mon, code);
    val(copy(s, pos('/', s) + 1, length(s) - pos('/', s)), year, code);
    write(f2, mon);
    write(f3, year); 
  end;
  code := filesize(f2);
  for i := 0 to code div 2 - 1 do
  begin
    seek(f2, i);
    read(f2, year);
    seek(f2, code - i - 1);
    read(f2, tmp);
    seek(f2, i);
    write(f2, tmp);
    seek(f2, code - i - 1);
    write(f2, year);
  end;
  code := filesize(f3);
  for i := 0 to code div 2 - 1 do
  begin
    seek(f3, i);
    read(f3, mon);
    seek(f3, code - i - 1);
    read(f3, tmp);
    seek(f3, i);
    write(f3, tmp);
    seek(f3, code - i - 1);
    write(f3, mon);
  end;
  close(f1);
  close(f2);
  close(f3);
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.04.2012, 13:55   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Чтобы обойти это ограничение можно сделать так:
Круто! Вы, как я погляжу, не ленитесь!

ну, не стоило писать ещё один вариант решения - вполне достаточно было словами его описать!!!
я же специально в вопросе про стек сказал, что мой вопрос теоретический, и что для учебных целей ВПОЛНЕ подойдёт Ваше решение через рекурсию!!


А автору топика удача попёрла - два разных варианта, на любой вкус!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.04.2012, 20:53   #8
wOOp
Пользователь
 
Регистрация: 29.03.2012
Сообщений: 23
По умолчанию

Да это точно =)
Только вот проблема, хотя ее следовало ожидать, каракули в текстовиках
можно ли как-нибудь переписать программу что бы файлы создавались, и выводился рез-т работы в самой программе?
wOOp вне форума Ответить с цитированием
Старый 10.04.2012, 21:06   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Да тут куча способов:
1) можете после проделывания всех операций считать заново файлы с месяцами и годами и напечатать их на экран (для 2 программы)
2) можете дополнительно выводить на экран (в 1 программе):
вместо
Код:
write(f2, mon);
write(f3, year);
написать
Код:
write(f2, mon);
write(f3, year); 
writeln('month ',mon,' year ',year);
3) можете установить hex-редактор и в нем смотреть содержимое получившихся файлов (пользовался этим при отладке).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.04.2012, 21:16   #10
wOOp
Пользователь
 
Регистрация: 29.03.2012
Сообщений: 23
По умолчанию

Ууу, спасибо большое, работает на ура =)
wOOp вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами ashtone9130 Visual C++ 5 04.04.2012 12:46
работа с файлами. tinton Помощь студентам 8 25.11.2011 19:02
Работа с файлами в С++ Speakon Общие вопросы C/C++ 3 20.11.2011 23:31
работа с файлами Женечка92 Помощь студентам 0 13.05.2010 16:01
Работа с файлами snake-as Общие вопросы Delphi 1 19.10.2008 13:38