Определить число точек с (x;y) попадающих - Free Pascal
Формулировка задачи:
Определить число точек C (x;y) попадающих:
Внутрь заштрихованной области
На границу
Вне заданной области.
Все значения произвольные
Это гипербола
Решение задачи: «Определить число точек с (x;y) попадающих»
textual
Листинг программы
uses crt;
var a,b,x01,x02,r1,r2,y01,y02,x,y:real;
n,i,kv,kn,ks:integer;
begin
clrscr;
repeat
writeln('Введите параметры гиперболы a,b>0');
readln(a,b);
until(a>0)and(b>0);
repeat
writeln('Введите абциссы центров окружностей x01,x02>0');
readln(x01,x02);
until(x01>0)and(x02>0);
repeat
writeln('Введите радиусы окружностей r1, r2 >0');
readln(r1,r2);
until (r1>0)and(r2>0);
y01:=-b*x01/a; //ниже оси Х
y02:=b*x02/a; //выше оси Х
repeat
write('Введите количество точек n>0 n=');
readln(n);
until n>0;
kv:=0; {внутри}
kn:=0; {на границе}
writeln('Введите координаты ',n,' точек');
for i:=1 to n do
begin
writeln('Точка ',i);
write('x=');readln(x);
write('y=');readln(y);
//если в верхнем сегменте
if (sqr(x-x02)+sqr(y-y02)<=r2*r2+0.01)and(y<=b/a*sqrt(x*x-a*a)+0.01) then
begin
if (abs(sqr(x-x02)+sqr(y-y02)-r2*r2)<0.01)//с точностью 0.01 на окружности
or(abs(y-b/a*sqrt(x*x-a*a))<0.01)then inc(kn)//с точностью 0.01 на линии гиперболы
else inc(kv)//иначе внутри области
end;
//если в нижнем сегменте
if (sqr(x-x01)+sqr(y-y01)<=r1*r1+0.01)and(y>=-b/a*sqrt(x*x-a*a)-0.01) then
begin
if (abs(sqr(x-x01)+sqr(y-y01)-r1*r1)<0.01)//с точностью 0.01 на окружности
or(abs(y+b/a*sqrt(x*x-a*a))<0.01)then inc(kn)//с точностью 0.01 на линии гиперболы
else inc(kv)//иначе внутри области
end;
end;
ks:=n-kn-k;//остальные точки снаружи
writeln('Количество точек внутри заштрихованных областей=',kv);
writeln('Количество точек на границах заштрихованных областей=',kn);
writeln('Количество точек снаружи заштрихованных областей=',ks);
readln
end.
Объяснение кода листинга программы
- Объявление переменных: a, b, x01, x02, r1, r2, y01, y02, x, y, n, i, kv, kn, ks (реальные или целочисленные)
- Ввод параметров гиперболы a, b и условий для окружностей x01, x02, r1, r2
- Вычисление координат центров окружностей y01 и y02
- Ввод количества точек n
- Ввод координат точек (x;y)
- Проверка принадлежности точки к верхнему сегменту гиперболы
- Проверка принадлежности точки к нижнему сегменту гиперболы
- Подсчет количества точек внутри заштрихованных областей (kv)
- Подсчет количества точек на границах заштрихованных областей (kn)
- Подсчет количества точек снаружи заштрихованных областей (ks)
- Вывод результатов
- Чтение подтверждения ввода (readln)