////////////////////////////////////////////////////////
//////////////////////////////////////////////////////
if(ErrorMark!=1&&BracketNumber1!=0)
{
ErrorMark=1;
if(BracketNumber1<0)
Add(ErrorInformation," !! 出错位置 未知: 是否忘记 \" ( \" ?\r\n");
else if(BracketNumber1>0)
Add(ErrorInformation," !! 出错位置 未知: 是否忘记 \" ) \" ?\r\n");
}
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
///////////the main process////////////////////////////////////////
if(!ErrorMark)///如果没有错误发生
{ for(arrayOffset=0;*(addr+arrayOffset)!='\0';arrayOffset++)
//对整个字符串扫描
{
if ( IsFigure(addr+arrayOffset))// 如果是数字
{
pp->value[pp->valueOffset]=atof(addr+arrayOffset);
//把值压入数值堆栈
pp->valueOffset++;
//并使数值偏移量++
for(;IsFigure(addr+arrayOffset);arrayOffset++);
//把字符串偏移量定位到非数值位置
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset)=='('//能够处理 像29(2+7)这种省略*的表达式
||*(addr+arrayOffset)>=0x10&&*(addr+arrayOffset)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
arrayOffset--;
//程式在此停止,进入for循环并使字符串偏移量++
//这时字符串已经离开非数值区
//所以字符串偏移量要--
}
else if ( IsSign(addr+arrayOffset))
//如果是运算符//// + - * / ^ ) =
{
/////////////////////////////////////////////////////////////
if(IsSign(addr+arrayOffset+1)//判断是否有 /////
&&*(addr+arrayOffset)!=')')//多余的运算符////
{sprintf(temp," !! 出错位置 %2d: 运算符" /////
" \" %c \" 多余\r\n", /////
addr+oo+arrayOffset-Expression+1,*(addr+arrayOffset));/////
Add(ErrorInformation,temp); /////
//跟踪错误位置 /////
ErrorMark=1;break;} /////
/////////////////////////////////////////////////////////////
s=*(addr+arrayOffset);
//并且判断该运算符是否为),如果是,计算完后,使函数返回值
if (pp->sign[0]=='\0'&&s!=')')
//为了能够进行运算符优先级的比较
//运算符堆栈的首位不能为NULL
{ pp->sign[pp->signOffset]=s;
pp->signOffset++; }
///////////////////////////////////////////////////////////////
else
{ if( OperaterPriority(addr+arrayOffset)>
OperaterPriority(&pp->sign[pp->signOffset-1])
&&pp->sign[0]!=0)
//判断运算符号优先级,如果后一运算符>前一运算符
{ pp->sign[pp->signOffset]=s; //运算符进栈
pp->signOffset++; //运算符偏移量++
}/////////////////////////////////////////////
else
//否则后一运算符《前一运算符,这时进行计算
{ pp->valueOffset--;
pp->signOffset--;
//定位运算符和数值到有效位置
while(OperaterPriority(&s)<=
OperaterPriority(&pp->sign[pp->signOffset])
&&pp->valueOffset>=1)
//进入计算循环
{pp->value[pp->valueOffset-1]=
CalculateAB//二目运算操作函数
(pp->value[pp->valueOffset-1],
pp->value[pp->valueOffset],&pp->sign[pp->signOffset]);
///////////////////////////////////////////////////////////////
pp->sign[pp->signOffset]='\0';
pp->value[pp->valueOffset]='\0';
pp->valueOffset--;
pp->signOffset--;
}///离开计算//循环结束后
pp->valueOffset++;
pp->signOffset++; //各偏移量恢复
arrayOffset--;
if(s==')')return pp->value[0];
//如果是),表示新的计算过程完毕,返回结果值
}
}
}
//////////////////////////////////////////////////////////////////
else if ( *(addr+arrayOffset)=='(' )
//如果遇到(表示新的计算过程发生,
{pp->value[pp->valueOffset]=
CalculateExpression(addr+arrayOffset+1,0);//递归调用,进行递归
pp->valueOffset++;
///////////////////前次遇到了(,这次就要把字符串定位到相应的)处
for(;*(addr+arrayOffset)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++; }
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0&&signal)return pp->value[0];
///判断该调用是否为单目运算调用,检测signal的值
else if(BracketNumber==0)break;}
}
//////////////////////////////////////找到了相应的),)定位过程
}
/////////////////////////////////////////////////////////////////
///单目运算符处理过程sin cos tg ctg ln log sqrt ////////////////
else if(*(addr+arrayOffset)==0x10)
{ if(!IsFigure(addr+arrayOffset+1))
///如果下一个字符非数字,进行单目运算符的递归运算
{pp->value[pp->valueOffset]=
sin(CalculateExpression(addr+arrayOffset+1,1)*PI/180);
pp->valueOffset++;//这时signal标志为1
//////////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset)!='\0';arrayOffset++)
{if(*(addr+arrayOffset)=='(')
{BracketNumber++;}
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}//////////////////////////////////////////////
}
else
{///否则是数字
pp->value[pp->valueOffset]=
sin(atof(addr+arrayOffset+1)*PI/180);
pp->valueOffset++;
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);///定位到非数字
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
else if(*(addr+arrayOffset)==0x11)
{ if(!IsFigure(addr+arrayOffset+1))
{ pp->value[pp->valueOffset]=
cos(CalculateExpression(addr+arrayOffset+1,1)*PI/180);////
pp->valueOffset++; ////
///////////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++;}
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}
///////////////////////////////////////////////////////////////////
}
else
{pp->value[pp->valueOffset]=
cos(atof(addr+arrayOffset+1)*PI/180);
pp->valueOffset++;/////////////////////////////
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
else if(*(addr+arrayOffset)==0x12)
{ if(!IsFigure(addr+arrayOffset+1))
{pp->value[pp->valueOffset]=
tan(CalculateExpression(addr+arrayOffset+1,1)*PI/180);
pp->valueOffset++;
/////////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{BracketNumber++;}
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break;}
}
//////////////////////////////////////////////////////////////
}
else
{pp->value[pp->valueOffset]=
tan(atof(addr+arrayOffset+1)*PI/180);
pp->valueOffset++;
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
else if(*(addr+arrayOffset)==0x13)
{ if(!IsFigure(addr+arrayOffset+1))
{pp->value[pp->valueOffset]=
1/tan(CalculateExpression(addr+arrayOffset+1,1)*PI/180);
pp->valueOffset++;
///////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++; }
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}/////////////////////////////////////////////
}//////////////////////////////////////////
else
{pp->value[pp->valueOffset]=
1/tan(atof(addr+arrayOffset+1)*PI/180);
pp->valueOffset++;
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
else if(*(addr+arrayOffset)==0x14)
{ if(!IsFigure(addr+arrayOffset+1))
{pp->value[pp->valueOffset]=
log(CalculateExpression(addr+arrayOffset+1,1));
pp->valueOffset++;
////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++; }
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}////////////////////////////////////////////
}
else
{pp->value[pp->valueOffset]=
log(atof(addr+arrayOffset+1));
pp->valueOffset++;
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
else if(*(addr+arrayOffset)==0x15)
{ if(!IsFigure(addr+arrayOffset+1))
{pp->value[pp->valueOffset]=
log10(CalculateExpression(addr+arrayOffset+1,1));
pp->valueOffset++;
////////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)////////
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++; }
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}///////////////////////////////////////////////////
}
else
{pp->value[pp->valueOffset]=
log10(atof(addr+arrayOffset+1));
pp->valueOffset++;////////////////////////////////
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
else if(*(addr+arrayOffset)==0x16)
{ if(!IsFigure(addr+arrayOffset+1))
{pp->value[pp->valueOffset]=
sqrt(CalculateExpression(addr+arrayOffset+1,1));
pp->valueOffset++;////////////////////////////////
////////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++; }
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}
/////////////////////////////////////////////////////////////////
}
else
{pp->value[pp->valueOffset]=
sqrt(atof(addr+arrayOffset+1));
pp->valueOffset++;
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}////////////////////////////////////////////
else if(*(addr+arrayOffset)==0x17)
{ if(!IsFigure(addr+arrayOffset+1))
{pp->value[pp->valueOffset]=
asin(CalculateExpression(addr+arrayOffset+1,1))*180/PI;
pp->valueOffset++;////////////////////////////////
////////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++; }
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}
/////////////////////////////////////////////////////////////////
}
else
{pp->value[pp->valueOffset]=
asin(atof(addr+arrayOffset+1))*180/PI;
pp->valueOffset++;
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
else if(*(addr+arrayOffset)==0x18)
{ if(!IsFigure(addr+arrayOffset+1))
{pp->value[pp->valueOffset]=
acos(CalculateExpression(addr+arrayOffset+1,1))*180/PI;
pp->valueOffset++;////////////////////////////////
////////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++; }
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}
/////////////////////////////////////////////////////////////////
}
else
{pp->value[pp->valueOffset]=
acos(atof(addr+arrayOffset+1))*180/PI;
pp->valueOffset++;
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
else if(*(addr+arrayOffset)==0x19)
{ if(!IsFigure(addr+arrayOffset+1))
{pp->value[pp->valueOffset]=
atan(CalculateExpression(addr+arrayOffset+1,1))*180/PI;
pp->valueOffset++;////////////////////////////////
////////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++; }
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}
/////////////////////////////////////////////////////////////////
}
else
{pp->value[pp->valueOffset]=
atan(atof(addr+arrayOffset+1))*180/PI;
pp->valueOffset++;
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
else if(*(addr+arrayOffset)==0x1A)
{ if(!IsFigure(addr+arrayOffset+1))
{pp->value[pp->valueOffset]=
90-atan(CalculateExpression(addr+arrayOffset+1,1))*180/PI;
pp->valueOffset++;////////////////////////////////
////////////////////////////////////////////////////////////////
for(;*(addr+arrayOffset+1)!='\0';arrayOffset++)
{ if(*(addr+arrayOffset)=='(')
{ BracketNumber++; }
if(*(addr+arrayOffset)==')')
{ BracketNumber--;
if(BracketNumber==0)break; }
}
/////////////////////////////////////////////////////////////////
}
else
{pp->value[pp->valueOffset]=
90-atan(atof(addr+arrayOffset+1))*180/PI;
pp->valueOffset++;
for(;IsFigure(addr+arrayOffset+1);arrayOffset++);
///////////////////////////////////////////////////////////////
if(*(addr+arrayOffset+1)=='('//能够处理sin45sin45有省略*的表达式
||*(addr+arrayOffset+1)>=0x10&&*(addr+arrayOffset+1)<=0x16)////
{pp->sign[pp->signOffset]='*';pp->signOffset++;} ////
///////////////////////////////////////////////////////////////
}
}
//////////////////////////异常处理
else {ErrorMark=1;Add(ErrorInformation," !!!! fatal error ....\r\n");}
//printf("%d %c\n",addr+arrayOffset-Expression+1,
//*(addr+arrayOffset));}
}
////////////////////////////////////////////////////////////
}
return pp->value[0];///返回值都在value[0]处
}
/////////////////////////////////////////////////////////////
/////2001——2003 (C) Copyright CrazySoft
/////////////////////////////2003年3月23日 Implemented by CDH
/////////////////////////////////////////////////////////////