完整word版一元多项式计算器报告C语言编程.docx
《完整word版一元多项式计算器报告C语言编程.docx》由会员分享,可在线阅读,更多相关《完整word版一元多项式计算器报告C语言编程.docx(10页珍藏版)》请在冰豆网上搜索。
完整word版一元多项式计算器报告C语言编程
实验报告
题目:
编制一个一元多项式基本运算的程序
姓名:
学号:
PB110130
一、需求分析
1.在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。
由稀疏多项式的特点,故采用链式存储结构,可以不会带来浪费存储空间。
2.程序中单链表存储,根据链表的指数域,对链表进行升序排序,可给运算带来方便。
3.程序设计是在VC6.0环境下设计的的。
4.程序执行的命令为(程序主界面):
二、概要设计
抽象数据类型一元多项式的定义如下:
1.LNode*MakeNode(doublecoef,intexp)通过传入指数和系数创建一个节点,返回该节点的地址。
2.voidInitList(LinkList&L)初始化,带头节点
3.voidPrintPolyn(LinkListL)传入链表的指针,打印该链表
4.LinkListCreatPolyn(void)//输入m项的系数和指数,建立表示一元多项式的有序链表L
5.doubleSumPolyn(LinkListL,doublex)传入链表的指针及x值,求多项式的值。
6.voidDestroyPolyn(LinkList&L)销毁多项式,去掉头节点
7.voidClearPolyn(LinkList&L)清空多项式,保留节点
8.voidCopyPolyn(LinkListLa,LinkList&Lb)将La位置的多项式复制到Lb位置
9.voidAddPolyn(LinkListL,LinkListJ,LinkList&K)将a和b多项式相加存到c
10.voidMultiplyPolyn(LinkListL,LinkListJ,LinkList&K)将a和b相减存到c
11.voidMultiplyPolyn(LinkListL,LinkListJ,LinkList&K)将a和b多项式相乘存到c
12。
voidOrderInsert(LinkListL,LNode*r){//根据链表的expn指数域,对链表进行升序插入。
13。
voidDifferentialPolyn(LinkListL,LinkList&L2)对L1求导存到L2
14.voidIntegralPolyn(LinkListL,LinkList&L2)对L1积分存到L2
2。
主程序:
voidmain()
{初始化;
While
(1){
Switch(){
选择命令;
处理命令;
}
}
}
三、详细设计
1.元素类型、结点类型和指针类型
typedefstructPolyNode{
intexpn;//指数
doublecoef;//系数
structPolyNode*next;
}LNode,*LinkList;
2.几个基本操作的函数
1.
LNode*MakeNode(doublecoef,intexpn)//制造节点
{
LNode*p;
p=(LNode*)malloc(sizeof(LNode));
p—〉coef=coef;
p—〉expn=expn;
p->next=NULL;
returnp;
}
2。
voidOrderInsert(LinkListL,LNode*r){//根据链表的expn指数域,对链表进行升序插入
if(!
L)
printf("error”);
LNode*p,*q;
p=L;
while(p—>next&&p->next—>expn〈r—>expn)p=p->next;
if(p—>next&&p-〉next-〉expn==r-〉expn)
{
p—〉next—>coef+=r—〉coef;
if(p-〉next—>coef==0){
q=p—〉next;
p—>next=q->next;
free(q);
}
free(r);
}
else{
r—>next=p—〉next;
p—〉next=r;
}
}
3。
voidAddPolyn(LinkListL,LinkListJ,LinkList&K){//多项式相加
if(!
L||!
J){
printf("error\n”);
return;}
LNode*p,*q,*m;
p=L->next;
q=J-〉next;
InitList(K);
while(p)
{
m=MakeNode(p—>coef,p-〉expn);
OrderInsert(K,m);
p=p—〉next;
}
while(q){
m=MakeNode(q->coef,q-〉expn);
OrderInsert(K,m);
q=q—>next;
}
}
4.
voidMultiplyPolyn(LinkListL,LinkListJ,LinkList&K){//多项式相乘
if(!
L||!
J){
printf(”error");
return;
}
LNode*p,*q,*m;
p=L->next;
InitList(K);
while(p){
q=J—>next;
while(q){
m=MakeNode(p—>coef*q—>coef,p—〉expn+q->expn);
OrderInsert(K,m);
q=q-〉next;
}
p=p—〉next;
}
}
5.
LinkListCreatPolyn(void)//输入m项的系数和指数,建立表示一元多项式的有序链表L
{
LNode*p;
LinkListhead;
doublec;
inte;
InitList(head);
printf("输入系数、指数,系数为0时结束”);
while
(1){
scanf(”%lf”,&c);
if(c==0)break;
scanf(”%d",&e);
p=MakeNode(c,e);
OrderInsert(head,p);
}
returnhead;
}
6。
voidDifferentialPolyn(LinkListL,LinkList&L2){//求导
LNode*p,*r;
if(!
L)return;
InitList(L2);
r=L2;
p=L—〉next;
while(p){
if(p—>expn==0)
r—〉next=MakeNode(0,0);
else
r—>next=MakeNode(p—>coef*p-〉expn,p—〉expn-1);
r=r—〉next;
p=p->next;
}
r->next=NULL;
}
3.主函数
#defineN12
voidmain(){
LinkListP[N]={NULL};
intmenu,i,j,l;
doublek,sum;
while
(1)
{
printf(”\n”);
printf("多项式计算器\n”);
printf("======================================\n");
printf("新建—-1打印——2复制-—3\n");
printf(”求值-—4相加--5相减——6\n”);
printf(”微分-—7销毁-—8清空——9\n”);
printf(”积分-—10相乘-—11退出-—0\n");
printf(”======================================\n");
printf("请选择:
\n");
scanf(”%d”,&menu);
switch(menu){
case0:
return;
case1:
printf("输入新多项式的下标(0--%d):
”,N-1);
scanf(”%d",&i);
P[i]=CreatPolyn();
break;
case2:
for(i=0;i〈N;i++){
printf(”P[%d]=",i);
printPolyn(P[i]);
}
break;
case3:
printf("输入被复制的多项式和新多项式的下标(0——%d):
”,N—1);
scanf(”%d%d”,&i,&j);
CopyPolyn(P[i],P[j]);
break;
case4:
printf(”输入要求值多项式的下标(0—-%d)和X值:
",N-1);
scanf("%d%lf",&i,&k);
sum=SumPolyn(P[i],k);
printf(”多项式值为%lf”,sum);
break;
case5:
printf(”输入相加两项的多项式和新多项式的下标(0——%d):
”,N-1);
scanf(”%d%d%d",&i,&j,&l);
AddPolyn(P[i],P[j],P[l]);
break;
case6:
printf(”输入减两项的多项式和新多项式的下标(0--%d):
”,N-1);
scanf("%d%d%d”,&i,&j,&l);
MinusPolyn(P[i],P[j],P[l]);
break;
case7:
printf(”输入求导的多项式的下标(0-—%d)和新多项式的下标(0—-%d):
",N—1,N—1);
scanf("%d%d",&i,&j);
DifferentialPolyn(P[i],P[j]);
break;
case8:
printf(”输入被销毁多项式的下标(0—-%d):
",N—1);
scanf(”%d”,&i);
DestroyPolyn(P[i]);
break;
case9:
printf(”输入被清空多项式的下标(0—-%d):
”,N—1);
scanf("%d”,&i);
ClearPolyn(P[i]);
break;
case10:
printf("输入求积分的多项式的下标(0——%d)和新多项式的下标(0-—%d):
”,N-1,N-1);
scanf("%d%d",&i,&j);
IntegralPolyn(P[i],P[j]);
break;
case11:
printf(”输入相乘两项的多项式和新多项式的下标(0-—%d):
",N—1);
scanf("%d%d%d”,&i,&j,&l);
MultiplyPolyn(P[i],P[j],P[l]);
break;
}
}
}
四、调试分析
1.刚开始时,忽略了一些变量参数的标识"&",使调试程序时费了不少功夫。
应注重确定参数的变量