Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet14/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   ...   10   11   12   13   14   15   16   17   ...   71
Bog'liq
Abramyan-Pascal2016-1


Глава 3. Массивы и последовательности 
29 
Для описания одномерного массива достаточно указать ключевые сло-
ва array of и имя типа элементов массива, например: 
var a: array of integer; 
При этом, в отличие от описания статических массивов, не указывает-
ся диапазон индексов, поскольку на этапе описания динамического масси-
ва память для его элементов еще не выделяется.
Аналогичным образом массивы могут описываться в качестве пара-
метров подпрограмм, например: 
procedure p(a: array of integer); 
Для возможности обращения к элементам массива его необходимо 
инициализировать. Именно на этапе инициализации происходит выделе-
ние памяти для элементов массива и ее заполнение начальными значения-
ми. Инициализирующее выражение для массива начинается со слова new, 
используемого в PascalABC.NET для вызова конструктора некоторого 
класса (фактически при инициализации массива вызывается конструктор 
класса Array из стандартной библиотеки платформы .NET; дополнительные 
сведения о классе Array приведены в [1, гл. 8]). После слова new указывает-
ся тип элементов массива и, в квадратных скобках, их количество: 
a := new integer[10]; 
Созданные элементы сразу получают начальное значение, равное ну-
левому значению соответствующего типа (для чисел это целый или веще-
ственный нуль, для символов — символ с кодом 0, для строк и других ссы-
лочных типов данных — нулевая ссылка nil).
Инициализацию массива целесообразно объединить с его описанием. 
При этом, в силу вывода типов (см. п. 1.1), имя типа можно не указывать, 
поскольку компилятор может вывести этот тип по виду инициализирую-
щего выражения, например: 
var a := new integer[10]; 
Элементы динамического массива всегда индексируются от 0 (в отли-
чие от статических массивов, для которых можно указывать диапазон из-
менения индексов). Размер динамического массива (т. е. количество его 
элементов) можно определить с помощью его свойства Length (для обраще-
ния к свойствам используется точечная нотация, например a.Length). Под-
черкнем, что к свойству Length (как и к элементам массива по их индексам) 
можно обращаться только после инициализации массива.
Для динамического массива определены еще два свойства: Low и High, 
определяющие соответственно нижнюю и верхнюю границу диапазона из-
менения индекса. Свойство a.Low всегда возвращает 0, а свойство a.High 
связано с размером a.Length массива соотношением a.High = a.Length – 1. Ин-
тересно отметить, что эти свойства (в отличие от свойства Length) можно 


30 
вызывать даже для неинициализированного динамического массива; в 
этом случае свойство Low будет, как обычно, возвращать 0, а свойство High 
вернет –1. Свойство Low практически не используется; свойство a.High мо-
жет применяться в качестве более краткой альтернативы для выражения 
a.Length – 1 (часто возникающего в заголовке цикла for при переборе эле-
ментов динамического массива). 
Свойства Length, Low и High доступны только для чтения. 
Кроме свойств a.Length, a.Low, a.High для динамического массива a 
можно использовать одноименные функции Length(a), Low(a), High(a), воз-
вращающие те же характеристики массива (размер, нижнюю и верхнюю 
границы индексов). Функции Low(a) и High(a) можно также использовать 
для статических массивов, в то время как функция Length(a) для статиче-
ских массивов не определена. Функция Low(a) для статического массива 
может возвращать значение, отличное от 0. Например, для массива a типа 
array[2..10] of real функция Low(a) вернет значение 2, а функция High(a) — 
значение 10. 
Переменные, связываемые со статическими и динамическими масси-
вами, имеют важные различия, которые проявляются, в частности, при вы-
полнении для них операции присваивания. В данной главе нам не потребу-
ется учитывать эти различия, поэтому мы обсудим их позднее (см. п. 5.1). 
Для вывода элементов массива можно использовать несколько кон-
струкций. Наиболее традиционным является вывод в цикле for: 
for var i := 0 to a.Length - 1 do 
Print(a[i]); 
Обратите внимание на то, что последним допустимым индексом мас-
сива является a.Length – 1; если бы в качестве конечного значения парамет-
ра цикла было ошибочно указано значение a.Length, то при выполнении 
программы произошел бы выход за границы массива. Подобная ошибка 
является очень распространенной; поскольку она может приводить к не-
предсказуемым последствиям при последующей работе программы, в 
PascalABC.NET, как и в большинстве других современных языков про-
граммирования, выполняется автоматическая проверка индексов массивов, 
и при их выходе за допустимый диапазон программа немедленно заверша-
ется с соответствующим сообщением об ошибке. 
Более безопасным (и чуть более коротким) является использование 
свойства a.High: 
for var i := 0 to a.High do 
Print(a[i]); 
Отметим также, что благодаря использованию процедуры Print выво-
димые значения отделяются друг от друга пробелами. Стандартная проце-
дура Write этого не делает, и поэтому при ее использовании приходится яв-


Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   ...   10   11   12   13   14   15   16   17   ...   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling