Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatika_Lektsia_8.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
465.92 Кб
Скачать

8.6.1. Двумерные динамические массивы

Обычно для создания и работы с двумерными динамическими массивами (матрицами) используют указатели. Однако применение взаимно однозначных отображений элементов матрицы на соответствующий линейный массив позволяют свести все действия с динамическими матрицами к действиям на линейных векторах, которые являются обычными динамическими массивами.

Рассмотрим матрицу М[1..n,1..m] и соответствующий ей вектор L[0..nm-1]. Взаимно однозначное отображение множества Мnm пар индексов (i,j) элементов матрицы (у которых 1≤ i ≤ n, 1≤ j ≤ m) на множество Lk значений индекса k элементов L[0≤ k ≤nm-1], задаваемое функцией

k = k (i, j, m) = (i-1)m +(j-1),

означает, что каждой паре (i,j) из Мnm соответствует единственное значение k. из Lk и наоборот, каждому значению k. из Lk соответствует ровно одна пара (i,j) из Мnm.

Использование функции k = k (i, j, m) позволяет свести работу с динамическими матрицами к работе с обычными одномерными динамическими массивами.

Пример 5. Разработать программу, в которой выполнялись бы следующие действия:

1) ввод с клавиатуры размерности квадратной целочисленной матрицы M[1..n,1..n], затем - коэффициентов матрицы,

2) построчный вывод матрицы M[1..n,1..n] на экран,

3) определение в M[1..n,1..n] суммы всех элементов на главной диагонали,

4) исключение из строк M[1..n,1..n] всех элементы, стоящих на главной диагонали,

5) ) построчный вывод новой матрицы N[1..n,1..(n-1)] на экран,

6) удаление динамических массивов, соответствующих M и N.

Решение. Обозначим номера строк и столбцов матриц через i и j, динамические линейные массивы, соответствующие матрицам, через LM,LN. При удалении диагональных элементов использовано следующее их свойство: в линейном массиве они лежат с промежутками в n элементов. При выборочной записи элементов массива LM в массив LN использованы их текущие номера n_elM и n_elN.

var LM,LN: array of integer; { Описание дин. массивов LM,LN}

n,i,j,el,S,n_elM,n_elN: integer;

function k(i,j,m:integer):integer; {функция для расчета k = k (i, j, m) = (i-1)m +(j-1) }

begin k:= (i-1)*m + j -1; end;

begin

writeln (' Vvedite razmernost:');read(n); {запрос на ввод и ввод размерности n }

SetLength (LM,n*n); {Создание дин. массива LM для ввода матрицы M[1..n,1..n] }

for i:=1 to n do {ввод элементов матрицы с клавиатуры}

for j:=1 to n do begin

writeln('vvedite element M[',i,',',j,']=');{запрос на ввод элемента M[i,j]}

read(el); LM[k(i,j,n)]:=el;{ввод элемента M[i,j] в линейный массив LM }

end;

for i:=1 to n do begin {вывод матрицы M[1..n,1..n] на экран}

for j:=1 to n do write(' M[',i,',',j,']=',LM[k(i,j,n)]:6);{вывод строки}

writeln; {переход на очередную строку}

end;

S:=0; {расчет суммы S диагон. эл-тов матрицы M[1..n,1..n]}

for i:=1 to n do S:=S+LM[k(i,i,n)];

writeln(' Sum of diagonal ejements=',S);{вывод суммы диагональных элементов M}

SetLength (LN,n*(n-1)); {Создание дин. массива LN для ввода матрицы N[1..n,1..(n-1)] }

n_elM:=-1;n_elN:=-1;{Задание начальных значений номерам элементов в дин. массивах LM,LN}

for i:=1 to n-1 do begin { Проход по промежуткам между диаг. эл-тами}

n_elM:= n_elM+1; for j:=1 to n do begin n_elM:= n_elM+1; n_elN:=n_elN+1;

LN[n_elN]:=LM[n_elM] { Засылка значений в динамический массив N[1..n,1..(n-1)] }

end end;

for i:=1 to n do begin { Печать динамического массива N[1..n,1..(n-1)] }

for j:=1 to n-1 do write(' N[',i,',',j,']=',LN[k(i,j,n-1)]:6);{вывод строки}

writeln; {переход на очередную строку}

end;

SetLength(LM,0); SetLength(LN,0); //Удаление динамических массивов LM и LN

end.

По аналогии с рассмотренным выше взаимно однозначным отображением k(i, j, m) = (i-1)m +(j-1),множества пар индексов (i,j) элементов двумерного массива (матрицы М[1..n,1..m]) на множество Lk значений индекса k элементов L[0≤k≤nm-1], можно организовать взаимно однозначные отображения на линейный массив и массивов более высокой размерности. Например, для трехмерного массива М[1..n,1..m,1..p] взаимно однозначное отображение k(i, j, s, m,р) множества троек индексов (i,j,s) на множество Lk значений индекса k элементов L[0≤ k ≤nmр-1] имеет вид:

k = k(i, j, s, m,р) = (i-1)mр + (j-1) р + (s-1).

Вопросы для проверки знаний.

1. Какие массивы называют статическими, а какие - динамическими ?

2. Назовите два вида описания динамических массивов ?

3. Чем принципиально отличается объявление динамического массива от статического с точки зрения появления новых объектов в памяти ?

4. Какое предварительное действие необходимо выполнить после объявления динамического массива для того, чтобы работать с его элементами ?

5. Как переписать динамический массив в статический ?

6. Как удалить динамический массив путем изменения его длины ?

7. Каким образом можно использовать для работы с многомерными массивами аппарат динамических массивов без использования указателей ?

Практические задания.

1.Разработать программу, в которой выполнялись бы следующие действия:

а) ввод с клавиатуры размерности n линейного целочисленного динамического массива L[1..n] и его элементов,

б) расчет суммы элементов массива L[1..n] с выводом ее на экран,

в) удаление динамического массива L[1..n].

2. Разработать программу, в которой выполнялись бы следующие действия:

а) ввод с клавиатуры размерности квадратной целочисленной матрицы M[1..n,1..n], затем - коэффициентов матрицы,

б) построчный вывод матрицы M[1..n,1..n] на экран,

в) смена местами в M[1..n,1..n] первого и последнего столбца,

г) построчный вывод новой матрицы M [1..n,1..(n-1)] на экран,

д) удаление динамического массива, соответствующего M.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]