Сортировка дат.

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Сортировка дат.

Сообщение Ravil » 10.01.2011 20:17:28

Прочитать даты из файла и отсортировать их на зимние и летние, даты записать в свои файлы. Там где надо подставить 0(вместо 1.1.11 записать 01.01.11). Объясните пожалуйста почему не пишет в файлы?
Код: Выделить всё
program L;
uses crt, sysutils;
   var
     date,summer,winter : text;
     d,day, month, year : string;
   procedure generator;
   const n=60;
     var
     i : integer;
     date: text;
     day, month, year,data : string;
     Begin
      clrscr;
      randomize;
      assign (date, 'd:\data.txt');
      rewrite(date);
         for i:=1 to n do
            begin
               str((random(31)+1), day);
               str((random(12)+1), month);
               str(random(99), year);
               if length(year) =1 then year := '0' + year;
               data:=day+'.'+month+'.'+year;
               writeln(date, data);
            end;
            close(date);
      end;
      begin
         clrscr;
         generator;
            assign(date, 'd:\data.txt');
            assign(summer, 'd:\summer.txt');
            assign(winter, 'd:\winter.txt');
            rewrite(summer);
            rewrite(winter);
         reset(date);      
      while not EOF(date) do
         begin
            readln(date,d);            
               if length(d) = 6 then
                  begin
                     day := '0'+copy(d,1,1);
                     month := '0'+copy(d,3,1);
                     year := copy(d,5,2);                  
                  end;
                     if length(d) = 7 then
                     begin
                        if pos('.',d) = 2 then
                           begin
                              day := '0' + copy(d,1,1);
                              month := copy(d,3,2);
                              year := copy(d,6,2);                              
                           end
                           else
                              if pos('.', d) = 3 then
                              begin
                                 day := copy(d,1,2);
                                 month := '0'+copy(d,4,1);
                                 year := copy(d,6,2);               
                              end;                        
                     end;
                     if ((month='12') or (month='01')) or (month='02') then
                     writeln(winter,(day+'.'+month+'.'+year));
                     if (month='06') or (month='07') or (month='08') then
                     writeln(summer,(day+'.'+month+'.'+year)); 
         end;
end.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Сортировка дат.

Сообщение Vadim » 10.01.2011 21:03:03

Вы работаете в белом и пушистом FreePascal или в убитом насмерть TurboPascal?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Сортировка дат.

Сообщение Padre_Mortius » 10.01.2011 21:22:01

год значит вы можете сделать 2-х значным, а в чем проблема с остальными параметрами (месяц и дата)?
а по поводу сортировки, загружайте все свои данные в массив строк и сортируйте как считаете нужным
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Сортировка дат.

Сообщение Ravil » 10.01.2011 21:36:18

Пишу в Geany(fpc 2.4.2) для TurboPascal. Проблема одна не пишет в файлы зима, лето.

Добавлено спустя 4 минуты 18 секунд:
Попробовал запустить в TurboPascal - всё работает, а как в fpc сделать, чтобы в файлы писало.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Сортировка дат.

Сообщение Padre_Mortius » 10.01.2011 21:43:33

Перепишите ваш код с учетом генерации месяца и дня в 2-х символьном варианте. Так же как у вас генерируется год. А потом посмотрим где ошибка :)

Добавлено спустя 6 минут 39 секунд:
А где закрытие открытых файлов summer и winter?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Сортировка дат.

Сообщение Nik » 10.01.2011 22:12:19

Вот почему удобны unix-даты - сортируются стандартными алгоритмами :)
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Сортировка дат.

Сообщение Padre_Mortius » 10.01.2011 22:26:10

Здесь все упирается в знание паскаля и его модулей. И делается короче, чем приведенный пример.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Сортировка дат.

Сообщение Ravil » 10.01.2011 23:02:43

Не всё сортирует, может кто объяснит?
Код: Выделить всё
program Lr3;
uses crt;
var
     date,summer,winter : text;
     d,day, month, year : string;
   procedure generator;
   const n=60;
     var
     i : integer;
     date: text;
     day, month, year,data : string;
     Begin
      clrscr;
      randomize;
      assign (date, 'd:data.txt');
      rewrite(date);
         for i:=1 to n do
            begin
               str((random(31)+1), day);
               str((random(12)+1), month);
               str(random(99), year);
               if length(year) =1 then year := '0' + year;
               data:=day+'.'+month+'.'+year;
               writeln(date, data);
            end;
            close(date);
      end;
      begin
         clrscr;
         generator;
            assign(date, 'd:data.txt');
            assign(summer, 'd:summer.txt');
            assign(winter, 'd:winter.txt');
            rewrite(summer);
            rewrite(winter);
         reset(date);      
      while not EOF(date) do
         begin
            readln(date,d);            
               if length(d) = 6 then
                  begin
                     day := '0'+copy(d,1,1);
                     month := '0'+copy(d,3,1);
                     year := copy(d,5,2);                  
                  end;
                     if length(d) = 7 then
                     begin
                        if pos('.',d) = 2 then
                           begin
                              day := '0' + copy(d,1,1);
                              month := copy(d,3,2);
                              year := copy(d,6,2);                              
                           end
                           else
                              if pos('.', d) = 3 then
                              begin
                                 day := copy(d,1,2);
                                 month := '0'+copy(d,4,1);
                                 year := copy(d,6,2);               
                              end;
                              if length(d) = 8 then
                              begin
                                 day := copy(d,1,2);
                                 month := copy(d,4,2);
                                 year := copy(d,7,2);                  
                              end;                        
                     end;
                     if ((month='12') or (month='01')) or (month='02') then
                     writeln(winter,(day+'.'+month+'.'+year));
                     if (month='06') or (month='07') or (month='08') then
                     writeln(summer,(day+'.'+month+'.'+year)); 
         end;
         close(date);
         close(summer);
         close(winter);
end.


Добавлено спустя 1 минуту 23 секунды:
Может подскажете - как короче?
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Сортировка дат.

Сообщение Padre_Mortius » 10.01.2011 23:11:54

в процедуре Generator
Код: Выделить всё
if length(year) =1 then year := '0' + year;

по аналогии с этой строкой делайте генерацию даты правильной (по два символа на день и месяц). После этого можно выкинуть половину кода из основного блока программы, ибо он будет не нужен
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Сортировка дат.

Сообщение Ravil » 10.01.2011 23:56:56

По условию дата в файле должна быть в формате 1..31.1..12.00..99, а в отсортированных файлах в формате дд.мм.гг.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Сортировка дат.

Сообщение Padre_Mortius » 11.01.2011 00:03:59

Ну если так, то тогда становится все еще проще... Есть еще какие-нить ограничения, о которых Вы нам не сообщили?

Добавлено спустя 9 минут 39 секунд:
Убирайте ваши условия на сравнение по длине строки, и получайте Ваши параметры через нахождение символа разделителя и известных длин.
т.е.
Код: Выделить всё
Day := Copy(d, 1, Pos('.',d));

остальные получаются таким же образом...
Если такой момент напрягает, то никто не мешает сделать свою функцию разбора строки через цикл
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Сортировка дат.

Сообщение Ravil » 11.01.2011 00:33:11

Ошибаетесь.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Сортировка дат.

Сообщение Padre_Mortius » 11.01.2011 00:36:11

В чем я ошибаюсь? В том, что можно убрать сравнение по длине строки?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Сортировка дат.

Сообщение Ravil » 11.01.2011 00:47:06

если дата 1.1.11 то day будет равен 1. , а надо 01. И с учётом того, что точка может стоять на 2, 3, 5, 6 позициях, короче вряд ли будет. Но я могу ошибаться - только учусь.

Добавлено спустя 2 минуты 31 секунду:
А , что с циклом? Если можно - пример.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Сортировка дат.

Сообщение Padre_Mortius » 11.01.2011 00:53:41

Заранее известно, что длина года всего два символа, т.е. одна из точек четко стоит на позиции длина даты - 2, а вот вторая точка у нас плавающая, может быть как на второй позиции, так и на третьей. На основании этого мы вполне можем получить все три компоненты даты.
Опять таки же нам никто не мещает добавить '0' к дню и месяцу уже при выводе даты в нужный файл
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru
cron