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

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

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

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

Сообщение Ravil » 11.01.2011 01:00:28

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

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

Сообщение Padre_Mortius » 11.01.2011 01:03:20

Код: Выделить всё
s:=Copy(d, 1, Length(d)-3)

в переменной s мы получим строку d без последних 3-х символов
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

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

Сообщение Ravil » 11.01.2011 01:08:52

Длину строки всё равно нужно знать, а там уже плясать от положения точки.

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

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

Сообщение Padre_Mortius » 11.01.2011 01:18:51

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

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

Сообщение Ravil » 11.01.2011 10:46:26

Строку придётся мерить 3 раза, т.к. она может быть длиной 3..5, а после в зависимости от положения точки получить день и месяц. А год получить после усечения строки. Или нет?

Добавлено спустя 2 часа 47 минут 39 секунд:
Сейчас всё работает как надо, компилится в Geany и правильно работает.
Код: Выделить всё
program L;
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) and (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;                                       
                     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.   
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

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

Сообщение Padre_Mortius » 11.01.2011 14:44:46

Код: Выделить всё
program project1;

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
  randomize;
  Assign(date, 'd:\projects\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:\projects\data.txt');
  Assign(summer, 'd:\projects\summer.txt');
  Assign(winter, 'd:\projects\winter.txt');
  rewrite(summer);
  rewrite(winter);
  reset(date);
  while not EOF(date) do
  begin
    readln(date, d);
    day := copy(d, 1, Pos('.', d) -1);
    year := copy(d, Length(d)-1, 2);
    month := copy(d, Pos('.' , d) +1, Length(d) - Length(day) - Length(year) - 2);
    if Length(day) = 1 then Day := '0' + Day;
    if Length(Month) = 1 then Month := '0' + Month;
    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.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

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

Сообщение Ravil » 11.01.2011 15:56:10

Спасибо. вот только в определении месяца длина year = 2, может просто записать так:
Код: Выделить всё
month := copy(d, Pos('.' , d) +1, Length(d) - Length(day) - 4);


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

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

Сообщение Padre_Mortius » 11.01.2011 17:05:21

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

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

Сообщение Ravil » 11.01.2011 17:12:15

Вроде понял. Я тут книжек накачал надо посмотреть. Ещё раз спасибо, но я не прощаюсь, на очереди - очередь.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Пред.

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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 1

Рейтинг@Mail.ru