#15 Одномерные массивы и работа с ними в Паскале. Задание собственного типа данных. Примеры

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

Для чего нужны массивы

Фактически массивы позволяют использовать огромное количество переменных (своих элементов) без отдельного объявления каждого из этих элементов.

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

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

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

Массив является сложным (составным) типом данных, так как представляет из себя целый набор элементов.

Объявить массив можно двумя способами:

  1. Не объявляя новый тип данных -- например так:
    var 
       a : array [1..10] of integer; // объявляем массив целых чисел из 10 элементов
  2. Объявив новый тип данных и используя его -- например так:
    //или
    type  // секция объявления типов
      myArr = array[1..10] of integer; // массив из 10 элементов
    { Мы объявили myArr -- тип данных представляющий собой массив 
    целых чисел из 10 элементов  с индексами от 1 до 1 }
    var
      a: myArr; // объявляем переменную типа  myArr
    
    

- то есть в конечном итоге всё сводится к объявлению переменной в секции var, но имеется возможно отдельно задать собственный тип в секции type (до секции var) как это показано выше.

Работа с конкретными элементами массива

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

Рассмотрим пример программы (можно запустить):

type  // секция объявления типов
  myArr = array[1..3] of char; //  массив из 3 элементов символьного типа

var
  a: myArr; // объявляем переменную типа  myArr

begin
   // инициаллизируем первый и третий элементы массива
   a[1] := '3';
   a[3] := '&'; // присваиваем значение элементу по индексу 3

   // выведем на экран значения трёх элементов через пробел
   writeln(a[1], '|', a[2], '|', a[3]);

   // проверим равен ли неициаллизированный элемент пробелу:
   if (a[2] = ' ') then
      writeln('['+a[2]+'] -- probel')
   else
      writeln('['+a[2]+'] -- ne probel, kod simvola:', ord(a[2]));

   readln();
end. 

-- в этой программе мы:

  • объявили собственный тип данных (массив из 3 символьных элементов);
  • присвоили первому и третьему элементу значения (инициализировали их);
  • вывели на экран все три элемента массива -- причём второй неинициализированный элемент отобразится как пустой;
  • c помощью оператора ветвления узнали совпадает ли этот неинициаллизрованный элемент с пробелом (является ли он пробелом -- вышло что нет) и с помощью стандартно функции ord() вывели его код в таблице ASCII, код $0$ соответствует пустому элементу. Таким образом мы выяснили, что неициализированные элементы массива типа char равны т.н. пустому символу.

Обход/перебор элементов массива

В программировании распространён термин т.н. обхода массива -- то есть перебора его элементов каком-то порядке с произвольной целью.

Перебор нужен в том числе чтобы:

  • Инициализировать значения нескольких или вообще всех элементов массива.
  • Считывать значения элементов массива.
  • И вообще для любой "массированной" работы с элементами (т.е. такой где их используется много).

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

type  // секция объявления типов
  myArr = array[1..3] of integer; // массив из 3 элементов
var
  a: myArr; // объявляем переменную типа  myArr
  i : integer;
begin

   { обходим первый раз массив,
      значения которого ещё не инициализированы,
      с целью присвоить значения элементам
   }
   for i:=low(a) to high(a) do
   begin
     writeln('vvedite element massiva nomer ', i, ':');  // пояснение для пользователя
     readln(a[i]);  // считываем элемент i массива 'a' из консоли
   end;

   // выводим массив значения элементов на экран
   writeln('elementi vvedennogo vami massiva:');
   for i:=low(a) to high(a) do // обходим массив второй раз, теперь уже с целью вывода его значений
     writeln(a[i], ' <-- a[', i, '] ');

   readln();
end. 

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

Инициализация массива в процедуре -- пример

Инициализация массива случайными значениями -- пример процедуры

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

Приведём пример программы, которая делает подобное:

var i: integer;
    a: array [1..10] of integer;

{ Процедура получает значение переменной a по ссылке }
procedure initIntArrayOfSeven(var a: array of integer);
var min, max: integer;
begin
   randomize(); // инициал. датчик случайных чисел (вызов стандартной процедуры)

   min := -5; // левая граница
   max := 10; // правая граница

   { обходим переданный массив
     и инициализируем массив случайными числами}
   for i:=low(a) to high(a) do
     a[i] := random(max + abs(min)) + min;
end;

begin    // далее программа использующая нашу процедуру

  initIntArrayOfSeven(a); { заполняем массив случайными числами, 
          передаем переменную в процедуру по ссылке }
  for i:=low(a) to high(a) do // обходим наш массив
     write(a[i], ' ');  // выводим очередное его значение

  readln(); // удерживаем консоль

end.  

Самостоятельная работа

Задачи

  1. Пользователь вводит массив целых чисел из 7 элементов. Найдите из них самое большое число и выведите его на экран.
  2. Пользователь вводит массив целых чисел из 7 элементов. Найдите из них два самых больших числа и выведите их на экран.

Что ещё почитать

  1. Урок 14. Одномерные массивы. Работа с элементами: http://learnpascal.ru/vvedenie-v-paskal/...