过年人人没事,给个问题大家解, 表达式分析问题

comanche 2001-01-18 10:38:00
...全文
148 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharer 2001-01-21
  • 打赏
  • 举报
回复
还有很多错误要好好改一下,字符串相加还不支持,TMD赶快加把劲,ST!
xiaoyu 2001-01-21
  • 打赏
  • 举报
回复
会数据结构的,这个不难,不就是堆栈的问题改进,容易的
猛禽 2001-01-20
  • 打赏
  • 举报
回复
Comanche?!那个98年写的东东你还在改吗?不会吧.真是Herbert的好学生.^_^
不过我现在没票回不去了,5555555555555555,要等22日的飞机了.我可怜的Money啊.
回去找你麻烦.
comanche 2001-01-18
  • 打赏
  • 举报
回复
给个例子

TExprAnalyze ea;
double Answer = ea.Calculate( "8 * ( 8 + ( 8 - 8 ) ) / ( 8^( 8 / 8 % 8 ) )" )

应等于 8
祝大家年年发财了
comanche 2001-01-18
  • 打赏
  • 举报
回复
cpp 文件,reset没用(忘记删)

//---------------------------------------------------------------------------

#include <vcl.h>
#include <Math.h>
#pragma hdrstop

#include "ExprAnalyze.h"

#pragma package(smart_init)
//---------------------------------------------------------------------------
TExprAnalyze::TExprAnalyze( ):
pFFormula( 0 ),
pszMeta( 0 ),
FMetaStyle( msNone ),
Warnings( new TStringList( ) )
{
}
//---------------------------------------------------------------------------
TExprAnalyze::~TExprAnalyze( )
{
if ( pszMeta != 0 )
delete pszMeta;
}
//---------------------------------------------------------------------------
double __fastcall TExprAnalyze::Calculate( AnsiString AFormula )
{
FFormula = AFormula;
pszMeta = new char[FFormula.Length( )];
pFFormula = FFormula.c_str( );

double Value = 0.0;
GetMeta( );
while ( FMetaStyle != msNone && FMetaStyle != msError )
{
AddSub( Value );
if ( FMetaStyle == msNone || FMetaStyle == msError )
break;

GetMeta( );
}

delete pszMeta;
if ( FMetaStyle == msError )
throw EExprAnalyze( "error" );
return Value;
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::AddSub( double &Value )
{
double FValue = 0.0;
char Operator;

MulDiv( Value );

if ( FMetaStyle == msNone || FMetaStyle == msError )
return;

while ( FMetaStyle == msOperator &&
( pszMeta[0] == '+' || pszMeta[0] == '-' ) )
{
Operator = pszMeta[0];
GetMeta( );

if ( FMetaStyle == msNone || FMetaStyle == msError )
return;

MulDiv( FValue );

if ( Operator == '+' )
Value += FValue;
else
Value -= FValue;
}
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::MulDiv( double &Value )
{
double FValue = 0.0;
char Operator;

Factor( Value );

if ( FMetaStyle == msNone || FMetaStyle == msError )
return;

while ( FMetaStyle == msOperator &&
( pszMeta[0] == '*' || pszMeta[0] == '/' || pszMeta[0] == '%' ) )
{
Operator = pszMeta[0];
GetMeta( );

if ( FMetaStyle == msNone || FMetaStyle == msError )
return;

Factor( FValue );

if ( Operator == '*' )
Value *= FValue;
else if ( Operator == '/' )
{
if ( FValue == 0.0 )
{
FMetaStyle = msError;
return;
}

Value /= FValue;
}
else if ( Operator == '%' )
{
if ( ( Value - ( int )Value != 0.0 ) ||
( FValue - ( int )FValue ) != 0.0 )
{
FMetaStyle = msError;
return;
}

Value = ( int )Value % ( int )FValue;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::Factor( double &Value )
{
double FValue = 0.0;
char Operator;

LeadOperator( Value );

if ( FMetaStyle == msNone || FMetaStyle == msError )
return;

while ( FMetaStyle == msOperator &&
( pszMeta[0] == '^' || pszMeta[0] == '!' ) )
{
Operator = pszMeta[0];

if ( Operator == '!' )
{
if ( Value - ( int )Value != 0 )
{
FMetaStyle = msError;
return;
}

int Temp = ( int )Value;
for ( int i = 2; i < Temp; i ++ )
Value *= i;

GetMeta( );
if ( FMetaStyle == msNone || FMetaStyle == msError )
return;
}
else
{
GetMeta( );

if ( FMetaStyle == msNone || FMetaStyle == msError )
return;

LeadOperator( FValue );
Value = pow( Value, FValue );
}
}
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::LeadOperator( double &Value )
{
char Operator;

if ( FMetaStyle == msOperator &&
( pszMeta[0] == '+' || pszMeta[0] == '-' ) )
{
Operator = pszMeta[0];

GetMeta( );
Parenthesis( Value );
if ( Operator == '-' )
Value = -Value;
}
else
Parenthesis( Value );
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::Parenthesis( double &Value )
{
if ( FMetaStyle == msOperator )
{
if ( pszMeta[0] == '(' )
{
GetMeta( );
AddSub( Value );

if ( ! ( FMetaStyle == msOperator && pszMeta[0] == ')' ) )
FMetaStyle = msError;
else
GetMeta( );
}
else
FMetaStyle = msError;
}
else
GetNumeric( Value );
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::GetVariable( double &Value )
{
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::GetNumeric( double &Value )
{
if ( FMetaStyle == msVariable )
GetVariable( Value );
else
Value = StrToFloat( pszMeta );

GetMeta( );
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::GetMeta( )
{
char *pMeta = pszMeta;

while ( *pFFormula && *pFFormula == ' ' )
pFFormula ++;

if ( *pFFormula == 0 )
FMetaStyle = msNone;
else if ( strchr( "+-*/^!()%", *pFFormula ) )
{
FMetaStyle = msOperator;
*pMeta = *pFFormula, pMeta ++, pFFormula ++;
}
else if ( strchr( "0123456789.", *pFFormula ) )
{
FMetaStyle = msNumeric;
while ( *pFFormula && strchr( "0123456789.", *pFFormula ) )
*pMeta = *pFFormula, pMeta ++, pFFormula ++;
}
else
{
FMetaStyle = msVariable;
while ( *pFFormula && ( ! strchr( " +-*/^!()%", *pFFormula ) ) )
*pMeta = *pFFormula, pMeta ++, pFFormula ++;
}

*pMeta = 0;
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::Reset( )
{
FMetaStyle = msNone;
pFFormula = 0;
delete pszMeta;
Warnings->Clear( );
}
//---------------------------------------------------------------------------
Mickey_Chue 2001-01-18
  • 打赏
  • 举报
回复
题呢?
comanche 2001-01-18
  • 打赏
  • 举报
回复
我已写了个不完美的,支持
+
-
*
/
%
^ N次方
! 阶层
( ) 无限括号优先级
大家帮忙测试,还有什么建议提出来
comanche 2001-01-18
  • 打赏
  • 举报
回复
来头论文件
//---------------------------------------------------------------------------

#ifndef ExprAnalyzeH
#define ExprAnalyzeH

#ifndef __CHINESE_MESSAGE && __ENGLISH_MESSAGE
#define __CHINESE_MESSAGE
#endif

#ifdef __CHINESE_MESSAGE
#define UNKNOW_CHARACTER "在表达式[%d]位置上存在非法的字符'%s'"
#else
#define UNKONW_CHARACTER "unkonw character '%s' in the expression at position %d"
#endif
//---------------------------------------------------------------------------
#include <DString.h>
//---------------------------------------------------------------------------
class EExprAnalyze :public Exception
{
public:
EExprAnalyze( AnsiString Msg ):Exception( Msg ) { }
};
//---------------------------------------------------------------------------
typedef enum { msOperator, msNumeric, msVariable, msNone, msError } TMetaStyle;
//---------------------------------------------------------------------------
class TExprAnalyze
{
public:
TExprAnalyze( );
~TExprAnalyze( );

double __fastcall Calculate( AnsiString AFormula );
protected:
private:
void __fastcall AddSub( double &Value );
void __fastcall MulDiv( double &Value );
void __fastcall Factor( double &Value );
void __fastcall LeadOperator( double &Value );
void __fastcall Parenthesis( double &Value );
void __fastcall GetVariable( double &Value );
void __fastcall GetNumeric( double &Value );

void __fastcall GetMeta( );
void __fastcall Reset( );

AnsiString FFormula;
char *pFFormula;
char *pszMeta;
TMetaStyle FMetaStyle;
TStringList *Warnings;
};
//---------------------------------------------------------------------------
#endif

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧