Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика

..pdf
Скачиваний:
9
Добавлен:
15.11.2022
Размер:
1.24 Mб
Скачать

Основы формального аппарата математической логики создал в середине XIX в. английский математик Джордж Буль (Bool). В его честь исчисление высказываний называют булевой алгеброй, а логические величины – булевскими.

Одиночные высказывания могут быть объединены в составные логические формулы с помощью логических операций.

Имеется три основных логических операции:

1)отрицание;

2)конъюнкция (логическое умножение);

3)дизъюнкция (логическое сложение).

Операция отрицания обозначается в математической логике значком « ← » и читается как частица «не». Это одноместная операция. Например, ←(x = y) читается «не (x равно y)». В ре-

зультате получится истина, если x не равно y, и ложь, если x равно y. Отрицание изменяет значение логической величины на противоположное.

Операция конъюнкции обозначается значком « » и читается как «и». Это двухместная операция. Например, (x > 0) (x <1) .

Данная логическая формула примет значение «истина», если x (0,1) , и «ложь» в противном случае. Следовательно, результат

конъюнкции– истина, если истинныоба операнда.

Операция дизъюнкции обозначается значком « » и читается как частица «или». Это двухместная операция. Например, (x = 0) (x =1) . Данная логическая формула примет значение

«истина», если x = 0 либо x =1 , и «ложь» в противном случае. Следовательно, результат дизъюнкции – истина, если хотя бы один операнд истинен.

2.2.Логические величины, операции

ивыражения в Турбо-Паскале

ВПаскале логические значения обозначаются служебными словами false (ложь) и true (истина), а идентификатор логи-

ческого типа – boolean. Величины этого типа занимают в памяти 1 байт.

71

Кроме величин (констант и переменных) типа boolean, логические значения false и true принимают результаты операций отношения.

Операции отношения осуществляют сравнение двух операндов и определяют, истинно или ложно соответствующее отношение между ними.

В языке Паскаль используются следующие операции отношения:

= (равно); <> (не равно); > (больше); < (меньше);

>= (больше или равно); <= (меньше или равно).

Примеры записи отношений: x>=y

a+b<c*d

10<=5

sqrt(z)=4.5

Примеры вычисления значений отношений:

1)для отношения 15>=15 результатом будет true, так как число 15 действительно равно самому себе;

2)для отношения 78>56 результатом также будет true, так как число 78 действительно больше 56;

3)для отношения 10<=3 результатом будет являться false, так как в действительности 10 больше 3.

Логические операции выполняются над операндами булевского типа. В языке Турбо-Паскаль имеется четыре логических операции:

1)not – отрицание;

2)and – логическое умножение (конъюнкция);

3)or – логическое сложение (дизъюнкция);

4)xor – исключающее ИЛИ (двухместная операция, которая в результате дает значение «истина», если оба операнда имеют разные логические значения).

72

Операции перечислены в порядке убывания приоритетов. Результаты логических операций для различных значений операндов приведены в табл. 1.

Таблица 1

Результаты логических операций для различных значений операндов

A

B

not A

A and B

A or B

A xor B

true

true

false

true

true

false

true

false

false

false

true

true

false

true

true

false

true

true

false

false

true

false

false

false

Операции отношения имеют самый низкий приоритет, поэтому если операндами логической операции являются отношения, то их следует заключать в круглые скобки. Например, математическому неравенству 20 ≤ y ≤ 35 соответствует следую-

щая логическая операция:

(y>=20) and (y<=35)

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

Рассмотрим примеры логических выражений (обозначим a, b, c – некоторые логические переменные; x, y – вещественные переменные; k – целая переменная) и особенности нахождения значений этих выражений:

1) x<2*k.

Пусть в данном примере переменная x принимает значение 1.5, а переменная k значение 1. Изначально в соответствии с

73

приоритетом производится умножение числа 2 на значение переменной k, равное 1. В результате получаем значение 2. Затем выполняется операция отношения 1.5<2. Число 1.5 действительно меньше 2, поэтому значением логического выражения является true.

2) true.

В данном случае приведена простейшая форма логического выражения – логическая константа. Значение этого выражения всегда равно true.

3) a.

В данном случае приведена простейшая форма логического выражения – логическая переменная. Значение этого выражения равно true, если переменная a принимает значение true, и false, если переменная a принимает значение false.

4) odd(k).

В примере использована логическая функция odd. Это функция от целого аргумента, которая принимает значение true, если значение аргумента нечетное, и false, если значение аргумента четное. Пусть k принимает значение 104. Поскольку 104 – четное число, значением логического выражения является false.

5) not (x>y).

Пусть переменная x равна 14.35, а переменная y 9.75. В соответствии с приоритетом сначала вычисляется часть выражения, находящаяся в скобках. Подставляем вместо x и y соответствующие значения. Получаем выражение 14.35>9.75, равное true. Затем применяем логическую операцию not: согласно табл. 1 not true равно false.

6) a or c and b.

В соответствии с приоритетом в первую очередь выполняется логическая операция and, а затем or. Пусть переменная a равна false, переменная b true, переменная c false. Подставляем значения вместо c и b. Согласно табл. 1 false

74

and true равно false. Подставляем значение вместо a. Со-

гласно табл. 1 false or false равно false.

7) (a or b) and (y>=k) or not c.

В соответствии с приоритетом сначала выполняются операции в круглых скобках. Сначала вычисляется значение выражения в скобках, находящихся слева, т.е. значение выражения a or b. Пусть a=true, b=false. Согласно табл. 1

true or false = true.

Затем вычисляем значение выражения в следующих скобках, т.е. значение выражения y>=k. Пусть y=3.02, k=4. Подставляем значения вместо переменных и получаем

3.02>=4 = false.

Затем согласно приоритету выполняется операция not. Пусть c=false. Тогда согласно табл. 1

not false = true.

Затем в соответствии с приоритетом выполняем операцию and, подставляя полученные значения выражений a or b

и y>=k:

true and false = false.

В последнюю очередь выполняем операцию or и тем самым находим значение всего выражения

false or true = true.

2.3. Логический оператор присваивания

Рассмотрим примеры использования логического оператора присваивания. Слева от знака присваивания расположена логическая переменная, а справа – логическое выражение:

1)c:=false;

2)a:=(y>=x) and (z<>0);

3)b:=a or c and not(x>=100);

2.4. Символьный тип данных

Этот тип данных, обозначаемый ключевым словом char, служит для представления любого символа из набора допустимых символов. Под каждый символ отводится 1 байт.

75

К символам можно применять операции отношения (<, <=, >, >=, =, <>), при этом сравниваются коды символов. Меньшим окажется символ, код которого меньше. Других операций с символами нет. Стандартных функций для работы с символами тоже немного. Они будут рассмотрены ниже.

2.5. Функции, связывающие различные типы данных

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

Таблица 2 Стандартные функции для связи различных типов данных

Обращение

Тип аргумента

Тип результата

Действие

ord(x)

Любой

Целый

Порядковый номер

 

порядковый

 

значения x в его типе

 

 

 

Предыдущее к x значе-

pred(x)

Любой

Тот же, что для x

 

порядковый

 

ние в его типе

succ(x)

Любой

Тот же, что для x

Следующее к x значе-

 

порядковый

 

ние в его типе

low(x)

Любой

Тот же, что для x

Наименьшие значения

 

порядковый

 

величин данного типа

high(x)

Любой

Тот же, что для x

Наибольшие значения

 

порядковый

 

величин данного типа

chr(x)

Целый

char

Символ с порядковым

 

 

 

номером x

odd(x)

Целый

boolean

True, еслиx – нечетное;

 

 

 

False, если x – четное

 

 

 

 

Функция ord, применяемая к целому числу, дает его собственное значение. Например, ord(-8)=-8, ord(254)=254.

Если аргумент целый, то, например, оператор y:=pred(x) эквивалентен y:=x-1, а y:=succ(x) эквивалентен y:=x+1.

76

Для символьного типа аргумента эти функции дают соответственно предыдущий и следующий символы в таблице внутренней кодировки. Поскольку латинский алфавит всегда упоря-

дочен по кодам, т.е. ord('a')<ord('b')<…<ord('z'), то, например, pred('b')='a', succ('b')='c'. То же относится и к цифровым литерам: pred('6')='5', succ('3')='4'.

Функция chr является обратной к функции ord(x), если x – символьная величина. Например, длякода ASCII справедливо

ord('a')=97

chr(97)='a'

Эту «взаимообратность» можно выразить формулой chr(ord(x))=x,

где x – символьная величина.

В некоторых случаях возникает задача преобразования символьного представления числа в числовой тип. Например, нужно получить из литеры '5' целое число 5. Делается это следующим образом:

N:=ord('5')-ord('0'),

где N – целая переменная. Здесь использован тот факт, что код литеры '5' на пять единиц больше кода '0'.

Булевский тип также является порядковым. Порядок расположения двух его значений таков: false, true. Отсюда справедливы следующие отношения:

ord(false)=0, succ(false)=true,

ord(true)=1, pred(true)=false.

3. Задания к работе

Задания № 1–3 выполняются на доске, а задание № 4 – на компьютере.

Задание № 1. Вычислить значения логических выражений, записанных на языке Турбо-Паскаль, при заданных значениях переменных:

77

1) K mod 7 = K div 5 – 1 при K=15;

2)odd(trunc(10*P)) при P=0.182;

3)not odd(n) при n=0;

4) t and (P mod 3 = 0) при t=true, P=10101;

5)(x*y<>0) and (y>x) при x=2, y=1;

6)a or (not b) при a=false, b=true.

Задание № 2. Если a=true и x=1, то какое значение получит логическая переменная d после выполнения оператора присваивания?

1)d:=x<2;

2)d:=not a or odd(x);

3)d:=ord(a)<>x;

Задание № 3. Написать оператор присваивания, в результате выполнения которого логическая переменная t получит значение true, если выполняется указанное условие, и значение false в противном случае:

1)из чисел x, y и z только два равны между собой;

2)x – положительное число;

3)каждое из чисел x, y, z положительно;

4)только одно из чисел x, y, z положительно;

5)p делится без остатка на q;

6)цифра 9 входит в десятичную запись трехзначного целого числа k.

Пример выполнения задания № 3:

Рассмотрим следующее условие. Пусть для некоторого целого числа x должны быть одновременно выполнены два требования: число больше 95 и остаток от деления данного числа на 3 равен 1.

Пусть числу x соответствует некоторая переменная x типа

integer.

Требование о том, что число должно быть больше 95, запишется следующим образом:

x>95

78

Требование о том, что остаток от деления данного числа на 3 должен быть равен 1, следует записать так:

x mod 3 = 1

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

t:=(x>95) and (x mod 3 = 1);

Обратите внимание, что в записи оператора присваивания использованы круглые скобки, так как операции отношения > и = имеют меньший приоритет, чем операция and.

Задание № 4. Составить программу на языке ТурбоПаскаль, печатающую значение true, если указанное высказывание является истинным, и false в противном случае:

1)сумма двух первых цифр заданного четырехзначного числа равна сумме двух его последних цифр;

2)сумма цифр данного трехзначного числа N является четным числом;

3)точка с координатами (x, y) принадлежит части плоскости, лежащей между прямыми x = m, x = n (m < n);

4)квадрат заданного трехзначного числа равен кубу суммы цифр этого числа;

5)целое число N является четным двухзначным числом;

6)треугольник со сторонамиa, b, c является равносторонним;

7)среди чисел a, b, c есть хотя бы одна пара взаимно противоположных чисел;

8)числа a и b выражают длины катетов одного прямоугольного треугольника, а c и d – другого. Эти треугольники являются подобными;

9)даны три стороны одного и три стороны другого треугольника. Эти треугольники равновеликие, т.е. имеют равные площади;

10)данная тройка натуральных чисел a, b, c является трой-

кой Пифагора, т.е. c2 = a2 + b2 ;

79

11)все цифры данного четырехзначного числа N различны;

12)данные числа x, y являются координатами точки, лежащей в первой координатной четверти;

13)(x1, y1 ) и (x2 , y2 ) – координаты левой верхней и правой

нижней вершин прямоугольника. Точка A(x, y) принадлежит прямоугольнику;

14)число c является средним арифметическим чисел a и b;

15)натуральное число N является точным квадратом;

16)цифры данного четырехзначного числа N образуют строго возрастающую последовательность;

17)данные числа c и d являются соответственно квадратом

икубом числа a;

18)цифра M входит в десятичную запись четырехзначного числа N.

Пример решения задачи № 4:

Рассмотрим следующее высказывание: «Треугольник со сторонами a, b, c является равнобедренным».

Из курса геометрии известно, что равнобедренным называется треугольник, у которого две стороны равны, т.е. у треугольника должны быть равны либо стороны a и b, либо стороны b и с, либо стороны a и с. На языке Турбо-Паскаль это требование будет записано с использованием логической операции

or (так как для нас важно равенство хотя бы двух сторон, а не всех сторон сразу) следующим образом:

rs:=(a = b) or (b = c) or (a = c);

Таким образом, переменной rs будет присвоено значение true, если данное требование выполняется, и значение false в противном случае.

Также необходимо учесть, что любая сторона треугольника меньше суммы двух других сторон и является строго большей нуля. Это требование важно для того, чтобы проверить, могут ли вообще введенные пользователем значения являться сторонами треугольника. Запишем это условие на языке Турбо-

80