Как составить массивы в паскале

На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию random в Паскале. Рассматривается пример того, как вывести числа Фибоначчи

Материалы сайта labs-org.ru направлены на практическое освоение языка программирования Pascal. Краткие теоретические сведения не претендуют на полное освещение материала по теме; необходимую информацию можно найти в сети Интернет в большом количестве. В наши же задачи входит предоставление возможности получения практических навыков программирования на Паскале. Решенные наглядные примеры и задания изложены по мере увеличения их сложности, что позволит с легкостью изучить материал с нуля.

Содержание:

  • Одномерные массивы в Паскале
    • Объявление массива
    • Инициализация массива
    • Вывод элементов массива
    • Динамические массивы (pascalAbc.Net)
    • Функция Random в Pascal
    • Числа Фибоначчи в Паскале
    • Максимальный (минимальный) элемент массива
    • Поиск в массиве
    • Циклический сдвиг
    • Перестановка элементов в массиве
    • Выбор элементов и сохранение в другой массив
    • Сортировка элементов массива

Одномерные массивы в Паскале

Объявление массива

Массивы в Паскале используются двух типов: одномерные и двумерные.
Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:

Описание массива в Паскале

Объявление массива

var dlina: array [1..3] of integer;
begin
dlina[1]:=500; 
dlina[2]:=400; 
dlina[3]:=150;
...
  • dlina — идентификатор (имя) массива;
  • для объявления используется служебное слово Array (в переводе с англ. «массив» или «набор»);
  • [1..3] — в квадратных скобках ставится номер (индекс) первого элемента, затем две точки и индекс последнего элемента массива, т.е. по сути, указывается количество элементов; количество элементов массива называется размерностью массива
  • of integer (с англ. «из целых чисел») — указывает, к какому типу относится массив, of здесь — служебное слово.
  • Объявить размер можно через константу:

    размер массива через константу

    Инициализация массива

    Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:

    const a:array[1..4] of integer = (1, 3, 2, 5);

    Заполнение последовательными числами:
    заполнение массива

    Результат:
    A[1] = 8, A[2] = 9, A[3] = 10, ..., A[N] = A[N-1] + 1
    

    Ввод с клавиатуры:

    Пример: Рассмотрим, как происходит ввод массива в Паскале:

    writeln ('введите кол-во элементов: ');
    readln(n); {если кол-во заранее не известно, - запрашиваем его}
    for i := 1 to n do begin
       write('a[', i, ']=');
       read(a[i]);
       ...
    end;
    ...

    ввод массива с клавиатуры
    ✍ Пример результата:

    введите кол-во элементов: 
    3
    a[1]=5
    a[2]=7
    a[3]=4
    

    Вывод элементов массива

    Пример: Рассмотрим, как вывести массив в Паскале:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var
      a: array[1..5] of integer; {массив из пяти элементов}
      i: integer;
    begin
    a[1]:=2;
    a[2]:=4;
    a[3]:=8;
    a[4]:=6;
    a[5]:=3;
    writeln('Массив A:');
    for i := 1 to 5 do
        write(a[i]:2); {вывод элементов массива}
    end.

    ✍ Пример результата:

    Для работы с массивами чаще всего используется в Паскале цикл for с параметром, так как обычно известно, сколько элементов в массиве, и можно использовать счетчик цикла в качестве индексов элементов.

    Задача Array 0. Необходимо задать вещественный массив размерностью 6 (т.е. из шести элементов); заполнить массив вводимыми значениями и вывести элементы на экран. Использовать два цикла: первый — для ввода элементов, второй — для вывода.

    Пример результата:

    введите элемент массива: 3.0
    введите элемент массива: 0.8
    введите элемент массива: 0.56
    введите элемент массива: 4.3
    введите элемент массива: 23.8
    введите элемент массива: 0.7
    Массив =  3, 0.8, 0.56, 4.3, 23.8, 0.7

    [Название файла: taskArray0.pas]

    В данном примере работы с одномерным массивом есть явное неудобство: присваивание значений элементам.

    Обработка массивов в Паскале, так же как и заполнение массива, происходит обычно с использованием цикла for.

    Динамические массивы (pascalAbc.Net)

    Основным недостатком статических массивов является то, что их размер нельзя задать с учетом текущих обрабатываемых данных. Приходится описывать массивы с максимально возможным значением количества элементов, выделяя для них столько памяти, сколько может потребоваться для хранения самой большого из возможных наборов исходных данных.

  • Основной особенностью динамических массивов является возможность выделения для них памяти на любом этапе выполнения программы.
  • Имеется возможность корректировки размера динамического массива как в сторону его уменьшения, так и в сторону увеличения.
  • Объявление:

    var a: array of integer;
    var n:=readInteger;
    a:=new integer[n]; // инициализация, выделение памяти для элементов массива

    или:

    var a: array of integer;
    var n:=readInteger;
    SetLength(a,n); // устанавливаем размер

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

    procedure p(a: array of integer);

    Созданные элементы сразу получают начальное значение, равное нулевому значению соответствующего типа: для чисел это целый или вещественный нуль, для символов — символ с кодом 0, для строк и других ссылочных типов данных — нулевая ссылка nil

    Объявление и инициализация массива:

    Пример:

    begin
      var a: array of integer;
      a := new integer[3];
      a[0] := 5;
      a[1] := 2;
      a[2] := 3;
    end.

    или в одну строку:

    begin
      var a: array of integer;
      a := new integer[3](5,2,3);
      print(a)
    end.

    или короткая запись:

    var a:=Arr(1,2,3);// по правой части - integer

    Элементы динамического массива всегда индексируются от 0.

    Ввод элементов:

    Пример:

    var a:=ReadArrInteger(5); // ввод пяти целых
    var a:=ReadArrReal(5); // ввод пяти вещественных

    Функции генерации массивов:

    1. ArrFill :

    var a := ArrFill(10, 1); // массив из 10 целых чисел, равных 1

    2. ArrGen :

    var a := ArrGen(ReadInteger, 1, e -> e + 2); // массив, состоящий из n первых положительных нечетных чисел
    a.Print;

    Проход по элементам массива:

    Пример:

    for var i:=0 to a.Length-1 do
      a[i] += 1;

    или:

    for var i := 0 to a.High do
      a[i] += 1;

    Проход по элементам (только для чтения):
    Пример:

    foreach var x in a do
      Print(x)
  • Размер динамического массива (т. е. количество его элементов) можно определить с помощью его свойства Length
  • Для динамического массива определены еще два свойства: Low и High, определяющие соответственно нижнюю и верхнюю границу диапазона изменения индекса. Свойство a.Low всегда возвращает 0, а свойство a.High определяется как a.High = a.Length – 1
  • Простой вывод элементов:

    Writeln(a); // пример вывода: [1,5,3,13,20]

    или метод массива Print:

    a.Print; // пример вывода: 1 5 3 13 20
    a.PrintLines; // каждый элемент с новой строки

    Функция Random в Pascal

    Для того чтобы постоянно не запрашивать значения элементов массива используется генератор случайных чисел в Паскаль, который реализуется функцией Random. На самом деле генерируются псевдослучайные числа, но суть не в этом.

    Для генерации чисел от 0 до n (не включая само значение n, целые числа в интервале [0,N)) используется запись random (n).
    Перед использованием функции необходимо инициализировать датчик случайных чисел с помощью процедуры randomize.

    Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:

    Пример: Заполнение массива случайными числами в Pascal:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var f: array[1..10] of integer;
        i:integer;
    begin
    randomize;
    for i:=1 to 10 do
      begin
       f[i]:=random(10); { интервал [0,9] }   
       write(f[i],' ');
      end;
    end.

    ✍ Пример результата: 

    Для вещественных чисел в интервале [0,1):

    var x: real;
    ...
    x := random(0.0,1.0);;         { интервал [0,1), т.е. единица не включена }

    PascalABC.NET:

  • Сгенерированный случайным образом кортеж из двух (Random2), либо из трех (Random3) элементов:
  • var (a, b, c) := Random3(10.0, 20.0); // диапазон [10, 20)
    write(a:0:2,' ',b:0:2,' ', c:0:2) // 14.73 18.63 19.72
  • Массив из 10 сгенерированных случайным образом целых чисел в диапазоне [0;99]:
  • Пример:

    var a:=arrRandomInteger(10);

    или с дополнительными параметрами (диапазон [5;15]):

    var a:=arrRandomInteger(10,5,15);

    Задача Array 1. Необходимо задать массив размерностью 5, заполнить массив случайными числами в интервале [-1,1] и вывести элементы на экран: определить три позиции для вывода каждого элемента, с двумя знаками после запятой.

    Пример результата:

    Массив =  0.22 0.00 -0.69 -0.35 -0.11 

    [Название файла: taskArray1.pas]

    Числа Фибоначчи в Паскале

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

    Пример: Ряд чисел Фибоначчи: 1 1 2 3 5 8 13…

    f[0]:=1;   
    f[1]:=1; 
    f[2]:=2;

    или

    f[2]:=f[0]+f[1];
    f[3]:=f[1]+f[2];

    или

    Получили формулу элементов ряда.

    Пример: Вычислить и распечатать первые 20 чисел Фибоначчи.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var i:integer;
    f:array[0..19]of integer;
    begin
    f[0]:=1;
    f[1]:=1;
    for i:=2 to 19 do
    begin
      f[i]:=f[i-1]+f[i-2];
      writeln(f[i])
    end;
    end.

    На данном примере, становится понятен принцип работы с числовыми рядами. Обычно, для вывода числового ряда находится формула определения каждого элемента данного ряда. Так, в случае с числами Фибоначчи, эта формула-правило выглядит как f[i]:=f[i-1]+f[i-2]. Поэтому ее необходимо использовать в цикле for при формировании элементов массива.

    Задача Array 2. Дан ряд из 10 произвольных чисел: a[1], a[2], ... , a[10] (использовать функцию random()). Подсчитать и напечатать суммы троек стоящих рядом чисел: a[1]+a[2]+a[3], a[2]+a[3]+a[4], a[3]+a[4]+a[5], …… , a[8]+a[9]+a[10]

    Пример результата:

    Массив =  2 0 4 29 3 11 26 11 9 4 
    mas[1] + mas[2] + mas[3] = 6
    mas[2] + mas[3] + mas[4] = 33
    mas[3] + mas[4] + mas[5] = 36
    mas[4] + mas[5] + mas[6] = 43
    mas[5] + mas[6] + mas[7] = 40
    mas[6] + mas[7] + mas[8] = 48
    mas[7] + mas[8] + mas[9] = 46
    mas[8] + mas[9] + mas[10] = 24

    [Название файла: taskArray2.pas]

    Задача Array 3. Написать программу решения задачи о печати ряда чисел 2 4 8 16 32 ... 512; для заполнения массива использовать цикл Repeat
    [Название файла: taskArray3.pas]

    Максимальный (минимальный) элемент массива

    Псевдокод:
    Максимальный (минимальный) элемент массива

    Поиск максимального элемента по его индексу:
    максимальный элемент по номеру


    PascalABC.NET:

    Минимальный элемент и его индекс:

    Решение 1:

      // …
      var (min, minind) := (a[0], 0);  
      for var i:=1 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 2:

      // …
      var (min, minind) := (real.MaxValue, 0);  
      for var i:=0 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 3:

    begin
      var a := new integer[5];
      a := arrRandomInteger(5); // [86,37,41,45,76] 
      print(a.Min,a.IndexMin); // 37  1
    end.

    Задача Array_min: Найдите минимальный элемент массива. Выведите элемент и его индекс.

    Пример результата:

    9 5 4 22 23 7 3 16 16 8 
    Минимальный элемент массива A[7]=3
    

    [Название файла: taskArray_min.pas]

    Задача Array 4. Дан массив из 10 целочисленных элементов. Найти количество отрицательных и вывести количество на экран.

    Пример результата:

    3 4 6 -1 6 -2 1 5 0 1 
    Количество отрицательных элементов: 2
    

    [Название файла: taskArray4.pas]

    Задача Array 5. Найти минимальное и максимальное из n введенных чисел (массива). Определить расстояние между этими элементами.

    3  2  6  1  3  4  7  2  >>>  min=1, max=7, distance=3
    

    [Название файла: taskArray5.pas]

    Задача Array 6. Дан целочисленный массив размера N. Вывести все содержащиеся в данном массиве четные числа в порядке убывания их индексов, а также их количество K.

    N=4
    mas: 8 9 2 5
    >>> 2 8 количество= 2
    

    [Название файла: taskArray6.pas]

    Задача Array 7. Ввести с клавиатуры массив из 5 элементов, найти в нем два максимальных элемента и их номера.

    Пример:

    Исходный массив:
    4   -5   10  -10  5
    максимальные A[3]=10, A[5]=5
    

    [Название файла: taskArray7.pas]

    Поиск в массиве

    Рассмотрим сложный пример работы с одномерными массивами:

    Пример: Дан массив из 10 чисел. Определить, есть ли в массиве число, введенное пользователем. Если есть – выводить «найдено», если нет – «не найдено».
    Сложность задания заключается в том, что выводить слова «найдено» или «не найдено» необходимо один раз.

    Для решения поставленной задачи понадобится оператор break — выход из цикла.
    Решение Вариант 1. Цикл for:


    PascalABC.NET:

    Cтандартные методы a.IndexOf(x) и a.LastIndexOf(x):

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.IndexOf(3)) // 1
    end.

    или метод a.Contains(x) наравне с x in a:

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.Contains(3)); // True
      print(3 in a)// True
    end.

    Рассмотрим эффективное решение:

    Задача: найти в массиве элемент, равный X, или установить, что его нет.

    Алгоритм:

    • начать с 1-го элемента (i:=1);
    • если очередной элемент (A[i]) равен X, то закончить поиск иначе перейти к следующему элементу.

    решение на Паскале Вариант 2. Цикл While:

    Поиск элемента в массиве

    Поиск элемента в массиве

    Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):

    Задача Array 8. Заполнить массив из 10 элементов случайными числами в интервале [0..4] и вывести номера всех элементов, равных X.

    Пример:

    	 Исходный массив:
    	 4  0  1  2  0  1  3  4  1  0
    	 Что ищем? 0
    	 A[2], A[5], A[10]
    

    [Название файла: taskArray8.pas]

    Циклический сдвиг

    Пример: сдвинуть элементы массива влево на 1 позицию, первый элемент становится на место последнего.
    циклический сдвиг

    Решение:

    Алгоритм:
    A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];

    Программа:
    сдвиг элементов массива


    PascalABC.NET:

    Циклический сдвиг влево:

      // …
      var v := a[0];
      for var i:=0 to a.Length-2 do
        a[i] := a[i+1];
      a[a.Length-1] := v;

    Циклический сдвиг вправо:

      // …
      var v := a[a.Length-1];
      for var i:=a.Length-1 downto 1 do
        a[i] := a[i-1];
      a[0] := v;

    Задача Array 9. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и выполнить циклический сдвиг влево без первого элемента.
    Пример:

    Исходный массив:
      4  -5   3  10  -4  -6   8 -10  1  0
    Результат:
      4   3  10  -4  -6   8 -10   1  0 -5
    

    [Название файла: taskArray9.pas]

    Перестановка элементов в массиве

    Рассмотрим, как происходит перестановка или реверс массива.

    Пример: переставить элементы массива в обратном порядке
    реверс массива

    Решение:

    Алгоритм:
    алгоритм перестановки элементов массива

    Псевдокод:
    2

    Программа:
    перестановка элементов массива


    PascalABC.NET:

    Перестановка (ревёрс):

    Решение 1:

    begin
    var a: array of integer := (1,3,5,7); 
    var n := a.Length;
    for var i:=0 to n div 2 - 1 do
        Swap(a[i],a[n-i-1]);
    End.

    Решение 2 (стандартная процедура Reverse()):

    begin
    var a:=new integer[10];
    a:=arrRandomInteger(10);
    print(a);// [41,81,84,63,12,26,88,25,36,72] 
    Reverse(a);
    print(a) //[72,36,25,88,26,12,63,84,81,41] 
    end.

    Задача Array 10. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и сделать реверс всех элементов, кроме последнего.
    Пример:

     Исходный массив:
    -5  3   10  -4  -6   8 -10  1   0  4
     Результат:
    0  1  -10   8  -6  -4  10  3  -5  4
    

    [Название файла: taskArray10.pas]

    Выбор элементов и сохранение в другой массив

    Пример: найти в массиве элементы, удовлетворяющие некоторому условию (например, отрицательные), и скопировать их в другой массив
    выбор элементов массива

    Решение:

    Решение: подсчитывать количество найденных элементов с помощью счетчика count, очередной элемент устанавливать на место B[count]. Переменой count необходимо присвоить 1.

    сохранение элементов массива в другой
    Вывод массива B:

    writeln('Выбранные элементы');
    for i:=1 to count-1 do
       write(B[i], ' ')

    PascalABC.NET:

    Процедура SetLength():

    // ...
    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);

    Задача Array 11. Заполнить массив случайными числами в интервале [20,100] и записать в другой массив все числа, которые оканчиваются на 0.
    Пример:

    	 Исходный массив:
    	 40   57   30  71  84
    	 Заканчиваются на 0:
    	 40 30
    

    [Название файла: taskArray11.pas]

    Сортировка элементов массива

    Сортировка методом «Пузырька»

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

    сортировка методом пузырька

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    
    for i:=1 to N-1 do begin
       for j:=N-1 downto i do
         if A[j] > A[j+1] then begin
           с := A[j];
           A[j] := A[j+1];
           A[j+1] := с;
         end;
     end;
    1
    2
    3
    4
    
    for var i := 0 to arr.High - 1 do
        for var j := arr.High - 1 downto i do
          if arr[j] > arr[j + 1] then 
            Swap(arr[j], arr[j + 1]);

    Задача Array 12. Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать первую половину массива по возрастанию, а вторую – по убыванию (методом ‘Пузырька’).

    Пример:
    Исходный массив:
    14  25  13  30  76  58  32  11  41  97
    Результат:
    13  14  25  30  76  97  58  41  32  11

    [Название файла: taskArray12.pas]

    Сортировка методом выбора

    • в массиве ищется минимальный элемент и ставится на первое место (меняется местами с A[1]);
    • среди оставшихся элементов также производится поиск минимального, который ставится на второе место (меняется местами с A[2]) и т.д.

    сортировка методом вставки

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    for i := 1 to N-1 do begin
      min:= i ;
      for j:= i+1 to N do
        if A[j] < A[min] then min:=j; 
      if min <> i then begin
        c:=A[i]; 
        A[i]:=A[min]; 
        A[min]:=c;
      end;
    end;
    1
    2
    3
    4
    5
    6
    7
    8
    
    for var i := 0 to a.High-1 do
      begin
        var (min,imin) := (a[i],i);
        for var j := i + 1 to a.High do
          if a[j] < min then
            (min,imin) := (a[j],j);
        Swap(a[imin],a[i]);
      end;

    Задача Array 13: Заполнить массив из 10 элементов случайными числами в интервале [0..50] и отсортировать его по возрастанию суммы цифр

    Пример:
    Исходный массив:
    14  25  13  12  76  58  21  87  10  98
    Результат:
    10  21  12  13  14  25  76  58  87  98  
    

    [Название файла: taskArray13.pas]


    PascalABC.NET:

    Стандартная процедура sort():

    Sort(a);
    SortByDescending(a);

    Быстрая сортировка или quick sort

    Алгоритм:

    1. Выбирается и запоминается средний элемент массива (присвоим X):
    2. быстрая сортировка

    3. Инициализируем две переменные (будущие индексы массива): L:=1, R:=N (N — количество элементов).
    4. Увеличиваем L и ищем первый элемент A[L], который больше либо равен X (в итоге он должен находиться справа).
    5. Уменьшаем R и ищем элемент A[R], который меньше либо равен X (в итоге он должен находиться слева).
    6. Смотрим, если L<=R, то меняем местами A[L] и A[R], возвращаемся к пункту 3.

    быстрая сортировка паскаль

    Выполнение на Паскале:
    1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    procedure QSort ( first, last: integer);
    var L, R, c, X: integer;
    begin
      if first < last then begin
        X:= A[(first + last) div 2];
        L:= first; R:= last;
     while L <= R do begin
       while A[L] < X do L:= L + 1;
       while A[R] > X do R:= R - 1;
       if L <= R then begin
         c:= A[L]; A[L]:= A[R]; A[R]:= c;
         L:= L + 1; R:= R - 1;
       end;
     end;
      QSort(first, R);   QSort(L, last);
      end;
    end.

    Задача Array 14:
    Заполнить массив из 10 элементов случайными числами в интервале [-50..50] и отсортировать его с помощью алгоритма быстрой сортировки.

    [Название файла: taskArray14.pas]

    Ввод и вывод

    const Sz = 100; // Размер массива
    
    var 
      a: array [1..Sz] of integer;
      N: integer; // Количество элементов в массиве
      i: integer;
      
    begin
      write('Введите количество элементов в массиве: ');
      readln(N);
      write('Введите элементы массива: ');
      for i:=1 to N do
        read(a[i]);
      write('Вывод элементов массива: ');
      for i:=1 to N do
        write(a[i],' ');
    end.
    

    Заполнение случайными числами

    const Sz = 100; // Размер массива
    
    var 
      a: array [1..Sz] of integer;
      N: integer; // Количество элементов в массиве
      i: integer;
      
    begin
      N := 20;
      for i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива: ');
      for i:=1 to N do
        write(a[i],' ');
    end.
    

    Заполнение арифметической прогрессией

    const 
      Sz = 100;
      a0 = 5; // Первый элемент арифметической прогрессии
      d = 3;  // Разность арифметической прогрессии
    
    var 
      a: array [1..Sz] of integer;
      N: integer; // Количество элементов в массиве
      
    begin
      N := 20;
      a[1] := a0;
      for var i:=2 to N do
        a[i] := a[i-1] + d;
      writeln('Арифметическая прогрессия: ');
      for var i:=1 to N do
        write(a[i],' ');
    end.
    

    Заполнение степенями двойки

    const 
      Sz = 100;
    var 
      a: array [1..Sz] of integer;
      N: integer;   
    begin
      N := 20;
      a[1] := 2;
      for var i:=2 to N do
        a[i] := a[i-1] * 2;
      writeln('Степени двойки: ');
      for var i:=1 to N do
        writeln(i:3,a[i]:9);
    end.
    

    Заполнение числами Фибоначчи

    const 
      Sz = 100;
    var 
      a: array [1..Sz] of integer;
      N: integer;   
    begin
      N := 20;
      a[1] := 1; 
      a[2] := 1;
      for var i:=3 to N do
        a[i] := a[i-2] + a[i-1];
      writeln('Числа Фибоначчи: ');
      for var i:=1 to N do
        write(a[i],' ');
    end.
    

    Инвертирование массива

    const 
      Sz = 100;
    var 
      a: array [1..Sz] of integer;
      N: integer;   
    begin
      N := 20;
      for var i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
        
      for var i:=1 to N div 2 do
        Swap(a[i],a[N-i+1]);
        
      writeln('После инвертирования: ');
      for var i:=1 to N do
        write(a[i],' ');
    end.
    

    Минимальный элемент в массиве и его индекс

    const 
      Sz = 100;
    var 
      a: array [1..Sz] of real;
      N: integer;   
      min: real;
      minind: integer;
    begin
      N := 20;
      for var i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
      
      min := a[1];
      minind := 1;
      for var i:=2 to N do
        if a[i]<min then 
        begin
          min := a[i];
          minind := i;
        end;
        
      writeln('Минимальный элемент: ',min);
      writeln('Индекс минимального элемента: ',minind);
    end.
    

    Минимальный четный элемент и его индекс

    const 
      Sz = 100;
    var 
      a: array [1..Sz] of integer;
      N: integer;   
      min: integer;
      minind: integer;
    begin
      N := 20;
      for var i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
      
      min := integer.MaxValue;
      for var i:=1 to N do
        if (a[i]<min) and (a[i] mod 2 = 0) then 
        begin
          min := a[i];
          minind := i;
        end;
        
      if min = integer.MaxValue then
        writeln('Четных элементов нет')
      else  
      begin
        writeln('Минимальный четный элемент: ',min);
        writeln('Индекс минимального четного элемента: ',minind);
      end;
    end.
    

    Запись четных элементов массива в новый массив

    const 
      Sz = 100;
    var 
      a,b: array [1..Sz] of integer;
      aN: integer; // Количество элементов в массиве a  
      bN: integer; // Количество элементов в массиве b  
    begin
      aN := 20;
      for var i:=1 to aN do
        a[i] := Random(100);
      writeln('Элементы массива: ');
      for var i:=1 to aN do
        write(a[i],' ');
      writeln;  
      
      bN := 0;
      for var i:=1 to aN do
        if a[i] mod 2 = 0 then 
        begin
          bN += 1;
          b[bN] := a[i];
        end;
        
      writeln('Четные элементы массива: ');
      for var i:=1 to bN do
        write(b[i],' ');
    end.
    

    Слияние отсортированных массивов в отсортированный

    Способ 1.

    const 
      aN = 10;      // Количество элементов в массиве a 
      bN = 6;       // Количество элементов в массиве b 
      cN = aN + bN; // Количество элементов в массиве c 
    
    var 
      a: array [1..aN] of integer := (1,5,12,15,47,89,98,112,171,180);
      b: array [1..bN] of integer := (13,44,58,71,73,111);
      c: array [1..сN] of integer;
      ai,bi,ci: integer;
    begin
      writeln('Элементы массива a: ');
      for var i:=1 to aN do
        write(a[i],' ');
      writeln;  
      writeln('Элементы массива b: ');
      for var i:=1 to bN do
        write(b[i],' ');
      writeln;  
      
      ci := 1;
      ai := 1;
      bi := 1;
      
      while (ai<=aN) and (bi<=bN) do
      begin
        if a[ai]<b[bi] then
        begin
          c[ci] := a[ai];
          ai += 1;
        end
        else 
        begin
          c[ci] := b[bi];
          bi += 1;
        end;
        ci += 1;
      end;
      while ai<=aN do
      begin
        c[ci] := a[ai];
        ai += 1;
        ci += 1;
      end;
      while bi<=bN do
      begin
        c[ci] := b[bi];
        bi += 1;
        ci += 1;
      end;
        
      writeln('Результат слияния: ');
      for var i:=1 to cN do
        write(c[i],' ');
    end.
    

    Способ 2. С барьерным элементом

    const 
      aN = 10;      // Количество элементов в массиве a 
      bN = 6;       // Количество элементов в массиве b 
      cN = aN + bN; // Количество элементов в массиве c 
    
    var 
      a: array [1..aN+1] of integer := (1,5,12,15,47,89,98,112,171,180,0); // последний элемент - барьерный
      b: array [1..bN+1] of integer := (13,44,58,71,73,111,0);
      c: array [1..cN] of integer;
      ai,bi,ci: integer;
    begin
      writeln('Элементы массива a: ');
      for var i:=1 to aN do
        write(a[i],' ');
      writeln;  
      writeln('Элементы массива b: ');
      for var i:=1 to bN do
        write(b[i],' ');
      writeln;  
    
      a[aN+1] := integer.MaxValue; // барьерный элемент - самый большой
      b[bN+1] := integer.MaxValue;
      
      ci := 1;
      ai := 1;
      bi := 1;
      
      for ci:=1 to cN do
        if a[ai]<b[bi] then
        begin
          c[ci] := a[ai];
          ai += 1;
        end
        else 
        begin
          c[ci] := b[bi];
          bi += 1;
        end;
        
      writeln('Результат слияния: ');
      for var i:=1 to cN do
        write(c[i],' ');
    end.
    

    Сдвиг элементов влево

    const N = 10;
    
    var a: array [1..N] of integer;
    
    begin
      for var i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива a: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    
      for var i:=1 to N-1 do
        a[i] := a[i+1];
      a[N] := 0;
      
      writeln('После сдвига влево: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    end.
    

    Сдвиг элементов вправо

    const N = 10;
    
    var a: array [1..N] of integer;
    
    begin
      for var i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива a: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    
      for var i:=N downto 2 do
        a[i] := a[i-1];
      a[1] := 0;
      
      writeln('После сдвига влево: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    end.
    

    Удаление элемента

    const N = 10;
    
    var 
      a: array [1..N] of integer;
      K: integer;
    
    begin
      for var i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива a: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    
      K := Random(1,N);
    
      for var i:=K to N-1 do
        a[i] := a[i+1];
      
      writeln('После удаления элемента с индексом ',K,':');
      for var i:=1 to N-1 do
        write(a[i],' ');
      writeln;  
    end.
    

    Вставка элемента

    const 
      N = 10;
      Elem = 666;
    
    var 
      a: array [1..N+1] of integer;
      K: integer;
    
    begin
      for var i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива a: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    
      K := Random(1,N);
    
      for var i:=N downto K do
        a[i+1] := a[i];
      a[K] := 666;  
      
      writeln('После вставки элемента ',Elem,' в позицию ',K,':');
      for var i:=1 to N+1 do
        write(a[i],' ');
      writeln;  
    end.
    

    Подсчет количества элементов, удовлетворяющих условию

    const N = 20;
    
    var 
      a: array [1..N] of integer;
      K,Count: integer;
    
    begin
      for var i:=1 to N do
        a[i] := Random(10);
      writeln('Элементы массива a: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    
      K := Random(10);
    
      Count := 0;
      for var i:=1 to N do
        if a[i] = K then 
          Count += 1;
      
      writeln('Количество элементов, равных ',K,': ',Count);  
    end.
    

    Есть ли элемент, удовлетворяющий условию

    const N = 10;
    
    var 
      a: array [1..N] of integer;
      K: integer;
      IsFound: boolean;
    
    begin
      for var i:=1 to N do
        a[i] := Random(15);
      writeln('Элементы массива a: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    
      K := Random(15);
    
      IsFound := False;
      for var i:=1 to N do
        if a[i] = K then 
        begin
          IsFound := True;
          break
        end;
      
      if IsFound then
        writeln('Элемент ',K,' найден')
      else writeln('Элемент ',K,' не найден')  
    end.
    

    Сортировка пузырьком

    const N = 10;
    
    var 
      a: array [1..N] of integer;
    
    begin
      for var i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива a: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    
      for var i:=n downto 2 do
      for var j:=1 to i-1 do
        if a[j+1]<a[j] then
          Swap(a[j+1],a[j]);
      
      writeln('После сортировки пузырьком: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    end.
    

    Сортировка выбором

    const N = 10;
    
    var 
      a: array [1..N] of integer;
      K: integer;
      IsFound: boolean;
    
    begin
      for var i:=1 to N do
        a[i] := Random(100);
      writeln('Элементы массива a: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    
      for var i:=1 to N-1 do
      begin
        var min := a[i]; 
        var ind := i;
        for var j:=i+1 to N do
          if a[j]<min then
          begin
            min := a[j];
            ind := j;
          end;
        a[ind] := a[i];
        a[i] := min;
      end;
    
      writeln('После сортировки выбором: ');
      for var i:=1 to N do
        write(a[i],' ');
      writeln;  
    end.
    

    Ссылки

    • Программы для начинающих
    • Сайт PascalABC.NET: Программы и алгоритмы для начинающих
    title keywords last_updated sidebar permalink toc folder

    Массивы в PascalABC.NET

    styles

    19.12.2020

    mydoc_sidebar

    school_arrays.html

    true

    mydoc

    В PascalABC.NET рекомендуется использовать динамические массивы. В отличие от статических, они имеют огромное количество методов и операций, просты в создании, заполнении и выводе.

    Описание и выделение памяти

    Динамический массив описывается так:

    begin
      var a: array of integer;
    end.

    Память под динамический массив a выделяется в момент работы программы:

    begin
      var a: array of integer;
      var n := ReadInteger;
      a := new integer[n];
    end.

    Здесь — первое преимущество динамических массивов — в переменной a может храниться массив любого размера, память выделяется в процессе работы программы. Кроме того, выделенная память гарантированно автоматически заполняется нулевыми значениями.

    Можно совместить описание и выделение памяти — тип динамического массива выводится автоматически:

    begin
      var n := ReadInteger;
      var a := new integer[n];
    end.

    Обычно в PascalABC.NET совмещают описание динамического массива, выделение памяти и заполнение значениями. Самый простой способ — заполнить n нулями:

    begin
      var n := ReadInteger;
      var a := |0| * n;
    end.

    Индексация в динамических массивах и использование статических массивов

    Динамические массивы индексируются с нуля — это эффективно. В качестве индексов в динамических массивах могут выступать только целые.

    Статические массивы тем не менее иногда удобно использовать — в задачах, где индексы либо символьные, либо по-существу начинаются не с нуля. Например, для подсчёта количества слов на каждую букву может использоваться стаический массив

      var a := array ['a'..'z'] of integer;

    Заполнение статических массивов — увы — производится в цикле. Кроме того, они не помнят свою длину и передача таких массивов в качестве параметров подпрограмм связана с техническими сложностями 40-летней давности, не нужными начинающим.

    Простейшее заполнение

    Важную роль играют функции заполнения динамических массивов. Перед заполнением они выделяют для массива память, поэтому в одной строке можно совмещать описание, выделение памяти и заполнение.

    Простейшее заполнение — набором значений:

    Заполнение диапазоном целых или символьных значений делается с использованием функции Arr:

    var a := Arr(1..9);
    var b := Arr('a'..'z');

    Заполнение определённым значением осуществляется с помощью операции умножения массива на число:

    begin
      var n := ReadInteger;
      var a := |0| * n; // массив из n нулей
    end.

    Для заполнения можно также использовать функцию ArrFill:

    begin
      var n := ReadInteger;
      var a := ArrFill(n,0); // массив из n нулей
    end.

    Для заполнения массива случайными значениями следует использовать

    begin
      var n := ReadInteger;
      var a := ArrRandomInteger(n); // по умолчанию значения от 0 до 100
      var a1 := ArrRandomInteger(n,1,10); // случайные от 1 до 10
      var r := ArrRandomReal(n); // по умолчанию значения от 0 до 10
      var r1 := ArrRandomReal(n,2,5); // случайные вещественные от 2 до 5
    end.

    Не рекомендуется использовать алгоритм для заполнения массива случайными в каждой задаче:

    begin
      var n := ReadInteger;
      var a := new integer[n];
      for var i:=0 to n-1 do
        a[i] := Random(0,100);
    end.

    Повторять этот текст в каждой задаче — странно. Для этого есть стандартные функции.

    Ввод и вывод элементов массива

    Для ввода элементов массива базовых типов используются функции

    begin
      var n := ReadInteger;
      var a := ReadArrInteger(n);
      var r := ReadArrReal(n);
      var s := ReadArrString(n);
      // ...
    end.

    Стандартная процедура вывода Write или Print выводит значения в массиве в квадратных скобках черезх запятую:

    begin
      var a := Arr(1..9);
      Print(a); // [1,2,3,4,5,6,7,8,9]
    end.

    Однако лучше всего для вывода воспользоваться методом Print, выводящим все значения в массиве через пробел:

    begin
      var a := Arr(1..9);
      a.Print; // 1 2 3 4 5 6 7 8 9 
    end.

    Не рекомендуется вводить и выводить элементы массива в цикле

    begin
      var n := ReadInteger;
      var a := new integer[n];
      for var i:=0 to n-1 do
        a[i] := ReadInteger;
    end.

    Повторять этот текст в каждой задаче — странно. Для этого есть стандартные функции.

    Циклы по массиву

    Для обработки элементов массива используются следующие циклы:

    1. Цикл for по индексам (если требуется менять элементв или нужна информация об индексах)
    for var i:=0 to a.Length-1 do
      a[i] *= 2;
    1. Цикл foreach по элементам (если индексы не видны и мы не меняем массив)
    var sum := 0;
    foreach var x in a do
      sum += x;
    1. Цикл foreach по индексам
    foreach var i in a.Indices do
      a[i] += 2;
    1. Цикл foreach по диапазону индексов
    var (K,L) := ReadInteger2;
    foreach var i in K..L do
      a[i] := 777;

    Пример. Найти количество чётных элементов, стоящих на чётных местах

    begin
      var a := ArrRandomInteger(10);
      a.Println; 
      var count := 0;
      foreach var i in a.Indices do
        if i.IsEven and a[i].IsEven then
          count += 1;
      Print(count);    
    end.

    Методы массива

    Массивы содержат большое количество стандартных методов:

    a.Length - длина массива
    a.Min - минимальный элемент в массиве
    a.Max - максимальный элемент в массиве
    a.IndexMin - индекс первого минимального элемента в массиве
    a.IndexMax - индекс первого максимального элемента в массиве
    a.Sum - сумма элементов в числовом массиве
    a.Product - произведение элементов в числовом массиве
    a.Average - среднее элементов в числовом массиве
    a.First - первый элемент в массиве
    a.Last - последний элемент в массиве
    a.IndexOf(x) - индекс первого значения x или -1 если не найдено
    a.Replace(x,y) - заменить в массиве все значения x на y

    Кроме того, доступны процедуры

    Sort(a) - сортировка элементов по возрастанию
    SortDescending(a) - сортировка элементов по убыванию
    Reverse(a) - инвертирование элементов массива

    Методика. Обращаем внимание, что в методических целях естественно рассказывать, как эти алгоритмы устроены «внутри».
    Но потом следует пользоваться стандартными алгоритмами, а не заставлять учеников во всех задачах использовать рукописные сортировки или рукописный поиск минимума. Например, рекомендуется показать, как накопить сумму элементов массива:

    begin
      var a := ArrRandomInteger(10);
      a.Println; 
      var sum := 0;
      foreach var x in a do
        sum += x;
      Print(sum);    
    end.

    Здесь следует обратить внимание, что этот алгоритм может быть легко модифицирован в алгоритм нахождения суммы элементов по условию: например, всех чётных элементов:

    begin
      var a := ArrRandomInteger(10);
      a.Println; 
      var sum := 0;
      foreach var x in a do
        if x.IsEven then
          sum += x;
      Print(sum);    
    end.

    Отметим, что заполнение случайными и вывод — это технические части программы, которые делаются в PascalABC.NET в одну строку, позволяя концентрироваться на алгоритме.

    Если условие надо накладывать на индексы, то в этом случае (и только в этом случае) следует использовать цикл for по индексам:

    begin
      var a := ArrRandomInteger(10);
      a.Println; 
      var sum := 0;
      for var i:=0 to a.Length-1 do
        if i.IsEven then
          sum += a[i];
      Print(sum);    
    end.

    Для нахождения суммы без условия необходимо использовать стандартный метод a.Sum:

    begin
      var a := ArrRandomInteger(10);
      a.Println; 
      Print(a.Sum);    
    end.

    Отметим также, что для поиска суммы по условию также имеется короткая однострочная запись. Она требует использование стандартного метода Where с параметром, являющимся лямбда-выражением. Лямбда-выражения мы будем рассматривать далее:

    begin
      var a := ArrRandomInteger(10);
      a.Println; 
      Print(a.Where(x -> x.IsEven).Sum);
    end.

    Методика. Поскольку данная запись использована здесь впервые, обращаем внимание на её высокую универсальность: алгоритмы фильтрации и поиска суммы не слиты в один алгоритм, а используются порознь один за другим, что позволяет:

    1. Лучше читать код (потому что он записан компактно и методами с понятными и очевидными названиями)
    2. Лучше модифицировать код
    3. Решать более сложные и более прикладные задачи за одно и то же время урока

    Далее лямбда-выражения объясняются подробно и тщательно и используются повсеместно.

    Операции с массивами

    x in a - возвращает true если значение x содержится в a
    a1 + a2 - возвращает массив, образованный слиянием массивов a1 и a2
    a1 * n - возвращает массив, состоящий из n раз повторенных значений массива a

    Изменение размера динамического массива

    Если в процессе работы программы требуется чтобы динамический массив менял свой размер, то следует … пользоваться типом List!
    Это — динамический массив с возможностью эффективного измненения размера и рядом дополнительных методов. Основным является методы Add — добавить в конец:

    begin
      var l := new List<integer>;
      l.Add(1);
      l.Add(3);
      l.Add(5);
      l.Print
    end.

    Для первоначального заполнения списков List используется короткая фунеция Lst:

    begin
      var l := Lst(1,3,5);
      l.Print
    end.

    При необходимости список List можно преобразовать к динамическому массиву, вызвав метод .ToArray:

    begin
      var l := Lst(1,3,5);
      var a := l.ToArray;
    end.

    Большинство методов, которые имеются в массивах, есть и в списках List. Поэтому выбор типа List или array of для контейнера при решении задач определяется тем, будет ли данный контейнер расширяться по ходу работы программы.

    {% include links.html %}

    Массивом
    называется способ организации однородной информации, при котором облегчается
    доступ к любому элементу информации по его индексу (номеру) и достаточно легко
    производится обработка информации.

    Объявление
    массивов производится в блоке описания следующим образом:

    x:array[1..100] of integer; – массив на 100 элементов для целых
    чисел с индексами от 1 до 100.

    a,b:array[10..29] of string; – два массива по 20 элементов для
    символьных переменных с индексами от 10 до 29.

    Двумерный массив объявляется так:

    y:array[1..10,1..5] of real; – массив размером 10 на 5 для
    вещественных чисел с индексами от 1 до 10 и от 1 до 5.

    Конкретный элемент массива обозначается с помощью ссылки на
    переменную (имя) массива, за которой в квадратных скобках указывается индекс
    данного элемента, например: a[7]

    Строковая
    переменная типа string также может рассматриваться как массив переменных типа
    char, например: b:string[20] Это дает доступ к каждому символу в
    строковой переменной, если значение символа имеет тип Char.

    Конкретный символ в строковой переменной обозначается с помощью
    ссылки на строковую переменную, за которой указывается индекс, определяющий
    позицию символа в строке, например:b[15].

    В программах можно использовать присваивание элементам массива:
    а[5] := 8; числовому, b[3] := ‘Виктор’ строковому

    и выборочную печать элементов:

    write (а[5]);

    writeln (b[3]);

    С массивами удобно работать с помощью циклов:

    — заполнение

    for t := 1 to 20 do

    begin

    write(‘Введите ‘,t,’-й элемент’);

    readln(a[t]);

    end;

    — вывод на печать

    for t := 1 to 20 do

    writeln(t,’-й элемент равен’,a[t]);

    — выбор по условию

    for t := 1 to 20 do

    if a[t]>=3 then writeln(‘У студента ‘,b[t],’ оценка по
    экзамену ‘,a[t]);

    — при использовании двумерных массивов применяются вложенные
    циклы.

    var m,k:integer;

    x:array[1..10,1..5] of string;

    begin

    for m:=1 to 10 do

    for k:=1 to 5 do

    begin

    write(‘Введите фамилию жильца ‘,m,’-го подъезда и ‘,k,’-го
    этажа’);

    readln(x[m,k]);

    end;

    write(‘Полный список жильцов:’);

    for m:=1 to 10 do

    for k:=1 to 5 do

    write(m,’-й подъезд, ‘,k,’-й этаж’,x[m,k])

    end.

    Просмотрите предлагаемые ниже задачи, разберитесь в их работе.
    При необходимости наберите и изучите программы.

    1. Программа «исчезающие звезды».

    В цикле for массивы заполняются случайными числами: x – до 640
    (координата х), y – до 400 (координата y), c – до 1000000 (цвет). В цикле
    repeat последовательно проходятся все элементы массива и по указанным
    координатам сначала окружность (круг) рисуется черным цветом (звезды гаснут), а
    затем по новым случайным координатам и цвету вспыхивают звезды. Процесс
    продолжается до нажатия любой клавиши.

    uses crt, graphabc;

    var a,b,d,e,f:integer;

    x,y,c:array[1..100] of integer; {3 числовых массива по 100
    элементов каждый}

    begin

    floodfill(10,10,clblack); {заливка фона черным}

    for b:=1 to 100 do begin {заполнение массивов}

    x[b]:=random(640);

    y[b]:=random(400);

    c[b]:=random(1000000);

    end;

    repeat

    for b:=1 to 100 do begin

    SetPenColor (clblack); {звезды гаснут}

    circle(x[b],y[b],2);

    floodfill(x[b],y[b],clblack); {заливка звезды черным}

    x[b]:=random(640);

    y[b]:=random(400);

    c[b]:=random(1000000);

    delay(25);

    setpencolor(c[b]); {звезды вспыхивают}

    circle(x[b],y[b],2);

    floodfill(x[b],y[b],c[b]); {заливка звезды}

    end;

    until keypressed

    end.

    2. Cортировка массива. Массив заполняется случайными числами,
    которые затем упорядочиваются и печатаются на экране.

    uses crt;

    var a,b,c,d:integer;

    q:array[1..15] of integer;

    begin

    clrscr;

    writeln(‘исходные случайные числа:’);

    for a:=1 to 15 do

    begin

    q[a]:=random(50);

    write(q[a],’ ‘);

    end;

    writeln;

    for a:=1 to 15 do

    begin

    for b:=1 to 14 do

    begin

    if q[a]>q[b] then { Числа располагаются в порядке убывания }

    begin { смена знака на < расположит числа по возрастанию}

    c:=q[b];

    q[b]:=q[a];

    q[a]:=c;

    end;

    end;

    end;

    writeln;

    writeln(‘отсортированные случайные числа:’);

    for a:=1 to 15 do

    write(q[a],’ ‘);

    end.

    3. Неповторяющиеся случайные числа до 100.

    uses crt;

    var a,b,c,d:integer;

    q:array[1..10] of integer;

    begin

    clrscr;

    a:=1;

    while a<11 do

    begin

    q[a]:=random(100)+1;

    if a>1 then

    for b:=1 to a-1 do

    begin

    if q[a]=q[b] then a:=a-1;

    end;

    a:=a+1;

    end;

    for a:=1 to 10
    do writeln(q[a]);

    end.

    Задачи для
    самостоятельного решения

    1. Описать числовой массив на 5 элементов и заполнить его
      присваиванием любыми числами, распечатать содержимое элементов массива

    а) в столбик

    б) в строку.

        2.Описать числовой
    массив на 5 элементов и заполнить его в цикле с клавиатуры любыми числами,
    распечатать содержимое элементов массива.

    Упражнения.

    Выполните
    задания с Array1 по Array10 по электронному задачнику (стр.49).

    Выполните
    задания с Array51 по Array60 по электронному задачнику (стр.54).

    Выполните
    задания с Array65 по Array69 по электронному задачнику (стр.55).

    Выполните
    задания с Matrix1 по Matrix4, с Matrix7 по Matrix10 по
    электронному задачнику (стр.64).

    Открыть его
    можно в режиме Помощь – Электронный задачник РТ.

    Одномерные массивы

    Сегодня мы с вами наконец-то начинаем новую тему — одномерные массивы.

    Одномерные массивы. Определение.

    Одномерный массив — это фиксированное количество элементов одного и того же типа, объединенных одним именем, где каждый элемент имеет свой номер. Обращение к элементам массива осуществляется с помощью указания имени массива и номеров элементов.

    var 
       a : array [1..N] of integer;
    
    //или
    type 
      arr = array[1..N] of integer;
    
    var
      a: arr;
    

    Между именем типа и именем переменной ставится знак «двоеточие». Array — служебное слово (в переводе с английского означает «массив», «набор»); [1..N] — в квадратных скобках указывается номер первого элемента, затем, после двух точек, номер последнего элемента массива; of — служебное слово (в переводе с английского «из»); integer — тип элементов массива.

    Индексом могут быть не только натуральные числа: мы можем написать так: [0..10], [-29..45], [‘a’..’z’], [false..true] — то есть нам подходят любые символы и числа — главное соблюсти следующее условие: левая часть меньше правой. Для того чтобы определить, что меньше — восклицательный знак(‘!’) или точка(‘.’) используем таблицу ASCII и функции Ord() и Chr().

    Как же производится ввод одномерного массива?

    Для того чтобы ввести или вывести значения элементов такого массива, используем цикл с параметром(или с постусловием, или с предусловием — в общем, любой цикл. ).

    for i := 1 to N do
       read(a[i]); //где a[i] -- элемент одномерного массива a с индексом (порядковым номером) i.

    Как видите, ничего страшного в массивах нет. Массивы применяют в тех случаях, когда нельзя обойтись одной-двумя переменными (примеры таких задач мы рассматривали в решении задач из блока Series). В случаях, когда после ввода последовательности целиком пользователю необходимо обратиться к переменным в середине последовательности, в начале, поменять их значения местами, отсортировать.

    Раз уж мы затронули тему задач из блока Series, давайте решим пару задачек оттуда с помощью массивов, а не тем увечным способом, которым нам приходилось пользоваться.

    Одномерные массивы. Решение задач.

    Series8. Дано целое число N и набор из N целых чисел. Вывести в том же порядке все четные числа из данного набора и количество K таких чисел.

    Исходное решение: Series8.

    Модифицированное решение:

    var
      a: array[1..1000] of integer; {мы не знаем заранее N, поэтому берем с запасом.}
      k, N, i: integer;
    
    begin
      write('N = '); 
      readln(N);  
      write('Введите ', N, ' целых чисел: '); 
      for i := 1 to N do read(a[i]); {заполняем масссив}
      
      {Начинаем выбирать чётные числа}
      write('Чётные числа: ');
      for i := 1 to N do
      begin
        if a[i] mod 2 = 0 then 
        begin
          Inc(k);
          write(a[i], ' ');
        end;
      end;  
      writeln();
      writeln('Количество четных чисел - ', k); 
    end.
    

    Series28.  Дано целое число N и набор из N вещественных чисел: A1, A2, …, AN. Вывести следующие числа:

    (A1)N, (A2)N−1, …, (AN−1)2, AN.

    Исходное решение: Series28.

    Более подробно про возведение числа в степень мы говорили в решении задачи for36.

    Модифицированное решение:

    var
      a: array[1..1000] of integer; 
      N, i, j, n_pow: integer;
      d, r: real;
    
    begin
      write('N = ');
      readln(N);
      write('Введите ', N, ' целых чисел: '); 
      for i := 1 to N do read(a[i]);
      
      {Возводим элементы массива в степень}
      for i := 1 to N do
      begin
        n_pow := N + 1 - i;
        d := a[i];
        if n_pow mod 2 <> 0 then r := d else r := 1; //в r будет записываться результат
        while n_pow > 1 do
        begin
          n_pow := n_pow div 2;
          d := d * d;
          if n_pow mod 2 <> 0 then r := r * d;
        end;
        writeln(a[i], ' в степени ', N + 1 - i, ' равно ', r);
      end;
    end.

    Ну и напоследок давайте разберём веселенькую задачу на длинную арифметику.

    Задача. Найти факториал числа. 

    Мы уже решали эту задачу здесь(for19).

    Научимся вычислять факториал натурального числа N. Факториал числа — это произведение чисел 1*2*3*…*(N-1 )*N (обозначается как N!).  Сложность задачи в том, что уже 8!=40320, а 13!=6227020800. Типы данных Integer, Longlnt применимы весьма в ограниченном диапазоне натуральных чисел. Для представления факториала договоримся использовать массив. Пример:

    A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]
    8 0 0 8 6 1 9 9 3

    В массиве записано значение 11!=39916800. Каким образом? В А[0] фиксируется число занятых элементов массива, в А[1] — цифра единиц результата, в А[2] — цифра десятков результата, в А[3] — цифра сотен результата и т. д. Почему так, а не наоборот? Такая запись позволяет исключить сдвиг элементов массива при переносе значений в старший разряд. А сейчас наберите, как обычно, текст программы, выполните компиляцию и, выполните ее в пошаговом режиме, отслеживая изменение значений переменных при не очень большом значении N. Добейтесь полного понимания логики работы программы.

    Для того чтобы выполнить программу в пошаговом режиме, нажмите «шаг без входа в подпрограмму» и перейдите в «локальные переменные».

    факториал с одномерным массивом

    const 
      MaxN = 300;
    
    var
      A: array [0..MaxN] of integer;
      i, j, r, w, N: integer;
    
    begin
      Write('Введите число, факториал которого необходимо подсчитать: ');
      Read(N);
      A[0] := 1;
      A[1] := 1; 
      j := 2; {Начальные присвоения, начинаем вычислять 2! }
      while (j <= N) and (A[0] < MaxN) Do {Второе условие 
      позволяет избежать выхода из границ диапазона, если 
      количество цифр в факториале превзойдет 300.}
      begin
        r := 0;
        i := 1;
        {r - перенос из разряда в разряд при
        выполнении умножения числа j на очередную цифру
        A[i] предыдущего результата.}
        while (i <= A[0]) or (r <> 0) Do 
        begin
          {Пока не
          «прошли» все цифры предыдущего результата или
          есть перенос цифры в старший разряд}
          w := A[i] * j + r;{Умножаем очередную цифру и
          прибавляем цифру переноса из предыдущего
          разряда}
          A[i] := w mod 10; {Оставляем остаток от деления на 10}
          r := w div 10;{Вычисляем значение переноса}
          if A[A[0] + 1] <> 0 then Inc(A[0]);{Изменяем 
          количество элементов, если их количество увеличилось.}
          Inc(i);
        end;
        Inc(j);
      end;
      write('Факториал: ');
      for i := A[0] downto 1 Do Write(A[i]);{Вывод результата}
    end.
    

    Подведем итоги:

    Одномерный массив — это конечное упорядоченное множество элементов. За первым элементом идет второй, за вторым — третий и т. д. Индекс может быть чем угодно — и целым числом, и символом. Но чаще мы всё-таки будем пользоваться следующим диапазоном:  [1.. N].

    На сегодня все! Если у вас еще остались вопросы о том, как работает программа выше, оставляйте их в комментариях. И очень скоро мы начнем решать задачи на массивы из задачника М. Э. Абрамяна.

    Понравилась статья? Поделить с друзьями:
  • Как исправить неудачную короткую стрижку женщине
  • Наука как найти вторую половину
  • Как найти ниже цены в интернет магазинах
  • Как найти записи эльфийского менестреля
  • Как найти детские штаны