设计优点
设计了一个Item结构,用来表示每一个项。同时使用单链表将这一个个项串联起来构成一个多项式。同时在设计单链表的各种基础函数时,多使用模板来实现,在后期可以拥有更好的延展性。
实现过程中遇到的主要问题:
-
LNK2019 无法解析的外部符号 pipe_server,该符号在函数中被引用
因为我没有引用外部库,所以排除lib库的因素,但是这个错误确实是链接的问题。 最终锁定是因为该函数调用了一个函数,但是该函数只是定义了,还没有写具体的实现。找到定义了却找不到实现 -
秦九韶算法实现多项式求值问题: 找了很多博客,都没有利用很好地秦九韶算法的递归性质的算法,自己琢磨用递归的方法写了一个实现函数:
double fun( LinkNode<Item>* L, double x) const /*最好设计为const函数,一是防止修改类成员,二是方便和const成员函数对接。*/
{
LinkNode<Item>* p = L, *q; //exponent系数,ceofficient指数
double sum = 0;
while (p != NULL && p->data.exponent == 0)
{
sum += p->data.ceofficient;
p = p->next;
if (p == NULL) //只有常数项
return sum;
}
if (p != NULL&&p->next == NULL && p->data.exponent == 1)
return x * p->data.ceofficient+sum;
q = p;
while (p != NULL)
{
p->data.exponent--;
p = p->next;
}
return x * (fun(q, x)+sum);
}
- 牛顿迭代法求近似根:需要和秦九韶算法或其他求值函数相配合实现。在我的设计过程中,由于函数每次迭代都会调用diff()函数取表达式的微分,因此会导致计算出nan或其他错误。故使用fun0代表原表达式,fun1表示原表达式的微分。
friend double nutow_fun(Polynomial fun0,Polynomial fun1,double x) //牛顿迭代法中设计fun0,fun1避免迭代过程中重复调用diff而导致表达式最终出错
{
double result = x - fun0.value(x) / fun1.value(x);
if (abs(result - x) >= 1e-8)
return nutow_fun(fun0, fun1, result);
else
return result;
}
double root_near(double x0)const
{
Polynomial fun0(*this);
Polynomial fun1(this->diff());
return nutow_fun(fun0, fun1, x0);
}
- 其他相关算术计算函数的设计都和普通的变量计算差异不大。本次使用了很多模板函数来完成构造单链表和输出单链表等基础功能。在以后的设计中,可以尽可能地多使用函数模板,拓宽函数的延展性。 *完整源代码链接:github.com/Free-Geter/…