Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2008, 20:31   #1
Whiplash
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 24
По умолчанию Сортировка записей.

Доброго времени суток

Запись описана следующим образом:
Код:
Type
RecLibrary = record
  Author : record
    Name: String[40];
    Surname: String[40];
  end;
  Title: String[100];
  Publisher: String[20];
  Year: Word;
  Pages: Word;
  Copies: Byte;
end;
Var
ArrBook: array[1..25] of RecLibrary;
Требуется произвести сортировку по 3-м ключам:
- автор (по возрастанию);
- год издания (по убыванию);
- кол-во экземпляров (по убыванию).

Меня интересует, как должна быть организована данная сортировка:
Подходит ли такой вариант:
- сначала сортируем по алфавиту
- затем в уже отсортированном массиве производится сортировка по оставшимся двум ключам (1-ый and 2-ой)?
Это было бы смешно, если бы не было так серьезно. "451 по Фаренгейту".
Whiplash вне форума Ответить с цитированием
Старый 16.12.2008, 23:48   #2
MalexG
Форумчанин
 
Регистрация: 06.11.2008
Сообщений: 100
По умолчанию

Сортировку так и нужно осуществлять.
MalexG вне форума Ответить с цитированием
Старый 17.12.2008, 19:07   #3
Whiplash
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 24
По умолчанию

Спасибо
Этот вопрос достаточно долго меня мучил..
Это было бы смешно, если бы не было так серьезно. "451 по Фаренгейту".
Whiplash вне форума Ответить с цитированием
Старый 17.12.2008, 21:39   #4
Whiplash
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 24
По умолчанию

Тогда еще такой вопрос: как лучше организовать процедуру сортировки?
Чуть не забыл, требуется произвести три вида сортировки:

1) Автор(по возрастанию) + год издания (Year)(по убыванию) + количество экземпляров (Copies)(по убыванию);
2) Список книг определнного автора:
издательство (по убыванию) + название (Title) (по возрастанию);
3) Список книг, изданных с Y1 по Y2:
год издания (по убыванию) + автор (по возрастанию).

У меня это получается как то так :
Код:
Procedure Sortings;
Var
  X: RecLibrary;
  Z: Integer;
  Name: String;
  Y1, Y2: Word;

  function Condition: Boolean;
  Var Key1, Key2, Key3: Boolean;
  begin
    if C = '1' then
    begin
      Key1:=ArrBook[k].Author.Surname > ArrBook[k+1].Author.Surname;
      Key2:=ArrBook[k].Year < ArrBook[k+1].Year;
      Key3:=ArrBook[k].Copies < ArrBook[k+1].Copies;
      case Z of
        0: Condition:=Key1;
        1: Condition:=(not Key1) and (Key2);
        2: Condition:=(not Key1) and (not Key2) and (Key3);
      end;
    end;
 if C = '2' then
 begin
   Key1:=(ArrBook[k].Author.Name = Name) and (ArrBook[k+1].Author.Name   = Name);
   Key2:=ArrBook[k].Publisher < ArrBook[k+1].Publisher;
   Key3:=ArrBook[k].Title > ArrBook[k+1].Title;
   case Z of
     0: Condition:=(Key1) and (Key2);
     1: Condition:=(Key1) and (not Key2) and (Key3);
   end;
 end;
 if C = '3' then
 begin
   Key1:=(ArrBook[k].Year in [Y1..Y2]) and (ArrBook[k+1].Year in [Y1..Y2]);
   Key2:=ArrBook[k].Year < ArrBook[k+1].Year;
   Key3:=ArrBook[k].Title > ArrBook[k+1].Title;
   case Z of
     0: Condition:=(Key1) and (Key2);
     1: Condition:=(Key1) and (not Key2) and (Key3);
   end;
 end;
procedure Sort;
  begin
    for i:=1 to Count-1 do
      for k:=1 to Count-i do
      begin
        if Condition then
        begin
          X:=ArrBook[k];
          ArrBook[k]:=ArrBook[k+1];
          ArrBook[k+1]:=X;
        end;
    end;
  end;

procedure Sorting_One; (*Sortings*)
begin
  Read_Base;
  Z:=0;
  Sort;
  Inc(Z);
  Sort;
    Inc(Z);
    Sort;
    Write_Base;
end;

  procedure Sorting_By_Author;
  begin
    ClrScr;
    Write('Имя автора: ');
    ReadLn(Name);
    Z:=0;
    Sort;
    Inc(Z);
    Sort;
  end;

  procedure Sorting_By_Year;
  var
    X: Byte;
  begin
    ClrScr;
    Write('Период с ');
    X:=WhereX;
    ReadLn(Y1);
    GoToXY(X+1,WhereY-1);
    Write(' по');
    ReadLn(Y2);
    Z:=0;
    Sort;
    Inc(Z);
    Sort;
  end;

Begin
  ClrScr;
  GoToXY(26,1);
  WriteLn('СОРТИРОВКА');
  WriteLn('1) ');
  WriteLn('2) ');
  WriteLn('3) ');
  Write('Выберите тип сортировки: ');
  Z:=0;
  ReadLn(C);
  case C of
    '1': Sorting_One;
    '2': Sorting_By_Author;
    '3': Sorting_By_Year;
  end;                          (*Возвращение в меню*)
end;
Это было бы смешно, если бы не было так серьезно. "451 по Фаренгейту".
Whiplash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка Шелла и Шейкер-сортировка AleksandrMakarov Паскаль, Turbo Pascal, PascalABC.NET 11 11.03.2012 12:18
Типизированные файлы.Создание, удаление, редактирование, сортировка записей типизированного файла.Паскаль Студент Шиза Помощь студентам 6 08.12.2007 13:41
1. Сортировка Шелла по убыванию 2. Сортировка вставками по убыванию Arkuz Помощь студентам 1 25.09.2007 17:16