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

В Паскале существуют следующие структурированные типы:

  1. Массивы
  2. Записи
  3. Множества
  4. файлы

 

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

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

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

Как бы вы это сделали,

используя простые переменные:
используя массив:
Var a, b, c, d, e, g, h: integer;
Begin
 a:=0;
 b:=0;
 c:=0
 d:=0;
 e:=0;
 g:=0;
 h:=0;
 … 
Var a: array [1..7] of integer;
   p:integer;
Begin
  for p:=1 to 7 do
     a[p]:=0;
  …

В памяти наш массив можно представить следующим образом:

             
a1, a2, a3, a4, a5, a6, a7

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

var <имя>: array [n1..n2] of <тип элементов>;

- одномерный массив, имеет один размер – количество элементов:

n1 – начальный индекс массива (порядковый номер 1-го элемента),

n2 – конечный индекс массива (порядковый номер последнего элемента),

<тип> - тип элементов массива.

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


Пример 1:

var  a: array [-2..5] of integer; {8 элементов целого типа}
var  b: array [0..3] of integer; {4 элемента целого типа }

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

В качестве индекса можно использовать:

  • константы: а[5], b[38]
  • переменные: a[i], b[k]
  • выражения: a[i+1], b[2*i]

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

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

 

Пример 1.

 

 

Пример 2. Ввести с клавиатуры массив из 10 элементов и вычислить сумму элементов.

var  a: array [0..9] of real;
     s:real;
     i:integer;
begin
  writeln ('Введите 10 элементов массива');
  for i:=0 to 9 do readln (a[i]);
  s:=0;
  for i:=0 to 9 do s:=s+a[i];
  writeln ('сумма=', s);
end.

Пример 3: Ввести с клавиатуры массив положительных чисел (ввод закончить отрицательным числом). Определить максимальный элемент массива.

var  m: array [1..1000] of real;
     p, max: real;
     i,n: integer;
begin
   i:=1;
   repeat
     write('Введите ',i,' элемент');
     readln(p);
     if p>0 then m[i]:=p;
     i:=i+1;
   until p<0;
   n:=i-1;
   max:=m[1];
   for i:=1 to n do
      if m[i]>max then max:=m[i];
   writeln('max = ', max);
end.

Пример 4: Сформировать массив из 50 случайных целых чисел, распечатать его и определить номер элемента, ближайшего к среднему арифметическому.

 var b: array [1..50] of integer;
     ras, s: real;
     num, i: integer;
begin
  randomize;
  for i:= 1 to 50 do b[i]:=random(100);
  for i:= 1 to 50 do write(b[i], ' ');
  s:=0;
  for i:= 1 to 50 do s:=s+b[i];
  s:=s/50;
  num:=1;
  ras:=abs(s-b[1]);
  for i:=2 to 50 do
      if abs(s-b[i]) < ras then
       begin

          ras:=abs(s-b[i]);
          num:=i;
       end;
  writeln('Среднее = ',s,' ближайший элемент b[',num,']=',b[num]);
end.

Пример 5: Использование стандартных процедур BREAK и CONTINUE в операторах циклов. В массиве целых чисел найти первое отрицательное число и вывести его на экран.

 const  n=10;
 var    a: array [1..n] of integer;
        i: integer;
        yes: boolean;
begin
  writeln(‘Введите элементы массива’);
  for i:=1 to n do
   begin
     write(‘a[’,i,’]=’);
     readln(a[i]);
  end;
  yes:=false;
  for i:=1 to n do 
   begin
    if a[i]>=0 then continue; { continue – возврат на заголовок цикла}
    writeln(‘первое отрицательно число = ’, a[i]);
    yes:=true;
    break; { break – окончание выполнения цикла и переход к следующему оператору
             программы, в данном примере – к условному оператору if } 
  end;
  if not yes then writeln(‘Отрицательных чисел нет’);
end.

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

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

Существует множество методов сортировки, рассмотрим два наиболее простых и распространенных метода: метод прямого выбора и метод “пузырька”.

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

Алгоритм сортировки по возрастанию (через поиск минимального элемента):

  1. Определяется минимальный элемент массива и помещается на 1-е место
  2. Среди оставшихся элементов (начиная со 2-го) определяется минимальный элемент и помещается на 2-е место.
  3. Среди оставшихся элементов (начиная со 3-го) определяется минимальный элемент и помещается на 3-е место.
  4. И т.д. до конца массива.

Пример:

 

Программа:

var  a: array [1..10] of real; 
     i,j: integer;
     t: real;
begin
  randomize;
  for i:= 1 to 10 do
  begin
    a[i]:=random;
    write(a[i]:6:3);
  end;
  writeln;
  for i:= 1 to 9 do
    for j:=i+1 to 10 do
       if a[i]>a[j] then
         begin
           t:=a[i];
           a[i]:=a[j];
           a[j]:=t;
         end;
  for i:= 1 to 10 do write (a[i]:6:3);
end.

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

Метод “пузырька” (перестановок).

Алгоритм сортировки по возрастанию

  • Сравниваются попарно соседние элементы: 1-й со 2-м, 2-й с 3-м, 3-й с 4-м и т.д. до конца массива. Если соседние элементы расположены не по возрастанию, то они меняются местами. Таким образом, максимальный элемент массива “всплывает” на последнее место.
  • Снова сравниваются попарно соседние элементы и меняются местами, если не по возрастанию. Всплывает элемент, меньший максимального, на предпоследнее место.
  • И т.д. до тех пор, пока будут перестановки.

Пример:

Программа:

var  a: array [1..10] of real;
     i: integer;
     t: real;
     b: boolean;
begin
  randomize;
  for i:= 1 to 10 do
  begin
    a[i]:=random;
    write(a[i]:6:3);
  end;
  writeln;
  repeat
    b:=false;
    for i:= 1 to 9 do
      if a[i]>a[i+1] then
       begin
          t:=a[i];
          a[i]:=a[i+1];
          a[i+1]:=t;
          b:=true;
       end;
   until b=false; {Если b=false – это значит, что не было ни одной перестановки. Следовательно,
                   массив отсортирован, переходим к выводу отсортированного массива на экран }
   for i:= 1 to 10 do write(a[i]:6:3);
end.

4.3 Многомерные массивы

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

vara: array [N1..N2] of array [N3..N4] of real;

Обычно используют более короткую форму записи:

vara: array [N1..N2, N3..N4] of real;- двумерный массив (матрица), имеет два размера:

N1..N2 – диапазон изменения первого индекса (номер строки)

N3..N4 – диапазон изменения второго индекса (номер столбца)

 

Пример 1:

 var  a: array [1..3, 1..4] of integer;

a11 a12 a13 a14

a21 a22 a23 a24

a31 a32 a33 a34

 

Пример 2:

 var  b: array [1..5, 1..5, 1..5] of real;-
 трехмерный массив

Мы будем использовать только одномерные и двумерные массивы.

Обращение к элементам:a[1,3]:=0;

a[3,2]:=5;

 

В памяти:

 

  1

  2

  3

  4

  1

   

  0

 

  2

       

  3

 

  5

   

 

Замечание: Размер любого массива не должен превышать 64 кбайта.

Как вычислить размер массива рассмотрим на примере 1. Массив a имеет размер 3x4, т.е. состоит из 12-ти элементов. Элементы массива a целого типа, т.е. каждый элемент занимает 2 байта памяти. Следовательно, весь массив занимает 24 байта памяти.

При обработке матрицы внешний цикл может быть по номеру строки, а внутренний цикл – по номеру столбца матрицы:

  for str:= 1 to 3 do 
    for stb:= 1 to 4 do
        write (a[i,j]);

либо наоборот: внешний цикл - по номеру столбца, а внутренний цикл – по номеру строки матрицы:

  for stb:= 1 to 4 do
    for str:= 1 to 3 do
         write (a[i,j]);

В результате выполнения 1-го фрагмента программы увидим на экране содержимое элементов массива в следующем порядке: a11 a12 a13 a14 a21 a22 a23 a24 a31 a32 a33 a34

В результате выполнения 2-го фрагмента программы - в другом порядке: a11 a21 a31 a12 a22 a32 a13 a23 a33 a14 a24 a34


Пример 3: Заполнить матрицу размерностью 5х10 целыми случайными числами в диапазоне от 0 до 99 и найти минимальный элемент матрицы и сумму элементов.

var  m: array [1..5,1..10] of integer;
     i,j,s, min: integer;
begin
  randomize;
  for i:=1 to 5 do
   begin
    for j:=1 to 10 do
     begin
        m[i,j]:=random(100);
        write(m[i,j]:4);
     end;
    writeln;
  end;
  s:=0; min:=m[1,1];
  for i:=1 to 5 do
    for j:=1 to 10 do
    begin
        s:=s+m[i,j];
        if m[i,j] < min then min:=m[i,j];
    end;
  writeln(‘S = ’,s,’ min = ’,min);
end.

Пример 4: Сформировать матрицу размерностью 5х5, где aij=i*j , и вывести ее на экран;

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

var   a: array [1..5,1..3] of integer;
      sum,i,j: integer;
begin
  for i:=1 to 5 do
  begin
    for j:=1 to 3 do
    begin
       a[i,j]:=i*j;
       write(a[i,j]:4);
    end;
    writeln;
  end;
  for j:=1 to 3 do
  begin
      sum:=0;
      for i:=1 to 5 do
          sum:=sum+ a[i,j];
      writeln(‘сумма ’,,j,’-го столбца = ’,sum);
  end;
end.

Задачи для самоконтроля

4.1 Какой оператор является ошибочным?

var  a: array [0..5] of integer;
     p: integer;
Begin
  a[1]:=8;
  p:=5;
  a[p+1]:=7;

4.2 Определите значение sum после выполнения программы:

var  a: array [1..2,1..3] of integer;
     p, sum: integer;
Begin
  a[1,1]:= 8; a[1,2]:= - 6; a[1,3]:= 2;
  a[2,1]:= 4; a[2,2]:= 9; a[2,3]:= - 5;
  for p:=1 to 2 do
      sum:= sum + a[p,p];
end.