Есть массив записей - таблица успеваемости.
ISV, сначала посмотри здесь, как организуется сортировка по одному полю... Если, прочитав это, не догадаешься, как сделать нужную тебе процедуру, я подскажу...
http://forum.pascal.net.ru/index.php?showtopic=2401&view=findpost&p=20401
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.
comprar viagra zaragoza
viagra eyaculacion ereccion