Pascal: Занятие. Последовательности (pascalabc.NET)

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

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

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

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

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

  • Не хранит все свои элементы в памяти
  • В текущий момент в памяти есть только один элемент
  • Последовательность — это алгоритм для получения значений по одному (последовательно по очереди)
  • Основной цикл для работы — 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]

    Генерация бесконечных последовательностей
    • Cycle()
    • Повторение блока последовательности:

      Seq(1,2,10,5).Cycle().Take(15).Println; // 1 2 10 5 1 2 10 5 1 2 10 5 1 2 10

      Take используется для того, чтобы ограничить вывод до указанного количества элементов

    • Repeat
    • Бесконечная последовательность чисел:

      var q:=55.Repeat.Take(10).Println; // 55 55 55 55 55 55 55 55 55 55
    • Step
    • Генерация бесконечной последовательности с шагом:

      var q:=5.Step(2).Take(10).Println; // 5 7 9 11 13 15 17 19 21 23
    • Iterate
    • Генерация бесконечной последовательности, созданной по правилу Лямбда-выражения:

      var q:=10.Iterate(x->x-2).Take(10).Println; // 10 8 6 4 2 0 -2 -4 -6 -8
    Генерация последовательностей с лямбда-выражением
    • SeqGen(count: integer; f: integer -> T): sequence of T;
    • begin
      var sq:=SeqGen(5,x->x+1);
      sq.println; // 1 2 3 4 5
      end.
    • SeqGen(count: integer; first: T; next: T -> T): sequence of T;
    • begin
      var sq:=SeqGen(5, 4, x->x+1);
      sq.println; // 4 5 6 7 8
      end.
    • SeqGen(count: integer; first,second: T; next: (T,T) -> T): sequence of T;
    • begin
      var sq:=SeqGen(5, 1,3, (x,y)->x+y);
      sq.println; // 1 3 4 7 11
      end.
    • SeqWhile(first: T; next: T -> T; pred: T -> boolean): sequence of T;
    • Condition is added:

      begin
      var sq := seqWhile(2, x->x*2, x->x <= 1024);
      sq.println; // 2 4 8 16 32 64 128 256 512 1024
      end.
    • SeqWhile(first,second: T; next: (T,T) -> T; pred: T -> boolean): sequence of T;
    • begin
        var sq := seqWhile(1, 1, (x, y)-> x + y, x -> x <= 1000);
        sq.println; // 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
      end.
    Задание seq-04:

    Используя лямбда-выражение создайте последовательность из N четных чисел, начиная с числа 10 (использовать SeqGen)

    Примерный вывод:

    Enter n 
    >> 7
    10 12 14 16 18 20 22
    

    [Файл: seq04.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.
    Пример:

    Создать последовательность, используя метод Seq. Посчитать количество вхождений заданного 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('введитеx:');
        var n:=c.count(c->c=x);
        println($'{x} встречается в последовательности {n} раза');
      end.
    Задание seqMeth01:

    Создайте последовательность, используя метод Seq. Посчитайте количество отрицательных элементов последовательности. Необходимо использовать метод count ().

    Примерный вывод:

    -1 2 3 -5 6 -7 8 9 11
    количество отрицательных элементов 3
    

    [Файл: seqMeth-01.pas]

    +++++++++++++++++++++++

    Задание seqMeth02:
    Создать функцию, которая выдает количество нечетных элементов последовательности. Следует использовать метод IsOdd и лямбда-выражение.

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

    1 5 2 10 1 10
    кол-во нечетных элементов  3 

    [Файл: seqMeth-02.pas]

    Задание:
    Используя метод Seq определите последовательность. Посчитайте количество отрицательных элементов последовательности. Следует использовать метод count(условие).

    Примерный вывод:

    -1 2 3 -5 6 -7 8 9 11
    количество отрицательных элементов 3

    [файл: seq-05.pas]

    {0.2 points} Task 7:

    To do: Create the following sequence: 1 3 9 27 81 243 729 2187 6561 19683 (SeqGen should be used)

    The resulting example:

    3 9 27 81 243 729 2187 6561 19683
    

    [Program name: 16task-07.pas]

    {0.3 points} Task 8:

    To do: Create a sequence of 15 numbers: 2 1 0.5 0.25 0.125 0.0625 0.03125 0.015625 ... (specifying the first element and the function to get the next one) (SeqGen should be used)

    The resulting example:

    2  1  0.5  0.25  0.125  0.0625  0.03125  0.015625 0.0078125 0.00390625 
    0.001953125 0.0009765625 0.00048828125 0.000244140625 0.0001220703125 
    

    [Program name: 16task-08.pas]

    {0.2 points} Task 9:

    To do: Create the following sequence: 2017 2012 2007 2002 1997 1992 1987 1982 1977 1972 (SeqGen should be used)

    The resulting example:

    2017 2012 2007 2002 1997 1992 1987 1982 1977 1972
    

    [Program name: 16task-09.pas]

    Lab:

    To do: Create a sequence of N Fibonacci numbers

    The resulting example:

    Enter n 
    >>8
    1 1 2 3 5 8 13 21
    

    ✍ Algorithm:

      begin
      var n:=readInteger('Enter n');
      var sq:=SeqGen(n,1,1,(x,y)->x+y);
      sq.println();
      end.
    Lab:

    To do: Create a sequence of N numbers generated by the iterative process: а1=2, аk=(аk-1+1)*аk-1, k = 2,3,… (SeqGen should be used)

    The resulting example:

    Enter n 7
    2 6 42 1806 3263442 -1461943274 -757910022
    

    ✍ Algorithm:

      begin
      var n:=readInteger('Enter n');
      var sq:=SeqGen(n,2,x->(x+1)*x);
      sq.println();
      end.
    {0.4 points} Task 10:

    To do: Create a sequence of N numbers generated by the iterative process: a1 = 5, ak = ak-1 / 2-1, k = 2,3, … (SeqGen should be used)

    The resulting example:

    Enter n 
    >> 9
    5  1.5  -0.25  -1.125  -1.5625 -1.78125 -1.890625 -1.9453125 -1.97265625
    

    [Program name: 16task-10.pas]

    {0.4 points} Task 11:

    To do: Create a sequence of N numbers generated by the iterative process: а1=1, а2=2, аkk-1+2аk-2, k=3,… (SeqGen should be used)

    The resulting example:

    Enter n 
    >>7
    1 2 4 8 16 32 64
    

    [Program name: 16task-11.pas]

    {0.4 points} Task 12:

    To do: Create a sequence of N numbers generated by the iterative process: а1=1, а2=2, аk=(аk-1k-2)/2, k=3,… (SeqGen should be used)

    The resulting example:

    Enter n 
    >> 7
    1 2 1.5 1.75 1.625 1.6875 1.65625
    

    [Program name: 16task-12.pas]