I.5. МАССИВЫ ПЕРЕМЕННЫХ . ОПЕРАТОР ERASE Фома идет в реку. Фома не труслив, Хоть там аллигаторов целый м а с с и в. Почти по С.Михалкову Для возможности о д н о т и п н о й обработки большой совокупности данных в программировании введено понятие м а с с и в а. М а с с и в - это конечное множество значений (числовых или строковых), обозначенных одним именем (и м е н е м м а с с и в а), причем каждый эле- мент этого множества идентифицируется с помощью одного или нескольких чис- ловых индексов. Правила образования имени массива то же, что и для имени простой пере- менной. И н д е к с ы - это своего рода числовые координаты, указывающие место- нахождение конкретного элемента как в массиве данных, так и в массиве яче- ек памяти, отведенных для хранения этих данных. Массив характеризуется р а з м е р н о с т ь ю,то есть количеством ин- дексов, необходимых для поиска элемента в массиве, а также г р а н и ц а- м и и з м е р е н и я , то есть границами изменения каждого индекса. Массив описывается (объявляется) с помощью о п и с а т е л я размерно- сти. Описатель записывается следующим образом: сразу после имени массива в круглых или квадратных скобках указывается верхняя граница изменения ин- декса. Если индексов несколько, то верхние границы изменения каждого ин- декса разделяются запятой. Нижние границы индексов всегда равны н у л ю. При обращении к элементу массива указывается и м я э л е м е н т а м а с с и в а (имя индексируемой переменной). Имя элемента массива состо- ит из имени массива и следующего(их) за ним в круглых или квадратных скоб- ках индекса(ов) (если индексов два, то они разделяются запятoй). В качестве индекса может использоваться в ы р а ж е н и е (разумеется не строковое!), частными случаями которого являются к о н с т а н т а или и м я п е р е м е н н о й (понятие в ы р а ж е н и я см. в разделе I.8). Старайтесь в качестве индексов использовать ц е л о ч и с л е н н ы е выражения (выражения,которые могут принимать только целочисленные значе- ния), так как в противном случае компьютер автоматически преобразует ве- щественные константы, представляющие значения индексов, в целые константы, на что расходуется машинное время. Например, целесообразно писать A(K%), а не A(К). П р и м е р ы: ───────────── 1) C%(100) имя массива - C тип элементов массива - целочисленный размерность - одномерный количество элементов - 100 + 1 = 101 имена элементов массива - C%(0),C%(1),...,C%(100; 2) A(5,10) имя массива - А тип элементов массива - двойная точность размерность - двумерный количество элементов - (5+1)*(10+1) = 66 имена элементов массива - А(0,0), А(0,1),..., А(0,10), А(1,0), А(1,1),..., А(1,10), ··· ··· ··· ··· А(5,0), А(5,1),..., А(5,10); 3) Е$[20] имя массива - Е тип элементов массива - строковый размерность - одномерный количество элементов - 20 + 1 = 21 имена элементов массива - Е$[0],Е$[1],...,Е$[20] . Максимальная размерность вещественного массива - 11, целого или строко- вого - 13, максимальное число элементов массива определяется размером опе- ративной памяти компьютера и типом массива. Перед использованием в Вашей программе массивов необходимо выделить для них место в памяти ("зарезервировать место"). Это осуществляется при помощи специального оператора о б ъ я в л е н и я (описания) м а с с и- в о в. Его структура: DIM α, δ, β,... , где DIM ("DIMension"- "размерность") - служебное слово; α, δ, β,...- список описателей размерности встречаемых в программе массивов; описатели отделяются друг от друга запятой. Например, DIM C%(100),A(5,10),E$(20) , здесь C%(100),A(5,10),E$(20) - описатели размерности массивов. Запомните: в любом месте программы,где имя массива встречается в п е р- в ы й раз (конечно, не в операторе DIM), используется н е я в н ы й опе- ратор DIM с верхней границей индекса(ов), равной 10. Таким образом, напри- мер, одномерный массив, содержащий м е н е е 11 элементов, можно не опи- сывать оператором DIM ! Оператор DIM может находиться в любом месте программы, но обязательно п е р е д работой с массивом, к которому он относится. При выполнении оператора DIM всем элементам объявляемых числовых масси- вов присваивается значение 0 ("нуль"), а всем элементам объявляемых стро- ковых массивов присваивается значение "" ("нуль-строка" или "пустая" строка). Если для размещения всех массивов программы объем памяти оказывается недостаточным, на экран дисплея выдается сообщение "Out of memory" ("Н е х в а т а e т п а м я т и") или "Out of string memory" ("Н е х в а т а е т с т р о к о в о й п а м я т и") для случая массива символьных строк,и оператор DIM резервирует место толь- ко для первых перечисленных в нем массивов, которые полностью уместились в памяти. Кроме очевидного использования для создания массивов требуемого типа и размера, имеет смысл применять оператор DIM для объявления всех перемен- ных. Например, DIM MIN%,AB1#,X,C[15,4],X(6),AB1#(4,8). Обратите внимание на то, что, хотя простая переменная X и массив X(6) имеют одинаковые имена, для компьютера же - это разные объекты! Если в программе уже описаны массивы, содержащие большое количество элементов, то для создания новой простой переменной потребуется несколько секунд машинного времени (оно уходит на поиск места для новой переменной в оперативной памяти), определение же всех простых переменных оператором DIM в начале программы позволяет сэкономить это время (см. пример 8 в раз- деле 7.5). Приведем очень важную таблицу, указывающую количество байтов, занима- емых элементом массива, в зависимости от типа массива. ┌────────────────┬───────────────────────────────┬──────────────────────┐ │ Тип массива │Количество байтов на один элем.│ Количество элементов │ ├────────────────┼───────────────────────────────┤──────────────────────│ │ Целый │ 2 │MSX1:14343; MSX2:14323│ ├────────────────┼───────────────────────────────┤──────────────────────│ │ Одинарной точн.│ 4 │MSX1: 7171; MSX2: 7161│ ├────────────────┼───────────────────────────────┤──────────────────────│ │ Двойной точн. │ 8 │MSX1: 3585; MSX2: 3580│ ├────────────────┼───────────────────────────────┤──────────────────────│ │ Строковый │Длина области,занятой строкой+3│MSX1: 9562; MSX2: 9548│ └────────────────┴───────────────────────────────┴──────────────────────┘ Определив размерность некоторого массива посредством оператора DIM, ее уже нельзя изменить с помощью некоторого другого оператора DIM. Для этого необходимо сначала удалить соответствующий массив из оперативной памяти компьютера с использованием "стирающего" оператора ERASE . Оператор состоит из служебного слова ERASE ("to erase"-"вычеркивать") и следующего за ним списка имен уничтожаемых массивов. Имена массивов в этом списке перечисляются через запятую,причем скобки и максимальное зна- чение индексов массивов не указываются. Например, если массив А в программе описан как DIM A(30), то оператор ERASE A "уничтожает" одномерный массив А(30); после этого мы можем оператором DIM A(4,10) определить двумерный массив А(4,10) с тем же именем! Заметим,что если попытаться объявить заново с помощью оператора DIM массив без предварительного использования оператора ERASE, то выдается со- общение об ошибке "Redimensioned array" ("П е р е о п р е д е л е н и е м а с с и в а"). Следующий раздел при первом прочтении можно пропустить! Однако о б я з а т е л ь н о в е р н и т е с ь к нему позднее! I.6. ИМЕНА, ЗНАЧЕНИЯ И ТИПЫ Часто оказывается труднее хранить богатства, чем добывать их. Демосфен Ясно, что цель программы состоит в вычислении з н а ч е н и й . В свою очередь компьютер оперирует не со значениями,а скорее с п р е д с т а в- л е н и я м и значений,которые являются конфигурациями байтов памяти ЭВМ. Так как физические представления зависят от изображаемых объектов, то для того, чтобы оперировать со значениями, необходимо специфицировать их т и- п ы.Это кажущееся ограничение может оказаться на деле выгодным,потому что оно заставляет программиста точно определить все используемые им объекты и лучше контролировать свою программу. Итак, к а ж д ы й программный объект имеет т и п и з н а ч е н и е. Разумеется, он должен иметь также и и м я в программе, чтобы мы могли отличить его от других объектов с аналогичными типом и значением. 1. К о н с т а н т а имеет фиксированное имя,фиксированный тип и фиксированное значение. ───────────── ───────────── ───────────── Например, обозначение 134 есть и м я константы типа "целое" и фиксированного з н а ч е н и я 134 (сто тридцать четыре). Для констант тип и значение выводятся непосредственно из и м е н и. Язык MSX-BASIC, как и многие другие языки программирования позволяют про- граммисту выбрать другое имя для обозначения константы. Например, програм- мист может связать с константой 3.14159 имя PI при помощи оператора PI = 3.14159 . В таких случаях говорят, что PI есть с и м в о л и ч е с к а я к о н с- т а н т а (т.е. такая, которая обозначается некоторым символом вместо при- нятого для константы обозначения объявлением ее значения). Использование символических констант - хороший прием программирования: он исключает ситуации, при которых значения, являющиеся по существу пара- метрами выполняемой программы, используют в явной форме многократно в раз- ных местах программы. Такие ситуации осложняют модификацию и расширение программ. Значение символической константы появляется только в одном мес- те программы, в о б ъ я в л е н и и с и м в о л и ч е с к о й констан- ты, которое позволяет связать значение константы с выбранным именем; если появляется необходимость перейти к другому значению,модифицируется только это объявление.(В некоторых языках программирования строго применяется этот принцип, з а п р е щ а я использование констант, имеющих отличную от символической форму!). 2. П е р е м е н н а я имеет фиксированное имя, фиксированный тип и переменное значение. ───────────── ───────────── ────────── Имя переменной называется и д е н т и ф и к а т о р о м. Тип переменной связывается с ее именем при помощи о б ъ я в л е н и я т и п а, которое может быть неявным. В заключение определим п е р е м е н н у ю в информатике как совокуп- ность трех элементов: идентификатора, типа и значения , ────────────── ──── ──────── где только третий элемент является переменным (однако, в некоторых языках программирования (например, Рапира) тип является переменным!). Заметим, что понятие переменной в информатике о т л и ч а е т с я от понятия переменной в математике! 3. М а с с и в имеет фиксированное имя, фиксированный тип и конечное множество значений. ───────────── ───────────── ────────────────── О б ъ я в л е н и е м а с с и в а уточняет его тип (который может за- даваться неявно), число его измерений и границы каждого измерения. Отметим,что любое объявление массива определяет две категории имен:имя массива в целом и имена для обозначения каждого элемента массива(имена ин- дексируемых переменных).