Содержание:
Работа со срезами в Паскале 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
]
Работа с последовательностями
Последовательность - это набор элементов, которые могут обрабатываться друг за другом
Последовательность:
foreach
var s: sequence of integer; |
begin var q:=ReadSeqReal(10); var s:=0.0; foreach var x in q do s+=x; print(s) end. |
Seq(1,3,5,7,9) .Print; // 1 3 5 7 9 print(Range(1,10)); // [1 2 3 4 5 6 7 8 9 10] print(Range(1,10,2)); // [1 3 5 7 9] print(Range('a','k')); // [a,b,c,d,e,f,g,h,i,j,k] sequence of char var q:=SeqRandomInteger(5,10,20); print(q); // [12,18,16,14,16] var q:=SeqRandomReal(3, 1.0, 5.0); print(q); // [4.98996168374548,2.22339218166815,2.81110574389394] print(SeqFill(10,55)); // 55 55 55 55 55 55 55 55 55 55 print(Partition(0.0, 6.0, 4)); // divide equally into 4 parts [0, 1.5, 3, 4.5, 6] |
Создайте функцию для вычисления произведения 5 введенных элементов последовательности.
Примечание: заголовок функции:
function Product(q: sequence of real):real; |
Пример вывода:
Пожалуйста, введите 5 вещественных чисел: 1.2 3.1 6.7 2.8 3.4 произведение: 237.27648
[файл: seq01.pas
]
Создайте последовательность целых чисел от -20
до 30
с шагом 3
(функция Range
).
Пример вывода:
[-20,-17,-14,-11,-8,-5,-2,1,4,7,10,13,16,19,22,25,28]
[файл: seq02.pas
]
Создайте N
случайных чисел последовательности от -50
до 100
(функция SeqRandom
).
Пример вывода:
введите n >>15 [-23,13,-27,2,46,-26,10,92,60,-9,75,28,85,7,18]
[файл: seq03.pas
]
В pascalabc.net возможно использование следующих методов последовательностей:
s.Sum s.Average s.Min s.Max s.Count s.Count(условие) s.All(условие) s.Any(условие) s.Print s.Println s.PrintLines |
Создать функцию, которая ищет в последовательности количество максимальных элементов.
Примерный вывод:
1 5 2 10 1 10 кол-во максимальных элементов 2
✍ Решение:
function findCountMax(a: sequence of integer):integer; begin var k:=a.Max(); foreach var i in a do if i=k then result+=1; end; begin var c:=Seq(1,5,2,10,1,10); c.Println(); println('кол-во максимальных элементов ',findCountMax(c)); end. |
Создать функцию, которая выдает сумму нечетных элементов последовательности. Следует использовать метод
IsOdd
в цикле foreach
.
Пример вывода:
1 5 2 10 1 10 сумма нечетных элементов 7
[Файл: seq-04.pas
]
Используя метод
Seq
определите последовательность. Посчитайте количество чисел x
(x
вводится) в последовательности. Следует использовать метод count(условие)
.
Примерный вывод:
-1 2 3 -5 2 -7 8 2 11 введите x: 2 2 найдено 3 раза
✍ Решение:
begin var c:=Seq(-1,2,3,-5,2,-7,8,2,11); c.Println(); var x:=readinteger('enter x:'); var n:=c.count(c->c=x); println($'{x} найдено {n} раза '); end. |
Используя метод
Seq
определите последовательность. Посчитайте количество отрицательных элементов последовательности. Следует использовать метод count(условие)
.
Примерный вывод:
-1 2 3 -5 6 -7 8 9 11 количество отрицательных элементов 3
[файл: seq-05.pas
]