演示程序及源代码
目 录
| 1 测试程序:ForcalTest 2 演示程序:工程1 3 演示程序:Project1 |
一、源代码:
文件夹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实现
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/2,2/1,3/1,2/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。
一、源代码:
在文件夹fc_vb中。该程序由VB6.0编译通过。
二、使用说明:
1、该程序需要“Forcal.dll”和“QuitFc.dll”两个动态库的支持。“QuitFc.dll”是一个Forcal运行监视动态库,在任意可接受输入的窗口,按
Ctrl+Alt+Q(q) 键可以退出Forcal漫长的计算过程或者无限循环。
2、该程序使用简单,其他请参考程序运行时的说明。
一、源代码:
在文件夹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日