求解多项式积分.docx
- 文档编号:4225616
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:13
- 大小:28.27KB
求解多项式积分.docx
《求解多项式积分.docx》由会员分享,可在线阅读,更多相关《求解多项式积分.docx(13页珍藏版)》请在冰豆网上搜索。
求解多项式积分
课程设计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++的使用能力。
这次实验的算法中还是有很多不足的地方,例如,输入多项式之后,多项式之间自己就没有相乘的能力去合并同次方的项,所以,我还是要多加强对有些知识的理解,多多运用,实践!
另外,最后,感谢老师对我们的悉心指导,提前祝暑假愉快!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 求解 多项式 积分