Арифметические выражения Основные сведения
Каждое выражение имеет тип. Выражение называется арифметическим, если его тип — числовой. Выражение строится посредством операций (унарных или бинарных) и операндов.
В арифметических выражениях если a и b — одного типа, то и a op b принадлежит к тому же типу. Исключением является операция "/":
a / b — вещественное.
Если a и b принадлежат к различным типам, то выражение принадлежит к "старшему" типу. Например:
byte < integer < int64
integer < real
В арифметические выражения могут входить стандартные функции:
exp(x)
ln(x)
abs(x) // модуль x
sin(x)
cos(x)
sqr(x) // квадрат x
sqrt(x) // корень из x
min(x,y)
max(x,y)
pow(x,y)// x в степени y
Порядок выполнения операций в арифметических выражениях
Операции с большим приоритетом выполняются первыми
Функции вычисляются до операций
Выражение в скобках вычисляется раньше
Операции с одинаковым приоритетом выполняются слева направо, если идут подряд.
Операции div и mod для целых
x div y = x / y, округленное до ближайшего целого по направлению к нулю. Это результат от целочисленного деления. x mod y = x - (x div y) * y. Это остаток от целочисленного деления.
Пример использования Целочисленные операции часто применяются для определения четности числа:
x mod 2 = 0 <-> x — четное
x mod 2 <> 0 <-> x — нечетное
Логические выражения
Основные сведения
Выражение назывется логическим, если оно имеет тип boolean. Пример.
x < 0
a >= b
a <> 3
Это простые логические выражения. Однако, с помщью логических операций можно составлять сложные.
(бинарные) (унарные)
a and b not a
a or b
a xor b
Таблицы истинности логических операций
a | b | a and b | a or b | a xor b
T | T | T | T | F
T | F | F | T | T
F | T | F | T | T
F | F | F | F | F
Сокращение вычислений логических выражений
Большинство современных компиляторов, в т.ч. PascalABC.NET производит сокращенное вычисление логических выражений. Это означает, что в выражении: a and b
если a — ложно, то b не вычисляется, а в a or b
если a — истинно, b не вычисляется.
Это очень полезно при вычислении таких выражений, как, например,
(y <> 0) and (x / y > 0)
Логически здесь все верно, однако, если бы не использовалось сокращенное вычисление, в случае равенства нулю y'а возникала бы ошибка деления на ноль.
Логические переменные
Можно описывать логические переменные (тип boolean). Им можно присваивать логические выражения. Эти переменные принимают одно из двух возможных значений:
true (истина)
false (ложь)
Пример использования логических переменных Дано: прямоугольник со сторонами, параллельными осям координат, задан координатами абсцисс вертикальных сторон (x1, x2) и ординатами горизонтальных (y1, y2); точка M( x, y ); Найти: находится ли точка внутри прямоугольника, снаружи, или лежит на границе;
var inside, outside, bound: boolean;
begin
inside := (x > x1) and (x < x2) and (y > y1) and (y < y2);
outside := (x < x1) or (x > x2) or (y < y1) or (y > y2);
bound := not inside and not outside;
end.
Побитовые операции
Побитовые операции and, or, xor
Замечание. Работают только с целыми.
Смысл такой — каждое целое переводится в двоичную систему счисления и производится побитовое применение этих операций. Пример.
5 and 10
510 = 1012 710 = 1112
101
( and )
111
———
1012 = 510
Операции shl и shr
Побитовый сдвиг влево и сдвиг вправо соответственно.
shl x shl n = x * 2n
Сдвигает двоичное представление x на n позиций влево.
shr x shr n = x div 2n
Сдвигает двоичное представление x на n позиций вправо.
Примеры
x = 510 = 1012
x shl 2 = <—(2)101
101002 = 2010
x shr 2 = 101—>(2)
0012 = 110
Таблица приоритетов операций языка Object Pascal
унарные + - not
имеющие смысл умножения * / div mod and shl shr
имеющие смысл сложения + - or xor
операции отношения <> <= >= < > in
Оператор case выбора варианта
Синтакстис
case <переключатель> of
{<список выбора>: <оператор>;}
[else <оператор>[;]]
end
Семантика
Вначале вычисляется выражение-<переключатель>, после чего его значение ищется в одном из <списков выбора>. Если значение попадает в какой-то <список выбора>, то выполняется соответствующий ему оператор, иначе, если есть ветвь else, то выполняется оператор по ветке else.
Ограничения
выражение-переключатель должно иметь так называемый порядковый тип:
целый
символьный
перечислимый
НО НЕ строковый или вещественный.
значения в <списках выбора> не должны пересекаться.
Примеры использования оператора выбора
Пример 1. День недели
case DayOfWeek of
1..5: writeln('Будний');
6, 7: writeln('Выходный');
else writeln('Ошибка');
end;
Пример 2. Цифра или буква
var c: char;
read(c);
case c of
'0'..'9': writeln('Цифра');
'A'..'Z', 'a'..'z', 'а'..'я', 'А'..'Я', 'ё', 'Ё': writeln('Буква');
end;
Циклы
Циклы с предусловием (while) и постусловием (repeat)
Синтаксис цикла while
while <условие> do <— заголовок цикла
<оператор> <— тело цикла
<условие>::= <логическое выражение>
Семантика цикла while
Синтаксис цикла repeat
repeat
<операторы>
until <условие>
Семантика цикла repeat
Зацикливание
Зацикливание происходит, если:
условие цикла с предусловием всегда истинно
Пример.
while true do
<оператор>
условие цикла с постусловием всегда ложно
Пример.
repeat
<операторы>
until false
Итерация — однократное повторение тела цикла.
Отличия между циклами while и repeat
while
тело может не выполниться ни разу
repeat
тело выполнится хотя бы один раз
Примеры
Пример 1. Сумма нечетных двузначных чисел
С использованием while
s := 0;
x := 11;
while x < 100 do
begin
s += x;
x += 2;
end;
С использованием repeat
s := 0; x := 11;
repeat
s += x;
x += 2;
until x = 99;
Пример 2. Факториал
С использованием repeat
var n: integer;
read(n);
var x := n;
var p := 1;
repeat
p *= x;
x -= 1;
until x = 1;
С использованием while
var n: integer;
read(n);
var x := n;
var p := 1;
while x > 1 do
begin
p *= x;
x -= 1;
end;
Моделирование repeat с помощью while
repeat Op
Op ——> while not A do
until A; begin
Op
end;
Моделирование while с помощью repeat
while A do if A then
Op ——> repeat
Op
until not A
Оператор цикла с параметром (for)
Синтаксис
<заголовок цикла>
<тело цикла>
<заголовок цикла> ::= for <переменная>:=<выражение1> <направление> <выражение2> do
<тело цикла> ::= <оператор>
<направление> ::= to | downto
Семантика
var b := <выражение1>;
var e := <выражение2>;
<переменная> := b;
while <переменная> <> e do
begin
<оператор>
<получить следующее значение переменной>
end;
<получить следующее значение переменной> ::= <переменная> += 1; | <переменная> -= 1;
Ограничения:
выражения 1 и 2 должны быть совместимы по присваиванию с переменной
переменная должна иметь порядковый тип (такой же, как и в case — целый, символьный или перечислимый)
переменная цикла for не должна меняться внутри цикла for
переменная цикла for должна быть описана в той же п/п, где используется цикл
Дополнительные возможности PascalABC.NET
Возможно описание переменной цикла в его заголовке:
for [var] i: integer := 1 to 5 do
<оператор>
Возможно автоопределение типа при описании:
for var i := 1 to 5 do
<оператор>
Переменная цикла, описанная в заголовке цикла, определена только внутри цикла. Замечание. Значение переменной цикла после завершения цикла не определено. Именно поэтому рекомендуется описывать переменную цикла в заголовке цикла.