
- •8. Интервальный тип данных. Структурированные типы данных. МаСсивы
- •8.1. Интервальный (индексный) тип данных
- •8.2. Структурированные типы данных. Массивы. Их свойства, описание, ввод и вывод
- •8.3. Инициализация массивов
- •8.4. Работа с одномерными (линейными) массивами
- •8.5. Работа с двухмерными массивами (матрицами)
- •8.6. Динамические массивы
- •8.6.1. Двумерные динамические массивы
- •8.7. Передача массивов в качестве параметров в подпрограммы. Открытые массивы
- •Параметры-массивы и параметры-строки
8.6.1. Двумерные динамические массивы
Обычно для создания и работы с двумерными динамическими массивами (матрицами) используют указатели. Однако применение взаимно однозначных отображений элементов матрицы на соответствующий линейный массив позволяют свести все действия с динамическими матрицами к действиям на линейных векторах, которые являются обычными динамическими массивами.
Рассмотрим матрицу М[1..n,1..m] и соответствующий ей вектор L[0..nm-1]. Взаимно однозначное отображение множества Мnm пар индексов (i,j) элементов матрицы (у которых 1≤ i ≤ n, 1≤ j ≤ m) на множество Lk значений индекса k элементов L[0≤ k ≤nm-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≤nm-1], можно организовать взаимно однозначные отображения на линейный массив и массивов более высокой размерности. Например, для трехмерного массива М[1..n,1..m,1..p] взаимно однозначное отображение k(i, j, s, m,р) множества троек индексов (i,j,s) на множество Lk значений индекса k элементов L[0≤ k ≤nmр-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.