一元稀疏多项式计算器.docx

上传人:b****3 文档编号:12639783 上传时间:2023-04-21 格式:DOCX 页数:18 大小:196.07KB
下载 相关 举报
一元稀疏多项式计算器.docx_第1页
第1页 / 共18页
一元稀疏多项式计算器.docx_第2页
第2页 / 共18页
一元稀疏多项式计算器.docx_第3页
第3页 / 共18页
一元稀疏多项式计算器.docx_第4页
第4页 / 共18页
一元稀疏多项式计算器.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

一元稀疏多项式计算器.docx

《一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式计算器.docx(18页珍藏版)》请在冰豆网上搜索。

一元稀疏多项式计算器.docx

一元稀疏多项式计算器

数据结构课程设计报告

课程名称______数据结构_____

题目名称一元稀疏多项式计算器

学生学院_计算机学院

 

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日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1