将下面一元多次多项式程序增加一个赋值计算功能,即计算并输出多项式在指定x处的值。另,增加输入 系数或指数为字母时的报错功能。基础C语言
1条回答 默认 最新
- telephone007 2016-12-05 11:44关注
#include
#include
typedef struct node
{
float coef;
int expn;
struct node * next;
}PLOY;
void start()//用户选择界面 { printf("************************************\n");
printf(" 两个一元多项式的相加/相减/相乘\n");
printf("************************************\n");
printf("请选择操作:\n"); printf("0.退出\n");
printf("1.两个一元多项式相加\n");
printf("2.两个一元多项式相乘\n");
printf("3.两个一元多项式相减\n");
}
void insert(PLOY *head,PLOY *inpt)
{ PLOY *pre,*now;
int signal=0;
pre=head;
if(pre->next==NULL)
{
pre->next=inpt;
}
else
{
now=pre->next;
while(signal==0)
{
if(inpt->expnexpn)
{
if(now->next==NULL)
{
now->next=inpt;
signal=1;
}
else
{
pre=now;
now=pre->next;
}
}
else
if(inpt->expn>now->expn)
{
inpt->next=now;
pre->next=inpt;
signal=1;
}
else
{
now->coef=now->coef+inpt->coef;
signal=1;
free(inpt);
if(now->coef==0)
{
pre->next=now->next;
free(now);
}
}
}
}
}
PLOY *creat(char ch)
{
PLOY *head,*inpt;
float x;
int y;
head=(PLOY *)malloc(sizeof(PLOY));
head->next=NULL;
printf("请输入一元多项式%c:(格式是:系数 指数;以0 0 结束!)\n",ch);
scanf("%f %d",&x,&y);
while(x!=0)
{
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=x;
inpt->expn=y;
inpt->next=NULL;
insert(head,inpt);
printf("请输入一元多项式%c的下一项:(以0 0 结束!)\n",ch);
scanf("%f %d",&x,&y); }
return head; }
PLOY *addPLOY(PLOY *head,PLOY *pre)
{
PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;
else
{
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}
}
return head;
}
PLOY *minusPLOY(PLOY *head,PLOY *pre)
{ PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;
else
{
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=0-pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}
}
return head;
}
PLOY *byPLOY(PLOY *head1,PLOY *head2)
{
PLOY *inpt,*res,*pre;
int flag=0;
res=(PLOY *)malloc(sizeof(PLOY));
res->next=NULL;
head1=head1->next;
pre=head2;
while(flag==0)
{
if(pre->next==NULL)
{
pre=head2;
head1=head1->next;
continue;
}
if(head1==NULL)
{
flag=1;
continue;
}
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=pre->coef*head1->coef;
inpt->expn=pre->expn+head1->expn;
inpt->next=NULL;
insert(res,inpt);
}
return res;
}
void print(PLOY *fun)
{ PLOY *printing;
int flag=0;
printing=fun->next;
if(fun->next==NULL)
{
printf("0\n");
return;
}
while(flag==0)
{
if(printing->coef>0&&fun->next!=printing)
printf("+");
if(printing->coef==1);
else if(printing->coef==-1)
printf("-");
else
printf("%f",printing->coef);
if(printing->expn!=0)
printf("x^%d",printing->expn);
else if((printing->coef==1)||(printing->coef==-1))
printf("1");
if(printing->next==NULL)
flag=1;
else
printing=printing->next;
}
printf("\n");
}
void main()
{
PLOY *f,*g;
int sign=-1;
start();
while(sign!=0)
{
scanf("%d",&sign);
switch(sign)
{
case 0:
break;
case 1:
{
printf("你选择的操作是多项式相加:\n");
f=creat('f');
printf("f(x)=");
print(f);
g=creat('g');
printf("g(x)=");
print(g);
printf("F(x)=f(x)+g(x)=");
f=addPLOY(f,g);
print(f);
sign=-1;
start();
break;
}
case 2:
{
printf("你选择的操作是多项式相乘:\n");
f=creat('f');
printf("f(x)=");
print(f);
g=creat('g');
printf("g(x)=");
print(g);
printf("F(x)=f(x)*g(x)=");
f=byPLOY(f,g);
print(f);
sign=-1;
start();
break;
}
case 3:
{
printf("你选择的操作是多项式相减:\n");
f=creat('f');
printf("f(x)=");
print(f);
g=creat('g');
printf("g(x)=");
print(g);
printf("F(x)=f(x)-g(x)=");
f=minusPLOY(f,g);
print(f);
sign=-1;
start();
break;
}
case 4:
{
sign=-1;
start();
break;
}
default:
{
printf("输入有误!请重新选择操作!\n");
start();
break;
}
}
}
printf("谢谢使用!\n");
}本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码
- ¥15 ubuntu子系统密码忘记
- ¥15 保护模式-系统加载-段寄存器