Как задается диапазон изменения индексов массива
Если работа программы связана с хранением и обработкой большого количества однотипных переменных, для их представления в программе можно использовать массивы.
Например, пусть программа пользователя выполняет некоторые действия над последовательностью целых чисел, насчитывающей сто элементов i1, i2, . i100 которые требуется сохранить до конца ее работы. Вместо того чтобы описывать указанные переменные сто раз, можно один раз объявить целочисленную переменную i , состоящую из ста элементов, — массив.
Массив представляет собой совокупность данных одного типа с общим для всех элементов именем.
Элементы массива пронумерованы, и обратиться к каждому из них можно по номеру (или нескольким номерам — например, для элемента таблицы задается номер строки и столбца). Номера элементов массива иначе называются индексами, а сами элементы массива — переменными с индексами (индексированными переменными).
Обратите внимание — данные в массивах сохраняются, как и в случае использования обычных неиндексированных переменных, только до конца работы программы. Для их долговременного хранения программа должна записать данные в файл.
•тип — общий тип всех элементов массива;
•размерность (ранг) — количество индексов массива;
•диапазон изменения индекса (индексов) — определяет количество элементов в массиве.
Вектор (одномерный массив) — это пример массива, в котором элементы нумеруются одним индексом.
Если в массиве хранится таблица значений (матрица), то такой массив называется двумерным, его элементы нумеруются двумя индексами — номером строки и столбца соответственно. Массивы еще большей размерности (трехмерные, четырехмерные и т. д.) на практике встречаются довольно редко.
В качестве номера (индекса) элемента массива, в общем случае, используется выражение порядкового типа. Наиболее часто индекс — это целая константа или переменная типа integer , реже — типа char или boolean .
При обращении к элементу массива индекс указывается в квадратных скобках после имени массива. Например, а[3], Ь[1,2] . Однако использование элементов массива в качестве обычных переменных не дает существенной выгоды. Массивы ценны тем, что их индексы сами могут быть переменными или выражениями, обеспечивая доступ не к одному, а к последовательности элементов. Обработка массивов производится при изменении индексов элементов.
Например, в случае использования выражения следующие переменные удобно применять для просмотра в цикле элементов массива:
• a[i] — всех элементов;
• a[2*i] — элементов, стоящих на четных местах;
• a[2*i-i] — элементов, стоящих на нечетных местах.
 предыдущая         меню        вверх         следующая
Массивы
Понятие двумерного массива. Описание типа массива. Формирование значений элементов массива случайным образом
Одним из основных направлений использования компьютеров является накопление и обработка данных — различных таблиц, справочников, словарей и другой информации. Для представления такой информации в программе удобно использовать массивы. Как правило, обработка таких данных осуществляется по одному и тому же закону, для чего удобно использовать циклические алгоритмы. Мы уже рассматривали формирование и обработку одномерных массивов. Вспомним, что в массив мы объединяем конечную последовательность компонентов одного типа и даем им общее имя. Каждый отдельный компонент массива называется элементом. Количество элементов называется размером массива. Тип элементов определяет тип массива. Размер и тип массива указываются при его описании, причем размер может быть указан либо конкретным значением, либо ранее определенной константой. Номер элемента называется индексом. Индексы могут быть целыми положительными константами или целыми переменными. Чтобы обратиться к некоторому элементу массива, нужно рядом с идентификатором массива в скобках указать индекс элемента. Но часто данные могут быть организованы в виде таблицы (матрицы), где расположение каждой переменной определяется номером строки и номером столбца. Например, место в зрительном зале задается указанием номера ряда и номером места в этом ряду. Такие данные удобно описать как двумерный массив. В отличие от одномерного массива каждому элементу двумерного массива соответствует пара индексов. Первый индекс — это номер строки, а второй — номер столбца, где расположен элемент массива. Размер двумерного массива задается парой чисел: M*N, где M — число строк, а N — число столбцов в таблице. Пусть задан двумерный массив Matr, имеющий размер 10*20. Этот массив на языке Паскаль может быть описан следующим образом:
| Var Matr : array [1..10,1..20] of integer; |
тогда Matr[5,7] — элемент, расположенный в 5-ой строке и в 7-ом столбце. Любая константа, переменная, значение функции или выражения в Турбо Паскале характеризуется своим типом. Тип любого из этих объектов определяет множество допустимых значений, которые может иметь объект, а также множество допустимых операций, которые применимы к объекту. Кроме того, тип определяет и формат внутреннего представления значения объекта. Имя, которое программист присваивает своему определяемому типу, — произвольный идентификатор. Объявление типа должно быть сделано в разделе объявлений, и ему должно предшествовать кодовое слово Type. Отличительной особенностью массивов является то обстоятельство, что все их компоненты суть данные одного типа (возможно, структурированного); эти компоненты можно легко упорядочить и обеспечить доступ к любому из них простым указанием его порядкового номера, например:
| Type Digit = array [0..9] of integer; Matrix = array [1..100, 0..9] of real; Var m : Matrix; d : Digit; i : integer; |
Описание типа массива задается следующим образом: <имя типа>= array [] of ; где:имя>
— правильный идентификатор,
— список из одного или нескольких индексных типов, разделенных запятыми,
— любой тип Турбо Паскаля.
Примечание. Обычно в качестве индексного типа используется тип-диапазон, в котором задаются границы изменения индексов через две точки (..). Так как , идущий за кодовым словом of, — любой тип Турбо Паскаля, он может быть, в частности, другим массивом. Рассмотрим примеры. Пример 1. Массив можно описать как одномерный, элементами которого в свою очередь являются одномерные массивы.
| Const n=2; m=3; Type MyArray1 = array [1..m] of integer; MyArray2 = array [1..n] of MyArray1; Var V : MyArray1; A : MyArray2; |
В данном случае переменная V объявлена как одномерный массив из трех элементов целого типа, а переменная А описана как двумерный массив из двух строк, в каждую из которых включено по три элемента. Пример 2. Описание массива можно сократить, исключив определение массива MyArray1.
| Const n=2; m=3; Type MyArray2 = array [1..n] of array [1..m] of integer; Var A : MyArray2; |
Пример 3. Еще более краткое описание массива А можно получить, указывая имя массива и диапазоны изменения индексов для каждой размерности массива (чем мы уже пользовались).
| Const n=2; m=3; Type MyArray2 = array [1..n, 1..m] of integer; Var A : MyArray2; |
Пример 4. Если же указанный тип используется для определения одного массива в программе, то удобно объявление массива в разделе описания переменных.
| Const n=2; m=3; Var A : array [1..n, 1..m] of integer; |
Формирование значений элементов массива случайным образом и с клавиатуры и вывод их на экран
Операции работы с двумерными массивами аналогичны операциям работы с одномерными массивами, нужно только не забывать о различиях между массивами. Обычно при работе с двумерными массивами используются вложенные циклы. Очень часто значения элементов массива вводятся с клавиатуры. Этот способ задания информации слишком трудоемок при работе с массивами больших размеров. Для отладки широкого класса алгоритмов такой ввод информации должен быть заменен формированием элементов массива случайным образом. Для этого используют встроенные средства Турбо Паскаля: процедуру Randomize и функцию Random. Вы уже сталкивались с этими средствами. Сегодня же наша задача создать процедуру ввода элементов в массив и процедуру вывода элементов на экран. Приведем пример заполнения массива случайными числами. Эта процедура должна принять в качестве входных параметров массив, количество строк и столбцов, заданные пользователем с клавиатуры в основном разделе операторов. Так как наша процедура будет воздействовать на пустой исходный массив, то его мы должны передать по ссылке. Количество строк и столбцов достаточно передать копиями по значению.
| Procedure InsertMas1(Var X : MyArray; n, m: integer); Var i, j : integer; Begin Randomize; for i := 1 to n do for j := 1 to m do X[i, j]:= Random(50); End; |
Теперь, чтобы воспользоваться этой процедурой, достаточно вызвать ее в основном разделе программы, передав ей параметры. Рассмотрим процедуру вывода элементов массива на экран. Для того, чтобы вывести наш массив на экран в виде таблицы, поставим при переходе к новой строке оператор writeln и применим формат вывода элементов (:5).
| Procedure PrintMas(X : MyArray; n, m: integer); Var i, j : integer; Begin for i := 1 to n do begin for j := 1 to m do write(X[i, j]:5); writeln; end; End; |
Задание. Наберите программу-шаблон для работы с двумерными массивами. Как вы уже знаете из предыдущей темы, она должна содержать две процедуры ввода и процедуру вывода элементов заданного массива. Основной раздел операторов должен содержать диалог с пользователем и защиту программы от ввода недопустимых значений для количества строк и столбцов. Сохраните файл в соответствующем каталоге на своей дискете. Рассмотрите процедуру, решающую следующую задачу. Задача. Дана таблица действительных чисел. Сосчитайте сумму всех чисел в таблице.
Обратите внимание, что внутри цикла со счетчиком i организован цикл со счетчиком j. В результате суммируются в начале числа 1-й строки (i=1, при j=1, 2, . m), затем суммируются числа 2-й строки (i=2, при j=1, 2, . m) и т.д. В данной программе в теле одного цикла содержится другой цикл. Такие циклы, как Вы уже знаете, называются вложенными. Причем цикл со счетчиком i является внешним, а цикл со счетчиком j — внутренним. Не забывайте основное правило при написании вложенных циклов: последний оператор внутреннего цикла должен либо предшествовать, либо совпадать с последним оператором внешнего цикла. Вложенные циклы напоминают матрешек, вложенных одна в другую. Задание. Откройте файл программы-шаблона, сохраните его под другим (соответствующем задаче) именем и дополните текст программы функцией нахождения суммы элементов, правильно преобразовав в нее рассмотренную выше процедуру. Внесите в программу необходимые операторы и комментарии. Задание. Ниже приведен фрагмент решения некоторой задачи. Внимательно рассмотрев решение, сформулируйте решаемую задачу и оформите по всем правилам, применив знания текущего занятия.
| . . . for i := 1 to N do Begin M := a[i,1]; S := a[i, 1]; for j := 2 to N do begin if M>a[i, j] Then M := a[i, j]; S := S+a[i, j]; end; writeln (i:7, M:6, S:6:3); End; . . . |
Как задается диапазон изменения индексов массива
Рассмотренные выше простые типы данных позволяют использовать в программе одиночные объекты — числа, символы, строки и т.п. В Турбо Паскале могут использоваться также объекты, содержащие множество однотипных элементов.
Массив — это множество однотипных элементов, объединённых общим именем и занимающих вкомпьютере определённую область памяти. Количество элементов в массиве всегда конечно. В общем случае массив — это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.
Тип элементов, из которых состоит массив, может быть как скалярным, так и структурированным. Этот тип называется базовым, им может быть целый, байтовый, логический, символьный, перечисляемый, интервальный, вещественный, множественный типы и т. д.
При описании массива необходимо указать общее число входящих в массив элементов и тип этих элементов. Например:
а : array [1..10] of Real;
b : array [0..50] of Char;
с : array [-3..4] of Boolean;
Как видим, при описании массива используются зарезервированные слова ARRAY и OF (массив, из). За словом ARRAY в квадратных скобках указывается тип-диапазон, с помощью которого компилятор определяет общее число элементов массива. Тип-диапазон (подробнее см. в гл.4) задается левой и правой границами изменения индекса массива, так что массив А состоит из 10 элементов, массив В — из 51, а массив С — из 8 элементов. За словом OF указывается тип элементов, образующих массив.
Доступ к каждому элементу массива в программе осуществляется с помощью индекса — целого числа (точнее, выражения порядкового типа, см. гл.4), служащего своеобразным именем элемента в массиве (если левая граница типа-диапазона равна 1, индекс элемента совпадает с его порядковым номером). При упоминании в программе любого элемента массива сразу за именем массива должен следовать индекс элемента в квадратных скобках, например:
a: array [1..10] of Integer;
b: array [0..40] of Char;
c: array [-2..2] of Boolean;
k: Integer; begin
for k : = 1 to 10 do a[k] := 0;
В правильно составленной программе индекс не должен выходить за пределы, определенные типом-диапазоном. Например, можно использовать элементы А[1], В[38], С[0], но нельзя A[0] или С[38] (определение массивов см. выше). Турбо Паскаль может контролировать использование индексов в программе на этапе компиляции и на этапе счета программы.
Для иллюстрации приемов работы с массивами составим программу (пример 1.9), которая создает массив случайных целых чисел, подсчитывает их среднее арифметическое, а также определяет и выводит на экран минимальное и максимальное из этих чисел.
m : array [1..N] of Integer;
Большая Энциклопедия Нефти и Газа
Иногда нужно знать диапазон изменения индексов массива . Значением примитивной функции PROTOTYPE является прототип, использованный при создании массива. Значением параметра функции PROTOTYPE должен быть массив, ее результат — цепочка-прототип. [2]
Для нее характерно равномерное отображение значений ключа на весь диапазон изменения индексов , поэтому ее кладут в основу большинства преобразований ключей. Кроме того, при N, равном степени двух, эта функция эффективно вычисляется. Однако если ключ представляет собой последовательность букв, то именно от такой функции и следует отказаться. Дело в том, что в этом случае допущение о равновероятности всех ключей ошибочно. [3]
Как показывают экспериментальные исследования выхлопных газов ГПА различных типов, диапазон изменения индекса концентрации составляет в среднем от 0 6 до 3 0 в зависимости от эмиссионной характеристики камеры сгорания, технического состояния агрегатов и наработки с начала эксплуатации и после капитального ремонта. [4]
В языках программирования — синтаксическая конструкция, определяющая нижнюю и верхнюю границы диапазона изменения индекса массива . [5]
Объявление массива компонентов ничем не отличается от объявления обычного массива — указывается имя массива, диапазон изменения индекса и тип элементов массива. [7]
Описатель CONTROLLED используется при динамическом распределении памяти, например для размещения в памяти массивов, у которых диапазоны изменения индексов не определены в момент входа в блок, а вычисляются в процессе выполнения блока. [8]
В паспорте ОСВ задается либо число команд в ОСВ, либо длина ОСВ в байтах, а также диапазоны изменения индексов элементов векторов при циклической организации выполнения команд ОСВ. [9]
Элементарные инфиксные и префиксные операторы могут применяться к операндам, являющимся массивами, и давать в результате массивы с тем ограничением, что эти массивы должны быть идентичны по числу размерностей и диапазонам изменения индексов . Типы элементов массивов могут различаться при условии, что могут быть выполнены соответствующие преобразования типа. Например, если А и В — два массива с идентичными размерностями и диапазонами изменения индексов, то A — f — В дает в результате массив той же размерности, каждый элемент которого является суммой соответствующих элементов А и В. [10]
В PL / 1, в отличие от фортрана II и IV, индексы могут принимать не только положительные значения, но и нулевые и отрицательные; поэтому в атрибуте размерности PL / I характеристика диапазона изменения индекса для каждой из размерностей массива может задаваться и с помощью граничной пары. [11]
Параметром функции ARRAY является цепочка, образованная двумя цепочками PROTOTYPE ( A), между которыми стоит запятая. Таким образом, в новом массиве диапазон изменения индексов для обоих измерений одинаков. [12]
Динамическое моделирование большинства структур языка Алгол осуществляется относительно просто и во многих случаях позволяет прямо использовать возможности аппаратуры. Массивы хранятся последовательно с неполным дескриптором, который необходим для динамического определения диапазона изменения индексов , однако описание типа и числа размерностей массива позволяет компилировать формулы доступа в последовательности выполняемых команд. Описания также позволяют применять специфические в отношении типов операции, которые обычно прямо обеспечиваются аппаратурой, за исключением нескольких случаев, упомянутых в предыдущем разделе. Основные области, требующие динамического программного моделирования, — это среда ссылок, параметры, передаваемые по имени, и ввод-вывод. [13]
Перед тем, как новому вектору будет выделена память, будут найдены значения выражений / К и М для определения диапазона изменения индексов нового вектора и количества необходимой памяти. [14]
В таких языках, как Алгол и ПЛ / I, требования к декларациям данных ослаблены в тех случаях, когда при небольшой потере в эффективности выполнения можно получить значительный выигрыш в гибкости. Хранение и обработку массивов можно организовать наиболее эффективно при наличии в декларациях массивов полной информации о типе, числе размерностей и диапазоне изменения индекса для каждой размерности, как это делается, например, в Фортране. Однако от такой полной фиксации структуры массива сильно страдает гибкость. Например, программист, пишущий на Фортране, часто вынужден определять массивы в расчете на наихудшие входные данные, отводя под них гораздо больше памяти, чем может в действительности понадобиться. Другой крайностью являются массивы АПЛ, вообще не требующие деклараций; они могут создаваться динамически, когда понадобятся, и могут быть переформированы в любой момент. Это соглашение дает большую гибкость, но поскольку приходится непрерывно проверять дескриптор, выполнение программы замедляется. Алгол представляет собой золотую середину между этими двумя крайностями. В программе на Алголе необходимо описать тип и число размерностей массива, но не обязательно задавать размер массива или диапазоны изменения индексов. Зная тип массива и число размерностей, компилятор Алгола способен скомпилировать весьма эффективные последовательности команд для обработки массива. Во время выполнения программы должны существовать простые дескрипторы, задающие диапазон изменения индекса для каждой раз мерности; дескриптор должен проверяться и обрабатываться каждый раз, когда происходит обработка массива. Потеря в скорости при таком подходе незначительна, зато программист получает важное средство — массивы, у которых размеры и диапазоны изменения индексов могут определяться динамически во время выполнения программы. Язык ПЛ / I, в частности, содержит многочисленные примеры средств, предусмотренных специально для достижения разумного баланса между противоречивыми требованиями эффективности выполнения и гибкости. [15]