一元多项式计算实验报告.docx
- 文档编号:9081841
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:30
- 大小:156.55KB
一元多项式计算实验报告.docx
《一元多项式计算实验报告.docx》由会员分享,可在线阅读,更多相关《一元多项式计算实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
一元多项式计算实验报告
计算机学院
工程实践
一元多项式的计算
总报告
小组序号:
编撰人:
年级班级:
指导教师:
提交日期:
1.项目组成员分工
表1项目组成员分工
2.程序功能
(程序实现的功能,功能结构图)
实现功能:
一元多项式的加、减、乘运算
功能结构图:
3.程序设计简介
(包括:
类及其属性和方法、类之间关系、关键代码等的说明)
1.
classNode
{
public:
Node();
Node(floatc,inte,Node*next);
~Node(){};
floatcoef;//系数
intexp;//指数
Node*Next;//指向下一项的指针
friendclassPolynominal;
};
节点类,储存一元多项式每一项的信息。
该内含有两个构造函数,一个析构函数及存储系数、指数和Next指针等成员变量。
及Polynominal是友元关系,允许Polynominal的访问。
具体成员函数如下:
1)
Node:
:
Node(){}
默认构造函数。
2)
Node:
:
Node(floatc,inte,Node*next){
coef=c;
exp=e;
Next=next;
}
重载的自定义构造函数,用于给成员变量coef、exp和Next存入数据,Next指向传参来的next指针指向的地址,用于构造链表。
2.
classPolynominal{
public:
Polynominal();
Polynominal(Polynominal&a);//拷贝构造函数
voidGetMSG(CStringTempPloy);//获取由对话框输入的字符串并处理
CStringOutput_Node();//输出最后结果
voidPolyAdd(Polynominal&a,Polynominal&b);//加法
voidPolySubtract(Polynominal&a,Polynominal&b);//减法
voidPolyMultiply(Polynominal&a,Polynominal&b);//乘法
voidPolySort();//排序函数,用于乘法之后的按指数排序
voidOutFile();//文本输出函数
voidOut&a,Polynominal&b,stringch);//重载文本输出函数
voidOpposeCoef(Polynominal&a,Node*temp);//系数取反,用于减法运算
NodetheList;//头节点
ofstreamFOut;//输出流
};
此类用于构造一元多项式。
包括加、减、乘各各功能函数,还有两个帮助运算的辅助函数,以及界面输入输出和文本输出函数。
成员变量有头节点和输出流。
具体成员函数如下:
1)
Polynominal:
:
Polynominal(){}
默认构造函数
2)
Polynominal:
:
Polynominal(Polynominal&a){
Node*temp=a.theList.Next;
Node*tempNode=&theList;
for(;temp!
=NULL;){
tempNode->Next=newNode(temp->coef,temp->exp,NULL);
temp=temp->Next;
tempNode=tempNode->Next;
}
}
拷贝构造函数,用于计算时对象间的赋值,防止误改数据。
3)
voidPolynominal:
:
GetMSG(CStringTempPoly){
TempPoly.Remove(_T('^'));
Node*TempNode=&theList;
inti=0;
for(i;i CStringtemp1; CStringtemp2; intj=1; if(TempPoly.GetAt(i)==_T('-')){ temp1=temp1+TempPoly.GetAt(i); i++; } if(TempPoly.GetAt(i)==_T('+')){ i++; } if(TempPoly.GetAt(i)==_T('x')){ temp1=temp1+_T('1'); } while(j==1){ if(TempPoly.GetAt(i)! =_T('x')){ temp1=temp1+TempPoly.GetAt(i); i++; } elsej=0; } i++; if(i<(TempPoly.GetLength()-1)&&TempPoly.GetAt(i)==_T('-')){ temp2=temp2+TempPoly.GetAt(i); i++; } if(i==(TempPoly.GetLength()-1)&&TempPoly.GetAt(i)==_T('x')) temp2=temp2+_T('1'); else{ if(i==TempPoly.GetLength()&&TempPoly.GetAt(i-1)==_T('x')) temp2=temp2+_T('1'); else{ while(i =_T('+')&&TempPoly.GetAt(i)! =_T('-')){ temp2=temp2+TempPoly.GetAt(i); i++; } } } TempNode->Next=newNode(_ttof(temp1),_ttoi(temp2),NULL);//链表构建 TempNode=TempNode->Next; } } 此函数用于把从对话框获取的字符串进行处理,截取出多项式各项系数和指数,并转换为float型和int型,构造一元多项式链表。 4) CStringPolynominal: : Output_Node(){ intfirst=0; CStringtemp; CStringtemp_coef; CStringtemp_exp; Node*TempNode=theList.Next; for(;TempNode! =NULL;TempNode=TempNode->Next){ if(first==1&&TempNode->coef>0)temp=temp+_T("+"); temp_coef.Format(_T("%g"),TempNode->coef); temp_exp.Format(_T("%d"),TempNode->exp); switch(TempNode->exp){ case0: temp=temp+temp_coef;break;//指数为0则推出 case1: if(TempNode->coef==1)//指数为1则直接输出X temp=temp+_T("x"); elsetemp=temp+temp_coef+_T("x"); break; default: if(TempNode->coef==1)//其余指数输出“X^”形式 temp=temp+_T("x")+temp_exp; elsetemp=temp+temp_coef+_T("x^")+temp_exp; break; } first=1; } returntemp; } 输出函数,将计算所得结果输出到对话框。 5) voidPolynominal: : PolyAdd(Polynominal&a,Polynominal&b){ Node*p,*q,*temp; temp=&theList; p=a.theList.Next; q=b.theList.Next; while(p! =NULL&&q! =NULL){ if((p->exp)>(q->exp)){ temp->Next=newNode(p->coef,p->exp,NULL); temp=temp->Next; p=p->Next; } elseif((p->exp)==(q->exp)){ temp->Next=newNode(p->coef+q->coef,p->exp,NULL); temp=temp->Next; p=p->Next; q=q->Next; } elseif((p->exp)<(q->exp)){ temp->Next=newNode(q->coef,q->exp,NULL); temp=temp->Next; q=q->Next; } } if(q! =NULL){ while(q! =NULL){ temp->Next=newNode(q->coef,q->exp,NULL); temp=temp->Next; q=q->Next; } } if(p! =NULL){ while(p! =NULL){ temp->Next=newNode(p->coef,p->exp,NULL); temp=temp->Next; p=p->Next; } } } 加法函数,实现多项式的相加。 在其中需要判断各项指数的关系,已实现按指数大小关系构建链表。 6) voidPolynominal: : OpposeCoef(Polynominal&a,Node*temp){ temp=a.theList.Next; while(temp! =NULL){ temp->coef=-(temp->coef); temp=temp->Next; } } 在执行减法操作时,用此函数将被减多项式各位系数取反,之后可直接调用加法函数进行运算; 7) voidPolynominal: : PolySubtract(Polynominal&a,Polynominal&b){ Node*temp=NULL; Polynominalaa=b; OpposeCoef(aa,temp); PolyAdd(a,aa); } 减法函数。 先调用系数取反函数,再调用加法函数,可直接实现减法功能。 其中为了不改变被减多项式的各项值,在此调用拷贝构造函数创建临时对象用于计算。 8) voidPolynominal: : PolyMultiply(Polynominal&a,Polynominal&b){ Node*p,*q,*temp; temp=&theList; p=a.theList.Next; q=b.theList.Next; while(p! =NULL){ while(q! =NULL){ temp->Next=newNode((p->coef*q->coef),(p->exp+q->exp),NULL); q=q->Next; temp=temp->Next; } p=p->Next; q=b.theList.Next; } PolySort(); } 乘法函数。 按项相乘,运算完之后,再调用排序函数,实现同指数项系数相加,并按照指数大小输出。 9) voidPolynominal: : PolySort(){ Polynominaltemp; inti=1; floattemp_coef=0; inttemp_exp=0; Node*tempNode=theList.Next; Node*tempNode2=&theList; Node*tempNode3=&temp.theList; while(i==1){ tempNode=theList.Next; tempNode2=&theList; for(;tempNode! =NULL;){ if(tempNode->exp>temp_exp) temp_exp=tempNode->exp; tempNode=tempNode->Next; } tempNode=theList.Next; if(tempNode! =NULL){ for(;tempNode! =NULL;){ if(tempNode->exp==temp_exp){ temp_coef=temp_coef+tempNode->coef; tempNode2->Next=tempNode->Next; tempNode=tempNode->Next; } else{ tempNode=tempNode->Next; tempNode2=tempNode2->Next; } } tempNode3->Next=newNode(temp_coef,temp_exp,NULL); tempNode3=tempNode3->Next; temp_coef=0; temp_exp=0; } else{ i=0; } } Node*temp2=&theList; Node*temp3=temp.theList.Next; for(;temp3! =NULL;){ temp2->Next=newNode(temp3->coef,temp3->exp,NULL); temp2=temp2->Next; temp3=temp3->Next; } } 实现相乘之后的排序,是最后的链表按照指数大小排列,并且每个指数只有一项。 10) voidPolynominal: : OutFile(){ FOut.open("PolynominalList.txt",ofstream: : app); intfirst=1; Node*temp=theList.Next; FOut<<"("; for(;temp! =NULL;temp=temp->Next){ if(! first&&temp->coef>0) FOut<<"+"; FOut< switch(temp->exp){ case0: break;//指数为0则推出 case1: FOut<<"x";break;//指数为1则直接输出X default: FOut<<"x^"< } first=0; } FOut<<")"; FOut.close(); } 文本输出函数,用于两个多项式的文本输出。 11) voidPolynominal: : Out&a,Polynominal&b,stringch){ FOut.open("PolynominalList.txt",ofstream: : app); intfirst=1; Node*temp=theList.Next; a.OutFile(); FOut< b.OutFile(); FOut<<"=("; for(;temp! =NULL;temp=temp->Next){ if(! first&&temp->coef>0) FOut<<"+"; FOut< switch(temp->exp){ case0: break;//指数为0则推出 case1: FOut<<"x";break;//指数为1则直接输出X default: FOut<<"x^"< } first=0; } FOut<<")"; FOut<<"\n\n"; FOut.close(); } 重载文本输出函数,用于最后结果的一次性文本输出。 3.1.类设计 表2类表 序号 类名 属性 方法 1 Node floatcoef; intexp; Node*Next; Node(); Node(floatc,inte,Node*next); 2 Polynominal NodetheList; ofstreamFOut; Polynominal(); Polynominal(Polynominal&a); voidGetMSG(CStringTempPloy); CStringOutput_Node(); voidPolyAdd(Polynominal&a,Polynominal&b); voidPolySubtract(Polynominal&a,Polynominal&b); voidPolyMultiply(Polynominal&a,Polynominal&b); voidPolySort(); voidOutFile(); voidOut&a,Polynominal&b,stringch); voidOpposeCoef(Polynominal&a,Node*temp); 3.2.类关系图 3.3.数据结构设计 数据成员: 1. ClassNode: floatcoef;//系数 intexp;//指数 Node*Next;//指向下一项的指针 2. classPolynominal NodetheList;//头节点 ofstreamFOut;//输出流 此类中theList是头节点,其成员变量Next指向新建节点,构造成链表。 3.4.关键代码及运行界面 关键代码: #ifndefPOLYNOMINA_H #definePOLYNOMINA_H #include"Node.h" #include #include #include #include usingnamespacestd; classPolynominal{ public: Polynominal(); Polynominal(Polynominal&a);//拷贝构造函数 voidGetMSG(CStringTempPloy);//获取由对话框输入的字符串并处理 CStringOutput_Node();//输出最后结果 voidPolyAdd(Polynominal&a,Polynominal&b);//加法 voidPolySubtract(Polynominal&a,Polynominal&b);//减法 voidPolyMultiply(Polynominal&a,Polynominal&b);//乘法 voidPolySort();//排序函数,用于乘法之后的按指数排序 voidOutFile();//文本输出函数 voidOut&a,Polynominal&b,stringch);//重载文本输出函数 voidOpposeCoef(Polynominal&a,Node*temp);//系数取反,用于减法运算 NodetheList;//头节点 ofstreamFOut;//输出流 }; #endif 函数实现: #include"stdafx.h" #include"Polynominal.h" #include"conio.h" Polynominal: : Polynominal(){} Polynominal: : Polynominal(Polynominal&a){ Node*temp=a.theList.Next; Node*tempNode=&theList; for(;temp! =NULL;){ tempNode->Next=newNode(temp->coef,temp->exp,NULL); temp=temp->Next; tempNode=tempNode->Next; } } voidPolynominal: : GetMSG(CStringTempPoly){ TempPoly.Remove(_T('^')); Node*TempNode=&theList; inti=0; for(i;i CStringtemp1; CStringtemp2; intj=1; if(TempPoly.GetAt(i)==_T('-')){ temp1=temp1+TempPoly.GetAt(i); i++; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 计算 实验 报告