Пример 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