多项式相加、相乘 程序设计类课程报告 本文关键词:多项式,相乘,相加,程序设计,课程
多项式相加、相乘 程序设计类课程报告 本文简介:福建农林大学计算机与信息学院(程序设计类课程)实验报告课程名称:姓名:系:专业:年级:学号:指导教师:职称:福建农林大学计算机与信息学院实验报告系:计算机专业:计算机科学与技术年级:姓名:学号:实验室号____计算机号实验一线性表及其应用(多项式相加、相乘)一、实验目的和要求1、熟悉tc的运行环境,
多项式相加、相乘 程序设计类课程报告 本文内容:
福建农林大学计算机与信息学院
(程序设计类课程)
实验报告
课程名称:
姓
名:
系:
专
业:
年
级:
学
号:
指导教师:
职
称:
福建农林大学计算机与信息学院实验报告
系:
计算机
专业:
计算机科学与技术
年级:
姓名:
学号:
实验室号____
计算机号
实验一
线性表及其应用(多项式相加、相乘)
一、
实验目的和要求
1、
熟悉tc的运行环境,并可以熟练的使用tc;
2、掌握链表存储的方法以及基本操作;
3、掌握内存的动态分配和释放方法;
4、熟悉C语言程序的基本格式与规范。
二、
实验内容和原理
1、实验内容:
设计一个一元多项式的简单计算程序,其基本功能有:(1)输入并建立多项式;(2)输出多项式;(3)多项式的相加减;(4)多项式的相乘。利用单链表实现。
2、实验原理:
将两多项式存入链表lianbiao1、lianbiao2,用pointer1扫描lianbiao1,pointer2扫描lianbiao2,结果保存在lianbiao3中(用pointer3来创建lianbiao3)
三、
实验环境
硬件:
(1)学生用微机
(2)多媒体实验教室
(3)局域网环境
软件:
(1)Windows
XP中文操作系统
(2)Turbo
C
3.0
四、
算法描述及实验步骤
1、描述
1.
定义创建链表的函数,然后创建三个链表,一个用于存放结果。
2.
定义多项式相加的函数实现多项式的相加功能,定义多项式的相乘功能。
3.
定义打印链表和释放链表的函数。
4.
最后在主函数里面调用这些函数,实现多项式的相加和相乘。
例子:A(X)=3X+7X6-9X9B(X)=2X-3+7-3X+8X3+X5
(1)执行加法操作,输出“lianbiao1+lianbiao2:(2,-3)
(7,0)
(8,5)
(1,5)
(7,6)
(-9,9)”
(2)执行乘法操作,输出“lianbiao1*lianbiao2:(6,-2)
(21,1)
(-9,2)
(14,3)
(55,6)
(3,6)
(-21,7)
(-63,9)
(27,10)
(56,11)
(7,11)
(-72,14)
(-9,14)”
2、框图
3、代码(注释)
#include
“stdio.h“/*
输入输出函数的头文件/
#include
“alloc.h“/*
alloc.h是动态分配内存空间头文件/
typedef
struct
node/*
定义节点,包含两个数据域(c和e)和一个指针域(*next)*/
{
int
c,e;/*c是指多项式的系数,e是项的指数*/
struct
nodenext;/*
定义next为指向下一个结点的指针*/
}Pn;/*定义Pn类型*/
Pncreate()/*创建链表*/
{
Pnpointer,*lianbiao;
int
n;
lianbiao=malloc(sizeof(Pn));/*用malloc动态分配函数给链表分配内存空间*/
printf(“n:“);/*提示用户输入多项式的项数*/
scanf(“%d“,/*接收用户输入的多项式的项数*/
pointer=lianbiao;
while(n)/*对n进行判断,当n不为零时执行while循环语句*/
{
pointer->next=malloc(sizeof(Pn));/*为链表新的节点申请空间*/
pointer=pointer->next;/*将pointer下移*/
printf(“c
e:“);
scanf(“%d
%d“,/*将系数c,指数e存入链表中的新节点*/
n--;/*没当输入一项时,项数n就减一*/
}
pointer->next=NULL;/*如果pointer指向的下一个结点的指针域为空,说明链表已经创建好了*/
return
lianbiao;
}
void
OUT(Pnlianbiao)/*打印输出链表*/
{
Pnpointer=lianbiao->next;
while(pointer)/*打印出当前的结点系数c和指数e,直到链表为空*/
{
printf(“(%d,%d)
“,pointer->c,pointer->e);/*打印出多项式系数c和指数e*/
pointer=pointer->next;/*打印出当前结点后,将指针移到下一个节点*/
}
printf(“/n“);/*用/n换行*/
}
void
Free(Pnlianbiao)/*释放链表空间*/
{
Pnpointer=lianbiao;/*将pointer指向头节点*/
while(pointer)/*释放链表中的结点,直到pointer链表为空时推出循体*/
{
lianbiao=lianbiao->next;/*删除当前节点*/
free(pointer);/*释放当前结点的空间*/
pointer=lianbiao;/*
当pointer指向头结点指针时结束循环*/
}
}
Pnadd(Pnlianbiao1,Pnlianbiao2)/*多项式相加*/
{
Pnlianbiao3,*pointer3,*pointer1=lianbiao1->next,*pointer2=lianbiao2->next;/*建立新的链表lianbiao3,用于存放lianbiao1与lianbiao2相加后的结果*/
int
c,e;/*这里的c为多项式相加后的系数,而e为结点相加后的指数*/
pointer3=lianbiao3=malloc(sizeof(Pn));/*用malloc为lianbiao3申请空间*/
lianbiao3->next=NULL;
while(pointer1||pointer2)
/*当pointer1或pointer2不为空时,分成3种情况*/
{
if(pointer1/*将pointer1当前所指结点的系数c赋值给c*/
e=pointer1->e;/*将pointer1当前所指结点的系数e赋值给e*/
pointer1=pointer1->next;/*将pointer1移到下一结点*/
}
else
if(pointer2
e=pointer2->e;
pointer2=pointer2->next;
}
else
/*第三种是当pointer1、pointer2都不为空且pointer1的指数e等于pointer2的指数e时*/
{
c=pointer1->c+pointer2->c;/*将pointer1与pointer2所指的系数相加*/
e=pointer1->e;
pointer1=pointer1->next;/*将pointer1下移*/
pointer2=pointer2->next;/*将pointer2下移*/
}
if(c)
{
pointer3->next=malloc(sizeof(Pn));/*申请新结点的空间*/
pointer3=pointer3->next;/*pointer3下移*/
pointer3->c=c;/*把系数c放入新结点*/
pointer3->e=e;/*把指数e放入新结点*/
}
}
pointer3->next=NULL;/*当所指的指针为NULL时,链表结束*/
return
lianbiao3;/*
返回两个多项式相加的结果lianbiao3/
}
Pnmx1(Pnpointer1,Pnlianbiao2)
/*多项式相乘*/
{
Pnlianbiao3,*pointer3,*pointer2=lianbiao2->next;/*定义链表lianbiao3/
pointer3=lianbiao3=malloc(sizeof(Pn));/*为lianbiao3申请空间,并将pointer3指向lianbiao3*/
lianbiao3->next=NULL;
while(pointer2)/*
当pointer2不为空时,
执行while循环*/
{
pointer3->next=malloc(sizeof(Pn));/*为新创结点申请空间*/
pointer3=pointer3->next;/*将pointer3指向新结点*/
pointer3->c=pointer1->c*pointer2->c;/*将pointer1的系数乘以pointer2->c*/
pointer3->e=pointer1->e+pointer2->e;/*将pointer1的指数乘以pointer2->e*/
pointer2=pointer2->next;/*pointer2下移*/
}
pointer3->next=NULL;
return
lianbiao3;/*将结果lianbiao3返回*/
}
Pnmxm(Pnlianbiao1,Pnlianbiao2)/*多项式相乘*/
{
Pnlianbiao3,*pointer1=lianbiao1->next,*htemp;
lianbiao3=malloc(sizeof(Pn));
lianbiao3->next=NULL;
while(pointer1)/*当pointer1不为空,执行while循环*/
{
htemp=mx1(pointer1,lianbiao2);/*将相乘结果放到链表htemp*/
lianbiao3=add(lianbiao3,htemp);/*将htemp中的多项式加上lianbiao3中的多项式*/
pointer1=pointer1->next;
Free(htemp);/*释放链表htemp*/
}
return
lianbiao3;/*返回结果lianbiao3/
}
main()
{
Pnlianbiao1,*lianbiao2,*lianbiao3;
/*定义三个链表lianbiao1,lianbiao2,lianbiao3*/
clrscr();
printf(“Create
lianbiao1/n“);
lianbiao1=create();
/*创建链表lianbiao1*/
printf(“/nPrintf
lianbiao1/n“);
OUT(lianbiao1);/*打印出链表lianbiao1*/
printf(“/nCreate
lianbiao2/n“);
lianbiao2=create();/*创建链表lianbiao2*/
printf(“/nPrintf
lianbiao2/n“);
OUT(lianbiao2);
/*打印出链表lianbiao2*/
printf(“/nlianbiao1+lianbiao2:“);
lianbiao3=add(lianbiao1,lianbiao2);/*把lianbiao1和lianbiao2相加的结果赋给lianbiao3*/
OUT(lianbiao3);/*打印出lianbiao3*/
Free(lianbiao3);/*释放lianbiao3/
printf(“/nlianbiao1*lianbiao2:“);
lianbiao3=mxm(lianbiao1,lianbiao2);/*把lianbiao1和lianbiao2相乘的结果赋给lianbiao3*/
OUT(lianbiao3);/*输出lianbiao3*/
Free(lianbiao1);/*释放lianbiao1*/
Free(lianbiao2);
Free(lianbiao3);
getch();
}
五、
调试过程
#include
“malloc.h“语句出错,
多了一个m,后来改为#include
“alloc.h“,
就编译通过了。
六、
实验结果
测试数据(1):
取两项多项式为:
9+3x
取一项多项式为:
2X-3
实验结果(1):
这两个项式相加结果为:lianbiao1+lianbiao2:
2X-3+9+3X
这两个项式相乘结果为:lianbiao1*lianbiao2:
18X-3+6X-2
实验截图(1):
测试数据(2):
取三项多项式为:(3,1)
(7,6)
(-9,9)
取五项多项式为:(2,-3)
(7,0)
(-3,1)
(8,5)
(1,5)
实验结果(2):
这两个项式相加:lianbiao1+lianbiao2:(2,-3)(7,0)
(8,5)
(1,5)
(7,6)(-9,9)
这两个项式相乘:lianbiao1*lianbiao2:(6,-2)
(21,1)
(-9,2)
(14,3)
(55,6)
(3,6)
(-21,7)
(-63,9)
(27,10)
(56,11)
(7,11)
(-72,14)
(-9,14)
实验截图(2):
七、
通过这次实验我熟悉tc的运行环境,并可以熟练的使用tc,掌握链表存储的方法以及基本操作、内存的动态分配和释放方法并且熟悉C语言程序的基本格式与规范。
附录:
参考文献
[1]宁正元、王秀娟《算法与数据结构》,
北京:清华大学出版社,
2006;
[2]严蔚敏、佩娟等《数据结构》,北京:国防工业出版社,
1981;
[3]宁正元《数据结构》-用C语言描述,北京:中国水利水电出版社,2000
[4]中国计算机科学与技术学科教程2002研究组《中国计算机科学与技术学科教程2002》,北京:清华大学出版社,2002;
[5]陈小平《数据结构》,南京:南京大学出版社,1994。
篇2:多项式运算实训报告
多项式运算实训报告 本文关键词:多项式,运算,实训,报告
多项式运算实训报告 本文简介:信息工程学院数据结构实训报告题目:多项式基本运算学号:14090323姓名:卫哲君班级:强化3班目录一、目的概述。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3二、实验(设计)仪器设备和材料清单。。。。。。。。。。。。。。。。。。3三、项目分析和设计。。。。。。。。
多项式运算实训报告 本文内容:
信
息
工
程
学
院
数据结构实训报告
题目:多项式基本运算
学号:14090323
姓名:卫哲君
班级:强化3班
目
录
一、
目的概述。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3
二、
实验(设计)仪器设备和材料清单。。。。。。。。。。。。。。。。。。3
三、
项目分析和设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3
四、
项目关键代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4
五、
项目调试和运行。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。10
六、
实训设计的心得体会。。。。。。。。。。。。。。。。。。。。。。。。。。。。。12
数据结构实训设计报告
一、
目的概述
我这次实训的项目主要是多项式基本运算系统,多项式基本运算系统主要实现的是多项式的相加相减相乘和赋值计算。
这次实训的项目主要通过C语言来实现程序的运行,主要通过C语言中的函数调用和链表来做程序,还要用到许多小的知识点,例如:用冒泡法实现排序;scanf、printf语句;while()语句实现循环;if……else语句实现选择……等等。
二、实验(设计)仪器设备和材料清单
1.硬件:PC机
2.软件:turboc
2.0,visula
c++
6.0
三、项目分析和设计
这个项目的程序可分为几个板块来做,每个板块有每个板块的作用,通过不同程序的不同作用相互调用即可实现整个程序的运行,这个项目程序主要可以分为以下几个板块:
1、定义头文件:
运用#include,#include头文件
2、定义链表:
运用typedef
struct
NODE
{多项式项数和系数和指数信息……}变量名表列;
3、对调用函数进行声明:
根据所写程序对有些函数进行声明,例如:
int
Initpolyn(polynomialP);在程序中实现的是构造一个多项式链表P。
4、主函数:
Void
main()为主函数,在主函数中通过while语句和
switch……case语句或者printf语句进行选择和函数调用。
Void
main()
{
while()
……
{switch()
……
}
}
5、菜单函数:
主要用printf语句输出菜单函数,并且还通过主函数调用菜单函数实现对多项式操作的选择。
6、输入多项式的信息:
定义函数为int
orderinsertpolyn(polynomialP,Nodee)
Nodee为链表指针,在此函数中,通过指针的移动实现多项式信息的输入。
7、输出多项式:
定义函数为int
outputpolyn(polynomial
P)
主要运用printf语句输出多项式的信息,并用while语句输入系数指数信息。
9、插入信息并排序:
定义函数为int
orderinsertpolyn(polynomialP,Nodee)
在此函数中,利用指针传递进行输入信息,再调用排序函数指数从小到大排列
再保存链表,最后还要返回一个值到主函数main().
10、多项式相加相间减
思想:一个多项式存一个链表相加时指数相同的系数相加相减结果存放在第一个链表中,实现相加函数:int
addpolyn(polynomialpa,polynomialpb)实现相减函数:int
subpolyn(polynomialpa,polynomialpb)
10、多项式相乘
思想:采用两个循环使每个项都两两相乘
函数:int
multipolyn(polynomial
pa,polynomial
pb,polynomialpc)
这个程序大体的设计便是如此,它包含了我们学过的许多知识,运用了许多重要的内容,总体分析即是如此。
四、项目关键代码
#include
#include
#define
OVERFLOW
-1
#define
ok
1
typedef
struct
Node
{
float
coef;
int
exp;
struct
Nodenext;
}Node,*polynomial;
polynomial
P,pa,pb,pc;
Nodep,*q,*e,*s;
int
Initpolyn(polynomialP)
{
(*P)
=(Node*)malloc(sizeof(Node));
if(!(*P))
return
OVERFLOW;
(*P)->next=NULL;
return
ok;
}//构造一个多项式链表P
int
orderinsertpolyn(polynomialP,Nodee)
{
float
sum;
if(!(*P))
return
OVERFLOW;
p=(*P);
q=(*P)->next;
while(q)
{
if(q->expexp)
{
p=q;
q=q->next;
}
else
if(q->exp==e->exp)
{
sum=q->coef+e->coef;
if(sum==0)
{
p->next=q->next;
free(q);
q=p->next;
}
else
q->coef=sum;
break;
}
else
{
p->next=e;
e->next=q;
break;
}
}
if(q==NULL)
{
p->next=e;
e->next=NULL;}
return
ok;
}//在多项式链表P中顺序插入结点e,插入后结点按指数从小到大排列
int
createpolyn(polynomialP,int
m)
{
int
i,b;
float
a;
Initpolyn(P);
if(!(*P))
return
OVERFLOW;
(*P)->coef=0.0;
(*P)->exp=-1;
printf(“请输入插入结点e的系数和指数:“);
for(i=1;icoef=a;
s->exp=b;
orderinsertpolyn(P,s);
}
return
ok;
}//建立一个m项的有序多项式链表P
int
outputpolyn(polynomial
P)
{
if(!P)
return
OVERFLOW;
if(!P->next)
{
printf(“多项式链表P为空/n“);
return
0;
}
q=P->next;
printf(“多项式链表P=“);
while(q->next!=NULL)
{
printf(“(%f,%d)+“,q->coef,q->exp);
q=q->next;
}
printf(“(%f,%d)/n“,q->coef,q->exp);
return
ok;
}//输出一个多项式链表P
int
addpolyn(polynomialpa,polynomialpb)
{
float
sum;
Nodeqa,*qb,*ra;
if(!pa||!pb)
return
OVERFLOW;
qa=(*pa)->next;
qb=(*pb)->next;
ra=(*pa);
while(qa
if(!sum)
{
ra->next=qa->next;
(*pb)->next=qb->next;
free(qa);
free(qb);
qa=ra->next;qb=(*pb)->next;
}
else
{
qa->coef=sum;
ra=qa;
qa=ra->next;
(*pb)->next=qb->next;
free(qb);
qb=(*pb)->next;
}
}
else
if(qa->expexp)
{
ra=qa;
qa=qa->next;
}
else
{
(*pb)->next=qb->next;
qb->next=qa;
ra->next=qb;
ra=qb;
qb=(*pb)->next;
}
}
while(qa)
break;
while(qb)
{
ra->next=qb;
break;
}
free(*pb);
return
ok;
}//实现多项式链表pa,pb相加,结果存放在pa中
int
subpolyn(polynomialpa,polynomialpb)
{
float
sub;
Nodeqa,*qb,*ra;
if(!pa||!pb)
return
OVERFLOW;
qa=(*pa)->next;
qb=(*pb)->next;
ra=(*pa);
while(qa
if(sub==0)
{
ra->next=qa->next;
(*pb)->next=qb->next;
free(qa);
free(qb);
qa=ra->next;qb=(*pb)->next;
}
else
{
qa->coef=sub;
ra=qa;
qa=ra->next;
(*pb)->next=qb->next;
free(qb);
qb=(*pb)->next;
}
}
else
if(qa->expexp)
{
ra=qa;
qa=qa->next;
}
else
{
(*pb)->next=qb->next;
qb->next=qa;
ra->next=qb;
ra=qb;
qa=ra->next;
qb->coef=-qb->coef;
qb=(*pb)->next;
}
}
while(qa)
break;
while(qb)
{
ra->next=qb;qb->coef=-qb->coef;qb=qb->next;
}
free(*pb);
return
ok;
}//实现多项式链表pa减去pb,结果存放在pa中
float
qiuzhipolyn(polynomial
P,float
x)
{
int
i;
float
t,sum=0.;
if(!P)
return
OVERFLOW;
q=P->next;
while(q)
{
t=1.0;
for(i=0;iexp;i++)
t=t*x;
sum=sum+(q->coef)*t;
q=q->next;}
return
sum;
}//实现求多项式链表P的函数值,结果放在P中
int
multipolyn(polynomial
pa,polynomial
pb,polynomialpc)
{
Nodeqa,*qb;
Initpolyn(pc);
if(!pa||!pb)
return
OVERFLOW;
if(!(*pc))
return
OVERFLOW;
qa=pa->next;
qb=pb->next;
while(qa)
{
while(qb)
{
s=(Node*)malloc(sizeof(Node));
s->exp=qa->exp+qb->exp;
s->coef=qa->coef*qb->coef;
orderinsertpolyn(pc,s);
qb=qb->next;
}
qa=qa->next;
qb=pb->next;
}
return
ok;
}//实现多项式链表pa,pb相乘,结果存放在pc中
void
main()
{
int
k,m,n;
float
x,y;
printf(“************************************************************/n“);
printf(“----程序设置说明----/n“);
printf(“----1:实现多项式链表相加----/n“);
printf(“----2:实现多项式链表相减----/n“);
printf(“----3:实现求多项式链表的函数值----/n“);
printf(“----4:实现多项式链表相乘----/n“);
printf(“************************************************************/n“);
printf(“/n“);
do
{
printf(“/n“);
printf(“请输入你所选择的操作:“);
scanf(“%d“,switch(k)
{
case
0:
break;
case
1:
printf(“----1:实现多项式链表相加----/n“);
printf(“请输入插入结点个数:“);
scanf(“%d“,createpolyn(
outputpolyn(pa);
printf(“请输入插入结点个数:“);
scanf(“%d“,createpolyn(
outputpolyn(pb);
printf(“相加后结果为:“);
addpolyn(
outputpolyn(pa);
break;
case
2:
printf(“----2:实现多项式链表相减----/n“);
printf(“请输入插入结点个数:“);
scanf(“%d“,createpolyn(
outputpolyn(pa);
printf(“请输入插入结点个数:“);
scanf(“%d“,createpolyn(
outputpolyn(pb);
printf(“相减后结果为:“);
subpolyn(
outputpolyn(pa);
break;
case
3:
printf(“----3:实现求多项式链表的函数值----/n“);
printf(“请输入插入结点个数:“);
scanf(“%d“,createpolyn(
outputpolyn(P);
printf(“请输入变量x的值:“);
scanf(“%f“,y=qiuzhipolyn(P,x);
printf(“多项式链表P的值为:y=%f/n“,y);
break;
case
4:
printf(“----4:实现多项式链表相乘----/n“);
printf(“请输入插入结点个数:“);
scanf(“%d“,createpolyn(
outputpolyn(pa);
printf(“请输入插入结点个数:“);
scanf(“%d“,createpolyn(
outputpolyn(pb);
printf(“相乘后结果为:“);
multipolyn(pa,pb,outputpolyn(pc);
break;
default:
printf(“----没有你所需要进行的操作!----/n“);
}
}while(k);
}
五、项目调试和运行(界面)
1、输入1实现多项式的信息输入
2、输入2实现多项式的信息输出
3、输入3实现根据多项式指数从小到大进行排序
4、输出多项式相加的值
5、多项式相减
结果为
6、多项式相乘
结果为
7、多项式赋值运算
六、实训设计的心得体会
在为期将近十天的数据结构实训过程中,我从中学到很多,我受益匪浅,感受很深,让我从中了解到C语言程序编程的奥妙,学会了许多关于编程的代码,我在这次编写程序中,虽然有点累,但是我从中也得到了乐趣,我觉得编写程序越来越有趣。
但是在编写程序的过程中并不是一帆风顺、顺顺利利的,一开始编写的时候并不知道该怎么着手去编写,很茫然,但是后来经过老师的提点以及提示,我能够去试着编写一个一个小片段,当我把这些小程序拼到一起变成大程序时,我很高兴,因为我毕竟做出来一些内容了。当我将这些程序利用VC进行编译、链接的时候,程序出现了许多错误,其中程序中的错误有很多种,比如有语法错误,逻辑错误等。语法错误例如:(1)系数和指数之间用空格隔开否则无法正常显示运行的结果;
(2)语句写颠倒;
(3)函数声明与函数定义不一致,在程序中我声明函数时,将参数顺序不匹配;(4)函数实参与形参的类型不一致,在这次的实训中我知道了要做一个程序,首先要知道程序的算法,在了解算法的基础上要知道怎样运用算法,进一步说是怎样运用算法写程序,不管是大程序还是小程序都要用到算法。
这次的编写程序又让我感受到学习编写程序可以锻炼缜密的思维,在平时我们只编写一些小程序,句段比较少,一些错误都很容易被检查出来,但是这次实训项目的程序语段比较多,难以检查,需要很多耐心。
实训不仅是检查一个人知识掌握了多少,其实更重要的实检测你的实践能力,以及看你是否细心、是否有缜密的思维,所以,在这方面我们要加强锻炼,磨练自己,使自己有更高的提
参考文献:
www.jsfw8.com
12