Pascal ABC

 

ГЛАВНАЯ
УСТАНОВКА
ОКНО ПРОГРАММЫ
ЛИНЕЙНЫЕ АЛГОРИТМЫ
ЧЕРТЁЖНИК
GraphABC
    РОБОТ
АЛГОРИТМЫ С ВЕТВЛЕНИЯМИ
АЛГОРИТМЫ С ПОВТОРЕНИЯМИ
ПРОЦЕДУРЫ И ФУНКЦИИ
ТЕСТЫ
ТВОРЧЕСКИЕ РАБОТЫ
ОЛИМПИАДНЫЕ ЗАДАНИЯ
 
 

 

 

 

 

ЛИНЕЙНЫЕ АЛГОРИТМЫ  

Первая программа Простейшие программы Арифметические выражения Вычисление по формулам Целочисленная арифметикаЦелочисленные типы данных. Системы счисления   Самостоятельная работа Величины логического типа Вычисление логических выражений Задачи повышенной сложности

Алгоритмы, в которых команды выполняются последовательно одна за другой, в порядке их записи, называются линейными.

Величины логического типа, побитовые операции над целыми числами

  План
  • Логический тип данных
  • Операции сдвига
  • Экспериментальный раздел работы  

  • Задания для самостоятельной работы
  • Материал для чтения

Логический тип данных

Переменные логического типа описываются с помощью идентификатора Boolean. Они могут принимать два значения: False (ложь) или True (истина) (False и True — стандартные константы), под них выделяется 1 байт памяти. Логический тип является перечислимым:    False < True,    Ord(False) = 0,      Ord(True) = 1,  Succ(False) = True, Pred(True) = False.
  В Турбо Паскале имеются четыре логические операции: логическое сложение, или, дизъюнкция, — or; логическое умножение, или конъюнкция, — and; отрицание — not, исключающее " или " (сложение по модулю два) — хor. Результаты выполнения данных операций над переменными логического типа приведены в таблице.

Значение операнда

Результат операций

x

y

not x

x and у

x or у

x xor y

False

False

True

False

False

False

False

True

True

False

True

True

True

False

False

False

True

True

True

True

False

True

True

False

  Фактически выше приведены четыре таблицы истинности сведенные в одну), с помощью которых в математической логике обычно описываются значения логических функций.
  Таблица истинности устанавливает соответствие между наборами значений переменных и значениями логической функции.
  Следует четко понимать, что результатом выполнения операций сравнения (отношения): < (меньше), > (больше), <= (меньше или решаю), >= (больше или равно), <> (не равно), = (равно) является величина логического типа. Ее значение равно True, если отношение выполняется для для значений входящих в него операндов, и False — в противном случае.
  В  Паскале нельзя вводить логические данные с помощью оператора Read. Однако можно выводить значения переменных логического типа с помощью оператора Write.

Операции сдвига

  Рассмотрим две операции над данными целого типа: shl — сдвиг влево и shr — сдвиг вправо. В результате выполнения операции m shl n значение m сдвигается влево на n разрядов; в результате выполнения операции m shl n значение m сдвигается вправо на n разрядов. При выполнении этих операций в Турбо Паскале разряды, вышедшие за пределы области памяти, выделяемой для типа данных, теряются, а с другой стороны добавляются нули. Например, если т равно 32, то сдвиг влево на один разряд дает 64, а сдвиг вправо — 16. Операции сдвига на один разряд равносильны умножению и делению нацело на два.

Экспериментальный раздел работы

  1. Выполните обычные действия с программой Му6_1 (набор, компиляцию, запись на диск, запуск).

Program My6_1;
 Uses Crt;
 Var a,b:Boolean;
 Begin
   ClrScr;
   a:=True;b:=True;
  WriteLn (a : 6, b : 6, a and b : 6);
  a:=True;b:=False;
  WriteLn (a : 6, b : 6, a and b : 6);
  a:=False;b:=True;
  WriteLn (a : 6, b : 6, a and b : 6);
  a:=False;b:=False;
  WriteLn (a : 6, b : 6, a and b : 6);
  ReadLn
End.

  Примечание. При наборе программы не забывайте использовать команды работы с блоками. Достаточно набрать a:=True; b:=True; WriteLn (a : 6, b : 6, a and b : 6); затем выделить этот фрагмент как блок, скопировать 3 раза и модифицировать.

  Измените программу, подставив в нее остальные рассмотренные выше логические операции.

  2. Выполните обычные действия с программой Му6_2 (набор, компиляцию, запись на диск, запуск).

Program My6_2;
  Uses Crt;
  Var m, n : Integer;
  Begin
    ClrScr;
    WriteLn ( ' Введите число и величину, сдвига ' );
    ReadLn (m, n);
    WriteLn ( ' При сдвиге на ', n, ' разрядов влево числа ' ,m, ' получаем число ' , m shl n);
    WriteLn ( ' Введите число и величину сдвига ' );
    ReadLn (m, n);
   WriteLn (При сдвиге на ' , n, ' разрядов вправо числа, ' ,m, ' получаем число ' , m, shr n);
    ReadLn
    Ehd.

Убедитесь, что при вводе m = 32, n = 1 получаются числа 64 (результат сдвига влево) и 16 (результат сдвига вправо). Сдвиги вправо отрицательных чисел приводят к интересным результатам. Например, если вы введете  -1 и 1 для того и другого сдвигов, то получите -2 и 32 767. Если первый результат вполне объясним, то для понимания второго требуется вспомнить о представлении отрицательных целых чисел в дополнительном коде. Пусть у нас не 16 разрядов для представления чисел (тип Integer), а 4. Представление -1 в дополнительном коде есть 11112, Сдвиг вправо на один разряд приводит к числу 01112, а это не что иное, как 710.
  3. Выполните обычные действия с программой Му6_3, набрав только первые три оператора WriteLn.

Program My6_3;
 Uses Crt;
 Begin
   ClrScr;
   WriteLn (1365 and 2730);
   WriteLn (1365 or 2730);
   WriteLn (1365 xor 2730);
   WriteLn (1365 and $FF);
   WriteLn (1365 and $FF0);
   WriteLn (1365 and $FF00);
   ReadLn
End.

  Мы видим, что с величинами типа Integer можно выполнять логические операции, причем они выполняются поразрядно над двоичными представлениями чисел. Почему выбраны числа 1365 и 2730? Переведите их в двоичную систему счисления: 136510 = 0101010101012, 273010 = 1010101010102 (рассматриваются только 12 младших разрядов). Операция and дает в результате число 0, а операции or и хоr - 4095. Поэкспериментируйте с программой. Убедитесь, например, что

-256 and 255 = 0
-256 or 255 = -1
-256 xor 255 = -l

  Попытайтесь дать объяснение этим результатам.
  Добавьте к программе следующие три оператора WriteLn. В шестнадцатеричной системе счисления для обозначения цифр 10, 11, 12, 13, 14, 15 используются буквы латинского алфавита А, В, С, D, Е, F. В представлений F = 11112. Знак $ означает, что величина (константа) записана в шестнадцатеричной системе счисления. Запустите программу. Убедитесь в том, что результаты операций равны соответственно 85, 1360, 1280. Исследуйте описанным способом в дополнительном коде отрицательных целых чисел.

  Задания для самостоятельной работы

  1. В математической логике известна функций следования, или импликация (x Þ у), ее таблица истинности имеет вид

x

y

xÞ у

False

False

True

False

True

True

True

False

False

True

True

True

  Проверьте, что хÞу эквивалентна not(x) or y. Составьте программу проверки эквивалентности этих двух логических функций.
  2. В математической логике известна функция Шеффера (x | у), ее таблица истинности имеет вид :

x

y

x | у

False

False

True

False

True

True

True

False

True

True

True

False

  Проверьте, что х | у эквивалентна not(x) or not(y). Составьте программу проверки эквивалентности этих двух логических функций.
  3. В математической логике известна фикция Вебба, или стрелка Пирса (хßу), ее таблица истинности имеет вид

x

y

x ß у

False

False

True

False

True

False

True

False

False

True

True

False

 

  Проверьте, что хßу эквивалентна not(x) and not(y). Составьте программу проверки эквивалентности этих двух логических фушфий.
  4. Дана некоторая логическая функция; например, (х Þ у) Þ z. Постройте таблицу истинности данной функции. Схема построения приведена в таблице. В первом столбце приведены всевозможные наборы значений переменных х, y и z (True обозначено еденицей, False— нулем).

x y z

 xÞy

(xÞy) Þ z

000

1

0

001

1

1

010

1

0

011

1

1

100

0

1

101

0

1

110

1

0

111

1

1

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

  • (х | y) | z
  • (x ß y) ß z
  • (xÞy) and z;
  • not (x or not y and z);
  • x and not (y or not z);
  • not (not x or у and z).
  6. Дана логическая функция (х ß y) ß ( z ß v). Постройте ее таблицу истинности.

x y z v

х ß y

z ß v

(х ß y) ß ( z ß v)

0000

1

1

0

0001

1

0

0

0010

1

0

0

0011

1

0

0

0100

0

1

0

0101

0

0

1

0110

0

0

1

0111

0

0

1

1000

0

1

0

1001

0

0

1

1010

0

0

1

1011

0

0

1

1100

0

1

0

1101

0

0

1

1110

0

0

1

1111

0

0

1

Материал для чтения

  1. Слово "логика" употребляется в разных значениях, например, логика событий, логика характера и т.д. Во всех случаях имеется в виду определенная последовательность и взаимозависимость событий или поступков. Слово "логика" употребляется и в связи с процессами мышления. Основателем науки логика считается древнегреческий философ Аристотель (IV в. до н. э.), В XIX веке благодаря работам английского ученого Джорджа Буля возникла наука математическая логика. Джордж Буль перенес на логику законы и правила алгебраических действий, ввел логические операции, предложил способ записи высказываний в символической форме. Алгебра логики — раздел математической логики, изучающей строение (форму, структуру) сложных высказываний и способы установления их истинности с помощью алгебраических методов. Высказывание — повествовательное предложение, относительно которого можно сказать, истинно оно или ложно. Все высказывания условно разделяются на простые и составные. Составные высказывания образуются из простых. Например, высказывания х и у — простые, высказывание x and у — составное.

  2. Законы алгебры логики позволяют производить тождественные преобразования логических выражений.

Основные законы алгебры логики

  (1) законы рефлексивности:
        х or х = х; x and x = x;
  (2) законы коммутативности:
        х or у = у or х; х and у = у and х;
  (3) законы ассоциативности:
        х or (у or z — (х or у) or z
        х and (у and z) — (x and у) and z;
  (4) законы дистрибутивности:
        х and (у or z) = х and у or x and z;
        х or (у and z) — (x or y) and (x or z);
  (5) закон двойного отрицания:
        not (not x) = x;
  (6) законы де Моргана:
        not (x and у) = not x or not у;
        not (x or у) = not x and not у;
  (7) законы поглощения:
        х or x and y = x; x and (x or у) = х;
  (8) законы, определяющие действия с логическими константами False и True:
        х or False = х;
        х and False = False;
        х or True = True;
        x and True = x;
        not False = True;
        not True = False;
        not x or_x — True;
        not x and x = False.
  Из основных можно вывести и другие законы, например:
  (9) законы склеивания:
        х and у or not x and y = у;
        (х or у) and (not x or у) = у;
  (10) закон Блейка — Порецкого
        x or not x and y = x or y
  (11) закон свертки логического выражения:
       x and у or not x and z or y and z = x and y or not x and z.
  Примечания
  1. Приведем пример вывода закона Блейка — Порецкого:
        х or not x and у = х and True or not x and у = х and (y or not y) or not x and y = x and y or x and not y or not x and у = x and у or x and not у or not x and у or x and у = x or у
  2. Упражнения для закрепления материала могут быть следующими Даются логическое выражение (например, not (not x or not y) = ?) и варианты ответов: not x or у или х or у и т.д., - необходимо выбрать правильный ответ.
  3. Любую логическую функцию можно преобразовать в:
  • дизъюнктивную нормальную форму (ДНФ);
  • конъюнктивную нормальную форму (КНФ).
  В первом случае логическая функция записывается в виде дизъюнкции конъюнкций, образованных из переменных и их отрицаний. Во втором случае наоборот.
  Примеры:
        not х оr у and z
        х and у and z or not у and not z (ДНФ)

        x and (y or not z) — нет,

        (not x or у) and z
        x and у and (z or not v) (КНФ)

         x and (y and z or not v) — нет

  Сформулируем алгоритм преобразования логической функции к ДНФ:
  • записать функцию с использованием только операций or, and y not;
  • с помощью законов де Моргала операцию отрицания довести до отдельных переменных и убрать выражения вида not (not х) по закону двойного отрицания;
  • с помощью первого закона дистрибутивности убрать все конъюнкции дизъюнкции и провести поглощение.
  В результате получим ДНФ представления логической функции для получения записи в виде КНФ следует изменить третий пункт алгоритма:
  • с помощью второго закона дистрибутивности убрать все дизъюнкции конъюнкций и провести поглощение.
  Если все конъюнкции в ДНФ содержат все логические переменные или их отрицания, то ДНФ наpзывается совершенной (СДНФ). Аналогично определяют и совершенную КНФ (СКНФ)
  Рассмотрим построение совершенных ДНФ и КНФ на примере функции (х Þ y) Þ not(z). Построим таблицу истинности данной функции.
 

x y z

(х Þ y) Þ not(z)

000

1

001

0

010

1

011

0

100

1

101

1

110

1

111

0

 

  СДНФ:
  ((xÞy)= not z) = not x and not y and not z or not x and y and not z or x and not у and not z or x and not у and z or x and у and not z.
  СКНФ:
  ((xÞy) = not z) = not(not x and not у and z) and not(not x and у and z) and not(x and у and z) = (x or у or not z) and (x or not y) or not z) and (not x or not у or not z).

 

 

СЕРВИС 

Copyright © 2008 СОШ №2 им. Н.П. Массонова г.Свислочь © Синица А.А.