Присваивание значений сложных типов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Присваивание значений сложных типов



Подобные длинные цепочки вложений конструкций разных типов друг в друга

могут свободно использоваться в выражениях Паскаля наравне с обычными

переменными. От них они, впрочем, ничем и не отличаются — разве что формой

записи. При этом можно копировать не только значения самых простых (базовых)

типов наподобие Integer или Real, но и значения массивов и структур в одном опе-

раторе присваивания, Надо только, чтобы типы и правой, и левой частей оператора

присваивания совпадали.

type TAr - array[1..1000] of Byte;

TRc = record

Ar: TAr;

Count: integer;

end;

var А: ТДг;

R: TRc;

Begin

A:= R.Ar;

R.Ar:= A;__

Инициализация констант сложных типов

Часто требуется использовать в работе константы не только базовых типов, но и

константы сложных типов (массивы, записи). Например, таблицы всевозможных

начальных значений и параметров удобно размещать в массивах.

Инициализация массивов

Значения массива располагаются последовательно в круглых скобках. Если изме-

рений у массива более одного, то измерения вкладываются друг в друга, начиная

54 Урок 1. Язык Delphi (Object Pascal) и ею использование

с младших измерений (справа налево, если смотреть на описание массива). На-

пример, если создан тип

type Tl = array[1..2, 1..5] of byte;

то в первую очередь надо сформировать значения для диапазона 1..5. Таких после-

довательностей из 5 чисел требуется две — в соответствии с размером диапазона

первого измерения.

Записывается константа сложного типа так:

const Т: Т1 =

((1, 2, 3, 4, 5), (100,200,300,400,500)];

ВНИМАНИЕ Число элементов при инициализации массива должно в точности

равняться его размеру (произведению длин всех измерений).

Инициализация записи

Форма инициализации записи отличается от формы инициализации массива тем,

что приходится дополнительно указывать названия элементов, а за ними через

двоеточие — значения. Разделяются такие конструкции точками с запятой.

type T2 =

record

Name: str-ing;

Num: integer;

end,-

const TT: T2 = (Name:'первый'; Num:l|;

)

Инициализация указателей

Указатель инициализируется значением адреса ранее описанной переменной.

var N: Integer;

const PI: ~Integer = @H;

const constPStr: PChar = 'нуль-строка';__

Каждая программа использует при работе память (*). Память занимает любая переменная в вашей программе. Будь это форма, компонент, массив, запись, строка или же простой Integer. Под некоторые переменные память выделяется автоматически (например, под переменные типа Integer и статические массивы), под другие - вы должны выделять её сами, явно (например, динамические массивы). Собственно, с точки зрения операционной системы каждая переменная характеризуется адресом в памяти (местоположением) и размером. Понятно, что обычно данные разных переменных не пересекаются - за исключением случаев обращением к одной области памяти через разные имена с помощью указателей.

Грубо говоря, обычно в программе используется три типа памяти: область памяти для глобальных переменных, стек и куча.

Память для глобальных переменных выделяется загрузчиком ОС при загрузке исполняемого модуля программы в память и освобождается при выгрузке модуля (выходе из программы). Глобальные переменные - это любые переменные, объявление которых располагается вне класса или процедуры. Стек используется для размещения локальных переменных (объявленных в процедуре/функции) и служебных данных (типа адресов возврата и адресов обработчиков исключений). Куча же используется для размещения динамических данных.

Заметим, что для переменных динамических типов данных (динамические массивы, строки, любые объекты, компоненты), хотя сама переменная может размещаться в области для глобальных переменных или в стеке (а, значит, память для неё выделяется автоматически), но данные, на которые она указывает, всегда размещаются в куче и, зачастую, должны управляться вручную.

Вне зависимости от того, кто выделяет память для переменной (вы вручную или компилятор автоматически), память для любой переменной должна быть выделена перед использованием, а потом, когда переменная уже не будет нужна - освобождена.

8. Массивы в Delphi. Способы задания массивов. Обращение к элементам массива в выражениях.

Структурные типы данных

Обойтись только простыми — линейными типами в большой программе довольно

сложно. Желательно, чтобы структура данных прикладной программы отвечала

структуре данных решаемой задачи. Для этого в Паскале есть набор структурных

типов данных.

Массивы

Массив — это структура данных, доступ к элементам которой осуществляется по

номеру (или индексу). Все элементы в массиве имеют одинаковый тип. Индекс

элемента массива может быть вычисляемым, что позволяет организовывать ком-

пактную и эффективную обработку больших наборов данных.

Описание массива имеет вид:

type имя-типа-маесива = array[ диапазон ] of тип-элемента;

В КВАДРАТНЫХ СКОБКАХ ПИШЕТСЯ ТИП ИНДЕКСА,который в свою очередь должен быть порядковым типом!!!

Слова array (массив) и of — ключевые. Диапазон определяет нижнюю и верхнюю

границы массива и, соответственно, число элементов в нем. При обращении к мас-

сиву индекс должен лежать в этом диапазоне. Тип элемента определяет тип каж-

дого элемента массива.

Массив из 100 элементов целого типа (первый элемент будет иметь номер 1, послед-

ний — номер 100) описывается в программе так:

type TMyArray = array[ 1..100 ] of'integer;

При задании диапазона могут выступать не только числовые значения:

type TMyArray = array[ TMyTeams ] of string;

Таким способом определяется тип, описывающий массив из трех строк. При обра-

щении к первой строке индекс должен иметь значение С5КА (самое маленькое зна-

чение из диапазона TMyTeams), а при обращении к третьей строке — значение

Locomotive.

Доступ к элементу массива описывается путем указания имени переменной соот-

ветствующего типа вместе со следующим за ней в квадратных скобках индексом.

В качестве индекса может выступать произвольное выражение Паскаля, значение

которого должно укладываться в диапазон, указанный при описании массива.

Например:

type TMyArray = array[ 1..100 ] of integer;

var MyArray: TMyArray;

N: integer;

begin

N:= 50;

MyArray[ 1 ]:= 100,-

Му Array[ К ]:= MyArray[ N+l ] * 2;

MyArray[ N+12 ]:= N div 4;

Определение собственных типов данных 4 1

Другой пример:

type TMyArray = array] TMyTeams ] of string;

var Teams: TMyArray;

begin

Teams[ CSKA ]:= 'это ЦСКА';

Teams[ Dynamo ]:= 'это Динамо';

Teams[ Locomotive ]:= 'это Локомотив';

Вместо создания в программе нового типа на основе описания массива можно явно

декларировать переменную как массив с помощью ключевого слова van

var Teams: array[ TMyTeams ] of string;

Хотя такой подход использовать не рекомендуется. Дело в том, что при этом методе

описания, даже когда две переменные внешне описаны одинаково, в Паскале они

считаются относящимися к разным типам. Б таком случае присваивать их значения

(весь массив) друг другу в одном операторе присваивания не разрешается.

var Tl: array[ TMyTeams ] of string;

T2: array[ TMyTeams ] of string;

begin

Tl:= T2,- // неправильно!

Чтобы разрешить копирование массивов, надо переменные описать как имеющие

один тип:

type TMyArray = array! TMyTeams ] of string;

var Tl: TMyArray;

T2: TMyArray;

begin

Tl:= T2; // правильно!

Массив может иметь несколько измерении, перечисляемых через запятую.

аггау[ -5..10, 0.. 2 ] of'byte;

Каждое измерение характеризуется своим диапазоном, тип которого может не сов-

падать с типами диапазонов других измерений. Например, если требуется описать

массив дробных чисел с тремя измерениями, первое из которых охватывает диапа-

зон целых чисел от 1 до 10, второе — диапазон значений от False до True (Boolean), a

третье — диапазон TMyTeams, то выглядеть это будет так:

tyjtp<e THewArray = J

array[ 1.. 10, boolean, TMyTeams ] of real;

При доступе к элементам массива значения индексов также перечисляются через

запятую:

var AA: TNewArray;

begin

АА[ 5, true, CSKA) = 3.14;

42 Урок 1. Язык Delphi (Object Pascal) и его использование

Строковые данные формально представляют собой массивы символов, и к элемен-

там строк можно обращаться с помощью индексов. Это позволяет выделять конкрет-

ные символы и менять их значения. Отсчет символов для переменных типа string

начинается с единицы.

var S: string,-

begin

S:= '54321';

S[5]:= '0'; //в строке окажется значение '54320'

Однако явно описывать строки как массивы символов вместо использования клю-

чевого слова string неправильно. Единственное отличие — строки, заканчивающи-

еся нулевым символом. Их можно описывать в программе как массивы символов,

первый элемент которых имеет номер 0. При занесении значений в такие перемен-

ные в конце строки надо указывать символ с кодом 0:

var SO: array[ 0.. 5 0 ] of char;

begin

SO:= 'строка с нулем'#О;



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 198; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.1.158 (0.022 с.)