数据结构课程设计《一元多项式的表达及其运算 集合的表达与运算》.docx
- 文档编号:10917625
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:21
- 大小:61.39KB
数据结构课程设计《一元多项式的表达及其运算 集合的表达与运算》.docx
《数据结构课程设计《一元多项式的表达及其运算 集合的表达与运算》.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计《一元多项式的表达及其运算 集合的表达与运算》.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构课程设计《一元多项式的表达及其运算集合的表达与运算》
目录
1.一元多项式的表示及其运算1
1.1问题描述1
1.2设计方案与概要设计1
1.3详细设计2
1.4程序运行说明与结果11
2.集合的表示与运算12
2.1问题描述12
2.2设计方案与概要设计12
2.3详细设计13
2.4程序运行说明与结果18
3.总结与分析19
1.一元多项式的表示及其运算
1.1问题描述
(1)输入并建立一元多项式
(2)输出一元多项式
(3)多项式实现相加、相减及相乘
(4)输入多项式中的未知数,计算多项式的结果
(5)退出程序
1.2设计方案与概要设计
程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
程序执行的命令包括:
(1)多项式的项作为LinkList的数据元素,coef为系数,浮点型,expn为指数,整型
(2)构造一个表示一元多项式链表La,存储多项式的项数、系数和指数等数据
(3)利用两个多项式的结点构成"和多项式",AddPolyn(&Pa,&Pb),一元多项式Pa和Pb已存在,完成多项式相加运算,即:
Pa=Pa+Pb,并销毁一元多项式Pb。
(4)利用两个多项式的结点构成"差多项式",利用两个多项式的结点构成"和多项式",SubtractPolyn(&Pa,&Pb),一元多项式Pa和Pb已存在,完成多项式相减运算,即:
Pa=Pa-Pb,并销毁一元多项式Pb。
(5)利用两个多项式的结点构成"积多项式",利用两个多项式的结点构成"和多项式",MultiplyPolyn(&Pa,&Pb),一元多项式Pa和Pb已存在,完成多项式相乘运算,即:
Pa=Pa×Pb,并销毁一元多项式Pb
(6)制作标题栏
(7)使用switch语句实行多分支选择操作,当case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句,输出提示用户出错,并重新输入
1.3详细设计
#include
#include
#include
typedefstructLNode{
floatcoef;
intexpn;
structLNode*next;
}LNode;
LNode*InitPolyn(LNode*La,intn){
if(n<=0)returnNULL;
LNode*h=La=(LNode*)malloc(sizeof(LNode)),*Lb;
La->coef=0.0;
inti;
printf("依次输入%d个非零项(每项前一个为系数,后一个为指数)\n",n);
for(i=1;i<=n;++i){
scanf("%f%d",&La->coef,&La->expn);
if(La->coef)
Lb=La;
La=La->next=(LNode*)malloc(sizeof(LNode));
}
Lb->next=NULL;
free(La);
returnh;
}
LNode*selsort(LNode*h){
LNode*g,*La,*Lb;
if(!
h)returnNULL;
floatf;
inti,fini=1;
for(g=h;g->next&&fini;g=g->next){
fini=0;
for(La=h,Lb=h->next;Lb;La=La->next,Lb=Lb->next)
if(La->expn
f=La->coef;i=La->expn;
La->coef=Lb->coef;La->expn=Lb->expn;
Lb->coef=f;Lb->expn=i;
fini=1;
}
}
for(g=h,La=g->next;La;)
if(g->expn==La->expn){
g->coef+=La->coef;
g->next=La->next;
Lb=La;
La=La->next;
free(Lb);
}
elseif(g->next){
g=g->next;
La=La->next;
}
returnh;
}
voidPrintfPoly(LNode*La){
LNode*Lb=La;
if(!
Lb){
putchar('0');
return;
}
if(Lb->coef!
=1){
printf("%g",Lb->coef);
if(Lb->expn==1)putchar('X');
elseif(Lb->expn)printf("X^%d",Lb->expn);
}
elseif(!
Lb->expn)putchar('1');
elseif(Lb->expn==1)putchar('X');
elseprintf("X^%d",Lb->expn);
Lb=Lb->next;
while(Lb){
if(Lb->coef>0)putchar('+');
if(Lb->coef!
=1){
printf("%g",Lb->coef);
if(Lb->expn==1)putchar('X');
elseif(Lb->expn)printf("X^%d",Lb->expn);
}
elseif(!
Lb->expn)putchar('1');
elseif(Lb->expn==1)putchar('X');
elseprintf("X^%d",Lb->expn);
Lb=Lb->next;
}
}
Compare(LNode*a,LNode*b){
if(a->expn
if(a->expn>b->expn)return1;
return0;
}
LNode*AddPolyn(LNode*Pa,LNode*Pb){
LNode*h,*qa=Pa,*qb=Pb,*La,*Lb;
floatsum;
h=La=(LNode*)malloc(sizeof(LNode));
La->next=NULL;
while(qa&&qb){
switch(Compare(qa,qb)){
case-1:
La->next=qb;
La=qb;
qb=qb->next;
break;
case0:
sum=qa->coef+qb->coef;
if(sum!
=0.0){
La->next=qa;
qa->coef=sum;
La=qa;
qa=qa->next;
}
else{
Lb=qa;
qa=qa->next;
free(Lb);
}
Lb=qb;
qb=qb->next;
free(Lb);
break;
case1:
La->next=qa;
La=qa;
qa=qa->next;
break;
}
}
if(Pa)La->next=qa;
if(Pb)La->next=qb;
Lb=h;
h=h->next;
free(Lb);
returnh;
}
LNode*Add(LNode*Pa,LNode*Pb){
intn;
puts("再输入1个一元多项式的项数");
scanf("%d",&n);
Pb=InitPolyn(Pb,n);
Pb=selsort(Pb);
PrintfPoly(Pa);
if(Pb&&Pb->coef>0)printf("+");
PrintfPoly(Pb);
Pa=AddPolyn(Pa,Pb);
printf("=");
Pa=selsort(Pa);
PrintfPoly(Pa);
returnPa;
}
LNode*SubtractPolyn(LNode*Pa,LNode*Pb){
LNode*La=Pb;
while(La){
La->coef*=-1;
La=La->next;
}
returnAddPolyn(Pa,Pb);
}
LNode*Subtract(LNode*Pa,LNode*Pb){
intn;
puts("\n再输入1个一元多项式的项数");
scanf("%d",&n);
Pb=InitPolyn(Pb,n);
Pb=selsort(Pb);
PrintfPoly(Pa);
printf("-");
putchar('(');PrintfPoly(Pb);putchar(')');
Pa=SubtractPolyn(Pa,Pb);
printf("=");
Pa=selsort(Pa);
PrintfPoly(Pa);
returnPa;
}
LNode*MultiplyPolyn(LNode*Pa,LNode*Pb){
if(!
Pb)returnNULL;
LNode*pa=Pa,*p,*q,*r,*s,*t;
r=p=(LNode*)malloc(sizeof(LNode));
while(pa){
p->coef=pa->coef;
p->expn=pa->expn;
q=p;
p=p->next=(LNode*)malloc(sizeof(LNode));
pa=pa->next;
}
q->next=NULL;
free(p);
pa=Pa;
t=s=(LNode*)malloc(sizeof(LNode));
while(pa){
q=s;
s=s->next=(LNode*)malloc(sizeof(LNode));
pa=pa->next;
}
q->next=NULL;
free(s);
pa=Pa;
while(pa){
pa->coef*=Pb->coef;
pa->expn+=Pb->expn;
pa=pa->next;
}
Pb=Pb->next;
while(Pb){
p=r;
s=t;
while(p){
s->coef=p->coef*Pb->coef;
s->expn=p->expn+Pb->expn;
p=p->next;
s=s->next;
}
Pa=AddPolyn(Pa,t);
Pb=Pb->next;
}
returnPa;
}
LNode*Multiply(LNode*Pa,LNode*Pb){
intn;
puts("\n再输入1个一元多项式的项数");
scanf("%d",&n);
Pb=InitPolyn(Pb,n);
Pb=selsort(Pb);
putchar('(');PrintfPoly(Pa);putchar(')');
printf("×");
putchar('(');PrintfPoly(Pb);putchar(')');
printf("=");
Pa=MultiplyPolyn(Pa,Pb);
Pa=selsort(Pa);
PrintfPoly(Pa);
returnPa;
}
voidmain(){
LNode*A,*B;
chars[2];
inti,n;
printf("\t\t\t------------------------------\n");
printf("\t\t\t一元多项式的表达与运算\n");
printf("\t\t\t------------------------------\n");
printf("\t\t\t****MadebyHuangruiting****\n");
puts("\n输入1个一元多项式的项数");
scanf("%d",&n);
A=InitPolyn(A,n);
A=selsort(A);
PrintfPoly(A);
p:
puts("\n1:
加\n2:
减\n3:
乘\n4:
退出");
getchar();
q:
gets(s);
if(s[1]!
='\0'||!
isdigit(*s)){
puts("Error,请重新输入!
");gotoq;
}
i=*s-48;
switch(i){
case1:
A=Add(A,B);gotop;;
case2:
A=Subtract(A,B);gotop;;
case3:
A=Multiply(A,B);gotop;
case4:
break;
default:
puts("Error,请重新输入!
");gotoq;
}
}
1.4程序运行说明与结果
例:
x2+3x
(1)按照需要操作的多项式输入第1个多项式的项数
例中多项式项数为2,输入2,回车;
(2)依次输入两个非零项,两个项之间用空格间开即可,每项输入,前一个为系数,后一个为指数,例中多项式第一项系数为1,输入1,空格,指数为2,输入2,空格,第二项系数为3,输入3,空格,指数为1,输入1,回车;即显示x^2+3x
(x^2表示x的2次方)。
例:
计算x2+3x与x3+2x4的乘积
(3)选择需要操作的运算,例如要计算多项式乘多项式,选择3,回车;
(4)再按照步骤
(2)输入多项式x3+2x4,回车;
(5)输出(x^2+3x)×(3x^2)=3x^4+9x^3(得出结果为3x4+9x3)
2.集合的表示与运算
2.1问题描述
(1)构造两个集合,命名集合A跟集合B
(2)求两个集合的并集:
A∪B
(3)求两个集合的交集:
A∩B
(4)求两个集合的差集:
A-B
(5)退出程序
2.2设计方案与概要设计
程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤输入中的非法字符)和运算结果显示在其后。
程序执行的命令包括:
(1)构造一个表示集合的空链表,生成链表用于存放两集合的元素
(2)打印输入的两集合中的元素,集合中为整数元素,int整型
(3)第一个集合中的元素放在新集合中,与新集合中的元素比较,对第二个集合中的元素进行分析,两原集合经过分析在新集合中存放并集元素,求A∪B
(4)第一个集合中的元素放在新集合中,与新集合中的元素比较,对第二个集合中的元素进行分析,筛选两原集合的共同元素存放在新集合中,求A∩B
(5)第一个集合中的元素放在新集合中,与新集合中的元素比较,对第二个集合中的元素进行分析,将第一个集合的元素剔除两原集合的共同元素后存放在新集合中,求A-B
(6)使用switch语句实行多分支选择操作,当case中的常量表达式的值都没有与表达式的值匹配的,操作跳回第一步要求用户重新输入
2.3详细设计
#include
#include
#include
structset{
intcoef;
structset*next;
};
voidInitList_La(structset*&La,intn)
{
inti;structset*L;
La=(structset*)malloc(sizeof(set));
La->next=NULL;
for(i=n;i>0;i--)
{
L=(structset*)malloc(sizeof(set));
printf("请输入该集合中第%d个整数元素:
",n-i+1);
scanf("%d",&L->coef);
L->next=La->next;
La->next=L;
}
}
voidprintlist_La(structset*&La)
{
structset*L;
inti;
L=La->next;
if(!
L)printf("φ");
while(L!
=NULL)
{
printf("%d",L->coef);
L=L->next;
i++;
}printf("}");
printf("\n");
}
voidAddset(structset*&p,structset*&q,structset*&r)
{
structset*a,*b,*c;
r=(structset*)malloc(sizeof(set));
r->next=NULL;
a=p->next;
for(;a;)
{
b=(structset*)malloc(sizeof(set));
b->next=r->next;
r->next=b;
b->coef=a->coef;
a=a->next;
}
a=q->next;
b=(structset*)malloc(sizeof(set));
b->next=r->next;
r->next=b;
b->coef=a->coef;
a=a->next;
for(;a;)
{
for(c=r->next;(a->coef!
=c->coef)&&c->next;){
c=c->next;
}
if((a->coef!
=c->coef)&&!
(c->next)){
b=(structset*)malloc(sizeof(set));
b->next=r->next;
r->next=b;
b->coef=a->coef;
}
a=a->next;
}
}
voidSubset(structset*&p,structset*&q,structset*&r){
structset*a,*b,*c;
r=(structset*)malloc(sizeof(set));
r->next=NULL;
c=q->next;
for(;c;){
b=p->next;
for(;(b->coef!
=c->coef)&&b->next;){
b=b->next;
}
if(b->coef==c->coef){
a=(structset*)malloc(sizeof(set));
a->next=r->next;
r->next=a;
a->coef=b->coef;
}
c=c->next;
}
}
voidIntset(structset*&p,structset*&q,structset*&r){
structset*a,*b,*c;
r=(structset*)malloc(sizeof(set));
r->next=NULL;
b=p->next;
for(;b;){
c=q->next;
for(;(b->coef!
=c->coef)&&c->next;){
c=c->next;
}
if(!
c->next&&(b->coef!
=c->coef)){
a=(structset*)malloc(sizeof(set));
a->next=r->next;
r->next=a;
a->coef=b->coef;
}
b=b->next;
}
}
voidHuangruiting(){
printf("\t\t\t------------------------------\n");
printf("\t\t\t集合的表示与运算\n");
printf("\t\t\t------------------------------\n");
printf("\t\t\t****MadebyHuangruiting****\n");
}
voidmain(){
structset*p,*q,*r;
intm,n,node;
Huangruiting();
for(;;){
do{
printf("\n*请输入集合A中元素的个数:
");
scanf("%d",&m);
InitList_La(p,m);
printf("\n*请输入集合B中元素的个数:
");
scanf("%d",&n);
InitList_La(q,n);
printf("★集合A为:
{");
printlist_La(p);
printf("★集合B为:
{");
printlist_La(q);
printf("请输入您要选择操作的代码:
\n");
printf("1:
求两集合的并A∪B\n");
printf("2:
求两集合的交A∩B\n");
printf("3:
求两集合的差A-B\n");
printf("4:
同时求两集合的并集、交集及差集\n");
printf("0:
退出\n");
scanf("%d",&node);
}
while(node<0||node>4);
if(node==0)exit
(1);
while(node<0||node>4);
switch(node){
case1:
Addset(p,q,r);printf("A∪B:
{");printlist_La(r);break;
case2:
Subset(p,q,r);printf("A∩B:
{");printlist_La(r);break;
case3:
Intset(p,q,r);printf("A-B:
{");printlist_La(r);break;
case4:
Addset(p,q,r);printf("A∪B:
{");printlis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元多项式的表达及其运算 集合的表达与运算 数据结构课程设计一元多项式的表达及其运算 集合的表达与运算 数据结构 课程设计 一元 多项式 表达 及其 运算 集合
![提示](https://static.bdocx.com/images/bang_tan.gif)