КАТЕГОРИИ: Архитектура-(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.
Дата добавления: 2014-01-06; Просмотров: 249; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |