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

📄 countclass.cpp

📁 能运算的函数: sin,cos,tg,ctg,e^,pow(x,y),cosh,sinh,tgh,log10,ln,sqrt,arcsin,arccos, 运算方式: +,-,*,/,绝对值(“[
💻 CPP
字号:

#include "stdafx.h"
#define pi 3.1415926535897932384626433832795

#include  "StrToUnionClass.h"
#include <math.h>
#include <stdlib.h>

CountClass::CountClass(struct strData *head)
{
	phead=p=head ;

}
///////////////////////////////////////////////////////////////////
/////  5+(-5+(-6+55))+(454*34-5)
////   5+(-5+49)+(454*34-5)

void CountClass::OnSLOVE() 
{   
    struct strData		*fabs_left,*left ;//记下左[和(
	int					nadd=0, naddFabs=0 ;//标记()[]中字符的长度
	double				 dTemp=0 ;//一个放数据的临时地方  

	for(  ;  p-> next !=NULL  ; (dTemp==0)?p=p-> next: p)
   {   //for 	    
	   dTemp = 0  ;
	   if( p-> cChar == '[')   { fabs_left=p ;  naddFabs=0 ; }  // 记住左绝对值的指针,naddFabs记下[]中的长度
	   if( p-> cChar == '(')   { left=p ;  nadd=0 ; }        // 记住左括号的指针,记下()中的长度
	   naddFabs++, nadd++ ;
	  
		/////////////////////////求一个最里层的括号或绝对值//////////////////////////
        if(p-> cChar == ')'||p-> cChar == ']')//nadd !=0标记了进入这个if
		{	//if1
			
		    dTemp=1  ;   //dTemp=0 或不用这条语句,答案就不对了 why???
		    if(p-> cChar == ']')   { nadd = naddFabs ; left = fabs_left ; } // left=fabs_left ;  //长度,指针 统一给nadd,
		     	 
		    if(nadd>3)  //sin(3)  刚好三位 即括号内还要计算
			{   			
				 SiSlove(left-> next) ;	//调用函数计算最内层()[]中的表达式			
			} 
	
            if(p-> cChar == ']') left -> next -> dDouble =fabs(left -> next -> dDouble ) ;    //计算绝对值
			  	///在这里为止,括号中只有一个数了
          
		    if( left -> before != NULL && left -> before -> cChar >='H' && left -> before -> cChar <= 'S')    //left 的前一个cChar是一个表示函数的符号
			  {//if2     求函数值 把结果替换掉函数名           
				  dTemp=Fun_switch(left -> next -> dDouble,left-> before -> cChar ) ;   //求函数值
				  left-> before-> nCharDouble =0 ;//是一个数
				  left-> before-> cChar =' ' ;
				  left-> before-> dDouble = dTemp ;//用这些取代函数名
             ///去掉(*)[] 中的东西, 以下再改变指针
				  
				  left-> before-> next =p-> next  ;
				  p=p-> next -> before =left-> before ;
					  		  
			  }//end if 2
			   
			  else //括号前没有函数名
			  {//else 
				  
				  left-> nCharDouble =0 ;//是一个数
				  left-> cChar =' ' ;
				  left-> dDouble = left-> next -> dDouble  ;//用这个数取代 ( or [				  
			      left-> next =p-> next  ;
				  p=p-> next -> before =left  ;			  
				 

			  }//end if
             while(p!=phead)//向前找一个 ( or [
			 {   p=p-> before ;
				 if(p-> cChar == '(' || p-> cChar == '[')break ;
			 }
		}//end if 1

		}//end for	

	SiSlove(phead) ;//把最后没有括号 的表达式再计算一下
 
}

void CountClass::SiSlove(struct  strData *left)
{
    struct strData		*first ;//left 固定,first 移动	
	int					i ;
	double				add ;    

    for(first=left ;first-> cChar !=')' && first-> cChar !=']' && first-> next != NULL ;)//计算 *  /  ^  !  剩下的累加
	{
		
		switch(first-> cChar)
		 {

	       	case '^': //计算+2^3-,为+8-
		    	first-> before -> dDouble =pow(first-> before -> dDouble ,first-> next -> dDouble ) ; 
				first-> before -> next = first-> next -> next ;
				first-> next-> next  -> before = first-> before ;
				first = first-> next -> next ;
				break ;
			case '!'://计算-2!+, 为-2+
				for( i=1, add=1 ;i<=(int)first-> before -> dDouble  ;i++) add=add*i ;
				first-> before -> dDouble =add ;
				first-> before -> next =first-> next  ;
				first-> next -> before =first-> before  ;
				first=first-> next  ;
				break ;
		    case '*' : //计算 -2*5+ 为-10+ 
				 first-> before ->  dDouble =first-> before ->  dDouble * first-> next -> dDouble  ;
				 first-> before -> next =first-> next -> next  ;
				 first-> next -> next-> before =first-> before ;
				 first=first-> next -> next ;
				 break ;
            case '/' : //计算 -10/2+ 为-5+ 
	             first-> before ->  dDouble =first-> before ->  dDouble / first-> next -> dDouble  ;
				 first-> before -> next =first-> next -> next  ;
				 first-> next -> next-> before =first-> before ;
				 first=first-> next -> next ;
	             break ;
			default :
				 first=first-> next ;
				 break ;
		}
	}

	first=left ;
	if(first-> cChar == '-') //-w+32 为 q+32  q为-w  第一个是负号的处理
	{
      first-> nCharDouble =0  ;
	  first-> cChar =' ' ;
	  first-> dDouble =-1*first-> next -> dDouble  ;
	  first-> next =first-> next -> next  ;
	  first-> next -> next-> before =first ;
	}
    //计算加减
     for(first=left ;first-> cChar !=')' && first-> cChar !=']' && first-> next != NULL ;first=first-> next )//+ -
	 {
		  if(first ->  cChar == '-') left-> dDouble =left-> dDouble - first-> next -> dDouble  ;
		  if(first ->  cChar == '+') left-> dDouble =left-> dDouble + first-> next -> dDouble  ;
	 }

}



double CountClass::Fun_switch(double dkuo,char Funhuhao )
{
    switch(Funhuhao)
	{
      case 'H' : return  sin(dkuo) ;  
	 case 'I' : return  cos(dkuo) ;
	 case 'J' : mistake(Funhuhao,dkuo);  return  tan(dkuo) ;
	 case 'K' : mistake(Funhuhao,dkuo);  return  1.0/tan(dkuo) ;    
	 case 'L' : return  sinh(dkuo) ; 
	 case 'M' : return  cosh(dkuo) ; 
	 case 'N' : return  tanh(dkuo) ;
	 case 'O' : mistake(Funhuhao,dkuo);  return  asin(dkuo) ;
	 case 'P' : mistake(Funhuhao,dkuo);  return  acos(dkuo) ;
	 case 'Q' : mistake(Funhuhao,dkuo);  return  log10(dkuo) ;
	 case 'R' : mistake(Funhuhao,dkuo);  return  log(dkuo) ;
	 case 'S' : mistake(Funhuhao,dkuo);  return  sqrt(dkuo) ;  
	}
	                
}

void CountClass::mistake(char cfun,double dkuo)
{
//	cout<< "text error";
	double dfun=dkuo;
	switch(cfun)
	{
	case 'J' :  if(fabs(dfun/pi-(long)(dfun/pi)-0.5)<=0.0000000001) 
		::AfxMessageBox("error  : tg的定义不对,x!=π/2±k*π,k∈Z,请检查!!");break;// dkou/pi是0.5 1.5 2.5 
	case 'K' : if(fabs(dfun/pi-(long)(dfun/pi))<=0.0000000001) 
		::AfxMessageBox("error  : ctg的定义不对,x!=k*π,k∈Z,请检查!!");break;// dkou/pi是0 1.0 2.0
	case 'O' :if(fabs(dfun)>1) 
		::AfxMessageBox("error  : asin的定义大于1,不对,请检查!!");break;//
	case 'P' :if(fabs(dfun)>1) 
		::AfxMessageBox("error  : acos的定义大于1,不对-1<x<1,请检查!!");break;//
	case 'Q' :if(dfun<0) 
		::AfxMessageBox("error  : lg的定义小于0,不对 x>0,请检查!!");break;//
	case 'R' :if(dfun<0) 
		::AfxMessageBox("error  : log的定义小于0,不对 x>0,请检查!!");break;//
	case 'S' :if(dfun<0) 
		::AfxMessageBox("error  : sqrt的定义小于0,不对 x>0,请检查!!");break;//
	}

	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -