Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
информатика ЗКМЗКЕ_1курс / Основы алг-ции и прог-ие.doc
Скачиваний:
81
Добавлен:
05.06.2015
Размер:
1.88 Mб
Скачать
    1. Работа с динамическими массивами.

При работе с массивами практически всегда возникает задача настройки программы на фактическое количество элементов массива. В зависимости от применяемых средств решение этой задачи бывает различным.

Первый вариант - использование констант для задания размерности массива.

Program First;

Const

N : integer = 10;

{ либо N = 10; }

Var

A : array [ 1..N ] of real;

I : integer;

Begin

For i := 1 to N do

Begin

Writeln (' Введите ', i , ' -ый элемент массива ');

Readln ( A [ i ] )

End;

{ И далее все циклы работы с массивом используют N}

Такой способ требует перекомпиляции программы при каждом изменении числа обрабатываемых элементов.

Второй вариант- программист планирует некоторое условно максимальное (теоретическое) количество элементов, которое и используется при объявлении массива. При выполнении программа запрашивает у пользователя фактическое количество элементов массива, которое должно быть не более теоретического. На это значение и настраиваются все циклы работы с массивом.

Program Second;

Var

A : array [ 1..25 ] of real;

I, NF : integer;

Begin

Writeln ('Введите фактическое число элементов’,

‘ массива <= 25 ');

Readln ( NF );

For i := 1 to NF do

Begin

Writeln ('Введите ', i , ' -ый элемент массива ');

Readln ( A [ i ] )

End;

{ И далее все циклы работы с массивом используют NF}

Этот вариант более гибок и технологичен по сравнению с предыдущим, так как не требуется постоянная перекомпиляция программы, но очень нерационально расходуется память, ведь ее объем для массива всегда выделяется по указанному максимуму. Используется же только часть ее

Вариант третий- в нужный момент времени надо выделить динамическую память в требуемом объеме, а после того, как она станет не нужна, освободить ее.

Program Dynam_Memory;

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

begin

r:=a^[k]; a^[k]:=a^[l]; a^[l]:=r

end;

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.