我必须在pascal中编写一个程序,给定多项式的三个系数(ax²+ bx + c),输出它的根。
这就是我现在所拥有的:
List<Customer>
它适用于真正的根,但我不知道如何使它适用于复杂的数字。
答案 0 :(得分:1)
我假设你的系数是真实的数字(用户不能输入复数作为系数)。这将为问题增加一个全新的复杂程度(没有双关语)。
您需要检查判别((square(p.b)) - (4 * p.a * p.c)
)以查看它是否小于0.目前,您的代码只是,sqrt((square(p.b)) - (4 * p.a * p.c))
但您不是&{ #39;检查你是否采用负数的平方根(你不能使用Pascal sqrt
库函数)。
如果判别式为负,那么您有一个复杂的根,您可以在程序中根据需要分离实部和虚部。这是基本的quadratic formula。
例如:
procedure roots (p : polynomial; var rP, rN : real);
var disc: real;
begin
disc := square(p.b) - 4*p.a*p.c;
if disc >= 0 then begin
rP := (-p.b + sqrt(disc)) / (2 * p.a);
rN := (-p.b - sqrt(disc)) / (2 * p.a);
writeln('The roots are: ', rP:0:3, ' y ' ,rN:0:3);
end
else begin
// Roots are:
// -p.b/(2*p.a) + (sqrt(-disc)/(2*p.a))i
// -p.b/(2*p.a) - (sqrt(-disc)/(2*p.a))i
end
end;
在这里,您使用sqrt(x)
如果x
为否定的事实,(sqrt(-x))i
其中i
为sqrt(-1)
。请注意,您还可以拆分disc = 0
案例以避免重复双根。
由于您的roots
功能打印出结果,而您的主程序没有使用返回的参数rN
和rP
,因此我不清楚你需要传回根源。但是如果想要将根作为参数传递(你现在设计的功能的方式),我会把它作为练习。您只需要决定复杂根的表示。一种方法是使用Complex
数字类型作为结果(如果您的编译器库支持它们),并且当结果是真实的时,虚部将只为零。或者,如果您需要创建自己的,只需创建type
record
,其中包含真实和虚构部分。
type complex = record
re: real;
im: real;
end;