Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
10 29 33 84 40 59 52 53
(10,29) (29,33) (33,84) (84,40) (40,59) (59,52) (52,53) (10,29) (33,84) (40,59) (52,53) Последний из вспомогательных запросов WriteLines тоже связан с вы- водом данных. Он позволяет записать все элементы строковой последова- тельности (sequence of string) в текстовый файл; имя файла fname указывает- ся в качестве единственного параметра запроса. При использовании этого запроса все действия по созданию файла, записи в него данных и закрытию выполняются автоматически. Запрос возвращает исходную последователь- 92 ность в неизменном виде, что позволяет использовать его (как и запросы Print/Println) в середине цепочки запросов. Глава 5. Дополнительные средства обработки массивов 93 Глава 5. Дополнительные средства обработки массивов В главе 3 мы познакомились со средствами языка PascalABC.NET, обеспечивающими генерацию, ввод и вывод динамических массивов. Что касается их обработки и преобразования, то в нашем распоряжении к настоящему времени имеется стандартная операция индексирования (и ее расширение, позволяющее создавать срезы), метод Length, позволяющий определить размер массива (и методы Low и High, определяющие диапазон его индексов), процедура Reverse, а также весь арсенал запросов, описан- ных в главе 4, поскольку массив может рассматриваться как последова- тельность. Однако для динамических массивов в PascalABC.NET предусмотрен еще ряд возможностей, реализованных в виде методов, операций и проце- дур. Большинство из этих возможностей мы рассмотрим в данной главе. Для их иллюстрации мы будем использовать, наряду с фрагментами обыч- ных программ, задачи группы Array из электронного задачника Program- ming Taskbook (см. главу 2). 5.1. Особенности присваивания статических и динамических массивов. Копирование и объединение динамических массивов При работе с динамическими массивами необходимо учитывать, что они являются ссылочными типами данных, как и большинство типов в PascalABC.NET 5 . Это означает, что переменная, описанная как динамиче- ский массив, фактически содержит только адрес того участка памяти, ко- торый выделен для хранения элементов массива и дополнительной инфор- мации о нем (в эту информацию входит, например, размер массива). Именно поэтому подобную переменную можно описать еще до того, как память для массива будет выделена: var a: array of integer; 5 Среди немногочисленных стандартных типов, не являющихся ссылочными (они называются размерными), следует упомянуть все числовые типы, а также boolean и char. 94 В результате такого описания переменная a будет содержать значение nil (пустой адрес), означающее, что с ней еще не связан никакой «реаль- ный» массив. Только инициализация переменной a с помощью конструк- ции new integer[10] (или другим способом, например с применением функ- ции-генератора) обеспечивает ее связь с существующим массивом. В про- тивоположность этому описание переменной как статического массива (например, var s: array[1..10] of integer) сразу выделяет для этого массива па- мять (размер которой определяется указанным диапазоном индексов) и связывает всю эту память с описываемой переменной. Отмеченные различия существенным образом влияют на смысл опе- рации присваивания, выполняемой для статических и динамических мас- сивов. Для статических массивов присваивание вида a := b возможно только в случае, если переменные a и b описаны с применением общего описателя массива или если для них использован один и тот же именованный тип. Например, можно описать массивы таким образом: var a, b: array[1..10] of integer; … b := a; // допустимое присваивание Можно описать массивы и по отдельности, но для их совместимости по присваиванию необходимо в этом случае ввести новый тип (который требуется определить в разделе описаний): type intArray = array[1..10] of integer; begin var a: intArray; var b: intArray; … b := a; // допустимое присваивание В любом случае в результате присваивания вида a := b произойдет ко- пирование значений всех элементов массива a в элементы массива b с теми же индексами. Если же попытаться откомпилировать следующий фрагмент, то про- изойдет ошибка компиляции: var a: array[1..10] of integer; var b: array[1..10] of integer; b := a; // ошибка компиляции При этом сообщение об ошибке будет иметь следующий «странный» вид: «Нельзя преобразовать тип array [1..10] of integer к array [1..10] of integer». Подобное сообщение объясняется тем, что при каждом появлении в программе нового описания статического массива компилятор создает новый «внутренний» именованный тип, который связывает с описываемой |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling