Линии пересекаются в точках, где их уравнения при одинаковых аргументах возвращают одинаковые значения. Чтобы определить условия точек пересечения заданных уравнений линий
следует приравнять их правые части и решить полученное уравнение относительно аргумента х.
Сделаем подстановку и получим квадратное уравнение:
Далее находим дискриминант, проверяем его знак, производим ветвление алгоритма в зависимости от результата. При неотрицательных t определяем х, извлекая из t квадратный корень и для каждого х вычисляем у из второго уравнения (оно короче).
var a, b, c, d, f, m, p: real;
function y(x: real): real; begin y := b * x * sqr(x) + m * sqr(x) + d * x + p end;
procedure OutPoint(x: real); begin writeln('Найдена точка пересечения функций (', x, ',', y(x), ')') end;
procedure TDev(t: real; var np: Boolean); var x: real; begin if t = 0 then begin np := false; OutPoint(0) end else if t > 0 then begin np := false; x := -sqrt(t); OutPoint(x); x := sqrt(t); OutPoint(x) end end;
var x1, x2, u, v, t1, t2, Dis: real; NoPoints: Boolean;
begin writeln('Введите значения переменных a,b,c,d,f,m,p'); readln(a, c, f, m, p); u := c - m; v := f - p; Dis := sqr(u) - 4 * a * v; NoPoints := true; if Dis = 0 then begin t1 := -u / (2 * a); TDev(t1,NoPoints); end else begin t1 := (-u - sqrt(Dis)) / (2 * a); TDev(t1,NoPoints); t2 := (-u + sqrt(Dis)) / (2 * a); TDev(t2,NoPoints); end; if NoPoints then writeln('Общих точек пересечения нет') end.
Тестовое решение
Введите значения переменных a,b,c,d,f,m,p 2 3 4 5 6 7 8 Найдена точка пересечения функций (-1.27201964951407,14.0901699437495) Найдена точка пересечения функций (1.27201964951407,14.0901699437495)
Введите значения переменных a,b,c,d,f,m,p -3 -5 -3 2 1 4 5 Общих точек пересечения нет
Var f: string := 'output1.txt'; fo: array of string := ('out1.txt', 'out2.txt', 'out3.txt'); bools: array [0..2] of boolean; a, b: integer;
begin System.IO.File.WriteAllText(f, ''); foreach str: string in fo do System.IO.File.WriteAllText(str, '');
readln(a, b); for i: integer := a to b do System.IO.File.AppendAllText(f, i.toString() + System.Environment.NewLine);
foreach str: string in System.IO.File.ReadAllLines(f) do begin b := StrToInt(str); bools[System.Math.Sign(b) + 1] := true; System.IO.File.AppendAllText(fo[System.Math.Sign(b) + 1], b.ToString() + System.Environment.NewLine); end;
for i: integer := 0 to 2 do if not (bools[i]) then begin write('В файле с '); case i of 2: write('положительными'); 1: write('нулевыми'); 0: write('отрицательными'); end; writeln(' значениями нет записей'); end; end.
следует приравнять их правые части и решить полученное уравнение относительно аргумента х.
Сделаем подстановку и получим квадратное уравнение:
Далее находим дискриминант, проверяем его знак, производим ветвление алгоритма в зависимости от результата. При неотрицательных t определяем х, извлекая из t квадратный корень и для каждого х вычисляем у из второго уравнения (оно короче).
var
a, b, c, d, f, m, p: real;
function y(x: real): real;
begin
y := b * x * sqr(x) + m * sqr(x) + d * x + p
end;
procedure OutPoint(x: real);
begin
writeln('Найдена точка пересечения функций (', x, ',', y(x), ')')
end;
procedure TDev(t: real; var np: Boolean);
var
x: real;
begin
if t = 0 then begin
np := false;
OutPoint(0)
end
else if t > 0 then begin
np := false;
x := -sqrt(t);
OutPoint(x);
x := sqrt(t);
OutPoint(x)
end
end;
var
x1, x2, u, v, t1, t2, Dis: real;
NoPoints: Boolean;
begin
writeln('Введите значения переменных a,b,c,d,f,m,p');
readln(a, c, f, m, p);
u := c - m;
v := f - p;
Dis := sqr(u) - 4 * a * v;
NoPoints := true;
if Dis = 0 then begin
t1 := -u / (2 * a);
TDev(t1,NoPoints);
end
else begin
t1 := (-u - sqrt(Dis)) / (2 * a);
TDev(t1,NoPoints);
t2 := (-u + sqrt(Dis)) / (2 * a);
TDev(t2,NoPoints);
end;
if NoPoints then writeln('Общих точек пересечения нет')
end.
Тестовое решение
Введите значения переменных a,b,c,d,f,m,p
2 3 4 5 6 7 8
Найдена точка пересечения функций (-1.27201964951407,14.0901699437495)
Найдена точка пересечения функций (1.27201964951407,14.0901699437495)
Введите значения переменных a,b,c,d,f,m,p
-3 -5 -3 2 1 4 5
Общих точек пересечения нет
f: string := 'output1.txt';
fo: array of string := ('out1.txt', 'out2.txt', 'out3.txt');
bools: array [0..2] of boolean;
a, b: integer;
begin
System.IO.File.WriteAllText(f, '');
foreach str: string in fo do
System.IO.File.WriteAllText(str, '');
readln(a, b);
for i: integer := a to b do
System.IO.File.AppendAllText(f, i.toString() + System.Environment.NewLine);
foreach str: string in System.IO.File.ReadAllLines(f) do
begin
b := StrToInt(str);
bools[System.Math.Sign(b) + 1] := true;
System.IO.File.AppendAllText(fo[System.Math.Sign(b) + 1], b.ToString() + System.Environment.NewLine);
end;
for i: integer := 0 to 2 do
if not (bools[i]) then
begin
write('В файле с ');
case i of
2: write('положительными');
1: write('нулевыми');
0: write('отрицательными');
end;
writeln(' значениями нет записей');
end;
end.