- •Понятие о динамических данных. Динамические массивы.
- •Данные, используемые паскаль-программой
- •Динамическое распределение памяти используется:
- •Что такое указатель?
- •Указатели в Объектном Паскале
- •Указатели в Объектном Паскале (продолжение)
- •Операторы (процедуры) для распределения
- •Почему неудобны статические (или локальные) массивы?
- •Описание динамического массива
- •Работа с динамическими массивами
- •Пример3
- •Пример 4
- •Пример 5
- •Открытые массивы - формальные параметры-массивы без указания границ
- •Пример 6. Вычисление максимальных значений элементов двух одномерных массивов. Подпрограммы используют открытые массивы.
Пример3
program Primer3; {Ввод и вывод динамического одномерного массива, размер которого n задается вводом}
Var a:Array of real; n,i:integer; {i – счетчик элементов массива} Begin
writeln(’Input n’); readln(n);
SetLength(a,n); {отводится память под массив} writeln(’Input array ’);
for i:=0 to High(a) do {High(a)=n-1, максимальное значение индекса)} read(a[i]);
readln; {закончен ввод динамического массива} // обработка массива – заглушка
writeln(’ output of dynamic array’); for i:=0 to High(a) do
write (a[i]:7:2, ′ ′ ); writeln;
a:=nil;{ освобождение памяти из-под массива } readln
End.
Пример 4
program Primer4; {Ввод и вывод динамической матрицы, размеры которой n и m задаются вводом}
Var a:Array of Array of real; n,m,i,j:integer; {i,j – счетчики строк и столбцов} Begin
writeln(’Input count of rows’); readln(n); writeln(’Input count of columns’); readln(m); SetLength(a,n,m); {отводится память под матрицу}
writeln(’Input array ’, n, ’*’,m); for i:=0 to n-1 do
for j:=0 to m-1 do read(a[i,j]);
readln; {закончен ввод динамического массива} // обработка матрицы – заглушка
writeln(’ output of dynamic array’); for i:=0 to n-1 do
begin
for j:=0 to m-1 do write (a[i,j]:7:2 , ′ ′ );
writeln;
end;
a:=nil;{ освобождение памяти из-под указателей на строки } readln
End.
Пример 5
program Primer5; {Ввод и вывод динамической матрицы, размеры которой n и m задаются вводом}
Var a:Array of Array of real; n,m,i,j:integer; {i,j – счетчики строк и столбцов} Begin
writeln(’Input count of rows’); readln(n); writeln(’Input count of columns’); readln(m); SetLength(a,n); {отводится память под указатели на строки}
writeln(’Input array ’, n, ’*’,m);
for i:=0 to High(a) do {High(a)=n-1)} begin
Setlength(a[i],m); { отводится память под элементы строки} for j:=0 to High(a[i]) do {High(a[i]=m-1}
read(a[i,j]);
end; readln; {закончен ввод динамического массива} // обработка матрицы – заглушка
writeln(’ output of dynamic array’); for i:=0 to High(a) do
begin
for j:=0 to High(a[i]) do
write (a[i,j]:7:2 , ′ ′ ); writeln;
a[i]:=nil; {освобождение памяти из-под строки} end;
a:=nil;{ освобождение памяти из-под указателей на строки } readln End.
Открытые массивы - формальные параметры-массивы без указания границ
•Допускается в списке формальных параметров использовать конструкцию Array of тип без указания границ массивов.
•Соответствующим фактическим параметром может быть как динамический, так и статический массив произвольного размера.
•Открытые массивы могут быть только одномерными, но их компоненты могут иметь сложный тип.
•Элементы открытых массивов нумеруются, начиная с нуля.
Пример 6. Вычисление максимальных значений элементов двух одномерных массивов. Подпрограммы используют открытые массивы.
program Project1;
Var A:Array[1..5] of real; B:Array of real; nb:integer; {длина B} Procedure masin( c:char; Var A:array of real);
Var i:integer; begin
writeln('input vector',c,' size of ',Length(A));
for i:=Low(A) to High(a) do {использование функций Low и High позволяет }
read(A[i]); readln; |
{брать в качестве фактических параметров} |
end{masin}; |
{как статические, так и динамические массивы} |
Function max( Var A:array of real):real; Var i:integer;mx:real;
begin mx:=a[Low(A)];
for i:=Low(A)+1 to High(A) do if mx<A[i] then
mx:=A[i];
max:=mx
end{max}; begin
masin('A',A); writeln('input nb'); readln(nb); SetLength(B,nb); masin('B',B); writeln('maxa=',max(A),' maxb=',max(b)); readln
end.