社区
PowerBuilder
帖子详情
求解
hbwhwanghua
2003-11-25 01:43:02
现固定参数,由用户自定义公式,然后据此公式进行相应计算,PB是否可以提供现成服务(如PFC),或哪位大侠有好的解决方法,请告知,分我会再加!
...全文
282
4
打赏
收藏
求解
现固定参数,由用户自定义公式,然后据此公式进行相应计算,PB是否可以提供现成服务(如PFC),或哪位大侠有好的解决方法,请告知,分我会再加!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hbwhwanghua
2003-12-02
打赏
举报
回复
搞定,放分!
hbwhwanghua
2003-11-25
打赏
举报
回复
现找到思路,有兴趣的可看下面的文章:
支持用户自定义变量的PowerBuilder表达式求值
--------------------------------------------------------------------------------
湖南省邮电技术中心
张俊飞、谭培莎
---- 在一些应用程序开发中,需要处理最终用户输入的表达式求值问题。一般情况下,需要程序开发人员运用编译原理中的词法分析、语法分析与语义分析技术,扫描用户输入的符号串并用解释执行的方法计算表达式的值。PowerBuilder提供的describe函数,具有强大的表达式分析能力,为用户表达式的求值提供强有力的支持。但是,describe函数不支持用户自定义变量,对具有语法错误的表达式,没有提供具体的出错原因和错误位置。本文给出一个在实际应用中的解决办法,以供有此需求的其他开发人员参考。
---- 在一个用PowerBuilder作为开发工具的概预算编制软件开发过程中,用户提出这样一个需求:用户输入一表达式后系统能自动计算其值,且表达式中可含有函数、用户自定义变量以及注释等。
---- 形如:"π/4*(D2-d2){备注:圆环面积}+sin(xyz{自定义变量xyz需求解})-[row%]{自定义变量row%不需求解}"。面对这样一个复杂的表达式如何进行求解呢。
---- PowerBuilder独有的数据窗口功能强大,并提供了丰富的数据窗口函数,而求解这一复杂表达式的就是使用Describe()这一数据窗口函数来实现的。
---- Describe()函数通常用来获取数据窗口对象属性值及数据窗口对象中的各个对象的属性值。但它还有一个功能---计算表达式。它可以计算指定行或列的值,返回结果。其语法格式为:dwcontrol.Describe (Evaluate ( '表达式',行号)). 例如在以下的表达式中使用Describe函数计算数据窗口中第三行Salary域的值,根据Salary的取值是否大于100000来决定返回值是255或是0。
ls_ret = dw_1.Describe( "Evaluate
('If(salary > 100000, 255, 0)', 3)")
---- 特殊的,如果指定行号为0,则仅返回表达式的值,而不管其所属行.
---- 但是这一函数, 只能计算仅含数字、算符、函数的简单的表达式,要利用它来进行自定义表达式的求解则还要对表达式进行必要的过滤、替换等预处理.
---- 自定义表达式的求解理论上是一个词法分析的过程.即对输入的字符串进行分析,区分出变量、函数、常数、算符、界符、保留字。然后替换变量进行计算。
---- 还是以形如:"π/4*(D2 -d2){备注:圆环面积}+sin(xyz{自定义变量xyz需求解})-[row%]{自定义变量row%不需求解}"的表达式为例。
---- 假设表达式中的自定义变量的合法形式为:以字母开头,由字母和数字组成的序列。表达式中的注释用特殊符号容纳,例如大括号{}。
---- 求解工作先通过三步预处理(分别用消除表达式中的空格f_skip_space()、消除表达式中的注释f_trim_notes()、语法分析与变量替换f_parse_express()三个函数来完成),再调用describe函数对变换后不含用户自定义变量的表达式求值。
---- F_skip_space():入口为原始字符串,返回去掉空格及其它不可见字符的新串。
---- 函数体中用一个循环逐个读入字符,并将ASC值大于32的字符累加到某一string类型的变量中,循环完成后该变量容纳的即为去掉空格的新字符串。
---- F_trim_notes():入口为去掉空格的新字符串,返回去掉注释后的新串。
---- 函数体中设一整型层次计数器li_level初始值为0,用一个循环扫描输入串,一旦遇到'{'则li_level加一;若遇到'}'则li_level减一;若li_level=0则将该字符累加到某一string类型的变量中。若在循环体中有li_level<1的情况,或在循环结束后li_level< 0,则说明括符左右不匹配,应给予提示,并中止分析。循环正常结束后,变量的值即为去掉注释后的新串。
---- F_parse_expression():该函数是表达式分析的主体部分。经过以上两步后表达式中已剔除了空格和注释。该函数要判断表达式是否合法,包括左右括号是否匹配,算符位置是否正确,函数名称是否正确等。同时,要到相应的变量表获取用户自定义变量的值,替换该变量。形成最终的仅含函数、算符、界符、数字的合法表达式,返回供Describe()函数计算。
---- 该函数可包含三个入口参数:as_exp接收输入的经过两次处理的表达式;as_reserved接收不需替换的变量,如列名等,用[a][b]形式表示;al_flag决定从哪个数据库表中查找变量值。第三个参数主要是从通用性角度考虑,如果自定义变量来源仅有一张表可无需定义该参数。
---- 函数体中用到一些判断,这些判断可用一些函数来实现。例如判断某个字符是否为有效字符(a-z或A-Z),判断某个字符是否为运算符('+','-','*','/','^'), 判断某个字符是否为数字(0-9),判断某个字符是否为保留字('[int][sin][cos][tan][log][logten] [exp][pi][fact][abs][sign][sqrt]')等。
---- 函数体主要由一个(do while)外层大循环嵌套一个(if_else_endif)条件判断,再嵌套一个(do while)内层循环加一些判断组成。外层循环的条件是假设一指针从表达式的第一个字符开始顺序后移,直到指向最后一个字符。如果当前指针指向的是一数字或括号,则累加到某一string类型的变量ls_result中,并分左右括号对integer型的变量li_level加1或减1来表示括号的嵌套层次。如果当前指针指向的是一字符,则用内层循环读取该字符后的字符串到一string类型的变量ls_identifier中,同时使指针后移,直到遇到算符、界符或表达式结束符,循环结束。Ls_identifier中保存的是一变量名或函数名。取下一字符,如果是'(',那么,ls_identifer中保存的应是一函数名,并检查是否为合法的保留字;如果不是'(',则判断as_reserverd中有无该变量,若有则不需要解释(如数据窗口的列名),直接保留标识符,将其加到ls_result中,若需要解释,则根据al_flag到不同的数据库表提取相应的值,并对结果做相应判断(如为空,值取0)加到ls_result中。外层循环结束后,根据li_level的值是否为0决定表达式中的括号是否匹配。
---- 最终,如正常结束返回结果串ls_result,即为仅含数字、算符、函数、列名的简单字符串,可由Describe()函数进行计算。
[ 所附程序可下载 Zip 2KB]
不过,谁有附件程序的源码,给我好吗?
不想写,呵呵!
xingxing
2003-11-25
打赏
举报
回复
你用过c中的sprintf函数没,就是实现哪个函数就可以实现了。
应该是编译原理的一个词法分析器。
lmby
2003-11-25
打赏
举报
回复
可以呀。类似于expree的设置。
迷宫问题的三种
求解
方法(递归
求解
、回溯
求解
和队列
求解
)
目录 一、迷宫问题的三种
求解
方法 递归
求解
回溯
求解
队列
求解
二、华为迷宫问题 一、迷宫问题的三种
求解
方法 在迷宫问题中,给定入口和出口,要求找到路径。本文将讨论三种
求解
方法,递归
求解
、回溯
求解
和队列
求解
。 在介绍具体算法之前,先考虑将迷宫数字化。这里将迷宫用一个二维的list存储(即list嵌套在list里),将不可到达的位置用1表示,可到达的位置用0表示,并将已经到过的位置用...
CST
求解
器详解
概述 在使用CST微波工作室来分析电磁问题时,需要根据具体的设计问题,选择合适的算法或者
求解
器 CST微波工作室集成了多种时域/频域全波算法和高频算法
求解
器 时域
求解
器(Time Domain Solver) 频域
求解
器(Frequency Domain Solver) 本证模
求解
器(Eigenmode Solver) 积分方程
求解
器(Integral Equation Solver) 高频渐进
求解
器(Asymptotic Solver) ...
6、HFSS的
求解
类型和
求解
设置
1.如何选择
求解
类型模式驱动
求解
(Driven Modal,▲S):波端口激励、集总端口激励以模式为基础计算S参数,根据导波内各模式场的入射功率和反射功率来计算S参数矩阵的解。终端驱动
求解
(Driven Terminal,▲E):电压源激励、电流源激励、入射波激励和磁偏置激励以终端为基础计算多导体传输线端口的S参数;此时,根据传输线终端的电压和电流来计算S参数矩阵的解。本征模
求解
(Eigen mode,▲F):对于本征模
求解
类型,HFSS自动使用▲F最大值作为收敛误差判断标准本征模
求解
器主要用于谐振问题的设
CST入门——
求解
器简介与时域、频域和积分
求解
器设置
CST高频
求解
器的简介与设置,重点介绍了时域
求解
器、频域
求解
器和积分
求解
器
Sentaurus TCAD的sdevice
求解
中选择Math
求解
方法
Math 参数用于
求解
算法,并且是设备独立的,必须出现在基础的 Math 部分。关键字 Method 用于选择要使用的线性
求解
器,而关键字 SubMethod 用于选择块分解方法的内部方法。此外,对于小信号分析、噪声和波动分析,使用全导数是必需的。对于MPBC模拟,有一个专用的线性
求解
器可用于利用迭代
求解
器ILS的优势,并提高模拟的鲁棒性。通过这些线性
求解
器的选择和配置,可以针对不同类型的问题和计算环境,实现高效的线性系统
求解
。通过这些参数的合理设置,可以优化线性
求解
器的性能,提高计算效率和
求解
质量。
PowerBuilder
1,111
社区成员
66,454
社区内容
发帖
与我相关
我的任务
PowerBuilder
PowerBuilder 相关问题讨论
复制链接
扫一扫
分享
社区描述
PowerBuilder 相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章