Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Записи(структуры)

Автор: -sad- 21.11.2006 0:43

к завтрашнему дню надо решить эту задачу 'Дан массив записей, содержащих дату (число, месяц, год) и время (час, минута, секунда). Упорядочить этот массив в порядке «возрастания», т.е. от более ранних значений к более поздним. ' Но я даже толком в смысл задачи не въехал. Помогите чем можете. заранее ОгРоМнОе спасибо.

Автор: volvo 21.11.2006 1:03

Цитата
я даже толком в смысл задачи не въехал
Смысл задания - следующий... У тебя есть массив, содержащий определенные структуры... Например, вот такой:
(4-apr-1990;11:00:00), (5-jan-1975;14:11:30), ... ну, и так далее, неважно что там дальше... Те две структуры, которые я привел, не упорядочены по возрастанию... Потому, что дата, содержащаяся во второй, "раньше" даты, содержашейся в первой...

Теперь, как делать... Выбираешь любой метод сортировки отсюда: http://forum.pascal.net.ru/index.php?showtopic=3065
и сожешь сортировать. За одним исключением: сначала надо кое-что изменить. Возьмем, для примера, метод "пузырька", как самый простой и понятный:

Type
arrType = Array[1 .. n] Of Integer;

Procedure Bubble(Var ar: arrType; n: integer);
Var i, j, T: Integer;
Begin
For i := 1 To n Do
For j := n DownTo i+1 Do
If ar[Pred(j)] > ar[j] Then { < }
Begin
T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
End
End;
Он почти подходит для решения твоей задачи... Почти - потому что не предназначен он для сортировки записей, он сортирует целые числа... Еще один препон - нельзя сравнивать между собой записи, ибо это НЕвстроенные типа Паскаля, и он про твой тип ничего не знает. Но если сделать так:
Type
myRec = Record { Здесь - те поля, которые тебе нужны } End;
arrType = Array[1 .. n] Of myRec;

Function isMore(r1, r2: myRec): boolean;
begin
{
Функция сравнивает содержимое полей R1 и R2, и возвращает True, если дата/время, записанные
в R1 больше (позже) даты/времени, записанного в R2; иначе возвращается False

Как именно сравнивать записи - попробуй решить для себя сам... Можно, конечно,
сделать перебор по всем полям, начиная с года, потом месяц, день, ... Но проще,
наверное, будет перевести дату в какое-то универсальное число, например, количество
секунд до записанной даты, прошедшее, скажем, с 1 января 1900 года, и сравнивать эти секунды
}
end;

Procedure Bubble(Var ar: arrType; n: integer);
Var
i, j: Integer;
T: myRec;
Begin
For i := 1 To n Do
For j := n DownTo i+1 Do
If isMore(ar[Pred(j)], ar[j]) Then Begin
T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
End
End;
, то все заработает...

Пробуй, я написал тебе все, что нужно для решения...