Разумеется, компьютер не так прост, чтобы обходиться основными арифметическими операциями: +, -, *, /. Чтобы выполнять сложные (иногда и не очень) программы, этого простого набора не хватает. В этой главе мы рассмотрим операции с данными подробнее.
Прежде всего, что такое операция и операнд? Рассмотрим пример: a + b. a и b —это операнды, т. е. данные, с которыми производится действие; + —операция, т. е. действие, производимое с данными. Если операция проводится с двумя операндами, как в вышеописанном примере, то она называется бинарной; а в случае типа -a операция - унарная, так как для неё нужен только один операнд.
Примечание: унарные операции всегда записываются перед операндом.
Конструкция из операций и операндов называется выражением.
Со стандартными арифметическими действиями вы уже знакомы. Остаётся сказать, что целочисленными являются результаты сложения, вычитания и умножения целых чисел, т. е. если хоть один операнд в выражении имеет действительный тип, то и результат вычислений получается действительный.
А ещё при помощи операции + можно складывать фрагменты текста—символы и строки. Вот пример, иллюстрирующий это.
program SummingStrings; {Сложение строк}
var
S1, S2: String;
Ch: Char;
begin
S1:='бум';
S2:='ага';
Ch:='!';
WriteLn(S1 + S2); {Можно вместо "+" написать "," - процедура примет строки за отдельные параметры процедуры}
WriteLn(S1 + Ch); {Здесь то же самое}
S1:=S2 + Ch; {А вот тут с запятой ничего не выйдет: текст надо сложить в единое целое операцией "+"}
WriteLn(S1); {Вывод сложенных кусочков, записанных в строке S1 (см. выше)}
ReadLn;
end.
Такие знаки, как + и -, можно использовать в качестве унарных операций. -a при значении a = 10 даёт результат -10 то есть меняет знак перед числом; а +a от обычного a ничем не отличается: числовой знак сохраняется.
Теперь расскажем ещё о нескольких арифметических операциях. Они представляют собой деление несколько другого рода и очень часто применяются для работы с целыми числами. Операция div (от англ. divide разделить) производит деление операндов нацело, т. е. с остатком. А операция mod даёт остаток от деления. Например: 30 div 7 = 4; 35 mod 8 = 3 .
Исходя из этих операций, можно сделать такой вывод:
m div n * n + m mod n = m,
т. е. если результат деления нацело некоторого целого числа m на некоторое целое число n умножить обратно на n, а затем прибавить остаток от деления m на n, мы получим исходное число m.
Теперь рассмотрим другой тип операций, такой, как операции сравнения.
Операции сравнения вам наверняка уже известны из школьной программы (<, >, = и т. д.). Подобные знаки можно использовать и в программировании. Отличие заклучается в том, что сложные знаки, не воспроизводимые клавиатурой, такие как ≤, ≥ и ≠, соответственно обозначаются двумя символами: <=, >=, <>.
В зависимости от того, верна ли данная операция сравнения в данном выражении, например m > n, результатом является значение True (если m больше, чем n) или False (если это не так). Значения m и n должны быть сходных типов, чтобы их можно было сравнить. Например, Integer и Word, Integer и Real, Byte и Real, String[10] и String[20] и т. д..
В следующей программе используются некоторые рассмотренные выше операции сравнения.
program Apples; {Программа "Яблоки"}
const
{За этим словом следует записать константы - постоянные, не меняющиеся в ходе программы числа. Объявление констант необходимо для большего порядка в программе и для её упрощения}
Total = 10; {Объявляемая константа - общее число яблок}
var
Your, {Количество ваших яблок}
Comp: Integer; {Количество яблок компьютера}
begin
{-- Вступительная чатсь --}
WriteLn('Итак, в корзине лежит ', Total, ' яблок. Предлагаю разделить их между собой.');
repeat
Write('Сколько яблок Вы возьмёте себе? ');
ReadLn(Your);
if (Your < 0) or (Your > Total) then {Если яблок меньше нуля или больше, чем есть в корзине}
WriteLn('Похоже, Вы ошибаетесь. Как можно взять ', Your, ' яблок? Ответьте, пожалуйста, по -нормальному:');
until (Your >= 0) and (Your <= Total); {Повторять вопрос, пока Your не окажется в пределах от 0 до Total, включительно}
{-- Проверка результата деления яблок --}
if Your = 0 then
WriteLn('Зачем мне все ', Total, ' яблок? Я же компьютер!')
else
if Your = Total then
WriteLn('Как хотите, забирайте всё. Мне так-то всё равно.')
else
begin
Comp:=Total - Your; {Вычисление количества яблок, доставшихся компьютеру}
WriteLn('Выходит, что у меня будет ', Comp, ' яблок.');
if Your = Comp then
WriteLn('Мы разделили их поровну!')
else
if Your > Comp then
WriteLn('Хорошо. Меня устроит.')
else
if Your < Comp then
WriteLn('Что-то многовато Вы мне оставили, мне столько не надо.');
end;
ReadLn;
end.
В этой программе вместе с операциями сравнения попутно рассмотрен раздел описания констант const. В данном случае объявлена константа Total, заменяющая общее число яблок (10) во всей программе. Теперь изменение этого числа не потребует столько времени, сколько заняла бы замена всех десяток в программе: достаточно исправить значение константы Total.
Логические операции - это операции, основанные на простейших приёмах логики. Эти операции уже использовались ранее, но подробному описанию не подвергались. Мы рассмотрим их применение с логическими выражениями (таких, как сравнение) или операндами (значения типа Boolean).
Выражение с бинарной операцией and (и) принимает значение True, если и первое, и второе выражения истинны. Например:
if (a = 10) and (b > 0) then
WriteLn('Выражение истинно');
Этот фрагмент выводит текст "Выражение истинно", если a = 10 и b > 0.
Операция or (или) даёт результат True, если истинно хотя бы одно из выражений-операндов. Например, условие (a * b = c) or (a + b = c) выполнится, если сумма и/или произведение a и b будет равно c.
Операция xor (исключающее или) даёт результат True, если истинен только один из его операндов. Например:
if (a + 1 > b) xor (a > b - 1) then
WriteLn('Этот текст вы не увидите');
В этом примере текст не будет выведен, т. к. не выполнится условный оператор. В нём две аналогичные операции сравнения (т. е. операции, дающие одинаковые результаты), объединены логической операцией xor. В любом случае оба операнда будут либо верны, либо нет, поэтому операция xor в этом случае будет ложна, т. е. вывод текста не осуществится.
Унарная операция not (не) "переворачивает" операнд - делает его значение прямо противоположным. not True - то же, что и False, not False аналогично True. Вот ещё несколько примеров.
if not (St = 'выход') then
Sum:=Sum + St;
...
if not StopSumming then
I:=I + 1;
Чаще всего операция not применяется в случаях, аналогичных второму, когда имеется переменная типа Boolean и надо выполнить оператор/цикл, если её значение ложно.
Это основной набор операций, которые могут вам не раз пригодиться. Конечно, есть и другие: @, shl, shr. Но мы рассмотрим их позже, когда это потребуется.