В PascalABC.NET, как и в Delphi, имеются как статические, так и динамические массивы. Разумеется, использовать при обучении оба вида массивов - непозволительная роскошь. И было принято решение: основной акцент при изучении массивов в курсе "Основы программирования" сделать именно на динамические массивы.
Почему? По ряду причин.
Недостаток видится только один - нетрадиционность такого подхода при обучении на Паскале. Ну что ж, будем ломать стереотипы. Во всех современных языках массивы уже давно - динамические.
Со времени последней статьи о массивах в PascalABC.NET произошел ряд изменений. Во-первых, появились двумерные динамические массивы, которые описываются следующим образом:
var a: array [,] of integer;
Инициализируются такие массивы либо с помощью операции new:
a := new integer[3,4];либо как в Delphi с помощью многомерного SetLength:
SetLength(a,3,4);Второй способ используется также при изменении размера массива: в этом случае все старые значения будут сохранены.
Цикл по такому массиву осуществляется следующим образом:
for var i:=0 to a.GetLength(0) - 1 do begin for var j:=0 to a.GetLength(1) - 1 do write(a[i,j],' '); writeln; end;Итак, перейдем к модулю Arrays. Вот что он предоставляет:
Заметим, что модуль лишь облегчает выполнение часто встречающихся операций, но не содержит подпрограмм решения учебных задач типа вставки, удаления, сдвига элементов и пр.
Рассмотрим несколько примеров его использования.
Пример 1. Создание случайного одномерного массива и его сортировка.
uses Arrays; var a: array of integer; begin a := CreateRandomIntegerArray(10); WritelnArray(a); Sort(a); WritelnArray(a); end.
Здесь функция CreateRandomIntegerArray выделяет память из 10 элементов под динамический массив и заполняет его случайными значениями в диапазоне от 0 до 99, процедура WritelnArray выводит массив на экран, разделяя данные пробелами и процедура Sort сортирует массив по возрастанию.
Приведем этот же пример с небольшими вариациями.
Пример 1a.
uses Arrays; begin var a := CreateRandomIntegerArray(10,1,9); WritelnArray(a,', '); SortDescending(a); WritelnArray(a,'; '); end.
Здесь используется автоопределение типа при инициализирующем присваивании, массив заполняется случайными числами в диапазоне от 1 до 9, затем его элементы выводятся, разделяясь запятыми, затем он сортируется по убыванию.
Трудно было удержаться и от введения методов расширений, позволяющих добавлять новые методы ко всем массивам. В модуле Arrays реализованы лишь методы расширения для вывода массивов - заполнение и сортировка осуществляется только внешними подпрограммами. Приведем код примера 1 с методами расширения:
Пример 1б.
uses Arrays; begin var a := CreateRandomIntegerArray(10); a.Writeln; // Вывод массива; в качестве разделителя используется пробел Sort(a); a.Writeln; end.
Наконец, рассмотрим пример заполнения и вывода двумерного динамического массива. Чтобы были понятны типы, опишем его явно.
Пример 2.
uses Arrays; var a: array [,] of real; begin a := CreateRandomRealMatrix(4,5); WriteMatrix(a,2); end.
Здесь создается матрица 4 на 5, заполняется случайными вещественным значениями (по умолчанию от 0 до 10) и выводится на экран, при этом количество знаков после десятичной точки равно 2.
Это практически все возможности небольшого модуля Arrays, облегчающего выполнение рутинных операций с динамическими массивами.
10.07.23. Release PascalABC.NET 3.9.0. All changes are here.
09.03.22. Release PascalABC.NET 3.8.3. Main features: for loop with step, foreach loop with index. All changes are here.
07.02.22. Release PascalABC.NET 3.8.2. What's new in 3.8.2.
24.08.21. Release PascalABC.NET 3.8.1. Main features - [Cache] attribute and PlotWPF unit. What's new in version 3.8.1.
07.03.21. PascalABC.NET 3.8 release. Slices of multidimensional arrays and unpacking of lambda expressions parameters into variables. What's new in version 3.8..