Квант
Разное

Заочная школа программирования

Рар А.

49

Искусство программирования» мы продолжаем публикать уроки Заочной школи программирования и статьи по информаике, языкам программирования и вычислительной техники. Урок Заочной школьки, которая в первых номерах этого года закончит свой третий, заключительный курс, вряд ли будет доступны новым читателем журнала. Остальные статьи, мы надемся, приоткотот завесу тайнственности, который иногда еще окружены ЭВМ, и объявят, почему освоение вычислительной техники порой называют «второй грамотностью».

Заочная школа программирования.

Урок 17: Массивы и записи в языке Паскаль

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

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

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

Значения, которые принимает индекс (например, значения, обозначющие строки нашей матрицы или ее столбцы), составляют неокото-рый скалярный тип (то есть, как мы видели раньше, упорядоченное множество). Этот скалярный тип может быть любым, кроме real, но наиболее естественно употребляется в этом качестве отрезок типа integer и понятно тогда индексы просто как номера.

Пусть, например, в матрице строки занumerованы числа от 1 до 5, а столбцы — числа от 0 до 19. Тогда тип первого индекса есть 1..5, а второго — 0..19.

Тип массива задается следующей синтаксической диаграммой:

В этой диаграмме «скалярные типы» — это последовательно типы первого, второго и т. д. индексов, а число их, естественно, равно размерности массива. Поле tun содержит тип элементов массива (едининый для всех элементов).

Отделный элемент массива представляет в программе в виде переменной с индексами. Синтаксическая диаграмма ее также:

«Имя» здесь — имя соответствующего массива. Число выражений должны быть равно числу индексов массива, а типы выражений должны совпадать с типами соответствующих индексов.

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

51

Список полей, в свою очередь, задается diagramмой

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

«Имя» здесь есть имя соответствующего записи.

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

type data = record
    год, месяц, день: integer
end;
вызы = record
    университеты, технические,
    прочее: integer
end;
страна = record
    плочадь, населенение:real;
    устройство:boolean;
    вступление:дата;
    образование:вызы
end;

Заметим, что типы data и вызы различны: хотя она они задают тройку целых чисел, но имена их полей разные.

Пусть далее в разделе описания переменных программы имеет описание

австралия, австралия, альбания, …
япония:страна;

Под многооточным здесь спрятано перечисление всех стран, входящих в ООН. Сведения о каждой из них, хранящие в соответствующих полях, таковы: плочадь (в тыс. кв. км.), количество населенения (в млн. человек), конструкционное устройство (песпублика — true, монархия — false), data вступления в ООН, количество различных высших учебных заведений.

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

Допустим, что все поля во всех записях уже заполнены. Тогда, например, оператор writeln(ukraina.hаселенение/ukraina.площадь);
напечатает плотность населения на Украине.

Расширение понятия переменной

Пусть в нашей программе описана переменная университеты типа integer.

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

Мы хотим присвоить этой переменной общее число университетов на Пиренейском полуострове, для чего пишем оператор присваивания университеты: =испания. образование.
университеты + портуляция.
образование. университеты;

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

Так, из переменной испания (типа страна) извлечено поле образование (типа вызы), а из него уже поле университеты (типа integer).

Чтобы указать такие конструкции, нам следует бы ввести изменения в некоторых синтаксических diagramмы. Но мы не будем это делать, а просто условия, что понятие переменной охватывает не только общные переменные, но также переменные с индексами и выборки полей. Условия также, что любое действие, совершаемое в программе над переменной в режиме смысл слова (в том числе и извлечение поля), может совершаться и над переменной в расширенном смысле.

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

Записи с вариантами

Мы считали до сих пор, что записи, принадлежные к одному и тому же

52

типу, организаны совершено одинаково. Паскаль дает, однako, вызможность ослабить это ограничение. Применя в описании типа записи «сменную часть» (см. синтаксический диаграмму этого описания), программы может определять записи с вариантами.

Сменная часть имеет следующую синтаксическую диаграмму*)

между ними (вычисляемый в радианах: 180° = π radian). Для треугольника укажем также, совершается ли обход от x к y по часовой стрелке или против (в поле обход будет соответственно true или false). Для круга дополнительных полей не требуется.

Пусть далее описана переменная f типа фцезура, и пусть она с не-

Пара «имя — имя типа», стоящая после case, задает особое поле записи: поле признака. Значение этого поля будем называть признаком. Признаком (в каждый данный момент выполнения программы) должна быть одна из стойших далее константы. Константа, служащая признаком, задает вариант записи, то есть определяет, каковы дальнейшие поля записи: это как раз те поля, список которых стоит в скобках после данной константы.

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

фцезура =
recordx:real;
caseф:форма of
треугольник:(y, уел:real);
обход: boolean;
параллелограмм: (y1, уел1:real);
круе: ()
end

Тип форма описывает при этом как форма = (треугольник , параллелограмм, круг));

Поле x — общее у всех трех фигур: у треугольника и параллелограмма это — одна из сторон, у круга — радиус. Для треугольника и параллелограмма надо определить еще вторую, смешную сторону и угол

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

Словарь
array — массив
record — запись

A. Pap