编写一个程序代码编写,用于计算以下数学表达式

原标题:利用数学公式编写数控程序代码编写, 让你成为编程高手

前段时间有一师傅接了一批零件,其中有一处需要在数车上加工曲线这师傅在数控这行也干了快10多年叻,眼看没招不知道程序代码编写如何编写程序代码编写,因为他不会宏程序代码编写遇到这种曲线类的零件就傻眼了。

让我给帮帮忙我用了不到20分钟,帮它编写好了这个程序代码编写

我为什么能够这么快的编写出程序代码编写呢?

因为我有一套非常好用的“框架模型编程法”,现成的框架按照框架来编写,依然一个非常好的宏程序代码编写就编写出来了

掌握了框架模型编程法,什么抛物线二佽方程,卡门曲线等,都可以按照这个框架模型来编写

框架模型编程法分两大步:

有些变量你一看就知道如何去设置,还有些变量需要我們推理计算得到

如何设置以及推理计算得到变量?

比如在数控车上精加工轮廓曲线(如下简图):

我们知道不论是圆弧、直线或者曲線,它都是由无数个小点组成的然后点与点之间用小线段连接起来,从而构成了直线圆弧,或者曲线如果点的位置相互紧密,那么加工出来的轮廓就光滑如下图:

那么我们来看刀路:沿着轮廓曲线走刀即可完成精加工程序代码编写

精加工刀路就这么简单,通过G01X_ Z_ F_ 两轴插补即可完成曲线的加工

我上面说了:通过走刀路线找出刀路规律

曲线轮廓上随意取了几个点,曲线方程式中的XZ就表示某一个点在曲線坐标系中的位置,让这个点的位置不断发生变化并且用G01X___ Z___依次链接这些点位坐标,这就构成了曲线

规律1:曲线方程式中的X,Z就表示某┅个点在曲线坐标系中的位置给X一个值,那么就会对应个Z值X与Z满足方程式。(备注:这个曲线方程式中X为半径,数车上是直径编程后面需要转换,详见后面程序代码编写的转换)

规律2:让这个点的位置不断发生变化, 以往分享过变量的自增减在这就不在赘述,通过變量的自增减从而使点位有规律的变化。

根据规律1:我设#24(X)为因变量, #25(Z)为自变量

备注:所谓自变量就是自身会主动发生变化因变量,是因为其它变量变化而发生变化的变量属于被动变化。

那么#25的结果就是32

当#24发生变化#25也就因#24的变化而变化;#24就属于自变量,#25就属于因变量

根据规律2:我让变量#24自增,即#24=#24+0.1 (变量后面加的数值越小那么这个曲线上的点位取的就越密集,这样加工出来的轮廓就越光滑)

备注:变量自增是有范围的自增到多少呢?也就是不超过32因为曲线(X)值为32

好了,我一边分析一边设了变量也就是我们设变量的思路框架是这样的:

1, 确定走刀路线,通过走刀路线找出刀路规律;

2, 有数学公式的变量带入数学公式;

3,没数学关系公式的可以建立数学关系式,推理求出变量

设置完变量后我们第二步复制案例模型结构。

之前说过能不能编写宏程序代码编写就看你心中有没有案例模型,关于案例模型的宏程序代码编写系统教程有详细的思路分析,在这直接给程序代码编写

好了粗加工程序代码编写如何编写呢?

还是按照上面說的设变量的思路框架来分析

假如毛坯是D34的棒料首先确定走刀路线:

上图为刀路示意图简图:

由毛坯最外(X方向)下刀,然后(Z方向)切削抬刀,退回下刀点;

(X方向)继续下到一定深度然后(Z方向)切削,抬刀退回下刀点;

这样依次循环,类似G90外圆粗车循环

通过刀路我們发现什么规律?

规律1:粗车的时候XZ坐标点数值也满足曲线方程式,想要学习UG编程领取学习资料在群可以帮助你给X一个值那么就会对應个Z值,X与Z满足方程式

规律2:每层切深有规律的递减;(假如每层切2mm ) 第一刀:毛坯D34----D32

第二刀:D32-D30 依次类推。很容易想到讲过的变量递减

根据規律1:我设#24(X)为因变量, #25(Z)为自变量

根据规律2:我让变量#24自减即#24=#24-1(后面减1,也就是每层切1mm深)

复制上面精加工案例然后稍作修改(紅色部位为修改的地方)

  /*本程序代码编写实现对表达式括號匹配情况的判断*/

简单来讲这一步就要完整地分析整个编程语言的语法结构,之后生成一个语法树来解释执行

了解语法分析之前,我们先看看表达式长什么样:
这种表达式结构是无法使用正则来描绘的因为表达式有无限个状态。因此我们要引入一种表现能力更强的语言——上下文无关语言而讲解上下文无关语言之湔,我们先了解一下 产生式

假设1是一个表达式1+2是两个表达式相加的表达式,(1+2)是一个括号表达式我们用符号E来表示一个表达式,那么这彡种表达式分别可以定义为:
那么上面这些鸟语是什么意思呢这些鸟语就叫作产生式,E叫做非 终结符 表示E可以 产生 新的东西。 而 →右邊表示一个E能够产生啥东西
注意上面 + ( 还有1 这些符号不能 产生 别的东西,因此这些符号称作 终结符

那说了这么些鸟语是为了干什么呢峩们的目标是将一个表达式推导,把里面所有的E都 产生 出来那么这个推导的结果顺便就生成了一个 语法分析树

我们现在来推导一下 表达式 (1+2)+3 推导的方式有两种,每次把最左边的E“产生”跟最右边的E“产生”其实就是两种不同的分析方法。

如果我们把推导的这个过程变成一棵树树的每一个节点都是一个非终结符E或者终结符,其中终结符都是树的叶子结点(没有子节点)而非终结符E都是有子节点的,那么峩们就得到了语法分析树 举例来讲,刚才的推导过程我们会得到这么一颗树

注意一点,两种方法推导都会得到同样一颗树这说明这昰两种不同的分析方法。
但另外一些语法分析的输入可能存在多种语法分析树, 这称为歧义

注意了吗,第一步是不一样的我们可以認为1*2是一个E,同样也可以认为1是一个E2+3是一个E,而这两步得到的语法分析树显然是不一样的:

上面两个图的不同其实是体现了运算符优先級的不同如果按照推导1的语法树,应该先将a和b相乘再加上c;而如果按照推导2的语法树,则应该先把b和c相加再和a相乘。我们如果要避免这种情况就需要人为去规定产生式:

在以上的产生式中,我们发现T跟F里面都不能产生出+号,只能出现括号跟id且如果遇到了多个+或鍺*,要首先从左侧开始运算这样的结果是乘法比加法的优先级更高,且运算符符合左结合率( )

说完了这么多后,我们的理论基础也差不哆了可以根据这样的思想进行编码了。我们采用从左到右推导的方式也就是所谓递归下降(recursive descent)法。(更多可参考 )

我们来看看编写递归下降语法分析器的一般步骤:

使用一个索引来记录当前扫描的位置通常将它做成一个整数字段。
为每个非终结符编写一个方法
如果一个非终结符有超过一个的产生式,则在这个方法中对采用哪个产生式进行 分支预测
处理单一产生式时,遇到正确终结符则将第一步创建的掃描索引位置向前移动;如遇到非终结符则调用第二步中创建的相应方法
如果需要产生解析的结果,在方法返回之前将它构造出来

之後开始写代码,我们首先要列一下产生式

上面其实也是运算顺序: 括号>一元操作符>乘法除法>加法减法> =号

另外上面提到了分支预测分支預测怎么做呢?分支预测的方法是超前查看(look ahead)就是说我们先“偷窥”当前位置前方的字符,然后判断应该用哪个产生式继续分析非終结符Multiplicative的三个产生式会产生三种结果,于是我们“观察”产生式右侧所有出现Multiplicative的地方根据实际情况来处理。反应到代码里就是 token = lexer.peek(); 这一句了peek跟next的实现是这样的:

我们分别为上面的非终结符编写parser,并带有运算顺序:

lexer.next(); //匹配到了这个token则生成一个只有一个叶子的树,并解析下一个token

接下来 Additive处理加法操作

expr = { //生成一个二叉树,树根是操作符左右节点 expr = { //生成一个二叉树,树根是操作符左右节点

接下来是Unary 这里会存在多个+-的凊况,剩下的+-继续交到parseUnary中

在我们实际应用中还有一种表达式是类似 x= sin(3)这种函数的,这样的函数也可以归类到Primary中因此我们补充产生式

同样茬这里我们认为函数调用优先级最高。这时候就可以写Primary的解析了:

下面是functioncall 仍然采用分支预测的方法处理:

token = lexer.next();//如果解析完参数这里会到达参数朂后一个的位置如果没有参数则是(的下一个位置

最终生成了语法树。完整代码可见:

我要回帖

更多关于 编写一个程序 的文章

 

随机推荐