📄 polycalculator.cpp
字号:
1,1,1,1,0,2,0,
1,1,1,1,2,0,0,
1,1,1,1,1,1,3}; //优先级s>=p就返回0,优先级s<p就返回1,左右括号相遇时就返回2,#和#相遇就返回3
return (table[b1][a1]);
}
/* ******************************************************************** */
void Operate(char a,char c,char b)
{
int a1=a-'0',b1=b-'0';
if( c=='+') addpoly(P[a1],P[b1],P[0]);
else if(c=='-') subpoly(P[a1],P[b1],P[0]);
else if(c=='*') multipoly(P[a1],P[b1],P[0]);
else if(c=='/') divpoly(P[a1],P[b1],P[0],P[20]);
}
/* ******************************************************************** */
void polydiffer(linkpoly P,int n,linkpoly &P1)
{ //对多项式P求n介导
linkpoly p=P->next,rear;
int i;
P1=new polynode;
P1->expn=MAXINT;
P1->next=NULL;
rear=P1; // initialize P1
while(p&&p->expn>=n)
{
rear->next=new polynode;//apply for new node
rear=rear->next;
rear->coef=p->coef;
rear->expn=p->expn;//copy node
for(i=n;i>0;i--)
{
rear->coef=rear->coef*rear->expn;
rear->expn--;
}
p=p->next;
}
rear->next=NULL;
}
/* ******************************************************************** */
void polyintegral1(linkpoly P,linkpoly &P1)
{
//不定积分
linkpoly p=P->next,rear;
P1=new polynode;
P1->expn=MAXINT;
P1->next=NULL;
rear=P1; // initialize P1
while(p)
{
rear->next=new polynode;//apply for new node
rear=rear->next;
rear->coef=p->coef;
rear->expn=p->expn;//copy node
rear->coef=rear->coef/(rear->expn+1);
rear->expn++;
p=p->next;
}
rear->next=NULL;
}
/* ******************************************************************** */
float polyintegral2(linkpoly P,float down,float up)
{//计算从down 到up的定积分并返回结果
linkpoly tempt;
float result;
polyintegral1(P,tempt);
result=calculate(tempt,up)-calculate(tempt,down);
clean(tempt);
//free (tempt);
return result;
}
/* ******************************************************************** */
void polypower(linkpoly P,int n,linkpoly &P1)
{//对P做n次的乘方
if(n<=0) cout<<"n必须大于0"; return;
linkpoly p=P->next,rear;
int i;
P1=new polynode;
P1->expn=MAXINT;
P1->next=NULL;
rear=P1; // initialize P1
for(i=n;i>0;i--)
{
multipoly(P,P,P1);
}
}
/* ******************************************************************** */
//void destroypoly()
/* ******************************************************************** */
void mixcompute()
{
int i=0,flag;
char f[80]={'\0'},*p=f,ch,a='\0',b='\0',c='\0';//p 是指向计算式的指针 ch 接受字符 a&b是操作数 c是运算符。
linkstack S_poly=NULL,S_op=NULL;
printf("请输入算式,以'#'字符结束输入:\n");
while((ch=getchar())!='#')
{
f[i]=ch;
i++;
}
f[i]='#';//输入算式
push(S_op,'#');
while(1)
{
if(*p>='0'&&*p<='9') push(S_poly,*p);//若是 操作数入操作数栈
else if(*p=='(') push(S_op,*p); //左括号直接入栈
else if(ISOP(*p))
{
//if(*p=='(') push(S_op,*p); //左括号直接入栈
flag=checktable(S_op->data,*p);//判断优先级
while(flag==0)
{
pop(S_poly,a);
pop(S_poly,b);
pop(S_op,c);
Operate(a,c,b);//栈顶优先级高于未入栈的 则运算
push(S_poly,'0');//规定用p[0]存放混合运算的结果。
flag=checktable(S_op->data,*p);
}
if(flag==1)
push(S_op,*p);//栈顶优先级低于未入栈的 则运算符入栈
if(flag==2)
pop(S_op,a);//括号相遇就消除之
if(flag==3)
return;
}//else if
/*switch(flag)
{
case 0:
{
pop(S_poly,a);
pop(S_poly,b);
pop(S_op,c);
Operate(a,c,b);//栈顶优先级高于未入栈的 则运算
push(S_poly,'0');//规定用p[0]存放混合运算的结果。
break;
}
case 1:
{
push(S_op,*p);break;//栈顶优先级低于未入栈的 则运算符入栈
}
case 2:
{
pop(S_op,a);break;//括号相遇就消除之
}
case 3:
{
return;
}//如果#和#相遇就break
}//switch */
p++;
}//while
}
/* ******************************************************************** */
void main()
{
//test();
int select;
int i;
cout<<"------------多项式处理程序--------------------\n";
while(1)
{
cout<<"-------------"<<"菜单选项"<<"---------------\n"
<<"1" <<"创建多项式\n"
<<"2"<< "显示多项式\n"
<<"3"<<"销毁多项式\n"
<<"4"<< "多项式求值 返回结果\n"
<<"5"<< "多项式相加 p1+p2放入指定的多项式中\n"
<<"6" << "多项式相减 p1-p2放入指定的多项式中\n"
<<"7" << "多项式相乘 p1×p2放入指定的多项式中\n"
<<"8" << "多项式相除 p1/p2放入指定的多项式中\n"
<<"9"<<"多项式乘方 对p做n次的乘方运算放入指定的多项式中\n"
<<"10"<<"多项式求导 对p求n阶导放入指定的多项式中\n"
<<"11"<<"多项式不定积分 对p做不定积分放入指定的多项式中\n"
<<"12"<<"多项式定积分 对p做从a到b定积分并显示结果\n"
<<"13" << "多项式混合运算,混合预算的结果在P0中,余数在P20中\n"
<<"0" <<"退出\n";
cin>>select;
switch(select)
{
case 1 :
{
cout<<"创建多项式 请指定多项式的存放位置 输入"<<"1--20:\n";
cin>>i;
while(!Polyempty(P[i]))
{
cout<<"该空间已被占用 请重新输入:\n";
cin>>i;
}
creatpoly(P[i]);
showpoly(P[i]);
cout<<"\n";
break;
}
case 2:
{
cout<<"显示多项式,请指定要显示的多项式,输入1--20,输入0显示全部。\n";
cin>>i;
if(i!=0)
{
if(P[i])
{
showpoly(P[i]);
cout<<"\n";
}
else cout<<"空值\n";
}
else if(i==0)
{
for(i=1;i<20;i++)
{
if(P[i]!=NULL)
showpoly(P[i]);
else
cout<<"空值\n";
}//for
}//else if
else
cout<<"error!!";
break;
}//case 2
case 3:
{
int i;
cout<<"请指定要清空的多项式 "<<"1--20:\n";
cin>>i;
clean(P[i]);
cout<<"清空操作完成\n";
}
case 4:
{
int i;
float x,result;
cout<<"请输入求值的多项式编号,1---20:\n";
cin>>i;
cout<<"请输入x的值\n";
cin>>x;
result=calculate(P[i],x);
cout<<"\nx="<<x<<"时,P"<<i<<"取值为 "<<result<<"\n";
break;
}
case 5:
{
int a,b,c;
cout<<"请输入相加的两个多项式编号(1--20)\n";
cin>>a>>b;
cout<<"请输入和式存放的位置\n";
cin>>c;
while(!Polyempty(P[c]))
{
cout<<"该空间已被占用 请重新输入:\n";
cin>>c;
}
addpoly(P[a],P[b],P[c]);
cout<<"加法操作完成,结果是\n";
showpoly(P[c]);
break;
}
case 6:
{
int a,b,c;
cout<<"请输入相减的两个多项式编号(1--20)\n";
cin>>a>>b;
cout<<"请输入差式存放的位置\n";
cin>>c;
while(!Polyempty(P[c]))
{
cout<<"该空间已被占用 请重新输入:\n";
cin>>c;
}
subpoly(P[a],P[b],P[c]);
cout<<"减法操作完成\n";
showpoly(P[c]);
break;
}
case 7:
{
int a,b,c;
cout<<"请输入相乘的两个多项式编号(1--20)\n";
cin>>a>>b;
cout<<"请输入结果存放的位置\n";
cin>>c;
while(!Polyempty(P[c]))
{
cout<<"该空间已被占用 请重新输入:\n";
cin>>c;
}
multipoly(P[a],P[b],P[c]);
cout<<"乘法操作完成,结果是\n";
showpoly(P[c]);
break;
}
case 8:
{
int a,b,c,d;
cout<<"请输入相除的两个多项式编号(1--20)\n";
cin>>a>>b;
cout<<"请输入商和余数存放的位置\n商式: ";
cin>>c;
while(!Polyempty(P[c]))
{
cout<<"该空间已被占用 请重新输入:\n";
cin>>c;
}
cout<<"余数: ";
cin>>d;
while(!Polyempty(P[d]))
{
cout<<"该空间已被占用 请重新输入:\n";
cin>>d;
}
divpoly(P[a],P[b],P[c],P[d]);
cout<<"除法操作完成\n";
cout<<"商为: ";
showpoly(P[c]);
cout<<"\n";
cout<<"余数为: ";
showpoly(P[d]);
cout<<"\n";
break;
}
case 9:
{
int i,i2,n;
cout<<"请输入乘方运算的多项式编号(1--20)\n";
cin>>i;
cout<<"请输入乘方次数\n";
cin>>n;
cout<<"请输入结果存放的位置\n";
cin>>i2;
while(!Polyempty(P[i2]))
{
cout<<"该空间已被占用 请重新输入:\n";
cin>>i2;
}
polypower(P[i],n,P[i2]);
cout<<"乘方操作完成 结果是:\n";
showpoly(P[i2]);
break;
}
case 10:
{
int i,n,i2;
cout<<"请输入求导运算的多项式编号"<<"1--20:\n";
cin>>i;
cout<<"请输入求导的次数"<<"1--20:\n";
cin>>n;
cout<<"请指定结果存放的位置 "<<"1--20:\n";
cin>>i2;
while(!Polyempty(P[i2]))
{
cout<<"该空间已被占用 请重新输入:\n";
cin>>i2;
}
polydiffer(P[i],n,P[i2]);
cout<<"求导操作完成 结果是\n";
showpoly(P[i2]);
break;
}
case 11:
{
int i,i2;
cout<<"请输入求不定积分的多项式的编号"<<"1--20:\n";
cin>>i;
cout<<"请指定结果存放的位置 "<<"1--20:\n";
cin>>i2;
while(!Polyempty(P[i2]))
{
cout<<"该空间已被占用 请重新输入:\n";
cin>>i2;
}
polyintegral1(P[i],P[i2]);
cout<<"积分操作完成 结果是\n";
showpoly(P[i2]);
break;
}
case 12:
{
int i;
float up,down,result;
cout<<"请输入求定积分的多项式的编号"<<"1--20:\n";
cin>>i;
cout<<"请输入下限和上限:\n下限:";
cin>>down;
cout<<"\n上限:";
cin>>up;
result=polyintegral2(P[i],down,up);
cout<<"多项式P"<<i<<"从"<<down<<"到"<<up<<"的积分值为\n"<<result;
cout<<"\n";
break;
}
case 13:
{
mixcompute();
printf("混合运算完成 结果是\n");
showpoly(P[0]);
//showpoly(P[20]);
break;
}
case 0:
{
return;
}
}//switch
}//while
}//main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -