Pascal


08. Введение в массивы

До сих пор во всех наших программах объем информации, хранимой в памяти ЭВМ в процессе выполнения алгоритма, был невелик. А как быть, если нужно работать с сотней, тысячей или сотней тысяч чисел? Для записи алгоритмов, работающих с большими объемами информации в языках программирования существуют специальные табличные величины или  массивы.

Допустим, что надо составить программу для присваивания 100 разным величинам одного и того же значения (например, 5). Если не прибегать к новому типу данных, придется:

  1. описать 100 новых величин (типа real или integer), придумав каждой из них уникальное имя:
    a, b, c, и еще 97 имен ... : real;  
  2. записать в программе 100 команд присваивания вида:   ... := 5; где в левой части по очереди будут встречаться имена всех рассматриваемых величин:
    a := 5;
    b := 5;
    c := 5;
    и еще 97 команд...
     
     
     

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

Можно ли сократить программу? Насчет первого пункта что-то кардинальное пока предложить трудно. А вот для второго пункта, разумеется, напрашивается цикл:

for i := 1 to 100 do  ... := 5;

Однако, так ( ... ) писать нельзя, а написать что-то осмысленное вместо троеточия не удается (хотя, почему бы не попробовать, например:  a := 5 ?)

Проблема, как видим, в том, что величины имеют совершенно разные имена. Поэтому и не удается записать явно повторяющуюся команду присваивания в "общем виде"  (или все-таки   x := 5      , где x обозначает соответствующие имена переменных, подходит?)

Выход есть. В курсе алгебры, изучая тему "Прогрессии", Вы обозначали члены прогрессии так: a1, a2, a3 и т.д. Именно такие обозначения давали возможность записывать формулы типа:    an = a1 + d(n-1).

Заметим, что при иных (наших привычных: a, b, c, ...) обозначениях членов записать, например, формулу для n-го члена прогрессии было бы невозможно.

Другой пример из геометрии: вектор a=(a1, a2), как единыйй объект имеет индивидуальное имя a, и состоит из двух компонент - его координат. Координаты же - числа, обозначаемые a1 и a2.

Если, возвращаясь к нашей программе, прибегнуть к аналогичному приему, обозначив интересующие нас величины a1, a2, a3, ..., a100, то злополучный цикл приобретет вполне законченные очертания:   
for i := 1 to 100 do  ai := 5;  
или, переходя к обозначениям, принятым в языке Паскаль (из-за технических особенностей ранних устройств ввода-вывода):
for i := 1 to 100 do  a[i] := 5;  

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

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

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