一元稀疏多项式计算器.docx
《一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式计算器.docx(18页珍藏版)》请在冰豆网上搜索。
![一元稀疏多项式计算器.docx](https://file1.bdocx.com/fileroot1/2023-4/21/38a2477b-9947-4959-acb2-e1060b427338/38a2477b-9947-4959-acb2-e1060b4273381.gif)
一元稀疏多项式计算器
数据结构课程设计报告
课程名称______数据结构_____
题目名称一元稀疏多项式计算器
学生学院_计算机学院
2012年07月01日
一元稀疏多项式计算器
1.用了VC6.0,MFC对话框界面编程,下面的LJQList.h和LJQList.cpp是我自己编写的数据结构以及功能操作函数
2.源代码
LJQList.h的头文件代码:
#ifndefLJQLIST
#defineLJQLIST
#include
#include
#include
//多项式链表的结构,第一个链表头的exp值表示为该多项式的项数
typedefstructLJQLink{
floatdata;
intexp;
structLJQLink*next;
}LJQLink,*LJQList;
//初始化LJQLink
voidcreate(LJQList&L);
//插入新的节点次幂为e系数为d
voidinsert(LJQListL,inte,floatd);
//根据幂数,若存在输出该节点指针,显示该项系数
LJQListsearch(LJQListL,inte);
//打印多项式L,以幂数下降为序显示
CStringchangeCString(LJQListL);
//A多项式和B多项式相加,输出到LA+B=L
voidAdd(LJQList&A,LJQList&B,LJQList&L);
//A多项式和B多项式相减,输出到LA-B=L
voidCut(LJQList&A,LJQList&B,LJQList&L);
//A多项式和B多项式相乘,输出到LA*B=L
voidMultiply(LJQList&A,LJQList&B,LJQList&L);
//A多项式的求导函数,并输出到L(A)'=L
voidDerivation(LJQListA,LJQList&L);
//删除以e为次幂的节点
voidDeleteOne(LJQList&L,inte);
//清空该单链表
boolclear(LJQList&L);
#endif//LJQLIST
这里是LJQList.cpp的代码:
#include"stdafx.h"
#include"LJQList.h"
//链表的初始化
voidcreate(LJQList&L){
L=(LJQList)malloc(sizeof(structLJQLink));
L->next=NULL;
L->exp=0;
L->data=0;
}
//插入一个新的节点赋值幂数e,系数d
voidinsert(LJQListL,inte,floatd){
LJQListn;
n=(LJQList)malloc(sizeof(structLJQLink));
n->exp=e;
n->data=d;
n->next=NULL;
if(n->data==0)free(n);//系数为0的话释放结点
else{
LJQListq1,q2;
q1=L;
q2=L->next;
while(q2&&n->expexp){//查找插入位置
q1=q2;
q2=q2->next;}
if(q2&&n->exp==q2->exp){//将指数相同相合并
q2->data+=n->data;
free(n);
if(!
q2->data){//系数为0的话释放结点
L->exp--;
q1->next=q2->next;
free(q2);
}
}else{//指数为新时将结点插入并使项数加1
L->exp++;
n->next=q2;
q1->next=n;
}
}
}
//根据幂数,若存在输出该节点指针,显示该项系数
LJQListsearch(LJQListL,inte){
LJQListl=L->next;
for(;l;l=l->next)
if(l->exp==e){
returnl;
}
returnNULL;
}
//打印多项式L,以幂数下降为序显示
CStringchangeCString(LJQListL){
LJQListl;
CStrings,cs;
s="";
if(L->exp){
l=L->next;
if(l->data==1)cs.Format(_T("X^%d"),l->exp),s+=cs;
elseif(l->data==-1)cs.Format(_T("-X^%d"),l->exp),s+=cs;
elsecs.Format(_T("%0.1fX^%d"),l->data,l->exp),s+=cs;
l=l->next;
for(;l;l=l->next){
if(l->data==1)cs.Format(_T("+X^%d"),l->exp),s+=cs;
else{if(l->data>=0)
cs.Format(_T("+%0.1fX^%d"),l->data,l->exp),s+=cs;
elseif(l->data!
=-1)cs.Format(_T("%0.1fX^%d"),l->data,l->exp),s+=cs;
elsecs.Format(_T("-X^%d"),l->exp),s+=cs;
}
}
}
returns;
}
//A多项式和B多项式相加,输出到LA+B=L
voidAdd(LJQList&A,LJQList&B,LJQList&L){
LJQListla,lb;
floatd;
inte;
la=A->next;
lb=B->next;
for(la=A->next;la;la=la->next){
e=la->exp;
d=la->data;
insert(L,e,d);
}
for(lb=B->next;lb;lb=lb->next){
e=lb->exp;
d=lb->data;
insert(L,e,d);
}
}
//A多项式和B多项式相减,输出到LA-B=L
voidCut(LJQList&A,LJQList&B,LJQList&L){
LJQListla,lb;
floatd;
inte;
la=A->next;
lb=B->next;
for(la=A->next;la;la=la->next){
e=la->exp;
d=la->data;
insert(L,e,d);
}
for(lb=B->next;lb;lb=lb->next){
e=lb->exp;
d=-lb->data;
insert(L,e,d);
}
}
//A多项式和B多项式相乘,输出到LA*B=L
voidMultiply(LJQList&A,LJQList&B,LJQList&L){
LJQListla,lb;
floatd;
inte;
la=A->next;
lb=B->next;
while(la){
for(lb=B->next;lb;lb=lb->next){
e=la->exp+lb->exp;
d=la->data*lb->data;
insert(L,e,d);
}
la=la->next;
}
}
//A多项式的求导函数,并输出到L(A)'=L
voidDerivation(LJQListA,LJQList&L){
LJQListl=A->next;
floatd;
inte;
for(;l;l=l->next){
d=l->data*l->exp;
e=l->exp-1;
insert(L,e,d);
}
}
//删除以e为次幂的节点
voidDeleteOne(LJQList&L,inte){
LJQListl,q;
q=L;
if(l=search(L,e))
if(l->next){
for(;q->next;q=q->next)
if(q->next->exp==l->exp){
if(!
l->next)q->next=NULL;
else
q->next=l->next;
free(l);
L->exp--;
}
}else{
for(;q;q=q->next){
if(q->next->exp==l->exp){
if(!
l->next)q->next=NULL;
else
q->next=l->next;
free(l);
L->exp--;
}
}
}
}
//清空该单链表用一个递归函数清空
boolclear(LJQList&L){
if(L->next){
LJQListq;
q=L->next;
if(q)DeleteOne(L,q->exp);
clear(L);
}
elsereturntrue;
returnfalse;
}
这里是MFC自动生成的LJQDlg界面类的头文件,里面申明了各种参数,函数
//CLJQDlgdialog
classCLJQDlg:
publicCDialog
{
//Construction
public:
CLJQDlg(CWnd*pParent=NULL);//standardconstructor
//DialogData
//{{AFX_DATA(CLJQDlg)
enum{IDD=IDD_LJQ_DIALOG};
intm_edit_exp;
CStringm_A;
CStringm_B;
floatm_edit_data;
CStringm_Show;
intm_Radio_Kind;
CStringm_Message;
intm_RadioAB;
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CLJQDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
LJQListL;
LJQListB;
LJQListA;
HICONm_hIcon;
//Generatedmessagemapfunctions
//{{AFX_MSG(CLJQDlg)
virtualBOOLOnInitDialog();
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
afx_msgvoidOnButtonJisuan();
afx_msgvoidOnButtonTianjia();
afx_msgvoidOnButtonClear();
afx_msgvoidOnButtonDel();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
这里是LJQDlg.cpp文件的按钮上的各个事件响应函数:
//对应的是“
”按钮
voidCLJQDlg:
:
OnButtonJisuan(){
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
if(B->exp==0||A->exp==0)MessageBox("A或B各至少需要添加一次才可以参加计算!
");
else{
clear(L);
//TODO:
Addyourcontrolnotificationhandlercodehere
switch(m_Radio_Kind){
case0:
Add(A,B,L);
m_Show="A+B=";
m_Show+=changeCString(L);
break;
case1:
Cut(A,B,L);
m_Show="A-B=";
m_Show+=changeCString(L);
break;
case2:
Multiply(A,B,L);
m_Show="A×B=";
m_Show+=changeCString(L);
break;
case3:
Derivation(A,L);
m_Show="对A求导=";
m_Show+=changeCString(L);
break;
}
}
UpdateData(false);
}
//对应的是“
”按钮
voidCLJQDlg:
:
OnButtonTianjia()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
CStrings="";
m_Message="";
if(m_edit_exp*10%10==0)
switch(m_RadioAB){
case0:
insert(A,m_edit_exp,m_edit_data);
m_A=changeCString(A);
m_Message="当前A多项式共有";
s.Format(_T("%d项!
"),A->exp);
m_Message+=s;
break;
case1:
insert(B,m_edit_exp,m_edit_data);
m_B=changeCString(B);
m_Message="当前B多项式共有";
s.Format(_T("%d项!
"),B->exp);
m_Message+=s;
break;
}
UpdateData(false);
}
//对应的是“
”按钮
voidCLJQDlg:
:
OnButtonClear()
{
UpdateData(true);
//TODO:
Addyourcontrolnotificationhandlercodehere
switch(m_RadioAB){
case0:
m_A="";
clear(A);
m_Message="清空A成功!
";
break;
case1:
m_B="";
clear(B);
m_Message="清空B成功!
";
break;
}
UpdateData(false);
}
//对应的是“
”按钮
voidCLJQDlg:
:
OnButtonDel()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
CStrings="";
LJQListl;
switch(m_RadioAB){
case0:
if(!
A->exp){
MessageBox("当前A多项式为空,删除失败!
");
break;
}
if(l=search(A,m_edit_exp)){
m_Message="删除A中";
s.Format(_T("%d"),l->exp);
m_Message+=s;
m_Message+="次幂项成功!
";
m_Message+="该项系数为";
s.Format(_T("%0.1f"),l->data);
m_Message+=s;
DeleteOne(A,m_edit_exp);
break;
}elsem_Message="删除失败!
A中不存在该次幂项。
";
break;
case1:
if(!
B->exp){
MessageBox("当前B多项式为空,删除失败!
");
break;
}
if(l=search(B,m_edit_exp)){
m_Message="删除B中";
s.Format(_T("%d"),l->exp);
m_Message+=s;
m_Message+="次幂项成功!
";
m_Message+="该项系数为";
s.Format(_T("%0.1f"),l->data);
m_Message+=s;
DeleteOne(B,m_edit_exp);
break;
}elsem_Message="删除失败!
B中不存在该次幂项。
";
break;
}
m_A=changeCString(A);
m_B=changeCString(B);
UpdateData(false);
}
3.这是整个软件运行的界面
4.整个程序的介绍说明:
1.对A或B多项式添加各种次幂的项(确保各至少有一项才能计算,注意,假如添加的项的次幂多项式里面已经存在,则是视为系数上的相加);
2.对A或B多项式删除指定次幂的项,不存在会返回信息;
3.清空A或B多项式;
4.进行当前A和B多项式的相加,相减,相乘,还有对A求导,计算过程如果出现系数为0的项则自动删除
5.执行1~4操作的过程,会有操作信息显示在右上角的显示框里,A和B当前的项数都会有显示;
6.对于A和B的显示,按次幂从大到小排序,用了CString风格字符串,里面对于多项式的显示完全是通过一系列算法加以转换输出显示,并对个别特殊系数比如1,-1,都有特殊的显示处理;
7.最下的是整个计算结果的输出框,一有计算就会显示出计算结果;
8.对于系数我里面定义的是float类型,我只处理显示小数后一位;
9.上面的勾选按钮各表示当前对A或B的操作,必须指定好,下面的勾选按钮各表示当前对计算功能的操作;
5.课程设计遇到的问题:
开始遇到了链表删除问题,总是遇空报错,后来修改了很多,还有字符转换显示问题,用循环把每个节点转换成CString风格字符串加以显示,还是靠同学,了解到了Format()函数的运用。
6.心得:
通过本次课程设计,学到了很多东西,学到了如何利用数据结构这门课所学的的知识,来解决问题,构造合理,切当的数据结构来使得问题简单化。
2012年7月1日