Программа расчета триграмм работоспособна, но один из ее недостатков связан с тем, что требования алгоритма мы учли не до конца. Например если мы присвоим переменной Years значение 82, то на экран будет выведен результат 0. Нам же требуется в этой единичной исключительной ситуации выводить на экран значение 9.
Таким образом мы можем дополнить последний шаг программы следующим условием: если полученное значение остатка в переменной Tria равно нулю, то надо записать в эту переменную значение 9.
Здесь мы сталкиваемся с необходимостью введения в программу условного выполнения одного или нескольких операторов и команд программы в зависимости от того, соответствует или не соответствует значение некоторой переменной указанному числу. Чтобы научиться добавлять в программу подобные проверки, сначала надо познакомиться с особым видом выражений, в которых происходит вычисление не арифметических, а так называемых логических значений. Результатом их вычисления является не обычное целое число или число с плавающей запятой, а логическое значение.
В Delphi существует всего два логических значения: это True (переводится как Истина, Да, Верно) и False (переводится как Ложь, Нет, Неверно). Чтобы получить такое значение, надо результат вычисления одного выражения сравнить с результатом вычисления другого выражения. Сравнение выполняется с помощью специальных операторов взаимосвязи:
= Равно
<> Не равно
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно
Некоторые из этих операторов записываются с помощью одного символа, другие - с помощью двух. При этом в случаях, когда используется два символа, не разрешается отделять их друг от друга пробелами или другими символами.
Следующая запись представляет собой пример логического выражения, в котором значение переменной сравнивается с числом.
Tria = 0
Важно отметить, что это не оператор присваивания, а оператор сравнения, хотя выглядят они схоже. Их различие заключается в том, что при сравнении величин это выражение используется не как самостоятельная команда, а только как ее элемент (например как выражение, расположенное в правой части оператора присваивания). Для наглядности данную запись можно взять в скобки:
(Tria = 0)
Она может использоваться так же, как и выражения наподобие (Tria + 0). Только в последнем случае мы вычисляем арифметическое выражение с помощью операции сложения, в предыдущем - логическое значение с помощью операции сравнения.
Результатом такого сравнения будет значение True, если в переменной Tria записан 0, и False - если любое другое число. А результатом сравнения
Tria <> 0
будет True, если в переменной наоборот не записан 0, и False, если ее значение нулевое.
Логическое значение относится к оригинальному логическому типу данных. Называется он Boolean (точно так же, как целые значения имеют тип Integer).
Результат вычисления логического выражения, как и результат вычисления арифметического выражения, можно записывать в переменные. Для этого их необходимо декларировать с соответствующим типом:
Var CompareResult: Boolean;
В следующем операторе присваивания
CompareResult := Tria <> 0;
сначала происходит вычисление выражения Tria <> 0, расположенного в правой части. Его значение будет равно False, если в переменной Tria записан 0, и True, если в переменной Tria хранится ненулевое значение. Это значение и будет записано в переменную CompareResult. А проверку, соответствует ли значение переменной Tria нулю, можно записать так:
CompareResult := Tria = 0;
Правда, такая запись не очень наглядна. Особенно она не наглядна в Бейсике, где и для присваивания, и для сравнения используется один символ = и получается что-то вроде
CompareResult = Tria = 0
Может показаться, что этой команде сосредоточены сразу два оператора присваивания. Но это не так. Просто в правой части размещено логическое выражение Tria = 0, в котором сравнивается значение переменной Tria с числом 0. Крайний правый знак равенства применяется именно для сравнения значений, а вот в начале команды, в левой части после переменной CompareResult он поставлен уже как символ оператора присваивания. Для избежания неоднозначной трактовки программистами такой записи правую часть подобных команд лучше заключать в круглые скобки:
CompareResult := (Tria = 0) ;
В Бейсике все операции сравнения выглядят так же, как и в Паскале, да и тип также называется - Boolean. В Си есть некоторые отличия. Так, сравнение записывается двумя символами == , а не-равно - так: != . Символ ! в Си вообще означает отрицание.
Кроме того, отдельного типа данных для логических значений в Си нету. Считается, что результат логического выражения - это 1 (целый тип int), если выражение истинно, и 0 (тоже целого типа), если ложно. Строго говоря, истинно в Си все, что не равно нулю, а ложно только нулевое значение.
int CompareResult;
CompareResult = (Tria == 0) ;
Задание. Попробуйте вычислить какое-то логическое значение, записать его в переменную и затем вывести на экран - что будет показано?
В следующий раз мы изучим условный оператор, усовершенствуем нашу консольную программу, а потом наконец вернемся к графическим приложениям - кнопочкам, меню, спискам, картинкам, но уже с точки зрения программирования. Мне самому консоль надоела :)