Динамический массив
Доброго времени суток, уважаемые участники форума! Прошу вас помочь с пониманием и решением задачи по массивам. Приведу условие: "Задана целочисленная матрица A размером NxM. Получить массив B, присвоив его k-му элементу значение 0,
если все элементы k-го столбца матрицы нулевые, и значение 1 в противном случае (k=1,2. M)". Подозреваю, что условие кривое, но у меня нет выбора. Хочу услышать ваши мысли по поводу реализации программы. Я предполагаю с помощью StringGrid задать матрицу и вводить либо с клавиатуры, либо рандомом значения. С помощью кнопки в Memo вывести массив. Как-то так.
Насколько понял условие: если все элементы столбца матрицы нулевые — тогда к-му элементу присвоить значение 0, иначе присвоить номер столбца. Буду очень признателен за любую помощь!
Добавлено через 2 часа 12 минут
Прилагаю код. Проблема в том, что я не верно организовал обработку второго массива и в Memo выводит просто число 0.
Динамический массив: выписать из него элементы в другой массив без повторений
Всем привет, проблема, дан отсортированный динамический массив , в нем есть повторяющиеся.
Динамический массив
Добрый день! Программа убирает нулевые столбцы в заданной матрице и заменяет максимальный элемент.
Динамический одномерный массив
Дали работу, пользователь вводит размерность и генерируется одномерный массив.Далее в динамике надо.
Одномерный динамический массив
Всем доброго вечера. В общем, задана такая задачка: Пусть у нас есть полином (многочлен).
6.3 Динамические матрицы
Понятие динамического массива можно распространить и на матрицы. Динамическая матрица представляет собой массив указателей, каждый из которых адресует одну строку (или один столбец).
Рассмотрим описание динамической матрицы. Пусть есть типы данных massiv и указатель на него din_massiv .
type massiv=array [1..1000] of real; din_massiv=^massiv;
Динамическая матрица X будет представлять собой массив указа-
Var X: array[1..100] of din_massiv;
Работать с матрицей надо следующим образом.
1. Определить ее размеры (пусть N – число строк, M – число столбцов).
2. Выделить память под матрицу.
for i:=1 to N do getmem(X[i],M*sizeof(real));
Каждый элемент статического массива X[i] – указатель на динамический массив, состоящий из M элементов типа real. В статическом массиве Х находится N указателей.
3. Для обращения к элементу динамической матрицы, расположенному в i -й строке и j -м столбце, следует использовать конструк-
цию языка Турбо Паскаль X[i]^[j] .
4. После завершения работы с матрицей необходимо освободить
for i:=1 to N do freemem(b[i],M*sizeof(real));
Рассмотрим работу с динамической матрицей на следующем примере.
ЗАДАЧА 6.12. В каждой строке матрицы вещественных чисел B(N,M) упорядочить по возрастанию элементы, расположенные между максимальным и минимальным значением.
Алгоритмы упорядочивания рассматривались в пятой главе, основные принципы работы с матрицами – в предыдущих параграфах текущей главы, поэтому в комментариях к тексту программы основное внимание уделено особенностям работы с динамическими матрицами.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
type massiv=array [1..1000] of real;
matrica=array [1..100] of din_massiv; var
for i:=1 to N do getmem(b[i],M*sizeof(real));
writeln(‘Matrica B’); for i:=1 to N do
for j:=1 to M do read(b[i]^[j]);
for i:=1 to N do begin
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
for j:=2 to M do begin
if b[i]^[j]>max then begin max:=b[i]^[j]; nmax:=j
if b[i]^[j]<min then begin min:=b[i]^[j]; nmin:=j
if nmax<nmin then begin
while nmax-1-j>=nmin+1 do begin
for k:=nmin+1 to nmax-1 -j do if b[i]^[k]>b[i]^[k+1] then begin
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
writeln(‘Упорядоченная матрица B’); for i:=1 to N do
for j:=1 to M do write(b[i]^[j]:6:2, ‘ ‘); writeln
Результаты работы программы представлены на рис. 6.35.
Рисунок 6.35: Результаты решения задачи 6.12
Динамическая матрица может быть достаточно большой, фактически ее размер ограничен только объемом свободной памяти.
6.4 Задачи для самостоятельного решения
1. Определить номера строки и столбца максимального простого числа прямоугольной матрицы A(n,m) . Подсчитать количество нуле-
вых элементов матрицы и напечатать их индексы.
2. Найти среднее геометрическое значение элементов квадратной матрицы X(n,n) , находящихся по периметру этой матрицы и на ее
диагоналях, если это возможно. Если среднее геометрическое вычислить невозможно, то поменять местами максимальный и минимальный элементы матрицы.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
3. Сформировать вектор D , каждый элемент которого представ-
ляет собой среднее арифметическое значение элементов строк матрицы C(k,m) , и вектор G – любой его компонент должен быть равен
произведению элементов соответствующего столбца матрицы C .
4. Задана матрица А(n,m) , в каждом столбце которой максималь-
ный элемент необходимо заменить произведением отрицательных элементов этого же столбца.
5. Задана матрица А(n,n) . Определить максимальный элемент
среди элементов матрицы, расположенных выше главной диагонали, и минимальный элемент среди тех, что находятся ниже побочной диагонали. После этого выполнить сортировку каждого столбца матрицы по возрастанию.
6. Заменить строку матрицы Р(n,m) с минимальной суммой элементов на строку, где находится максимальный элемент матрицы.
7. Переместить максимальный элемент матрицы F(k,p) в пра-
вый верхний угол, а минимальный элемент – в левый нижний.
8. Проверить, является ли матрица A(n,n) диагональной (все
элементы нули, кроме главной диагонали), единичной (все элементы нули, на главной диагонали только единицы) или нулевой (все элементы нули).
9. Сформировать из некоторой матрицы A(n,n) верхнетреуголь-
ную матрицу В(n,n) (все элементы ниже главной диагонали нулевые), нижнетреугольную матрицу С(n,n) (все элементы выше главной диагонали нулевые) и диагональную матрицу D(n,n) (все элементы нули, кроме главной диагонали) .
10. Заданы матрицы A(m,n) и B(n,m) . Найти матрицу
11. Проверить, является ли матрица B(n,n) обратной к A(n,n) . Произведением матриц A и B в этом случае должна быть единичная матрица.
12. Определить количество простых чисел, расположенных вне диагоналей матрицы B(n,n) .
13. Проверить, лежит ли на главной диагонали максимальный отрицательный элемент матрицы A(n,n) .
14. Переписать простые числа из матрицы A в массив B . Массив упорядочить по убыванию.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus
15. Переписать положительные числа из матрицы целых чисел A
в массив B . Из массива B удалить числа, в двоичном представлении
которых единиц больше, чем нулей.
16. Даны четыре квадратные матрицы A(n,n) , B(n,n) , C(n,n) , D(n,n) , в которых хранятся целые числа. Найти матрицу, в которой находится максимальное простое число.
17. Заданы четыре квадратные матрицы A(n,n) , B(n,n) ,
C(n,n) , D(n,n) , в которых хранятся целые числа. Найти матрицы,
в которых на диагоналях есть простые числа.
18. Заданы три прямоугольные матрицы A(n,m) , B(r,p) ,
C(k,q) . Найти матрицы, в которых по периметру расположены только отрицательные числа.
19. Проверить, лежит ли на побочной диагонали минимальный положительный элемент матрицы A(n,n) .
20. Заданы матрицы D(n,n) , A(m,n) и B(n,m) . Найти матрицу C=(B·A) . Проверить, является ли матрица C(n,n) обратной к D(n,n) . Произведением матриц С и D в этом случае должна быть единичная матрица.
21. Заданы четыре квадратные матрицы A(n,n) , B(n,n) ,
C(n,n) , D(n,n) , в которых хранятся целые числа. Найти, в какой из матриц на побочной диагонали есть числа, состоящие из восьмерок.
22. Заменить столбец матрицы Р(n,m) с максимальной суммой
элементов на столбец, где находится максимальное число, состоящее из единиц.
23. Заданы четыре квадратные матрицы A(n,n) , B(n,n) ,
C(n,n) , D(n,n) , в которых хранятся целые числа. Определить, есть
ли среди них матрицы, в которых на побочной диагонали находятся только числа, состоящие из единиц и двоек.
24. Переписать простые числа из матрицы целых чисел A в массив B . Из массива B удалить числа, расположенные между максималь-
ным и минимальным элементами.
25. В матрице целых чисел A(n,n) упорядочить те строки, в которых диагональные элементы не содержат семерок.
Динамические массивы
Начиная с версии 1.1 , Free Pascal также поддерживает, динамические массивы: В этом случае диапазон массива не указывается, как в следующем примере:
TByteArray = Array of Byte ;
При объявлении переменной типа динамический массив начальная длина массива равна нулю. Фактическая длина массива должна быть установлена стандартной функцией SetLength , которая выделит память необходимую для размещения элементов массива в куче. Следующий пример установит длину массива равную 1000 :
SetLength ( A , 1000 );
После вызова SetLength , допустимыми индексами массива будут числа от 0 до 999 : индексация массива всегда начинается с нуля.
Обратите внимание, что длина массива задается в элементах, а не в байтах выделяемой памяти (хотя они могут быть и одинаковыми) . Объем выделенной памяти равняется размеру массива умноженном на размер одного элемента в массиве. Память будет освобождена при выходе из текущей процедуры или функции.
Также есть возможность изменить размер массива: в этом случае будет сохранено настолько много элементов сколько поместится в новом размере массива. Размер массива может быть установлен в ноль, это эффективный способ сбросить переменную.
Попытка получить доступ к элементу массива с индексом, выходящим за границы объявленного диапазона, всегда генерирует ошибку периода выполнения.
Для динамических массивов ведется подсчет ссылок: присвоение одной переменной типа динамический массив, другой переменной, позволит обеим переменным указывать на тот же самый массив. В отличие от AnsiStrings , присвоение значения одному элементу массива будет отражено и в другом: не делается никакой копии массива при записи. Рассмотрите следующий пример:
A , B : TByteArray ;
SetLength ( A , 10 );
После второго присвоения первый элемент в B будет также содержать 31 .
Это также можно заметить по выводу следующего примера:
TA = Array of array of Integer ;
Setlength ( A , 10 , 10 );
For I := 0 to 9 do For J := 0 to 9 do A [ I , J ]:= I * J ;
For I := 0 to 9 do
For J := 0 to 9 do Write ( A [ I , J ]: 2 , ‘ ‘ );
For I := 0 to 9 do For J := 0 to 9 do A [ 9 — I , 9 — J ]:= I * J ;
For I := 0 to 9 do
For J := 0 to 9 do Write ( B [ I , J ]: 2 , ‘ ‘ );
Выводом этой программы будет матрица чисел, а затем будет выведена такая же матрица, но зеркально.

Как отмечалось ранее, для динамических массивов ведется подсчет ссылок: если в одном из предыдущих примеров A выйдет за границы области а B нет, то массив ещё не будет освобожден: счетчик ссылок А (и B ) уменьшится на 1 . Как только счетчик ссылок достигнет нуля, память, выделенная для содержания массива, освобождается.
Вызов SetLength установит счетчик ссылок на указанный массив в 1, если он больше, то после вызова SetLength переменные динамического массива больше не будут указывали на одну и ту же память.
TA = array of Integer ;
Setlength ( A , 10 );
For I := 0 to 9 do A [ I ]:= I ;
SetLength ( B , 6 );
For I := 0 to 5 do Writeln ( B [ I ]);
Также возможно скопировать и/или изменить размер массива с помощью стандартной функции Copy , которая действует как функция копирования для строк:
TA = array of Integer ;
Setlength ( A , 10 );
For I := 0 to 9 do A [ I ]:= I ;
B := Copy ( A , 3 , 6 );
For I := 0 to 5 do Writeln ( B [ I ]);
Функция Copy скопирует 6 элементов массива в новый массив. Начиная с элемента по индексу 3 (то есть четвертого элемента) массива.
Функция Length возвратит число элементов в массиве. Функция Low для динамического массива будет всегда возвращать 0 , а функция High возвратит значение Length-1 , то есть, значение самого большого позволенного индекса массива.
Dynamic array/ru
Динамический массив — это массив, размеры которого неизвестны во время компиляции. Динамический массив не является единственным типом, предоставляющим массивы переменной длины, но с 2018 года он является единственным, который поддерживает FPC.
Contents
Использование
Концепция
Определение динамического массива будет выделять пространство только для указателя. Во время выполнения различные подпрограммы будут обеспечивать удобное использование, но что более важно, синтаксис доступа к элементам массива путем помещения индексов в квадратные скобки поддерживается компилятором (реализован как автоматическое разыменование указателя).
Индексы динамических массивов всегда являются неотрицательными целыми числами, начинающимися с нуля для первого элемента. Невозможно использовать перечислительный тип, любой другой порядковый тип в качестве индекса или изменить первый элемент, заданный индексом 1 .
Определение
Одномерный динамический массив определяется так:
Обратите внимание, что размерность [массива] не указан.
Для определения многомерного массива в качестве базового типа указывается сам массив.
Задание размерности
Процедура компилятора setLength изменит длину динамического массива при условии, что памяти достаточно.
Процедура выделяет память для стольких записей базового типа, сколько указано, плюс некоторые данные для управления. Затем она copies (копирует) все элементы старого массива в новый. Новые поля, которых раньше не было, инициализируются по умолчанию с помощью встроенного механизма.
Размер многомерных массивов также можно изменить с помощью setLength .
Допустимые индексы для первого измерения выборки находятся в диапазоне 0 .. 11 , в то время как действительные индексы для его второго измерения находятся в диапазоне 0 .. 63 .
Один весьма полезный факт заключается в том, что ограничение в неизменности всех размеров [статического массива] не распространяется на динамические массивы.
Инициализация
Начиная с FPC 3.0.0 типы динамических массивов, которые не являются анонимными, автоматически снабжаются «конструктором», как это возможно уже знакомо по объектно-ориентированному программированию. Это позволяет объединить вызовы setLength и серию присвоения значений в одном операторе:
Конечно, вы также можете вкладывать массивы:
Обращение
Имейте в виду, что динамические массивы являются указателями. Присвоение переменных динамического массива друг другу копирует не какую-либо полезную нагрузку, а только адрес. Это отличается от поведения статических массивов.
Если вы хотите дублировать данные, вы должны использовать system . copy .
Только с помощью copy оба массива могут быть изменены независимо.
Как указано выше, setLength копирует данные. Выделенная строка в примере выше (семантически) эквивалентна setLength ( bar , length ( bar )) .
Динамические массивы считаются ссылками. Вызов setLength ( myDynamicArrayVariable , 0 ) фактически делает myDynamicArrayVariable:= nil и уменьшает количество ссылок. Только когда счетчик ссылок достигает нуля, блок памяти освобождается.
Тем не менее, динамические массивы финализируются автоматически. Нет необходимости вручную устанавливать setLength ( … , 0 ) для всех ваших ссылок, когда программа заканчивается или когда выходит из области видимости в целом.
Без <$rangeChecks on>возможен выход за пределы массива. Это означает, что при итерации по динамическим массивам невозможно работать без low и high значений, чтобы определить допустимые индексы (первый является необязательным, поскольку динамические массивы всегда начинаются с нуля). В качестве альтернативы можно использовать циклы for… in, если индекс не требуется.
Помните, что sizeOf динамического массива соответствует размеру указателя.