Попадание точки в заданную область (Алгоритм)

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 2 нед. назад.

  • Автор
    Сообщения
  • #5597
    @admin

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

    В данном случае, очевидно, что точка (x,y) попадает на линию графика, если у=x. Точка попадает в закрашенную область, лежит выше линии графика, если y>x. Наконец, точка (x, y) лежит ниже линии графика, если yif 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=\sqrt{x^2+y^2}$$

    , если l=r. Если l>r, то точка лежит вне окружности. Если l 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('Нет'); 

    В демоверсии ЕГЭ 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.

Для ответа в этой теме необходимо авторизоваться.