📄 一元稀疏多项式计算器.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#define OK 1;
#define READ(I) while (((I)=getchar())=='\n'); //读入合法字符
typedef int status;
typedef struct PolyNode
{
float coef;
int expn;
struct PolyNode *next;
}Poly,*P_Poly;
status CreatPoly(P_Poly *P_PolyHead,int n) //创建多项式链表
{ //为确保其他子函数正常运行,入口参数要求不含同类项、指数递减
int i=0;
P_Poly p,tail;
*P_PolyHead=(Poly*)malloc(sizeof(Poly));
(*P_PolyHead)->expn=n;
tail=*P_PolyHead;
printf ("请按照指数递减顺序输入最简形式的多项式\n");
for (;i<n;i++)
{
p=(Poly*)malloc(sizeof(Poly));
printf ("请输入第%d项的系数和指数(系数,指数):",i+1);
scanf ("%f,%d",&(p->coef),&(p->expn));
tail->next=p;
tail=p;
}
tail->next=NULL;
return OK;
}
void OutPutPoly(P_Poly PolyHead) //输出多项式
{
int i=0;
P_Poly p;
p=PolyHead->next;
for (;i<PolyHead->expn;i++)
{
if(PolyHead->next!=p)
{printf("+");}
printf("%f*X^%d",p->coef,p->expn);
p=p->next;
}
printf ("\n");
}
void AddPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) //求和
{
int i=0;
P_Poly p1,p2,p,tail;
p1=PolyHead1->next;
p2=PolyHead2->next;
*P_PolyHead=(P_Poly)malloc(sizeof(Poly));
p=tail=*P_PolyHead;
while(p1&&p2)
{
int e1,e2;
e1=p1->expn;
e2=p2->expn;
if (e1>e2)
{
p=(P_Poly)malloc(sizeof(Poly));
tail->next=p;
tail=p;
*p=*p1;
p1=p1->next;
i++;
}
else if(e1==e2&&e1!=0&&e2!=0)
{
float sum=p1->coef+p2->coef;
if (sum!=0.0)
{
p=(P_Poly)malloc(sizeof(Poly));
tail->next=p;
tail=p;
p->coef=sum;
p->expn=e1;
i++;
}
else if(sum=0.0)
{
p=(P_Poly)malloc(sizeof(Poly));
tail->next=p;
tail=p;
p->coef=sum;
p->expn=e1;
i++;
}
p1=p1->next;
p2=p2->next;
}
else if (e1<e2)
{
p=(P_Poly)malloc(sizeof(Poly));
tail->next=p;
tail=p;
*p=*p2;
p2=p2->next;
i++;
}
}
while (p1)
{
p=(Poly*)malloc(sizeof(Poly));
*p=*p1;
tail->next=p;
tail=p;
p1=p1->next;
i++;
}
while (p2)
{
p=(Poly*)malloc(sizeof(Poly));
*p=*p2;
tail->next=p;
tail=p;
p2=p2->next;
i++;
}
(*P_PolyHead)->expn=i;
tail->next=NULL;
}
void DecPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) //求差
{
int i=0;
P_Poly p1,p2,p,tail;
p1=PolyHead1->next;
p2=PolyHead2->next;
*P_PolyHead=(P_Poly)malloc(sizeof(Poly));
p=tail=*P_PolyHead;
while(p1&&p2)
{
int e1,e2;
e1=p1->expn;
e2=p2->expn;
if (e1>e2)
{
p=(P_Poly)malloc(sizeof(Poly));
tail->next=p;
tail=p;
*p=*p1;
p1=p1->next;
i++;
}
else if(e1==e2)
{
float dif=p1->coef-p2->coef;
if (dif!=0.0)
{
p=(P_Poly)malloc(sizeof(Poly));
tail->next=p;
tail=p;
p->coef=dif;
p->expn=e1;
i++;
}
p1=p1->next;
p2=p2->next;
}
else if (e1<e2)
{
p=(P_Poly)malloc(sizeof(Poly));
tail->next=p;
tail=p;
p->coef=-p2->coef;
p->expn=p2->expn;
p2=p2->next;
i++;
}
}
while (p1)
{
p=(Poly*)malloc(sizeof(Poly));
*p=*p1;
tail->next=p;
tail=p;
p1=p1->next;
i++;
}
while (p2)
{
p=(Poly*)malloc(sizeof(Poly));
*p=*p2;
tail->next=p;
tail=p;
p2=p2->next;
i++;
}
(*P_PolyHead)->expn=i;
tail->next=NULL;
}
/*void MulPolyn(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2)//求积
{
int i=0;
P_Poly p1,p2,p3,p4,p5,p,tail;
//p1=PolyHead1->next;
//p2=PolyHead2->next;
//*P_PolyHead=(P_Poly)malloc(sizeof(Poly));
//p=tail=*P_PolyHead;
p3=(P_Poly)malloc(sizeof(Poly));
p3->next=NULL;
p4=(P_Poly)malloc(sizeof(Poly));
p4->next=NULL;
for(p1=PolyHead1->next;p1;p1=p1->next)
{
for(p2=PolyHead2->next;p2;p2=p2->next)
{
p5=(P_Poly)malloc(sizeof(Poly));
p4->next=p5;
p5->coef=p1->coef*p2->coef;
p5->expn=p1->expn+p2->expn;
p5->next=NULL;
AddPoly(&p,p4,p3);
tail->next=p;
tail=p;
p->coef=p4->coef;
p->expn=p4->expn;
p1=p1->next;
p2=p2->next;
}
}
}
void Derivation(P_Poly* P_PolyHead,P_Poly PolyHead1)//求导数
{
int i=0;
P_Poly p1,p,tail;
p1=PolyHead1->next;
*P_PolyHead=(P_Poly)malloc(sizeof(Poly));
p=tail=*P_PolyHead;
for(;p1!=NULL;p1=p1->next)
{
p=(P_Poly)malloc(sizeof(Poly));
tail->next=p;
tail=p;
if(p1->expn==0)
p1->coef=0;
else
{ p1->coef=p1->coef*p1->expn;
p1->expn--;
}
*p=*p1;
i++;
}
}*/
void DelPoly(P_Poly* P_PolyHead) //删除并释放多项式
{
P_Poly p,prior;
p=prior=*P_PolyHead;
while (p->next)
{
p=p->next;
free(prior);
prior=p;
}
*P_PolyHead=NULL;
}
status main()
{
P_Poly PolyHead[26]={0};
char menu,name;
for (;;)
{
printf("================================================================\n");
printf(" 一元稀疏多项式计算器 \n");
printf("================================================================\n");
printf("-----制作人:黄子健\n");
printf("-----班别:04信息安全2班\n");
printf("-----学号:3104009066\n");
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 ("请选择指令:");
READ(menu)
switch (menu)
{
case '1':
{
int n;
printf ("请输入要创建的多项式名称(单个小写字母表示):");
READ(name)
if (NULL!=PolyHead[name-'a'])
{
printf ("此多项式已经存在!\n");
break;
}
printf ("请输入项数:");
scanf ("%d",&n);
if(CreatPoly(&PolyHead[name-'a'],n))
printf ("多项式%c创建完毕!\n",name);
} break;
case '2':
printf ("请输入要输出的多项式的名称:");
READ(name)
if (NULL==PolyHead[name-'a'])
{
printf ("此多项式不存在!\n");
break;
}
OutPutPoly(PolyHead[name-'a']);
break;
case '3':
{
char name1,name2;
printf ("请输入加式一的名称:");
READ(name1)
if (NULL==PolyHead[name1-'a'])
{
printf ("此多项式不存在!请先创建\n");
break;
}
printf ("请输入加式二的名称:");
READ(name2)
if (NULL==PolyHead[name2-'a'])
{
printf ("此多项式不存在!请先创建\n");
break;
}
printf ("请输入要创建的和式的名称:");
READ(name)
if (NULL!=PolyHead[name-'a'])
{
printf ("此多项式已经存在!\n");
break;
}
AddPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']);
OutPutPoly(PolyHead[name-'a']);
break;
}
case '4':
{
char name1,name2;
printf ("请输入被减式的名称:");
READ(name1)
if (NULL==PolyHead[name1-'a'])
{
printf ("此多项式不存在!请先创建\n");
break;
}
printf ("请输入减式的名称:");
READ(name2)
if (NULL==PolyHead[name2-'a'])
{
printf ("此多项式不存在!请先创建\n");
break;
}
printf ("请输入要创建的差式的名称:");
READ(name)
if (NULL!=PolyHead[name-'a'])
{
printf ("此多项式已经存在!\n");
break;
}
DecPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']);
OutPutPoly(PolyHead[name-'a']);
break;
}
case '5':
printf ("请输入要删除的多项式名称:");
READ(name)
if (NULL==PolyHead[name-'a'])
{
printf ("此多项式不存在!\n");
break;
}
DelPoly(&PolyHead[name-'a']);
printf ("多项式%c已删除!\n",name);
break;
case '6':
return OK;
/*case '7':
{
char name1;
printf("请输入求导数多项式的名称:");
READ(name1);
if (NULL==PolyHead[name1-'a'])
{
printf ("此多项式不存在!请先创建\n");
break;
}
/*printf("请输入乘式二的名称:");
READ(name2);
if (NULL==PolyHead[name2-'a'])
{
printf ("此多项式不存在!请先创建\n");
break;
}
printf ("请输入要创建的导数多项式的名称:");
READ(name)
if (NULL!=PolyHead[name-'a'])
{
printf ("此多项式已经存在!\n");
break;
}
Derivation(&PolyHead[name-'a'],PolyHead[name1-'a']);
OutPutPoly(PolyHead[name-'a']);
break;
} */
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -