Как составить массив информатика

На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию 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]

    Массивы в Паскале


    Массивы в Паскале

    4.6

    Средняя оценка: 4.6

    Всего получено оценок: 502.

    4.6

    Средняя оценка: 4.6

    Всего получено оценок: 502.

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

    Массивы в Паскале

    Кроме простых типов данных в языке программирования Паскаль есть несколько сложных, одним из которых является регулярный тип. Структура, описываемая таким типом, называется массивом.

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

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

    Рис. 1. Одномерный массив.

    Объявление массива выполняется с помощью ключевого слова ARRAY с указанием размерности массива и типа его элементов.

    Например, массив в разделе описания переменных можно задать так:

    Var Mass: array[1..10] of integer;

    Доступ к элементу в массиве осуществляется через указание индекса. Например, число 10 в массиве Mass имеет порядковый номер 6. Обращаться к конкретной ячейке следует по имени массива, указывая в квадратных скобках номер индекса, например, Mass [6].

    Рис. 2. Двумерный массив.

    Массивы могут быть как одномерными, так и многомерными. Двумерный массив выглядит в виде таблицы, трехмерный массив с виду похож на кубик Рубика.

    Трехмерный массив

    Рис. 3. Трехмерный массив.

    Заполнение массива данными

    Заполнить пустой массив данными можно следующими способами:

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

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

    Заполнение массива Mass (10) случайными числами можно программное реализовать так:

    program Massiv ;
    var i: integer; Mass: array[1..10] of integer;

    randomize;

    begin
    for i:=1 to 10 do Mass [i]:=random(100);

    end.

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

    for i:=1 to 10 do write (Mass [i],` `);

    Как видно из примера, для организации перебора индексов массива, используется циклическая конструкция оператора повтора с заданным числом повторений FOR .. TO.. DO.

    Действия с массивами

    Работа с массивами данных основывается на решении таких типовых задач, как:

    • Определение суммы или произведения элементов массива.
    • Поиск элемента в соответствии с определенным критерием.
    • Сортировка массива.

    Рассмотрим примеры программ обработки массивов

    Определение суммы элементов массива

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

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

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

    program Summa;

    var summ, i: integer; Mass: array[1..10] of integer;

    begin

    s:=0;

    randomize;

    for i:=1 to 10 do Mass[i]:=random(100);

    for i:=1 to 10 do write (Mass[i],` `);

    for i:=1 to 10 do summ:=summ+Mass[i];

    writeln (‘Сумма элементов массива десяти целых чисел равна ‘, summ)

    end.

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

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

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

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

    program Poisk;

    var x, i, k: integer; Mass: array[1..10] of integer;

    begin

    write(‘Введите некоторое целое число k = ‘);

    readln(k);

    randomize;

    for i:=1 to 10 do Mass[i]:=random(100);

    for i:=1 to 10 do write (Mass[i],` `);

    n:=0;

    for i:=1 to 10 do

    if Mass[i]=k then n:=i;

    if n=0 then write(‘В массиве нет числа, равного заданному’) else write (‘Порядковый номер искомого числа равен’,i)

    end.

    Сортировка массива

    Сортировка массива заключается в упорядочении элементов массива по возрастанию или убыванию. Существуют разные способы сортировок элементов массива.

    Самый простой способ при сортировке по возрастанию заключается в поиске наименьшего элемента, который затем меняется местами с элементом первой ячейки. В неотсортированной части снова выбирается наименьший элемент и обменивается с первым неотсортированным. Это выполняется до тех пор, пока все элементы массива не встанут на свои места.

    Заключение

    Что мы узнали?

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

    Тест по теме

    Доска почёта

    Доска почёта

    Чтобы попасть сюда — пройдите тест.

    • Евгений Куклин

      10/10

    • Евгения Малык

      9/10

    • Artem Dubrovin

      7/10

    • Harvey Weber

      10/10

    • Даниэль Усманов

      6/10

    • Кирилл Васильевич

      7/10

    • Татьяна Алексеева

      10/10

    Оценка статьи

    4.6

    Средняя оценка: 4.6

    Всего получено оценок: 502.


    А какая ваша оценка?

    Содержание

    1. Работа с одномерными массивами на языке программирования Паскаль
    2. Одномерный числовой массив
    3. Способы заполнения одномерных массивов
    4. Ручной ввод данных
    5. Заполнение случайными числами
    6. Ввод данных по заданному правилу (формуле)
    7. Ввод данных из текстового файла
    8. Вывод линейного массива
    9. Шаблон для использования в однотипных задачах
    10. Задачи с решением
    11. Простая обработка элементов
    12. Сортировка элементов одномерного массива
    13. Задачи с использованием массива

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

    Массив — самая распространенная структура хранения данных, присутствующая в любом языке программирования.

    В Pascal используются одномерные и двумерные массивы. В школьной программе обычно их изучают в 9-10 классах.

    Одномерный массив — это конечное количество однотипных элементов, объединенных общим именем. Каждому элементу присвоен свой порядковый номер. Обращение к элементам происходит по имени массива и индексу (порядковому номеру).

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

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

    одномерный массив в паскале

    Одномерный массив. Обозначение элементов

    Имя массива формируется по тем же правилам, что и имя любой другой переменной в программе. Границы индексов задают при описании массива в квадратных скобках. Удобнее задавать начальный индекс равный единице. Конечный индекс определяется условием задачи и численно равен размеру массива — количеству элементов. Числовые массивы могут содержать целые и действительные числа. Тип элементов указывается в описании. Смотрите рисунок выше.

    Способы заполнения одномерных массивов

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

    var
      i:integer;
      a: array[1..5] of integer; {определение одномерного массива из пяти целых чисел}

    Ручной ввод данных

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

    for i:=1 to 5 do
      read a[i]; {ручной ввод значений элементов массива с клавиатуры}

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

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

    for i:=1 to 5 do
      a[i]:=random(10); {задаются случайные числа из интервала [0,10)}

    Ввод данных по заданному правилу (формуле)

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

    for i:=1 to 5 do
      a[i]:=i*i; {квадрат натурального числа - число, умноженное само на себя}

    Ввод данных из текстового файла

    Еще один способ получить данные — прочитать их из файла.

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

    Вывод линейного массива

    В языке программирования Pascal ABC вывод элементов одномерного массива организуется с помощью цикла.

    for i:=1 to 5 do write (a[i]);
    или так
    for i:=1 to 5 do print (a[i]);

    Шаблон для использования в однотипных задачах

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

    var
      i,n:integer;
      a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел}
    begin
    write('Введите количество элементов в массиве');
    readln(n);
    for i:=1 to n do
      begin
        a[i]:=random(100)-random(100);{заполнение случайными числами из интервала (-100;100)}
        print (a[i]); {можно использовать write}
      end;
    {здесь записывается код обработки по условию задачи}
    end.

    Задачи с решением

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

    Задача 1. Дан одномерный массив из N целых элементов. Написать программу вычисления произведения  всех элементов. Используйте ручной способ ввода чисел.

    Посмотреть решение

    var
      i,n,p:integer;
      a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел}
    begin
    write('Введите количество элементов в массиве');
    readln(n);
    p:=1;
    for i:=1 to n do
      begin
        write('Введите ',i,' -й элемент'); 
        readln(a[i]);
        p:=p*a[i];
      end;
    write('Произведение = ',p);
    end.

    Задача 2. Дан линейный массив из N целых чисел. Написать программу вычисления суммы этих элементов. Используйте для заполнения массива случайные числа.

    Посмотреть решение

    var
      i,n,s:integer;
      a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел}
    begin
    write('Введите количество элементов в массиве');
    readln(n);
    s:=0;
    writeln('Исходный массив'); 
    for i:=1 to n do
      begin
        a[i]:=random(10); 
        print(a[i]);
        s:=s+a[i];
      end;
    write('Сумма = ',s);
    end.

    Задача 3. Дан массив A(n). Заполнить двузначными числами. Найти элементы сумма цифр, которых равна числу элементов массива.

    Посмотреть решение

    Решение:

    var
     i,n,s,c1,c2,k:integer;
     a: array[1..100] of integer; {определение одномерного массива из 100 целых чисел}
    begin
     k:=0;
    write('Введите количество элементов в массиве');
    readln(n);
    for i:=1 to n do
     begin
       a[i]:=random(90)+10;{заполнение случайными числами из интервала [10;99]}
       print (a[i]); {можно использовать write}
     end;
     writeln;
     writeln('Сумма цифр элементов равна размеру массива');
     for i:=1 to n do
     begin
       c1:=a[i]div 10; c2:=a[i]mod 10;
       If c1+c2=n then print (a[i])else k:=k+1;
     end;
     If k=n then print ('Таких элементов нет');
    end.

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

    Задача 4. Упорядочить массив чисел по возрастанию.

    Посмотреть решение

    Решение:

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

    const n=10;
    var i,j:integer;
    x:real;
    a:array[1..n] of real;
    begin
     println('Исходный массив'); 
      for i:=1 to n do 
        begin
        a[i]:=random(100);
        print(a[i]);
        end;
        {сортировка по возрастанию}
       for i:=1 to n-1 do  
        for j:=1 to n-i do
        if a[j]>a[j+1] then 
                          begin
                          x:=a[j];a[j]:=a[j+1];a[j+1]:=x;
                          end;
        println;
        {вывод отсортированного массива}
        println('Упорядоченный массив');
        for i:=1 to n do 
           print(a[i]);    
    end.

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

    Задача 5. Составьте программу, которая выполнит перевод натурального числа из десятичной системы счисления в любую с основанием 2-16

    Посмотреть решение

    Решение:

    var a,b,c,i,k,s:integer;
    mas: array[0..1000] of integer;  
    begin  
    	k:=0;  
    	write('Введите число ');readln(a);
    	write('Введите основание системы для перевода ');readln(s);
    	repeat  
    		b:=a mod s;
    		k:=k+1;  
    		mas[k]:=b;  
    		c:=a div s;  
    		if c>=s then a:=c;  
    	until c<s;  
    	case c of
    	10: write('A');
    	11: write('B');
    	12: write('C');
    	13: write('D');
    	14: write('E');
    	15: write('F');
    		else write(c);  
    	end;
    	for i:=k downto 1 do  
    		case mas[i] of
    		10: write('A');
    		11: write('B');
    		12: write('C');
    		13: write('D');
    		14: write('E');
    		15: write('F');
    			else write(mas[i]);
    		end;
    end.

    Дополнительные задания:

    mas1 Дан целочисленный массив произвольного размера. Подсчитать сколько раз заданная цифра встречается в элементах массива. Числа в массиве только 3-х значные.

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

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

    Что такое массив? Это ячейки памяти с однотипными данными, расположенные последовательно.

    Что такое массив

    Каждая ячейка имеет номер, т. е. индекс, но все они находятся под общим названием переменной. Индекс ячейки указывает на ее компоненты, которые там находятся. 

    Процесс над одним массивом производится с использованием имени переменной, которая связана с областью содержащихся в нем данных.

    Другими словами, массив – это компоненты одного вида, собранные в ячейках под общей переменной. 

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

    Например:

    • А[1..10] – массив с именем А и размером 10;

    • ST[1..R], R = 7 – массив с именем ST, состоящий из 7 элементов.

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

    Описание массива

    Вот примерная схема:

    var<имя массива>: array [<мин_знач_индекса>макс_знач_индекса>] of<тип_элементов>;

    Например: var a: array [1 .. 10] of integer. 

    Вместо того, чтобы объявлять отдельные переменные, такие как No1, No2, … и No100, вы задаете только одну переменную. Определенный компонент в хранилище доступен по индексу.

    Самый низкий адрес имеет первый компонент, а самый высокий адрес – последний.

    Количество компонентов может быть разным.

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

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

    Он может иметь как минимальный диапазон элементов, так и максимальный. 

    В Pascal индекс массива может иметь любой скалярный тип, например, целое число, логическое значение, перечисление, кроме действительного. Индексы также могут иметь отрицательные значения. 

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

    Ввод одномерного массива в Паскаль

    Двумерные и многомерные массивы

    Размерность массивом может быть разной. 

    Двумерные хранилища и многомерные – это наборы, в которых хранятся переменные во втором или n-м измерении, имеющие n * m мест хранения. 

    Размерные матрицы Mutli, включая 2-мерный набор, объявляются с использованием нескольких квадратных скобок, расположенных рядом друг с другом, или с использованием запятых с квадратными скобками в качестве альтернативы.

    Двумерный массив можно рассматривать как прямоугольную сетку с двумя индексами, один из которых задает строку, а другой – столбец.

    Пример двумерного массива

    Например, календарь, подобный тому, что представлен на рисунке, можно рассматривать как двумерную таблицу, имеющую строки, известные как недели, и столбцы, известные как дни. Тем не менее, календарь так же можно рассматривать как набор массивов: месяц – это массив недель, а неделя – дней. 

    В Паскале эта декларация записывается как единый блок:

    TYPE DayType = INTEGER;


    DayNames = (Sun, Mon, Tue, Wed, Thu, Fri, Sat);


    WeekType = ARRAY [DayNames] OF DayType;


    MonthType = ARRAY [1..6] OF WeekType;

    Тип MonthType также может быть записан как:

    TYPE MonthType = ARRAY [1..6] OF


    ARRAY [DayNames] OF DayType;

    Можно записать с использованием ярлыка, как:

    Тип MonthType = ARRAY [1..6, DayNames] OF DayType;


    DayNames = (Вс,Пн,Вт,Ср,Чт,Пт,Сб);


    WeekType = ARRAY [DayNames] OF DayType;


    MonthType = ARRAY [1..6] OF WeekType;

    Другой пример двумерного массива в Pascal:

    Задание двумерного массива

    Как задать массив в Паскале

    Ввод

    Массивы применяются в качестве обычных матриц для сбора и хранения типизированных компонентов. 

    Ввести его можно с клавиатуры, вручную, набирая каждый элемент, или использовать циклы: For i:=1 to 20 do read (a[ i ]);

    В приведенном ниже примере показано, как вводить набор «a», который состоит из 10 случайных чисел в диапазоне от 0 до 99. Он называется рандомным. 

    Реализуется он с помощью функции Random:

    For i:=1 to 10 do a[ i ]:=random(100);

    Вывод, ввод массива в Паскале

    Вывод

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

    Пример: For i:=1 to 10 do write (a[ i ], ‘ ‘);

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

    Заключение

    Итак, задача матрицы – ускорение действий. Конечно, если дело касается только 5 переменных, можно обойтись и без нее. А как быть, если речь идет о 100 или 1000 переменных. Нужно вбивать вручную каждый элемент для ввода и еще столько же для вывода? 

    Решение очевидно: лучше не забрасывать информатику 9-го класса и научиться работать в Паскале. Это полезно, если вы хотите хранить большие объемы данных для последующего использования в программе.

    Информатика, 11 класс. Урок № 5.

    Тема — Массивы. Типовые задачи обработки массивов

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

    Глоссарий по теме: массив, элемент массива, размерность массива, индекс элемента массива, сортировка.

    Основная литература по теме урока:

    Л. Л. Босова, А. Ю. Босова. Информатика. Базовый уровень: учебник для 11 класса. — М.: БИНОМ. Лаборатория знаний, 2017

    Дополнительная литература по теме урока:

    — И. Г. Семакин, Т. Ю. Шеина, Л. В. Шестакова. Информатика и ИКТ. Профильный уровень: учебник для 11 класса. — М.: БИНОМ. Лаборатория знаний, 2012

    — К. Ю. Поляков, Е. А. Еремин. Информатика. Углубленный уровень: учебник для 10 класса. В 2 ч. Ч. 2 — М.: БИНОМ. Лаборатория знаний, 2013

    — Андреева Е. В. Программирование — это так просто, программирование — это так сложно. Современный учебник программирования. — М.: МЦНМО, 2015

    — Молчанова С. И. Основы программирования. Турбо-Паскаль 7.0 для школьников и абитуриентов. — М.: «Аквариум»; ООО «Фирма «Издательство АСТ», 1999

    Теоретический материал для самостоятельного изучения

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

    Для решения этой достаточно простой задачи мы будем вынуждены ввести 20 имен переменных, что, естественно, очень неудобно. Но ведь чисел может быть гораздо больше, чем 20!

    Основное предназначение современных компьютеров — обработка большого количества данных. Очень сложно каждой переменной при этом давать собственное имя и не запутаться. Выходом их этой ситуации является использование более сложных по своей конструкции типов данных — составных (или структурированных). Одним из таких типов являются массивы.

    Массив — это поименованная совокупность однотипных элементов, упорядоченных по индексам, определяющим положение элемента в массиве.

    Элемент массива — отдельная переменная, входящая в массив.

    Индекс элемента массива — номер элемента в этом массиве.

    Размерность массива — количество элементов, которое содержит массив.

    Массивы бывают одномерными и многомерными. Мы будем рассматривать только одномерные массивы. Их условно можно представлять в виде таблицы, которая состоит из множества ячеек, расположенных в одну строку или в один столбец.

    Описание массивов

    В языке Паскаль массивы описываются в блоке описания переменных следующим образом:

    var <идентификатор>: array [<тип индекса>] of <тип компонентов>

    Здесь:

    — array и of — служебные слова, которые буквально можно перевести как «массив» и «из»;

    — <тип индекса> — описание индексации (нумерации) элементов массива. В качестве типа индекса можно использовать любые порядковые типы;

    — <тип компонентов> — тип величин, непосредственно составляющих массив.

    Приведем несколько примеров описаний:

    1. var day: array [1..365] of integer; — массив, состоящий из 365 целых чисел, которые пронумерованы от 1 до 365;
    2. var tem: array [0..11] of real; — массив, состоящий из 12 вещественных, пронумерованных от 0 до 11;
    3. var ocenka: array [–2..2] of char; — массив, состоящий из 5 символьных переменных с номерами от -2 до 2:
    4. const n=10; var slovo: array [1..n] of string; — n строковых величин, пронумерованных от 1 до n;

    Для того, чтобы обратиться к элементу массива, нужно записать имя массива и в квадратных скобках индекс нужного элемента, например, day[100].

    Рассмотрим основные приемы работы с массивами.

    Заполнение одномерного массива значениями

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

    — вводя значения с клавиатуры;

    — случайным образом из некоторого диапазона;

    — по формуле.

    Но какой бы способ мы ни выбрали, нам обязательно нужно организовать цикл.

    Для начала договоримся, что мы имеем дело с массивом из 10 натуральных чисел (хотя тип элементов в данном случае значения не имеет).

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

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

    Воспользуемся вторым и третьим способами, рассмотренными выше:

    Теперь перейдем к задачам обработки массивов.

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

    Алгоритм решения практически полностью совпадает с алгоритмом нахождения суммы некоторого количества чисел, который мы уже рассматривали на третьем уроке в этой теме.

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

    В программировании поиск — одна из наиболее часто встречающихся задач вычислительного характера.

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

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

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

    Например, требуется найти в массиве элемент, значение которого равно значению переменной p, или сообщить, что такого элемента в массиве нет.

    Мы построим алгоритм, идея которого следующая:

    1. Просматриваем все элементы массива с первого до последнего.
    2. Как только находим элемент, равный p, выведем его номер, и увеличим счетчик вхождений элемента m в массив на 1.
    3. Если после просмотра массива счетчик окажется равным 0, выведем сообщение об отсутствии искомого элемента в массиве.

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

    Поиск максимального (минимального) элемента массива

    Подумаем, какие операции нужно выполнить, если требуется найти максимальный элемент. Естественно, как и в предыдущей задаче, операцию сравнения. Но с чем нам сравнивать очередной элемент массива?

    Введем дополнительную переменную max, которой присвоим значение, равное значению элемента массива a[1]. Теперь будем сравнивать все элементы, начиная со 2-го, с max, и если найдем больший элемент, то присвоим его значение переменной max. Конечное значение этой переменной и будет значением наибольшего элемента массива.

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

    Фактически, эта задача является объединением двух предыдущих, но с одним «подвохом».

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

    Мы знаем, что условие «четности» на языке Паскаль можно записать так: x mod 2=0. Значит, найти все четные элементы массива мы сможем. Но как среди них найти наибольший?

    Прием, которым мы воспользовались в задаче 5, здесь может привести к ошибке. Например, на первом месте в массиве будет стоять НЕЧЕТНОЕ число, которое окажется больше всех четных. Здесь переменной max лучше присвоить начальное значение, заведомо меньшее всех элементов массива. Например, если наш массив составлен из натуральных чисел, то присвоить max значение -2. Если после окончания программы значение max останется таким же, это будет означать, что в массиве нет четных чисел. Если же они будут, max изменит значение.

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

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

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

    Удалим из него элемент с индексом i=4, т. е. a[1]=a[1], a[2]=a[2], a[3]=a[3], a[4]=a[5], a[5]=a[6], a[6]=a[7]. А вот для последнего элемента a[7] новое значение взять неоткуда. Он сохранит свое значение. Получим:

    Чтобы избежать такого дублирования последнего элемента обычно на его место ставят число 0.

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

    Сложнее обстоит дело со вставкой элемента внутрь массива. Как мы сказали, при вставке все элементы, расположенные справа от места вставки, сдвигаются вправо. Последнему же элементу сдвигаться некуда, и он пропадет. Чтобы этого не произошло, нужно увеличить размерность массива на 1. Но учесть это надо при описании массива. Второй важный момент заключается в том, что сдвиг значений мы будем производить справа налево до заявленной позиции вставки:

    Реверс массива

    Реверс массива — это перестановка его элементов в обратном порядке: первый элемент становится последним, а последний — первым.

    Из примера видно, что местами меняются 1-й элемент с N-м, второй — с (N–1)-м и т. д. Замечаем, что сумма индексов элементов, участвующих в обмене, равна N+1, поэтому элемент с номером i должен меняться местами с (N+1–i)-м элементом.

    Теперь разберемся с организацией цикла. Если мы организуем цикл по всем элементам, то получим:

    Все вернулось в исходное состояние, потому что реверс выполнился дважды. Чтобы этого не произошло, нужно остановить процесс обмена на середине массива, т.е. на элементе с индексом (N div 2).

    Сортировка массива

    Сортировка — один из наиболее распространенных процессов обработки данных.

    Под сортировкой массива понимают расстановку элементов массива в заданном порядке.

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

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

    Существует много различных алгоритмов сортировки. Мы рассмотрим некоторые из них на примере сортировки массива целых чисел в порядке неубывания (a[i]<=a[i+1]).

    Обменная сортировка методом «пузырька»

    Свое название этот алгоритм получил из-за схожести с физическим явлением всплытия пузырька воздуха в воде. Точно также в массиве как бы «всплывают» наверх (к началу массива) меньшие элементы.

    Сначала мы сравниваем последний и предпоследний элементы массива. Если они стоят неправильно (нижний элемент меньше верхнего), то меняем их местами. Далее сравниваем следующую пару элементов и т. д.

    В итоге самый «легкий» элемент поднимается на самый верх.

    Теперь спускаемся вниз и начинаем аналогичные сравнения, но при этом остановимся на втором сверху элементе, потому что, как мы уже выяснили, верхний — наименьший.

    На каждом проходе число сравнений будет уменьшаться на 1. Число проходов будет на единицу меньше числа элементов в массиве, ведь в самом конце последний элемент уже окажется наибольшим и сравнивать его смысла нет.

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

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

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

    С примером более эффективного алгоритма сортировки — «быстрой сортировкой» — вы сможете познакомиться в дополнительном материале.

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