Массивы (PascalABC.NET): различия между версиями
Строка 78: | Строка 78: | ||
var a1: array of integer; // массив целых | var a1: array of integer; // массив целых | ||
SetLength(a1, 13); // установлена длина массива a1, равная 13 | SetLength(a1, 13); // установлена длина массива a1, равная 13 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Перебор элементов в цикле == | ||
+ | === Перебор с помощью цикла с параметров === | ||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | Begin | ||
+ | var a:= ArrRandom(10, -10, 10); | ||
+ | for var i := 0 to a.Length-1 do | ||
+ | begin | ||
+ | // a[i] | ||
+ | end; | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === Перебор с помощью цикла foreach === | ||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | Begin | ||
+ | var a:= ArrRandom(10, -10, 10); | ||
+ | foreach var x in a do | ||
+ | begin | ||
+ | // x | ||
+ | end; | ||
+ | end. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 98: | Строка 121: | ||
a.Println(); | a.Println(); | ||
a.Println(', '); | a.Println(', '); | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Ввод элементов с клавиатуры == | ||
+ | === Ввод элементов массива с помощью цикла с параметром === | ||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | Begin | ||
+ | var a:= new integer[15]; | ||
+ | for var i := 0 to a.Length-1 do | ||
+ | Readln(a[i]); | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === Ввод элементов массива с помощью функции === | ||
+ | Единственный аргумент данной функции это количество вводимых элементов. | ||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | Begin | ||
+ | var a:= ReadArrInteger(15); | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Лямбда-выражения == | ||
+ | Лямбда-выражения (или просто лямбды) – термин функционального программирования. Они с успехом применяются вместо уже привычных вам процедур и функций. Собственно, они и есть процедуры или функции, только безымянные. | ||
+ | |||
+ | Лямбда-выражение представляет собой некоторое безымянное выражение, отражающее функциональную зависимость. Упрощенно, на его основе компилятор строит функцию, некоторым образом идентифицирует ее и подменяет этим идентификатором лямбда-выражение. | ||
+ | |||
+ | Лямбда-выражение можно записать в переменную. | ||
+ | |||
+ | Пример лямбда-выражения увеличивающего число в 2 раза. | ||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | var x: integer -> integer := t -> 2 * t; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | == Фильтрация == | ||
+ | В программировании фильтруют обрабатываемые данные. Лишь прошедшие через фильтр данные примут участие в дальнейшей обработке. | ||
+ | |||
+ | Вы можете реализовать фильтрацию элементов массива с помощью циклов и условного оператора или с помощью функций-методов массивов. | ||
+ | |||
+ | === Фильтрация с помощью цикла с параметром и условного оператора === | ||
+ | Пример который выделяет в новый массив только положительные числа из изначального массива. | ||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | Begin | ||
+ | var a:= ArrRandom(10, -10, 10); | ||
+ | a.Println; | ||
+ | var b := new integer[a.Length]; | ||
+ | var index := 0; | ||
+ | for var i := 0 to a.Length-1 do | ||
+ | begin | ||
+ | if (a[i] > 0) then | ||
+ | begin | ||
+ | b[index] := a[i]; | ||
+ | index += 1; | ||
+ | end; | ||
+ | end; | ||
+ | SetLength(b, index); | ||
+ | b.Println; | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === Фильтрация с помощью метода Where === | ||
+ | <syntaxhighlight lang="pascal" line> | ||
+ | Begin | ||
+ | var a:= ArrRandom(10, -10, 10); | ||
+ | a.Println; | ||
+ | var b := a.Where(x -> x > 0); | ||
+ | b.Println; | ||
end. | end. | ||
</syntaxhighlight> | </syntaxhighlight> |
Версия 08:13, 13 января 2023
Pascal ABC.NET выбор школьника - Часть 2
Массив
Массив – хранимая нумерованная последовательность однотипных элементов с непосредственным доступом к любому элементу по его индексам, являющимся своеобразным аналогом номера.
Статические и динамические массивы
Статические массивы
Память под статический массив распределяется на этапе компиляции программы. Одновременно может быть выполнена инициализация элементов массива. Границы индексов статического массива неизменны и должны быть указаны в программе константами или выражениями, содержащими только константы.
Статические массивы – дань совместимости с более ранними версиями языка Паскаль.
Длину статического массива нельзя менять.
Динамические массивы
Динамический массив нужного размера может быть создан в том месте программы, где он впервые потребуется.
В динамических массивах индексы начинаются от нуля.
Количество элементов в динамическом массиве может меняться, но никогда не может стать отрицательным. Текущее количество элементов в массиве хранится в поле .Length.
Первый элемент массива всегда имеет индекс ноль.
Создание и инициализация массива
Статические массивы
Статический массив обычно описывается в виде
var ИмяМассива: array[m..n] of ТипЭлементов;
1 var a: array[0..12] of byte; // 13 элементов byte
2 var b, c: array[-5..8] of real; // два массива по 14 элементов real
3
4 var a: array[3..6] of integer := (1, 2, 3, 4);
Динамические массивы
Описание и инициализация динамического массива отличаются лишь тем, что границы индексов не оказываются. Вследствие этого компилятор не может отвести место под такой массив и необходимая память выделяется во время выполнения программы.
1 var a1: array of integer; // массив целых чисел
2 var p: array of real; // массив вещественных чисел
3 var q: array of boolean; // массив логических элементов
Проще всего создать динамический массив при помощи функции Arr, возвращающей такой массив. Ее аргументы – единого типа перечисленные через запятую члены будущего массива. Вместо Arr( ) удобно использовать более короткую конструкцию | |.
1 var a := Arr(1, 9, -4, 12, 40, 39, 54);
2 var d := |1, 9, -4, 12, 40, 39, 54|; // альтернативный вариант
3 var b := |3.5, 2.0, 6.417, -12.0|;
4 var c := Arr(True, 3.5 > 1.63 ** 2.95, Sin(x) > 1, False, False);
Можно совместить описание динамического массива с его созданием, для чего потребуется указать необходимую длину массива.
1 var a := new integer[10]; // массив из 10 целых элементов
2 var b := new real[7]; // массив из 7 вещественных элементов
3 var c := new boolean[4]; // массив из 4 логических элементов
Можно создать массив и обнулить его элементы следующим образом:
1 var a := |0| * 15; // создан массив из 15 нулевых элементов
В случае, когда массив был описан заранее, его длину можно установить (либо поменять) вызовом процедуры SetLength.
1 var a1: array of integer; // массив целых
2 SetLength(a1, 13); // установлена длина массива a1, равная 13
Перебор элементов в цикле
Перебор с помощью цикла с параметров
1 Begin
2 var a:= ArrRandom(10, -10, 10);
3 for var i := 0 to a.Length-1 do
4 begin
5 // a[i]
6 end;
7 end.
Перебор с помощью цикла foreach
1 Begin
2 var a:= ArrRandom(10, -10, 10);
3 foreach var x in a do
4 begin
5 // x
6 end;
7 end.
Вывод массива
Вывод массива с помощью цикла с параметром
1 Begin
2 var a:= new integer[15];
3 for var i := 0 to a.Length-1 do
4 Write(a[i], ' ');
5 end.
Вывод массива методом Print
Метод предполагает необязательный параметр обозначающий разделитель.
1 Begin
2 var a:= ArrRandom(10, -10, 10);
3 a.Println();
4 a.Println(', ');
5 end.
Ввод элементов с клавиатуры
Ввод элементов массива с помощью цикла с параметром
1 Begin
2 var a:= new integer[15];
3 for var i := 0 to a.Length-1 do
4 Readln(a[i]);
5 end.
Ввод элементов массива с помощью функции
Единственный аргумент данной функции это количество вводимых элементов.
1 Begin
2 var a:= ReadArrInteger(15);
3 end.
Лямбда-выражения
Лямбда-выражения (или просто лямбды) – термин функционального программирования. Они с успехом применяются вместо уже привычных вам процедур и функций. Собственно, они и есть процедуры или функции, только безымянные.
Лямбда-выражение представляет собой некоторое безымянное выражение, отражающее функциональную зависимость. Упрощенно, на его основе компилятор строит функцию, некоторым образом идентифицирует ее и подменяет этим идентификатором лямбда-выражение.
Лямбда-выражение можно записать в переменную.
Пример лямбда-выражения увеличивающего число в 2 раза.
1 var x: integer -> integer := t -> 2 * t;
Фильтрация
В программировании фильтруют обрабатываемые данные. Лишь прошедшие через фильтр данные примут участие в дальнейшей обработке.
Вы можете реализовать фильтрацию элементов массива с помощью циклов и условного оператора или с помощью функций-методов массивов.
Фильтрация с помощью цикла с параметром и условного оператора
Пример который выделяет в новый массив только положительные числа из изначального массива.
1 Begin
2 var a:= ArrRandom(10, -10, 10);
3 a.Println;
4 var b := new integer[a.Length];
5 var index := 0;
6 for var i := 0 to a.Length-1 do
7 begin
8 if (a[i] > 0) then
9 begin
10 b[index] := a[i];
11 index += 1;
12 end;
13 end;
14 SetLength(b, index);
15 b.Println;
16 end.
Фильтрация с помощью метода Where
1 Begin
2 var a:= ArrRandom(10, -10, 10);
3 a.Println;
4 var b := a.Where(x -> x > 0);
5 b.Println;
6 end.