l

Логический тип данных Boolean и условный оператор IF… THEN… ELSE…

05.05.2019 2597 Программируем на Паскале Ваш комментарий

В нашем пятом уроке мы поговорим о логическом типе данных Boolean и познакомимся с условным оператором IF… THEN… ELSE… Не пугайтесь, мы всегда идём от простого к сложному и, конечно, используем пройденный ранее материал. Так что рекомендую почитать прошлые уроки, если вы впервые попали ко мне на сайт.

Из пройденного материала можно вспомнить, что числовые типы данных оперируют числами, а вот в логическом типе объектом служат логические выражения. Такими высказываниями могут являться любые утверждения, дающие ответ «да» или «нет». В этом случае говорят, что утверждение является истинным или ложным. К примеру, высказывание: «Меня зовут Владимир» для меня является истинным, а другое: «Мне 20 лет» — ложным, так как я значительно старше.

Область математики, исследующая логику, выделена в отдельную дисциплину — алгебру логики. По имени английского математика девятнадцатого века Джоржа Буля, который активно развивал эту область, её часто называют булевой алгеброй. Алгеброй, так как над логическими выражениями можно производить некие операции, которые до определённой степени являются аналогами арифметическим действиям.

Джорж БульВ Паскале переменные логического типа тоже называются булевыми, а тип записывается как Boolean. У таких переменных могут быть только два значения: true — истина или false — ложь, которые иногда записывают как 1 для истины и 0 для ложных высказываний, соответственно.

Выше я уже сказал, что логические выражения можно объединять. Этой цели служат несколько операторов: конъюнкция — AND (И), дизъюнкция — OR (ИЛИ), отрицание — NOT (НЕ) и XOR (исключающее ИЛИ). Чаще других нам придётся иметь дело с первыми двумя, но следует выяснить как работают и остальные операторы. Я приведу их таблицы истинности, из которых, надеюсь, всё станет ясно.

Конъюнкция

Оператор AND (И) — конъюнкция, является наиболее жёстким объединением. Чтобы было ясно, о чём я говорю, давайте представим, что «А» и «B» — это некие логические высказывания, каждое из которых может принимать значение истина или ложь. Из таблицы, приведённой ниже ясно, как работает конъюнкция. Для простоты: 0 — ложь, 1 — истина.

A B A and B
0 0 0
0 1 0
1 0 0
1 1 1

Итак, конъюнкция — «И» истинна тогда и только тогда, когда оба изначальных выражения тоже истинны. В других случаях такое объединение ложно.

Дизъюнкция

Теперь поговорим об операторе OR (ИЛИ) — дизъюнкции. Даже из его названия ясно, что для того, чтобы такое объединение было истинным, достаточно, чтобы хотя бы одно из начальных высказываний было истинным. Взгляните на таблицу истинности ИЛИ.

A B A or B
0 0 0
0 1 1
1 0 1
1 1 1

Отрицание

Данный оператор применяется к логическому высказыванию целиком и всегда равен противоположному значению.

A not A
0 1
1 0

Если высказывание A ложно, то not A — истинно и наоборот. Этот оператор, кстати, используется значительно реже первых двух, однако, куда чаще исключающего ИЛИ.

(XOR) — Исключающее ИЛИ

Этот оператор я в своей практике использую значительно реже всех прочих. Дело в том, что подобное объединение логических выражений истинно тогда и только тогда, когда изначальные высказывания отличаются своими значениями. Вот его таблица истинности.

A B A xor B
0 0 0
0 1 1
1 0 1
1 1 0

То есть, если выражения A и B оба ложны или оба истинны, то XOR будет ложно.

Множественные объединения

Теперь следует поговорить о приоритетах. Часто, объединяя логические выражения, программисту приходится делать это несколько раз и использовать с этой целью разные операторы. Как в этом случае вычисляется значение финального высказывания? Ложно оно или истинно? Дело в том, что конъюнкция — «И» имеет более высокий приоритет, чем «ИЛИ» — дизъюнкция. Этот оператор часто называют логическим умножением. Представим, что на этот раз у нас имеются три логических высказывания: «A», «B» и «C», каждое из которых может быть истинным или ложным. Допустим, у нас есть такая формула:

A or B and C

Как же мы станем вычислять общее значение логического выражения? Сначала нам надо будет узнать, чему равно B and C, и уже затем этот результат мы объединим через ИЛИ с высказыванием A. Из этого следует ещё один вывод: если нам необходимо всё-таки сначала вычислить A or B, то необходимо этот фрагмент взять в скобки.

(A or B) and C

В этом случае у операции в скобках больший приоритет. Дизъюнкция, кстати, называется логическим сложением. Помните, в самом начале я сказал, что эти операции до известной степени аналогичны арифметическим действиям? Вот и порядок действий можно изменять скобками.

В общем случае, если мы говорим только о наших четырёх операторах, порядок должен быть следующим: вычисляются значения в скобках; выполняются отрицания над отдельными выражениями; затем выполняем И; в последнюю очередь выполняются операции ИЛИ и Исключающее ИЛИ.

Условный оператор IF… THEN… ELSE…

Перейдём к условному оператору IF… THEN… ELSE… Для чего он нужен в Паскале? Само собой, в других языках программирования тоже есть подобные механизмы. То есть, инструмент сам по себе очень полезен. Дело в том, что операторы в программе на Паскале обычно выполняются сверху вниз в том порядке, как они записаны. И всё бы ничего, но очень часто бывает необходимо выполнить те или иные действия, в зависимости от разных условий. То есть выполнение операторов становится не совсем линейным. В программе появляется ветвление.
Как я сказал, оператор этот условный, то есть работает с условиями. Они — условия — как раз и являются логическими выражениями. И оттого, истинны они или ложны, выполнение программы может пойти разными путями. Давайте разберёмся с синтаксисом и семантикой этого оператора.

if условие then оператор_1 else оператор_2;

If с английского переводится как «если». Сразу за этим ключевым словом располагают некое логическое высказывание. Если это условие истинно, то выполняется оператор_1 — команда, идущая после ключевого слова then, которое переводится как «тогда». В противном случае, если условие ложно, то выполнится оператор_2, идущий после ключевого слова else, которое переводится как «иначе». И вот только тут оператор заканчивается точкой с запятой. Весь оператор следует читать так:

Если условие истинно, тогда выполняем оператор_1, иначе — оператор_2.

Бывает так, что в программе требуется выполнить те или иные действия, но только тогда, когда условие истинно, однако в противном случае не требуется совсем никаких действий. Для таких ситуаций есть короткая форма оператора:

if условие then оператор_1;

Такую команду следует читать так: если условие истинно, тогда выполняем оператор_1. Обратите внимание, в этом случае точка с запятой — символ окончания оператора — идёт сразу за оператором_1.

Новички часто путаются, то, мол, нужна точка с запятой после оператора_1, то нет. Как тут разобраться. А между тем, всё просто. Точка с запятой «;» служит в Паскале окончанием оператора. Если у нашего оператора есть фрагмент «else оператор_2», то условный оператор заканчивается лишь после этого. В таком случае точка с запятой после оператора_1 не ставится. Если же вторая часть условного оператора не предполагается, то точка с запятой ставится сразу после оператора_1.

Но даже и теперь это ещё не всё. В самом деле, если бы в случае истинности условия можно было бы выполнить лишь одну команду, то условный оператор был бы не очень гибким. Конечно, можно выполнять и несколько операторов в зависимости от условия, но их в этом случае помещают между ключевыми словами «begin» и «end». Оператор в общем виде записывается так:

if условие then
begin
  оператор_1;
  оператор_2;
  ...
end
else
begin
  оператор_3;
  оператор_4;
  ...
end;

На что здесь следует обратить внимание? Если необходимо выполнить несколько действий, когда, например, условие истинно, то, как я и сказал ранее, операторы помещаются между ключевыми словами «begin» и «end». Внутри этой конструкции отдельные операторы подчиняются обычным правилам Паскаля — каждый из них заканчивается точкой с запятой, однако после ключевого слова «end» точки с запятой нет. Это происходит из-за того, что у нас есть продолжение «else… ». Семантически все операторы, все команды Паскаля здесь необходимо воспринимать как один сложный составной оператор.

Каждое ключевое слово нашего составного оператора я записал с новой строчки только для наглядности. Обычно я подобные записи делаю чуть компактнее — ключевое слово «begin» помещаю в строке с ключевыми словами «then» или «else» за которыми оно следует. Вы всё увидите на примерах.

В этом месте пора уже переходить к практике.

Программа решения квадратных уравнений

Смешно, но вначале опять немного теории. Вспомним формулу квадратного уравнения:

ax2 + bx + c = 0

Чтобы его решить, нам требуются числа a, b и c. В общем случае эти числа могут быть как целыми, так и дробными, то есть — действительными. С их помощью мы сначала вычислим дискриминант:

d = b2 – 4ac

И на его основе (в зависимости оттого, чему именно равен дискриминант) — вычислим действительные корни нашего уравнения. Понимаете, да? Происходит условное ветвление:

Если дискриминант меньше нуля — действительных корней нет.

Когда дискриминант равен нулю, то имеется только один действительный корень и его рассчитывают по формуле:

x = -b / 2a

Если же дискриминант больше нуля, то корни уравнения ищутся по формуле:

x1,2 = (-b ± √d) / 2a

Вот здесь нам и пригодится изученный на уроке условный оператор. Вот только есть небольшая проблема, Условий от которых зависит, каким путём мы будем решать уравнение — не два, а три они не являются противоположными друг к другу. А это значит, что части «else… » в наших условиях не будет. Вместо одного сложного условия, у нас будут при простых.

Чтобы не удлинять и без того не маленький урок, я сразу напишу листинг программы целиком. А чтобы всем всё было понятно, я его подробно откомментирую.

Листинг 1. Программа решения квадратного уравнения

program QuadraticEquations;
var
  a, b, c, // Числа А, B и C
  d: Real; // дискриминант

BEGIN
  writeln(
    'Программа решает квадратные уравнения, путём вычисления дискриминанта. ',
    'Вам потребуется внести числа A, B и C.'
  );
  write('Пожалуйста введите число A: ');
  readln( a );
  write('Теперь - число B: ');
  readln( b );
  write('И наконец, число C: ');
  readln( c );
  
  d := b * b - 4 * a * c; // знаки умножения в формулах опускать никак нельзя
  write(
    'Вы ввели три числа. А = ', a,
    ', B = ', b, ' и C = ', c, '. На основе этих чисел вычислен дискриминант D = ', d
  );
  if d > 0 then begin
    writeln(', он больше нуля, поэтому имеются два действительных корня.');
    writeln('x1 = ', (-b - sqrt( d )) / (2 * a));
    writeln('x2 = ', (-b + sqrt( d )) / (2 * a));
  end;
  if d = 0 then begin
    writeln(', он равен нулю, поэтому имеется один действительный корень.');
    writeln('x = ', (-b / (2 * a)));
  end;
  if d < 0 then
    writeln(', он меньше нуля, поэтому действительных корней нет.');
    
  writeln('Для завершения программы - нажмите Enter.');
  readln;
END.

В разделе с переменными мы объявляем четыре действительные переменные. И хотя я ненавижу давать им имена, состоящие лишь из букв латинского алфавита, в данном случае это оправдано самой задачей. Сразу после ключевого слова «begin» даём понять пользователю, что за программу он запустил и какие нам от него требуются данные. Пользователь с клавиатуры последовательно вводит числа a, b и c, которые мы тут же записываем в соответствующие переменные.

Следом за этим мы вычисляем дискриминант и выводим на экран информацию о том, какие числа пользователь нам дал и каким получился дискриминант. После идут три простых условных оператора:

Если дискриминант больше нуля, вычисляем и выводим на экран два действительных корня нашего квадратного уравнения. В этом разделе программы мы сталкиваемся с новой функцией sqrt( ) — взятие квадратного корня от аргумента, переданного в скобках.

Если дискриминант равен нулю, то корень имеется только один и вычисляется он по упрощённой формуле. Однако в обоих этих условных операторах нам необходимо выполнять несколько действий, поэтому мы объединяем все операторы между ключевыми словами «begin» и «end». Как видите, всё строго в соответствии с тем, что мы изучили с вами на уроке.

Наконец, если дискриминант меньше нуля, то вычислений мы не проводим и одним действием выводим на экран информацию об отсутствии действительных корней.

Условная часть программы заканчивается и мы выводим последнее сообщение о том, что для выхода из программы необходимо нажать клавишу «Enter». Как видите, программа получилась простой, но функциональной. Она прекрасно справляется с задачей решения квадратного уравнения, что без условного оператора было бы сделать проблематично, если не вовсе невозможно.

Репозиторий листингов программ.

Оставьте ваш отзыв: