一元稀疏多项式计算器c语言
- 格式:docx
- 大小:37.13 KB
- 文档页数:2
// 13Dlg.cpp : 实º¥Ì现?文?件t//#include"stdafx.h"#include"13.h"#include"13Dlg.h"#include"afxdialogex.h"#ifdef _DEBUG#definenew DEBUG_NEW#endif// 用®?于®¨²应®|用®?程¨¬序¨©“¡ã关?于®¨²”¡À菜?单Ì£¤项?的Ì? CAboutDlg 对?话¡ã框¨©class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对?话¡ã框¨©数ºy据Yenum { IDD = IDD_ABOUTBOX };protected:virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDV 支¡ë持?// 实º¥Ì现?protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CMy13Dlg 对?话¡ã框¨©CMy13Dlg::CMy13Dlg(CWnd* pParent /*=NULL*/): CDialogEx(CMy13Dlg::IDD, pParent)m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMy13Dlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CMy13Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, &CMy13Dlg::OnBnClickedButton1)ON_EN_CHANGE(IDC_EDIT4, &CMy13Dlg::OnEnChangeEdit4)ON_BN_CLICKED(IDC_BUTTON2, &CMy13Dlg::OnBnClickedButton2)ON_EN_CHANGE(IDC_EDIT1, &CMy13Dlg::OnEnChangeEdit1)ON_EN_CHANGE(IDC_EDIT2, &CMy13Dlg::OnEnChangeEdit2)ON_BN_CLICKED(IDC_BUTTON3, &CMy13Dlg::OnBnClickedButton3)ON_BN_CLICKED(IDC_BUTTON4, &CMy13Dlg::OnBnClickedButton4)ON_BN_CLICKED(IDC_BUTTON5, &CMy13Dlg::OnBnClickedButton5)ON_BN_CLICKED(IDC_BUTTON6, &CMy13Dlg::OnBnClickedButton6)ON_BN_CLICKED(IDC_BUTTON7, &CMy13Dlg::OnBnClickedButton7)ON_EN_CHANGE(IDC_EDIT3, &CMy13Dlg::OnEnChangeEdit3)END_MESSAGE_MAP()// CMy13Dlg 消?息¡é处ä|理¤¨ª程¨¬序¨©BOOL CMy13Dlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将?“¡ã关?于®¨²...”¡À菜?单Ì£¤项?添¬¨ª加¨®到Ì?系¥Ì统ª3菜?单Ì£¤中D。
2014-2015学年第二学期《软件工程》课程设计报告题目:一元稀疏多项式计算器专业:计算机科学与技术班级:计算机科学与技术(2)班姓名:指导教师:成绩:一、问题描述 (3)二、需求分析 (3)三、概要设计 (4)四、详细设计 (5)五、源代码 (6)六、程序测试 (18)七、使用说明 (24)八、课设总结 (25)一、问题描述1.1基本要求(1)输入并建立多项式;(2)输出多项式,输出形式为整数序列:n,c1,e1, c2,e2,,,,,,, cn,en,其中n是多项式的项数,ci,ei,分别是第i项的系数和指数,序列按指数降序排序;(3)多项式a和b相加,建立多项式a+b;(4)多项式a和b相减,建立多项式a-b;(5)计算多项式在x处的值。
(6)计算器的仿真界面。
1.2设计目的数据结构是实践性很强的课程。
课程设计是加强学生实践能力的一个强有力手段。
课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。
严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用二、需求分析2.1 设计开发环境:软件方面:系统windows 7 编程软件:VC++ 6.02.2思路分析:①一般情况下的一元n次多项式可写成pn(x)=p1xe1+p2xe2+……+pmxem其中,p1是指数为ei的项的非零系数,且满足0≦e1<e2<……<em=n ,若用一个长度为m且每个元素有两个数据项(系数项和指数项)的线性表((p1,e1),(p2,e2),……,(pm,em))便可惟一确定多项式pn(x)。
②用两个带表头结点的单链表分别存储两个多项式③根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;④只需要将第二个多项式的系数改为其相反数,然后根据一元多项式相加的运算规则便可以得到其相应的“差多项式”三、概要设计图3-1功能模块图为实现上述程序功能,用带表头结点的单链表存储多项式。
题目:编制一个一元多项式基本运算的程序姓名: 学号:PB110130一、需求分析1.在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。
由稀疏多项式的特点,故采用链式存储结构,可以不会带来浪费存储空间。
2.程序中单链表存储,根据链表的指数域,对链表进行升序排序,可给运算带来方便。
3.程序设计是在VC6.0环境下设计的的。
4.程序执行的命令为(程序主界面):二、概要设计抽象数据类型一元多项式的定义如下:1.LNode *MakeNode(double coef, int exp) 通过传入指数和系数创建一个节点,返回该节点的地址。
2.void InitList(LinkList &L)初始化,带头节点3.void PrintPolyn (LinkList L) 传入链表的指针,打印该链表4.LinkList CreatPolyn(void)//输入m项的系数和指数,建立表示一元多项式的有序链表L5.double SumPolyn(LinkList L,double x) 传入链表的指针及x值,求多项式的值。
6.void DestroyPolyn (LinkList &L) 销毁多项式,去掉头节点7.void ClearPolyn (LinkList &L) 清空多项式,保留节点实验报告8.void CopyPolyn (LinkList La,LinkList &Lb) 将La位置的多项式复制到Lb位置9.void AddPolyn(LinkList L,LinkList J ,LinkList &K) 将a和b多项式相加存到c10.void MultiplyPolyn(LinkList L,LinkList J,LinkList &K)将a和b相减存到c11. void MultiplyPolyn(LinkList L,LinkList J,LinkList &K)将a和b多项式相乘存到c12。
1.一元稀疏多项式简单的计算器(实验类型:综合型)1)问题描述:用线性表表示一元稀疏多项式,设计一个一元多项式运算器2)实验要求:✧采用单链表存储结构一元稀疏多项式✧输入并建立多项式✧输出多项式✧实现多项式加、减运算3) 实现提示:以两个多项式相加为例✧结果多项式另存✧扫描两个相加多项式,若都未检测完:⏹若当前被检测项指数相等,系数相加,若结果未变成0,则将结果插入到结果多项式。
⏹若当前被检测项指数不等,则将指数较小者插入到结果多项式。
若有一个多项式已检测完,则将另一个多项式剩余部分直接连接到结果多项式。
4.一元稀疏多项式简单的计算器(实验类型:综合型)#include<stdio.h>#include<stdlib.h>typedef struct{float coef;//系数int expn;//指数} Term;typedef struct ploynomial{Term term;ploynomial* next;} ploynomial,*LinkList;void InitList(LinkList&L){//初始化链表L= (ploynomial*)malloc(sizeof(ploynomial));//头结点L->term.coef=0.0;L->term.expn=-1; L->next=NULL;}int cmp(Term a,Term b){//比较结点的系数大小函数if(a.expn>b.expn) return -1;else if(a.expn==b.expn) return 0; else return 1;}void insertNode(LinkList&L,Term e){//将结点插入多项式链表的适当位置,可以同时起到创建链表和多项式相加的功能ploynomial* q=L;while(q->next!=NULL){if(cmp(q->next->term,e)<0)//如果当前结点q的下一个结点的指数大于要插入的结点的指数q=q->next;//q指向下一个结点else break;//此时,q.term.expn>e.expn>=q->next->term.expn }if(q->next!=NULL&&cmp(q->next->term,e)==0) //指数相同,系数相加{q->next->term.coef+=e.coef;}else{ploynomial* node =(ploynomial*) malloc(sizeof(ploynomial));node->term.coef=e.coef;node->term.expn=e.expn;if(q->next==NULL)node->next=NULL; //如果q结点为尾结点,则node的指针域设为NULLelsenode->next=q->next; //否则node的指针域指向q的下一个结点q->next=node;//将node结点插入链表中}}void CreatPolyn(LinkList&L,int m){//输入m项的系数和指数,建立表示一元多项式的有序链表L Term e;InitList(L);for(int i=1; i<=m; i++){printf("\n第%d项的系数和指数:",i);scanf("%f%d",&e.coef,&e.expn);insertNode(L,e);}}void addPolyn(LinkList&L,LinkList L1,LinkList L2){//用L返回L1+L2的结果ploynomial* q;for(q=L1->next; q!=NULL; q=q->next){insertNode(L,q->term);//将L1的每一项插入到L中}for(q=L2->next; q!=NULL; q=q->next) //将L2的每一项插入到L 中{insertNode(L,q->term);}}void SubtracatPolyn(LinkList&L,LinkList L1,LinkList L2){//用L返回L1-L2的结果ploynomial* q;for(q=L1->next; q!=NULL; q=q->next){insertNode(L,q->term);//将L1的每一项插入到L中}for(q=L2->next; q!=NULL; q=q->next){q->term.coef = -(q->term.coef); //把系数变成相反数,再进行相加操作,即为L1-L2insertNode(L,q->term);//将L2的每一项插入到L中}}void multiplyPolyn(LinkList&L,LinkList L1,LinkList L2) {//用L返回L1*L2的结果ploynomial *p,*q;Term term;term.coef=0.0;term.expn=0;for(q=L1->next; q!=NULL; q=q->next){for(p=L2->next; p!=NULL; p=p->next){term.coef=(q->term.coef)*(p->term.coef);//系数相乘term.expn=(q->term.expn)+(p->term.expn);// 指数想加insertNode(L,term);}}}void derivativePolyn(LinkList&L,LinkList L1){//用L返回L1的导数ploynomial *p;Term term;for(p=L1->next; p!=NULL; p=p->next){if(p->term.expn==0){ continue;//指数为0时,导数为0 ,跳过此次循环}else{ term.coef=(p->term.coef)*(p->term.expn); //系数乘以指数term.expn=(p->term.expn)-1;//指数减一insertNode(L,term);}}}void visitList(LinkList L){//以类数学表达式的形式打印输出一元多项式L,//即指数或者系数为1的情况下省略1ploynomial* q=L;int flag;while(q->next!=NULL){q=q->next;flag=1;if(q->term.coef==0) continue;//系数为0 不输出if(q->term.expn==0&&flag==1) //指数为1{if(q->term.coef>0)printf("+%.2f",q->term.coef);elseprintf("%.2f",q->term.coef);flag=0;}if((q->term.coef==1||q->term.coef==-1)&&flag==1)//系数为1{if(q->term.expn==1){ if(q->term.coef==1)printf("+X"); elseprintf("-X");}else{if(q->term.coef==1)printf("+X^%d",q->term.expn); elseprintf("-X^%d",q->term.expn); } flag=0;}if(flag==1){ if(q->term.coef>0)printf("+%.2fX^%d",q->term.coef,q->term.expn);elseprintf("%.2fX^%d",q->term.coef,q->term.expn);} } printf("\n");}int main(){LinkList L1,L2; int n1,n2;printf("请输入多项式L1的项数:");scanf("%d",&n1);CreatPolyn(L1,n1);printf("请输入多项式L2的项数:");scanf("%d",&n2);CreatPolyn(L2,n2);printf("\n多项式L1:");visitList(L1);printf("\n多项式L2: ");visitList(L2);LinkListadd,sub,multiply,derivative1,derivative2;InitList(ad d);InitList(sub);InitList(multiply);InitList(derivative1);InitList(derivative2);derivativePol yn(derivative1,L1);derivativePolyn(derivative2,L2);printf("\nL1的导数:");visitList(derivative1);printf("\nL2的导数:");visitList(derivative2);addPolyn(add,L1,L2);SubtracatPolyn(sub,L1,L2);multiplyPolyn(multiply ,L1,L2);printf("\nL1 + L2: ");visitList(add);printf("\nL1 - L2: ");visitList(sub);printf("\nL1 * L2: ");visitList(multiply);}实验心得:无。
1。
5一元稀疏多项式计算器实习报告一、需求分析1.输入并建立多项式;2.输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,c n,e n,其中n是多项式的项数,c i 和e i分别是第i项的系数和指数,序列按指数降序排列;3.多项式a和b相加,建立多项式a+b;4.多项式a和b相减,建立多项式a-b;5.多项式a和b相乘,建立多项式a×b;6.计算多项式在x处的值;7.求多项式P的导函数P’;8。
多项式的输出形式为类数学表达式;9.做出计算器的仿真界面;10。
测试数据:(1)(2x+5x^8—3.1x^11)+(7—5x^8+11x^9)=(—3。
1x^11+11x^9+2x+7)(2)(6x^—3-x+4。
4x^2—1。
2x^9+1.2x^9)-(-6x^—3+5.4x^2—x^2+7。
8x^15 )=(-7。
8x^15—1.2x^9+12x^-3—x);(3)(1+x+x^2+x^3+x^4+x^5)+(-x^3—x^4)=(1+x+x^2+x^5);(4)(x+x^3)+(-x—x^3)=0(5)(x+x^100)+(x^100+x^200)=(x+2x^100+x^200)(6)(x+x^2+x^3)+0=x+x^2+x^3(7)互换上述测试数据中的前后两个多项式二、概要设计1.链表的抽象数据类型定义为:ADT LinkList{数据对象:D={ ai | ai∈ElemSet, i=1,2,...,n,n≥0 }数据关系:R1={〈ai-1,ai〉|ai—1,ai∈D, i=2,.。
,n }基本操作:InitList(&L)操作结果:构造一个空的线性表L.DestroyList(&L)初始条件:线性表L已存在.操作结果:销毁线性表L。
ClearList(*L)初始条件:线性表L已存在。
操作结果:将线性表L重置为空表。
LocateElem(L,e, cmp())初始条件:线性表L已存在,compare()是元素判定函数。
元稀疏多项式计算器实验报告c编写,附源代码(1)实验报告:元稀疏多项式计算器引言:本次实验是运用C语言编写一个元稀疏多项式计算器,该计算器可以实现多项式的加法、减法、乘法、求导、积分、求值等操作。
本次实验旨在通过编写实践,加深对多项式计算的理解和程序设计能力。
一、设计思路及实现方法1.1 多项式的表示方式多项式可以用数组来表示,数组的下标表示多项式的幂次,数组的内容表示该幂次项的系数。
例如多项式:2x^4 + 3x^2 + 5可以表示为数组:{0,0,3,0,2,5}。
1.2 多项式的操作函数及实现方法本次实验实现了以下多项式操作函数:1)add(多项式加法):将两个多项式相加并返回结果多项式。
2)subtract(多项式减法):将两个多项式相减并返回结果多项式。
3)multiply(多项式乘法):将两个多项式相乘并返回结果多项式。
4)differential(求导):求一个多项式的导数并返回结果多项式。
5)integral(积分):对一个多项式进行积分并返回结果多项式。
6)evaluate(求值):给定一个值,计算多项式在该值处的值并返回结果。
以上操作函数的实现方法都是通过循环遍历数组,并运用相应的多项式计算公式来计算。
二、程序设计及实验结果2.1 程序设计本次实验采用C语言编写完成,主函数的框架如下:int main(int argc, char const *argv[]) {// 输入多项式各项系数和幂次// 调用各个多项式计算函数// 输出计算结果return 0;}2.2 实验结果本次实验的实验结果如下:1)将多项式2x^3 + 3x^2 + 5x + 2与多项式3x^3 - 2x^2 + 4相加:输入:2 3 5 2 3 -2 0 4输出:5x^3 + x^2 + 5x + 62)将多项式2x^3 + 3x^2 + 5x + 2与多项式3x^3 - 2x^2 + 4相减:输入:2 3 5 2 3 -2 0 4输出:-1x^3 + 5x^2 + 5x - 23)将多项式2x^3 + 3x^2 + 5x + 2与多项式3x^3 - 2x^2 + 4相乘:输入:2 3 5 2 3 -2 0 4输出:6x^6 + 5x^5 + 4x^4 + 4x^3 + 26x^2 + 14x + 84)求多项式2x^3 + 3x^2 + 5x + 2的导数:输入:2 3 5 2输出:6x^2 + 6x + 55)对多项式2x^3 + 3x^2 + 5x + 2进行积分:输入:2 3 5 2输出:0.5x^4 + 1x^3 + 2.5x^2 + 2x + 06)计算多项式2x^3 + 3x^2 + 5x + 2在x=3处的值:输入:2 3 5 2 3输出:59以上实验结果均能正确输出。
(2023)一元稀疏多项式计算器实验报告c编写,附源代码(一)实验报告:(2023)一元稀疏多项式计算器实验目的本实验旨在编写一款一元稀疏多项式计算器,实现对两个多项式的加、减、乘、求导、求值等操作。
实验环境•操作系统:Windows 10•开发工具:Visual Studio Code•编程语言:C实验过程1. 首先定义多项式的结构体typedef struct PolyTerm {int coef;// 系数unsigned int power;// 指数struct PolyTerm* next;// 下一项}PolyTerm;typedef struct Poly {int degree;// 多项式最高次项PolyTerm* head;// 首项指针}Poly;2. 实现多项式的输入与输出void inputPoly(Poly* poly);// 输入多项式void outputPoly(Poly* poly);// 输出多项式3. 实现多项式的加、减、乘操作Poly* addPoly(Poly* p1, Poly* p2);// 多项式加法Poly* subPoly(Poly* p1, Poly* p2);// 多项式减法Poly* multPoly(Poly* p1, Poly* p2);// 多项式乘法4. 实现多项式求导void derivative(Poly* poly);// 多项式求导5. 实现多项式求值int evaluate(Poly* poly,int x);// 多项式求值6. 主函数的实现主函数通过简单的菜单方式,实现用户输入选项,选择需要进行的操作。
实验结果通过对多项式加、减、乘、求导、求值等操作的实现,成功完成了一元稀疏多项式计算器的编写,实现了对多项式运算的基本掌握。
实验总结在本次实验中,我们通过C语言实现了一元稀疏多项式计算器,并体验了多项式运算的具体操作。
一元稀疏多项式计算器源代码#include #include typedef struct node {float coef; int exp;struct node *next; }Lnode, *polynmial;void create(polynmial &L); //输入并建立多项式L void display(polynmial L); //显示,输出多项式L void sort(polynmial &L); //多项式L按指数排序 voidreverse(polynmial &L); //逆置 void select(); //用户选择加减操作void add(polynmial La, polynmial Lb, polynmial &Lc); //多项式voidsubtract(polynmial La, polynmial Lb, polynmial &Ld); //多项式void create(polynmial &L) //输入并建立多项式L {int i, n;static struct node *p; scanf(\L = (struct node *)malloc (sizeof(struct node)); L->next = NULL; for(i = 0;i < n; i++) {p = (struct node *)malloc(sizeof(struct node)); scanf(\ p->next = L->next; L->next = p; } }void display(polynmial L)//显示,输出多项式L {struct node *p, *q; int flag = 0; int k = 0; q = L->next; while(q) {if(q->coef != 0) k++;q = q->next;La,Lb相加La减去LbLd ,结果给}printf(\p = L->next; if(p->coef != 0) {printf(\ flag++; }for(p = p->next; p; p = p->next) {if(p->coef != 0) {printf(\ flag++; } }if(flag == 0)printf(\elseprintf(\}void sort(polynmial &L)//多项式L按指数排序 {polynmial p, q, r, u; p = L->next;L->next = NULL; while(p != NULL) {r = L;q = L->next;while((q != NULL) && (q->exp <= p->exp)) {r = q;q = q->next; }u = p->next; r->next = p; p->next = q; p = u; } }void reverse(polynmial &L)//逆置{polynmial H;static struct node *p, *q, *s;H = (struct node*)malloc(sizeof(struct node)); H->next = NULL;p = (struct node*)malloc(sizeof(struct node)); s = L->next;p->coef = s->coef; p->exp = s->exp; p->next = s->next; while(s) {p->coef = s->coef; p->exp = s->exp; p->next = s->next; q = H->next; H->next = p; p->next = q;p = (struct node*)malloc(sizeof(struct node)); s = s->next; }p = H->next; q = L->next; while(p) {q->coef = p->coef; q->exp = p->exp; q = q->next; p = p->next; } }void select() //用户选择加减操作 {printf(\请选择加减操作\\n\printf(\两个一元多项式相加\\n\printf(\两个一元多项式相减\\n\}void add(polynmial La, polynmial Lb, polynmial &Lc)//{struct node *pa, *pb; static struct node *pc;Lc = (struct node*)malloc(sizeof(struct node));La,Lb多项式相加pa = La->next; pb = Lb->next; Lc->next = NULL; while(pa && pb) {pc = (struct node*)malloc(sizeof(struct node)); if(pa->exp < pb->exp) {pc->next = Lc->next; Lc->next = pc;pc->coef = pa->coef; pc->exp = pa->exp; pa = pa->next; }elseif(pa->exp == pb->exp) {pc->next = Lc->next; Lc->next = pc; pc->exp = pa->exp;pc->coef = pa->coef + pb->coef; pa = pa->next; pb = pb->next; } else {pc->next = Lc->next; Lc->next = pc;pc->coef = pb->coef; pc->exp = pb->exp; pb = pb->next; } }while(pa) {pc = (struct node*)malloc(sizeof(struct node)); pc->next = Lc->next; Lc->next = pc;pc->coef = pa->coef; pc->exp = pa->exp; pa = pa->next; }while(pb) {pc = (struct node*)malloc(sizeof(struct node)); pc->next = Lc->next; Lc->next = pc;pc->coef = pb->coef; pc->exp = pb->exp; pb = pb->next; } }void subtract(polynmial La, polynmial Lb, polynmial &Ld)//多项式{struct node *pa, *pb; static struct node *pd;Ld = (struct node*)malloc(sizeof(struct node)); pa = La->next; pb = Lb->next; Ld->next = NULL; while(pa && pb) {pd = (struct node*)malloc(sizeof(struct node)); if(pa->exp < pb->exp) {pd->next = Ld->next; Ld->next = pd;pd->coef = pa->coef; pd->exp = pa->exp; pa = pa->next; }elseif(pa->exp == pb->exp) {pd->next = Ld->next; Ld->next = pd; pd->exp = pa->exp;pd->coef = pa->coef - pb->coef; pa = pa->next; pb = pb->next; } else {pd->next = Ld->next; Ld->next = pd;pd->coef = pb->coef; pd->exp = pb->exp;La减去Lb,结果给Ld感谢您的阅读,祝您生活愉快。
此程序主要以c和部分c++语言进行编辑,在visual C++2013上进行了检验,事实证明可行,部分代码仍需优化,但仍是网络上功能暂时最强大的一个多项式计算器了。
#include<stdio.h>#include<stdlib.h>#include<iostream>char name1='A';char name2;char name3;int counter = 0;typedef struct Polynomial//结点类型{float coef; //系数int exp; //指数Polynomial *next;}*Polyn; //Polyn为结点指针类型struct Polynomial *ptr[52] = { 0 };struct Polynomial *ptr_2[52] = { 0 };int amount[52] = { 0 };void PrintPolyn(Polyn P) //输出多项式{Polyn q = P->next;int flag = 1; //项数计数器if (!q) //若多项式为空,输出0{putchar('0');printf("\n");return;}while (q){if (q->coef>0 && flag != 1) //系数大于0且不是第一项putchar('+');if (q->coef != 1 && q->coef != -1) //系数非1或-1{printf("%g", q->coef);if (q->exp == 1)putchar('X');else if (q->exp)printf("X^%d", q->exp);}else{if (q->coef == 1){if (!q->exp)putchar('1');else if (q->exp == 1)putchar('X');elseprintf("X^%d", q->exp);}if (q->coef == -1){if (!q->exp)printf("-1");else if (q->exp == 1)printf("-X");elseprintf("-X^%d", q->exp);}}q = q->next;flag++;}printf("\n");}void PrintAll(int m){int temp3 = 0;name2 = 'A';for (; temp3 < m; temp3++){printf("%c=", name2);PrintPolyn(ptr[temp3]);name2++;}}void InsertNode(Polyn p, Polyn head)//插入结点,按指数降序排列{if (p->coef == 0)delete p; //释放系数为0的结点else{Polyn q1, q2;q1 = head;q2 = head->next;while (q2 != NULL&&p->exp<q2->exp) //查找插入位置,{q1 = q2;q2 = q2->next;}if (q2 != NULL&&p->exp == q2->exp) //将指数相同的合并{q2->coef += p->coef; //系数相加delete p; //释放pif (!q2->coef) //释放系数为0的结点{q1->next = q2->next;delete q2;}}else//无相同指数时将该结点插入{p->next = q2;q1->next = p;}}}void CreatePolyn_1(Polyn &head) // 创建多项式头指针为head、项数为m {head = new Polynomial; //生成头结点head->next = NULL;}Polyn CreatePolyn_2(Polyn head, int m){Polyn p;CreatePolyn_1(head);for (int i = 0; i < m; i++){p = new Polynomial; //建立新结点printf("请输入第%d项的系数与指数(空格或回车隔开):", i + 1);scanf_s("%f%d", &p->coef, &p->exp);InsertNode(p, head); //调用InsertNode函数插入结点}return head;}int Compare(Polyn a, Polyn b)//依a的指数值<、=或>b的指数值,分别返回-1、0或1 {if (a&&b){if (!b || a->exp>b->exp)return 1;else if (!a || a->exp<b->exp)return -1;elsereturn 0;}else if (!a&&b)return -1; //a多项式为空,但b多项式非空elsereturn 1; //b多项式为空,但a多项式非空}void ClearPolyn(Polyn p) //清空多项式p{Polyn q1, q2;q1 = p->next;if (q1 == NULL) //结果系数为0的情况return;q2 = q1->next;while (q1->next){delete q1;q1 = q2; //指针后移q2 = q2->next;}p->next = 0;}Polyn AddPolyn(Polyn pa, Polyn pb) //求解并建立多项式A+B{Polyn qa = pa->next;Polyn qb = pb->next;Polyn heada, hc, qc;hc = new Polynomial; //建立头结点hc->next = NULL;heada = hc;while (qa || qb){qc = new Polynomial;switch (Compare(qa, qb)){case 1: //a项的指数大于b项的指数{qc->coef = qa->coef;qc->exp = qa->exp;qa = qa->next;break;}case 0: //a项的指数等于b项的指数{qc->coef = qa->coef + qb->coef;qc->exp = qa->exp;qa = qa->next;qb = qb->next;break;}case -1: //a项的指数小于b项的指数{qc->coef = qb->coef;qc->exp = qb->exp;qb = qb->next;break;}}if (qc->coef != 0){qc->next = hc->next;hc->next = qc;hc = qc;}elsedelete qc; //当相加系数为0时,释放该结点}return heada; //返回其头指针}Polyn SubPolyn(Polyn pa, Polyn pb) //求解并建立多项式A-B{Polyn p1, p2, heads;p1 = pb;p2 = pb->next;while (p2){p2->coef *= -1; //将pb的系数取反p2 = p2->next;}heads = AddPolyn(pa, p1);for (p2 = p1->next; p2; p2 = p2->next) //恢复pb的系数p2->coef *= -1;return heads; //返回其头指针}Polyn MultiplyPolyn(Polyn pa, Polyn pb) //求解并建立多项式A*B *{Polyn headf, qc;Polyn qa = pa->next;Polyn qb = pb->next;headf = new Polynomial; //建立头结点headf->next = NULL;for (; qa; qa = qa->next){for (qb = pb->next; qb; qb = qb->next){qc = new Polynomial;qc->coef = qa->coef*qb->coef;qc->exp = qa->exp + qb->exp;InsertNode(qc, headf); //调用InsertNode函数合并指数相同的项}}return headf; //返回其头指针}Polyn DevicePolyn_1(Polyn pa, Polyn pb) //求解并建立多项式A/B{Polyn quotient, remainder, temp1, temp2;Polyn qa = pa->next;Polyn qb = pb->next;quotient = new Polynomial; //建立头结点,存储商quotient->next = NULL;remainder = new Polynomial; //建立头结点,存储余数remainder->next = NULL;temp1 = new Polynomial;temp1->next = NULL;temp2 = new Polynomial;temp2->next = NULL;temp1 = AddPolyn(temp1, pa);while (qa != NULL&&qa->exp >= qb->exp){temp2->next = new Polynomial;temp2->next->coef = (qa->coef) / (qb->coef);temp2->next->exp = (qa->exp) - (qb->exp);InsertNode(temp2->next, quotient);pa = SubPolyn(pa, MultiplyPolyn(pb, temp2));qa = pa->next;temp2->next = NULL;}remainder = SubPolyn(temp1, MultiplyPolyn(quotient, pb));pb = temp1;return quotient;}Polyn DevicePolyn_2(Polyn pa, Polyn pb) //求解并建立多项式A/B{Polyn quotient, remainder, temp1, temp2;Polyn qa = pa->next;Polyn qb = pb->next;quotient = new Polynomial; //建立头结点,存储商quotient->next = NULL;remainder = new Polynomial; //建立头结点,存储余数remainder->next = NULL;temp1 = new Polynomial;temp1->next = NULL;temp2 = new Polynomial;temp2->next = NULL;temp1 = AddPolyn(temp1, pa);while (qa != NULL&&qa->exp >= qb->exp){temp2->next = new Polynomial;temp2->next->coef = (qa->coef) / (qb->coef);temp2->next->exp = (qa->exp) - (qb->exp);InsertNode(temp2->next, quotient);pa = SubPolyn(pa, MultiplyPolyn(pb, temp2));qa = pa->next;temp2->next = NULL;}remainder = SubPolyn(temp1, MultiplyPolyn(quotient, pb));pb = temp1;return remainder;}float ValuePolyn(Polyn head, float x) //输入x值,计算并返回多项式的值{Polyn p;int i;float sum = 0, t;for (p = head->next; p; p = p->next){t = 1;for (i = p->exp; i != 0;){if (i<0){t /= x;i++;}//指数小于0,进行除法else{t *= x;i--;}//指数大于0,进行乘法}sum += p->coef*t;}return sum;}Polyn DerivativePolyn(Polyn head)//求导数{Polyn q, p1, p2, hd;q = head->next;p1 = hd = (Polyn)malloc(sizeof(struct Polynomial));hd->next = NULL;while (q){if (q->exp != 0){p2 = (Polyn)malloc(sizeof(struct Polynomial));p2->coef = q->coef*q->exp;//系数p2->exp = q->exp - 1;p2->next = p1->next;p1->next = p2;p1 = p2;}q = q->next;}return hd;}Polyn IntegralPolyn(Polyn head)//求积分{Polyn q, p1, p2, hd;q = head->next;p1 = hd = (Polyn)malloc(sizeof(struct Polynomial));hd->next = NULL;while (q){if (q->exp != 0){p2 = (Polyn)malloc(sizeof(struct Polynomial));p2->coef = q->coef/((q->exp)+1);//系数p2->exp = q->exp + 1;p2->next = p1->next;p1->next = p2;p1 = p2;}q = q->next;}return hd;}void DestroyPolyn(Polyn pa){delete pa;}Polyn CopyPolyn(Polyn pa,Polyn pb){Polyn headc;headc = AddPolyn(pa, pb);return headc;}void KeepResultPolyn(Polyn pa, int k){printf("已自动将结果保留至下一个空闲多项式位置\n");ptr[k] = CopyPolyn(pa, ptr[k]);}int main() //主函数{int i = 0;int m, n = 0;int temp1 = 0;int temp2 = 1;float x;float up = 0;float down = 0;char first = 'a';char second = 'b';for (; i < 26; i++)CreatePolyn_1(ptr[i]);i = 0;printf("︵︵§米娜桑早上好!欢迎使用一元稀疏多项式计算器\t\t\t╭─╮\n");printf("\n");printf(" ︶ \n");printf("祝使用愉快,再次对您的使用表示万分感谢!\n");//输出菜单printf("\t\t\t【功能选择项】\n\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n");printf("\t║ 1.输入一个新的多项式║\t2.修改一个多项式║\n");printf("\t║ 3.复制一个多项式║\t4.清空一个多项式║\n");printf("\t║ 5.计算多项式加法║\t6.计算多项式减法║\n");printf("\t║ 7.计算多项式乘法║\t8.计算多项式除法║\n");printf("\t║ 9.计算多项式乘方║\t10.计算多项式的值║\n");printf("\t║ 11.计算多项式的定积分║\t12.计算多项式的不定积分║\n");printf("\t║ 13.计算多项式的微分║\t14.计算多项式的公因式║\n");printf("\t║ 15.计算多项式的公倍式║\t16.退出║\n");printf("\t≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡\n");do{printf("\t请输入选择:");scanf_s("%d", &i);switch (i){case 0:{printf("\t请不要输入奇怪的东西,谢谢!!!\n");getchar();break;}case 1:{printf("\t请输入多项式项数:");scanf_s("%d", &amount[counter]);ptr[counter] = CreatePolyn_2(ptr[counter], amount[counter]);//建立多项式printf("\t您创建的多项式名称为%c\n", name1);printf("\t您创建的多项式内容为");PrintPolyn(ptr[counter]);counter++;name1++;break;}case 2:{m = counter;PrintAll(m);printf("\t您想修改哪一个多项式?");std::cin >> name3;temp1 = name3 - 'A';ClearPolyn(ptr[temp1]);DestroyPolyn(ptr[temp1]);printf("\t请输入新多项式项数:");scanf_s("%d", &amount[counter]);ptr[counter] = CreatePolyn_2(ptr[counter], amount[counter]);printf("\t已成功修改多项式%c!\n", name3);break;}case 3:{m = counter;PrintAll(m);printf("\t请选择要进行复制的多项式:\n");std::cin >> first;temp1 = first - 'A';printf("\t请选择要将多项式复制至:\n");std::cin >> second;temp2 = second - 'A';if (temp2 >= counter){CreatePolyn_1(ptr[temp2]);ptr[temp2]=CopyPolyn(ptr[temp1],ptr[temp2]);counter++;}else{ClearPolyn(ptr[temp2]);DestroyPolyn(ptr[temp2]);CreatePolyn_1(ptr[temp2]);ptr[temp2] = CopyPolyn(ptr[temp2], ptr[temp1]);}break;}case 4:{m = counter;PrintAll(m);printf("\t请选择要清空的多项式:");std::cin >> first;temp1 = first - 'A';ClearPolyn(ptr[temp1]);DestroyPolyn(ptr[temp1]);CreatePolyn_1(ptr[temp1]);printf("\t已成功清空多项式%c!", first);break;}case 5:{m = counter;PrintAll(m);printf("\t请输入操作数1:\n");std::cin >> first;temp1 = first - 'A';printf("\t请输入操作数2:\n");std::cin >> second;temp2 = second - 'A';ptr[25] = AddPolyn(ptr[temp1], ptr[temp2]);printf("\t%c+%c=", first, second);PrintPolyn(ptr[25]);KeepResultPolyn(ptr[25], counter);ClearPolyn(ptr[25]);counter++;break;}case 6:{m = counter;PrintAll(m);printf("\t请输入操作数1:\n");std::cin >> first;temp1 = first - 'A';printf("\t请输入操作数2:\n");std::cin >> second;temp2 = second - 'A';ptr[25] = SubPolyn(ptr[temp1], ptr[temp2]);printf("\t%c-%c=", first, second);PrintPolyn(ptr[25]);KeepResultPolyn(ptr[25], counter);ClearPolyn(ptr[25]);counter++;break;}case 7:{m = counter;PrintAll(m);printf("\t请输入操作数1:\n");std::cin >> first;temp1 = first - 'A';printf("\t请输入操作数2:\n");std::cin >> second;temp2 = second - 'A';ptr[25] = MultiplyPolyn(ptr[temp1], ptr[temp2]);printf("\t%c*%c=", first, second);PrintPolyn(ptr[25]);KeepResultPolyn(ptr[25], counter);ClearPolyn(ptr[25]);counter++;break;}case 8:{m = counter;PrintAll(m);printf("\t请输入操作数1(被除数):");std::cin >> first;temp1 = first - 'A';printf("\t请输入操作数2(除数):");std::cin >> second;temp2 = second - 'A';if (amount[temp2] == 0){printf("除数为0时不能进行除法运算!\n");break;}ptr[24] = DevicePolyn_1(ptr[temp1], ptr[temp2]);printf("其商为:");PrintPolyn(ptr[24]);KeepResultPolyn(ptr[24], counter);counter++;ptr[25] = DevicePolyn_2(ptr[temp1], ptr[temp2]);counter++;printf("其余为:");PrintPolyn(ptr[25]);KeepResultPolyn(ptr[25], counter);ClearPolyn(ptr[24]);ClearPolyn(ptr[25]);break;}case 9:{m = counter;PrintAll(m);printf("\t请选择要进行乘方的多项式:");std::cin >> first;temp1 = first - 'A';printf("\t请输入要对%c进行几次方:", first);std::cin >> temp2;ptr[25] = CopyPolyn(ptr[temp1], ptr[25]);for (int temp3 = 1; temp3 < temp2; temp3++){ptr[24] = MultiplyPolyn(ptr[25], ptr[temp1]);ClearPolyn(ptr[25]);ptr[25]=CopyPolyn(ptr[24], ptr[25]);ClearPolyn(ptr[24]);}printf("%c^%d=", first, temp2);PrintPolyn(ptr[25]);KeepResultPolyn(ptr[25], counter);counter++;ClearPolyn(ptr[25]);break;}case 10:{m = counter;PrintAll(m);printf("\t请选择您想求值的多项式:");std::cin >> first;temp1 = first - 'A';printf("\t输入x的值:x=");scanf_s("%f", &x);printf("\t多项式A的值:%g\n", ValuePolyn(ptr[temp1], x));break;}case 11:{m = counter;PrintAll(m);printf("\t请选择您想定积分的多项式:");std::cin >> first;temp1 = first - 'A';printf("\t请输入积分下限:");std::cin >> down;printf("\t请输入积分上限:");std::cin >> up;if (down>up){printf("\t积分下限大于积分上限,请小心!强制计算结果为:");}else{printf("\t∫(%f->%f)%c=", down, up, first);}ptr[23] = IntegralPolyn(ptr[temp1]);printf("%f\n", ValuePolyn(ptr[23], up) - ValuePolyn(ptr[23], down));ClearPolyn(ptr[23]);break;}case 12:{m = counter;PrintAll(m);printf("\t请选择要进行不定积分的多项式:");std::cin >> first;temp1 = first - 'A';printf("\t%c的一个原函数为",first);PrintPolyn(ptr[23] = IntegralPolyn(ptr[temp1]));ClearPolyn(ptr[23]);break;}case 13:{m = counter;PrintAll(m);printf("\t请选择要进行微分的多项式:");std::cin >> first;temp1 = first - 'A';printf("\t请输入要进行微分的次数:");std::cin >> temp2;ptr[24] = DerivativePolyn(ptr[temp1]);for (temp1 = 1; temp1 < temp2; temp1++){ptr[25] = DerivativePolyn(ptr[24]);ClearPolyn(ptr[24]);ptr[24] = CopyPolyn(ptr[25], ptr[24]);ClearPolyn(ptr[25]);}printf("%c(%d)=", first, temp2);PrintPolyn(ptr[24]);KeepResultPolyn(ptr[24], counter);counter++;ClearPolyn(ptr[24]);break;}case 14:{m = counter;PrintAll(m);printf("\t请输入操作数1:");std::cin >> first;temp1 = first - 'A';printf("\t请输入操作数2:");std::cin >> second;temp2 = second - 'A';ptr[24] = CopyPolyn(ptr[temp2], ptr[24]);ptr[25] = DevicePolyn_2(ptr[temp1], ptr[temp2]);for (; ptr[25]->next != NULL;){ptr[23] = CopyPolyn(ptr[25], ptr[23]);ptr[25] = DevicePolyn_2(ptr[24], ptr[25]);ClearPolyn(ptr[24]);ptr[24] = CopyPolyn(ptr[23],ptr[24]);}printf("\t这两个多项式的最大公因式为(系数可变):");PrintPolyn(ptr[24]);ClearPolyn(ptr[24]);ClearPolyn(ptr[25]);break;}case 15:{m = counter;PrintAll(m);printf("\t请输入操作数1:");std::cin >> first;temp1 = first - 'A';printf("\t请输入操作数2:");std::cin >> second;temp2 = second - 'A';ptr[24] = CopyPolyn(ptr[temp2], ptr[24]);ptr[25] = DevicePolyn_2(ptr[temp1], ptr[temp2]);for (; ptr[25]->next != NULL;){ptr[23] = CopyPolyn(ptr[25], ptr[23]);ptr[25] = DevicePolyn_2(ptr[24], ptr[25]);ClearPolyn(ptr[24]);ptr[24] = CopyPolyn(ptr[23], ptr[24]);}printf("\t这两个多项式的最小公倍式为(系数可变):");ptr[22] = MultiplyPolyn(ptr[temp1], ptr[temp2]);ptr[21] = DevicePolyn_1(ptr[22], ptr[24]);PrintPolyn(ptr[21]);ClearPolyn(ptr[24]);ClearPolyn(ptr[22]);ClearPolyn(ptr[25]);ClearPolyn(ptr[21]);break;}case 16:{printf("\t欢迎再次使用!O(∩_∩)O谢谢\n");system("pause");break;}default:printf("\t请不要输入奇怪的东西,谢谢!!!\n");break;}} while (i != 16);for (temp2 = 0; temp2 < 26;temp2++)DestroyPolyn(ptr[temp2]);return 0;}。
一元稀疏多项式计算器c语言
一、背景。
在计算机领域中,一元稀疏多项式是一种较为重要的数据类型,它广
泛应用于科学计算、图像处理等领域。
由于传统计算方法需要大量时间和
计算资源,因此研究一种高效的一元稀疏多项式计算器显得十分重要。
二、需求分析。
基于以上背景,我们需要完成以下需求:
1.实现一元稀疏多项式的基本运算,如加、减、乘、除法等。
2.实现一元稀疏多项式的系数排序,可以按照任意顺序排列。
3.实现一元稀疏多项式的表示方式,可供用户输入和输出。
三、设计方案。
为了满足以上需求,我们可以采用以下设计方案:
1.多项式基本结构。
为了处理一元稀疏多项式的各种运算,我们需要为多项式定义一个基
本的数据结构。
这个结构需要包含多项式的各项系数、指数、项数等信息。
我们可以采用数组或链表等方式实现这个数据结构。
2.多项式运算。
为了完成多项式的加、减、乘、除法等运算,我们需要实现相应的算法。
这些算法包括基于快速傅里叶变换的多项式乘法、除法等。
3.系数排序。
为了满足用户不同的需求,我们需要实现多项式系数的排序功能。
由于用户可以选择任意的顺序,我们需要保证排序算法的稳定性和高效性。
4.多项式表示。
为了方便用户输入和输出多项式,我们需要设计一个简洁易用的多项式表示方式。
用户可以根据需要选择带有系数和指数的输入方式,也可以选择只输入系数或指数。
四、实现细节。
为了优化计算效率和减少内存占用,我们可以在实现多项式运算时采用以下方法:
1.采用链表存储多项式的数据结构,可以有效减少内存占用和复制开销。
2.对于多项式的加、减、乘、除法等运算,我们可以根据具体情况选择合适的运算算法。
如多项式加减可以直接遍历链表进行计算;多项式乘法可以使用快速傅里叶变换等算法。
3.为了提高排序效率,我们可以采用基于快速排序、归并排序等的排序算法。
对于多项式系数相同时,可以使用指数作为比较因素。
五、总结。
通过以上设计方案和实现细节,我们可以实现一个高效的一元稀疏多项式计算器。
该计算器可以支持多项式运算、系数排序和多项式表示等功能,可以满足用户对一元稀疏多项式的各种需求。