Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка записи с процедурой
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ISV
Есть массив записей - таблица успеваемости.
Код

program tabliza; uses crt;
const n=10;
type
ANk=record
  npp:1..n;
  FIO:string[13];
  Adr:string[15];
  Dr:string[8];
  tel:string[7];
  Ocen:array[1..5] of 2..5;
  SrB:real;
 end;
var
  A12:array[1..n] of Ank;
  nom,i,j,k,h,y:integer;s:integer;min:string;g:ANk

После введения данных необходимо организовать диалог по сортировке(прямой метод сортировки) полей таблицы при помощи процедуры.Т.е. будем вводить название поля(или маркер,указывающий на конкретное поле) по которому нужно сортировать и это станет входящим параметром процедуры.После выводим результат сортировки.Подскажите,пожалуйста, как сделать такую процедуру.
volvo
ISV, сначала посмотри здесь, как организуется сортировка по одному полю... Если, прочитав это, не догадаешься, как сделать нужную тебе процедуру, я подскажу... wink.gif

Как упорядочить данные по возрастанию?
ISV
volvo ,в предложенном примере нет главного,что нужно:не задавать
критерий сортировки в самой программе,а вводить его в диалоге.До этого я и не могу дойти.Помоги,пожалуйста.
volvo
Используем преимущества процедурных типов... Я тут набросал небольшой примерчик, я думаю, разобраться будет несложно...

Что-то в этом роде:
program SortRec;
uses Crt;

const
N = 4;

type
SortBy = (_byNpp, _byFio, _byAdr, _byDr, _byTel, _bySrB);

TInfo=record
npp: 1..n;
FIO: string[13];
Adr: string[15];
Dr: string[8];
tel: string[7];
Ocen: array[1..5] of 2..5;
SrB:real;
end;

List = array [1..N] of TInfo;
TFunc = Function(T1, T2: TInfo): Integer;


{ *** comparison functions }
function CompareNpp (T1,T2: TInfo): integer; far;
begin
if T1.Npp > T2.Npp then CompareNpp := 1
else if T1.Npp = T2.Npp then CompareNpp := 0
else CompareNpp := -1
end;
function CompareFio (T1,T2: TInfo): integer; far;
begin
if T1.Fio > T2.Fio then CompareFio := 1
else if T1.Fio = T2.Fio then CompareFio := 0
else CompareFio := -1
end;
function CompareAdr (T1,T2: TInfo): integer; far;
begin
if T1.Adr > T2.Adr then CompareAdr := 1
else if T1.Adr = T2.Adr then CompareAdr := 0
else CompareAdr := -1
end;
function CompareDr (T1,T2: TInfo): integer; far;
begin
if T1.Dr > T2.Dr then CompareDr := 1
else if T1.Dr = T2.Dr then CompareDr := 0
else CompareDr := -1
end;
function CompareTel (T1,T2: TInfo): integer; far;
begin
if T1.Tel > T2.Tel then CompareTel := 1
else if T1.Tel = T2.Tel then CompareTel := 0
else CompareTel := -1
end;
function CompareSrB (T1,T2: TInfo): integer; far;
begin
if T1.SrB > T2.SrB then CompareSrB := 1
else if T1.SrB = T2.SrB then CompareSrB := 0
else CompareSrB := -1
end;

Const
Compare: Array[_byNpp .. _bySrB] Of TFunc =
(
CompareNpp, CompareFio, CompareAdr,
CompareDr, CompareTel, CompareSrB
);

procedure QuickSort(marker: SortBy;
var A: List; Lo, Hi: Integer);
var
i,j: integer;
x, y: TInfo;

procedure Sort (l, r: Integer);
begin
repeat
x := A[(l+r) shr 1];
i := l; j := r;
repeat
while Compare[marker]( A[i], x ) < 0 do inc(i);
while Compare[marker]( A[j], x ) > 0 do dec(j);
if i <= j then
begin
y := A[i]; A[i] := A[j]; A[j] := y;
inc(i); dec(j);
end;
until i > j;

if l < j then Sort (l, j);
l := i;
until l >= r;
end;

begin
Sort (Lo,Hi);
end; { QuickSort }


const
Data: List =
(
(npp:1;
FIO:'petrov';
Adr:'moscow';
Dr:'january';
tel:'4587';
Ocen:(2, 2, 2, 2, 2);
SrB:2),
(npp:2;
FIO:'sidorov';
Adr:'kiev';
Dr:'october';
tel:'2487';
Ocen:(5, 5, 5, 5, 5);
SrB:5),
(npp:3;
FIO:'ivanov';
Adr:'piter';
Dr:'march';
tel:'5287';
Ocen:(3, 3, 3, 3, 3);
SrB:3),
(npp:4;
FIO:'kuku';
Adr:'earth';
Dr:'december';
tel:'3411';
Ocen:(4, 4, 4, 4, 4);
SrB:4)
);

Procedure PrintData;
Var i: integer;
Begin
For i := 1 To n Do
With data[i] Do
Writeln(npp:2, ' ', fio:10, ' ', adr:6, ' ',
dr:8, ' ', tel:6, ' ', srb:5:2);
End;

var
ix: SortBy;
Choice: Char;
_sort: integer;

const
sb_string: array[SortBy] of string =
('by Npp', 'by Fio', 'by Adr', 'by Dr', 'by Tel', 'by SrB');

begin
WriteLn('before:');
PrintData;

Writeln('sort data by:');
For ix := Low(SortBy) To High(SortBy) Do
writeln(1 + Ord(ix):2, ' - ', sb_string[ix]);

Choice := ReadKey;
_sort := Ord(Choice) - Ord('1');
If (_sort >= 0) and (_sort <= Ord(High(SortBy)))
then
QuickSort ( SortBy(_sort), Data, 1, N)
Else Writeln('incorrect input');

WriteLn('after:');
PrintData;

end.
generic viagra available in us p
comprar viagra zaragoza
sildenafil citrate generic viagr
viagra eyaculacion ereccion
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.