Pascal: Занятие. Срезы, списки (pascalabc.NET)

На занятии происходит знакомство со срезами и списками в pascalabc net. Последовательности в Паскале. Рассматриваются алгоритмы для работы со срезами и списками

Сайт labs-org.ru предоставляет лабораторные задания по теме для закрепления теоретического материала и получения практических навыков программирования на Паскале. Краткие теоретические сведения позволят получить необходимый для этого минимум знаний. Решенные наглядные примеры и лабораторные задания изложены по мере увеличения их сложности, что позволит с легкостью изучить материал с нуля. Желаем удачи!

Работа со срезами в Паскале 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.
Задание 1:

Дан массив размера N. Выведите его элементы в обратном порядке.

Пример вывода:

сколько элементов
>> 10
массив:
25 5 68 42 48 32 100 77 50 47
результат:
47 50 77 100 32 48 42 68 5 25

[файл: slice01.pas]

Задание 2:

Дан массив 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.
Задание 3:

Дан массив размера 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.
Задание 4:
Дан целочисленный массив. Необходимо найти максимальный элемент массива и удалить его. Использовать срезы.

Замечание: Можно использовать метод 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]

Задание 5:
Дан целочисленный массив и число 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]