Песни о Паскале — страница 15 из 112

Парад логических операций

Итак, посредством логических операций мы переводим рассуждения с человеческого языка на формальный язык программирования, получая при этом логические (булевы) выражения. Логические данные в Паскале можно сравнивать и выполнять с ними четыре логические операции, три из которых вам уже знакомы. Рассмотрим свойства этих операций.

Логическое отрицание NOT («НЕ»). Имеет наивысший приоритет, то есть, при отсутствии скобок выполняется в первую очередь. Это одноместная операция, поскольку требует лишь одного операнда. По своему действию она напоминает знак «минус» для чисел, поскольку изменяет значение операнда на противоположное. Правила для этой операции таковы.


NOT FALSE = TRUE

NOT TRUE = FALSE


Логическое умножение AND («И»). Приоритет ниже, чем у NOT, но выше, чем у логического сложения OR. Требует двух операндов, и в результате дает TRUE, если оба операнда равны TRUE.


FALSE AND FALSE = FALSE

FALSE AND TRUE = FALSE

TRUE AND FALSE = FALSE

TRUE AND TRUE = TRUE


Логическое сложение OR («ИЛИ»). Приоритет самый низкий, – выполняется в последнюю очередь. Требует двух операндов и в результате дает TRUE, если хотя бы один из операндов равен TRUE.


FALSE OR FALSE = FALSE

FALSE OR TRUE = TRUE

TRUE OR FALSE = TRUE

TRUE OR TRUE = TRUE


Итоги

• Информация – это то, что устраняет неопределенность.

• Получая ответ на вопрос, мы получаем информацию. Количество информации можно измерить.

• Наименьшая порция информации – бит – содержится в ответе на простой вопрос («да» или «нет»). Это количество принято за единицу измерения информации.

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

• Подобие триггеров в Паскале – булевы (логические) переменные. Они принимают только одно из двух значений: TRUE (истина) или FALSE (ложь).

• Булевы переменные в сочетании с логическими операциями OR, AND, NOT и скобками образуют булево выражение. Скобки нужны для изменения естественного порядка выполнения операций.

• Булевы выражения используют в условных и циклических операторах.

А слабо?

А) Что будет напечатано в результате выполнения следующего фрагмента?


      S:=’123’;

      Writeln (’123’=S);


Б) Переведите на русский язык это выражение.


      if (S=’’) and (A or B) then …


В) Напишите программу к бортовому компьютеру для маршрута на рис. 36.



Рис.36 – Схема проезда к задаче «В»

Г) В переменные M1, M2 и M3 вводится итог подбрасывания трех монет так, что TRUE соответствует «орел», а FALSE – «решка». Надо составить пять выражений таких, чтобы они выдавали TRUE для следующих случаев:

• у всех монет выпал «орел»;

• у всех монет выпала «решка»;

• все монеты упали одинаково;

• у первой – «решка», у прочих – «орел»;

• у первой – «орел», а две остальные упали одинаково.

Подсказка: логические данные можно сравнивать; сравнение обладает самым низким приоритетом, и потому внутри выражений заключается в скобки, например: M1 and (M2=M3).

Глава 14Дважды два – четыре



Первые компьютеры назывались электронными вычислительными машинами (ЭВМ). Хотите – верьте, хотите – нет, но тогда на них не документы печатали и не фильмы смотрели, а вычисляли. С тех пор компьютеры научились многому и даже обыгрывают в шахматы чемпионов мира, однако, их способность к счету по-прежнему в цене.

Поможем братьям нашим меньшим

Пора и нам обратиться к вычислительным талантам компьютера. Не будем тратить попусту время, и по ходу дела соорудим полезную программу. Вы сможете испытать её на живом человеке, если найдёте первоклашку, зубрящего таблицу умножения. Уверен, что он с удовольствием подвергнет себя такому испытанию. Итак, наша очередная программа – экзаменатор. Суть её проста: компьютер предлагает ученику два числа и ждет от него ответа – произведения этих чисел. За правильный ответ ученика поощряют, а иначе его ждет «нахлобучка».

Числа и действия с ними

Скажу честно: знакомых нам типов данных – STRING и BOOLEAN – не хватит для решения поставленной задачи. Для вычислений в Паскале припасены другие типы данных, один из которых называется INTEGER, что переводится как целое. Из названия следует, что переменные такого типа могут хранить целые числа (положительные и отрицательные), например 10, 25, -14. Переменные целого типа объявляют следующим образом:


var N, M : integer;


Таким переменным можно присваивать выражения целого типа, состоящие из чисел, арифметических операций, скобок и других переменных, например:


      N := 19; M :=-25;

      M := 20 + 3*N;


К арифметическим операциям относятся:

• сложение (+) и вычитание (–);

• умножение (*) и деление (DIV);

• нахождение остатка от деления (MOD).

Здесь DIV и MOD – это ключевые слова языка. Примеры деления и нахождения остатка показаны ниже (в комментариях указаны результаты).


      N := 10 div 2; { =5 }       M := 10 mod 2; { =0 }

      N := 10 div 3; { =3 }       M := 10 mod 3; { =1 }

      N := 10 div 4; { =2 }       M := 10 mod 4; { =2 }

      N := 10 div 5; { =2 }       M := 10 mod 5; { =0 }

      N := 10 div 6; { =1 }       M := 10 mod 6; { =4 }


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

Числовые переменные и выражения можно сравнивать между собой на равенство (=), неравенство (<>), больше (>), меньше (<), больше или равно (>=), меньше или равно (<=). При сравнении получается, как всегда, булев результат, например:


var X, Y: integer;

      B: Boolean;

begin

      X:=5;       Y:=10;

      B:= X=Y; { B = FALSE }

      B:= X

      B:= X=Y-5; { B = TRUE }

end.


А как быть с вводом и выводом числовых данных, нет ли тут сложностей? К счастью, нет. Так же как и строки, числовые данные вводятся процедурой Readln, а печатаются процедурами Write и Writeln, например:


      Readln(X);

      Writeln(X);

      Writeln(’Y=’, X+10);


В последнем операторе на экран выводится строковая константа ’Y=’ и результат сложения X+10.

Теперь вы снабжены всем необходимым для написания экзаменатора.

Алгоритм экзаменатора

Прежде всего, уточним алгоритм создаваемой программы. Живой экзаменатор сам придумывает примеры для умножения. Но нам это пока не под силу – маловато знаний – отложим этот вариант до следующей главы. А пока экзаменуемый будет сам «создавать себе проблемы», то есть будет вводить сомножители по запросу программы вручную. Пример диалога может выглядеть, например, так:


Первый сомножитель A = 7

Второй сомножитель B = 7

Произведение A*B = 47

Ошибка, повтори таблицу умножения!


И так далее. Здесь выделенные курсивом числа 7, 7 и 47 пользователь ввел сам. Разумеется, что задания надо решать многократно, в цикле. Для выхода из цикла нужен какой-то признак, сигнал. Пусть таким сигналом будет ввод нуля в качестве ответа. Тогда блок-схема программы получается такой (рис. 37).



Рис.37 – Блок-схема программы проверки таблицы умножения

Обратите внимание на условие в операторе цикла REPEAT-UNTIL, – оно равно FALSE. Такой цикл будет продолжаться бесконечно, и выйти из него можно лишь процедурой BREAK, как показано на блок-схеме.

Экзаменатор, первый вариант

Вот теперь все готово для написания следующей программы.


{ P_14_1 – экзаменатор таблицы умножения, первый вариант }

var A, B, C : integer; { сомножители и произведение }

      R: Boolean; { результат сравнения }

      S: string;       { сообщение для вывода на экран }

begin

      repeat

      { ввод сомножителей и произведения }

      Write(’Первый сомножитель A = ’); Readln(A);

      Write(’Второй сомножитель B = ’); Readln(B);