Занятие 4. Pascal abc.net: Последовательности (начало)

Работа с последовательностями в Паскаль abc.net

Пример работы с последовательностью

Последовательности — это абстрактный набор данных, которые можно перебирать.

  • В отличие от других структур последовательности не хранятся в памяти (поэтому «абстрактный»), т.е. память используется только в конкретный момент времени, когда происходит перебор значений последовательности, и, как правило, нам необходим только 1 элемент (в единицу времени).
  • Последовательностью может быть, например, последовательность чисел:

    арифметическая прогрессия: 1 3 5 7 9

    или

    геометрическая прогрессия: 1 2 4 8 16

    Тип последовательности: Sequence of Real, Sequence of Integer

    Наиболее близким типом данных к последовательности является массив.

    Рассмотрим стандартный пример работы с числовым рядом, БЕЗ использования последовательности:

    Пример: Вывести сумму 10 чисел

    Без использования последовательности:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      
      begin
      var s:=0.0;
      for var i:=1 to 10 do
        begin
          var x:=ReadReal;
          s+=x;
        end;
      print(s)
      end.

      Данный стиль написания программы считается плохим, т.к. основной алгоритм смешивается с вводом (ReadReal).
      пример
      Ввод данных необходимо отсоединить от основного алгоритма. Для этого используем последовательность:

      // накапливаем последовательность, переменная q хранит ее
      var q:=ReadSeqReal(10); 
      var s:=0.0;
      foreach var x in q do
        s+=x;
      print(s)
      end.

      пример работы с последовательностью паскаль абц

      Теперь алгоритм находится отдельно от ввода, программа стала более модифицируема.
      Остается оформить основной алгоритм в виде функции:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      function Sum(q: sequence of real):real;
      begin   
      var s:=0.0;     
      foreach var x in q do
        s+=x;
      result:=s
      end;
      begin
      print(Sum(ReadSeqReal(10)))
      end.
    • У последовательности нельзя изменить какой-либо отдельный элемент
    • Генерация и формирование последовательностей

      Итак, мы рассмотрели, как сформировать последовательность через ввод с клавиатуры:

      • ReadSeqInteger
      • ReadSeqReal
      var q:=ReadSeqReal(10);

      Теперь рассмотрим, как генерируются последовательности.

      Генераторы последовательностей:
      Range(a,b: integer): sequence of integer

      print(Range(1,10)); // [1,2,3,4,5,6,7,8,9,10]

      Range(a,b,step: integer): sequence of integer

      print(Range(1,10,2)); // [1,3,5,7,9]

      Range(c1,c2: char): sequence of char

      print(Range('a','k')); // [a,b,c,d,e,f,g,h,i,j,k]

      Partition(a,b: real; n: integer): sequence of real

      print(Partition(0.0, 6.0, 4)); // делим поровну на 4 части [0, 1.5, 3, 4.5, 6]

      SeqRandomInteger(n: integer[; a,b: integer]): sequence of integer;

      var q:=SeqRandomInteger(5,10,20);
      print(q); // [12,18,16,14,16]

      SeqRandomReal(n: integer[; a,b: real]): sequence of real;

      var q:=SeqRandomReal(3, 1.0, 5.0);
      print(q); // [4.98996168374548,2.22339218166815,2.81110574389394]

      Seq(params a: array of T): sequence of T;

      foreach var x in Seq (1,3,8) do
          print(x*x); // 1 9 64

      SeqFill(count: integer; x: T): sequence of T;

      begin
      var q:=SeqFill(7,5);
      print(q); // [5,5,5,5,5,5,5] 
      end.

      Следует учесть, что последовательности формируются каждый раз, как только с ними организовывается цикл или работает метод:

      генерация последовательностей в Паскаль abc net

      Вывод последовательностей

      Print(delim: string := ' '): sequence of T;

      var q:=SeqRandomInteger(5,10,20);
      q.Print('/'); // 16/11/13/10/13

      Println(delim: string := ' '): sequence of T;

      Решение задач

      Создание и вывод

      Задание seq 1: Создайте целые числа последовательности от -20 до 30 с шагом 3 (Range).

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

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

      [файл: seq01.pas]

      Задание seq 2: Создайте целые числа последовательности от -4 до 4 с шагом 2 (Range)

      [файл: seq02.pas]

      Задание seq 3: Создайте N случайных чисел последовательности от -50 до 100 (SeqRandom)

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

      введите n 
      >>15
      [-23,13,-27,2,46,-26,10,92,60,-9,75,28,85,7,18]
      

      [файл: seq03.pas]

      Задание seq 4: Создайте N чисел последовательности, заполненные 5 (SeqFill)

      [файл: seq04.pas]

      Задание seq 5: Создайте N чисел последовательности c вводом

      [файл: seq05.pas]

      Пример: Написать функцию, которая в последовательности ищет количество максимальных элементов

      Выполнение:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      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);
        println('кол-во макс ',findCountMax(c));
        c.Print();
      end.
      Задание seq 6: Написать функцию, которая в последовательности ищет сумму элементов

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

      1 5 2 10 1
      сумма  19 
      

      [файл: seq06.pas]

      Задание seq 7: Написать функцию, которая в последовательности ищет среднее арифметическое элементов

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

      1 6 2 -10 1 18
      среднее арифметическое =  3 
      

      [файл: seq07.pas]