Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Вопросы для проверки знаний. Len:=4; SetLength (A,Len);//Создание дин

End.

Begin

End.

Begin

Len:=4; SetLength (A,Len);//Создание дин. массива А(0,0,0,0)

for i:=0 to Len-1 do A[i]:=2*i;// Создание дин. массива А (0,2,4,6)

B:=A;// Копирование дин. массива А (0,2,4,6) в дин массив В

for i:=0 to Len-1 do C[i]:=A[i];// Засылка значений в стат. массив С: C(0,2,4,6)

A[1]:=10;//Изменение значения первого элемента массива А: A[1]:=10

writeln (' Enter values of massiv elements:');

for i:=0 to Len-1 do

writeln (' A[',i,']=',A[i], ' B[',i,']=',B[i], ' C[',i,']=',C[i]);

A:=Copy(A,1,2);//Запись в 2 первых элемента (А[0],A[1]) массива А прежних значений А[1], A[2]

writeln (' Finish values of massiv elements:');

for i:=0 to Len-3 do

writeln (' A[',i,']=',A[i],' B[',i,']=',B[i], ' C[',i,']=',C[i]);

SetLength(A,0); SetLength(B,0); //Удаление динамических массивов А и В

B итоге работы программы на экране пользователя выдается информация:

 

Первая выдача значений элементов массивов показывает, что присвоение B:=A в начале задает полную идентичность динамических массивов A и B - изменение A[1]:=10 автоматически вызвало такое же изменение в массиве В[1]:=10. Статический массив, в который поэлементно были засланы элементы A, не изменился.

Вторая выдача значений массивов показывает, что применение функции Copy к массиву A вызвало разрыв связи динамических массивов A и B.

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;

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

По аналогии с рассмотренным выше взаимно однозначным отображением 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.

<== предыдущая лекция | следующая лекция ==>
Динамические массивы | Procedure SORT .
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 249; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.