Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet57/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   ...   53   54   55   56   57   58   59   60   ...   71
Bog'liq
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». Подобное сообщение объясняется тем, что при каждом появлении 
в программе нового описания статического массива компилятор создает 
новый «внутренний» именованный тип, который связывает с описываемой 


Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   ...   53   54   55   56   57   58   59   60   ...   71




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