Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2- Введение в программирование.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
753 Кб
Скачать
☆

Математические функции

ABS(X) – возвращает абсолютное значение аргумента Х (Х – целое/вещественное, результат – как у аргумента);

Pi – значение числа «Пи» (результат – вещественный); точность зависит от наличия сопроцессора (соответственно, 10 либо 14 знаков после запятой); может использоваться в вычислениях как константа, но не может быть подставлена в вычисляемые константы раздела Const;

SQR(X) – возвращает квадрата Х (Х – целое/вещественное, результат – как у аргумента);

SIN(X), COS(X), ArcTan(X) – возвращают значения синуса, косинуса и арктангенса (угол в радианах) (Х – целое/вещественное, результат – вещественное); ArcTan возвращает главное значение в диапазоне от –Pi/2 до Pi/2.

SQRТ(X) – возвращает квадратный корень из Х (Х > 0 – целое/вещественное, результат – вещественное);

EXP(X), LN(X) – возвращает экспоненту или натуральный логарифм Х (Х – целое/вещественное, результат – вещественное);

FRAC(X) – дробная часть числа Х (Х – целое/вещественное, результат – вещественное);

INT(X), TRUNC(X) – целая часть числа Х (Х – целое/вещественное, результат – у int – вещественный (т.е. после точки нули), - у trunc – целый:LongInt) {такая двойственность бывает полезна в операторах присваивания};

ROUND(X) – округление Х до ближайшего целого (Х – целое/вещественное, результат – целое:LongInt);

RANDOM(X) – возвращает случайное целое число из диапазона от 0 до Х (X и результат – Word);

RANDOM – возвращает случайное число от 0 до 1 (результат – вещественный);

ODD(X) – возвращает True, если Х – нечетное число, и False, если Х - нечетное (Х – целое, результат – логический).

Математические процедуры

RANDOMIZE – процедура гарантирует несовпадение последовательностей случайных чисел, выдаваемых функцией Random.

INC(var X : целое), DEC(var X : целое) – увеличивает или уменьшает значение Х на 1;

INC(var X : целое; N : целое), DEC(var X : целое; N : целое) – увеличивает или уменьшает значение Х на N;

Пример,

X := 2;

INC(X,4);

дает в результате Х = 6.

Структурированные типы

Любой из структурированных (агрегативных) типов характеризуется множественностью образующих этот тип элементов, т.е. переменная или константа такого типа всегда имеет несколько компонентов. Каждый компонент может в свою очередь принадлежать структурированному типу, что позволяет говорить о возможной вложенности типов. В ТР допускается произвольная глубина вложенности типов, однако, суммарная глубина любого из них во внутреннем представлении не должна превышать 65520 байт.

Массивы

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

<имя типа> = array [ <список инд. типов> ] of <тип>

<список инд. типов> – список из одного или нескольких индексных типов, разделенных запятыми, весь список заключен в квадратные скобки. В качестве индесксных типов можно использовать любые порядковые типы, кроме LongInt и типов диапазонов с базовым типом LongInt. Например,

Type

Vector = array [1..3] of Real; {инд. тип – тип-диапазон}

Var

R,V : Vector;

Определить переменную как массив можно и без предварительного описания типа массива, т.е.

Var

R,V : array [1..3] of Real;

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

Т.к. тип элементов массива (за словом of) – это любой тип ТР, то он может быть в частности, и другим массивом.

Type

Matrix = array [0..5] of array [-2..2] of array [Сhar] of Real;

Такой 3-х мерный массив может быть записан более компактно

Type

Matrix = array [0..5,-2..2,Сhar] of Real;

Доступ к элементу массива осуществляется через запись индекса в квадратных скобках после записи имени массива. Т.е.

Var

m: Matrix;

Begin

…

m[1,0,’d’] := 5; {обе записи - допустимы}

m[1][0][‘n’] := 6;

End.

В ТР можно одним оператором присваивания передать все элементы одного массива другому массиву того же типа.

Var

a,b : array [1..5] of Real;

Begin

…

a := b;

End.

После этого присваивания все элементы массива а получат значения соответствующих элементов массива b.

Операции отношения к массивам не применимы. Т.е. оператор

if a = b then …

неверен. Следовательно, сравнивать массивы можно лишь поэлементно.

ТР имеет специальный режим компиляции, относящийся к массивам и задаваемый ключом {$R}. Если вся программа или ее фрагмент компилировался в режиме {$R+}, то при обращении к элементам массива будет проверяться принадлежность значения индекса объявленному диапазону, и в случае нарушения границ будет выдано сообщение об ошибке (201 – Range check Error). В режиме {$R-} никаких проверок не производится и некорректное значение индекса извлечет из памяти некое значение, не относящееся к данному массиву. Обычно отлаживают программу в режиме $R+, а эксплуатируют – в режиме $R- для уменьшения исполняемого exe-файла и времени его выполнения.

Записи

Запись – это структура данных, состоящая из фиксированного числа компонентов, которые называются полями записи. В отличие от массива, компонетны (поля) записи могут быть различного типа. Поля имеют свои имена. Тип «запись» задается следующим образом:

<имя типа> = record <список полей> end

<список полей> - последовательность разделов записи, между которым ставится точка с запятой. Каждый раздел состоит из одного или нескольких имен полей, отделяемых друг от друга запятыми. Следом на именами ставится двоеточие и описание типа поля (полей). Например,

Type

Data = record

X,Y : integer;

Z : char

end;

Var

D1,D2 : Data;

Begin

…

D1.X := 10;

D2.Z := ‘n’;

…

End.

Обратиться к полю записи можно указав сначала идентификатор переменной-записи, а затем через точку – имя поля (на примере). Независимо от количества объявленных переменных данного типа, поля каждой из них будут называться одинаково (D1.X, D2.X). Кроме того, поскольку имена полей «скрыты» внутри переменной, они могут дублировать обычные перменные (X и D1.X).

Альтернатива введению специального типа состоит в описании записи непосредственно в разделе Var.

Переменная типа запись может участвовать в операциях присваивания, если они относятся к одному и тому же типу: D1 := D2;

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

Var

D : record

X : integer;

R : record

RX : integer;

RZ : char

end

end;

Begin

…

D.R.RX := 2;

…

End.

Чтобы упростить доступ к полям записи, используется оператор присоединения WITH со следующим форматом:

with <имя переменной-записи> do <оператор>

Внутри оператора (стоит после do, может быть составным) обращение к полям записи уже производится без указания идентификатора самой переменной. Например,

with D do

begin

R.RX := 2; R.RZ := ‘f’;

end;

ЗАПИСИ С ВАРИАНТАМИ

В ТР можно использовать запись с т.н. вариантными полями. Например,

Var

D : record

X : integer;

case V: boolean of

True : (Y_one : integer);

False : (Y_two : array [1..4] of real)

end;

Здесь поле Х – фиксированно. Второе поле V – это поле признака, которое может иметь два значения True и False. Третье поле будет иметь разные варианты в зависимости от значения поля V (либо D.Y_one либо D.Y_two). Вариантное поле м.б. только одно, записывается в конце. В любое время доступны поля только одного из вариантов.

Записи можно считать некоторой ступенью к структурам типа объектов.