|
Читайте также: |
TYPE MAS = ARRAY [1..2] OF < требуемый_тип_элемента >;
MS = ^MAS;
VAR A: MS;
I, NF: INTEGER;
BEGIN
WRITELN ('Введите фактическое число элементов массива');
READLN (NF);
GETMEM (A, SIZEOF(< требуемый_тип_элемента >)*NF);
FOR I:= 1 TO NF DO
BEGIN
WRITELN('Введите ', I, ' -ый элемент массива ');
READLN(A^[I])
END; {И далее все циклы работы с массивом используют NF }
.....
FREEMEM (A, NF*SIZEOF (< требуемый_тип_элемента> ));
END.
Рассмотрим пример использования динамического одномерного массива, который используется как двумерный массив. После ввода реальной размерности массива и выделения памяти для обращения к элементу двумерного массива адрес его рассчитывается, исходя из фактической длины строки и положения элемента в строке (при заполнении матрицы по строкам). Требуется найти максимальный элемент в матрице и его координаты.
USES CRT;
TYPE T1=ARRAY[1..1] OF INTEGER;
VAR A:^T1;
N,M,I,J,K,P:INTEGER;
MAX:INTEGER;
BEGIN
CLRSCR;
WRITE('N='); READLN (N);
WRITE('M='); READLN (M);
GETMEM (A,SIZEOF(INTEGER)*N*M);
FOR I:=1 TO N*M DO READ(A^[I]);
MAX:=A^[1]; K:=1; P:=1;
FOR I:=1 TO N DO
FOR J:=1 TO M DO
IF A^[(I-1)*M+J] > MAX THEN
BEGIN
MAX:=A^[(I-1)*M+J];
K:=I; P:=J
END;
WRITE('строка=',K:2,' столбец=',P:2);
FREEMEM(A,2*N*M);
READKEY;
END.
В следующем примере для хранения двумерного массива используется одномерный массив указателей на столбцы. В задаче требуется найти столбцы матрицы, в которых находятся минимальный и максимальный элементы матрицы и если это разные столбцы, то поменять их
местами.
USES CRT;
TYPE VK=^T1;
T1=ARRAY[1..1] OF INTEGER;
MT=^T2;
T2=ARRAY[1..1] OF VK;
VAR A:MT;
M,N,I,J,K,L:INTEGER;
MAX,MIN:INTEGER;
R:POINTER;
BEGIN
CLRSCR;
READLN (N,M);
GETMEM(A,SIZEOF (POINTER)*M); {выделение памяти под указатели столбцов матрицы}
FOR J:=1 TO M DO
GETMEM (A^[J],SIZEOF(INTEGER)*N); {выделение памяти под элементы столбцов}
FOR I:=1 TO N DO
FOR J:=1 TO M DO
READ(A^[J]^[I]);
FOR I:=1 TO N DO
BEGIN
FOR J:=1 TO M DO
WRITE (A^[J]^[I]:4);
WRITELN
END;
MAX:=A^[1]^[1]; K:=1; MIN:=MAX; L:=1;
FOR J:=1 TO M DO
FOR I:=1 TO N DO
IF A^[J]^[I]<MIN THEN
Begin MIN:=A^[J]^[I]; L:=J; end
ELSE
IF A^[J]^[I]>MAX THEN
BEGIN MAX:=A^[J]^[I]; K:=J; END;
{для обмена столбцов достаточно поменять указатели на столбцы}
IF K<>L THEN R:=A^[K]; A^[K]:=A^[L]; A^[L]:=R
FOR I:=1 TO N DO
BEGIN
FOR J:=1 TO M DO
WRITE(A^[J]^[I]:3,' ');
WRITELN
END;
FOR I:=1 TO M DO
FREEMEM (A^[I],N*SIZEOF(INTEGER));
FREEMEM (A,M*SIZEOF(POINTER))
END.
Контрольные вопросы:
Дата добавления: 2014-12-18; просмотров: 234 | Поможем написать вашу работу | Нарушение авторских прав |