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