本文最后更新于350 天前,其中的信息可能已经过时,如有错误请发送邮件到1941902161@qq.com
1 问题描述与分析
1.1 问题陈述
求一元多项式Pn(x) = p0+p1x+p2x2+…+pnxn的一阶导数。
1.2 问题分析
1. 研究对象
一元多项式每一项分为系数和指数,因此对象为一元多项式,每一项包含系数和指数两个属性。
2. 功能需求分析
本实验包含3个功能,结构图如图A.1所示。
- 创建多项式;
- 显示多项式;
- 多项式求导。
2 数据结构设计
一元多项式的每一项由系数和指数幂决定,所以采用链式存储,包含两个数据项coef 和 exp,一个指针域。结点定义如下:
struct PolyNode {
string coef; // 系数
int exp; // 指数并初始化为0
PolyNode* next; // 指向下一个节点的指针,使用nullptr初始化
};
3 算法设计
根据上述的算法功能,本程序涉及的算法有创建一元多项式、显示一元多项式、求导。
3.1 创建一元多项式
初始化单链表L过后,调用CreatePoly 函数,使用尾插法插入各项,算法描述如下
void CreatePoly(PolyNode*& L) {
PolyNode* p = L; // p指向头结点
PolyNode* q; // q指向新创建的节点
int n;
cout << "请输入多项式的项数:";
cin >> n;
for (int i = 0; i < n; i++) {
q = new PolyNode;
cout << "请输入第" << i + 1 << "项的系数和指数:";
cin >> q->coef >> q->exp; // 输入系数和指数
p->next = q; // 将新节点插入到链表中
p = q;
}
p->next = NULL; // 尾节点指针置空
}
3.2 显示一元多项式
显示每项的系数和指数,但要注意系数正数输出+,负数不输出+,指数为零时不输出x,指数为1时输出x,其他正常是x^exp,算法描述如下。
void PrintPoly(PolyNode* L) {
PolyNode* p = L->next;
while (p) {
if (p != L->next && p->coef[0] != '-') cout << "+"; // 非首元结点且系数为正数时,输出"+"
if (p->exp == 0) { // 当指数为0时,直接输出系数
cout << p->coef;
}
else if (p->exp == 1) { // 当指数为1时,输出系数和"x"
cout << p->coef << "x";
}
else { // 其他情况,输出系数、"x^"和指数
cout << p->coef << "x^" << p->exp;
}
p = p->next;
}
cout << endl;
}
3.3 求导
求导,即系数=系数×指数,然后指数-1,但要注意常数项直接为0被删去,算法描述如下。
void Derivation(PolyNode* L) {
PolyNode* p = L;
while (p->next) {
if (p->next->exp == 0) { // 删除常数项
PolyNode* toDelete = p->next;
p->next = toDelete->next;
delete toDelete;
}
else {
// 更新系数
p->next->coef = parseCoef(p->next->coef, p->next->exp);
p->next->exp--; // 降低指数
p = p->next;
}
}
}
3.4 界面设计
程序包含多个功能,系统采用菜单形式提供功能选择。菜单定义如下。
void dispmenu()
{
cout << "------请选择操作------" << endl;
cout << "1.输入多项式" << endl;
cout << "2.输出多项式" << endl;
cout << "3.求导" << endl;
cout << "4.退出" << endl;
}
4 运行与测试
- 程序启动成功,显示菜单,如图A.2所示。
- 按1,创建多项式,输入项数,然后输入系数和指数。
如图A.3所示。
- 按2,显示多项式,如图A.4所示。
- 按3,对多项式进行求导,如图A.5所示。
- 按4,摧毁链表L,并退出。
5 小结
5.1 实验所得
(1) 学会单链表的初始化,创建和使用;
(2) 根据具体问题,调整单链表结构体的定义。本实验结构体定义包含两个数据域,一个指针域;
5.2 注意事项
(1) 显示单链表要注意注意系数正数输出+,负数不输出+,指数为零时不输出x,直接输出系数,指数为1时输出x,而不是x^1;
(2) 求导函数,当系数复杂时,如 20abc,要将数字和字母分离出来,将数字与指数相乘,字母拼接在所得系数后面。