Операции с операндами

Разумеется, компьютер не так прост, чтобы обходиться основными арифметическими операциями: +, -, *, /. Чтобы выполнять сложные (иногда и не очень) программы, этого простого набора не хватает. В этой главе мы рассмотрим операции с данными подробнее.

Прежде всего, что такое операция и операнд? Рассмотрим пример: 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. Но мы рассмотрим их позже, когда это потребуется.

Оглавление
Hosted by uCoz