一元多项加减乘除 课程设计报告.docx
- 文档编号:17205248
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:33
- 大小:60.12KB
一元多项加减乘除 课程设计报告.docx
《一元多项加减乘除 课程设计报告.docx》由会员分享,可在线阅读,更多相关《一元多项加减乘除 课程设计报告.docx(33页珍藏版)》请在冰点文库上搜索。
一元多项加减乘除课程设计报告
课程设计
课程设计名称:
数据结构课程设计
专业班级:
学生姓名:
学号:
指导教师:
课程设计时间:
2012.12.17-2012.12.28
计算机科学与技术专业课程设计任务书
学生姓名
专业班级
学号
题目
一元多项式的加法、减法与乘法的实现
课题性质
工程设计
课题来源
自拟课题
指导教师
王峰
同组姓名
无
主要内容
问题描述:
设有一元多项式Am(x)和Bn(x),
Am(x)=A0+A1x1+A2x2+A3x3+…+Amxm
Bn(x)=B0+B1x1+B2x2+B3x3+…+Bnxn
设计要求:
分别采用顺序和动态链表存储结构,编程实现求M(x)=Am(x)+Bn(x)、M(x)=Am(x)-Bn(x)和M(x)=Am(x)×Bn(x)。
1)首先判定多项式是否稀疏;
2)结果M(x)中无重复阶项和无零系数项;
3)要求输出结果的升幂和降幂两种排列情况。
任务要求
1、编写程序,实现求解算法;
2、书写课程设计报告。
参考文献
1、《C程序设计(第二版)》,谭浩强,北京,清华大学出版社,1999.
审查意见
指导教师签字:
教研室主任签字:
年月日
1.
需求分析
1.按照题目要求分别实现顺序结构、动态链表结构下的一元多项式的加法、减法、乘法;
2.首先判定多项式是否稀疏;
3.输出结果M(x)中无重复阶项和无零系数项;
4.输出结果的升幂和降幂两种排列情况。
设有一元多项式Am(x)和Bn(x).
Am(x)=A0+A1x1+A2x2+A3x3+…+Amxm
Bn(x)=B0+B1x1+B2x2+B3x3+…+Bnxn
实现求M(x)=Am(x)+Bn(x)、M(x)=Am(x)-Bn(x)和M(x)=Am(x)×Bn(x)。
2.概要设计
2.1程序结构图
2.2存储结构
typedefstruct{//顺序表项的结构体
intcoef;
intexp;
}ElemType;
typedefstruct{//顺序表的结构体
ElemTypea[MAXSIZE];
intlength;
}Sqlist;
typedefstructpoly{//链式表项的结构体
intcoef;
intexp;
structpoly*next;
}*Po,Poly;
3.详细设计
顺序表
A1.SqlistCreat_S()//用于创建顺序表多项式
输入多项式每项的系数和幂\n如3x^2则输入“32”,输入“00”表明多项式输入完成。
while(coef!
=0||exp!
=00)//输入“00”结束输入
{
Sq.a[length].coef=coef;
Sq.a[length].exp=exp;
length++;
scanf("%d%d",&coef,&exp);
if(exp>max)//用于记录多项式中最大的幂
max=exp;
}
判断稀疏矩阵。
if(length+1==max)//如果最大幂等于项数,则不为稀疏多项式
printf("此多项式不为稀疏多项式!
\n");
else
printf("此多项式为稀疏多项式\n");
A2.Sqlistajiab_S(Sqlista,Sqlistb)//A+B的顺序表运算
if(a.a[j].exp==b.a[i].exp)
{//幂相同系数想加
m.a[j].coef=a.a[j].coef+b.a[i].coef;
ch=1;
}
if(ch==0)//幂不同则加到m多项式后面
{
m.a[m.length].coef=b.a[i].coef;
m.a[m.length].exp=b.a[i].exp;
m.length++;
}
A3.Sqlistajianb_S(Sqlista,Sqlistb)//A减B(顺序表运算)
把B的系数取反,然后按a+b运算。
A4.Sqlistachengb_S(Sqlista,Sqlistb)//A乘B(顺序表)
系数相乘,幂相加
coef=a.a[i].coef*b.a[j].coef;
exp=a.a[i].exp+b.a[j].exp;
A5.shuchu_S(Sqlistm)//输出M(顺序表运算)
调用函数Sqlistpaixu_S(Sqlistm)//排序(顺序表)对M进行冒泡排序后输出。
for(i=0;m.length-1>i;i++)//冒泡排序
{
for(j=0;m.length-i-1>j;j++)
{
if(m.a[j].exp>m.a[j+1].exp)
{
ch=m.a[j+1].exp;
m.a[j+1].exp=m.a[j].exp;
m.a[j].exp=ch;
ch=m.a[j+1].coef;
m.a[j+1].coef=m.a[j].coef;
m.a[j].coef=ch;
}
}
动态链表
B1.PoCreat_L()//创建多项式(动态链表)
输入多项式每项的系数和幂\n如3x^2则输入“32”,输入“00”表明多项式输入完成。
while(coef!
=0||exp!
=0)//输入00就结束输入
{
p2=(Po)malloc(sizeof(Poly));//申请空间
p2->coef=coef;
p2->exp=exp;
p2->next=NULL;
if(p1==NULL)
{
head=p2;
p1=p2;
}
else
{
p1->next=p2;
p1=p2;
}
scanf("%d%d",&coef,&exp);
if(max max=exp; length++; } 跟A1一样也有判断稀疏的语句。 B2.Sqlistajiab_S(Sqlista,Sqlistb)//A+B的顺序表运算 幂相同系数想加,幂不同则加到m多项式后面。 while(b! =NULL)//比较幂相同的项 { while(a! =NULL) { if(b->exp==a->exp)//幂相同则相加 { a->coef=a->coef+b->coef; ch=1; } p1=a; a=a->next; } if(ch==0)//幂不同就加到链的后面 B3.Poajianb_L(Poa,Pob)//A减B(动态链表) 跟B2一样,改变B系数的符号。 B4.Poachengb_L(Poa,Pob)//A乘B(动态链表) 系数相乘,幂相加 while(p! =NULL) { if(p->exp==a->exp+b->exp) { p->coef=a->coef*b->coef+p->coef; ch=1; } p1=p; p=p->next; } B5.shuchu_L(Pohead)//输出M(动态链表) 调用函数Popaixu_L(Pohead)//对M多项式按幂排序(动态链表)排序输出。 while(head! =NULL) { printf("%d^%d",head->coef,head->exp); head=head->next; if(head! =NULL) printf("+"); } 4.调试分析 顺序表 A1.创建 输入“91578533100” 输入“-7,82000” A2.A+B 时间复杂度为O(n); 按升序输出 按降序输出 A3.A-B 时间复杂度为O(n); 按升序输出 按降序输出 A4.A*B 时间复杂度为O(n2) 按升序输出 按降序输出 动态链表 B1.创建 .输入“91578533100” 输入“-7,82000” B2.A+B 时间复杂度为O(n); 按升序输出 按降序输出 B3.A-B 时间复杂度为O(n); 按升序输出 按降序输出 B4.A*B 时间复杂度为O(n2) 按升序输出 按降序输出 5.课程设计总结 虽然说课程设计题目老师给的时间比较早,但是由于后面有好多考试,课程设计着手做的时间不是很早,起初对一元多项式运算没有多少思路,课本上这节也讲的不详细,所以我上网查了好多资料,也参考了其他程序! 试图完成多项式的相加、相乘,在不懈的努力下我终于完成了这次课程设计。 这次课程设计我学到了不少东西,深刻认识到变成结构化和模块化的重要性,在用链表操作时遇到了很多麻烦,但最终还是解决,对链表的使用也更熟练了。 当然也注意到很多细节问题是平时编小程序经常疏忽的,如局部变量和全局变量的定义和使用。 课程设计终于做完了,虽然有些疲劳和困倦,但带给我很多的收获。 错误总结 1.对于多项式的运算的,运算符的输出很重要,一开始多输出一个‘+’,并且当为负数时会输出+--。 还有当系数为0时的输出都没有专门考虑。 和周围的同学交流一下算法,相互探讨了出现的问题,和解决的方法。 讨论中改掉很多不足。 使代码更加完善。 2.这次用链表的来做这道题目让我收获很大。 比如以前我用链表都没想到第一个节点不用,第一个节点不用来存放数据对操作有很大帮助。 对链表的构建更加的熟练。 对链表向前推进把握的更加准确。 在调试代码,检验的时候,遇到很大的阻碍,但解决问题后,自己明白了很多。 3.排序我用的是冒泡排序,我现在对冒泡已经掌握很好。 4函数调用时参数传递,我在写的时候有时想传回来两个数据,结果做不到,我就把这个函数分开为两个函数,让主函数调用两次! 5.学习到了顺序表的定义方法,刚开始以为顺序表就是数组,其实顺序表的功能跟强大,更方便。 6.通过本次试验,我发现自己分析问题不是很全面,忽略掉一些细节。 以后分析问题时要仔细考虑,认真分析,避免在细节上犯错误 《数据结构》课程认识 数据结构已经学了一个学期,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,实际应用,已经减少了许多。 对这些知识也有了更深的理解和很好的掌握。 许多困惑,有许多已经通过实际操作解决了,并能够深刻认识,但也有很多没有明白。 课程设计都是要在实践中摸索的,这与平时做练习是不同的,但也因为平时有许多的练习基础,会使你做起程序来得更加得心应手。 另外就是要把错误总结,有许多错误或者陷阱是平时自己陷进去的,因此很深刻,但也有些错误或者陷阱是自己还没有接触或者犯过的,这就应该看多些别人的总结,使自己不犯这些错误。 不让自己掉进这些陷阱。 这样长期总结,会对自己有很大的帮助。 6.代码(c文件,非c++) #include #include #defineMAXSIZE100//用于控制AB多项式的项数大小! typedefstruct{//顺序表项的结构体 intcoef; intexp; }ElemType; typedefstruct{//顺序表的结构体 ElemTypea[MAXSIZE]; intlength; }Sqlist; typedefstructpoly{//链式表项的结构体 intcoef; intexp; structpoly*next; }*Po,Poly; SqlistCreat_S()//用于创建顺序表多项式 { intcoef,exp; SqlistSq; intmax=0,length=0; printf("输入多项式每项的系数和幂\n如3x^2则输入“32”,输入“00”表明多项式输入完成\n"); scanf("%d%d",&coef,&exp); while(coef! =0||exp! =00)//输入“00”结束输入 { Sq.a[length].coef=coef; Sq.a[length].exp=exp; length++; scanf("%d%d",&coef,&exp); if(exp>max)//用于记录多项式中最大的幂 max=exp; } Sq.length=length; if(length+1==max)//如果最大幂等于项数,则不为稀疏多项式 printf("此多项式不为稀疏多项式! \n"); else printf("此多项式为稀疏多项式\n"); shuchu_S(Sq); returnSq; } Sqlistajiab_S(Sqlista,Sqlistb)//A+B的顺序表运算 { inti,j,ch=0; Sqlistm; m=a;//把a赋给m for(i=0;b.length>i;i++) { ch=0; for(j=0;a.length>j;j++) { if(a.a[j].exp==b.a[i].exp) {//幂相同系数想加 m.a[j].coef=a.a[j].coef+b.a[i].coef; ch=1; } } if(ch==0)//幂不同则加到m多项式后面 { m.a[m.length].coef=b.a[i].coef; m.a[m.length].exp=b.a[i].exp; m.length++; } } printf("\n运算完成\n"); returnm; } Sqlistquling_S(Sqlistm)//去零函数(顺序表运算) { inti; SqlistSq; Sq.length=0; for(i=0;m.length>i;i++) { if(m.a[i].coef! =0) { Sq.a[Sq.length]=m.a[i]; Sq.length++; } } returnSq; } shuchu_S(Sqlistm)//输出M(顺序表运算) { inti; printf("M="); for(i=0;m.length>i;i++) { printf("%dx^%d",m.a[i].coef,m.a[i].exp); if(i! =m.length-1) printf("+"); } printf("\n"); } Sqlistajianb_S(Sqlista,Sqlistb)//A减B(顺序表运算) { inti,j,ch=0; Sqlistm; m=a;//把a赋给m for(i=0;b.length>i;i++)//把B的系数取反 { b.a[i].coef=-b.a[i].coef; } for(i=0;b.length>i;i++) { ch=0; for(j=0;a.length>j;j++) { if(a.a[j].exp==b.a[i].exp) {//幂相同系数想加 m.a[j].coef=a.a[j].coef+b.a[i].coef; ch=1; } } if(ch==0)//幂不同则加到m多项式后面 { m.a[m.length].coef=b.a[i].coef; m.a[m.length].exp=b.a[i].exp; m.length++; } } printf("\n运算完成\n"); returnm; } Sqlistachengb_S(Sqlista,Sqlistb)//A乘B(顺序表) { Sqlistm; inti,j,k,ch; intcoef,exp; m.length=0; for(i=0;a.length>i;i++) { for(j=0;b.length>j;j++) { ch=0; coef=a.a[i].coef*b.a[j].coef; exp=a.a[i].exp+b.a[j].exp; for(k=0;m.length>k;k++) { if(exp==m.a[k].exp) { m.a[k].coef=m.a[k].coef+coef; ch=1; } } if(ch==0) { m.a[m.length].coef=coef; m.a[m.length].exp=exp; m.length++; } } } printf("/n/n运算完成/n/n"); returnm; } Sqlistpaixu_S(Sqlistm)//排序(顺序表) { inti,j,ch,sj; printf("\n\n1--按升序输出2--按降序输出\n\n"); scanf("%d",&sj); for(i=0;m.length-1>i;i++)//冒泡排序 { for(j=0;m.length-i-1>j;j++) { if(m.a[j].exp>m.a[j+1].exp) { ch=m.a[j+1].exp; m.a[j+1].exp=m.a[j].exp; m.a[j].exp=ch; ch=m.a[j+1].coef; m.a[j+1].coef=m.a[j].coef; m.a[j].coef=ch; } } } if(sj==2) { for(i=0;m.length/2>i;i++) { ch=m.a[i].exp; m.a[i].exp=m.a[m.length-1-i].exp; m.a[m.length-1-i].exp=ch; ch=m.a[i].coef; m.a[i].coef=m.a[m.length-1-i].coef; m.a[m.length-1-i].coef=ch; } } returnm; } PoCreat_L()//创建多项式(动态链表) { Pohead=NULL,p1=NULL,p2; intcoef,exp; intmax=0,length=0; printf("输入多项式每项的系数和幂\n如3x^2则输入“32”,输入“00”表明多项式输入完成\n"); scanf("%d%d",&coef,&exp); max=exp; while(coef! =0||exp! =0)//输入00就结束输入 { p2=(Po)malloc(sizeof(Poly));//申请空间 p2->coef=coef; p2->exp=exp; p2->next=NULL; if(p1==NULL) { head=p2; p1=p2; } else { p1->next=p2; p1=p2; } scanf("%d%d",&coef,&exp); if(max max=exp; length++; } if(length-1==max) printf("此多项式不为稀疏多项式\n"); else printf("此多项式为稀疏多项式\n"); shuchu_L(head); returnhead; } Poajiab_L(Poa,Pob)//A加B(动态链表) { intch=0; Pohead,p,p1; head=a; while(b! =NULL)//比较幂相同的项 { while(a! =NULL) { if(b->exp==a->exp)//幂相同则相加 { a->coef=a->coef+b->coef; ch=1; } p1=a; a=a->next; } if(ch==0)//幂不同就加到链的后面 { p=(Po)malloc(sizeof(Poly)); p->next=NULL; p->coef=b->coef; p->exp=b->exp; p1->next=p; } ch=0; a=head; b=b->next; } printf("\n\n运算完成\n\n"); returnhead; } Poajianb_L(Poa,Pob)//A减B(动态链表) { intch=0; Pohead,p,p1; head=a; while(b! =NULL)//比较幂相同的项 { while(a! =NULL) { if(b->exp==a->exp)//幂相同则相减 { a->coef=a->coef-b->coef; ch=1; } p1=a; a=a->next; } if(ch==0)//幂不同就变为负数加到链的后面 { p=(Po)malloc(sizeof(Poly)); p->next=NULL; p->coef=-b->coef; p->exp=b->exp; p1->next=p; } ch=0; a=head; b=b->next; } printf("\n\n运算完成\n\n"); returnhead; } Poachengb_L(Poa,Pob)//A乘B(动态链表) { intch=0; Pohead=NULL,p1,p2,p,pb; pb=b; p=head; while(a! =NULL) { while(b! =NULL) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元多项加减乘除 课程设计报告 一元 多项 加减乘除 课程设计 报告