5. Арифметические операции. Стандартные математические функции

Для арифметических данных, т.е. для числовых констант, переменных и чи­словых функций определены шесть арифметических операций: + сложение - вычитание * умножение / вещественное деление

DIV     целая часть от деления MOD   остаток от деления

Первые четыре операции определены для любых операндов - как целых, так и вещественных, причем результат операции "/" всегда вещественное число, да­же если оба операнда целые. Операции DIV и MOD определены только для це­лых операндов. Кроме того, выделяют унарную операцию "-", которая применя­ется не к двум, а к одному операнду, например: -x.

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

Таблица 2

Правила преобразования типов

Операнды

Byte

ShortInt

Word

Integer

LongInt

Byte

Integer

Integer

Word

Integer

LongInt

ShortInt

Integer

Integer

LongInt

Integer

LongInt

Word

Word

LongInt

Word

LongInt

LongInt

Integer

Integer

Integer

LongInt

Integer

LongInt

LongInt

LongInt

LongInt

LongInt

LongInt

LongInt

Если один операнд выражения имеет целочисленный тип, а второй - вещест­венный, то первый автоматически приводится к вещественному типу и значение выражения будет вещественным. Целые значения можно присваивать вещест­венной переменной, но вещественные значения присвоить целой переменной нельзя! Присваивая значение целочисленной переменной и константе, вы долж­ны следить, чтобы это значение не выходило за пределы диапазона допустимых значений переменной. В языке Паскаль есть возможность явно преобразовать целочисленное значение к любому из целочисленных типов, для этого исполь­зуются стандартные функции с именами Byte, ShortInt, Word, Integer и LongInt. Например, преобразуем переменную типа Word к типу Integer :

VAR x : Word; BEGIN

x:=300;

WRITELN(x,' ',Integer(x));

x:=65535;

WRITELN(x,' ',Integer(x));

END.

Программа выведет:

300 300

65535 -1

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

Арифметическое выражение может содержать любое количество операндов и, соответственно, любое количество операций, которые выполняются в после­довательности, определенной их приоритетом; приоритет операций *, /, DIV, MOD выше, чем операций + и -. Операции одного приоритета выполняются сле­ва направо. Чтобы изменить порядок выполнения операций, вы можете исполь­зовать в выражении круглые скобки. Вычислим, например, частное от деления X на сумму A,B и C :

X/(A+B+C);

Набор встроенных математических функций в языке Паскаль невелик, он включает :

1. Abs(x) - абсолютная величина числа.

2. Int(x) - целая часть вещественного числа.

3. Frac(x) - дробная часть вещественного числа.

4. Trunc(x) - целая часть вещественного числа, преобразованная к типу LongInt.

5. Round(x) - округленное до целого вещественное число, преобразованное к типу LongInt.

6. Sqr(x) - квадрат числа.

7. Sqrt(x) - квадратный корень.

8. Exp(x) - экспонента.

9. Ln(x) - натуральный логарифм.

10. Pi - число пи.

11. Sin(x) - синус.

12. Cos(x) - косинус.

13. Arctan(x) - арктангенс.

Все остальные математические функции можно получить, пользуясь этим основным набором; например: десятичный логарифм - Ln(x)/Ln(10), тангенс -Sin(x)/Cos(x) и т.д. Аргументы функций могут быть любыми арифметическими выражениями и задаются в круглых скобках после имени функции, аргументы функций Sin и Cos выражаются в радианах. Вычислим квадрат синуса 70 граду­сов: Sqr(Sin(Pi/180*70))

Кроме перечисленных выше математических функций Паскаль предоставля­ет еще несколько полезных числовых функций и процедур разного назначения:

14. High (целый тип) - возвращает наибольшее возможное значение данного типа.

15. Low (целый тип) - возвращает наименьшее возможное значение данного типа.

16. SizeOf (тип)

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

17. Random(Range:Word) - возвращает целое случайное число в диапазоне от 0 до Range-1.

18. Random - возвращает вещественное случайное число в из отрезка [0,1].

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

Выведем несколько случайных чисел в диапазоне от 0 до 99: BEGIN

Randomize;

WRITELN(Random(100)); WRITELN(Random(100)); WRITELN(Random(100));

END.

При первом запуске программы она вывела числа 13, 38, 48, при втором за­пуске - 63, 99, 6, при третьем запуске - 23, 87, 92. Это действие процедуры Randomize - поскольку при каждом запуске системное время, которое отсчитыва­ет операционная система DOS, было различным, мы каждый раз получали раз­личные последовательности случайных чисел. Теперь исключим из программы оператор Randomize; и запустим ее несколько раз - каждый раз мы будем полу­чать тройку чисел 0, 3, 86.

Обратите внимание, что процедура используется в операторе вызова, а функция используется в выражении. Запись Random(100); неверна, поскольку Random - это функция, но также неверна и запись WRITELN(Randomize);. Можно считать, что различие между процедурой и функцией состоит в том, что процедура выполняет некоторую последовательность действий, а функция вы­числяет некоторое значение. Заметим, что READ и WRITE - это тоже процеду­ры.

Для работы с внутренним двоичным представлением двухбайтовых целых чисел (типа Word или Integer) существуют функции:

20. Lo(x) - возвращает младший байт аргумента.

21. Hi(x) - возвращает старший байт аргумента.

22. Swap(x) - меняет местами младший и старший байты.

Сделаем отступление о двоичной системе счисления. Все данные в памяти компьютера хранятся закодированными в двоичной системе. Любая переменная занимает целое число байтов, а каждый байт есть последовательность из 8 дво­ичных цифр - битов. Например, значение переменной типа Byte, равное 11, хра­нится как последовательность битов 0000 1011, а если переменная имеет тип Word, то ее значение кодируется как 0000 0000 0000 1101. 1024 байта (или 2 в 10-й степени) имеют свое название - 1К байт, иногда эту величину также назы­вают килобайт; 1024 К байт называют мегабайт. Пусть переменная t типа Word имеет значение 40000, или 1001 1100 0100 0000 в двоичной системе, тогда функ­ция Lo(t) возвратит 64 ( = 0100 0000 ), функция Hi(t) возвратит 156 (= 1001 1100) и функция Swap(t) возвратит 16540 ( = 0100 0000 1001 1100 ).

Для целочисленных переменных определены процедуры:

23. Inc(x) Inc(x,d)

24. Dec(x)

Dec(x,d).

Здесь x - имя переменной, d - любое целочисленное выражение. Процедура Inc увеличивает значение переменной на d, а процедура Dec - уменьшает на d; второй аргумент этих процедур можно не задавать, тогда он будет принят рав­ным 1. Например, вместо операторов a:=a+3; b:=b-1; c:=c+a+b; мы могли бы напи­сать Inc(a,3); Dec(b); Inc(c,a+b); , и такой способ записи был бы предпочтительней.