一元稀疏多项式计算器实习报告[1]

实习报告

题目:设计一个一元稀疏多项式计算器

班级: 姓名 学号_________完成日期:__

一、课程题目

一元稀疏多项式计算器

二、需求分析

1、一元稀疏多项式简单计算器的功能是:

1.1 输入并建立多项式;

1.2 输出多项式,输出形式为整数序列:n ,c1,e1,c2,e2, „„„cn,en,

其中n 是多项式的项数,ci 和ei 分别是第i 项的系数和指数,序列按指

数降序排列;

1.3 求多项式a 、b 的导函数;

1.4 计算多项式在x 处的值;

1.5多项式a 和b 相加,建立多项式a+b;

1.6 多项式a 和b 相减,建立多项式a-b 。

2、设计思路:

2.1 定义线性表的动态分配顺序存储结构;

2.2 建立多项式存储结构,定义指针*next

2.3利用链表实现队列的构造。每次输入一项的系数和指数,可以输出构

造的一元多项式

3、测试数据:

(1)、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);

(2)、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15

)=(-7.8x^15-1.2x^9+12x^-3-x);

(3)、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5);

(4)、(x+x^3)+(-x-x^3)=0;

(5)、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200);

(6)、(x+x^2+x^3)+0=x+x^2+x^3.

三、概要设计

1. 有序表的抽象数据类型定义为:

ADT List{

数据对象:D={ai | ai ∈R,i=1,2,…,n,n ≧0}

数据关系:R1={| ai-1, a i ∈D, ai-1,

基本操作:

InitList()

操作结果:构造一个空的有序表L 。

DestroyList(L)

初始条件:有序表L 已存在。

操作结果:销毁有序表L 。

ListLength(L)

初始条件:有序表L 已存在。

操作结果:返回有序表L 的长度。

ClearList( L )

初始条件:有序表L 已存在。

操作结果:清空链表内容。

Ins_before ( N,N )

初始条件:有序表L 已存在。

操作结果:插入节点到链表。

} ADT OrderedList

2. 多项式的抽象数据类型定义为:

ADT Poly {

数据对象:D={ai |ai 为实数,i=1,2,…,n }

数据关系:R1={}

基本操作:

CreatePoly( L,N )

初始条件:N 为节点,L 为有序表。

操作结果:将N 插入多项式的适当位置。

GetPoly( L )

操作结果:将用户输入转换为节点。

PrintPoly( L )

初始条件:多项式L 已存在。

操作结果:显示多项式。

AddPoly( L_1,L_2,L_add )

初始条件:多项式L_1,L_2,L_add已存在。

操作结果:生成L_1,L_2之和的多项式L_add

DiffPoly( L ,L_diff)

初始条件:多项式L ,L_diff已存在。

操作结果:生成L 的导数多项式L_add。

AlterPoly( L )

初始条件:多项式L 已存在。

操作结果:将L 多项式取相反数。

}ADT Poly、

三、详细设计

1、Constant.h

#ifndef __constant__

#define __constant__

#include

#include

#define TURE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status;

#endif

2、Polynt.h

#include"constant.h"

typedef struct elemType{

float coef;//系数

int expn;//指数

}ElemType;

typedef struct node{

ElemType data; //指向结点元素的值

struct node *next; //后继

}Node,*Polyn; //结点类型,指针类型

typedef struct{

Node *head;

Node *tail;

}List;

Status MakeNode(Polyn &p,ElemType e); //分配由p 指向的数据

元素为e 、后继为“空”的结点

Status InitList(List &L); //构造链表

Status DestroyList(List &L); //销毁线性表

void Insert(List &L,Polyn s); //将s 指向的结点插

入L 的最后一个结点

void Insbefore(Polyn p,Polyn q);

Status CreatPolyn(List &polynomial,int m); //创建一

个一元多项式polynomial ,并输入m 项的指数和系数

void PrintPolyn(List L); //打印输出一元多

项式

void AlterPoly(List L); //减法

void AddPolyn(List L1,List L2,List &L3); //

多项式加法

3、Polyn.cpp

#include"Polynt.h"

Status MakeNode(Polyn &p,ElemType e)

{//分配由p 指向的数据元素为e 、后继为“空”的结点

p=(Polyn)malloc(sizeof(Node));

p->data.coef=e.coef;

p->data.expn=e.expn;

p->next=NULL;

return OK;

}

Status InitList(List &L)

{//初始化链表

ElemType e;

Polyn p;

e.coef = ' ';

e.expn = ' ';

MakeNode(p,e);

L.head = p;

L.tail=p;

return OK;

}

Status DestroyList(List &L)

{//销毁链表

Polyn p,q;

if(L.head==L.tail) {free(L.head);L.head=L.tail=NULL;return OK;}

p=L.head->next;

while(!p){

q=p->next;

free(p);

p=q;}

L.head=L.tail=NULL;

return OK;

}

void Insert(List &L,Polyn s)

{

if(L.head->next ==NULL)

{

L.head->next =s;

s->next =NULL;

L.tail = s;

}

else{

if(L.head->next!=NULL && s->data.expn>L.head->next->data.expn)

{s->next=L.head->next;L.head->next=s; return;}

if(L.tail->data.expn>s->data.expn)

{L.tail->next=s; L.tail=s;return;}

for (Polyn p = L.head->next; p!=NULL;p = p->next )

{

if (s->data.expn== p->data.expn)

{

p->data.coef+=s->data.coef;

free(s);

return;

}

else if ( p->data.expn>s->data.expn &&

p->next->data.expndata.expn)

{

s->next=p->next;p->next=s;

return;

}

}

}

}

Status CreatPolyn(List &polynomial,int m)

{//创建一个一元多项式polynomial ,并输入m 项的指数和系数

ElemType e;

Polyn p;

for(int i=0;i

{

scanf("%g,%d",&e.coef,&e.expn);

MakeNode(p,e);

Insert(polynomial,p);}

polynomial.tail=p;

return OK;

}

void PrintPolyn(List L)

{

Polyn p;

if(L.head==L.tail)

printf("0");

else

{

p=L.head->next;

while(p!=NULL)

{

if(p==L.head->next)

{

if(p->data.coef>0)

{

if(p->data.expn!=0)

{printf("%gx^%d",p->data.coef,p->data.expn);}

else{printf("%g",p->data.coef);}

}

else if(p->data.coef

{

if(p->data.expn!=0)

{printf("%gx^%d",p->data.coef,p->data.expn);}

else{printf("%g",p->data.coef);}

}

else

{printf(" ");}

p=p->next;

}

else if(p!=L.head->next && p!=NULL)

{

if(p->data.coef>0)

{

if(p->data.expn!=0)

{printf("+%gx^%d",p->data.coef,p->data.expn);}

else{printf("+%g",p->data.coef);}

}

else if(p->data.coef

{

if(p->data.expn!=0)

{printf("%gx^%d",p->data.coef,p->data.expn);}

else{printf("%g",p->data.coef);}

}

else

{printf(" ");}

p=p->next;

}

else

return;

}

}

}

void AlterPoly(List L)

{

for(Polyn p=L.head->next;p!=NULL;p=p->next)

p->data.coef*=-1;

}

void AddPolyn(List L1,List L2,List &L3)

{

Polyn p1,p2,p3;

p1=L1.head->next;

p2=L2.head->next;

while(p1!=NULL && p2!=NULL)

{

if(p1->data.expn>p2->data.expn)

{

MakeNode(p3,p1->data);

Insert(L3,p3);

p1=p1->next;

}

else if(p1->data.expndata.expn)

{

MakeNode(p3,p2->data);

Insert(L3,p3);

p2=p2->next;

}

else if(p1->data.expn==p2->data.expn)

{

MakeNode(p3,p2->data);

p3->data.coef=p1->data.coef+p2->data.coef;

p3->data.expn=p1->data.expn;

Insert(L3,p3);

p1=p1->next;p2=p2->next;

}

}

if(p1==NULL && p2!=NULL)

{

while(p2!=NULL){

MakeNode(p3,p2->data);

Insert(L3,p3);

p2=p2->next;

}

}

else if(p2==NULL && p1!=NULL)

{

while(p1!=NULL){

MakeNode(p3,p1->data);

Insert(L3,p3);

p1=p1->next;

}

}

}

4、main.cpp

#include"Polynt.h"

#include

#include

void main()

{

system("cls");

printf("*********************************************************

***\n");

printf(" 欢迎使用一元稀疏多项式计算 \n");

printf("*********************************************************

***\n");

printf("1、创建多项式A 2、创建多项式B 3、相加 4、相减 5、退出

\n");

List polynomialA,polynomialB,polynomialC;

InitList(polynomialA); InitList(polynomialB); InitList(polynomialC);

char poly;

int m;int n=1;

for(;;)

{

printf("请输入指令:");

poly=getchar();

switch(poly)

{

case'1': //创建多项式A printf("请输入多项式A 的项数:");

scanf("%d",&m);

printf("\n请 输 入 多 项 式 A:");

CreatPolyn(polynomialA,m);

printf("\n多项式A 是:");

PrintPolyn(polynomialA);

printf("\n");

break;

case'2': //创建多项式B printf("请输入多项式B 的项数:");

scanf("%d",&m);

printf("\n请 输 入 多 项 式 B:");

CreatPolyn(polynomialB,m);

printf("\n多项式B 是:");

PrintPolyn(polynomialB);

printf("\n");

break;

case'3': //加法

printf("结果是:");

AddPolyn(polynomialA,polynomialB,polynomialC);

PrintPolyn(polynomialC);

printf("\n");

break;

case'4': //减法

printf("结果是:");

AlterPoly(polynomialB);

DestroyList(polynomialC);

InitList(polynomialC);

AddPolyn(polynomialA,polynomialB,polynomialC);

PrintPolyn(polynomialC);

} } printf("\n"); break; case'5': DestroyList(polynomialA); //退出 DestroyList(polynomialB); DestroyList(polynomialC); return; } poly=getchar(); if(poly==5) break;

实习报告

题目:设计一个一元稀疏多项式计算器

班级: 姓名 学号_________完成日期:__

一、课程题目

一元稀疏多项式计算器

二、需求分析

1、一元稀疏多项式简单计算器的功能是:

1.1 输入并建立多项式;

1.2 输出多项式,输出形式为整数序列:n ,c1,e1,c2,e2, „„„cn,en,

其中n 是多项式的项数,ci 和ei 分别是第i 项的系数和指数,序列按指

数降序排列;

1.3 求多项式a 、b 的导函数;

1.4 计算多项式在x 处的值;

1.5多项式a 和b 相加,建立多项式a+b;

1.6 多项式a 和b 相减,建立多项式a-b 。

2、设计思路:

2.1 定义线性表的动态分配顺序存储结构;

2.2 建立多项式存储结构,定义指针*next

2.3利用链表实现队列的构造。每次输入一项的系数和指数,可以输出构

造的一元多项式

3、测试数据:

(1)、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);

(2)、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15

)=(-7.8x^15-1.2x^9+12x^-3-x);

(3)、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5);

(4)、(x+x^3)+(-x-x^3)=0;

(5)、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200);

(6)、(x+x^2+x^3)+0=x+x^2+x^3.

三、概要设计

1. 有序表的抽象数据类型定义为:

ADT List{

数据对象:D={ai | ai ∈R,i=1,2,…,n,n ≧0}

数据关系:R1={| ai-1, a i ∈D, ai-1,

基本操作:

InitList()

操作结果:构造一个空的有序表L 。

DestroyList(L)

初始条件:有序表L 已存在。

操作结果:销毁有序表L 。

ListLength(L)

初始条件:有序表L 已存在。

操作结果:返回有序表L 的长度。

ClearList( L )

初始条件:有序表L 已存在。

操作结果:清空链表内容。

Ins_before ( N,N )

初始条件:有序表L 已存在。

操作结果:插入节点到链表。

} ADT OrderedList

2. 多项式的抽象数据类型定义为:

ADT Poly {

数据对象:D={ai |ai 为实数,i=1,2,…,n }

数据关系:R1={}

基本操作:

CreatePoly( L,N )

初始条件:N 为节点,L 为有序表。

操作结果:将N 插入多项式的适当位置。

GetPoly( L )

操作结果:将用户输入转换为节点。

PrintPoly( L )

初始条件:多项式L 已存在。

操作结果:显示多项式。

AddPoly( L_1,L_2,L_add )

初始条件:多项式L_1,L_2,L_add已存在。

操作结果:生成L_1,L_2之和的多项式L_add

DiffPoly( L ,L_diff)

初始条件:多项式L ,L_diff已存在。

操作结果:生成L 的导数多项式L_add。

AlterPoly( L )

初始条件:多项式L 已存在。

操作结果:将L 多项式取相反数。

}ADT Poly、

三、详细设计

1、Constant.h

#ifndef __constant__

#define __constant__

#include

#include

#define TURE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status;

#endif

2、Polynt.h

#include"constant.h"

typedef struct elemType{

float coef;//系数

int expn;//指数

}ElemType;

typedef struct node{

ElemType data; //指向结点元素的值

struct node *next; //后继

}Node,*Polyn; //结点类型,指针类型

typedef struct{

Node *head;

Node *tail;

}List;

Status MakeNode(Polyn &p,ElemType e); //分配由p 指向的数据

元素为e 、后继为“空”的结点

Status InitList(List &L); //构造链表

Status DestroyList(List &L); //销毁线性表

void Insert(List &L,Polyn s); //将s 指向的结点插

入L 的最后一个结点

void Insbefore(Polyn p,Polyn q);

Status CreatPolyn(List &polynomial,int m); //创建一

个一元多项式polynomial ,并输入m 项的指数和系数

void PrintPolyn(List L); //打印输出一元多

项式

void AlterPoly(List L); //减法

void AddPolyn(List L1,List L2,List &L3); //

多项式加法

3、Polyn.cpp

#include"Polynt.h"

Status MakeNode(Polyn &p,ElemType e)

{//分配由p 指向的数据元素为e 、后继为“空”的结点

p=(Polyn)malloc(sizeof(Node));

p->data.coef=e.coef;

p->data.expn=e.expn;

p->next=NULL;

return OK;

}

Status InitList(List &L)

{//初始化链表

ElemType e;

Polyn p;

e.coef = ' ';

e.expn = ' ';

MakeNode(p,e);

L.head = p;

L.tail=p;

return OK;

}

Status DestroyList(List &L)

{//销毁链表

Polyn p,q;

if(L.head==L.tail) {free(L.head);L.head=L.tail=NULL;return OK;}

p=L.head->next;

while(!p){

q=p->next;

free(p);

p=q;}

L.head=L.tail=NULL;

return OK;

}

void Insert(List &L,Polyn s)

{

if(L.head->next ==NULL)

{

L.head->next =s;

s->next =NULL;

L.tail = s;

}

else{

if(L.head->next!=NULL && s->data.expn>L.head->next->data.expn)

{s->next=L.head->next;L.head->next=s; return;}

if(L.tail->data.expn>s->data.expn)

{L.tail->next=s; L.tail=s;return;}

for (Polyn p = L.head->next; p!=NULL;p = p->next )

{

if (s->data.expn== p->data.expn)

{

p->data.coef+=s->data.coef;

free(s);

return;

}

else if ( p->data.expn>s->data.expn &&

p->next->data.expndata.expn)

{

s->next=p->next;p->next=s;

return;

}

}

}

}

Status CreatPolyn(List &polynomial,int m)

{//创建一个一元多项式polynomial ,并输入m 项的指数和系数

ElemType e;

Polyn p;

for(int i=0;i

{

scanf("%g,%d",&e.coef,&e.expn);

MakeNode(p,e);

Insert(polynomial,p);}

polynomial.tail=p;

return OK;

}

void PrintPolyn(List L)

{

Polyn p;

if(L.head==L.tail)

printf("0");

else

{

p=L.head->next;

while(p!=NULL)

{

if(p==L.head->next)

{

if(p->data.coef>0)

{

if(p->data.expn!=0)

{printf("%gx^%d",p->data.coef,p->data.expn);}

else{printf("%g",p->data.coef);}

}

else if(p->data.coef

{

if(p->data.expn!=0)

{printf("%gx^%d",p->data.coef,p->data.expn);}

else{printf("%g",p->data.coef);}

}

else

{printf(" ");}

p=p->next;

}

else if(p!=L.head->next && p!=NULL)

{

if(p->data.coef>0)

{

if(p->data.expn!=0)

{printf("+%gx^%d",p->data.coef,p->data.expn);}

else{printf("+%g",p->data.coef);}

}

else if(p->data.coef

{

if(p->data.expn!=0)

{printf("%gx^%d",p->data.coef,p->data.expn);}

else{printf("%g",p->data.coef);}

}

else

{printf(" ");}

p=p->next;

}

else

return;

}

}

}

void AlterPoly(List L)

{

for(Polyn p=L.head->next;p!=NULL;p=p->next)

p->data.coef*=-1;

}

void AddPolyn(List L1,List L2,List &L3)

{

Polyn p1,p2,p3;

p1=L1.head->next;

p2=L2.head->next;

while(p1!=NULL && p2!=NULL)

{

if(p1->data.expn>p2->data.expn)

{

MakeNode(p3,p1->data);

Insert(L3,p3);

p1=p1->next;

}

else if(p1->data.expndata.expn)

{

MakeNode(p3,p2->data);

Insert(L3,p3);

p2=p2->next;

}

else if(p1->data.expn==p2->data.expn)

{

MakeNode(p3,p2->data);

p3->data.coef=p1->data.coef+p2->data.coef;

p3->data.expn=p1->data.expn;

Insert(L3,p3);

p1=p1->next;p2=p2->next;

}

}

if(p1==NULL && p2!=NULL)

{

while(p2!=NULL){

MakeNode(p3,p2->data);

Insert(L3,p3);

p2=p2->next;

}

}

else if(p2==NULL && p1!=NULL)

{

while(p1!=NULL){

MakeNode(p3,p1->data);

Insert(L3,p3);

p1=p1->next;

}

}

}

4、main.cpp

#include"Polynt.h"

#include

#include

void main()

{

system("cls");

printf("*********************************************************

***\n");

printf(" 欢迎使用一元稀疏多项式计算 \n");

printf("*********************************************************

***\n");

printf("1、创建多项式A 2、创建多项式B 3、相加 4、相减 5、退出

\n");

List polynomialA,polynomialB,polynomialC;

InitList(polynomialA); InitList(polynomialB); InitList(polynomialC);

char poly;

int m;int n=1;

for(;;)

{

printf("请输入指令:");

poly=getchar();

switch(poly)

{

case'1': //创建多项式A printf("请输入多项式A 的项数:");

scanf("%d",&m);

printf("\n请 输 入 多 项 式 A:");

CreatPolyn(polynomialA,m);

printf("\n多项式A 是:");

PrintPolyn(polynomialA);

printf("\n");

break;

case'2': //创建多项式B printf("请输入多项式B 的项数:");

scanf("%d",&m);

printf("\n请 输 入 多 项 式 B:");

CreatPolyn(polynomialB,m);

printf("\n多项式B 是:");

PrintPolyn(polynomialB);

printf("\n");

break;

case'3': //加法

printf("结果是:");

AddPolyn(polynomialA,polynomialB,polynomialC);

PrintPolyn(polynomialC);

printf("\n");

break;

case'4': //减法

printf("结果是:");

AlterPoly(polynomialB);

DestroyList(polynomialC);

InitList(polynomialC);

AddPolyn(polynomialA,polynomialB,polynomialC);

PrintPolyn(polynomialC);

} } printf("\n"); break; case'5': DestroyList(polynomialA); //退出 DestroyList(polynomialB); DestroyList(polynomialC); return; } poly=getchar(); if(poly==5) break;


相关内容

  • 一元多项式的加法.减法.乘法的实现
  • 数学与计算机学院 课程设计说明书 课 程 名 称: 数据结构-课程设计 课 程 代 码: 8404181 题 目一元多项式的加法.减法.乘法的实现 年级/专业/班: 2009/软件工程/4 学 生 姓 名: 学 号: 开 始 时 间: 2011 年 6 月 20 日 完 成 时 间: 2011 年 ...

  • [数据结构课程设计]课程设计方案
  • <算法与数据结构课程设计>方案 Course Design of Data Structure 适用专业:计算机科学与技术专业 本科 课程代码:B08233004 一.课程设计的性质和目的 软件设计能力培养对学生是很重要.通过数据结构的学习,使学生对软件编程能力有一定的提高.数据结构学习 ...

  • 一元稀疏多项式加法
  • 实习一 线性表及其应用 题目:一元稀疏多项式加法 一.需求分析: 设计一个实现一元稀疏多项式相加运算的演示程序. 基本要求:(1)输入并建立两个多项式:(2)多项式a 与b 相加,建立和多项式c :(3)输出多项式a,b,c .输出格式:比如多项式a 为:A(x)=c1xe 1+ c2xe 2+-+ ...

  • 数学建模论文格式
  • 承 诺 书 我们仔细阅读了中国大学生数学建模竞赛的竞赛规则. 我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话.电子邮件.网 上咨询等)与队外的任何人(包括指导教师)研究.讨论与赛题有关的问题. 我们知道,抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其他公开的 资料(包括网上查到 ...

  • 课程设计题目A
  • 数据结构课程设计题目 (A) 1. 文章编辑(限1 人完成) 功能:输入一页文字,程序可以统计出文字.数字.空格的个数. 静态存储一页文章,每行最多不超过80个字符,共N行:要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数:(2)统计某一字符串在文章中出现的次数,并输出该次数:(3)删除某 ...

  • matlab常用命令汇总111111
  • 一.常用对象操作:除了一般windows窗口的常用功能键外. 1.!dir 可以查看当前工作目录的文件. !dir& 可以在dos状态下查看. 2.who 可以查看当前工作空间变量名, whos 可以查看变量名细节. 3.功能键: 功能键 快捷键 说明 方向上键 Ctrl+P 返回前一行输入 ...

  • 数据结构实验报告 实验一题目3 一元多项式
  • 数据结构实验报告 实验名称: 实验一 题目3 一元多项式 学生姓名: 许虎 班 级: 信通20 班内序号: 10 学 号: 2011210578 日 期: 2012年11月2日 1. 实验要求 实验目的: 利用线性表实现一个一元多项式Polynomial f (x ) = a 0 + a 1x + ...

  • 设计题目要求举例
  • 数据结构课程设计题目 地图着色 马踏棋盘 栈的实现 八皇后算法 车厢调度 公园导游图 通讯录实现 同学录实现 导游系统实现 最小生成树实现 统计成绩系统 利用学到的编程知识和编程技巧,通过布置具有一定难度的程序设计题目,让学生自己到图书馆查阅资料或网上咨询独立完成程序的编写,并能运用学过的技巧独立上 ...

  • 初中数学教学大纲
  • 初中数学教学大纲 初中几何是在小学数学中几何初步知识的基础上,使学生进一步学习基本的平面几何图形知 识,向他们直观地介绍一些空间几何图形知识.初中几何将逻辑性与直观性相结合,通过各种图形的概念.性质.作(画)图及运算等方面的教学,发展学生的思维 能力.空间观念和运算能力,并使他们初步获得研究几何图形 ...