Пример 2.7. Одновременное использование вещественных и целых типов
Program Mix; var N,K: integer; А,В: real; begin N: =4; A:=3.6; B:=N; {В переменную типа real можно записать целое число} writeln("В=".В); {В переменную типа integer нельзя записать вещественное число! Чтобы все-таки поместить число типа real в переменную типа integer, нужно явно указать, что делать с дробной частью числа. Есть два варианта; } N:=Trunc(A); {Функция Trunc(X) возвращает целую часть числа X, то есть отбрасывает дробную часть} writeln(‘Trunc (3.6)=’,N); K:=Round(A); { Функция Round(X) округляет до ближайшего целого } writeln (‘Round(3.6)=' ,К) ; end.
При запуске программа выведет на экран следующее:
В:= 4.0000000000Е+00 Trunc(3.б)=3 Round(3.6)=4
Еще раз уточним правила преобразования типов: для хранения данных типа integer используется 2 байт, а для real необходимо 6 байт. Это значит, что число типа integer можно поместить в ячейку типа real (целая часть будет равна этому числу, а дробная будет равна нулю). А вот число типа real в ячейку типа integer никак не поместится. Чтобы все-таки поместить его туда, нужно явно указать, что делать с дробной частью числа. Для этого прёдусмотрены функции trunc и round. Обе они возвращают результат типа integer.
Что делать, если в программе нужно записать сложное математическое выражение? В каком порядке будут выполняться действия?
Правила приоритета в выполняемых действиях 1. Действия над переменными, стоящими в скобках, выполняются в первую очередь. 2. После вычисления значений всех скобок вычисляются все функции. 3. После функций выполняются умножение и деление. Они имеют одинаковый приоритет. 4. Следующие по приоритету — сложение и вычитание. 5. Операции одинакового приоритета выполняются слева направо.
Действия над данными разных типов
Сведем воедино операции и функции по работе с вещественными и целыми величинами (табл. 2.3).
Поясним написанное в таблице. Мы разделили все функции/операции на 6 категорий:
1. Результат операций +, - и * зависит от типа аргументов. Если хоть один из них имеет тип Real, то и результат будет иметь тип Real. Это объясняется тем, что у данных типа Real есть дробная часть, а у Integer — нет. Даже если в вещественной переменной хранится целое число, оно все равно имеет дробную часть, только она равна нулю. То есть если хотя бы у одного из аргументов есть дробная часть, то в результате выполнения операции она никуда не исчезает. Поэтому результат тоже имеет дробную часть (Real).
Таблица 2.3.Операции и функции для типов integer и real
Операция/функция
Тип данных 1 -го аргумента
Тип данных 2 -го аргумента
Тип данных результата
+,-,*
Integer Integer Real Real
Integer Real Integer Real
Integer Real
/
He важен
He важен
Real
Div, mod
Только Integer
Только Integer
Integer
Abs, Sqr
Integer
—
Integer
Real
—
Real
Sqrt, Sin, Cos, Arctan, Ln, Exp, Pi
He важен
—
Real
Trunc, Round
He важен
—
Integer
2. Результат операции вещественного деления по определению всегда имеет дробную часть. 3. Операции целочисленного деления определены только для целых чисел. Поэтому результат тоже всегда целое число. 4. Функции Abs и Sqr определены для обоих типов данных. Поэтому тип их результата зависит от типа аргумента. Для целого аргумента результат имеет целый тип, для вещественного — вещественный. 5. Функции Sqrt, Sfn, Cos, Arctan, Ln, Exp, Pi по определению являются вещественными. (На самом деле это связано с особенностями вычисления Паскалем этих функций. Он вычисляет их приближенно путем разложения в ряд. Такой метод не предполагает целого результата в виде целого числа. Более того, значения этих функций всегда вычисляются приближенно.) 6. Функции Trunc и Round предназначены для преобразования типов. Они явно указывают на то, что сделать с дробной частью числа. Поэтому это единственный способ получить на Паскале из дробного числа целое. Изложенные выше сведения позволяют нам понимать, что за выражение написано в чужой программе, какое оно будет иметь значение и какого типа будет результат.
Задание 2.10. Вычислите выражение и укажите тип результата:
Abs(12 mod 7*4/2-350 div 15)+2
Сначала расставим операции в соответствии с их приоритетами (табл. 2.4).
Таблица 2.4. Расстановка операций в примере 2.8
№
Операция
Пояснение
12 mod 7
Сначала выполняются действия в скобках. Скобки в данном случае ограничивают аргумент функции Abs. В скобках сначала выполняются операции типа «умножение-деление», а потом — «сложение-вычитание». Операции mod, и div осуществляют целочисленное деление. Их приоритет такой же, как у операций «*» и </». В первой группе таких операций три. Выполняем их слева направо. Поэтому сначала выполняем mod, затем — «*», а потом — «/»
(12 mod 7)* 4
(12 mod 7*4) /2
350 div 15.
Теперь выполняем вторую группу операций типа «умножение-деление». В данном случае это одинокая операция div
(12 mod 7*4/2) - (350 div 15)
Теперь пришла пора объединить результаты первых двух групп операцией «-». Она выполняется последней в скобках, так как имеет наименьший приоритет
Abs(...)
Теперь пора посчитать результат функции
Abs(...) + 2
Последний оператор — сложение
Нам представляется удобным расставлять приоритеты, обводя операции (рис. 2.8). Так оказывается легче понять, что уже вычислено и что еще предстоит вычислить.
Рис. 2.8. Порядок выполнения операций в задании 2.10.
Теперь определим тип и результаты каждого действия (табл. 2.5).
Таблица 2.5.Вычисление результатов каждого, действия из задания 2.10.
№
Операция
Результат и его тип
Пояснение
12 mod 7
5 Integer
Остаток отделения 12 на 7 равен 5. Результат операции mod всегда целый
5*4
20 Integer
Результат умножения двух целых — целое число
20/2
10.0 Real
Результат вещественного деления всегда вещественный. Хотя 20 делится нацело на 2, мы специально приписали «.0» к результату, чтобы подчеркнуть и не забыть, что результат вещественный и имеет дробную часть
350 div 15
23 Integer
При целочисленном делении нас интересует только целая часть частного. Результат операции div всегда целый
10.0-23
-13.0 Real
При вычитании одно из чисел имеет дробную часть. Команды от нее избавиться не было, поэтому результат тоже имеет дробную часть. Значит, результат имеет тип Real
Abs(-13.0)
13.0 Real
Abs меняет отрицательный знак аргумента на положительный. Так как аргумент имеет, дробную часть, а команды от нее избавиться не было, результат тоже содержит дробную часть
13.0 + 2
15.0 Real
Те же соображения, что и в 5-м пункте. Результат имеет дробную часть
Ответ: 15.0. Real
Задание 2.11. Дано действительное число X. Напишите программу для вычисления: + целой части числа Х, + числа X, округленного до ближайшего целого; + числа X бездробных цифр.
Задание 2.10.1 Вычислите выражение: при a =2 и b = 3