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

С. А. Григорьев

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

+ сложение

– вычитание

* умножение

/ вещественное деление

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

MOD остаток от деления

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

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

Таблица 2

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

ОперандыByteShortIntWordIntegerLongInt
ByteIntegerIntegerWordIntegerLongInt
ShortIntIntegerIntegerLongIntIntegerLongInt
WordWordLongIntWordLongIntLongInt
IntegerIntegerIntegerLongIntIntegerLongInt
LongIntLongIntLongIntLongIntLongIntLongInt

Если один операнд выражения имеет целочисленный тип, а второй – вещественный, то первый автоматически приводится к вещественному типу и значение выражения будет вещественным. Целые значения можно присваивать вещественной переменной, но вещественные значения присвоить целой переменной нельзя! Присваивая значение целочисленной переменной и константе, вы должны следить, чтобы это значение не выходило за пределы диапазона допустимых значений переменной. В языке Паскаль есть возможность явно преобразовать целочисленное значение к любому из целочисленных типов, для этого используются стандартные функции с именами 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); , и такой способ записи был бы предпочтительней.

С. А. Григорьев

6. Символьный тип данных

Для хранения символьной информации в Паскале предусмотрен специальный тип данных Char. Допустимы переменные, нетипизированные и типизированные константы такого типа. Данные типа Char занимают 1 байт памяти. Неименованные символьные константы записываются в программе либо в виде ‘символ’, либо в виде #номер. Все имеющиеся символы пронумерованы от 0 до 255, символы с 0-го по 31-й – невидимые, как правило, они не отображаются на экране, 32-й символ – это пробел. Приведем также номера некоторых других символов (хотя помнить эти номера нет никакой необходимости):

‘0’…’9′ – 48…57,

‘A’…’Z’ – 65…90,

‘a’…’z’ – 97…122,

‘А’…’Я’ – 128…159,

‘а’…’п’ – 160…175,

‘р’…’я’ – 224…239.

Некоторые из невидимых символов могут оказаться вам полезны: символ #7 – “звуковой сигнал”, при выводе пищит; символ #10 – “конец строки”, при выводе он перемещает текущую позицию вывода на одну строку вниз; символ #13 – “возврат каретки” – перемещает текущую позицию вывода в начало текущей строки. Запомните, что клавиша Enter генерирует два символа – #10 и #13, это может вам впоследствии пригодиться.

Символьные данные можно вводить и выводить процедурами READ и WRITE при вводе и выводе символьные значения изображаются без апострофов. Для символьных величин определены функции:

25. Ord(c) – возвращает номер символа.

26. Pred(c) – возвращает символ с номером, меньшим на 1.

27. Succ(c) – возвращает символ с номером, большим на 1.

Эти функция, однако, определены не только для символов, но для любого порядкового типа данных. Порядковым типом называется такой тип, все допустимые значения которого можно пронумеровать от 0 до некоторого N (в математике к этому понятию близко понятие счетного множества). Из известных нам типов порядковыми являются все целочисленные типы: Byte, ShortInt, Word, Integer, LongInt – и не являются порядковыми все вещественные типы. Значение функции Ord от числового аргумента равно самому этому аргументу, Pred(x) дает значение x-1, а Succ(x) – значение x+1. Функция

28. Chr(n).

В некотором смысле обратна функции Ord : для заданного числового аргумента n она возвращает символ с соответствующим номером. Для символьных переменных (так же, как и для любых переменных порядкового типа) определены процедуры Inc и Dec. Еще одна специфически символьная функция:

29. UpCase(c).

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

Напишем простую программу, обрабатывающую символьные величины.

VAR c : Char; n : Byte;

CONST Blank =’ ‘; Space:Char =Blank;

BEGIN WRITE(‘введите какой-нибудь символ ‘); READ(c);

WRITELN(‘вы ввели символ’,Space, c,Space,’его номер=’,Ord(c));

WRITELN(‘соседниеснимсимволы :’,Space, Pred(c),Space,

‘и’,Space, Succ(c));

WRITELN(‘UpCase(‘,c,’)=’,UpCase(c)); WRITELN;

Space:='”‘; WRITE(‘теперь введите число от 33 до 255 ‘); READ(n);

WRITELN(‘символсномером ‘,n,’ – это ‘,Space, Chr(n),Space);

WRITELN;

END.


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