社区
C++ Builder
帖子详情
过年人人没事,给个问题大家解, 表达式分析问题
comanche
2001-01-18 10:38:00
...全文
151
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
沟通的艺术II:看入人里 之知觉
目录1. 知觉历程1.1. 选择1.2. 组织知觉基模刻板印象1.3. 诠释协商2. 影响知觉的因素2.1. 信息2.2. 心理2.3. 角色2.4. 生理3. 常见的知觉谬误3.1. 自我认同自利的偏误期望效应聚光灯效应宜家效应阿伦森效应3.2. 安全感曝光效应损失厌恶破窗效应从众效应旁观者效应3.3. 内隐人格理论投射效应晕轮效应近因效应刻板效应习得性无助3. 同理心3.1. 原则4. 认知复杂度4.1. 枕头法*立场1:我对你错立场2:你对我错 or 换位思考立场3:双方都对,双方都错立场4:话题不重
android安卓源码海量项目合集打包-1
下载地址 最后更新共计113个分类5177套源码29.2 GB。 卷 新加卷 的文件夹 PATH 列表 卷序列号为 00000200 5E7A:7F30 F:. ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签的灵活运用.rar │ │ Android 实现 标签 拖动 改变位置.rar │ │ android 流式布局和热门标签.zip │ │ ...
Java学习之路
第一部分是我在参加2018春招时所写,主要记录了我在研究生期间学习Java后端的心路历程。 第二部分内容是我参加2019秋季招聘过程中所作,记录了秋招路上所经历的一切。 第三部分内容则是我在秋招尘埃落定之后,对之前所学所想而做出的总结。 第一部分:Java后端学习之路 第二部分:我的秋招回忆录 第三部分:我的秋招经验分享(研发方向) 一、Java后端学习之路 这部分内容是我在准备2018年春招的时...
Adroid 收集
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多朋友都有过在 Activity 中通过 getWidth() 之类的方法获取 View 的宽高值,可能在 onCreat...
业余草 2018 技术文章合集整理,适合入门、中级、高级、架构师进阶
阅读优秀的文章可以使你快速进步,本文收集了广受好评的优秀IT技术文章,在你有空时读一读,安静下来思考一下。 后端技术文章精选。 WebFlux 静态资源处理教程 简书故障,访问出现 502 Bad Gateway 极客时间《Java并发编程实战》购买返现24 尚硅谷_玩转Scala数据结构和算法视频教程免费下载 说说信号量限流和限流算法的区别 Java 中的 @Immutable...
C++ Builder
13,871
社区成员
102,693
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章