社区
C++ Builder
帖子详情
过年人人没事,给个问题大家解, 表达式分析问题
comanche
2001-01-18 10:38:00
...全文
153
8
打赏
收藏
过年人人没事,给个问题大家解, 表达式分析问题
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
精通正则
表达式
正则
表达式
各语言通用,这本书是经典中的经典
standard-1.1.2.jar和jstl-1.1.2.jar
使用这两个标签时也勿必保持其版本的一致!否则就会报很奇怪的错误哦
SCAU 整数算术
表达式
分析
程序
作业3:整数算术
表达式
分析
程序 题目类别: B作业 关键字: 类、对象、封装、类之间的关系、字符串 内容要求: 编写一个Java应用程序。 要求实现功能如下: (1) 从键盘输入一个表示整数四则运算的字符串,例如:32 + 5 * ( 30 - 40 ) / 3 - 12 四则运算符号: +代表整数加法、-代表整数减法、*代表整数乘法、/代表整数除法(结果为整数)、() 括号 运算数全部为正整数 假设输入的字符串一定是符合运算规则的整数四则运算的
表达式
。 为方便输入和处理数据,运算数和运算符号之
表达式
求值
问题
目录一、
问题
描述二、实现思路三、
解
题代码四、运行结果 一、
问题
描述 用户输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法数学
表达式
,计算该
表达式
的运算结果。 二、实现思路 在基于顺序栈实现
表达式
求值中,该算法主要分为将算术
表达式
转换成后缀
表达式
和后缀
表达式
求值两个步骤。 &emsp将算术
表达式
转换为后缀
表达式
的主要思路为:在从左到右扫描算术
表达式
exp的一个运算符op时,如果栈为空或者栈顶为’(‘,直接将其进栈;如果栈不空,只有当op的优先级高于栈顶运算符的优先级时才直接
中缀
表达式
& 后缀
表达式
一、什么是中缀
表达式
&amp;amp; 后缀
表达式
? 中缀
表达式
: 我们生活中使用的算术
表达式
其实就是中缀
表达式
举个例子:(1+6/3)*6 - 5 后缀
表达式
: 更有利于计算机进行计算的一种
表达式
,不再包含括号(),也不再考虑运算符优先级,一律从左到右进行计算 举个例子: 1 2 + 二、怎么将中缀
表达式
转换成后缀
表达式
呢? 利用栈结构来实现中缀
表达式
-&amp;gt; 后缀
表达式
转换规则:...
C++ Builder
13,871
社区成员
102,694
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章