Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы программирования

..pdf
Скачиваний:
5
Добавлен:
05.02.2023
Размер:
1.98 Mб
Скачать

71

Константы со строковым типом

Объявление строковой константы содержит максимальную длину строки и ее начальное значение:

Примеры:

Const Heading : String[7] = 'Section'; NewLine : String[2] = #13#10; TrueStr : String[5] = 'Yes';

FalseStr : String[9] = 'No';

Константы со структурным типом

Объявление константы со структурным типом содержит значение каждого из компонентов структуры. Borland Pascal поддерживает объявления констант типов Array, Record, Set и Pointer. Константы типа типизированных файлов и константы массивов и записей, содержащих файловые компоненты, не допускаются.

Константы объектных типов

Объявление константы объектного типа использует тот же самый синтаксис как и объявление константы типа записи. Для компонентов метода нельзя задать начального значения.

Примеры:

Const ZeroPoint : Point = (X : 0; Y : 0);

ScreenRect : Rect = (A : (X : 0; Y : 0); B : (X : 80; Y : 25));

CountField : NumField = (X : 5; Y : 20; Len : 4; Name : Nil; Value : 0; Min : -999; Max : 999);

Константы объектных типов, содержащих виртуальные методы, не должны инициализироваться через обращение к конструктору — такая инициализация производится компилятором автоматически.

Константы указательных типов

При объявлении константы указательного типа обычно используется выражение базового адреса для определения значения указателя. Если вы включаете расширенный синтаксис (с помощью директивы компилятора {$X+}), то типизированная константа типа PChar может быть инициализирована значением строковой константы.

Примеры:

Type Direction = (Left, Right, Up, Down); StringPtr = ^String;

72

NodePtr = ^Node;

Node = Record

Next : NodePtr;

Symbol : StringPtr;

Value : Direction;

End;

Const S1 : String[4] = 'DOWN';

S2 : String[2] = 'UP';

S3 : String[5] = 'RIGHT';

S4 : String[4] = 'LEFT';

N1 : Node = (Next : NIL; Symbol : @S1; Value : Down);

N2 : Node = (Next : @N1; Symbol : @S2; Value : Up);

N3 : Node = (Next : @N2; Symbol : @S3; Value : Right);

N4 : Node = (Next : @N3; Symbol : @S4; Value : Left);

DirectTable : NodePtr = @N4;

Константы процедурного типа

Процедурная константа должна содержать идентификатор процедуры или функции, который совместим с типом константы.

Пример:

Type ErrorProc = Procedure(ErrorCode : Integer);

Procedure DefaultError(ErrorCode : Integer); Far; Begin

WriteLn('Ошибка ', ErrorCode, '.'); End;

Const ErrorHandler : ErrorProc = DefaultError;

Стандартная директива Absolute

Используйте зарезервированное слово Absolute, чтобы объявить абсолютную переменную (которая находится по заданному или абсолютному адресу в памяти).

Синтаксис:

Var идентификатор : тип Absolute сегмент:смещение;

73

или

Var идентификатор : тип Absolute переменная;

Замечания:

Первая форма непосредственно задает адрес (сегмент и смещение) переменной. Оба значения должны быть внутри диапазона $0000..$FFFF

(от 0 до 65,535).

Вторая форма объявления размещает новую переменную поверх существующей переменной (по тому же самому адресу).

Если в списке переменных присутствует слово Absolute, то в данной строке может находиться только одна переменная.

Предостережение:

Используйте первую форму объявления осторожно. Во время работы Windows в защищенном режиме, ваше приложение не может иметь прав доступа к областям памяти вне вашей программы. При попытке обращения к этим областям, выполнение вашей программы, вероятно, будет приостановлено.

Вторая форма объявления абсолютных переменных безопасна для приложений Windows. Память, к которой вы обращаетесь находится внутри области памяти вашей программы.

Пример:

Type VectorTable = Array [0..255] Of Pointer; Var IntVectors : VectorTable Absolute 0:0; CrtMode : Byte Absolute $0040:$0049;

Str : String;

StrLen : Byte Absolute Str;

74

2.5 Бейсик (BASIC)

Имя переменной начинается с латинской буквы, затем одна или несколько букв или цифр в произвольном сочетании.

Вещественные числа занимают 4 байта — двойное машинное слово в экспоненциальном представлении (отдельно кодируется мантисса и порядок), что позволяет хранить числа в диапазоне 10-30 до 10+30, с точностью более 6 десятичных знаков.

Целые переменные и константы отмечаются в наименовании записью справа символа %. Целое число занимает 2 байта — машинное слово, таким образом целое число задается в диапазоне от –32768 до

+32767.

Последний тип — строковые данные, задаваемые строками переменной длины и состоящие из собственно последовательности символов и текущей длины. Длина может меняться от 0 (пустая строка) до некоторого максимального значения (обычно 255). Для указания интерпретатору признак символьной переменной права от имени добавляют знак $ (знак доллар). Значения строковых переменных заключаются в кавычки ("), в некоторых реализациях в апострофы ('). Чаще всего знак апострофа используется как комментарий.

Бейсик не требует предварительного описания типа переменной, а при первом присвоении отводит место в памяти для нее. По умолчанию все числовые переменные равны нулю, а строковые — пустой строке ("").

Массив значений задается оператором DIM. Особенностью языка считается, что индексы массива начинают задаваться с нуля. Таким образом DIM M(10) задает 11 индексов 0..10.

75

2.6 Пролог (Prolog)

Объекты данных

На рис. Приведена классификация объектов данных Пролога. Пролог-система распознает тип объекта по его синтаксической формы. Это возможно благодаря тому, что синтаксис Пролога предписывает различные формызаписи для различных типов объектов данных. В гл. 1 мы уже видели способ, с помощью которого можно отличить атомы от переменных: переменные начинаются с прописной буквы, тогда как атомы

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

объекты данных

простые объекты

структура

константы

переменные

атомы

числа

Рисунок 15 – Объекты данных Пролога.

Атомы и числа.

Вообще же атомы могут представлять собой цепочки следующих символов:

-прописные буквы А, В, …, Z

-строчные буквы а, в, …, z

-цифры 0, 1, 2, …, 9

-специальные символы, такие как + - * / < > = : . & _ ~

Атомы можно создавать тремя способами:

76

(1)из цепочки букв, цифр и символа подчеркивания _, начиная такую цепочку со строчной буквы:

анна nil x 25

x_25 x__y

альфа_бета_процедура мисс_Джонс

сара_джонс

(2) из специальных символов:

<--->

=========>

.:.

::=

Пользуясь атомами такой формы, следует соблюдать некоторую осторожность, поскольку часть цепочек специальных символов имеют в Прологе заранее определенный смысл. Примером может служить :-.

(3)из цепочки символов, заключенной в одинарные кавычки. Это удобно, если мы хотим, например, иметь атом, начинающийся с прописной буквы. Заключая его в кавычки, мы делаем его отличным от переменной:

'Том' 'Южная_Америка' 'Сара Джонс'

Числа в Прологе бывают целыми и вещественными. Синтаксис целых чисел прост, как это видно из следующих примеров: 1, 1313, 0, -97. Не все целые числа могут быть представлены в машине, поэтому диапазон целых чисел ограничен интервалом между некоторыми минимальным и максимальным числами, определяемыми конкретной реализацией Пролога. Обычно реализация допускает диапазон хотя бы от –16383 до 16383, а часто, и значительно более широкий.

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

77

Причина этого кроется в том, что Пролог — это язык, предназначенный в первую очередь для обработки символьной информации. При символьной обработке части используются целые числа, например, для подсчета количества элементов списка; нужда же в вещественных числах невелика.

Переменные

Переменные — это цепочки, состоящие из букв, цифр и символов подчеркивания. Они начинаются с прописной буквы или символа подчеркивания:

Х

Результат Объект2

Список_участников

_х23

_23

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

Лексический диапазон имени — одно предложение. Это значит, что если, например, имя Х15 встречается в двух предложениях, то оно обозначает две разные переменные. Однако внутри одного предложения каждое его появление обозначает одну и ту же переменную. Для констант ситуация другая: один и тот же атом обозначает один и тот же объект в любом предложении, иначе говоря, — во всей программе.

Структуры

Структурные объекты (или просто структуры) — это объекты, которые стоят из нескольких компонент. Эти компоненты, в свою очередь, могут быть структурами. Например, дату можно рассматривать как структуру, состоящую из трех компонент: день, месяц, год. Хотя они и составлены из нескольких компонент, структуры в программе ведут себя как единые объекты. Для того, чтобы объединить компоненты в структуру, требуется выбрать функтор. Например, для даты подойдет функтор дата. Тогда дату 1-е мая 2001 года можно записать так:

дата (1, май, 2001)

78

дата

дата (1, май, 2001)

1

май

2001

функтор

аргументы

Рисунок 16 – Дата — пример структурного объекта.

Все структурные объекты можно изображать в виде деревьев (рисунок). Корнем дерева служит функтор, ветвями, исходящими из него,

— компоненты. Если некоторая компонента тоже является структурой, тогда ей соответствует поддерево в дереве, изображающей весь структурный объект.

Списки

Список — это последовательность, составленная из произвольного числа элементов, например, энн, теннис, том, лыжи. На Прологе это записывается так:

[энн, теннис, том, лыжи]

Однако таково лишь внешнее представление списков. Все структурные объекты Пролога — это деревья. Списки не являются исключением из этого правила. Каким образом можно представить список в виде стандартного прологовского объекта? Мы должны рассмотреть два случая: пустой список и не пустой список. В первом случае список записывается как атом []. Во втором случае список следует рассматривать как структуру, состоящую из двух частей:

(1)первый элемент, называемой головой списка;

(2)остальная часть списка, называемая хвостом. Например, для списка

[энн, теннис, том, лыжи]

энн — это голова, а хвостом является список

[теннис, том, лыжи]

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

.(Голова, Хвост)

79

Поскольку Хвост — это список, он либо пуст, либо имеет свои собственную голову и хвост. Таким образом, выбранного способа представления списков достаточно для представления списков любой длины. Наш список представляется следующим способом:

.(энн, .(теннис, .(том, .(лыжи, []) ) ) )

Видно, что такой способ представления в случае большой глубины вложенности подэлементов в хвостовой части списка может привести к довольно запутанным выражениям. Поэтому в Прологе предусматривается более лаконичный способ изображения списков, при котором они записываются как последовательности элементов, заключенных в квадратные скобки. Программист может использовать оба способа, но представление с квадратными скобками, конечно, в большинстве случаев пользуется предпочтением. Необходимо помнить, что это всего лишь косметическое улучшение и что во внутреннем представлении наши списки выглядят как деревья. При выводе же они автоматически преобразуются в более лаконичную форму.

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

L = [a, b, c]

Тогда можно написать:

Хвост = [b, c] и L = .(a, Хвост)

Для того, чтобы выразить это при помощи квадратных скобок, в Прологе предусмотрено еще одно расширение нотации для представления списка, а именно вертикальная черта, отделяющая голову от хвоста:

L = [a | Хвост]

На самом деле вертикальная черта имеет более общий смысл: мы можем перечислить любое количество элементов списка, затем поставить символ "|", а после этого — список остальных элементов. Так, только что рассмотренный пример можно представить различными способами:

[a, b, c] = [a| [b, c]] = [a, b | [c]] = [a, b, c | []]

Подытожим:

-Список — это структура данных, которая либо пуста, либо состоит из двух частей: головы и хвоста. Хвост, в свою очередь сам является списком.

-Список рассматривается в Прологе как специальный частный случай двоичного дерева. Для повышения наглядности программ в Прологе предусматриваются специальные средства для списковой нотации, позволяющие представлять списки в виде

[ Элемент1, Элемент2, … ]

80

или

[ Голова | Хвост ]

или

[ Элемент1, Элемент2, … | Остальные]