一元多项式加减乘实现c/c++

 一、实验题目:

 一元多项式简单的计算器

1.主要功能:

(1)输入并建立多项式;

(2)输出多项式;

(3)两个多项式相加,建立并输出和多项式;

(4)两个多项式相减,建立并输出差多项式。

(5)算法的时间复杂度、另外可以提出算法的改进方法

实现提示:可选择带头结点的单向循环链表或单链表存储多项式,头结点可存放多项式的参数,如项数等。

2.要求:一元多项式简单计算器的基本功能

二、代码 

 1.全局变量和主函数:

#include<iostream>
using namespace std;
const double T= 0.000001;//用于比较两个double类型的数是否相等;double xs1[1000], xs2[1000], cs1[1000], cs2[1000];//储存两个一元多项式的系数和次数的数组
int n1, n2;//两个一元多项式的项数;
char x;//运算字符(“+”,“-”,“*”)//储存每一项的系数和项数
struct term {double a;//系数double b;//次数term* next, * prior;
};int main() {int flag = 0;while (1) {//输入input();//创建链表term *poly1= creat(xs1, cs1, n1);term *poly2 = creat(xs2, cs2, n2);term* poly=NULL;//计算loop:switch (x) {case '+':poly = add(poly1, poly2);break;case '-':poly = subtract(poly1, poly2);break;case '*':poly = multiply(poly1, poly2);break;case '>':flag = 1;break;default:cout << "暂时不提供该运算" << endl;cin >> x;goto loop;}//输出if (flag) {output(poly1);output(poly2);}elseoutput(poly);}return 0;
}

2.创建多项式

        用双向链表表示一元多项式:头节点储存一元多项式的项数,创建新节点储存每一项的系数和次数,新节点的插入从头节点开始比遍历,找到次数大于新节点的节点,插入这个节点的前面。

*链表有序:方便后续的运算的实现

*双向链表:在插入时,需要找前驱节点,不用再次遍历链表,减小找时间复杂度。

这里其实还可以改进,找插入点时直接这样找:

while(q->next==NULL&&q->next->b>p->b){//……………………………………
}

这样就不用找前驱节点。

/*
目的:创建双向链表储存一元多项式;
输入参数:储存次数和系数的数组,项数;
返回值:有序(按次数小到大)的双向链表的头指针;
*/
term* creat(double xs[], double cs[], int n) {term* head, * p = NULL, * q = NULL;int i = 0;head = new term;head->a = n, head->b = 0;head->next = NULL;head->prior = NULL;q = head;while (i < n) {p = new term;p->a = xs[i];p->b = cs[i++];while (q != NULL && q->b < p->b) {q = q->next;}if (q == NULL) {q = head;while (q->next != NULL)q = q->next;p->next = NULL;p->prior = q;q->next = p;}else {p->next = q;q->prior->next = p;p->prior = q->prior;q->prior = p;}q = head;}return head;
}

2.加减乘实现

加法运算:

        创建新链表储存结果,将两个一元多项式的链表从头开始遍历,链表1和链表2比较次数,如果相等,将两个的系数相加的结果和系数按顺序插入新链表。将新节点插入新链表时,如果新链表中有次数与新节点相同,则直接将新节点的系数与该节点的系数相加。如果链表1的系数大,链表2进入下一个节点,直到链表1的系数小于链表2的系数,链表1进入下一个节点。直到有链表遍历完,将另一个链表的节点插入新链表。

其他的运算类似。

/*
目的:将两个一元多项式相加;
输入参数:两个一元多项式的链表头指针;
返回值:相加后的一元多项式的链表头指针;
*/
term* add(term* p1, term* p2) {p1 = p1->next, p2 = p2->next;term* head, * p, * q;head = new term;head->a = 0, head->b = 0;head->next = NULL;head->prior = NULL;q = head;while (p1 != NULL && p2 != NULL) {p = new term;if (p1->b- p2->b<T) {p->b = p1->b;p->a = p1->a + p2->a;p1 = p1->next;p2 = p2->next;}else if (p1->b < p2->b) {p->b = p1->b;p->a = p1->a;p1 = p1->next;}else {p->b = p2->b;p->a = p2->a;p2 = p2->next;}head = insert(p, head);}if (p1 == NULL) {while (p2 != NULL) {p = new term;p->b = p2->b;p->a = p2->a;head = insert(p, head);p2 = p2->next;}}if (p2 == NULL) {while (p1 != NULL) {p = new term;p->b = p1->b;p->a = p1->a;head = insert(p, head);p1 = p1->next;}}head->a = 0;head->b = 0;return head;
}/*
目的:将两个一元多项式相减
输入参数:两个一元多项式的链表头指针;
返回值:相减后的一元多项式的链表头指针;
*/
term* subtract(term* p1, term* p2) {p1 = p1->next, p2 = p2->next;term* head, * p, * q;head = new term;head->a = 0, head->b = 0;head->next = NULL;head->prior = NULL;q = head;while (p1 != NULL && p2 != NULL) {p = new term;if (p1->b - p2->b<T) {p->b = p1->b;p->a = p1->a - p2->a;p1 = p1->next;p2 = p2->next;}else if (p1->b < p2->b) {p->b = p1->b;p->a = p1->a;p1 = p1->next;}else {p->b = p2->b;p->a = -p2->a;p2 = p2->next;}head = insert(p, head);}if (p1 == NULL) {while (p2 != NULL) {p = new term;p->b = p2->b;p->a = -p2->a;head = insert(p, head);p2 = p2->next;}}if (p2 == NULL) {while (p1 != NULL) {p = new term;p->b = p1->b;p->a = p1->a;head = insert(p, head);p1 = p1->next;}	}head->a = 0;head->b = 0;return head;
}/*
目的:将两个一元多项式相乘
输入参数:两个一元多项式的链表头指针;
返回值:相乘后的一元多项式的链表头指针;
*/
term* multiply(term* p1, term* p2) {term* P2 = p2;p1 = p1->next, p2 = p2->next;term* head, * p, * q;head = new term;head->a = 0, head->b = 0;head->next = NULL;head->prior = NULL;q = head;while (p1 != NULL) {while (p2 != NULL) {p = new term;p->a = p1->a * p2->a;p->b = p1->b + p2->b;head = insert(p, head);p2 = p2->next;}p2 = P2->next;p1 = p1->next;}head->a = 0;head->b = 0;return head;
}/*
目的:输入要计算的两个一元多项式的系数、次数和项数;
输入参数:无;
返回值:无;
*/

新节点插入链表:

       重用率最高的模块,极大的缩减代码篇幅。同时该函数也能确保结果链表依然保持有序。能对不同插入位置(链表尾,链表中)进行处理,能判断要插入的链表中是否有次数相同的节点,避免链表出现相同次数的节点。

/*
目的:将节点有序的插入链表;
输入参数:要插入的节点,被插入的链表头节点;
返回值:插入后的链表的头节点;
*/
term* insert(term* p, term* head) {term *q = head;while (q != NULL && q->b < p->b) {q = q->next;}if (q == NULL) {q = head;while (q->next != NULL)q = q->next;p->next = NULL;p->prior = q;q->next = p;}else if (q->b - p->b < T) {q->a += p->a;}else {p->next = q;p->prior = q->prior;q->prior->next = p;q->prior = p;}return head;
}

 3.输入输出

        提示输入信息,获取两个一元多项式的次数、系数和项数,次数和项数用数组储存。变量和数组均为全局变量,便于后续数据传递。

        输出时按要求打印输出即可。对一些特殊情况分类讨论,如次数或系数为1或0时输出的处理,结果为0时的输出处理。

/*
目的:输入要计算的两个一元多项式的系数、次数和项数;
输入参数:无;
返回值:无;
*/
void input() {cout << "请输入第一个一元多项式的项数:";cin >> n1;if (n1 >= 1000) {cout << "项数过多,请重新输入:";cin >> n1;}cout << "请输入每一项的系数:" << endl;for (int i = 0;i < n1;i++) {cin >> xs1[i];}cout << "请输入对应项数的次数:" << endl;for (int i = 0;i < n1;i++) {cin >> cs1[i];}cout << endl << "请输入第二个一元多项式的项数:";cin >> n2;if (n2 >= 1000) {cout << "项数过多,请重新输入:";cin >> n2;}cout << "请输入每一项的系数:" << endl;for (int i = 0;i < n2;i++) {cin >> xs2[i];}cout << "请输入对应项数的次数:" << endl;for (int i = 0;i < n2;i++) {cin >> cs2[i];}cout << "请输入你要进行的运算('+','-','*','>'):" << endl;cin >> x;
}/*
目的:按格式输出结果;
输入参数:结果链表头节点;
返回值;无;
*/
void output(term* p) {int flag1 = 0, flag2 = 0;p = p->next;cout << "结果为:" << endl;while (p != NULL) {if (p->a != 0) {flag2 = 1;}else {p = p->next;continue;}if (p->b <T) {cout << p->a;flag1 = 1;}else {if (flag1 == 0) {if (p->a -1<T && p->b - 1>T)cout << "x^" << p->b;else if (p->a - 1<T && p->b - 1<T)cout << "x";else if (p->a - 1>T && p->b- 1<T)cout << p->a << "x";elsecout << p->a << "x^" << p->b;flag1 = 1;}else {if (p->a - 1<T && p->b - 1>T)cout << "+" << "x^" << p->b;else if (p->a-1<T && p->b - 1<T)cout << "+" << "x";else if (p->a - 1>T && p->b - 1<T)cout << p->a << "x";elsecout << "+" << p->a << "x^" << p->b;}}p = p->next;}if (flag2 == 0)cout << 0 << endl;cout << endl << endl << "----------------------------------" << endl;
}

三、总结

老师评价:

1.作为一个计算器而言,输入界面还不够直观,用户体验感缺乏。

2. 输入需要先输入项数,不能直接输入次数和项数。

3.两个一元多项式计算完再计算其他运算需要再次输入次数和系数。

4.基本功能实现,额外实现乘法。

自我体会:

         应该将这个当成一个项目,而不是一次题目,应该制造一个人能用的计算器,而不是完成题目给定的要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/143305.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一元多项式的加法

一元多项式的加法 问题描述&#xff1a;一元多项式的加法 &#xff08;1&#xff09; 编程实现一元多项式的加法。 &#xff08;2&#xff09; 编写一个测试主函数。 分析&#xff1a; 对于任意一元多项式 可以抽象为一个由“系数—指数”对构成的线性表&#xff0c;且线性表中…

一元多项式求导

问题描述&#xff1a; 设计函数求一元多项式的导数。&#xff08;注&#xff1a;x​n​​&#xff08;n为整数&#xff09;的一阶导数为nx​n−1​​。&#xff09; #include<cstdio> int main() {int a[100000];int b[100000];int n,m;char c;//判断结束的条件scanf(&q…

一元多项式课设

代码详见 目录 一、实习任务........................................................................................... - 1 - 1.问题描述&#xff1a;.................................................................................... - 1 - 2.小组分工.........…

数据结构:一元多项式及其基本运算

1、实现方式&#xff1a;可采用线性表的顺序存储结构&#xff0c;但是当多项式的每个项的指数差别很大时&#xff0c;会浪费很多存储空间。所以采用链式存储方式表示&#xff0c;每一项可以表示成一个结点&#xff0c;结点的结构由存放系数的coef域&#xff0c;存放指数的expn域…

一元多项式计算

目录 题目的内容及要求--------------------------------------------2需求分析-------------------------------------------------------2概要设计-------------------------------------------------------2 1、存储结构------------------------------------------------…

【数据结构】一元多项式的表示及相加

文章目录 ⭐️写在前面的话⭐️一元多项式的表示及相加初始化0_1、初始化链表0_2_1、头插法插入多项式的项(没有相同项)0_2_2、将要插入的相同&#xff0c;链表中有相同项&#xff0c;对应系数相加0_3、从链表中查找是否有相同的指数项0_4、对已经创建好的一元多项式按指数大小…

数据结构(严蔚敏)【一元多项式的运算】【C语言】

1、一元多项式的运算&#xff1a;实现两个多项式加、减乘运算 设计内容&#xff1a; 用顺序存储结构实现一元多项式的加法、减法和乘法。具体要求为&#xff1a;用五个函数分别实现一元多项式的创建、输出、加法、减法和乘法&#xff1b; 设计思路&#xff1a; 将顺序表数组…

算法竞赛入门【码蹄集进阶塔335题】(MT2151-2175)

算法竞赛入门【码蹄集进阶塔335题】(MT2151-2175&#xff09; 文章目录 算法竞赛入门【码蹄集进阶塔335题】(MT2151-2175&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录1. MT2151 权值计算2. MT2152 黑客小码哥3. MT2153 来给…

Linux基础之LVM卷管理

LVM LVM是 Logical Volume Manager&#xff08;逻辑卷管理&#xff09;的简写&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小&#xff0c;以分配合适的硬盘空间。普通的…

linux lvcreate,LFCS:如何使用vgcreate,lvcreate和lvextend命令管理和创建LVM - 第11部分...

因为在LFCS考试要求有效的二月变化 2&#xff0c;2016年 &#xff0c;我们增加了必要的专题到LFCS系列发表在这里。 为了准备这场考试&#xff0c;你是高度鼓励使用联邦经济竞争法系列为好。 LFCS&#xff1a;管理LVM和创建LVM分区 - 第11部分 安装Linux系统时最重要的决定之一…

lvm 制作

壹&#xff1a; 创建LVM 逻辑卷 1&#xff0c;将物理盘格式为pv卷&#xff08;物理卷&#xff09;&#xff0c;使用pvcreate 命令 pvcreate /dev/sdc 或则是 pvcreate /dev/sdc /dev/sdb pvdisplay 或pvs 命令查看 PV 物理卷得创建情况 2,创建卷组 VG 通过vgcreate 命令,将pv加…

lvcreate 常用命令举例

http://linux.cn/article-5117-1.html4 个 lvcreate 常用命令举例 2015-3-25 15:09| 查看: 2752| 评论: 3| 收藏: 3| 分享: 10 原文&#xff1a;http://www.ehowstuff.com/4-lvcreate-command-examples-on-linux/作者&#xff1a; skytech译文&#xff1a;LCTT https://linux.…

49.逻辑卷管理4,逻辑卷管理详解,lvscan,lvcreate,lvdisplay,lvextend,lvreduce,lvremove,lvresize,lvchange

逻辑卷相关操作 可以把逻辑卷想象成分区&#xff0c;那么这个逻辑卷当然也需要被格式化和挂载。另外&#xff0c;逻辑卷也是可以动态调整大小的&#xff0c;而且数据不会丟失&#xff0c;也不用卸载逻辑卷。 常用的命令有 lvscan Lvcreate Lvdisplay lvextend lvreduce Lvremov…

oppo手机删除计算机怎样恢复,【数据恢复篇】oppo手机删掉的照片怎么恢复

原标题&#xff1a;【数据恢复篇】oppo手机删掉的照片怎么恢复 手机删掉的照片可以恢复吗&#xff1f;oppo手机删掉的照片怎么恢复&#xff1f;很多人会奇怪oppo手机删掉的照片还能恢复吗&#xff1f;现在科技技术的提高&#xff0c;照片能够被恢复也是很简单的。像我们所知道的…

苹果手机照片误删恢复的方法

苹果手机照片误删恢复的方法&#xff1f;苹果手机相册里都有一个【最近删除】相册&#xff0c;为了恢复我们手机里误删的照片&#xff0c;我们首先可以打开相册&#xff0c;然后找里面的最近删除的相簿&#xff0c;看看里面有没有自己误删的照片&#xff0c;如果有的话&#xf…

android sd卡数据恢复软件下载,手机SD卡内存卡数据恢复软件

手机SD卡内存卡数据恢复软件免费版是一款专门解决内存卡等存储介质数据丢失问题的恢复软件&#xff0c;支持各个型号的SD卡、内存卡及U盘的删除恢复、格式化恢复等。 手机SD卡内存卡数据恢复软件是一款简单易用功能强大的数据恢复软件。该软件有针对性的对各类内存卡进行数据恢…

android 恢复照片误删,安卓手机数据恢复:红米手机照片误删怎么恢复

原标题&#xff1a;安卓手机数据恢复&#xff1a;红米手机照片误删怎么恢复 红米手机误删照片怎么恢复&#xff1f;小编的也爷爷使用的是红米手机&#xff0c;有一天跟我说“他误删了手机上的很多张照片&#xff0c;还一直抱怨自己眼花乱删东西”。小编就赶紧安慰爷爷还说会帮他…

android删除sd卡照片恢复,安卓手机照片误删怎么恢复

现如今国内大多的人都拥有一部智能手机&#xff0c;使用手机拍摄照片记录生活中的美好也成为了一种普遍流行的行为。当我们用手机照片记录身边点滴后&#xff0c;经过时间的打磨&#xff0c;我们也需要整理这些照片&#xff0c;误删照片随之成为一个严峻的问题&#xff0c;手机…

android删除手机照片恢复软件,安卓手机上照片删除如何恢复?

原标题&#xff1a;安卓手机上照片删除如何恢复&#xff1f; 安卓手机上的照片被删除了如何恢复&#xff1f;现在大部分手机都有手机最近删除相册&#xff0c;当发现手机上的数据被自己误删的时候&#xff0c;可以在手机最近删除相册中快速恢复。不过呢&#xff0c;最近删除的相…

android系统手机能看到照片,安卓怎么恢复手机照片?原来可以这样做

安卓怎么恢复手机照片&#xff1f;原来可以这样做~其实照片在我们生活工作中扮演者重要的色&#xff0c;对很多人来说一张照片不仅仅是一份回忆&#xff0c;更是感情沟通的桥梁&#xff0c;误删了手机里重要的照片怎么找回来呢&#xff1f;手机照片恢复管家免费教你哦~ 一、安卓…