- •2.2. Основные элементы и конструкции языка
- •2.2.2. Алфавит, слова, комментарии
- •Данные
- •Целочисленные типы
- •Логические типы
- •Вещественные типы
- •Массивы
- •Совместимость типов
- •Выражения и операции
- •Арифметические выражения и операции
- •Поразрядные операции
- •Логические операции и выражения
- •Операции со строками
- •Приоритеты операций
- •Операторы
- •Простые операторы
- •Операторы ввода и вывода.
- •Структурные операторы
- •Условные операторы
- •Операторы цикла
- •Структура Паскаль программы
- •Функции и процедуры
- •Процедуры
- •Функции
- •Параметры процедур и функций
- •Модули
- •Общая структура модуля
- •Компиляция и использование модулей
- •Стандартные модули
- •Работа с файлами
- •Общие правила работы с файлами.
- •Текстовые файлы
- •Примеры задач
Tип1 является вещественным типом, а Tип2 является целочисленным типом;
Tип1 и Tип2 являются строковыми типами;
Tип1 является строковым типом, а Tип2 является символьным типом (Char);
На этапе компиляции и выполнения выдается сообщение об ошибке, если совместимость по присваиванию необходима, а ни одно из условий предыдущего списка не выполнено.
Выражения и операции
Описание обработки данных программой содержится в выражениях, состоящих из операндов, связанных между собой знаками операций. Операнды могут быть константами, простыми переменными, элементами массивов и результатами выполнения функций.
В Паскале определены в зависимости от количества и типа операндов (данных, участвующих в операции) следующие виды операций:
унарные
бинарные (в которых участвуют два операнда);
поразрядные операции (операции над битами);
отношений (сравнение двух операндов);
логические (операции над логическими операндами);
операции над строками.
Арифметические выражения и операции
В Паскале предусмотрены следующие математические операции
Обозначение |
Содержание операции |
+ |
сложение |
- |
вычитание |
* |
умножение |
/ |
деление |
div |
деление нацело (отбрасывание дробной части) |
mod |
взятие остатка при делении |
Следует отметить, что применение операции деления приводит к вещественному результату и не применимо для выражений целого типа.
Этот набор арифметических операций существенно расширяется за счет стандартных функций, которые дают вещественный результат, как при вещественном, так и целом аргументе:
sin(x) − тригонометрический синус (аргумент задается в радианах); cos(x) − тригонометрический косинус;
arctan(x) – арктангенс (возвращает результат в радианах); ln(x) – натуральный логарифм (по основанию е); exp(x) – экспонента (ех);
sqrt(x) – квадратный корень из х.
abs(х) – абсолютная величина х (модуль числа); sqr(x) – квадрат значения х;
Стандартные функции abs(x) и sqr(x) при вещественном аргументе вырабатывают вещественный результат, а при целом целый.
Следует заметить, что в Паскале не предусмотрено стандартной функции возве-
42
дения в степень. Для возведения числа в целую не отрицательную степень необходимо перемножить основание само на себя необходимое число раз, а в нецелую - произвести вычисление по формуле exp(a*ln(x)) {X в степени а}.
Поразрядные операции
Для описания действий над битами в Паскале имеются следующие операции:
Операция |
Описание |
shl |
сдвигает биты влево на указанное число позиций, заполняя оставшиеся |
справа разряды нулями; |
|
shr |
сдвигает биты вправо на указанное число позиций, заполняя оставшие- |
ся слева разряды нулями; |
|
and |
выполняет логическое and (и) над парой битов, возвращает 1, если оба |
бита 1 и 0 в противном случае; |
|
or |
выполняет логическое or (или) над парой битов, возвращает 0, если оба |
бита равны 0 и 1 в противном случае; |
|
xor |
выполняет логическое исключающее "или" над парой битов, возвраща- |
ет 1, если биты имеют разное значение и 0 в противном случае; |
|
not |
операция логического дополнения бита - заменяет 0 на 1 и обратно. |
Эти операции выполняют действия на битовом уровне только с целочисленными значениями.
Логические операции и выражения
Логические выражения чаще всего используются в условных операторах и циклах с условием, но также, могут использоваться в операторах присваивания. Они всегда имеют булевый тип (могут принимать только два значения True или False) и составляются из операций отношения и логических операций.
Операции отношений сравнивают два значения, возвращая в результате значение True или False. В Паскале реализуются следующие операции отношений:
> |
больше; |
>= больше или равно; |
< |
меньше; |
<= меньше или равно; |
= |
равно; |
<> не равно; |
in |
есть элемент. |
|
Логические операции. В Турбо-Паскале определены четыре логические операции: and, xor, or, not. Эти операции работают со значениями логического типа, позволяя создавать сложные (комбинированные) выражения, содержащие операции отношений, булевы переменные и булевы выражения.
В следующей таблице приведены результаты работы выражений использующие логические операции
Значения операндов |
Результат бинарной логической операции |
|||
Операнд1 |
Операнд2 |
and |
or |
xor |
True |
True |
True |
True |
False |
True |
False |
False |
True |
False |
False |
True |
False |
True |
False |
False |
False |
False |
False |
True |
Между логическими операциями и поразрядными операциями имеют место следующие различия:
логические операции возвращают результат True или False (булево значение), в
43
то время как поразрядные операции возвращают битовые значения;логические операции не позволяют комбинировать булевы и целые выражения;
другими словами, выражение Flag and Index недопустимо, если Flag имеет булев тип, а Index целый (или наоборот).
Примеры логических выражений:
X<20.2 X<=Xmax P<>0.0 (X<=(20+N))and(X>=(50+N))
Not(CanExit and (C<>0)) {CanExit : Boolean} (A<0)and(B>2)
Следует заметить, что запись предыдущего выражения в виде (A<0 and B>2) неверна т.к. операция and имеет более высокий приоритет, чем операции сравнения. Вначале будет вычислена побитовая операция 0 and B, а затем <, что приведет к ошибке, т.к. A<(0 and B) имеет тип Boolean, а в операциях сравнения допускаются только переменные одинаковых типов.
Сравнение вещественных чисел. Поскольку значения вещественного типа являются приблизительными, результат сравнения значений различного вещественного типа не всегда можно предсказать.
Например, если Х - переменная вещественного типа с одинарной точностью, а Y - переменная вещественного типа с двойной точностью, то результатом выполнения следующих операторов будет значение False:
X := 1/3;
Y := 1/3; Writeln(X = Y);
Причина этого состоит в том, что Х имеет точность только до 7-8 цифр, а Y - точность до 15-16 цифр, и когда оба значения преобразуются к типу с повышенной точностью, то после первых 7-8 цифр остальные цифры будут различаться. Аналогично, результатом выполнения операторов:
X := 1/3; Writeln(X = 1/3);
будет значение False, результат 1/3 в операторе вывода Writeln вычисляется с точностью до 20 значащих цифр.
Операции со строками
Над строками определена единственная операция "+" , которая выполняет конкатенацию двух строк (объединение содержимого двух объектов строкового типа).
Все остальные действия над строками осуществляются с помощью функций, описанных в руководстве по языку.
Приоритеты операций
С помощью рассмотренных выше операций подлежащие обработке данные различного типа объединяются в выражения в соответствии с заданным алгоритмом вычислений. В образующихся в результате сложных выражениях порядок выполнения операций определяется правилами приоритета.
Приоритеты операций
Операция |
Приоритет |
Категория операции |
@, not |
Первый (высший) |
Унарные |
*, /, div, mod, and, shl, shr |
Второй |
Мультипликативные |
+, -, or, xor |
Третий |
Аддитивные |
=, <>, <, >,<=, >=, in |
Четвертый (низший) |
Отношения |
Операции равного приоритета выполняются слева направо, хотя компилятор мо-
44