Работа со срезами в Паскале abc.NET
Срез массива — это подмножество исходного массива.
Для массива
var a := Arr(0,1,2,3,4,5,6,7,8,9); |
Два варианта среза:
1. a[x:y] 2. a[x:y:step] - где x - начало среза (включительно), y - конец среза (не включительно); - x и y могут быть опущены.
- Срезы доступны только на чтение, присваивать им значения нельзя.
- Тип среза такой же, как у массива.
- Срезы работают с массивами, строками и со списками.
begin var a := Arr(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); a[:4].println(); // 0 1 2 3 a[4:].println(); // 4 5 6 7 8 9 a[:a.Length - 1].println(); // 0 1 2 3 4 5 6 7 8 a[:].println(); // 0 1 2 3 4 5 6 7 8 9 (copy of a) a[::2].println(); //0 2 4 6 8 a[1::2].println(); // 1 3 5 7 9 a[4:1:-1].println(); // 4 3 2 a[::-1].println(); // 9 8 7 6 5 4 3 2 1 0 (reverse of a) end. |
Дан массив
A
размера N
и целое число K
(1 <= K <= N
). Выведите его элементы с порядковыми номерами (т. е. индексами), кратными K
:
Ak, A2 * k, A3 * k ...
Не использовать оператор if
.
Пример вывода:
сколько элементов? 7 1.1 3.2 6.2 7.6 8.2 5.4 6.6 K = 3 6.2 5.4
✍ Решение:
begin var n:=ReadInteger('сколько элементов?'); // 7 var a:=ReadArrReal(n); // 1.1 3.2 6.2 7.6 8.2 5.4 6.6 var k:=ReadInteger('K ='); // 3 a[k-1 : : k].Print; // 6.2 5.4 end. |
Дан массив размера N
. Выведите его элементы в обратном порядке.
Пример вывода:
сколько элементов >> 10 массив: 25 5 68 42 48 32 100 77 50 47 результат: 47 50 77 100 32 48 42 68 5 25
[файл: slice01.pas
]
Дан массив A
размера N
(N
- четное число). Вывести его элементы с четными номерами в порядке возрастания номеров:
а2, а4, а6, ... аn
Условный оператор не использовать.
Пример вывода:
>>10 64 64 21 72 22 82 62 50 30 25 64 72 82 50 25
[файл: slice02.pas
]
Дан массив размера
N
и целые числа K
и L
(1 <= K<= L<= N
). Найдите среднее арифметическое (среднее значение) элементов массива с индексами от K
до L
включительно.
Пример вывода:
>> 10 59 87 0 37 57 69 79 19 100 5 K = >> 2 L = >> 4 41.3333333333333
✍ Решение:
begin var n:=ReadInteger; var a:=arrrandominteger(n); a.Println; var k:=ReadInteger('K = '); var l:=ReadInteger('L = '); var slice:=a[k-1:l].Average; slice.Print; end. |
Дан массив размера N
. Найдите минимальный элемент из его четных элементов: a2
, a4
, a6
, ....
Замечание: следует использовать метод min
.
Пример вывода:
>> 10 96 79 71 87 61 21 51 74 67 89 срез: [79,87,21,74,89] мин: 21
[файл: slice03.pas
]
Дан массив из
N
целых чисел. Необходимо вставить элемент x
на k
-ую позицию, k<=N
.
✍ Решение:
begin var a := arr(5, 12, 1, 3, 11, 19); var x := ReadInteger ('enter a number to insert'); var k := ReadInteger ('enter an order number'); a := a[:k] + Arr(x) + a[k:]; print(a) // [5,12,3,1,3,11,19] end. |
Дан массив из
N
целых чисел. Необходимо удалить элемент с индексом k
, k < N
.
✍ Решение:
begin var a := arr(5, 12, 1, 3, 11, 19); var k := ReadInteger ('введите индекс'); // 2 a := a[:k] + a[k+1:]; print(a) //[5,12,3,11,19] end. |
Дан целочисленный массив. Необходимо найти максимальный элемент массива и удалить его. Использовать срезы.
Замечание: Можно использовать метод a.IndexMax
.
Примерный вывод:
массив: [66,46,26,64,73,62,37,57,46,9] результат: [66,46,26,64,62,37,57,46,9]
[Program name: slice-04.pas
]
Дан целочисленный массив и число
n
(запросить ввести). Необходимо найти индекс минимального элемента и вставить перед этим элементом число n
. Использовать срезы.
Замечание: Можно использовать метод a.IndexMin
.
Примерный вывод:
массив: [20,3,18,33,93,58,30,56,15,3]
введите n:
>> 20
результат: [20,20,3,18,33,93,58,30,56,15,3]
[Program name: slice-05.pas
]
Работа со списками в Паскале abc.NET
Список (List) представляет собой динамический массив с динамическим изменением его размера во время выполнения программы.
Объявление списка List:
var l := new List<integer>; // l.Count = 0 |
Короткое объявление с инициализацией:
var L := Lst(25, -23, 47, 100, 0, 14); |
или
var L2 := Lst(Arr(14, 172, -5, 0, 39)); // [14,172,-5,0,39] var L3 := Lst(ArrRandom(5, -99, 99)); // [0,-6,2,-81,10] var L4 := Lst(L3); // в L4 один элемент – это список list [[0,-6,2,-81,10]] |
var L := Lst(Arr(14, 172, -5, 0, 39)); L.Add(5); // расширение списка L.Add(3); L.Add(4); L += 8; // синоним l.Add(8) println(L); // [14,172,-5,0,39,5,3,4,8] |
for var i:=0 to L.Count-1 do Print(L[i]); foreach var x in L do Print(x); |
var L := Lst(5,2,3); Print(2 in L); // True Print(2 * L); // [5,2,3,5,2,3] L.Print; // 5 2 3 Print(L + Lst(7,6,8)); // 5 2 3 7 6 8 |
L.Insert(ind,x); // вставка элемента x с позицией индекса ind L.RemoveAt(ind); // удаление элемента по индексу ind L.RemoveRange(ind,count) // удаление диапазона элементов L.RemoveAll(x -> x.IsOdd); // удаление с условием L.IndexOf(3); // индекс первого найденного указанного знач-я или -1 L.FindIndex(x -> x > 4);//индекс первого найденного с условием или -1 L.Clear; L.Reverse; L.Sort; |
Дан массив из
N
целых чисел. Необходимо вставить элемент x
на k
-ую позицию, k<=N
.
✍ Решение:
begin var L := lst(arr(5, 12, 1, 3, 11, 19)); var x := ReadInteger ('введите вставляемое число'); //3 var k := ReadInteger ('введите позицию');//2 L.Insert(k,x); print(L) // [5,12,3,1,3,11,19] end. |
Дан массив из
N
целых чисел. Необходимо удалить элемент с индексом k
, k < N
.
✍ Решение:
begin var L := lst(arr(5, 12, 1, 3, 11, 19)); var k := ReadInteger ('введите позицию'); //2 L.RemoveAt(k); print(L) // [5,12,3,11,19] end. |
Дан массив из
N
целых чисел. Вставьте все четные элементы массива в список L1
, а все нечетные элементы – в список L2
.
Пример вывода:
[24,6,8,14,24,21,21,9,20,22] 24 6 8 14 24 20 22 21 21 9
✍ Решение:
begin var a := arrrandominteger(10, 5, 25); println(a); // [17,25,8,17,21,9,19,22,19,24] var L1 := new List<integer>; var L2 := new List<integer>; foreach var x in a do if x.IsEven then L1 += x else L2 += x; L1.println; // 8 22 24 L2.println; // 17 25 17 21 9 19 19 end. |
Дан массив размера N
. Задается массив целых чисел (заполните его случайно сгенерированными числами в диапазоне [-5,20]
). Вставьте все положительные элементы массива в список L1
, а все отрицательные элементы - в список L2
.
Пример вывода:
массив: [17,16,15,5,-2,2,-3,-5,16,-5] L1: 17 16 15 5 2 16 L2: -2 -3 -5 -5
[файл: list01.pas
]
Задан список целых чисел. Найдите максимальный элемент списка и удалите его. Необходимо использовать стандартный метод списка - L.RemoveAt(k);
.
Примечание: Для нахождения индекса максимального элемента лучше использовать метод L.IndexMax
.
Пример вывода:
список: 0 93 71 88 99 44 50 36 72 1 результат: [0,93,71,88,44,50,36,72,1]
[файл: list02.pas
]