System/Docu/ru/Integers.odc

Integers

DEFINITION Integers;

	IMPORT Files;

	TYPE Integer = POINTER;

	PROCEDURE Abs (x: Integer): Integer;
	PROCEDURE Compare (x, y: Integer): INTEGER;
	PROCEDURE ConvertFromString (IN s: ARRAY OF CHAR; OUT x: Integer);
	PROCEDURE ConvertToString (x: Integer; OUT s: ARRAY OF CHAR);
	PROCEDURE Difference (x, y: Integer): Integer;
	PROCEDURE Digits10Of (x: Integer): INTEGER;
	PROCEDURE Entier (x: REAL): Integer;
	PROCEDURE Externalize (w: Files.Writer; x: Integer);
	PROCEDURE Float (x: Integer): REAL;
	PROCEDURE GCD (x, y: Integer): Integer;
	PROCEDURE Internalize (r: Files.Reader; OUT x: Integer);
	PROCEDURE Long (x: LONGINT): Integer;
	PROCEDURE Power (x: Integer; exp: INTEGER): Integer;
	PROCEDURE Product (x, y: Integer): Integer;
	PROCEDURE QuoRem (x, y: Integer; OUT quo, rem: Integer);
	PROCEDURE Quotient (x, y: Integer): Integer;
	PROCEDURE Remainder (x, y: Integer): Integer;
	PROCEDURE Short (x: Integer): LONGINT;
	PROCEDURE Sign (x: Integer): INTEGER;
	PROCEDURE Sum (x, y: Integer): Integer;
	PROCEDURE ThisDigit10 (x: Integer; exp10: INTEGER): CHAR;

END Integers.


Модуль Integers реализует абстрактный тип данных Integer для представления целых чисел произвольной точности. Он также содержит наиболее важные арифметические операции для таких чисел и набор операций преобразования. Арифметические операции включают сложение, умножение, возвежение в степень, вычисления частных, разностей и наибольших общих делителей.

Что касается присваивания и параметров процедур, то переменные типа Integers.Integer могут быть использованы тем же образом, что и переменные числовых типов, встроенных в язык. Конечно, чтобы выполнять операции над такими переменными, необходимо вызывать специальные процедуры. "Операторы" +, -, *,  DIV, MOD и т.п. использоваться не могут. То же самое касается и сравнений.

Примечание: Хотя синтаксис языка допускает сравнение двух переменных типа Integers.Integer с помощью оператора "=", результат будет не такой, какого вы могли бы ожидать. Вместо значений произойдет сравнение указателей на объекты, которыми представлены эти значения. Поэтому сравнение может дать результат FALSE, хотя значения переменных равны. Следовательно, используйте вместо оператора "=" функцию Integers.Compare.

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

Пространство, необходимое для представления наименьшего целого такое же, как минимальный размер объекта в вашей реализации Компонентного Паскаля. При работе с большими значениями объем требуемой памяти пропорционален количеству десятичных разрядов в этих числах. Каждая из операций, предоставленных модулем Integers, выделяет память, необходимую для представления ее результата, но никакого дополнительного выделения внутри них происходить не будет (пространство для промежуточных результатов выделяется из стека).

Пример клиентских модулей:
ObxFactdocu	вычисление факториалов
ObxFractdocu	вычисления/упрощения с рациональными числами


TYPE Integer
Непрозрачный
Непрозрачный тип для представления целых чисел произвольного размера. Значения этого типа размещаются в куче. Объем требуемой памяти зависит от числа десятичных разрядов в представлении. Объект неизменяем.

PROCEDURE Long (x: LONGINT): Integer
Long порождает новый Integer из переменной LONGINT.

PROCEDURE Entier (x: REAL): Integer
Entier порождает новый Integer из переменной REAL. Entier выполняет округление подобно функции ENTIER языка Компнентный Паскаль; и та, и другая реализуют floor-функцию.

PROCEDURE Short (x: Integer): LONGINT
Short преобразует значение типа Integer в LONGINT.

Предусловие
MIN(LONGINT) <= x <= MAX(LONGINT)

PROCEDURE Float (x: Integer): REAL
Float преобразует значение Integer в REAL.

Предусловие
MIN(REAL) <= x <= MAX(REAL)

PROCEDURE Sum (x, y: Integer): Integer
PROCEDURE Difference (x, y: Integer): Integer
PROCEDURE Product (x, y: Integer): Integer
PROCEDURE Quotient (x, y: Integer): Integer
PROCEDURE Remainder (x, y: Integer): Integer
PROCEDURE QuoRem (x, y: Integer; VAR quo, rem: Integer)
PROCEDURE Power (x: Integer; exp: INTEGER): Integer
PROCEDURE GCD (x, y: Integer): Integer
PROCEDURE Abs (x: Integer): Integer
Арифметические операции Sum (сложение), Difference (разность), Product (произведение), Quotient (частное), Remainder (остаток), Power (степень), GCD (наибольший общий делитель) и Abs (модуль) определены соответствующим образом. Quotient и Remainder определены в соответствии с правилами Компонентного Паскаля для DIV и MOD. Если необходимо сразу вычислить и частное, и остаток, то для быстродействия вместо вызова отдельных функций следует вызывать процедуру QuoRem. Power требует неотрицательного показателя.

Предусловие (Quotient, Remainder, QuoRem)
y # 0

Предусловие (Power)
exp >= 0

PROCEDURE Compare (x, y: Integer): INTEGER
Сравнивает значения x и y. С этой функцией можно построить все отношения сравнения: для расчета значения выражения (x op y), запишите (Compare(x, y) op 0), где op - одна из =, #, <, <=, >, >=.

Постусловие
x < y
	result < 0
x = y
	result = 0
x > y
	result > 0

PROCEDURE Sign (x: Integer): INTEGER
Знак числа x.

Постусловие
x > 0
	result = 1
x = 0
	result = 0
x < 0
	result = -1

PROCEDURE Digits10Of (x: Integer): INTEGER
Количество десятичных разрядов, необходимое для представления x.
Исключение: для x = 0 результатом будет значение 0.

PROCEDURE ThisDigit10 (x: Integer; exp10: INTEGER): CHAR
Digit10 возвращает отдельный десятичный разряд числа в виде символа.

Предусловие
exp10 >= 0	20

Постусловие
"0" <= result <= "9"
exp10 >= Digits10Of(x)
	result = "0"

PROCEDURE ConvertFromString (IN s: ARRAY OF CHAR; OUT x: Integer)
PROCEDURE ConvertToString (x: Integer; OUT s: ARRAY OF CHAR)
ConvertFromString и ConvertToString используются для чтения Integer из строки / записи Integer в строку. ConvertToString требует, чтобы строка была достаточной длины, чтобы представить Integer.

Предусловие (ConvertToString)
(Sign(x) >= 0) & (LEN(s) >= Digits10Of(x) + 1)
OR
(Sign(x) < 0) & (LEN(s) >= Digits10Of(x) + 2)

PROCEDURE Internalize (r: Files.Reader; OUT x: Integer)
PROCEDURE Externalize (w: Files.Writer; x: Integer)
Internalize и Externalize для чтения из файла / записи в файл.