Сайт Льва Волкова
  
· Даже в самом вкусном шерстяном костюме моль ест лишь те места, где есть приправа, где запачкано. Им нужен витамин В.
 
      На главную  
 Личное
  Статьи
  Задачи 
 Ссылки
 АТ-531
www.levvol.ru    
 

О решении задачи С1
— попадание точки в заданную область

Очень важные соображения о решении задач класса С ЕГЭ приведены в книге Отличник ЕГЭ. Информатика. Решение сложных задач. Крылов С.С, Ушаков Д.М_2010 -152с

О решениии задачи C1 — решение уравнения

Пусть необходимо определить попадает ли заданная точка с координатами (x,y) в заданную область:

В данном случае, очевидно, что точка (x,y) попадает на линию графика, если у=x. Точка попадает в закрашенную область, лежит выше линии графика, если y>x. Наконец, точка (x, y) лежит ниже линии графика, если y<x. Таким образом, условие попадания точки в закрашенную область:

if y>x then writeln('Да, попадает') else writeln('Нет');

Аналогично, точка (x, y) попадает в закрашенную область,

если y>x2.

if y>x*x then writeln('Да, попадает')
         else writeln('Нет');
.

Рассмотрим попадание точки в круг. Уравнение окружности: x2+y2=r2, в представленном на рисунке случае r=1.

Точка (x, y) лежит на линии окружности, если расстояние до нее , если l=r. Если l>r, то точка лежит вне окружности. Если l<r, то точка — внутри круга.

readln(x,y);
l:=sqrt(x*x+y*y);
if l<1 then writeln('Да, попадает') 
          else writeln('Нет'); 

Для закрашенной области программный код имеет вид:

  
readln(x,y);
l:=sqrt(x*x+y*y);
if (l<1) and (y>x*x) 
    then writeln('Да, попадает') 
    else writeln('Нет'); 

Использование связок and, or весьма эффективно:

readln(x,y);
l:=sqrt(x*x+y*y);
if (l<1) and ((x>0) and (y>Sin(x)) or 
                (x<0) and (y<Sin(x))) 
				then writeln('Да, попадает')
                else writeln('Нет'); 

Теперь перейдем к рассмотрению собственно графического варианта задачи C1 (Демоверсия ЕГЭ 2010 г).

Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x, y — действительные числа) и определяется принадлежность этой точки заданной заштрихованной области (включая границы). Программист торопился и написал программу
ПРОГРАММА
НА ПАСКАЛЕ
ПРОГРАММА
НА БЕЙСИКЕ
ПРОГРАММА
НА СИ
var x,y:real;
begin
readln(x,y);
if x*x+y*y>=4 then
if x>-2 then
if y<-x then
write('принадлежит')
else
write('не принадлежит')
end.
INPUT X,Y
IF X*X=Y*Y>=4 THEN
IF X>=-2 THEN
IF Y<=-X THEN
PRINT "принадлежит"
ELSE
PRINT "не принадлежит"
ENDIF
ENDIF
ENDIF
END
void main(void)
{ float x,y;
scanf("%f%f",&x,&y);
if (x*x+y*y>=4)
if (x>-2)
if (y<=-x)
printf ("принадлежит");
else
printf("не принадлежит");
}

Последовательно выполните следующее:

  1. Приведите пример таких чисел x,y, при которых программа неверно решает поставленную задачу.
  2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. (Это можно сделать несколькими си достаточно указать любой способ доработки исходной программ:

В соответствии с приведенными программами нарисуем блок-схему алгоритма

из которой сразу видно, где программист сделал ошибку. Конструкция Else всегда отностится к ближайшему If. При X*X+Y*Y<4 программа НИЧЕГО НЕ ВЫВОДИТ. Это соответствует, например, точке X=1, Y=1. Из условия задачи достаточно указать ОДНУ точку.

Доработка программы:

   var x,y:real;
	    begin 
		readln(x,y);
		if (x*x+y*y>=4) and(x>=-2) and (y<-x) 
		   then  write('принадлежит')
		   else  write('не принадлежит')
		end.
	

Однако, эта доработка также не верна! Она не учитывает тот факт, что Y≥0. Приведенная программа будет считать лишние точки принадлежащими закрашенной области.

Правильная доработка программы:

   var x,y:real;
	    begin 
		readln(x,y);
		if (x*x+y*y>=4) and(x>=-2) 
		  and (y<-x) and (y>=0) 
		   then  write('принадлежит')
		   else  write('не принадлежит')
		end.
	

Ответ: точка — пара чисел, при которой приведенная программа работает неправильно: X=1, Y=1. Доработанная программа:

   var x,y:real;
	    begin 
		readln(x,y);
		if (x*x+y*y>=4) and(x>=-2) 
		  and (y<-x) and (y>=0) 
		   then  write('принадлежит')
		   else  write('не принадлежит')
		end.
	


Итак, рекомендации для решения задач этого класса:

  1. Нарисовать блок-схему алгоритма по приведенным программам, из которой очевидно, где и в чем ошибка;
  2. Написать слово «Ответ», после которого указать одну пару чисел, при которой программа работает неверно;
  3. Доработать программу, используя логические связки и учитывая ПРАВИЛЬНОЕ расположение закрашенной области;
  4. Обычно в этих задачах есть одно неучтенное в приведенной программе логическое условие (в этой задаче Y≥0).

Теперь попробуйте самостоятельно порешать задачи C1 демоверсий ЕГЭ: Меню сайта [Статьи] [ЕГЭ по информатике] [Демоверсии].