Учебный модуль для работы с массивами

Просмотров: 37106

В PascalABC.NET, как и в Delphi, имеются как статические, так и динамические массивы. Разумеется, использовать при обучении оба вида массивов - непозволительная роскошь. И было принято решение: основной акцент при изучении массивов в курсе "Основы программирования" сделать именно на динамические массивы.

Почему? По ряду причин.

  • Они меняют свой размер по ходу работы программы.
  • Они легко передаются в подпрограммы и помнят свой размер.
  • В стандартных .NET-библиотеках содержится достаточно большое количество подпрограмм для работы с динамическими массивами.

Недостаток видится только один - нетрадиционность такого подхода при обучении на Паскале. Ну что ж, будем ломать стереотипы. Во всех современных языках массивы уже давно - динамические.

Со времени последней статьи о массивах в 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. Создание одномерных и двумерных массивов с одновременным заполнениием их случайными значениями.
  2. Заполнение заданным значением и случайными значениями уже созданных динамических массивов.
  3. Ввод, вывод.
  4. Простейшая сортировка.

Заметим, что модуль лишь облегчает выполнение часто встречающихся операций, но не содержит подпрограмм решения учебных задач типа вставки, удаления, сдвига элементов и пр.

Рассмотрим несколько примеров его использования.

Пример 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, облегчающего выполнение рутинных операций с динамическими массивами.

Новости

29.08.16. Вышла версия 3.2. Реализован оператор yield.

12.02.16. Вышла версия 3.1. Добавлены кортежи в стиле (a,b) и кортежное присваивание (a,b) := (b,a)

31.12.15. Версия 3.0.0.1128. Реализованы обобщенные методы расширения для операций

22.12.15. Версия 3.0.0.1116. Реализован новый синтаксис extension-методов

Случайная программа

// Броуновское движение Робота
// Уровень сложности: 0
uses Robot;

begin
  Field(50,40);
  while True do
  begin
    case Random(4) of
  0: if FreeFromRight then
       Right;
  1: if FreeFromDown then
       Down;
  2: if FreeFromLeft then
       Left;
  3: if FreeFromUp then
       Up;
    end;
    Paint;
  end;
end.