一元多项式的表示及运算

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;ilength;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)

相关文档
最新文档