[ домой ] [ следующий ] [ начало главы ] [ предыдущий ] [ содержание ]

Пример 4.2. Задано множество точек на плоскости. Oпределить, принадлежит ли хотя бы одна точка множества внутренней области круга с центром в точке (a, b) и радиусом R.
 Система тестов
 
Номер теста
Проверяемый случай
Данные
Результат
a
b
R
Кол. точек
Координаты точек
Otvet 
1
Принадлежит
1
0
2
3
X=(-1, 2, 3) 
Y=(2, 1, 2)
"Да"
2
Не принадлежит
1
0
2
2
X=(-1, 3) 
Y=(2, 2)
"Нет"
 
Демонстрация
Школьный АЯ
алг Точки (арг цел N, арг вещ таб X [1 : N] , Y [1 : N] , 
           арг вещ a, b, R, рез лит Otvet)
нач цел i
  i:=1;   Otvet:="Нет"
  нц пока (i<=N) и (Otvet="Нет") | условие продолжения цикла
    если (X[i]-a)**2 + (Y[i]-b)**2 <R*R | условие прерывания цикла
      то Otvet := "Да"
      иначе i:=i+1
    все
  кц
кон
Исполнение алгоритма 

Обозначения проверяемых условий: 
(i <= N) и (Otvet = "Нет")    => (1) 
(X[i]-1)**2 + (Y[i]-b)**2 < R*R  => (2) 
 
N теста
i
Otvet
(1)
(2)
1
1
2
3
"Нет"
"Да"
+
+
-(кц)
-
+
2
1
2
3
"Нет"
+
+
-(кц)
-
-
 

  Блок-схема 
Turbo Pascal
Program SetOfPoints;
  Uses Crt;
  Type Mas = Array [1..20] of Real;
  Var X, Y         : Mas;     {массивы координат точек }
      i, NPoints   : Integer; {NPoints – количество точек}
      a, b, Radius : Real;    {координаты центра и радиус}
      Flag         : Boolean;
{--------------------------------------------}
Procedure Input; {описание процедуры ввода данных}
 Begin
  ClrScr;
  Write(’Введите координаты центра круга: ’); ReadLn(a, b);
  Write(’Введите радиус круга: ’);            ReadLn(Radius);
  Write(’Введите количество точек: ’);        ReadLn(NPoints);
  For i := 1 to NPoints do
    begin
       WriteLn(i : 4, ’-ая точка ’);
       Write(’X = ’);  ReadLn(X[i]);
       Write(’Y = ’);  ReadLn(Y[i]);
    end; WriteLn
 End;            {of Input}
{--------------------------------------------}
Procedure Inside(Var Flag : Boolean); {описание процедуры проверки }
 Begin                                {принадлежности точек области}
   Flag := FALSE ; i := 1;
   While (i<=NPoints) and not Flag do
     If Sqr(X[i]–a)+Sqr(Y[i]–b) < Sqr(Radius) {Sqr – возведение в квадрат}
        then Flag := TRUE
        else i:=i+1;
 End; {of Inside}
{--------------------------------------------}
Procedure Output( Flag : Boolean); {описание процедуры }
 Begin                             {вывода результатов }
  Write(’О т в е т : в множестве точек ’);
  If Flag then WriteLn(’cодержатся’)
          else WriteLn(’не содержатся’);
  WriteLn(’ точки, принадлежащие заданной области.’);
  ReadLn
 End; {of Output}
{--------------------------------------------}
BEGIN
  Input;        {вызов процедуры ввода данных }
  Inside(Flag); {вызов процедуры проверки принадлежности}
  Output(Flag)  {вызов процедуры вывода результатов }
END.

QBasic

CLS 
INPUT "Введите через запятую координаты центра круга: ", a, b
INPUT "Введите радиус круга: ", Radius
INPUT "Введите количество точек: ", NPoints
DIM X(NPoints), Y(NPoints) 'описание массивов координат точек
 
FOR i = 1 TO NPoints
  PRINT i; "-ая точка "
  INPUT "x = ", X(i)
  INPUT "y = ", Y(i) : PRINT
NEXT i
 
Flag = 0 : i = 1
WHILE i <= NPoints AND Flag = 0
  IF (X(i)–a)^2 + (Y(i)–b)^2 < Radius^2 THEN Flag=1 ELSE i=i+1
WEND
 
PRINT "О т в е т : в множестве точек ";
IF Flag = 1 THEN PRINT "cодержатся" ELSE PRINT "не содержатся"
PRINT " точки, принадлежащие заданной области."
END
 

[ домой ] [ следующий ] [ начало главы ] [ предыдущий ] [ содержание ]