Задачи на пересечение областей (C1): «на стыке алгебры и логики» Д.Ю. Усенков, О.Б. Богомолова
Задача С1 (2011 г.) Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x,y – действительные числа) и определяется принадлежность этой точки заданной заштрихованной области (включая границы). Программист торопился и написал программу неправильно. ПРОГРАММА НА ПАСКАЛЕПРОГРАММА НА БЕЙСИКЕПРОГРАММА НА СИ var x,y: real; begin readln(x,y); if y
Решение: x y y = f(x) всё, что ниже графика – условие «y f(x)» всё, что выше графика – условие «y f(x)» y = f(x) всё, что правее графика – условие «x f -1 (y)» всё, что левее графика – условие «x f -1 (y)»
Решение: 0 x y y = x y = x y = -x y x2 – 2 AND y -x y x2 – 2 AND y x OR ( ( ) ) 0 x y y = x y = x y = -x
Решение: var x,y: real; begin readln(x,y); if y=x*x-2 then write('принадлежит') 1. В цепочке последовательных операторов if ветвь else всегда относится к последнему if. 2. Цепочка последовательных if... then эквивалентна записи одного if с условиями, записанными через AND. if (y =x*x-2) then write('принадлежит') else write('не принадлежит')
0 x y y = x y = x y = -x Решение: if (y =x*x-2) then write('принадлежит') else write('не принадлежит') условие «y f(x)» – всё, что ниже графика условие «y f(x)» – всё, что выше графика условие «x f -1 (y)» – всё, что правее графика условие «x f -1 (y)» – всё, что левее графика AND – пересечение областей, OR – объединение областей 12 Области 1 и 2 – точки, которые программа обрабатывает ошибочно
Решение: Области 1 и 2 – точки, которые программа обрабатывает ошибочно 0 x y y = x y = x y = -x (0, -2) (-2, 2) (2, 2) (-1, -1) (1, -1) (- 2, 0)( 2, 0) 1 2 (2, 2) Пример точки, обрабатываемой ошибочно
Решение: var x,y: real; begin readln(x,y); if y
Задача С1 (2009 г.) Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x,y – действительные числа) и определяется принадлежность этой точки заданной заштрихованной области (включая границы). Программист торопился и написал программу неправильно. ПРОГРАММА НА ПАСКАЛЕПРОГРАММА НА БЕЙСИКЕПРОГРАММА НА СИ var x,y: real; begin readln(x,y); if y=0 then if y>=sin(x) then write('принадлежит') else write('не принадлежит') end. INPUT x, y IF y=0 THEN IF y>=SIN(x) THEN PRINT "принадлежит" ELSE PRINT "не принадлежит" ENDIF END void main(void) { float x,y; scanf("%f%f",&x,&y); if (y=0) if (y>=sin(x)) printf("принадлежит"); else printf("не принадлежит"); } Последовательно выполните следующее: 1) Приведите пример таких чисел x, y, при которых программа неправильно решает поставленную задачу. 2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой правильный способ доработки исходной программы).
Задача С1 (2010 г.) Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x,y – действительные числа) и определяется принадлежность этой точки заданной заштрихованной области (включая границы). Программист торопился и написал программу неправильно. ПРОГРАММА НА ПАСКАЛЕПРОГРАММА НА БЕЙСИКЕПРОГРАММА НА СИ var x,y: real; begin readln(x,y); if x*x+y*y>=4 then if x>= –2 then if y=4 THEN IF x>= –2 THEN IF y=4) if (x>= –2) if (y