Страница 1 из 2
Сортировка дат.

Добавлено:
10.01.2011 20:17:28
Ravil
Прочитать даты из файла и отсортировать их на зимние и летние, даты записать в свои файлы. Там где надо подставить 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.
Re: Сортировка дат.

Добавлено:
10.01.2011 21:03:03
Vadim
Вы работаете в белом и пушистом FreePascal или в убитом насмерть TurboPascal?
Re: Сортировка дат.

Добавлено:
10.01.2011 21:22:01
Padre_Mortius
год значит вы можете сделать 2-х значным, а в чем проблема с остальными параметрами (месяц и дата)?
а по поводу сортировки, загружайте все свои данные в массив строк и сортируйте как считаете нужным
Re: Сортировка дат.

Добавлено:
10.01.2011 21:36:18
Ravil
Пишу в Geany(fpc 2.4.2) для TurboPascal. Проблема одна не пишет в файлы зима, лето.
Добавлено спустя 4 минуты 18 секунд:
Попробовал запустить в TurboPascal - всё работает, а как в fpc сделать, чтобы в файлы писало.
Re: Сортировка дат.

Добавлено:
10.01.2011 21:43:33
Padre_Mortius
Перепишите ваш код с учетом генерации месяца и дня в 2-х символьном варианте. Так же как у вас генерируется год. А потом посмотрим где ошибка
Добавлено спустя 6 минут 39 секунд:А где закрытие открытых файлов summer и winter?
Re: Сортировка дат.

Добавлено:
10.01.2011 22:12:19
Nik
Вот почему удобны unix-даты - сортируются стандартными алгоритмами

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

Добавлено:
10.01.2011 22:26:10
Padre_Mortius
Здесь все упирается в знание паскаля и его модулей. И делается короче, чем приведенный пример.
Re: Сортировка дат.

Добавлено:
10.01.2011 23:02:43
Ravil
Не всё сортирует, может кто объяснит?
- Код: Выделить всё
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 секунды:Может подскажете - как короче?
Re: Сортировка дат.

Добавлено:
10.01.2011 23:11:54
Padre_Mortius
в процедуре Generator
- Код: Выделить всё
if length(year) =1 then year := '0' + year;
по аналогии с этой строкой делайте генерацию даты правильной (по два символа на день и месяц). После этого можно выкинуть половину кода из основного блока программы, ибо он будет не нужен
Re: Сортировка дат.

Добавлено:
10.01.2011 23:56:56
Ravil
По условию дата в файле должна быть в формате 1..31.1..12.00..99, а в отсортированных файлах в формате дд.мм.гг.
Re: Сортировка дат.

Добавлено:
11.01.2011 00:03:59
Padre_Mortius
Ну если так, то тогда становится все еще проще... Есть еще какие-нить ограничения, о которых Вы нам не сообщили?
Добавлено спустя 9 минут 39 секунд:Убирайте ваши условия на сравнение по длине строки, и получайте Ваши параметры через нахождение символа разделителя и известных длин.
т.е.
- Код: Выделить всё
Day := Copy(d, 1, Pos('.',d));
остальные получаются таким же образом...
Если такой момент напрягает, то никто не мешает сделать свою функцию разбора строки через цикл
Re: Сортировка дат.

Добавлено:
11.01.2011 00:33:11
Ravil
Ошибаетесь.
Re: Сортировка дат.

Добавлено:
11.01.2011 00:36:11
Padre_Mortius
В чем я ошибаюсь? В том, что можно убрать сравнение по длине строки?
Re: Сортировка дат.

Добавлено:
11.01.2011 00:47:06
Ravil
если дата 1.1.11 то day будет равен 1. , а надо 01. И с учётом того, что точка может стоять на 2, 3, 5, 6 позициях, короче вряд ли будет. Но я могу ошибаться - только учусь.
Добавлено спустя 2 минуты 31 секунду:
А , что с циклом? Если можно - пример.
Re: Сортировка дат.

Добавлено:
11.01.2011 00:53:41
Padre_Mortius
Заранее известно, что длина года всего два символа, т.е. одна из точек четко стоит на позиции длина даты - 2, а вот вторая точка у нас плавающая, может быть как на второй позиции, так и на третьей. На основании этого мы вполне можем получить все три компоненты даты.
Опять таки же нам никто не мещает добавить '0' к дню и месяцу уже при выводе даты в нужный файл