Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
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 этого не делает, и поэтому при ее использовании приходится яв- |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling