Fastreport 4.12
Здравствуйте. FastReport 4.12 используется в качестве Дизайнера отчетов в Лоцмане ПГС. Мне нужно создать двумерный массив в отчете с двумя
полями: ФИО и ID, потом отсортировать его по алфавиту. С одномерным все получилось, но в этом случае я имею выпадающий список отсортированных
фамилий в диалоге, но у них нет ID. Поэтому никакую информацию уже не вытянуть. Видела, что можно представить 2-мерный в виде одномерного :
"...Двумерный массив A2[0..n, 0..m] можно представить в виде одномерного A1[0..(m+1)*(n+1)-1]
Обращайтесь к ячейке A2[i,j], как A1[(i+1)*(j+1)-1]..." Но не понимаю, как в таком случае правильно в сортировке писать:
procedure QuickSort (var A: array of string; Lo, Hi: Integer);
var
x, y: string;
procedure Sort (l, r: Integer);
var
i, j: integer;
begin
repeat
x := A[(l + r) div 2];
i := l; j := r;
repeat
while CompareText( A, x ) < 0 do
inc (i);
while CompareText( A[j], x ) > 0 do
dec (j);
if i <= j then
begin
y := A; A := A[j]; A[j] := y; { поменять A и A[j] значения местами }
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}
Нужно сортировать по алфавиту, сохранив ID.
полями: ФИО и ID, потом отсортировать его по алфавиту. С одномерным все получилось, но в этом случае я имею выпадающий список отсортированных
фамилий в диалоге, но у них нет ID. Поэтому никакую информацию уже не вытянуть. Видела, что можно представить 2-мерный в виде одномерного :
"...Двумерный массив A2[0..n, 0..m] можно представить в виде одномерного A1[0..(m+1)*(n+1)-1]
Обращайтесь к ячейке A2[i,j], как A1[(i+1)*(j+1)-1]..." Но не понимаю, как в таком случае правильно в сортировке писать:
procedure QuickSort (var A: array of string; Lo, Hi: Integer);
var
x, y: string;
procedure Sort (l, r: Integer);
var
i, j: integer;
begin
repeat
x := A[(l + r) div 2];
i := l; j := r;
repeat
while CompareText( A, x ) < 0 do
inc (i);
while CompareText( A[j], x ) > 0 do
dec (j);
if i <= j then
begin
y := A; A := A[j]; A[j] := y; { поменять A и A[j] значения местами }
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}
Нужно сортировать по алфавиту, сохранив ID.
Комментарии
Двумерный массив - это в общем случае матрица N x M. И как её сортировать? По строкам? По столбцам?
Если у тебя в таблице только две строки, то я считаю, лучше вообще не заморачиваться и создать 2 одномерных массива одинаковой размерности:
A: array[0..N] of String;
B: array[0..N] of Integer;
Сортировка видоизменяется, но принцип такой: сортируешь A, и если A = A[j], тогда сравниваешь B и B[j], и меняешь их местами, если надо.
Плюс, когда меняешь местами A и A[j] делай то же самое для B и B[j].
Итог: B меняется в двух участках кода, A - в одном.
P.S. Форматируй код. Иначе представь ситуацию, что у тебя 5000 строк кода. Как ты в них разберёшься?
Читай теорию, с сортировкой должен уметь работать любой человек, называющий себя программистом.
http://edunow.su/site/content/algorithms/sortirovka_massiva
http://www.programmersforum.ru/showthread.php?t=122381