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

Дата изменения: 30 ноября 2021
На занятии происходит знакомство со срезами и списками в 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]

Работа с последовательностями

  
Последовательность - это набор элементов, которые могут обрабатываться друг за другом

Последовательность:

  • Не хранит все свои элементы в памяти
  • В текущий момент в памяти есть только один элемент
  • Последовательность - это алгоритм для получения значений по одному (последовательно по очереди)
  • Основной цикл для работы - foreach
  • Объявление последовательности
    var s: sequence of integer;
    Ввод последовательности
  • ReadSeqInteger
  • ReadSeqReal
  • 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]
    Задание seq01:

    Создайте функцию для вычисления произведения 5 введенных элементов последовательности.

    Примечание: заголовок функции:

    function Product(q: sequence of real):real;

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

    Пожалуйста, введите 5 вещественных чисел:
    1.2
    3.1
    6.7
    2.8
    3.4
    произведение: 237.27648
    

    [файл: seq01.pas]

    Задание seq02:

    Создайте последовательность целых чисел от -20 до 30 с шагом 3 (функция Range).

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

    [-20,-17,-14,-11,-8,-5,-2,1,4,7,10,13,16,19,22,25,28] 
    

    [файл: seq02.pas]

    Задание seq03:

    Создайте 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.
    Задание seq04:
    Создать функцию, которая выдает сумму нечетных элементов последовательности. Следует использовать метод 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]

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    *
    *


    Вставить формулу как
    Блок
    Строка
    Дополнительные настройки
    Цвет формулы
    Цвет текста
    #333333
    Используйте LaTeX для набора формулы
    Предпросмотр
    \({}\)
    Формула не набрана
    Вставить