一元多项式的计算实验报告Word文档下载推荐.docx
《一元多项式的计算实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《一元多项式的计算实验报告Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
:
Node(){}
默认构造函数。
2)
Node(floatc,inte,Node*next){
coef=c;
exp=e;
Next=next;
}
重载的自定义构造函数,用于给成员变量coef、exp和Next存入数据,Next指向传参来的next指针指向的地址,用于构造链表。
2.
classPolynominal{
Polynominal();
Polynominal(Polynominal&
a);
//拷贝构造函数
voidGetMSG(CStringTempPloy);
//获取由对话框输入的字符串并处理
CStringOutput_Node();
//输出最后结果
voidPolyAdd(Polynominal&
a,Polynominal&
b);
//加法
voidPolySubtract(Polynominal&
//减法
voidPolyMultiply(Polynominal&
//乘法
voidPolySort();
//排序函数,用于乘法之后的按指数排序
voidOutFile();
//文本输出函数
voidOutFile(Polynominal&
b,stringch);
//重载文本输出函数
voidOpposeCoef(Polynominal&
a,Node*temp);
//系数取反,用于减法运算
NodetheList;
//头节点
ofstreamFOut;
//输出流
此类用于构造一元多项式。
包括加、减、乘各各功能函数,还有两个帮助运算的辅助函数,以及界面输入输出和文本输出函数。
成员变量有头节点和输出流。
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->
}
拷贝构造函数,用于计算时对象间的赋值,防止误改数据。
3)
voidPolynominal:
GetMSG(CStringTempPoly){
TempPoly.Remove(_T('
^'
));
Node*TempNode=&
inti=0;
for(i;
i<
TempPoly.GetLength();
){
CStringtemp1;
CStringtemp2;
intj=1;
if(TempPoly.GetAt(i)==_T('
-'
)){
temp1=temp1+TempPoly.GetAt(i);
i++;
}
if(TempPoly.GetAt(i)==_T('
+'
x'
)){
temp1=temp1+_T('
1'
);
while(j==1){
if(TempPoly.GetAt(i)!
=_T('
temp1=temp1+TempPoly.GetAt(i);
i++;
}
elsej=0;
i++;
if(i<
(TempPoly.GetLength()-1)&
&
TempPoly.GetAt(i)==_T('
temp2=temp2+TempPoly.GetAt(i);
if(i==(TempPoly.GetLength()-1)&
))
temp2=temp2+_T('
else{
if(i==TempPoly.GetLength()&
TempPoly.GetAt(i-1)==_T('
temp2=temp2+_T('
else{
while(i<
TempPoly.GetLength()&
TempPoly.GetAt(i)!
)&
temp2=temp2+TempPoly.GetAt(i);
i++;
}
TempNode->
Next=newNode(_ttof(temp1),_ttoi(temp2),NULL);
//链表构建
TempNode=TempNode->
此函数用于把从对话框获取的字符串进行处理,截取出多项式各项系数和指数,并转换为float型和int型,构造一元多项式链表。
4)
CStringPolynominal:
Output_Node(){
intfirst=0;
CStringtemp;
CStringtemp_coef;
CStringtemp_exp;
Node*TempNode=theList.Next;
for(;
TempNode!
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("
break;
default:
coef==1)//其余指数输出“X^”形式
)+temp_exp;
elsetemp=temp+temp_coef+_T("
x^"
break;
first=1;
returntemp;
输出函数,将计算所得结果输出到对话框。
5)
PolyAdd(Polynominal&
b){
Node*p,*q,*temp;
temp=&
p=a.theList.Next;
q=b.theList.Next;
while(p!
=NULL&
q!
=NULL){
if((p->
exp)>
(q->
exp)){
temp->
Next=newNode(p->
coef,p->
temp=temp->
p=p->
elseif((p->
exp)==(q->
coef+q->
q=q->
exp)<
Next=newNode(q->
coef,q->
if(q!
while(q!
if(p!
while(p!
加法函数,实现多项式的相加。
在其中需要判断各项指数的关系,已实现按指数大小关系构建链表。
6)
OpposeCoef(Polynominal&
a,Node*temp){
temp=a.theList.Next;
while(temp!
temp->
coef=-(temp->
在执行减法操作时,用此函数将被减多项式各位系数取反,之后可直接调用加法函数进行运算;
7)
PolySubtract(Polynominal&
Node*temp=NULL;
Polynominalaa=b;
OpposeCoef(aa,temp);
PolyAdd(a,aa);
减法函数。
先调用系数取反函数,再调用加法函数,可直接实现减法功能。
其中为了不改变被减多项式的各项值,在此调用拷贝构造函数创建临时对象用于计算。
8)
PolyMultiply(Polynominal&
Next=newNode((p->
coef*q->
coef),(p->
exp+q->
exp),NULL);
p=p->
q=b.theList.Next;
PolySort();
乘法函数。
按项相乘,运算完之后,再调用排序函数,实现同指数项系数相加,并按照指数大小输出。
9)
PolySort(){
Polynominaltemp;
inti=1;
floattemp_coef=0;
inttemp_exp=0;
Node*tempNode=theList.Next;
Node*tempNode2=&
Node*tempNode3=&
temp.theList;
while(i==1){
tempNode=theList.Next;
tempNode2=&
tempNode!
if(tempNode->
exp>
temp_exp)
temp_exp=tempNode->
exp;
tempNode=tempNode->
if(tempNode!
for(;
if(tempNode->
exp==temp_exp){
temp_coef=temp_coef+tempNode->
coef;
tempNode2->
Next=tempNode->
tempNode=tempNode->
else{
tempNode2=tempNode2->
tempNode3->
Next=newNode(temp_coef,temp_exp,NULL);
tempNode3=tempNode3->
temp_coef=0;
temp_exp=0;
i=0;
Node*temp2=&
Node*temp3=temp.theList.Next;
temp3!
temp2->
Next=newNode(temp3->
coef,temp3->
temp2=temp2->
temp3=temp3->
实现相乘之后的排序,是最后的链表按照指数大小排列,并且每个指数只有一项。
10)
OutFile(){
FOut.open("
PolynominalList.txt"
ofstream:
app);
intfirst=1;
Node*temp=theList.Next;
FOut<
<
"
("
;
temp=temp->
if(!
first&
temp->
0)
FOut<
FOut<
temp->
switch(temp->
case0:
break;
//指数为0则推出
case1:
FOut<
//指数为1则直接输出X
default:
<
//其余指数输出“X^”形式
first=0;
)"
FOut.close();
文本输出函数,用于两个多项式的文本输出。
11)
OutFile(Polynominal&
b,stringch){
a.OutFile();
ch;
b.OutFile();
=("
\n\n"
重载文本输出函数,用于最后结果的一次性文本输出。
3.1.类设计
表2类表
序号
类名
属性
方法
1
Node
floatcoef;
intexp;
Node*Next;
Node();
Node(floatc,inte,Node*next);
2
Polynominal
NodetheList;
ofstreamFOut;
Polynominal();
voidGetMSG(CStringTempPloy);
CStringOutput_Node();
voidPolyAdd(Polynominal&
voidPolySubtract(Polynominal&
voidPolyMultiply(Polynominal&
voidPolySort();
voidOutFile();
voidOutFile(Polynominal&
voidOpposeCoef(Polynominal&
3.2.类关系图
3.3.数据结构设计
数据成员:
ClassNode:
2.
classPolynominal
此类中theList是头节点,其成员变量Next指向新建节点,构造成链表。
3.4.关键代码与运行界面
关键代码:
#ifndefPOLYNOMINA_H
#definePOLYNOMINA_H
#include"
Node.h"
#include<
string>
afxstr.h>
fstream>
iostream>
usingnamespacestd;
#endif
函数实现:
stdafx.h"
Polynominal.h"
conio.h"