刚工作时自学VC++,开发了一个演算稿式计算语言,用于日常的设计计算说明书的编写及算法程序的收集整理。
当时不知道matlab,不然就不会费这么大的劲了。
源代码见:https://download.csdn.net/download/lijil168/10915472
其主要代码为windows界面程序及计算语言解释程序。
主程序见:https://download.csdn.net/download/lijil168/10915678
计算整车动力性示例:
做功率平衡图示例:
软件使用说明如下:
- compute简介
本语言属于解释性计算机语言。用本语言编程不需要定义数据类型,所有的变量和数组都是双精度数据类型。但是数组要先定义大小,再使用。数组最大为两维,对应于matlab的矩阵。本语言做好了与matlab语言(以!为标志) 和Proe(以$为标志)的接口,用本语言编程不需要另做接口便可以直接调用matlab的命令,并可以直接编程控制Proe模型的参数,从而达到控制Proe模型的目的。本语言还提供了友好的Windows编程界面,编程和输出、打印数据和图样都很方便。
(一)运算符:
+ 加
- 减
* 乘
/ 除
^ 乘方
# 开方
% 求余数
sqrt 求平方根
fabs 求绝对值
floor 取整
exp 求以自然数为底的指数运算
lg 求以10为底的对数运算
ln 求以自然数为底的对数运算
sin cos tan atan asin acos 三角及反三角运算
cosh sinh tanh
!= 不等于
== 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
&& 逻辑与
|| 逻辑或
(二)变量:
所有不含有运算符、小括号和中括号的字符串均可以做变量名,所有的变量都是双精度数据类型,如果想用按钮“显示结果”显示变量的值,在变量名前加?。
例如:要把2赋给变量y,可这样写
y=2
如果想用按钮“显示结果”显示y的值,可这样写
?y=2
(三)数组:
所有不含有运算符、小括号和中括号的字符串均可以做数组名,所有的数组都是双精度数据类型,数组最大为2维,对应于matlab的矩阵,数组先定义大小,再使用,且不能重复定义。
例如:
a[3][2]=[1,2\21\,32]
定义二维数组,数组名为a,对应于matlab中的矩阵a 3行2列,每行以\分隔,未赋值的数组的值为0
a[3]=[]
定义二维数组,数组名为a,对应于matlab中的矩阵a 3行1列,相当于a[3][1]=[]
a[0]=1 相当于a[0][0]=1
?b=a[0] 相当于?b=a[0][0]
(四)求一元函数极小值的函数(用最小二乘法求):
Fmin(一元函数表达式,自变量的范围,精度)
自变量的范围的格式为:起始值<=自变量<=终点值
精度默认为0.0001
注意两求极值函数不能在一起运算
例如:要求函数f(x)=x^2在-1<=x<=1范围内的极小值,再把极小值赋给变量y,可这样写
y=Fmin(x^2, -1<=x<=1,0.0001)
如果想用按钮“显示结果”显示y的值,可这样写
?y=Fmin(x^2, -1<=x<=1,0.0001)
如果想用按钮“显示结果”显示y和x的值,可这样写
?y=Fmin(x^2, -1<=?x<=1,0.0001)
(五)自定义函数:
用本语言编程,用户可以先自定义函数,以后使用。后定义的函数体可以包含前面定义的函数。如果后定义的函数与前面定义的函数同名,则后面定义的函数覆盖前面定义的函数。但是应防止循环调用。
例如:要求函数f(x)=x^2在x=0时的值并赋给变量y1, 在x=10时的值并赋给变量y2,可这样写
f(x)=x^2
y1=f(0) y2=f(10)
但不能 y1=f(f(0))即不能循环调用!
如果函数w(x,y)是函数f(x)的两倍再加上y,可这样写
w(x,y)=2*f(x)+y
如果要求函数w(x,y)在x=0,y=1时的值并赋给变量y1, 在x=1,y=10时的值并赋给变量y2,可这样写
y1=w(0,1) y2=w(1,10)
(六)“Output1”按钮会调用的绘图函数:
1、map(v1,v2,v3,v4)本函数用来设置画图比例,
v1 | 绘图区左上角的横坐标 |
v2 | 绘图区左上角的纵坐标 |
v3 | 绘图区右下角的横坐标 |
v4 | 为绘图区右下角的纵坐标 |
自变量的个数只能等于4个。但自变量可以为空表示采用当前的默认值。
初始A4纸的左上角坐标为(-0.1,1.2), 右下角坐标为(1.052,-0.32)
初始绘图区的左上角坐标为(0,1), 右下角坐标为(1,0)map(v1,v2,v3,v4)目的就是使绘图区左上角的坐标变为(v1,v2),右下角的坐标变为(v3,v4),从而确实绘图的比例。
2、pen(v1,v2,R,G,B)本函数用来选择画图的线条类型
v1 | 线条类型0实1长虚2短虚3点划4双点划5空 |
v2 | 线条宽度1~2 |
R | 红色值0~255 |
G | 绿色值0~255 |
B | 蓝色值0~255 |
使用本函数时,自变量的个数可以少于或等于5个。如:pen(1,)表示线条的类型改为1,第二个自变量为空表示线条宽度不变仍为当前的默认值,第三到五个自变量没有表示线条颜色不变,仍为当前的默认值。
3、font(,,,,...)本函数用来选择画图字体类型,自变量的个数可以少于或等于14个,同VC++的字体构造函数。
4、move(v1,v2) move-(w1,w2)自变量的个数只能等于2个。
v1 | 当前绘图点沿横坐标方向平移的量 |
v2 | 当前绘图点沿纵坐标方向平移的量 |
move(v1,v2)表示把当前绘图点相对平移(v1,v2)个单位
w1 | 把当前绘图点平移至点的横坐标。 |
w2 | 把当前绘图点平移至点的纵坐标。 |
move-(w1,w2)表示把当前绘图点平移至(w1,w2)点
5、line(v1,v2) line-(w1,w2)自变量的个数只能等于2个。
v1 | 绘线始点的横坐标 |
v2 | 绘线始点的纵坐标 |
w1 | 绘线终点的横坐标 |
w2 | 绘线终点的纵坐标 |
可以连续画线。如:line(0,1)-(0.5,0.3)-(1,1)
6、rect(v1,v2,v3,v4)本函数用来画矩形,
v1 | 矩形左上角的横坐标 |
v2 | 矩形左上角的纵坐标 |
v3 | 矩形右下角的横坐标 |
v4 | 矩形右下角的纵坐标 |
使用本函数时,自变量的个数只能等于4个。但自变量可以为空表示采用当前的默认值。
7、ellipse(v1,v2,v3,v4,)本函数用来画椭圆形,
v1 | 椭圆外切矩形左上角的横坐标 |
v2 | 椭圆外切矩形左上角的纵坐标 |
v3 | 椭圆外切矩形右下角的横坐标 |
v4 | 椭圆外切矩形右下角的纵坐标 |
使用本函数时,自变量的个数只能等于4个。但自变量可以为空表示采用当前的默认值。
8、draw(v1,v2,v3)本函数用来画函数图形,
v1 | 一元函数的函数名 |
v2 | 自变量的起始坐标 |
v3 | 函数自变量的终止坐标 |
使用本函数时,自变量的个数只能等于3个。且自变量不可以为空。
9、print(,,,,...)本函数用来输出显示变量的值或字符串,自变量的个数不定,与VC++的格式化打印函数sprint(..)函数相似。如: y=2.555 print("x=%4.2f;qq=%s",x,yes) 结果为 x=2.56;qq=yes
print(x)结果为 x=2.56;
但是应注意:在点击“显示结果”按钮时,print(到回车符都会被过滤掉,故在print()函数后不要给变量赋值。print()函数完成后绘图点自动回车换行所以下一个print()显示的结果会与前一个对齐。
!!注意:绘图函数不要放到第一行头,否则会被过滤掉。
(七)命令:任何程序都是由一条条的命令组成,用本语言编程使用的命令如下:
- 赋值命令
如:x=2+4 为把2+4的结果6赋给变量x
f(x)=x^2; y=f(3) 为把f(x)当自变量为3时的函数值赋给y
a[2]=1 为把1赋给数组a[2]
- 数组定义命令
如:a[3][2]=[1,2\21\,32]
定义二维数组,数组名为a,对应于matlab中的矩阵a 3行2列,每行以\分隔,未赋值的数组的值为0
a[3]=[]
定义二维数组,数组名为a,对应于matlab中的矩阵a 3行1列,相当于a[3][1]=[]
- 函数自定义命令
如:f(x)=x^2
定义一个函数,函数名为f,自变量为x,函数体为x^2
- 条件转移命令
if(表达式)
{运算体1 }
else
{运算体2 }
当表达式成立时则运算运算体1,否则转到运算体2
- 条件循环命令
while(表达式)
{循环体}
当表达式成立时则循环运算循环体
- 绘图命令
由“Output1”按钮会调用的9个绘图函数组成。
☆☆注意:
1.本语言是这样对源程序进行逐条解释的:从头至尾扫描,空格、换行符'\n'、或者起始位置与第一个'='(前有'>''<''!'或前后有'='不算)间的字符为待求值的变量名,空格、回车符'\r'、或者末尾位置与上一个'='(前有'>''<''!' 或前后有'='不算)间的字符为待求值的算术表达式。待求值的变量名与待求值的算术表达式应一一对应。如: a=2+5=7 相当于 a=7
2. 在要显示的变量的前面加上?号。
3. 变量名最多长20字节,表达式最多长200字节。程序最大字符9300,最大变量数500,用?显示的最 大变量数100,最大函数数50,函数最大自变量数50
4. 该运算为顺序运算,分支和循环运算。
5.运算结果均为双精度型。
if() 后面若有非‘ ’‘{’回车符且非注示的字符则出错!
{ } 后面若有非‘ ’回车符且非注示的字符则表示后面没有else
else 后面若有非‘ ’‘{’回车符且非注示的字符则出错!
{}
while() 后面若有非‘ ’‘{’回车符且非注示的字符则出错!
{}
分隔符号:空、;、}、{、
************以下为“Output1”按钮会调用的绘图函数********
*********与matlab有关的关键字***************
a[3][2]=[1,2\21\,32]
定义二维数组,数组名为a,对应于matlab中的矩阵a 3行2列,每行以\分隔,未赋值的数组的值为0
a[3]=[]
定义二维数组,数组名为a,对应于matlab中的矩阵a 3行1列,相当于a[3][1]=[]
a[0]=1 相当于a[0][0]=1
?b=a[0] 相当于?b=a[0][0]
!=clear 把!=后面的clear传给matlab engine进行运算
!a=a+1 把!后面的a=a+1传给matlab engine进行运算,运算完成后a矩阵的值再赋给数组a
!!注意在调用matlab engine运算前会把已定义的数组传给matlab矩阵,矩阵名与数组名相同!!!!
a=!a 把矩阵a的值赋给数组a,注意行列应对应。
*********与Proe有关的关键字***************
a[0]=$a0x 把Proe模型中的参数a0x赋给数组a[0]并建立参数a0x到数组a[0]的映射。故a[0]的变化就是a0x的变化。!!注意一个参数的映射只能建立一次。故不能一个参数映射多个变量或数组。!!
$a0x=1 相当于a0x=$a0x a0x=1 定义变量a0x与参数a0x映射,并改变其值为1。
$=0 把已建立映射的参数的值赋给模型,并再生模型。
$=1 用于调试程序,暂停程序的运行,以对话框的形式显示带?的变量,并可以在matlab windows中检查各个矩阵的值。
如果要在proe中调用matlab的命令,需要安装matalab6.5和proe worldfire
例如:
在matlab的work目录下考入[工程计算文]目录下的rssr,rrss文件(解决rssr和rrss空间四杆机构运动坐标的函数)。
运行proeworldfire
打开转向模型:proe模型目录下的asm0001.asm.3
打开proe菜单:工具下的辅助运用程序,用ch7_protk文件完成辅助运用程序(CH7\Example7\Release\Example7.dll)的注册。在proe菜单上会新增加一个菜单,点击此菜单,再点击再生按钮,在出现的对话框中拷贝入 [工程计算文]目录下的四杆机构分析.lijil文件中的最后一条记录:temp2-proe2-转向四杆。(可以先执行compute\Debug\Compute.exe再打开[工程计算文]目录下的四杆机构分析.lijil。再选到最后一条记录)