实验 一元多项式求导
本文最后更新于350 天前,其中的信息可能已经过时,如有错误请发送邮件到1941902161@qq.com

1 问题描述与分析

1.1 问题陈述

求一元多项式Pn(x) = p0+p1x+p2x2+…+pnxn­的一阶导数。

1.2 问题分析

1. 研究对象

一元多项式每一项分为系数和指数,因此对象为一元多项式,每一项包含系数和指数两个属性。

2. 功能需求分析

本实验包含3个功能,结构图如图A.1所示。

图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所示。
图A. 2 显示菜单
  • 按1,创建多项式,输入项数,然后输入系数和指数。

如图A.3所示。

图A. 3 创建多项式
  • 按2,显示多项式,如图A.4所示。
图A. 4 显示多项式
  • 按3,对多项式进行求导,如图A.5所示。
图A. 5 求导
  • 按4,摧毁链表L,并退出。

5 小结

5.1 实验所得

(1) 学会单链表的初始化,创建和使用;

(2) 根据具体问题,调整单链表结构体的定义。本实验结构体定义包含两个数据域,一个指针域;

5.2 注意事项

(1) 显示单链表要注意注意系数正数输出+,负数不输出+,指数为零时不输出x,直接输出系数,指数为1时输出x,而不是x^1;

(2) 求导函数,当系数复杂时,如 20abc,要将数字和字母分离出来,将数字与指数相乘,字母拼接在所得系数后面。


完整代码:https://codecopy.cn/post/ell4th?pw=candle

作者:candlesun
版权声明: 本博客所有文章均采用CC BY-NC-SA 4.0协议
转载请注明文章地址及作者
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇