- •6. Вложенные циклы
- •6.1 Цель работы
- •6.2Заданиe
- •Найдите наибольший элемент, укажите его положение.
- •6.3Теоретические сведения
- •Пример 1. Ручной ввод массива в поле tEdit
- •Пример 3. Процедура инициации двумерного массива
- •Двумерные массивы
- •Динамические двумерные массивы
- •Пример 2. Инициация двумерного динамического массива
- •Пример 4. Формирование двумерного массива случайных чисел
- •Оператор присоединения With
- •Пример 5. Использование With при формировании массива
- •Пример 6. Нахождение наименьшего элемента массива
- •Компонент tStringGrid
- •Основные свойства компонента TstringGrid
- •Пример 7. Работа с таблицей
- •2. Нумерация строк и столбцов фиксированной зоны таблицы
- •3. Контроль ввода данных в таблицу
- •4. Формирование массива по данным таблицы, вывод массива
- •Вывод двумерного массива в таблицу
- •6.4Содержание отчета
- •6.5 Контрольные вопросы
Двумерные массивы
Двумерный массив можно рассматривать как одномерный, у которого каждый элемент сам является массивом, например,
type mat = array [0..5] of array [0..2] of Byte
Такое описание можно заменить более компактным:
type mat = array [0..5, 0..2] of Byte; это двумерный массив, у которого 6 строк [0..5] и 3 столбца [0..2].
Примеры описания двумерных массивов
const N=4; K=3;
type Vector = array [1..N, 1..K ] of Real; //тип массив 4х3}
var M_X : Vector; //переменная массив 4х3}
M_Y : array [1.N, 0..K ] of Byte; //переменная массив 4х4}
M_Z : array [ 1..4, 3..7 ] of Word;
В памяти элементы многомерного массива следуют друг за другом так, что при переходе от младших адресов к старшим наиболее быстро меняется правый индекс массива. Например, для двумерного массива А: array [1..3,1..3] of Byte, последовательность расположения элементов будет следующая:
A[1,1] A[1,2] A[1,3] A[2,1] A[2,2] A[2,3] A[3,1] A[3,2] A[3,3]
Динамические двумерные массивы
При объявлении таких массивов границы индексов не указывают:
var В: array of array of Real; //двумерный массив
Динамические массивы не имеют установленного размера или длины. Глубина вложенности массивов (размерность массива) не ограничена, однако суммарная длина внутреннего представления многомерного массива не может быть больше 2 Гбайт. Распределение памяти и указание границ индексов по каждому измерению динамических массивов осуществляется в ходе выполнения программы путем инициации массива процедурой SetLength.
SetLength(var S; NewLength: Integer) - устанавливает длину переменной динамического массива,
где S - переменная динамического массива;
NewLength - число элементов массива S, нижняя граница индексов
динамического массива всегда 0.
Для освобождения памяти занятой массивом достаточно присвоить идентификатору значение nil или использовать процедуру Finalize.
В многомерных динамических массивах каждый элемент любого из N-1 измерений (N - количество измерений) представляет собой динамический массив и, следовательно, нуждается в инициации.
Пример 2. Инициация двумерного динамического массива
Будем инициировать двумерный массив 3 х 3,
type T2Ar_Real = array of array of Real; //в разделе implementation
var M2: T2Ar_Real; //двумерный динамический массив
…………………………
begin //в исполняемом блоке какой-либо процедуры
SetLength(M2, 3); //Устанавливаем длину первого измерения = 3 (количество
столбцов)
SetLength(M2[0], 3) ; //Задаем длину 0-го столбца, счёт от 0
SetLength(M2[1], 3) ; //Задаем длину 1-го столбца
SetLength(M2[2] ,3) ; //Задаем длину 2-го столбца
Недостаток такого способа
Пример 3. Процедура инициации двумерного массива
Дано: описание типа двумерного динамического массива, type T2Ar_Real = array of array of Real;
описание переменной массива, var M2: T2Ar_Real;
поле Edit1, в которое будет введено значение размерности массива N;
Требуется разработать процедуру Cr_2Mx инициации двумерного динамического массива размером N x N.
Постановка задачи:
после ввода размерности массива, преобразуем строковое значение в числовое N;
зададим количество столбцов массива;
в цикле зададим длину каждого столбца.
procedure Cr_2Mx(Str: String; var M2: T2Ar_Real; var N: integer);
{Str – строковое значение размерности массива}
{var M2 – открытый параметр массива}
{var N – размерность массива, }
var i, cod: Integer; // i – счётчик, cod - индикатор преобразования Строка-Число
begin If Str ='' //проверка на пустое значение
then begin
ShowMessage('Введите N!') ;
exit //досрочное завершение процедуры
end; //конец if Str…
Val(Str, N, сod); //преобразование Str в число N
if cod = 0 //успешное преобразование
then begin
SetLength(M2, N); //задаём кол-во столбцов N
for i:= 0 to N -1 do //задаем длину i-го столбца, счёт от 0
SetLength(M2[i], N);
end
else begin
ShowMessage('Ошибка ввода N!');
exit;
end;
end;
В
ызов
процедуры инициации двумерного массива
NxN,
из какой-либо процедуры обработки
события будет выглядеть так,
Cr_2Mx(Edit1.Text,
M2,
N).
