演示程序及源代码

欢迎访问 Forcal数学软件

演示程序及源代码

目 录

1 测试程序:ForcalTest
2 演示程序:工程1
3 演示程序:Project1
 

说明:所有演示程序都很简单,没有使用FORCAL的模块化编译功能。FORCAL的模块化编译功能由MForcal或OpenFc(可从天空软件站、华军软件园等多家下载站下载到这两个程序)演示。

测试程序ForcalTest 页首

一、源代码:

文件夹ForcalTest中的
源程序ForcalTest.cpp和头文件forcal32.h。
该程序由VS C++ 2008编译通过。注意要将活动解决方案配置为“Release”,项目属性中的字符集设置为“未设置”。本软件包中由VS C++ 2008编译的项目均需这样设置。
通过源代码,可以了解如何在程序中加载使用Forcal32.dll,如何使用Forcal编译字符串表达式,如何向Forcal注册自定义的各种函数等等。

二、使用说明:

1、该程序使用简单,请参考程序运行时的说明。
2、建议先在文本编辑器例如记事本中输入表达式,然后将表达式文件复制粘贴到forcaltest.exe中,这样改写表达式较为方便。


三、在ForcalTest中定义的二级函数:

1、add(2,3):计算两个数的和。

2、pi():常量函数,圆周率pi。

3、SIntegrate(…):一元辛卜生积分函数,用法与FORCAL内置的二级函数SimpIntegrate(…)完全相同。

4、average(x1,x2,x3,… …):计算多个数的平均值。

该函数至少需要一个参数,否则返回一个FORCAL运行错误,代码为1。

5、speed()比较FORCAL和VC的计算速度。

6、print(2.3):输出一个实数。

7、PrintStr(“hello !”):输出一个近程静态Forcal字符串

PrintStr(pFor,”hello !”):输出一个远程静态Forcal字符串,其中pFor为表达式句柄,可由函数HFor(“ForName”,ForType)获得

8、end():输出一个换行符。

9、clock():获取流逝过去的时钟脉冲数。

10、CalFor(“f”,x1,x2,…,xn):在运行时调用实数表达式”f”;x1,x2,…,xn为表达式的参数。

该函数会返回FORCAL运行错误,错误代码意义: 1:至少需要一个参数;2:参数不匹配;3:找不到表达式。

11、CalHFor(pFor,x1,x2,…,xn):在运行时调用实数表达式pFor;x1,x2,…,xn为表达式的参数。其中pFor为表达式句柄,可由函数HFor(“ForName”,ForType)获得

该函数会返回FORCAL运行错误,错误代码意义: 1:至少需要一个参数;2:参数不匹配;3:非法的表达式句柄。

另外,forcaltest中定义了两个常量:_e_Pi

、计算实例:

1、FORCAL与VC的速度比较:使用自定义二级函数speed[]即可进行比较。

2、简单的数值计算

2+sin[2+3*sqrt(3)]*exp[5]; //实数表达式;
i:222%5+8;
//整数表达式;
c:sin[2+3i]-ln[i];
//复数表达式;

3、三角形面积公式

F(a,b,c:s)= s=(a+b+c)/2,sqrt[s*(s-a)*(s-b)*(s-c)]; //定义三角形面积公式;
F[3,4,5];

4、变步长辛卜生一元积分

f(x)=sin[x]+0.8; //定义一元函数;
SIntegrate(1,2,0.0001,”f”);

5、求和函数sum

F3(x,y)=cos{1-sin[1.2*[x+0.1]^(y/2-x)+cos{1-sin[1.2*[x+0.2]^(y/3-x)]}]
-cos{1-sin[1.2*[x+0.3]^(y/4-x)]}-cos{1-sin[1.2*[x+0.4]^(y/5-x)
+cos{1-sin[1.2*[x+0.5]^(y/6-x)]}]-cos{1-sin[1.2*[x+0.6]^(y/7-x)]}}};
sum[“F3”,0,1,0.011,1,2,0.11]; /span>

6、循环的嵌套:打印字符串

(:i,j)=
{
i=20,
while
{
i,
PrintStr[“aa “],
j=0,
while
{
i-j,
PrintStr
[“*”],
j++
},
PrintStr[” bb”],
end[],
i–
}
} /span>

7、循环的嵌套:将1~10这几个数字在屏幕上打印10遍

(:i,j)=
{
i=0,
while
{
i<10,
//循环判断语句;

j=1,
while
{
j<11,
//循环判断语句;

print(j),
j++
},
end(),
i++
}
}

8、检测一个数是否为素数

Prime(n:i)=
{
i=1,
while
{
i<n/2,

if
{
!fmod(n,++i), //i先增1,然后进行模运算;

print[n],PrintStr[“不是一个素数!”],end[],
return[i]
}
},
print[n],PrintStr[“是一个素数!”],end[],
i
};
Prime[5];
//检测5是否是一个素数;

9、递归打印数据

SetRealStackMax[1000];
z_a(i)=if[i<10,z_a(i+1),print(i)];
//按降序打印;

z_a[0];
a_z(i)=if[i<10,print(i),a_z(i+1)];
//按升序打印;
a_z[0];

10、无限循环的退出

while[1,1]; //无限循环函数,可通过另一线程“退出FORCAL!!!”;

11、使用常量和常量函数

_e_; Pi; pi[];

12、输出远程静态Forcal字符串:例子1

aa()=PrintStr(HFor(“aa”,2),”hello !”);

13、输出远程静态Forcal字符串:例子2

bb()=”adfg”;
PrintStr[HFor(“bb”,2),bb()];

14、CalFor(…)的用法:在运行时调用实数表达式

aa(x)=x+8;
CalFor[“aa”,7];

15、CalHFor(…)的用法:在运行时调用实数表达式

aa(x)=x+8;
CalHFor[HFor(“aa”,2),7];

五、由章毅明(hias_asia)先生提供的例子(可通过hias_asia@126.com与章毅明先生联系

1、
Cantor表搜索算法的Forcal实现

Cantor

Georg Cantor证明了有理数是可列的。他用下面这一张表来证明该命题:

1/1

1/2

1/3

1/4

1/5

2/1

2/2

2/3

2/4

3/1

3/2

3/3

4/1

4/2

5/1

我们为上表中的每一项编号:第1项是1/1,然后是1/22/13/12/2……你的任务是求表中第N项的值。

要求从键盘读入若干个正整数,对于每一个数n(1<=n<=100000),输出Cantor表中相应的数(以表中实际的分数形式输出,不要约分)。输入0表示结束。样例如下:

样例输入

1

3

8

14

0

样例输出

1/1

2/1

2/3

2/4

#include <iostream>
using namespace std;

int main()
{
int n;
while (cin >> n)
//
读入n
{
if (n == 0)
// n
0时退出
break;
int sum = 0;
//
所经过的数的数目
int i = 0;
//
n个数在第i斜线上
while (sum < n)
//
直到经过的数不少于n
{
i++;
//
下一条斜线
sum += i;
}
if (i % 2 == 1)
// i
是奇数
cout << sum – n + 1 << ‘/’ << n – sum + i << endl;
else
// i
是偶数

cout << n – sum + i << ‘/’ << sum – n + 1 << endl;
}
return 0;
}

Forcal源代码:

2、移动内存算法的Forcal实现

对于有k个元素的数组int a[k]={…};写一个不另外申请数组空间,但可以申请少许变量的高效算法将数组内容循环左移m位。

比如:int a[6]={1,2,3,4,5,6},循环左移3位得到结果{4,5,6,1,2,3}

i:OutPoint(x,n:i,str)= str=new(char_s,80),i=0,while{i<n,FCDToStr[int,get(x,i),str],OutStr[str],OutNStr[” “],i++},delete[str];

i:HCF(x,y:a,r,b)= //求最大公因数
{
a=x,b=y,r=a%b,
while(r>0,a=b,b=r,r=a%b),
return(b)
};

i:Carry(:i,start,p,hloc,step,pv,tmp,point:m,len,b)= //数组的区间移动
{
start=0,p=0,i=0,len=6,m=3,
point=new(int_s,6,EndType,1,2,3,4,5,6),
hloc=HCF(len,m),
step=len-m,
while{ i<hloc,
p=i,start=p,get(point,p,&pv),
until{
p=(step+p)%len,
tmp=pv,get(point,p,&pv),set(point,p,tmp),
p==start
},
i++
},
OutPoint(point,6),
delete[point]
};

3、插入排序法

4、删除指定数据

六、演示FcData中的例子

所有例子均可不加修改地在ForcalTest中运行,例子请参考fcdata.htm

 

演示程序:工程1 【页首】

一、源代码:

在文件夹fc_vb中。该程序由VB6.0编译通过。

二、使用说明:

1、该程序需要“Forcal32.dll”和“QuitFc32.dll”两个动态库的支持。“QuitFc32.dll”是一个Forcal运行监视动态库,在任意可接受输入的窗口,按 Ctrl+Alt+Q(q) 键可以退出Forcal漫长的计算过程或者无限循环。
2、该程序使用简单,其他请参考程序运行时的说明。

演示程序:Project1 【页首】

一、源代码:

在文件夹fc_delphi中
。该程序由来源:iteye_1642

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2008年10月20日
下一篇 2008年10月21日

相关推荐