⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 polycalculator.cpp

📁 一个多项式运算程序 实现多项式的加 减 乘除 乘方 积分 微分 混合运算 一个二叉树运算程序 实现二叉树的创建 复制 深度计算 和树形显示 一个哈夫曼算法的演示程序 实现对电文的编码 编码的输出
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					  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 + -