欢迎访问 Forcal数学软件

演示程序及源代码

目  录

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

测试程序ForcalTest    页首

一、源代码:

文件夹ForcalTest中的
源程序ForcalTest.cpp和头文件forcal7.h。注意要将ForcalTest编译为多线程程序。
该程序由VC++ 6.0编译通过。

二、使用说明:

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 !"):输出一个字符串。

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

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

10、PrintArray("xx"):输出一个实数数组,该数组必须提前定义,xx为数组名。

11、CalFor("f",x1,x2,...,xn):在运行时调用实数表达式"f",x1,x2,...,xn为表达式的参数。

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

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

、计算实例:

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

2、简单的数值计算

2+sin[2+3*sqrt(3)]*exp[5];  //实数表达式;
i:mod[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;               //定义一元函数;
SimpIntegrate(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]; ?

6、有一组测定数据:0.105、0.115、0.115、0.116、0.116、0.128,求其平均值和标准偏差

(::DataNum)= DataNum=6;    //数据个数为6个;
(::DataNum)= NewRealArray["Array",DataNum,0.105,0.115,0.115,0.116,0.116,0.128];
//给数组赋初值;
f(x)=x;                   
//定义计算平均值用到的函数;
(::DataNum)= DataArraySum("f",DataNum,"Array")/DataNum;           
//计算平均值;
g(x::DataNum)= [x-DataArraySum("f",DataNum,"Array")/DataNum]^2;   
//定义计算标准偏差用到的函数;
(::DataNum)= sqrt{DataArraySum("g",DataNum,"Array")/(DataNum-1)}; 
//计算标准偏差;

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

(:i,j)=
{
    i=20,
     while
    {
        i,
        printstr["aa "],
        j=0,
        while
        {
            i-j,
            printstr["*"],
            j++
        },
        printstr[" bb"],
        end[],
        i--
     }
} ?

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

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

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

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

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

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是否是一个素数;

10、递归打印数据

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];

11、无限循环的退出

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

12、使用常量和常量函数

_e_; pi; pi[];

13、calfor(...)的用法:在运行时调用实数表达式

aa(x)=x+8;
calfor["aa",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源代码:

i:outi(x:xx,str)= xx=new(int,x),str=new(char_s,80),FCDtoChar_s[xx,str],outch[str,true],delete[xx],delete[str];
i:Cantor(n:sum,i)={		// 读入n=1,3,8,14,0
	if(n==0,return(0)),	// n为0时退出
	sum=0,			// 所经过的数的数目
	i=0,			// 第n个数在第i斜线上
	while{
		sum<n,
		i++,		// 下一条斜线
		sum=sum+i
	},
	if(mod(i,2)==1,outi(sum-n+1),OutCh("/",false),outi(n-sum+i),return(0)),	// i是奇数
	outi(n-sum+i),OutCh("/",false),outi(sum-n+1)				// i是偶数
};
i:Cantor[1];
i:Cantor[3];
i:Cantor[8];
i:Cantor[14];

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,FCDtoChar_s[int,get(x,i),str],outch[str,true],outch["  ",false],i++},delete[str];

i:HCF(x,y:a,r,b)= 
//求最大公因数
{
    a=x,b=y,r=mod(a,b),
    while(r>0,a=b,b=r,r=mod(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=mod(step+p,len),
            tmp=pv,Get(point,p,&pv),Set(point,p,tmp),
            p==start
        },
        i++
    },
    OutPoint(point,6),
    delete[point]
};

3、插入排序法

i:OutPoint(x,n:i,str)= str=new(char_s,80),i=0,while{i<n,FCDtoChar_s[int,get(x,i),str],outch[str,true],outch["  ",false],i++},delete[str];
i:outi(x:xx,str)= xx=new(int,x),str=new(char_s,80),FCDtoChar_s[xx,str],outch[str,true],delete[xx],delete[str];
i:(:i,n,a:x,y,k)={
	a=New(int_s,5,EndType,1,2,4,5,0),
	OutPoint(a,5),
	x=3,
	k=0,n=4,
	while(
		k<n,
		Get(a,k,&y),
		if(x<y,break()),
		k=k+1
	),
	outi(k),
	i=n,
	while(
		i>k,
		Get(a,i-1,&y),
		Set(a,i,y),
		i=i-1
	),
	Set(a,k,x),
	OutPoint(a,5),
	delete[a]
};

4、删除指定数据

i:OutPoint(x,n:i,str)= str=new(char_s,80),i=0,while{i<n,FCDtoChar_s[int,get(x,i),str],outch[str,true],outch["  ",false],i++},delete[str];
i:(:i,y,a:n,x,k)={
	n=8,x=12,k=0,	//x为欲删除的数组元素
	a=New(int_s,8,EndType,1,4,7,9,12,14,23,56),
	while(k<n,	//查找欲删除数组元素的位置
		Get(a,k,&y),
		if(y==x,break()),
		k=k+1
	),
	if(k>n,outch("找不到此数据!",false),return(-1)),
	i=k+1,
	while(i<n,	//将x后的数组元素后移
		Get(a,i,&y),
		Set(a,i-1,y),
		i=i+1
	),
	Set(a,n-1,0),
	OutPoint(a,8)
}

六、演示FcData中的例子

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

 

演示程序:工程1    页首

一、源代码:

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

二、使用说明:

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

演示程序:Project1    页首

一、源代码:

在文件夹fc_delphi中
。该程序由delphi7编译通过。

二、使用说明:

1、该程序启动时只加载了
“Forcal.dll”,运行时可以动态地加载三个Forcal扩展动态库:“QuitFc.dll”、“FcConst.dll”和“Example.dll”。
2、该程序使用简单,其他请参考程序运行时的说明。

三、关于QuitFc.dll

Forcal运行监视动态库,在任意可接受输入的窗口,按 Ctrl+Alt+Q(q) 键可以退出Forcal漫长的计算过程或者无限循环。

四、关于FcConst.dll

1、该库向Forcal添加常量,添加完常量即卸载该库,不占用内存空间。点击“卸载FcConst”将重新加载FcConst.dll以删除向Forcal添加的常量。
2、该库添加的整数和实数常量如下:

    Key_IntFor=1,            Key_RealFor=2,            Key_ComplexFor=3,
    Key_IntFunction=4,       Key_RealFunction=5,       Key_ComplexFunction=6,
    Key_IntArray=7,          Key_RealArray=8,          Key_ComplexArray=9,
    Key_Str=10,              Key_IntConst=11,          Key_RealConst=12,
    Key_ComplexConst=13

可以在整数和实数表达式中使用这些常量。

五、关于Example.dll

该库包含如下函数:

1、[实数函数] SetRunTime():设置运行时间

    该函数记录运行时间初值。该函数与GetRunTime()配合使用,由GetRunTime()获得运行时间。
    该函数总是返回0。

2、[实数函数] GetRunTime():获得运行时间

    该函数在SetRunTime()之后使用,由GetRunTime()可以获得自执行SetRunTime()以来的运行时间。

    例如:

    SetRunTime();
    (:i,k)=
   
{
   
     i=0,k=0,
   
    
while{i<=1000000,k=k+i,i++},
        k
   
};
   
GetRunTime()

3、[实数函数] simp2[a,b,"Y1","Y2","z",eps]:变步长辛卜生二重积分

    / b / Y2(x)
    |   |
    |   | z(x,y) dxdy
    |   |
    / a / Y1(x)

    eps为积分精度。
    该函数返回的运行错误代码FcErr的意义如下:
    FcErr=1:需要字符串参数指定表达式;FcErr=2:指定的表达式不存在;FcErr=3:不能对表达式的自变量重新赋值;FcErr=4:表达式的参数个数不符合要求;FcErr=5:精度必须大于0。

    例如:

    f1(x)=-sqrt[1-x*x];
    f2(x)=sqrt[1-x*x];
    f(x,y)=exp[x*x+y*y];
    simp2[0,1,"f1","f2","f",0.00001]


版权所有© Forcal数学软件 2002-2008,保留所有权利
E-mail: forcal@sina.com  QQ:630715621
最近更新: 2008年05月01日