| 网站首页 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛 |
 
| 技术教程首页 | 开发语言 | WEB开发 | .NET技术 | 数据库 | 操作系统 | 网页制作 |
 
 
您现在的位置: 编程中国 >> 技术教程 >> 开发语言 >> VC++ >> VC技术资料 >> 正文
  ►  表达式计算的类 四则混合运算
表达式计算的类 四则混合运算
作者:陈东海    阅读人次:……    文章来源:vczx.com    发布时间:2007-8-29    网友评论()条
 

 

////////////////////////////////////////////////////////
   for(kk=0;*(Expression+kk)!='\0';kk++)
    {
    if(*(Expression+kk)=='(')//判断括号
     {
     BracketNumber1++;
if(*(Expression+kk+1)==')')
{ErrorMark=1;//(后面不能是)
Add(ErrorInformation," !! 出错位置  未知: ')' 后面不能是 '('\r\n");
}
     }
        if(*(Expression+kk)==')')//是否匹配
     {
      BracketNumber1--;
if(!IsSign(Expression+kk+1)&&ErrorMark!=1)
{
 ErrorMark=1;//)后面不能是(
Add(ErrorInformation," After ')' must be a Operator\r\n ");
}
     }
    }

//////////////////////////////////////////////////////
   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
/////////////////////////////////////////////////////////////

上一页  [1] [2] 

 

 
文章录入:编辑01    责任编辑:编辑01 
  • 上一篇文章:

  • 下一篇文章:

  •  
    相关文章
    原创地带
    24小时热门帖子