社区
C++ Builder
帖子详情
过年人人没事,给个问题大家解, 表达式分析问题
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
中缀
表达式
转后缀
表达式
自从找完工作人就废了,幡然醒悟不行不行,得把忘记的都记下来。。。。。。 中缀
表达式
就是我们正常使用的那种,例如:a+b*c 后缀
表达式
就是abc*+; 为什么要有中缀
表达式
和后缀
表达式
呢? 因为中缀
表达式
便于人们的理
解
与计算,但是后缀
表达式
更方便计算机的运算(如二叉树、堆栈的方法计算),因此在读取一个中缀
表达式
后,我们得办法将他转化为后缀
表达式
。 转化方式有三种: 首先假设我们需要转化...
表达式
求值(最详细
分析
+代码实现+
表达式
之间的相互转换)
目录 一、概念 二、前缀
表达式
的逻辑和实现方式 1.定义 2.前缀
表达式
的计算机求值 3.例子 4.代码实现 三、中缀
表达式
的逻辑和实现方式 1.定义 2.中缀
表达式
规则 3.中缀
表达式
的计算机求值 4.代码实现 四、后缀
表达式
的逻辑和实现方式(逆波兰
表达式
求值) 1.定义 2.后缀
表达式
计算机求值 3.例子 4.代码实现 五、相互转换 1.中缀
表达式
转化为前缀
表达式
①算法描述 ②例子 2.前缀
表达式
转化为中缀
表达式
3.中缀
表达式
转化为后缀
表达式
①算法描述
Lambda
表达式
Lambda
表达式
(lambda expression)是一个匿名函数,Lambda
表达式
基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda
表达式
可以表示闭包(注意和数学传统意义上的不同)。Lambda
表达式
是jdk1.8才有的一种新特性。 为什么会有Lambda
表达式
我们写了这样一个计算器类,类中现在有一个加法和一个减法。 public class Calculator { public stati
【编译原理笔记18】代码优化:活跃变量
分析
,可用
表达式
分析
关于活跃变量与可用
表达式
的
分析
。
java中,正则
表达式
匹配一个或多个空格 && 正则
表达式
匹配两个或多个空格
001.匹配一个或者多个的空格的正则
表达式
: \\s+ 例: String[] newStr = str.trim().split("\\s+"); 002.匹配二个或多个空格的正则
表达式
: \\s{2,} 例:String str = new String("i am a good boy! "); String replaceAll = str.r...
C++ Builder
13,825
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章