Вы - -й посетитель этой странички 

Логические выражения

П Р А К Т И К У М   П О   И Н Ф О Р М А Т И К Е

Е.В. Андреева, И.С. Гущин

Москва

Введение

В программе курса “Основы информатики и вычислительной техники” в физико-математической школе-интернате им. А.Н. Колмогорова (СУНЦ МГУим. М.В. Ломоносова) предусмотрено обучение детей одному из языков программирования высокого уровня, например, языку Паскаль. Обязательной составной частью обучения языку программирования является выполнение школьниками практических заданий. Практические задания преподаватели информатики стараются составлять так, чтобы, во-первых, при изучении тех или иных алгоритмических или языковых конструкций продемонстрировать и по возможности привить стильпрограммирования, присущий изучаемому языку (каждый язык программирования требует своего стиля ее написания эффективной и легко отлаживаемой программы), во-вторых, помочь ученику закрепить какой-либо материал, изученный на уроках математики, физики, химии и т.д., в-третьих, дать школьнику возможность потренировать свою сообразительность при решении нового для него класса задач.

Практические задания по информатике в СУНЦ  МГУ называются практикумами, если данный тип заданийобязателен для выполнения всеми учащимися, каждыйученик получает свой собственный вариант задания, и результат работы каждого учащегося будет проверен и оценен соответствующим образом. Желательным при этом является самостоятельность выполнения задания каждым из школьников. На выполнение практикума учитель отводит фиксированное время (обычно одну или две недели), и оценку “отлично” можно получитьтолько в случае выполнения задания полностью и в срок.

Методические указания

Предлагаемое в данной разработке задание условноназывается “Логические выражения. Метод координат наплоскости”. Для выполнения данного задания от школьника требуется: во-первых, знать тему “Декартовы координаты на плоскости” (например, по учебнику геометрии А.В. Погорелова для 7—11-х классов), в частности,нужно знать и понимать определение уравнения фигурына плоскости в декартовых координатах, знать вид уравнения прямой, окружности, параболы, ромба и/или других фигур в этих координатах; во-вторых, надо уметь описывать в виде неравенств геометрические места точек наплоскости, ограниченные указанными выше линиями; в-третьих, надо знать (или придумать) приемы восстановления уравнений указанных выше линий по их изображению на координатной плоскости.

Из курса информатики для выполнения задания потребуется:

· знание логических операций NOT, AND, OR;
· определение логического выражения;
· интерпретация логических операций NOT, AND,OR с точки зрения простейших понятий теории множеств;
· знакомство с синтаксисом логических выражений испособами их записи в изучаемом языке программирования (например, в Паскале);
· знание стандартных арифметических функцийизучаемого языка программирования, таких, как:вычисление квадратного корня, модуля числа и т.п.

Чтобы избежать бездумного копирования программучащимися друг у друга, учитель подготавливает числовариантов задания, равное числу учащихся. Преподаватель может оформить рисунок задания вручную, илииспользуя графические возможности какого-либо языка программирования, или какие-либо графические компьютерные технологии. В СУНЦ МГУ для генерациизаданий используется специально написанная программа. Сложность заданий при этом может варьироваться.

Некоторые ведущие специалисты по программированию (например, известный специалист и педагог из Великобритании К.А.Р. Хоар) приветствуют употребление подпрограмм уже в начальной стадии обучения программированию (в связи с этим заметим, что, например, язык Си с самого начала требует знакомства с понятием функции как подпрограммы, и весь текст программы на Си построен с использованием функций). Поэтому, в зависимости от возможности применения при выполнении задания подпрограмм, учащимся предлагается одиниз двух вариантов формулировки задания: первый (более простой и быстрый для дальнейшей проверки), когда вся работа оформляется учеником в виде одной подпрограммы (в Паскале в виде функции), и второй, когда работа оформляется в виде основной программы (без подпрограмм). В последнем случае от выполняющего задание требуется дополнительное внимание для соблюдения формальных соглашений при написании текстапрограммы, которые необходимы для автоматической проверки, а для проверяющего требуются дополнительные тестирующие программы. Заметим, что данный практикум школьники выполняют на начальном этапе обучения программированию, то есть скорее всего использование функций в данном случае для большинства учащихся возможно лишь в рамках модели, предложенной учителем на уроке.Как уже было упомянуто выше, проверка задания осуществляется автоматически с помощью программы,специально созданной для этого практикума. При этомпроще четко формализовать критерии оценки, практически исчезает возможность пропустить ошибку в программе ребенка (можно быстро рассмотреть практически все случаи) и можно одновременно работать с большим числом учащихся. Подробнее о вариантах проверки предлагаемого практикума, основанных на визуализации работы школьника, будет рассказано ниже.

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

Условие задания

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

Практикум “Логические выражения. Метод координат на плоскости”.

1. На выданном вам рисунке на координатной плоскости изображены окружности, прямые, параболы, ромбы, прямоугольники (некоторые из упомянутых линиймогут отсутствовать). Несколько областей, ограниченных этими линиями, заштрихованы. Данные линии можно описать уравнениями в декартовой прямоугольной системе координат (x, y) на плоскости:

у = f(x), или x = f(y), или f(x, y) = 0

На рисунке изображены также оси координат и координатная сетка, линии которой проведены через единицу масштаба. Восстановите по рисунку уравнения всех линий, изображенных на нем.

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

3. Программа запрашивает значения x 0 , y 0 , и они вводятся с клавиатуры во время ее выполнения. В качестве ответа программа выдает на экран TRUE, если точка с введенными координатами x0 , y 0 принадлежит заштрихованной фигуре, и FALSE, если точка x 0, y 0 не принадлежит ей.

4. В целях автоматической проверки вашей работына компьютере нужно:

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

function Result(x, y: real): boolean;

Функция получает в качестве входных параметров два числа x, y действительного типа и должна выдавать результат логического типа: TRUE, если точка с координатами x, y оказалась внутри одной из заштрихованных областей, и FALSE, если точкаx, y лежит в незаштрихованной части плоскости.На границах областей функция может выдавать любой результат.Описание этой функции (заголовок и тело функции) надо поместить в файл с именем RESULT.PAS.

б) Для проверки правильности работы вашей функции, а следовательно, и выполнения задания в целом воспользуйтесь следующей программой:

PROGRAM Region;
var x, y: real;
{$I result.pas}
BEGIN
   write ('Введите координаты точки (x,y):');
   readln(x,y);
   writeln(Result(x,y));
   readln
END.

Варианты заданий

 Рис . 1. Рис. 2

wpe4.gif (23616 bytes)

Рис. 3 Рис. 4

wpe5.gif (23133 bytes)

Рис. 5 Рис. 6

wpe6.gif (22947 bytes)

Рис. 7 Рис. 8

На рис. 1—8 приведены восемь вариантов, которые соответствуют 32 различным заданиям. Из каждого рисунка можно сделать 4 различных задания, поразному обозначая направления осей OX и OY (каждый следующий вариант задания получается из предыдущего путем поворота его на 90°, например, по часовой стрелке).

Пример выполнения задания. Приведем образец для выполнения задания на примере рис. 1. На занятиях также полезно предварительно разобрать один из вариантов с той или иной степенью детализации, в зависимости от степени математической и программистской подготовки учащихся. Содержание такого занятия может выглядеть так. На данном рисунке изображено пять линий: две окружности, ромб и две параболы. Они ограничивают четыре заштрихованные части плоскости. Восстановим уравнения этих линий. В прямоугольной декартовой системе координат координаты точек (x, y), лежащих на окружности радиуса R с центром в точке (a, b), удовлетворяют уравнению: (x — a) 2 + (y — b)2 = R 2 .Левая окружность имеет радиус 2,5. Центр ее в точке (—1, 2).

Поэтому ее описывает уравнение (x + 1) 2+ (y — 2) 2 = 2,5 2 .Правая окружность имеет радиус 3. Центр ее в точке (3, —1). Поэтому ее уравнение (x — 3) 2 + (y + 1) 2 = 3 2 . Точки внутри левого круга удовлетворяют неравенству: (x+ 1) 2 + (y — 2) 2 < 2,5 2 .Аналогично, точки внутри правого круга удовлетворяют неравенству: (x — 3) 2 +(y+1)2 < 3 2 . Координаты точек, лежащих на ромбе, показанном на рис. 9 (единичный ромб), удовлетворяют уравнению |x| + |y | = 1.

В этом нетрудно убедиться,раскрыв знак модуля и получив уравнения прямых для каждой из четвертей. Так, для точек первой четверти при x > 0, y > 0 имеем:   x + y   =1  — это уравнение прямой, проходящей через точки (1, 0) и (0, 1), что соответствует рисунку .

 

wpe7.gif (3934 bytes)

рис.9

Точки внутри рассматриваемого ромба удовлетворяют неравенству |x| + |y| < 1. В этом можно убедиться точно так же, как и выше, раскрыв модуль.При этом надо учесть, что точки, лежащие ниже прямой y = k x + b, удовлетворяют неравенству y < k x + b,которое означает, что при каждом фиксированном значении x координата   y  любой точки (x, y), лежащей ниже прямой, меньше координаты y точки, лежащей на прямой, которая равна k x + b. Соответственно точки, лежащие выше прямой y = k x + b, удовлетворяют неравенству y > k x + b. Ромб в нашей задаче отличается от рассмотренного выше тем, что он растянут в 4 раза по оси x и в 3 раза по оси y и его центр смещен в точку (—2, —2). При растяжении линии в k раз по оси x ее уравнение отличается от исходного тем, что х делится на k. Аналогично, если линия растягивается по y в k раз, то в ее уравнении y надо разделить на k. При сдвиге линии по оси x на величину c в ее уравнении вместо x надо взять x — c, аналогично при сдвиге по y на с надо в уравнении y заменить на y c .

Поэтому для нашего ромба получаем уравнение |x + 2| / 4 + |y + 2| / 3 = 1. Для проверки можно подставить координаты вершин ромба в уравнение и убедиться, что они удовлетворяют ему. Координаты точек внутри ромба удовлетворяют неравенству |x + 2| / 4 + |y + 2| / 3 < 1.Уравнение прямой восстанавливается по координатам любых двух ее точек (для восстановления уравнения прямой по рисунку выберите две различные точки с целочисленными координатами). Например, верхняя правая граница нашего ромба является отрезком прямой, проходящей через точки (—2, 1) и (2, —2).

Общее уравнение прямой, не параллельной оси OY, имеет вид: y = kx + b.Чтобы найти коэффициенты k и b для нашей прямой, подставим в общее уравнение координаты указанных точек,получим два линейных уравнения с двумя неизвестными:1 = k(—2) + b, —2 = k•2 + b.Решив систему, получим k = —3/4, b = —1/2. Получаем уравнение прямой y = —3/4x — 1/2. Тот же метод можно применить и для нахождения уравнения параболы, но уже по трем точкам, так как общее уравнение параболы y = ax 2 + bx + c имеет три неизвестных коэффициента. Рассмотренный прием называется методом неопределенных коэффициентов. Но мы найдем уравнения парабол уже испытанным методом преобразования фигур.

Координаты точек  (x, y) , лежащих на параболе, проходящей через начало координат и точки (1, 1) и удовлетворяют уравнению y = x 2 . Вертикальная парабола на рисунке получается из рассмотренной выше сжатием по оси y в 2 раза и сдвигом по оси y на —5, поэтому ее уравнение получится из уравнения выше делением y на 1/2 и заменой y на y — (—5). В результате получаем уравнение (y + 5) / 0,5 = x 2 или y = 0,5x 2 — 5.Аналогично горизонтальная парабола получается из параболы x = y 2 сдвигом на —1 по x и на —2 по y. Ее уравнение имеет вид: x — (—1) = (y — (—2)) 2 или x = (y + 2) 2 — 1. Координаты точек внутри (над) первой параболы удовлетворяют неравенствуy > 0,5x 2 — 5. Координаты точек внутри (правее) второй параболы удовлетворяют неравенству x > (y + 2) 2 — 1.Рассмотрим теперь заштрихованные области. Область 1 представляет собой точки, находящиеся в круге 1 И   НЕ  вкруге  2, И  НЕ  внутри ромба. Область 2 представляет собой точки, находящиеся в ромбе И внутри параболы 1, И   НЕ  в круге 1,  И  НЕ внутри параболы 2. Область 3 представляет собой точки, находящиеся в параболе 1 И в параболе 2, И  НЕ  внутри ромба, И в круге 2. С 4-й, внешней, областью надо быть поосторожнее. На первый взгляд кажется, что область 4 представляет собой множество точек, находящихся НЕ внутри параболы 1 И   НЕ внутр и параболы 2 И НЕ в круге 2. Но этому же условию удовлетворяют, например, и точки слева от параболы 1,не входящие в рассматриваемую область. Поэтому для описания точек, принадлежащих 4-й области, надо добавить условие: И лежащие в первой четверти — то есть удовлетворяют системе неравенств: И лежащие в первой четверти — то есть удовлетворяют системе неравенств: x > 0 И y > 0.О подобном условии при объяснении выполнения задания школьникам можно не упоминать, предоставив им возможность догадаться о его необходимости самостоятельно.

Часто школьники формулируют подобные условия лишь после визуальной проверки их работы, в результате которой обнаруживаются “лишние” точки, то есть такие, для которых логическая функция ученика сообщает, что они принадлежат заштрихованной фигуре. “Лишние” точки могут оказаться и вне той части плоскости, которая изображена на рисунке с заданием. В этом случае при проверке их также нужно суметь продемонстрировать школьнику.Вся заштрихованная фигура F представляет собой объединение четырех рассмотренных областей: F есть объединение точек, лежащих в области 1, ИЛИ в области 2, ИЛИ в области 3, ИЛИ в области 4. При записи сформулированного логического выражения на языке программирования выделенные заглавными буквами слова И, ИЛИ,  НЕ нужно заменить на соответствующие логические операции (например, AND, OR, NOT в Паскале).Заметим, что использование логического отрицания НЕ в данном случае правомерно лишь потому, что точки на границе областей по условию задания мы не рассматриваем. Таким образом, не вполне корректное с точки зрения математики выражение позволяет более наглядно продемонстрировать смысл логических связок. Например, если точки внутри круга уже были описаны, то для описания точек, расположенных вне круга, проще использовать не отдельное неравенство, а выражение — НЕ внутри круга. Однако следует обратить внимание учащихся, что на самом деле выражение NOT (x 2 + y2 < R2 ) соответствует(x2 + y2  R2  ), а не (x2 + y2 > R2 ).

Разобравшись с логическим выражением, можно приступить к составлению программы. Хорошим стилем программирования, не позволяющим запутаться и наделать ошибок, является следующий: для каждой необходимой для рассмотрения части плоскости надо ввести свою логическую переменную,принимающую истинное значение только для точек, принадлежащих именно этой части плоскости; этой переменной надо присвоить соответствующее арифметически-логическое выражение;· имя переменной должно быть мнемонично, то есть смысл его должен быть понятен любому человеку без перевода; окончательное логическое выражение конструируется с помощью логических операций только из таких переменных.Проиллюстрируем сказанное примером. Требуемая по условию задания функция для рассматриваемого примера может иметь следующий вид:

Function Result(x, y: real): Boolean;

var Circle1, Circle2, Rhomb, Parab1, Parab2,
      XoY1, Reg1, Reg2, Reg3, Reg4 : Boolean;

BEGIN
   Circle1 := sqr(x+1.0)+sqr(y-2.0) < sqr(2.5);< BR>    {в круге 1}
   
Circle2 := sqr(x-3.0)+sqr(y+1.0) < sqr(3.0);< BR>    {в круге 2}
   
Rhomb := abs(x+2.0)/4.0+abs(y+2.0)/3.0 < 1.0;< BR>    {в ромбе}
   
Parab1 := y > 0.5*sqr(x)-5.0;< BR>    {внутри параболы 1}
   
Parab2 := x > sqr(y+2.0)-1.0;< BR>    {внутри параболы 2}
   
XoY1 := (x > 0.0) AND (y > 0.0);< BR>    {в четверти}
    
Reg1 := Circle1 AND NOT Rhomb AND NOT Circle2;< BR>     Reg2 := Rhomb AND Parab1 AND NOT Circle1 AND NOT Parab2;< BR>     Reg3 := Parab1 AND Parab2 AND NOT Rhomb ANDCircle2;
    
Reg4 := NOT Parab1 AND NOT Parab2 AND NOT Circle2 AND XoY1;
     Result:=
Reg1 OR Reg2 OR Reg3 OR Reg4

END;

Ее текст помещается в файл RESULT.PAS.Особого внимания в данной программе заслуживают присваивания логическим   переменным  логических  выражений вида: b:= x=1. Как показывает практика, такие операции непривычны даже для программировавших ранее школьников. Таким образом, еще одна задача данного практикума — научить составлению и использованию в программировании произвольных логических выражений.

Тестирующая программа

Учитель проверяет выполненное задание с помощью специальной программы, которая   высвечивает на экране точки, в которых функция учащегося дает результат TRUE. В графическом режиме компьютера просматриваются   все пиксели из прямоугольника, ограничивающего рисунок. В результате на экране получается  рисунок, который в случае правильного выполнения задания должен совпасть с рисунком, выданным в качестве задания. Несмотря на свою простоту, подобная проверка производит большой эффект на школьников, начинающих изучать программирование. Подобные визуальные средства проверки работ учащихся позволяют укрепить авторитет преподавателя, развить и закрепить интерес учащихся к предмету. Очевидно, что с помощью такой визуальной проверки невозможно определить, как именно поступает  функция   Result(x,y) с граничными точками областей. Это еще одна из причин, по которой в задании граничные точки не рассматриваются. Кроме того, в силу приближенности вычислений, выполняемых с действительными числами на компьютере, точно учесть все граничные точки заштрихованной фигуры зачастую практически невозможно. А, на наш взгляд, ставить задачу более строго, чем на практике будет проверяться ее решение, особого смысла нет. Приведем текст программы, позволяющей продемонстрировать, чему на самом деле соответствует логическое выражение, построенное и запрограммированное школьником и помещенное в файл

PROGRAM CheckTask_2;
Uses Graph;

const
  
xGrMin = 120;
  
xGrSize = 400;
  
xGrMax = xGrMin+xGrSize;
  
yGrMin = 70;
  
yGrSize = 300;
  
yGrMax = 370;
  
xMin = -8.0;
  
xMax = 8.0;
  
dX = (xMax-xMin)/xGrSize;
  
sX = 1.0/dX;
  
yMin = -6.0;
  
yMax = 6.0;
  
dY = (yMax-yMin)/yGrSize;
  
sY = 1.0/dY;

PROCEDURE GrInit;
  var 
    grDriver : Integer;
    
grMode : Integer;
    ErrCode : Integer;

BEGIN
   grDriver := Detect;

   InitGraph(grDriver,grMode, '');
   {Предполагается, что графический драйвер egavga.bgi находится
     в текущей директории, иначе укажите путь}
    ErrCode := GraphResult;
     if ErrCode <> grOk then
       
BEGIN
           writeln('Ошибка установки граф. режима:',GraphErrorMsg(ErrCode));
           Halt(1)
         END
END;

Function gX(x:real):word;
BEGIN
   gX:=xGrMin+round((x-xMin)*Sx)
END;

Function gY(y:real):word;
BEGIN
   gY:=yGrMax-round((y-yMin)*sY)
END;

PROCEDURE Grid;
    {сетка}
var i:integer;
BEGIN
   SetColor(red);
   SetLineStyle(DottedLn,0,1);
   for i:=round(yMin) to round(yMax) do
      line(xGrMin,gY(i*1.0), xGrMax,gY(i*1.0));
   for i:=round(xMin) to round(xMax) do
        line(gX(i*1.0),yGrMin,gX(i*1.0),yGrMax)
END;

PROCEDURE Axis;
   {оси}
BEGIN
   SetLineStyle(SolidLn,0,1);
   Line(xGrMin,gY(0),xGrMax,gY(0));
   Line(gX(0),yGrMin,gX(0),yGrMax)
END;

{$I result.pas}

PROCEDURE ShowResult;
  var x,y: real;
  i,j: word;
 BEGIN
   y:=yMax;
   for j:= yGrMin to yGrMax do
   BEGIN
      x:=xMin;
      for i:= xGrMin to xGrMax do
      BEGIN
        if Result(x,y) then PutPixel(gX(x),gY(y),White);
        x:=x+dX
      END;
      y:=y-dY
    END
END;

BEGIN
   GrInit;
   Grid;
   Axis;
   Show Result;
   readln;
   CloseGraph
END.

Дополнительные замечания если тема “Подпрограммы и их параметры” еще не изучалась, а выполнение задания по образцу без детального объяснения  учитель считает нецелесообразным, то нужно изменить пункт 4 условия задания на следующий:

4* . Для автоматической проверки работы на компьютере нужно:

· чтобы начало программы (первая строка ее текста) имело вид: var x,y: real;

· чтобы результат присваивался переменной с именем  R  логического типа.Например, программа может выглядеть так:

var x, y: real;
Circle1, Circle2, Rhomb, Parab1, Parab2, XoY1, Reg1, Reg2, Reg3, Reg4, R: Boolean;

BEGIN
   write('Введите координаты точки (x,y): ');
   readln(x,y);
   Circle1 := sqr(x+1.0)+sqr(y-2.0) < sqr(2.5);
   {в круге 1}
   Circle2 := sqr(x-3.0)+sqr(y+1.0) < sqr(3.0);
    {в круге 2}
    Rhomb := abs(x+2.0)/4.0+abs(y+2.0)/3.0 < 1.0;
    {в ромбе}
    Parab1 := y > 0.5*sqr(x)-5.0;
    {внутри параболы 1}
    Parab2 := x > sqr(y+2.0)-1.0;
    {внутри параболы 2}
    XoY1 := (x > 0.0) AND (y > 0.0);
    {в 1-й четверти}
    Reg1:= Circle1 AND  NOT  Rhomb AND NOT Circle2;
    Reg2:= Rhomb AND Parab1 AND NOT Circle1 AND  NOT Parab2;
    Reg3:= Parab1 AND Parab2 AND NOT RhombAND Circle2;
    Reg4:= NOT Parab1 AND NOT Parab2 ANDNOT Circle2 AND XoY1;
    R:= Reg1 OR Reg2 OR Reg3 OR Reg4;
    writeln(R);
    readln
END.

Для автоматической визуальной проверки такого задания учителю придется написать дополнительную программу-конвертор, преобразующую текст программы школьника в функцию Result(x,y). При указанных в 4* ограничениях на текст программы это сделать не очень сложно. Все операторы — write, writeln, read, readln —из программы школьника при этом просто удаляются. Затем как программа-конвертор, так и приведенная выше программа-визуализатор записываются в командный файл, параметром которого служит имя файла с программой школьника, а  результатом   работы — картинка на экране компьютера. Эффект в таком случае достигается даже больший, чем при проверке задания, выполненного в виде функции. Причем лучших учащихся обычно заинтересовывает задача написания программы-конвертора, решение которой без знания теории конечных автоматов (в данномслучае для упрощенного синтаксического разбора текст а программы школьника) в полном объеме невозможно (например, окончанием оператора write не обязательно является первый встреченный символ “;”, ведь этот символ может быть просто вставлен школьником в строковую константу и т.д.). То есть проверка практикума “для всех”может дать тему для дополнительной работы со способными учениками, которая в курс школьной информатики не войдет, но пригодится при решении олимпиадных задач.