Лекция № 16
Задача 2.
Работа с динамическими массивами
Задача 1.
Какие действия совершаются в каждой строке программы?
Var
A,C:integer; {переменные целого типа}
B,D:^Integer; {указатели на переменные целого типа}
E:^Real; {указатель на переменную вещественного типа}
Begin
New(B); New(D); New(E); {Определяем значения указателей и выделяем память}
B^:=234; {Присваиваем значение 234 области памяти, на которую ссылается
указатель B}
С:=456; { Присваиваем значение переменной C}
D:=B; {Присваиваем значение указателя B указателю D, т.е указатель D ссылается
на ту же область памяти, что и указатель B, таким образом D^=234}
B^:=С; {Присваиваем значение переменной С области памяти, на которую
ссылается B}
E^:=C+D^ {Присваиваем сумму значения переменной С и значения на которое
ссылается указатель D}
Dispose(B); Dispose(D); {Уничтожение указателей и освобождение памяти}
{ВНИМАНИЕ!!! Проверить, ничего не забыли? (Необходимо еще DISPOSE(E)) }
End.
Динамические переменные могут входить в состав выражений.
Пример:
p1^:=p1^+8; Write('p1^=',p1^:3);
Пример:
В результате выполнения программы:
Program DemoPointer;
var p1,p2,p3:^Integer;
begin
p1:=NIL; p2:=NIL; p3:=NIL;
New(p1); New(p2); New(p3);
p1^:=2; p2^:=4;
p3^:=p1^+Sqr(p2^);
writeln('p1^=',p1^:3,' p2^=',p2^:3,' p3^=',p3^:3);
p1:=p2;
writeln('p1^=',p1^:3,' p2^=',p2^:3)
end.
на экран дисплея будут выведены результаты:
p1^= 2 p2^= 4 p3^= 18
p1^= 4 p2^= 4
Рассмотрим следующее описание:
Type
TMas=array[1..50] of integer; {Tmas – массив из 50 целых чисел}
Var M: array[1..50] of ^Integer; {М- массив из 50 указателей на целые числа}
P:^TMas; {P – указатель на массив из 50 целых чисел }
В этом примере М – массив из ^Integer. Тогда M[1]-указатель на 1 число, а М^[1]-значение, на которое ссылается указатель, то есть при присваивании значений правильным будет следующее:
M^[1]:=123; M^[2]:=345; M^[3]:=456;
Также возможны такие операции как M[1]:=M[2] (после этого указатель M[1] будет ссылаться на 2-й элемент массива и соответственно M^[1]=345; M^[2]=345; M^[3]=456;)
При использовании указателя P такая операция недопустима (об этом будет сообщено еще на этапе компиляции). Допустима только операция присваивания значений по ссылкам:
Р^[1]:=123; Р^[2]:=345; Р^[3]:=456;
Упорядочить динамический массив по возрастанию элементов первого столбца.
program primer;
uses crt;
const n=3; m=4;
type mas=array[1..n] of integer;
masuk=array[1..m] of ^mas;
var dm:^masuk;
i,j,min,k,r:integer;
Begin
textbackground(1);
clrscr;
textcolor(15);
getmem(dm,sizeof(mas)*n);
randomize;
for i:=1 to n do
begin
getmem(dm^[i],2*n);
for j:=1 to m do
dm^[i]^[j]:=random(100)
end;
writeln('Массив 1:');
for i:=1 to n do
begin
for j:=1 to m do
write(dm^[i]^[j]:5);
writeln;
end;
writeln('Массив 2:');
for i:=1 to n-1 do
begin
min:=dm^[i]^[1];
for k:=i+1 to n do
if min>dm^[k]^[1] then
begin
min:=dm^[k]^[1];
for j:=1 to m do
begin
r:=dm^[i]^[j]; dm^[i]^[j]:=dm^[k]^[j];
dm^[k]^[j]:=r;
end;
end;
end;
for i:=1 to n do
begin
for j:=1 to m do
write(dm^[i]^[j]:5);
writeln;
end;
freemem(dm^[i],2*n);
repeat until keypressed;
End.