OpenFC是一个实用工具,可以进行各种数学计算、工程计算等,可满足中学生、大学生和各类工程技术人员的大部分需要。OpenFC也是一个编程工具,相信爱好数学的编程爱好者一定会喜欢。
OpenFC是一个开放式的数值计算程序。
OpenFC中的计算采用程序控制方式,其源程序书写格式自由,且具有C++风格的注释。用户可以通过简单的编程方便地实现他们所需的功能,例如:可以使用常规的数学函数进行整数、实数和复数表达式的计算;进行常量定义;使用字符串;使用数组;使用逻辑函数;使用if判断语句、which选择计算语句、for循环、dowhile循环等进行流程控制等等。
借助本系统可以了解OpenFC、Forcal32W.dll和MForcal32W.dll的详细信息。
·一个开放式数值计算工具,可以方便地进行功能扩展。
·演示FORCAL的重要功能。
·演示MForcal的全部功能。
简介:
OpenFC是一个开放式的数值计算程序,由Forcal32W.dll和MForcal32W.dll提供支持。
OpenFC能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。源程序中可以使用的运算符有+、-、*、/、^、>、>=、<、<=、==、!=、&、|、!、++、--等等,具有数值计算、逻辑运算、关系运算、字符数据处理、流程控制、函数调用等许多的可编程功能。
OpenFC是开放式的,很容易进行功能扩展。OpenFC通过加载Forcal扩展动态库进行功能扩展,这些库可以用VC、Delphi或者Fortran等高级语言进行编写。
OpenFc可以对源程序进行模块化编译,可以打开多个文件同时进行操作,提高了运行效率。
OpenFC允许用户将常用的计算定义为命令,通过命令菜单执行计算。命令菜单是OpenFC提倡的计算方式。
在OpenFC中,用户也可以自定义窗口,用户在窗口中可以使用编辑框、静态文本、普通按钮、单选按钮、复选框、组框、位图等控件。用户自定义命令和用户自定义窗口改善了人机界面,强烈推荐使用。
用户可通过工作区文件对OpenFc的工作环境进行配置,如设置需要加载的扩展动态库、设置模块、设置命令、设置常量等等,一切可按照自己的喜好和实际工作需要进行配置。
目前,通过Forcal扩展动态库为OpenFC增加的功能有:解非线性方程(组)、多元积分、微分方程求解、函数图形绘制(由OpenGL图形库提供支持,可以绘制精美的二维和三维数学函数图形)等等。
最新升级内容:
[2010.02.10] 增加AutoMfc程序。
[2010.01.20] 增加Forcal优化动态库FcOpt。
[2009.11.08] 增加OpenFC的语法高亮功能,可通过工作区文件自定义语法高亮的Forcal关键字。目前的问题:撤消及恢复功能不能用。
[2009.11.01] OpenFC界面由RichEdit提供支持。
[2009.08.01] OpenFC由Forcal32W.dll和MForcal32W.dll提供支持,升级为OpenFC V6.0。
表达式和源程序:
OpenFC由Forcal32W.dll和MForcal32W.dll提供支持,MForcal32W.dll是一个标准的Forcal扩展动态库。MForcal32W.dll可以编译固定格式的Forcal源程序。
使用OpenFC需要先了解FORCAL表达式和MForcal的源程序格式。
OpenFC中使用的表达式格式与标准的Forcal表达式格式完全相同。
OpenFC中使用的源程序格式与标准的MForcal源程序格式完全相同。每一个源程序被编译为一个模块。在MForcal中,源程序和模块几乎是同义词。
1.1 源程序的一般格式
在MForcal源文件中,可以有多个FORCAL表达式,表达式之间用分号“;”隔开。 两个连续的分号“;;”表示前面的表达式在执行时不会输出结果。
由于FORCAL数学表达式有三种,即整数表达式、实数表达式和复数表达式。为便于区分,MForcal将以i:开头的表达式作为整数表达式,以r:开头的表达式作为实数表达式,以c:开头的表达式作为复数表达式,缺省为实数表达式。缺省的表达式类型可以重新设置:若表达式以integer:开头,表示自该表达式开始,后面的缺省表达式为整数表达式;若表达式以real:开头,表示自该表达式开始,后面的缺省表达式为实数表达式;若表达式以complex:开头,表示自该表达式开始,后面的缺省表达式为复数表达式。
同时,在源文件中可以进行注释,注释方法与C++语言相似,即:每行两个//后的内容为注释内容;在一行内或者多行之间/*...*/之间的内容为注释内容。注释不是源程序的有效部分,但可以使程序更易读。
举例如下:
//这是一个例子!灰色部分为注释,不会被执行;
i:2.2+3; //以i:开头是整数表达式;
c:sin(2.2+3.3i); //以c:开头是复数表达式;
2.2+3.3; //这是实数表达式。
2+3;/* 从这里开始,连续几行注释:
333+222;
. . . . . . ;
555-222;
*/ sin(2.5);
exp(2);
integer: //设置缺省表达式为整数表达式;
2.2+3;//这是整数数表达式;
可以用加载MForcal的任何一个程序验证以上代码。
1.2 程序的执行
由于表达式有些带有参数,有些不带参数,MForcal在进行处理时,对于有参数的表达式只进行编译,不进行计算。
MForcal只顺序执行不带参数的表达式。如果该表达式以两个连续的分号“;;”结尾,则该表达式只执行,不输出计算结果。
但是,如果表达式以冒号“ : ”开头,则无论是有参表达式还是无参表达式,都是只编译,不执行,格式如下:
i:: 2+3;//整数无参表达式,只编译,不执行;
i:: f1()=2+3; //整数无参表达式,只编译,不执行;
c:: 2+3i; //复数无参表达式,只编译,不执行;
c:: f2()=2+3i; //复数无参表达式,只编译,不执行;
: 2+3; //实数无参表达式,只编译,不执行;
: f3()=2+3; //实数无参表达式,只编译,不执行。
无参表达式f1、f2和f3可以在其他可执行的表达式中被调用。
另外,如果无参表达式以感叹号“ ! ”开头,则编译后立即执行,且以后执行模块时不再自动执行。格式如下:
i:! 2+3; //整数无参表达式,编译成功,立即执行,以后不再自动执行;
i:! f1()=2+3; //整数无参表达式,编译成功,立即执行,以后不再自动执行;
c:! 2+3i;//复数无参表达式,编译成功,立即执行,以后不再自动执行;
c:! f2()=2+3i; //复数无参表达式,编译成功,立即执行,以后不再自动执行;
! 2+3; //实数无参表达式,编译成功,立即执行,以后不再自动执行;
! f3()=2+3; //实数无参表达式,编译成功,立即执行,以后不再自动执行;
无参表达式f1、f2和f3可以在其他可执行的表达式中被调用。
1.3 源程序的完整格式
编译时,将源程序中的表达式编译为一个或多个模块,MForcal会对每一个模块进行加锁。编译时 首先设置起始模块,也称主模块(并非Forcal的0#模块,恰恰相反,MForcal不会将任何一个表达式编译为0#模块,定义主模块是为了与源程序中的其他模块相区别),以后每当遇到#MODULE#,开始编译为一个新的模块 ,称为子模块,而每当遇到#END#,回到主模块的编译。即#MODULE#和#END#之间的表达式定义为一个子模块,子模块之间不能嵌套定义。注意#MODULE#和#END#必须位于表达式的开头。 在模块中,以~开头的表达式被编译为公有表达式(全局表达式或全局函数),能被其他模块访问到,其余的表达式均被编译为私有表达式(私有函数),其他模块无法访问。所有模块的模块号由MForcal或程序员指定,不会重复,也不会被编译为0#模块。在源程序的任何地方,可用指令#USE#调用另一个模块。
模块源文件的格式如下:
//单行注释:模块名:myModule
/*
多行注释:在同一模块源文件中的所有表达式属于同一个模块;
多行注释:以~开头的表达式可被其他模块的表达式所访问;
多行注释:不以~开头的表达式只能被该模块的表达式所访问。
*/
#MODULE#//定义一个子模块;
i:a(x)=10+x; //私有函数,只能被该模块的表达式所访问;
c:!b()=100+100i; //私有函数,只能被该模块的表达式所访问 ,该表达式是在编译时执行的;
~_c(x)=x-5; //全局函数,任意模块包括本模块均可访问;
~_f(x)=a(x)+b(); //全局函数,任意模块包括本模块均可访问;
~i:g(x)=a(x)+_c(x); //全局函数,任意模块包括本模块均可访问;
#USE# Module1; //使用模块Module1;
~_ff(5)+_gg(6); //函数_ff()和_gg()在模块Module1中定义;
#END# //子模块定义结束,可缺省;
#MODULE# //定义一个子模块;
i:a(x)=10-x; //私有函数,只能被该模块的表达式所访问;
~ff(x)=a(x); //全局函数,任意模块包括本模块均可访问;
#END# //子模块定义结束,不可缺省;
_f(1); //主模块中的表达式。
ff(1); //主模块中的表达式。
integer: //设置缺省表达式为整数表达式;
2.2+3; //这是整数数表达式;
在其他模块中使用该模块的格式如下:
#USE# myModule; //关键字USE必须为大写,myModule是模块名称;
_f(2)+g(3); //调用myModule模块中定义的函数;
1.4 编译指令的位置和次序
在MForcal中使用的#MODULE#、#END#、#USE#、integer:、real:、complex:、~、i:、r:、c:、:、!等称为编译指令,用以确定一个表达式的类型、所在模块、是否私有函数等属性。这些编译指令必须位于表达式的开头,有些指令能同时使用,有些指令不能同时使用,并且在使用时有一定的次序,按先后顺序依次为:
1)编译指令#MODULE#、#END#、#USE#、integer:、real:和complex:之间没有先后顺序,可混合使用,但这些指令必须在表达式的最前面,一般单独成行。
2)~表示该表达式是一个全局表达式,否则是私有表达式。
3)编译指令i:、r:、c:不能混合使用,只能使用其中的一个,强制指定表达式的类型。如果都没有用,表达式按缺省的类型进行编译。
4)编译指令:、!不能混合使用,只能使用其中的一个。:表示该表达式只编译,不执行;!表示该表达式编译后立即执行,但以后执行模块时不再自动执行。
如果表达式前没有使用任何一个编译指令,则按缺省表达式的类型编译为私有表达式,若该表达式是无参表达式,则执行模块时将自动执行。
适合于:
1、初级用户:使用OpenFC命令进行计算、能使用简单的FORCAL表达式进行计算。
2、中级用户:熟练使用FORCAL表达式进行计算。
3、高级用户:能使用C++、Delphi、FORTRAN等高级语言编写Forcal扩展动态库。