📄 countclass.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 + -