Lesson #13. Arrays (continuation)

Theory

Lection in pdf format

Filling an array with generated sequence. lambda expressions

var a := Arr(1,3,5,7,9);   // [1,3,5,7,9] 
var a := ArrFill(5,555);  // [555,555,555,555,555] 
var a := Arr(55) * 4 + Arr(77) * 6;  // [55,55,55,55,77,77,77,77,77,77] 
var a := ArrGen(10,i->i);   // [0,1,2,3,4,5,6,7,8,9]
var a := ArrGen(10,i->i,1);  // [1,2,3,4,5,6,7,8,9,10] 
var a := ArrGen(10,1,x->x+2);  // [1,3,5,7,9,11,13,15,17,19] 
var a := ArrGen(10,1,x->x*2);  // [1,2,4,8,16,32,64,128,256,512]
var a := ArrGen(10,1,1,(x,y)->x+y);  // [1,1,2,3,5,8,13,21,34,55]

Array input and Randomly generated array

var a:=ReadArrInteger(5); 
var a:=ReadArrReal(5);
 
var a:=new integer[10];
a:=arrRandomInteger(10); // array of 10 generated integers from 0 to 99

Params keyword to pass a varying number of parameters

1
2
3
4
5
6
7
8
9
10
11
function Sum(params a: array of integer): integer;
begin
  Result := 0;
  foreach var x in a do
    Result += x;
end;
 
begin
  Print(Sum(1,3,5));
  Print(Sum(1,4,10,22,44));
end.
  • In the case of more than one parameter, params should be the last one in the list
  • SetLength procedure

  • Standard SetLength function allocates the necessary memory to contain the array elements
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    function MakeArr (params a: array of integer): array of integer;
    begin
      var b := new integer[a.length];
      var j := 0;
      for var i := 0 to a.length - 1 do 
        if a[i] > 0 then
        begin
          b[j] := a[i];
          j += 1;
        end;
      SetLength(b, j); // to specify a particular value of b array size
      result := b;
    end;
     
    begin
      var a := arrRandomInteger(5, -5, 10); // array a [-1,9,9,7,-3,0,-2,1,1,-1] 
      println('array a', a);
      println('result of function, array b ', MakeArr(a)); // array b  [9,9,7,1,1] 
    end.

    Reassignment and copy function

    var a: array of integer := (1,3,5,7); 
    var b:=a; // [1,3,5,7]

    But!

  • If we now reassign the values of the elements of the array b, then the array a will also change:
  • var a: array of integer := (1,3,5,7); 
    var b:=a; b[2]:=1; 
    print(a); //[1,3,1,7]
  • To avoid this situation, you need to create array b as a copy of array a:
  • var a: array of integer := (1,3,5,7); 
    var b:=Copy(a); 
    b[2]:=1; 
    print(a); //[1,3,5,7]

    Standard functions and procedures

    • Reverse(a)
    • Reverses elements in a array

    • a.IndexOf(x)
    • Finds the position (index) of x in a array

    • a.LastIndexOf(x)
    • Finds the last position (index) of x in a array

    • a.Contains(x)
    • Checks if the a array contains x

    Labs and tasks

    Filling an array with generated sequence

    {0.2 points} Task 1:

    To do: Generate an array of integers from -20 to 30. You should use ArrGen() function.

    Expected output:

    [-20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3,
     -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
     22, 23, 24, 25, 26, 27, 28, 29, 30]
    

    [Program name: 13task-01.pas]

    {0.2 points} Task 2:

    To do: Generate an array of integers from -10 to 10 in increments of 2 (step = 2). You should use ArrGen() function.

    Expected output:

    [-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10]
    

    [Program name: 13task-02.pas]

    {0.2 points} Task 3:

    To do: Generate an array of 20 numbers 5. You should use ArrFill() function.

    Expected output:

    [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
    

    [Program name: 13task-03.pas]

    {0.2 points} Task 4:

    To do: Generate an array of the products of twos of numbers beginning with 1: i.e. 1 * 2, 2 * 2, 2 * 4, …). You should use ArrGen() function with two variables (x & y).

    Expected output:

    [1,2,2,4,8,32,256,8192] 
    

    [Program name: 13task-04.pas]

    Params keyword. SetLength procedure

    Lab 1: Params keyword

    To do: Create a function to add any number of integers.

    ✍ Algorithm:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      function Sum(params a: array of integer): integer;
      begin
        Result := 0;
        foreach var x in a do
          Result += x;
      end;
       
      begin
        Print(Sum(1,3,5));
        Print(Sum(1,4,10,22,44));
      end.
    • params keyword is used to make it able to pass a varying number of parameters.
    • In the case of more than one parameter, params should be the last one in the list
    {0.4 points} Task 5:

    To do: Create a PrintArr procedure that prints out any number of numbers, delimited by some character (the numbers must be understood as an array parameter, and there must be also a delim parameter, the value of which is a character). Inside the main program, call the procedure several times with different number of parameters.

    Note: Procedure call example:

    var a:=new integer[10];
    a:=arrRandomInteger(10);
    PrintArr(';',a);
    PrintArr('~',1,2,3);
    // some more procedure call

    Extra task: * Correct the PrintArr procedure so that there is no delimeter after the last element.

    Expected output:

    76 ; 22 ; 71 ; 92 ; 51 ; 68 ; 70 ; 47 ; 15 ; 37 ; 
    1 ~ 2 ~ 3 ~ 
    5 / 2 / 3 / 5 / 
    

    [Program name: 13task-05.pas]

    {0.4 points} Task 6:

    To do: Three integer array of different sizes are generated randomly. Write a procedure EvenDouble with one parameter: an integer array of any size. Procedure must double all the elements of the array with even values and print out the resulting array.

    Note: Inside the main program, call the procedure several times with the arrays of different sizes:

    var a := new integer[10];
    a := arrRandomInteger(5,-5,5);
    EvenDouble(a);
    var a1 := new integer[5];
    ...
    // some more procedure calls

    Expected output:

    the array before the task is done: [33,0,52,35,70,56,83,12,68,78] 
    result: 33 0 104 35 140 112 83 24 136 156 
    ---
    the array before the task is done: [5,-1,4,1,1] 
    result: 5 -1 8 1 1  
    

    [Program name: 13task-06.pas]

    Lab 2: SetLength

    To do: create a function to fill array b with positive numbers of array a

    ✍ Algorithm:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      
      function MakeOddArrFunc(params a: array of integer): array of integer;
      begin
        var b := new integer[a.length];
        var j := 0;
        for var i := 0 to a.length - 1 do 
          if a[i] > 0 then
          begin
            b[j] := a[i];
            j += 1;
          end;
        SetLength(b, j);
        result := b;
      end;
       
      begin
        var a := arrRandomInteger(10, -5, 10);
        println('array a', a);
        println('result of function, array b ', MakeOddArrFunc(a));
      end.
    {0.4 points} Task 7:

    To do: Create a function to fill array b with local minimums of array a. The local minimum is the element that is less than each of its neighbours. The first and last element should not be considered as local minima.

    Expected output:

    array a [6,-2,3,-4,6] 
    result of function, array b  [-2,-4] 
    

    [Program name: 13task-07.pas]