一元多项式的表示及运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中国石油大学(华东) 2012 级上机实习报告
课程名称:实用数据结构
上机题目:一元多项式的表示及运算
学生姓名:
专业班级:应用物理1203
指导教师郑立垠
实习时间2013 年10 月21 日至11 月09 日成绩
2013年11 月11 日
一、需求分析(要实现的功能描述)
1.问题描述
设计并实现一元多项式的表示和运算,加强对线性表等数据结构的理解,锻炼学生使用多种数据结构解决问题的综合能力。
2.实现功能
(1)在计算机上存储任意输入的一个一元多项式;
(2)计算功能,对任意输入的一个x值,能够计算出一元多项式的值;
(3)求和功能,能够实现两个一元多项式的加法运算;
(4)求导功能,实现一元多项式的一阶导数的运算。
3.测试数据
F1(x)=1+x+x^2+x^3+x^4+x^5
x=2
F2(x)=1+x+x^2
二、概要设计
程序主要包含:一元多项式的创建、一元多项式代入求值、两个一元多项式相加、一元多项式的求导以及主函数。
主函数调用一元多项式的创建、一元多项式的求值,一元多项式的相加、一元多项式的求导等子函数。
1.创建一元多项式
void Create(Lnode *f)//创建一元多项式
2.一元多项式求值
void Calculate(Lnode *f,float x)//一元多项式的求值
3.一元多项式相加
void Plus(Lnode *f1,Lnode *f2)//两个一元多项式相加
4.一元多项式求导
void Dao(Lnode *f)//一元多项式求导
5.主函数
void main()
三、详细设计
抽象数据类型中定义的各种操作算法实现(用N-S图描述)
四、调试分析
1.程序在调试过程中出现的问题及解决方法
●问题:程序设计中遍历字符串并保存各项系数以及指数都比较困难。
●解决办法:利用自己手动输入各项指数和系数的办法,直接控制输入各项的系数和指数,
并保存。
●另外,不同的系数在顺序表中对应不同的存储位置,在后面加法,求导的时候利用这一
特性很快速达成目标。
2.心得体会
在编写和设计这次一元多项式的表示和运算的过程中,我发现之前学习上还有些概念不清楚,弄懂了之后才恍然大悟。使我明白了无论学习什么课程,概念永远是基础,所有的知识都是建立在概念的基础之上的。因此,我们必须要将概念熟记于心才能构筑起知识框架。
在数据结构课程的学习过程以及编程和算法设计过程中,我深刻体会到了数据结构这门学科严谨性。编写程序代码的过程中,要求我们十分注意细节,注意每一个符号、数字和标点符号,以免出错;还要求我们在编写程序过程中,要注意一些编程方法和编程技巧,从而有效地避免一些错误;更要求我们要有耐心,能够细致冷静的分析程序调试过程中存在的问题,从而能够更快地发现问题,解决问题。
通过这学期数据结构的学习,不仅仅教会了我一些算法和程序设计,更多的是教会了我思考问题的方法以及寻求解决办法的思想。这不仅培养了我的逻辑思维能力,还培养了我的思考问题和解决问题的能力,并且能够将这样的思维方式能够运用到以后的工作和学习生活中,这将对我以后的学习工作也很有帮助。
五、用户手册
按照提示输入一元多项式中的最高幂次,按回车键。然后依照提示输入各幂次的系数并输入x的值,按回车键求出一元多项式的值。按照上面的办法输入第二个多项式。相加,并求出第一个多项式的导数。程序退出。
六、测试结果
七、程序清单
#include
#include
#define MAX 100
typedef struct
{
float a[MAX];
int length;
}Lnode;
void Create(Lnode *f)//一元多项式的创建
{
int i,n;
printf("请输入一元多项式的最高幂次:");
scanf("%d",&n);
printf("请一次性输入多项式各幂次的系数\n");
printf("常数项:");
scanf("%f",&f->a[0]);
for(i=1;i<=n;i++)
{
printf("%d次项:",i);
scanf("%f",&f->a[i]);
}
f->length=n;
}
void Calculate(Lnode *f,float x)//一元多项式的求值{
int i,j;
float t,sum=0;
for(i=0;i<=f->length;i++)
{
t=f->a[i];
for(j=i;j>0;j--)
t*=x;
sum+=t;
}
printf("一次多项式的值为:");
printf("%f\n",sum);
}
void Plus(Lnode *f1,Lnode *f2)//一元多项式的相加{
int i,j;
Lnode *f;
f=(Lnode *)malloc(sizeof(Lnode));
if(f1->length<=f2->length)
{
for(i=0;i<=f1->length;i++)
f->a[i]=f1->a[i]+f2->a[i];
for(i=f1->length+1;i
f->a[i]=f2->a[i];
f->length=f2->length;
}
else
{
for(i=0;i<=f2->length;i++)
f->a[i]=f1->a[i]+f2->a[i];
for(i=f2->length+1;i<=f1->length;i++)
f->a[i]=f1->a[i];
f->length=f1->length;
}
printf("相加后的多项式为:\n");
if(f->a[0]!=0)
printf("f=%f",f->a[0]);
else
printf("f=");
for(i=1;i<=f->length;i++)
{
if(f->a[i]>0)
printf("+%f",f->a[i]);
if(f->a[i]<0)
printf("%f",f->a[i]);
for(j=1;j<=i;j++)
printf("x");
}
printf("\n");
}
void Qiudao(Lnode *f)//一元多项式的求导{
int i,j;
for(i=1;i<=f->length;i++)
f->a[i]=f->a[i]*i;
printf("一元多项式的导数为:\n");
printf("f'=");
for(i=1;i<=f->length;i++)
{
if(i==1)
printf("%f",f->a[i]);
else
if(f->a[i]>0)