📄 addandsub.cpp
字号:
#include<stdio.h> /*该文件包含printf()、scanf()等文件*/
typedef struct
{
int key; /*多项式的项次数*/
signed int num; /*多项式的项系数*/
}exp; /*多项式的项的存储结构*/
/*-------------------多项式的输入函数-------------------------------*/
void cins(exp a[])
/*由多项式指数的降幂建立多项式*/
{
int i,n;
printf("-------------------------\n最高次项的次数:");
scanf("%d",&a[0].key); /*输入多项式最高次项的系数*/
printf("-------------------------\n");
n=a[0].key;
for(i=0;i<=n;i++) /*输入多项式每一项的系数*/
{
a[i].key=n-i; /*项次数赋值*/
printf("%d次项系数: ",n-i);
scanf("%d",&a[i].num); /*项系数赋值*/
}
printf("\n");
}
/*-------------------多项式的输出函数-------------------------------*/
void couts(exp a[])
/*由多项式指数的降幂输出多项式a[]的表达式*/
{
int i,b=-1; /*标志位b初始值为-1,用于判断结果是否为0*/
for(i=0;i<=a[0].key;i++)
{
if(a[i].num==0) continue; /*系数为0的项不输出*/
if(i!=0&&a[i].num>0) printf("+"); /*第一项后,系数为正,则输出加号*/
if(a[i].key>=2) printf("%d*X^%d",a[i].num,a[i].key); /*系数输出*/
else
if(a[i].key==1) printf("%d*X",a[i].num);
else printf("%d",a[i].num);
b=1; /*置标志位为1*/
}
if(b==-1) printf("%d",0); /*若各项系数均为0,则最后输出0*/
printf("\n");
}
/*-------------------多项式的加法函数-------------------------------*/
void adds(exp a[],exp b[],exp c[])
/*多项式a和b相加,和存放在c中*/
{
int i,m,n; /*m存放二者最高次数较小的次数,n存放较大的次数*/
exp A[100],B[100]; /*A存放最高次数较大的多项式,B存放较小的多项式*/
if(a[0].key==b[0].key) /*a、b次数相同时*/
{
for(i=0;i<=a[0].key;i++)
{
c[i].key=a[i].key; /*c各项系数为指数相同的各项系数之和*/
c[i].num=a[i].num+b[i].num;
}
return;
}
if(a[0].key>b[0].key) /*a的最高次数大于b时*/
{
m=b[0].key;n=a[0].key;
for(i=0;i<=n;i++) /*A=a*/
A[i]=a[i];
for(i=0;i<=m;i++) /*B=b*/
B[i]=b[i];
}
else /*b的最高次数大于a时*/
{
n=b[0].key;m=a[0].key;
for(i=0;i<=m;i++) /*B=a*/
B[i]=a[i];
for(i=0;i<=n;i++) /*A=b*/
A[i]=b[i];
}
for(i=0;i<n-m;i++) /*c的前(n-m)项为A的前(n-m)项*/
{
c[i].key=A[i].key;
c[i].num=A[i].num;
}
for(i=0;i<=m;i++) /*c的后m项为A、B之和*/
{
c[n-m+i].key=B[i].key;
c[n-m+i].num=A[n-m+i].num+B[i].num;
}
}
/*-------------------多项式的减法函数-------------------------------*/
void subs(exp a[],exp b[],exp c[])
/*多项式a和b相减,差存放在c中*/
{
int i,m,n; /*m存放二者最高次数较小的次数,n存放较大的次数*/
if(a[0].key==b[0].key) /*a、b次数相同时*/
{
for(i=0;i<=a[0].key;i++) /*c各项系数为指数相同的各项系数之差*/
{
c[i].key=a[i].key;
c[i].num=a[i].num-b[i].num;
}
return;
}
if(a[0].key>b[0].key) /*a的最高次数大于b时*/
{
m=b[0].key;
n=a[0].key;
for(i=0;i<n-m;i++) /*c的前(n-m)项为a的前(n-m)项*/
{
c[i].key=a[i].key;
c[i].num=a[i].num;
}
for(i=0;i<=m;i++) /*c的后m项为a、b之差*/
{
c[n-m+i].key=b[i].key;
c[n-m+i].num=a[n-m+i].num-b[i].num;
}
}
else /*a的最高次数小于b时*/
{
n=b[0].key;
m=a[0].key;
for(i=0;i<n-m;i++) /*c的前(n-m)项系数为a的前(n-m)项系数的相反数*/
{
c[i].key=b[i].key;
c[i].num=0-b[i].num;
}
for(i=0;i<=m;i++) /*c的后m项为a、b之差*/
{
c[n-m+i].key=a[i].key;
c[n-m+i].num=a[i].num-b[n-m+i].num;
}
}
}
/*############################主函数################################*/
void main(void)
{
int i,n;
char d;
exp a[100],b[100],c[100]; /*a存放第一个多项式,b存放第二个多项式,c存放结果*/
printf("*************************\n 一元多项式的加减计算\n*************************\n\n第一个多项式输入:\n");
cins(a); /*第一个多项式输入*/
printf("第二个多项式输入:\n");
cins(b); /*第二个多项式输入*/
printf("执行的运算(+/-):");
scanf("%s",&d); /*选择执行的运算*/
printf("=========================\n\n");
if(d=='+') adds(a,b,c); /*输入“+”,执行加法*/
else
if(d=='-') subs(a,b,c); /*输入“-”,执行减法*/
else /*否则,输入错误*/
{
printf("输入错误!\n");return;
}
printf("\n运算结果输出:\n");
printf("-------------------------\n");
printf("各项系数:\n");
printf("-------------------------\n");
n=c[0].key;
for(i=0;i<=n;i++) /*输出运算结果的各项系数*/
printf("%d次项系数: %d\n",n-i,c[i].num);
printf("\n-------------------------\n");
printf("表达式:\n");
printf("-------------------------\n");
printf("第一个多项式:");
couts(a); /*输出第一个多项式的表达式*/
printf("第二个多项式:");
couts(b); /*输出第二个多项式的表达式*/
printf("执 行 运 算:%c\n",d);
printf("运 算 结 果:");
couts(c); /*输出运算结果的表达式*/
printf("\n继续进行多项式计算(Y/N) ?");
scanf("%s",&d);
if(d=='Y'||d=='y')
{
printf("\n\n\n");
main();
}
else return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -