求解多项式积分.docx

上传人:b****4 文档编号:4225616 上传时间:2022-11-28 格式:DOCX 页数:13 大小:28.27KB
下载 相关 举报
求解多项式积分.docx_第1页
第1页 / 共13页
求解多项式积分.docx_第2页
第2页 / 共13页
求解多项式积分.docx_第3页
第3页 / 共13页
求解多项式积分.docx_第4页
第4页 / 共13页
求解多项式积分.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

求解多项式积分.docx

《求解多项式积分.docx》由会员分享,可在线阅读,更多相关《求解多项式积分.docx(13页珍藏版)》请在冰豆网上搜索。

求解多项式积分.docx

求解多项式积分

课程设计II报告

(2008/2009学年第二学期)

 

题目:

求解多项式积分

 

专业计算机科学与技术

学生姓名孙凯

班级学号06001613

指导教师黄海平

指导单位计算机学院计算机科学与技术系

日期2009.06.10-06.24

评分细则

评分项

优秀

良好

中等

遵守机房规章制度

上机时的表现

学习态度

程序准备情况

程序设计能力

团队合作精神

课题功能实现情况

算法设计合理性

用户界面设计

报告书写认真程度

内容详实程度

文字表达熟练程度

回答问题准确度

简短评语

 

教师签名:

年月日

评分等级

备注

评分等级有五种:

优秀、良好、中等、及格、不及格

求解多项式积分

一、课题内容和要求

题目描述:

输入待求函数,积分上下限,求出结果。

基本要求:

(1)能正确求解多项式的单重和双重积分(存在x和y两个积分变量);

(2)能处理用户输入错误以及基本的逻辑错误。

提高要求:

(1)能设计出简捷易操作的窗口界面;

(2)能处理多重积分。

设计提示:

可采用链表结构描述多项式。

二、需求分析

1、【目标需求】:

(1)基本目标:

设计出一个程序可以生成任何多项式,并且能求解出该多项式的一重积分和二重积分;

(2)较高目标:

该程序可以求解出该多项式的多重积分。

2、【输入功能需求】:

(1)设计的程序可通过界面或提示输入相应的多项式。

3、【求解功能需求】:

程序可以正确生成多项式并且能得出相应的结论。

4、【输出答案功能需求】:

生成多项式后可以直接输入相应的指令得出相应的结果。

5、【程序界面需求】:

界面设计应美观实用,方便用户输入给定条件,有较强的容错功能。

6、【时间需求】:

程序可以较快地计算出结果。

 

三、概要设计

1、【算法设计】:

本题是一个数学计算题,要求对已知的多项式进行积分,主要思想是首先要设计出生该多项式的算法,然后利用积分公式分别对该多项式进行一重积分和二重积分,然后再利用简单的多项式相减的方法求解出最后的积分值。

多项式的每项都用简单链表的每个节点表示,每个节点中包含了多项式的系数和指数,以及保存指向下一个节点地址的变量。

计算积分时按照节点顺序分别对每个项求积分。

2、【主要数据设计】:

多项式以链表表示,链表中包含:

X的系数a,

指数exponentX,

Y的系数b,

指数exponentY。

这些封装在结构体student中。

3、【功能函数设计】:

函数:

create(void):

创建多项式(链表)。

函数:

print(structstudent*head):

查看系数和指数。

函数:

view_polynomial(structstudent*head):

输出查看多项式。

函数:

calculous_df(structstudent*head):

计算一重积分。

函数:

calculous_ds(structstudent*head):

计算二重积分。

函数:

get_command():

获取输入选项。

函数:

showMenu():

查看菜单。

函数:

main():

主函数。

4、【程序界面设计】:

界面大方、美观,用户可随意选择条件而不需要更改代码进行判断。

做到操作简便。

四、详细设计

//求解多项式积分

#include

#include

#include

#defineNULL0

#defineLENsizeof(structstudent)

structstudent

{

floata;

intexponentX;

floatb;

intexponentY;

doubley_b;

////

structstudent*next;

};

intn;

structstudent*create(void)

{

structstudent*head;

structstudent*p1,*p2;

n=0;

p1=p2=(structstudent*)malloc(LEN);

scanf("%f,%d,%f,%d",&p1->a,&p1->exponentX,&p1->b,&p1->exponentY);

head=NULL;

while(p1->a!

=0&&p1->b!

=0)

{

n++;

if(n==1)head=p1;

elsep2->next=p1;

p2=p1;

p1=(structstudent*)malloc(LEN);

scanf("%f,%d,%f,%d",&p1->a,&p1->exponentX,&p1->b,&p1->exponentY);

}

p2->next=NULL;

return(head);

}

voidprint(structstudent*head)//查看系数和指数

{

structstudent*p;

printf("\nNow,These%drecordsare:

\n",n);

p=head;

if(head!

=NULL)

do

{

printf("%%5d%%5d\n",p->a,p->exponentX,p->b,p->exponentY);

p=p->next;

}while(p!

=NULL);

}

//输出多项式

voidview_polynomial(structstudent*head)//查看系数和指数

{

structstudent*p;

printf("\nNow,Thepolynomialis:

\n");

p=head;

if(head!

=NULL)

do

{

if((int)(p->a)==1)printf("X");elseprintf("%1.1fX",p->a);

if(p->exponentX!

=1)printf("^%d",p->exponentX);

if((int)(p->b)==1)printf("Y");elseprintf("%4.1fY",p->b);

if(p->exponentY!

=1)printf("^%d",p->exponentY);

//printf("%1.1fX^%d%4.1fY^%d",p->a,p->exponentX,p->b,p->exponentY);

p=p->next;

if(p!

=NULL)

printf("+");

}while(p!

=NULL);

printf("\n");

}

//求积分

voidcalculous_df(structstudent*head)

{

floatx1,x2;

doubleresult1=0.0;

doubleresult2=0.0;

printf("请分别输入X的积分上下限,用英文“,”隔开:

\n");

scanf("%f,%f",&x1,&x2);

///////////////////

structstudent*p;

printf("\n积分结果:

\n",n);

p=head;

if(head!

=NULL)

do

{

result1+=(p->a)*pow(x1,(p->exponentX)+1)/(p->exponentX+1);

result2+=(p->a)*pow(x2,(p->exponentX)+1)/(p->exponentX+1);

p=p->next;

}while(p!

=NULL);

printf("%\n",result1-result2);

}

voidcalculous_ds(structstudent*head)

{

floatx1,x2,y1,y2;

doubleresult1=0.0;

doubleresult2=0.0;

doubleresultY1=0.0;

doubleresultY2=0.0;

printf("请分别输入X的积分上下限,用英文“,”隔开:

\n");

scanf("%f,%f",&x1,&x2);

printf("请分别输入Y的积分上下限,用英文“,”隔开:

\n");

scanf("%f,%f",&y1,&y2);

///////////////////

structstudent*p,*q;

printf("\n二重定积分结果:

\n",n);

p=head;q=head;

//一次遍历,对X求定积分

if(head!

=NULL)

do

{

result1=(p->a)*pow(x1,(p->exponentX)+1)/(p->exponentX+1);

result2=(p->a)*pow(x2,(p->exponentX)+1)/(p->exponentX+1);

p->y_b=result1-result2;

p=p->next;

}while(p!

=NULL);

//对Y求定积分

p=head;

if(head!

=NULL)

do

{

resultY1+=(p->y_b)*(p->b)*pow(y1,(p->exponentY)+1)/(p->exponentY+1);

resultY2+=(p->y_b)*(p->b)*pow(y2,(p->exponentY)+1)/(p->exponentY+1);

p=p->next;

}while(p!

=NULL);

printf("%\n",(float)(resultY1-resultY2));

}

charget_command()

{

charcom;

scanf("%c",&com);

returncom;

}

voidshowMenu()

{

printf("-------------菜单-----------------\n");

printf("'1'创建多项式\n");

printf("'2'检查输入\n");

printf("'3'查看多项式\n");

printf("'4'算一重定积分(输入X的上限和下限)\n");

printf("'5'算二重定积分(输入X、Y的上限和下限)\n");

printf("'q'退出\n");

printf("----------------------------------\n");

printf("请输入:

");

}

voidmain()

{

structstudent*head;

charcommand;

showMenu();

do

{

command=get_command();

switch(command)

{

case'1':

printf("请输入多项式X的系数和指数以及Y的系数和指数:

\n");

head=create();

printf("恭喜创建成功\n");

printf("请输入:

");

break;//创建多项式

case'2':

print(head);

printf("请输入:

");

break;//检查输入

case'3':

view_polynomial(head);

printf("请输入:

");

break;//查看多项式

case'4':

calculous_df(head);

printf("请输入:

");

break;//计算一重积分

case'5':

calculous_ds(head);

printf("请输入:

");

break;//计算二重积分

case'q':

break;

default:

break;

}

}while(command!

='q');

}

五、测试数据及其结果分析

(1).先拿多项式XY举例输入,其运行结果如下:

-------------菜单-----------------

1.创建多项式

2.检查输入

3.查看多项式

4.算一重定积分(输入X的上限和下限)

5.算二重定积分(输入X、Y的上限和下限)

q.退出

----------------------------------

请输入:

1(注:

创建多项式)

请输入多项式X的系数和指数以及Y的系数和指数:

1,1,1,1

0

恭喜创建成功

请输入:

2(注:

检查输入)

Now,These1recordsare:

1.011.01

请输入:

3(注:

查看多项式)

Now,Thepolynomialis:

XY

请输入:

4(对X求解一重积分)

请分别输入X的积分上下限,用英文“,”隔开:

2,1

积分结果:

请输入:

5(对多项式XY求解二重积分)

请分别输入X的积分上下限,用英文“,”隔开:

2,1

请分别输入Y的积分上下限,用英文“,”隔开:

2,1

二重定积分结果:

请输入:

q(退出输入)

Pressanykeytocontinue

(2).再用复杂一点的多项式6X^2Y^3+12X^3Y^4+3X^2Y^4

-------------菜单-----------------

1.创建多项式

2.检查输入

3.查看多项式

4.算一重定积分(输入X的上限和下限)

5.算二重定积分(输入X、Y的上限和下限)

q.退出

----------------------------------

请输入:

1

请输入多项式X的系数和指数以及Y的系数和指数:

2,2,3,3

3,3,4,4

1,2,3,4

0

恭喜创建成功

请输入:

3

Now,Thepolynomialis:

2.0X^23.0Y^3+3.0X^34.0Y^4+X^23.0Y^4

请输入:

4

请分别输入X的积分上下限,用英文“,”隔开:

2,1

积分结果:

请输入:

5

请分别输入X的积分上下限,用英文“,”隔开:

2,1

请分别输入Y的积分上下限,用英文“,”隔开:

2,1

二重定积分结果:

请输入:

q

Pressanykeytocontinue

六、调试过程中的问题

在调试中,遇到了一些问题。

如数字的精度问题,之前系数采用的是int整型做的,但是结果不够精确,所以采用了float做,但到在调用POW函数的时候,返还的类型是DOUBLE型,所以最后返还类型是double型的。

还有就是关于系数为1和-1的的情况,的处理,如果系数是1或者-1就没有必要再显示了。

找个问题得以解决。

程序虽然能正确算出一二重定积分,但是在显示查看多项式的时候还没有解决XY的系数相乘问题。

七、课程设计总结

通过这次程序设计,我对逻辑推理方面的问题设计和实现有了一定的经验。

了解了解决相关问题的通用方法。

同时也遇到了很多问题,但是通过与同组同学讨论,总是能够找到合理的解决办法;同组同学互相学习、互相帮助、互相提醒,逐步完善程序,我们都意识到团队合作的重要性。

这次程序设计中,调试显得极其重要,很多不易发现的错误通过调试可以轻松找到,程序调试能力在设计中占有重要地位,同时也进一步提高了VC++的使用能力。

这次实验的算法中还是有很多不足的地方,例如,输入多项式之后,多项式之间自己就没有相乘的能力去合并同次方的项,所以,我还是要多加强对有些知识的理解,多多运用,实践!

另外,最后,感谢老师对我们的悉心指导,提前祝暑假愉快!

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

当前位置:首页 > 解决方案 > 学习计划

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

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