Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.12.2008, 17:51
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию сортировка

помогите пожалуйста сортировать из записи дату..

вот такая вещь:

Код:
type
recp = record
       names: string;
       date : array[1..3];
       end;

var
...
zapis1 : array[1..10] of recp;
zapis2 : recp;

...
в date содержатся 3 поля:
date[1] - чило
date[2] - месяц
date[3] - год


нужно сортировать по всей дате... помогите пожалуйста..

писал так:

Код:
 for i:= 1 to n-1 do
           repeat
             flg := 0;
               if (zapis1[i].date[3] > zapis1[i+1].date[3]) then
                 begin
                   zapis2 := zapis1[i];
                    zapis1[i] := zapis1[i+1];
                   zapis1[i+1] := zapis2;
                 flg := 1;
                 end;
until flg = 0;

вобщем здесь сортировка работает, но только по году.

если я начинаю дальше сортировать по месяцу то сортируется только по месяцу..
пробовал обойтись и таким методом:

Код:
for i:= 1 to n-1 do
           repeat
             flg := 0;
               if (zapis1[i].date[3] > zapis1[i+1].date[3]) and
                  (zapis1[i].date[2] > zapis1[i+1].date[2]) and
                  (zapis1[i].date[1] > zapis1[i+1].date[1]) then
                 begin
                   zapis2 := zapis1[i];
                    zapis1[i] := zapis1[i+1];
                   zapis1[i+1] := zapis2;
                 flg := 1;
                 end;
until flg = 0;

тоесть сортировка сазу по всей дате, но н сортирует только по числу

помогите пожалуйста!
Ответить с цитированием
  #2  
Старый 14.12.2008, 20:00
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

неужели никто не поможет с сортировкой?
Ответить с цитированием
  #3  
Старый 14.12.2008, 20:07
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Попробуй сортировать так:
Код:
function GetNum(i: integer): integer;
begin
 Result :=  zapis1[i].date[3] * 1000 + zapis1[i].date[2] * 100 + zapis1[i].date[1];
end;

procedure Sort;
......
 if GetNum(i) > GetNum(i + 1) then begin
  ....
  обмен
  ....
 end;
.....
end;
Ответить с цитированием
  #4  
Старый 14.12.2008, 20:09
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

функции нельзя использовать...

p.s. задание такое

Последний раз редактировалось ApplicatiOn, 14.12.2008 в 20:12.
Ответить с цитированием
  #5  
Старый 14.12.2008, 20:14
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

ну тогда не используй функцию, я написал так, чтобы понятнее было.
Код:
procedure Sort;
......
 if (zapis1[i].date[3] * 1000 + zapis1[i].date[2] * 100 + zapis1[i].date[1]) >   (zapis1[i + 1].date[3] * 1000 + zapis1[i + 1].date[2] * 100 + zapis1[i + 1].date[1])  then begin
  ....
  обмен
  ....
 end;
.....
end;
Ответить с цитированием
  #6  
Старый 14.12.2008, 20:16
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

я функции не знаю (только процедуры).. во втором варианте понятнее, спасибо)
Ответить с цитированием
  #7  
Старый 14.12.2008, 20:26
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

он сортирует только по числу почему-то.. если смотреть по году то он не сортировал..
Ответить с цитированием
  #8  
Старый 14.12.2008, 20:26
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Нет! Лучше дату представить в вещественном формате
Код:
type
 TMyRec = record
           AName: String;
           ADate: TDateTime;
          end;
var
 MyRec : array [1..10] of TMyRec;
 AMyRec: TMyRec;

...

 for i := 1 to 10 do
  for j := 1 to 10-i do
   if MyRec[j].ADate < MyRec[j+1].ADate then
   begin
    AMyRec := MyRec[j];
    MyRec[j] := MyRec[j+1];
    MyRec[j+1] := AMyRec;
   end;

На выходе получаешь отсортированный по возрастанию массив
Ответить с цитированием
  #9  
Старый 14.12.2008, 20:33
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

половина не понятного.. причем тут TDateTime???

я вдату ввожу, отдельно... в разные переменные (в моем случае это массив из них). здесь же совсем другой случай..
Ответить с цитированием
  #10  
Старый 14.12.2008, 20:35
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

в том то она и сложность... что 3 различные переменные содержат свои значения и по ним надо сортировать, по всем показателям..
Ответить с цитированием
  #11  
Старый 14.12.2008, 20:37
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Что именно непонятно? TDateTime - это стандартный тип Double
Если ты вводишь дату то можно вводить в Edit ('12.10.2008') и затем конвертировать StrToDate. Да и стандартные компоненты его понимают.
Да и удобнее использовать чема массив в массиве
Ответить с цитированием
  #12  
Старый 14.12.2008, 20:41
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

прикол в том что мне надо ввести всё отдельно.. такое задание... потом сортировать всю запись по дате. и здесь не такой формат нужен "чч.мм.гггг", а 3 разные переменные:

a = чч
b = мм
c = гггг

но я взял массив дабы меньше писать..

все надо выполнить кт ому же в консольном варианте (Console Application), а не в windows application
Ответить с цитированием
  #13  
Старый 14.12.2008, 20:49
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

в консольном варианте разве отсутствет модуль SysUtils? а для сборки из отдеьных числе подойдет и EncodeDate(Year, Month, Day: Word)
Ответить с цитированием
  #14  
Старый 14.12.2008, 20:54
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

да нельзя это ничего использовать!

p.s можно использовать только записи, массивы, циклы, логические операции, выражения.. ни функций, ни процедур...
Ответить с цитированием
  #15  
Старый 14.12.2008, 21:04
ApplicatiOn ApplicatiOn вне форума
Активный
 
Регистрация: 28.02.2008
Сообщения: 388
Репутация: -10
По умолчанию

я сечас попробую рассмотреть этот вариант

Код:
 if (zapis1[i].date[3] * 1000 + zapis1[i].date[2] * 100 + zapis1[i].date[1]) >   (zapis1[i + 1].date[3] * 1000 + zapis1[i + 1].date[2] * 100 + zapis1[i + 1].date[1])  then

ошибка может быть в том, что zapis1[i].date[3] * 1000 (например), это больше максимального значения integer. попробую взять longint...
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:01.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025