多项式的运算.docx
- 文档编号:25417705
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:24
- 大小:332.99KB
多项式的运算.docx
《多项式的运算.docx》由会员分享,可在线阅读,更多相关《多项式的运算.docx(24页珍藏版)》请在冰豆网上搜索。
多项式的运算
实验报告
实验课程名称数据结构与算法
实验项目名称多项式的运算
年级2010级
专业信息与计算机科学
学生姓名张胜(1007010162)郭小兵(1007010210)
潘曦(1007010211)
理学院
实验时间:
2012年9月13日
学生实验室守则
一、按教学安排准时到实验室上实验课,不得迟到、早退和旷课。
二、进入实验室必须遵守实验室的各项规章制度,保持室内安静、整洁,不准在室内打闹、喧哗、吸烟、吃食物、随地吐痰、乱扔杂物,不准做与实验内容无关的事,非实验用品一律不准带进实验室。
三、实验前必须做好预习(或按要求写好预习报告),未做预习者不准参加实验。
四、实验必须服从教师的安排和指导,认真按规程操作,未经教师允许不得擅自动用仪器设备,特别是与本实验无关的仪器设备和设施,如擅自动用或违反操作规程造成损坏,应按规定赔偿,严重者给予纪律处分。
五、实验中要节约水、电、气及其它消耗材料。
六、细心观察、如实记录实验现象和结果,不得抄袭或随意更改原始记录和数据,不得擅离操作岗位和干扰他人实验。
七、使用易燃、易爆、腐蚀性、有毒有害物品或接触带电设备进行实验,应特别注意规范操作,注意防护;若发生意外,要保持冷静,并及时向指导教师和管理人员报告,不得自行处理。
仪器设备发生故障和损坏,应立即停止实验,并主动向指导教师报告,不得自行拆卸查看和拼装。
八、实验完毕,应清理好实验仪器设备并放回原位,清扫好实验现场,经指导教师检查认可并将实验记录交指导教师检查签字后方可离去。
九、无故不参加实验者,应写出检查,提出申请并缴纳相应的实验费及材料消耗费,经批准后,方可补做。
十、自选实验,应事先预约,拟订出实验方案,经实验室主任同意后,在指导教师或实验技术人员的指导下进行。
十一、实验室内一切物品未经允许严禁带出室外,确需带出,必须经过批准并办理手续。
学生所在学院:
理学院专业:
信息与计算机科学班级:
信计101班
姓名
郭小兵
学号
1007010210
实验组
1
实验时间
2012-10-10
指导教师
彭长根
成绩
实验项目名称
多项式的运算
实验目的及要求:
目的:
通过编程实现多项式的运算,复习数组和c语言的相关知识;
要求:
画出流程图,在计算机上实现整个算法。
实验硬件及软件平台:
PC机,vc++6.0,。
实验(或算法)原理:
在科学研究和工程计算里面经常会遇到超多项式的计算问题。
目前对于多项式的四则运算有很多研究,有的是四则运算的存储结构不统一,有的是运算后破坏了操作数的值,有的是算法复杂,将原本可以合并讨论的若干种可能性分解开来。
本实验以C/C++作为程序设计语言,以字符数组为作为存储结构,探讨了一套相对完善的多项式的四则运算实现算法。
实验步骤:
1.根据算法事先写出相应程序。
2.启动PC机,进入vc集成环境,输入代码。
3.编译调试。
4.调试通过,计算出正确结果。
实验内容(包括实验具体内容、算法分析、源代码等等):
#include
#include
#defineFNFunctionNumber
#defineSFstructfunction
structfunction{
structfunction*piror;
doublea;
intn;
structfunction*next;
};
structfunction*head[100];
structfunction*rear[100];
structfunction*p;
structfunction*q;
structfunction*p1;
structfunction*p2;
structfunctionp0={NULL,0,0,NULL};
structfunction*pa=&p0;
intTrue,i,j,d,d1,d2;
intFN=0;
doublex,s;
voidCheck(void){
for(i=1;i<=FN;i++){
p=rear[i];
while((p->a==0)&&(p->n!
=0)){
q=p->piror;
free(p);
rear[i]=p=q;
p->next=NULL;
}
}
}
voidList(intz){
printf("\nf%d(x)=",z);
p=rear[z];
if(p->piror!
=NULL){
if(p->n!
=1)
printf("%.4lfx^%d",p->a,p->n);
else
printf("%.4lfx",p->a);
p=p->piror;
while(p!
=head[z]){
if(p->n!
=1){
if(p->a>0)
printf("+%.4lfx^%d",p->a,p->n);
if(p->a<0)
printf("-%.4lfx^%d",-(p->a),p->n);
}
else{
if(p->a>0)
printf("+%.4lfx",p->a);
if(p->a<0)
printf("-%.4lfx",-(p->a));
}
p=p->piror;
}
if(p->a>0)
printf("+%.4lf",p->a);
if(p->a<0)
printf("-%.4lf",(-p->a));
}
p=p->piror;
}
if(p->a>0)
printf("+%.4lf",p->a);
if(p->a<0)
printf("-%.4lf",(-p->a));
}
else
printf("%.4lf",p->a);
printf("\n");
}
voidFunctionList(void){
Check();
for(i=1;i<=FN;i++)
List(i);
}
voidFunctionCreate(void){
FN++;
head[FN]=NULL;
i=0;
while
(1){
p=(SF*)malloc(sizeof(SF));
printf("\n请升序输入系数值,现在是%d次项:
\n",i);
i++;
scanf("%lf",&p->a);
if(head[FN]==NULL){
head[FN]=p;
p->piror=NULL;
p->n=0;
q=p;
}
else{
q->next=p;
p->piror=q;
p->n=(q->n)+1;
q=p;
}
printf("\n是否继续输入?
\n输入0退出\n");
scanf("%d",&True);
if(True==0){
p->next=NULL;
rear[FN]=p;
break;
}
}
FunctionList();
}
voidFunctionDelete(void){
FunctionList();
printf("\n请输入想删除的函数编号:
\n");
if(d<1||d>FN){
printf("输入错误,请重新选择。
\n");
return;
}
scanf("%d",&d);
q=p=rear[d];
while(q!
=head[d]){
q=p->piror;
q->next=NULL;
free(p);
p=q;
}
free(q);
for(i=d+1;i<=FN;i++){
head[i-1]=head[i];
rear[i-1]=rear[i];
}
head[FN]=NULL;
rear[FN]=NULL;
FN--;
Check();
}
voidFunctionQuantity(void){
FunctionList();
printf("\n请输入想求值的函数编号:
\n");
scanf("%d",&d);
if(d<1||d>FN){
printf("输入错误,请重新选择。
\n");
return;
}
List(d);
printf("x=?
\n");
scanf("%lf",&x);
p=rear[d];
s=p->a;
while(p!
=head[d]){
s*=x;
p=p->piror;
s+=p->a;
}
printf("\nf%d(%.4lf)=%lf\n",d,x,s);
}
voidFunctionAddition(void){
FunctionList();
printf("请输入要做和的两个函数编号,以空格隔开。
\n");
scanf("%d%d",&d1,&d2);
if(d1<1||d1>FN||d2<1||d2>FN){
printf("输入错误,请重新选择。
\n");
return;
}
FN++;
head[FN]=NULL;
p1=head[d1];
p2=head[d2];
while
(1){
p=(SF*)malloc(sizeof(SF));
p->a=p1->a+p2->a;
if(head[FN]==NULL){
head[FN]=q=p;
p->piror=NULL;
p->n=0;
}
else{
q->next=p;
p->piror=q;
p->n=q->n+1;
q=p;
}
if(p1->next!
=NULL&&p2->next!
=NULL){
p1=p1->next;
p2=p2->next;
}
if(p1->next==NULL&&p2->next==NULL){
p->next=NULL;
rear[FN]=p;
break;
}
if(p1->next==NULL&&p2->next!
=NULL){
p1=pa;
p2=p2->next;
}
if(p1->next!
=NULL&&p2->next==NULL){
p2=pa;
p1=p1->next;
}
}
Check();
List(FN);
}
voidFunctionSubtraction(void){
FunctionList();
printf("请输入要做差的两个函数编号,以空格隔开。
\n");
scanf("%d%d",&d1,&d2);
if(d1<1||d1>FN||d2<1||d2>FN){
printf("输入错误,请重新选择。
\n");
return;
}
FN++;
head[FN]=NULL;
p1=head[d1];
p2=head[d2];
while
(1){
p=(SF*)malloc(sizeof(SF));
p->a=p1->a-p2->a;
if(head[FN]==NULL){
head[FN]=q=p;
p->piror=NULL;
p->n=0;
}
else{
q->next=p;
p->piror=q;
p->n=q->n+1;
q=p;
}
if(p1->next!
=NULL&&p2->next!
=NULL){
p1=p1->next;
p2=p2->next;
}
else{
if(p1->next==NULL&&p2->next==NULL){
p->next=NULL;
rear[FN]=p;
break;
}
else{
if(p1->next==NULL){
p1=&p0;
p2=p2->next;
}
else{
p2=&p0;
p1=p1->next;
}
}
}
}
Check();
List(FN);
}
voidFunctionMultiplication(void){
FunctionList();
printf("请输入要做积的两个函数编号,以空格隔开。
\n");
scanf("%d%d",&d1,&d2);
if(d1<1||d1>FN||d2<1||d2>FN){
printf("输入错误,请重新选择。
\n");
return;
}
FN++;
head[FN]=NULL;
p1=head[d1];
p2=head[d2];
doubleD1[100];
doubleD2[100];
doubleD[200];
while(p1!
=NULL){
D1[p1->n]=p1->a;
p1=p1->next;
}
while(p2!
=NULL){
D2[p2->n]=p2->a;
p2=p2->next;
}
for(i=0;i<=(rear[d1]->n+1+rear[d2]->n);i++){
D[i]=0;
for(j=0;j<=i;j++)
if(i-j<=rear[d2]->n)
if(j<=rear[d1]->n)
D[i]+=D1[j]*D2[i-j];
}
i=0;
while(i
p=(SF*)malloc(sizeof(SF));
if(head[FN]==NULL){
head[FN]=q=p;
p->piror=NULL;
p->n=0;
p->a=D[0];
}
else{
p->n=q->n+1;
p->a=D[p->n];
q->next=p;
p->piror=q;
q=p;
}
i++;
}
p->next=NULL;
rear[FN]=p;
p->a=D[p->n];
Check();
List(FN);
}
voidFunctionDifferential(void){
FunctionList();
printf("\n请输入想求导的函数编号:
\n");
scanf("%d",&d);
if(d<1||d>FN){
printf("输入错误,请重新选择。
\n");
return;
}
List(d);
if(head[d]->next!
=NULL){
p1=head[d]->next;
FN++;
while(p=(SF*)malloc(sizeof(SF))){
p->a=p1->a*p1->n;
if(head[FN]==NULL){
head[FN]=q=p;
p->piror=NULL;
p->n=0;
}
else{
q->next=p;
p->piror=q;
p->n=q->n+1;
q=p;
}
if(p1->next!
=NULL){
p1=p1->next;
}
else{
p->next=NULL;
rear[FN]=p;
break;
}
}
}
else{
FN++;
p=(SF*)malloc(sizeof(SF));
head[FN]=rear[FN]=p;
p->a=0;
p->n=0;
p->piror=p->next=NULL;
}
Check();
List(FN);
}
voidFunctionIntegral(void){
FunctionList();
printf("\n请输入想积分的函数编号:
\n");
scanf("%d",&d);
if(d<1||d>FN){
printf("输入错误,请重新选择。
\n");
return;
}
List(d);
p1=head[d];
FN++;
p=(SF*)malloc(sizeof(SF));
head[FN]=q=p;
p->a=0;
p->n=0;
p->piror=NULL;
while(p=(SF*)malloc(sizeof(SF))){
p->a=p1->a/(p1->n+1);
q->next=p;
p->piror=q;
p->n=q->n+1;
q=p;
if(p1->next!
=NULL){
p1=p1->next;
}
else{
p->next=NULL;
rear[FN]=p;
break;
}
}
Check();
List(FN);
}
voidCancel(void){
for(;FN>0;FN--){
q=p=rear[FN];
while(q!
=head[FN]){
q=p->piror;
q->next=NULL;
free(p);
p=q;
}
free(q);
rear[FN]=NULL;
head[FN]=NULL;
}
}
intmain(void){
head[1]=NULL;
intchoose;
for(;;){
printf("多项式函数计算\n");
printf("================\n");
printf("1.创建函数\n");
printf("2.删除函数\n");
printf("3.函数求值\n");
printf("4.函数加法\n");
printf("5.函数减法\n");
printf("6.函数乘法\n");
printf("7.函数求导\n");
printf("8.不定积分\n");
printf("9.函数列表\n");
printf("0.退出程序\n");
printf("================\n");
printf("请输入0-9:
\n");
for(;;){
scanf("%d",&choose);
if(choose<0||choose>9)
printf("\n输入错误,请重新输入0-9:
\n");
elsebreak;
}
if(head[1]==NULL&&choose>1){
printf("没有函数,清输入1输入函数,或输入0退出程序。
\n");
continue;
}
switch(choose){
case1:
printf("\n1.创建函数\n");
FunctionCreate();
break;
case2:
printf("\n2.删除函数\n");
FunctionDelete();
break;
case3:
printf("\n3.函数求值\n");
FunctionQuantity();
break;
case4:
printf("\n4.函数加法\n");
FunctionAddition();
break;
case5:
printf("\n5.函数减法\n");
FunctionSubtraction();
break;
case6:
printf("\n6.函数乘法\n");
FunctionMultiplication();
break;
case7:
printf("\n7.函数求导\n");
FunctionDifferential();
break;
case8:
printf("\n8.不定积分\n");
FunctionIntegral();
break;
case9:
printf("\n9.函数列表\n");
FunctionList();
break;
case0:
printf("\n感谢使用!
\nMadebyTanchyAu\n郭小兵PB11000640\n");
Cancel();
system("pause");
return0;
}
}
}
实验结果与讨论:
在执行加法、减法时,操作无误,顺利完成实验的各个过程,在输入多项式的过程中,要按多项式的次方数、系数依次输入,从0次开始!
指导教师意见:
签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多项式 运算