Найти точку пересечения прямой и оси абсцисс - PascalABC.NET
Формулировка задачи:
программа которая на входе получает шесть чисел a, b, c, d, e, f, а выводит:
если точки нет, то программа говорит, что такой точки не существует
1. точку пересечения прямой ax + by + c = 0 и оси абсцисс
2. точку пересечения прямой ax+ by + c = 0 и оси ординат
3. точку пересечения прямой dx + ey + f = 0 и оси абсцисс
4. точку пересечения прямой dx + ey + f = 0 и оси ординат
5. точку пересечения прямой ax + by + c = 0 и прямой dx + ey + f = 0
БОЛЬШОЕ ВСЕМ СПАСИБО УЖЕ СДЕЛАЛ САМ!
Решение задачи: «Найти точку пересечения прямой и оси абсцисс»
textual
Листинг программы
uses graphABC;
var cn:integer;
xn,xk,m:real;
procedure peres(a1,b1,c1,a2,b2,c2:integer;var f:boolean;var x,y:real);
begin
if a1*b2-a2*b1=0 then f:=false
else
begin
f:=true;
x:=(c2*b1-c1*b2)/(a1*b2-a2*b1);
y:=(a2*c1-a1*c2)/(a1*b2-a2*b1);
end;
end;
procedure grafik(a,b,c:integer;cl:Color);
var x:real;
begin
pen.Color:=cl;
if a=0 then line(0,cn-round(-c*m/b),window.Width,cn-round(-c*m/b))
else if b=0 then line(cn+round(-c*m/a),0,cn+round(-c*m/a),window.Height)
else
begin
x:=xn;
while x<=xk do
begin
if x=xn then moveto(cn+round(x*m),cn-round((-a*x/b-c/b)*m))
else lineto(cn+round(x*m),cn-round((-a*x/b-c/b)*m));
x:=x+0.1;
end;
end;
end;
var a,b,c,d,e,f,i:integer;
t:boolean;
x,y:real;
sx,sy:string;
begin
repeat
writeln('Введите кооффициенты прямой a,b,c, а и b одновременно не равные 0:');
readln(a,b,c);
until (a<>0)or(b<>0);
repeat
writeln('Введите кооффициенты прямой d,e,f, d и e одновременно не равные 0:');
readln(d,e,f);
until (d<>0)or(e<>0);
window.Clear;
setwindowsize(500,600);
centerwindow;
cn:=250;
m:=220/10;
xn:=-10;
xk:=10;
line(0,cn,500,cn);
line(cn,0,cn,500);
for i:=1 to 10 do
begin
line(cn-round(i*m),cn-3,cn-round(i*m),cn+3);
line(cn+round(i*m),cn-3,cn+round(i*m),cn+3);
line(cn-3,cn-round(i*m),cn+3,cn-round(i*m));
line(cn-3,cn+round(i*m),cn+3,cn+round(i*m));
textout(cn+round(i*m),cn+10,inttostr(i));
textout(cn-round(i*m),cn+10,inttostr(-i));
textout(cn-20,cn-round(i*m),inttostr(i));
textout(cn-20,cn+round(i*m),inttostr(-i));
end;
grafik(a,b,c,clRed);
grafik(d,e,f,clBlue);
peres(a,b,c,0,1,0,t,x,y);
if not t then textout(5,500,'Прямая ax+by+c не пересекает ось абцисс')
else
begin
str(x:0:2,sx);
str(y:0:2,sy);
brush.Color:=clBlack;
circle(cn+round(x*m),cn,3);
brush.Style:=bsClear;
textout(5,500,'Пряиая ax+by+c пересекет ось абцисс в точке x='+sx+' y='+sy);
end;
peres(a,b,c,1,0,0,t,x,y);
if not t then textout(5,520,'Прямая ax+by+c не пересекает ось ординат')
else
begin
str(x:0:2,sx);
str(y:0:2,sy);
brush.Color:=clBlack;
circle(cn,cn-round(y*m),3);
brush.Style:=bsClear;
textout(5,520,'Прямая ax+by+c пересекает ось ординат в точке x='+sx+' y='+sy);
end;
peres(d,e,f,0,1,0,t,x,y);
if not t then textout(5,540,'Прямая dx+ey+f не пересекает ось абцисс')
else
begin
str(x:0:2,sx);
str(y:0:2,sy);
brush.Color:=clBlack;
circle(cn+round(x*m),cn,3);
brush.Style:=bsClear;
textout(5,540,'Пряиая dx+ey+f пересекет ось абцисс в точке x='+sx+' y='+sy);
end;
peres(d,e,f,1,0,0,t,x,y);
if not t then textout(5,560,'Прямая dx+ey+f не пересекает ось ординат')
else
begin
str(x:0:2,sx);
str(y:0:2,sy);
brush.Color:=clBlack;
circle(cn,cn-round(y*m),3);
brush.Style:=bsClear;
textout(5,560,'Прямая dx+ey+f пересекает ось ординат в точке x='+sx+' y='+sy);
end;
//при малых углах между прямыми точка пересечения уходит за экран
peres(a,b,c,d,e,f,t,x,y);
if not t then textout(5,580,'Прямые ax+by+c и dx+ey+f не пересекаются')
else
begin
str(x:0:2,sx);
str(y:0:2,sy);
brush.Color:=clBlack;
circle(cn+round(x*m),cn-round(y*m),3);
brush.Style:=bsClear;
textout(5,580,'Прямые ax+by+c и dx+ey+f пересекаются в точке x='+sx+' y='+sy);
end;
end.
Объяснение кода листинга программы
В этом коде используются две процедуры: peres и grafik.
peres- это процедура, которая проверяет, пересекаются ли две прямые. Если они пересекаются, то возвращается значениеtrue, иначе -false. Также в этой процедуре вычисляются координаты точки пересечения и они выводятся на экран.grafik- это процедура, которая рисует график прямой на экране. Вначале задаются начальные и конечные координаты для линии, а затем, используя циклы, рисуются множество точек на этой линии. В основной части кода сначала запрашиваются у пользователя коэффициенты для первой прямой (a, b, c). Затем, после проверки на неравенство нулю, запрашиваются коэффициенты для второй прямой (d, e, f). Затем на экране рисуются две прямые с указанными коэффициентами, и вызывается процедураperesдля проверки пересечения этих прямых с осью абсцисс и осью ординат. Если пересечение найдено, то на экране отображается точка пересечения. В конце кода выполняется проверка на пересечение двух прямых. Если они не пересекаются, то выводится сообщение об этом. Если же пересечение найдено, то на экране отображается точка пересечения.