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

📄 caltype.c

📁 即时计算加法
💻 C
字号:
/*
  Name:CalType.c
  Copyright:
  Author: 
  Date: 21-11-08 13:48
  Description:数学函数
*/

#include "includes.h"

extern Liner * CalLine_;
extern Lstack * CalStack_;
extern int ResFlag;
extern SET setREC [NUM_SET];//在这里引入这一数组是为了判断角度制
FTYPE FUNList [ FUN_NUM ];//读入的运算符列表

/*
  Function Name:calproc 
  Author: 
  Description:对指定的运算符代码进行计算,并返回计算结果 
*/

num calproc ( int calft ,Lstack * CalStack )
{	
	//calpro函数中必须将计算结果进栈并置numflag=1(须判断negflag),不包含当前元素退栈
	num x,y;//记录在栈非空情况下取到的待运算的数字(最多两个)
	num proResult;//用于临时存储计算结果
	switch(calft/10%10)      //十位数表示运算符目数
	{
		case 0:		//常数
			{
		
				switch(calft)
				{
				case pi__:
					{
							proResult = pi___();
							break;	
					}
				case e__:
					{
							proResult = e___();
							break;	
					}
				}
                break;
			}
		case 1:		//单目运算	(注意:十位数为1或3时均表示单目运算)
		case 3:
			{
				if(CalStack->Dtop-CalStack->Dstack==CalStack->StackLen)   
					Error(E_GE);			//若栈空,语法错误			
				else 
				     {	
                        x=*(--CalStack->Dtop);
                     }

				switch(calft)
				{
					case sin__:
						{
							proResult=sin_(x); 								  
							break;						
						}
					case cos__:
						{
							proResult=cos_(x);					  
							break;						
						}
					case tan__:
						{
							proResult=tan_(x);
							break;						
						}
					case cot__:
						{
							proResult=cot_(x);							 						  
							break;						
						}
					case sec__:
						{
							proResult=sec_(x);		
							break;						
						}
					case csc__:
						{
							proResult=csc_(x);
							break;						
						}
					case arcsin__:
						{
							proResult=arcsin_(x);
							break;						
						}
					case arccos__:
						{
							proResult=arccos_(x);
							break;									
						}
					case arctan__:
						{
							proResult=arctan_(x);
							break;						
						}
					case ln__:
						{
							proResult=ln_(x);
							break;						
						}
					case lg__:
						{
							proResult=lg_(x);
							break;						
						}
					case sinh__:
						{
							proResult=sinh_(x);
							break;						
						}
					case cosh__:
						{
							proResult=cosh_(x);
							break;						
						}
					case tanh__:
						{
							proResult=tanh_(x);
							break;						
						}
					case neg__:
						{
							proResult=neg_(x);
							break;
						}
					case sqrt__:
                        {
                            proResult=sqrt_(x);   
                            break; 
                        }
                    case n__:
                        {
                            proResult=n_(x);
                            break; 
                        }  
                              
				}//switch
				break;
			}//case 1:
		case 2:     //双目运算
			{
                if(CalStack->Dtop-CalStack->Dstack==CalStack->StackLen)  		
					Error(E_GE);			//若栈空,语法错误			
				else 
					x=*(--CalStack->Dtop);
                if(CalStack->Dtop-CalStack->Dstack==CalStack->StackLen)  		
					Error(E_GE);			//若栈空,语法错误			
				else 
					y=*(--CalStack->Dtop);

				switch(calft)
				{
					case  plus:
						{
							proResult=plus_(x,y);
							break;
						}
					case minus:
						{													
							proResult=minus_(y,x);  //必须是先进栈的数减去后进栈的数 
							break;					
						}
					case multi:
						 {
							proResult=multi_(x,y);
							break;
						 }
					case divide:                   
						 {
							proResult=divide_(y,x);  //必须是先进栈的数除以后进栈的数
							break;
						 }
					case ntime__:
						 {
							proResult=ntime_(y,x);  //必须是先进栈的数^后进栈的数
							break;
						 }
					case c__:
						 {
							proResult=c___(y,x);  //先进栈的数为底 
							break;
						 }
					case p__:
						 {
							proResult=p___(y,x);  //先进栈的数为底 
							break;
						 }
		            case nroot__:
                         {
							proResult=nroot_(y,x);  //先进栈的数开y次方 
							break;  
                         }                              
				}//switch
				break;
			}//case 2:
	}//switch
	return(proResult);
}

/*
  Function Name:ftype
  Author: 
  Description:用于转换运算符内码
*/

ftype funtype ( char * CalFUN )
{
	int i;//临时变量
	for ( i = 0 ; i < FUN_NUM ; ++i )
	{
		if ( strcmp( CalFUN , FUNList [i].Ftype ) == 0 )
		{
			return FUNList [i].Fnum ;//返回运算符内码
		}
	}
	return -1 ;//特殊的运算符,表示该运算符非法,返回此运算符的时候,应调用E_GE错误例程
}

/*
  Function Name:LoadFUN
  Author: 
  Description:读入运算符列表
*/

void LoadFUN ( void )
{
	FILE * funset = NULL ;//声明文件指针
	int i;//临时变量
	funset = fopen ( "OPER.BIN" , "rb" );//打开文件
	if ( funset == NULL )
	{
		Error ( E_FAIL_LOAD_SET );//未打开时的错误处理
	}
	else
	{
		for ( i = 0 ; i < FUN_NUM ; ++i )
		{
			fread( &(FUNList[i]) , sizeof ( FTYPE ) , 1 , funset );//读入文件内容
		}
	}
	/*
	for(i=0;i<23;i++)
	puts(FUNList[i].Ftype);
	getch();
	*/
}

/*
  Function Name:plus_
  Author: 
  Description:加法
*/

num plus_ ( num num1 , num num2 )
{
	return ( num1 + num2 );
}

/*
  Function Name:minus_
  Author: 
  Description:减法
*/

num minus_ ( num num1 , num num2 )
{
	return ( num1 - num2 );
}

/*
  Function Name:neg_
  Author: 
  Description:求相反数 
*/

num neg_ ( num num1 )
{
    return ( -num1 );
}

/*
  Function Name:multi_
  Author: 
  Description:乘法
*/

num multi_ ( num num1 , num num2 )
{
	return ( num1 * num2 );
}

/*
  Function Name:divide_
  Author: 
  Description:除法
*/

num divide_ ( num num1 , num num2 )
{
	if ( num2 == 0 )
	{
		Error ( E_GE );
	}
	else
	{
		return ( num1 / num2 );
	}
}

/*
  Function Name:sin_
  Author: 
  Description:正弦函数
*/

num sin_ ( num num1 )//正弦
{
	if ( setREC [1] == DEG )
	{
		return sin( num1 * PI / 180 );
	}
	else
	{
		return sin( num1 );
	}
}

/*
  Function Name:cos_
  Author: 
  Description:余弦函数
*/
num cos_ ( num num1 )
{
	if ( setREC [1] == DEG )
	{
		return cos ( num1 * PI / 180 );
	}
	else
	{
		return cos ( num1 );
	}
}

/*
  Function Name:tan_
  Author: 
  Description:正切函数
*/

num tan_ ( num num1 )
{
	if ( setREC [1] == DEG )
	{
          return tan ( num1 * PI / 180 );
	}
	else
	{
		     return tan ( num1 );
	}
}

/*
  Function Name:cot_
  Author: 
  Description:余切函数
*/

num cot_ ( num num1 )
{
    return (divide_(1,tan_(num1))); //modified by  
}

/*
  Function Name:sec_
  Author: 
  Description:正割函数
*/

num sec_ ( num num1 )
{
	if ( setREC [1] == DEG )
	{
		return 1.0 / ( cos ( num1 * PI / 180 ));
	}
	else
	{
		return 1.0 / ( cos ( num1 ));
	}
}

/*
  Function Name:csc_
  Author: 
  Description:余割
*/

num csc_ ( num num1 )
{
	if ( setREC [1] == DEG )
	{
		return 1.0 / ( sin ( num1 * PI / 180 ));
	}
	else
	{
		return 1.0 / ( sin ( num1 ));
	}
}

/*
  Function Name:arcsin_ 
  Author: 
  Description:反正弦 
*/

num arcsin_ ( num num1 )
{
    if(num1>1||num1<-1)
           Error ( E_GE );
	else
        if ( setREC [1] == DEG )
    	{
    		return ( asin ( num1  )* 180 / PI);
    	}
    	else
    	{
    		return ( asin ( num1 ));
    	}
}

/*
  Function Name:arccos_ 
  Author: 
  Description:反余弦 
*/

num arccos_ ( num num1 )
{
    if(num1>1||num1<-1)
           Error ( E_GE );
	else
        if ( setREC [1] == DEG )
    	{
    		return ( acos ( num1  )* 180 / PI);
    	}
    	else
    	{
    		return ( acos ( num1 ));
    	}
}

/*
  Function Name:arctan_ 
  Author: 
  Description:反正切 
*/

num arctan_ ( num num1 )
{
        if ( setREC [1] == DEG )
    	{
    		return ( atan ( num1  )* 180 / PI);
    	}
    	else
    	{
    		return ( atan ( num1 ));
    	}
}

/*
  Function Name:ln_ 
  Author: 
  Description:自然对数 
*/

num ln_ ( num num1 )
{
	if ( num1 <= 0 )
	{
		Error ( E_GE );
	}
	else
	{
		return log( num1 );
	}
}

/*
  Function Name:lg_ 
  Author: 
  Description:常用对数 log10 
*/

num lg_ ( num num1 )
{
	if ( num1 <= 0 )
	{
		Error ( E_GE );
	}
	else
	{
		return log10( num1 );
	}
}

/*
  Function Name:sinh_ 
  Author: 
  Description:双曲正弦 
*/

num sinh_ ( num num1 )
{
		return sinh( num1 );
}

/*
  Function Name:cosh_ 
  Author: 
  Description:双曲余弦
*/

num cosh_ ( num num1 )
{
		return cosh( num1 );
}

/*
  Function Name:tanh_ 
  Author: 
  Description:双曲正切
*/ 

num tanh_ ( num num1 )
{
		return tanh( num1 );
}

/*
  Function Name:sqrt_ 
  Author: 
  Description:开二次方
*/ 

num sqrt_ ( num num1 )
{
	if ( num1 < 0 )
	{
		Error ( E_GE );
	}
	else
	{
		return sqrt( num1 );
	}
}

/*
  Function Name:n_
  Author: 
  Description:阶乘
*/
int n_ ( num num1 )
{
	int Tnum1 , i , s = 1;
	Tnum1 = ( int ) num1;
	if ( Tnum1 < 0 )
	{
		Error ( E_GE );
		return 0;
	}
	for ( i = 1 ; i<= Tnum1 ; ++i )
	{
		s *= i;
	}
	return s;
}

/*
  Function Name:ntime_ 
  Author: 
  Description:幂
*/

num ntime_ ( num num1,num num2 )
{
    num temp;
    temp=pow(num1,num2);
   // if(temp<(- 1.79769e+308 )||temp>( 1.79769e+308 )) //数据溢出,说明出现了运算数不合法的情况 比如,(-2)^(2.25) 
         	//Error ( E_GE );
   	//else 
       return temp;
}

/*
  Function Name:c_
  Author: 
  Description:组合
*/
int c___ ( num num1 , num num2 )
{
	int Tnum1 , Tnum2;//临时变量
	Tnum1 = ( int ) num1;
	Tnum2 = ( int ) num2;
	if ( Tnum1 < 0 || Tnum2 < 0 || Tnum1 < Tnum2 )
	{
		Error ( E_GE );
		free ( CalLine_ );
		free ( CalStack_ );
		return 0;
	}
    return( p___( Tnum1 , Tnum2 )/n_( Tnum2 ));//return ( n_ ( Tnum1 ) / n_ ( Tnum1 ) / n_ ( Tnum1 - Tnum2 )); //modified by 
}

/*
  Function Name:p_
  Author: 
  Description:排列
*/
int p___ ( num num1 , num num2 )
{
	int Tnum1 , Tnum2;//临时变量
	Tnum1 = ( int ) num1;
	Tnum2 = ( int ) num2;
	if ( Tnum1 < 0 || Tnum2 < 0 || Tnum1 < Tnum2 )
	{
		Error ( E_GE );
		free ( CalLine_ );
		free ( CalStack_ );
		return 0;
	}
	else
	{
		return ( n_ ( Tnum1 ) / n_ ( Tnum1 - Tnum2 ));
	}
}

/*
  Function Name:nroot_ 
  Author: 
  Description:开x次方,第一个参数为被开x次方数
*/

num nroot_ ( num num1,num num2 )
{
		return ntime_(num2,divide_(1,num1));
}

/*
  Function Name:pi_
  Author: 
  Description:圆周率
*/
num pi___ ( void )
{
	return PI ;
}

/*
  Function Name:e___
  Author: 
  Description:自然底
*/

num e___ ( void )
{
	return E ;
}

⌨️ 快捷键说明

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