Но вернемся к биту. Природная склонность компьютера к «простым» вопросам и односложным ответам объясняется устройством его электронной памяти, состоящей из битовых ячеек – триггеров. Не вдаваясь в технические детали, скажу лишь, что такая ячейка может находиться в одном из двух устойчивых состояний, которые часто обозначают цифрами «0» и «1». С тем же успехом их можно обозначить иначе, например: «да» и «нет». Или так: «истина» и «ложь», «правда» и «кривда», «крестик» и «нолик». Короче говоря, название – дело вкуса, важно лишь то, что триггер хранит один бит информации. Эта особенность компьютеров отразилась во многих языках программирования, в том числе в Паскале.
Булевы переменные
Итак, элемент памяти компьютера – триггер – хранит наименьшую порцию информации – один бит. А в Паскале есть надлежащий тип данных для хранения и обработки битов, он называется булевым (ударение на первом слоге) – по имени английского математика Буля. Другое название этого типа данных – логический. Булевы переменные объявляют так:
> var A, B, C : Boolean;
Здесь объявлены три переменных булевого типа.
Булевы переменные, подобно триггеру, могут содержать лишь одно из двух значений: TRUE – «истина» или FALSE – «ложь». Это зарезервированные слова Паскаля, и попытка присвоить логическим переменным другие значения будет пресечена компилятором. Вот примеры правильного обращения с булевыми переменными:
> A:= true;
> B:= false;
> C:= B;
А вот грубые ошибки:
> A:= ’true’;
> B:= ’false’;
> C:= ’B’;
Повторяю: TRUE и FALSE – это зарезервированные слова, а не строковые константы, они пишутся без апострофов.
Ввод и вывод булевых данных
Ввод и вывод – это первое и последнее звено в цепочке обработки данных. Прежде, чем обрабатывать данные, надо освоить их ввод и вывод. Рассмотрим, как это делается с булевыми данными.
С выводом проблем нет, поскольку процедура Writeln напечатает их словами «TRUE» и «FALSE». Вот небольшая программа, испытайте её.
>var B : Boolean;
>begin
> B:= false; Writeln(B);
> B:= true; Writeln(B);
>end.
Вводить булевы данные чуть сложнее, поскольку процедура Readln, к сожалению, не умеет этого делать. Как быть? «Нормальные герои всегда идут в обход», – поется в песне. Осуществим хитрый манёвр: для ввода булевых значений воспользуемся переменной другого типа, например, строковой, а затем преобразуем введенную строку в булев тип.
Условимся, что значению TRUE будет соответствовать ввод в строковую переменную символа «1», а FALSE – любой другой строки. Тогда булево значение в переменную B можно ввести следующим манером.
>var S : String;
> B : Boolean;
>begin
> Writeln(’Введите “1” для TRUE и прочее – для FALSE’);
> Readln(S);
> if S=’1’ then B:= true else B:= false;
> Writeln(B); Readln
>end.
Просто? Но можно сделать ещё проще, прибегнув к логическому выражению.
Логические выражения
Данные логического типа можно получать в результате не совсем обычных вычислений. В этих вычислениях порой не увидишь ни чисел, ни арифметических действий, – речь идет о логических выражениях. Например, сравнивая две строки, вы задаетесь вопросом, равны ли они? Ответом может быть либо «да», либо «нет», или, выражаясь на языке Паскаль, TRUE или FALSE. Следовательно, сравнение строк, которое мы применяли в условных и циклических операторах, – это логическое выражение. А раз так, то результат сравнения можно присвоить булевой переменной. В приведенном выше примере вместо условного оператора можно записать выражение:
> B := S=’1’; { равносильно if S=’1’ then B:= true else B:= false }
Здесь справа от знака присваивания стоит логическое выражение S=’1’, и в переменную B попадет TRUE, если S будет содержать строку «1» и FALSE – в любом другом случае.
Булевы переменные и выражения применяют везде, где требуется проверка условия, например, в условном и циклическом операторах:
>if B
> then... { выполняется, если B=true }
> else... { выполняется, если B=false }
>repeat
> { цикл выполняется, пока B=false }
>until B
Замечу здесь, что «if B then…» равносильно «if B=TRUE then…».