數學公式如何存儲在數據庫中啊?

---涛声依旧--- 2006-04-12 08:51:13
在SQL Server中﹐數學公式如何建表來存儲啊﹐并且在前台很方便處理。
200分求解。
...全文
1104 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
---涛声依旧--- 2006-04-26
  • 打赏
  • 举报
回复
多謝謝各位
我自己搞定了﹐結貼。
  • 打赏
  • 举报
回复
//================插值================
//2004,oct,4.
//包括Lagrange,newton插值。
//====================================

#include
#include
#include
#include

usingnamespacestd;

classinterpolation{
protected:
intn; //数表的长度为n+1
vectortx;
vectorty;

public:
interpolation(intvn,char*path);
};

classnewton:publicinterpolation{

public:
doublefun(intvn,doublevx); //计算vn次插值。前插
doublefun2(intvn,doublevx); //后插。
newton(intvn,char*path):interpolation(vn,path){}

};

classlagrange:publicinterpolation{

public:lagrange(intvn,char*path):interpolation(vn,path){}
doublefun(intvn,doublevx);
};

doublelagrange::fun(intvn,doublevx){
vectorx(tx);
vectory(ty);
doubleli=1,Ln=0;
for(inti=0;i<=vn;i++){
for(intj=0;j<=vn;j++)if(j!=i)li*=((vx-x[j])/(x[i]-x[j]));
Ln+=y[i]*li;li=1;
}
returnLn;
}

interpolation::interpolation(intvn,char*path){
n=vn;
ifstreamin(path,ios::in);
inti;
doubletemp;
for(i=0;i<=vn;i++){
in>>temp;
tx.push_back(temp);
cout< }
cout< for(i=0;i<=vn;i++){
in>>temp;
ty.push_back(temp);
cout< }
cout<}

doublenewton::fun(intvn,doublevx){
vectorx(tx);
vectory(ty);
doubleh=x[1]-x[0];
doublet=(vx-x[0])/h;
inti,j;
for(i=1;i<=vn;i++)for(j=vn;j>=i;--j)y[j]-=y[j-1];
doubleli=1;
doubleLn=y[0];
for(i=1;i<=vn;++i){
li*=1.0/i*(t-i+1);
Ln+=y[i]*li;
}
returnLn;
}
doublenewton::fun2(intvn,doublevx){
vectorx(tx);
vectory(ty);
doubleh=x[1]-x[0];
doublet=(vx-x[n])/h;
inti,j;
for(i=1;i<=vn;++i){ //计算vn次插值。
cout< for(j=n-vn;j<=n-i;j++){
y[j]=y[j+1]-y[j];
cout<<"ty["< }
cout< }
doubleli=1,Ln=ty[n];
for(i=1;i<=vn;i++){
li*=1.0/i*(t-i+1);
Ln+=y[n-i]*li;
}
returnLn;
}

voidmain(){
/*
newtonnn(6,"d:\\dy\\fnumtable2.txt");
//数表如下:
//1.01.051.101.151.201.251.30
//1.01.024701.048811.072381.095441.118031.14017

cout< cout<*/
lagrangelag(3,"d:\\dy\\fnumtable.txt");
//数表如下:
//0.40.50.70.8
//-0.916291-0.693147-0.356675-0.223144
cout<
}

代码是粘C++的。
你试一试吧。
  • 打赏
  • 举报
回复
我要强调的是,SQL Server是用来存储信息的数据库系统,如果是计算的话,还是应该放在前台。
再说:
Yang_(扬帆破浪)
"编译(或者解释)系统是比较复杂的,一般我们能做的都是很小的子集,所以就算是放在前台,也要先限定这个子集,最好用文法把这个集合写出来,免得编程的时候漏洞百出。"
这个说法,可以看出他没有写过这样的程序,根本不是解释系统那么复杂,还用到了文法,我们做的不是语法分析器,用什么文法?
四则混合运算很简单:+,-,*,/,(,),[,],{,},一共就这么多种符号,根本就不用做子集,用一个数组存储一个二维表,这个二维表说明其优先级及结合次序,表如下:
+ - * / ( )
+ 0 > < < < >
- > 0 < < < >
* > > 0 > < >
/ > > > 0 < >
( < < < < < >
) > > > > > >
做两个栈,一个栈用来放数据,一个栈用来放运算符。根据取出的数据和符号来计算,算法就是根据上面的表看是先运算出结果还是先等待后面的高优先级符号。

//2004.10.10.
//byduoyun.
//一位数的四则和乘方运算.哈哈.
//只能计算二元运算符的表达式.
//优先关系表table中的3表示未定义,如果出现,认为是语法错误。
#pragmawarning(disable:4786)

#include
#include
#include
#include
#include

usingnamespacestd;

classexpression{
stringexp;
mapmm; //!!!!mm似乎应该继承一下从而有自己的构造函数,
//在expression中定义mm为静态成员?????
//i.......

staticinttable[8][8];
stackoo;
stacknn;
doubleoperation(doublen1,charc,doublen2);
intprecede(charc1,charc2);
public:
doubleevalute();
expression(string);

};
//以+-*/()^#的次序排列
//0-->greater,//1-->less,//2-->equal,//3-->notdefined
intexpression::table[8][8]=
{
{0,0,1,1,1,0,1,0},
{0,0,1,1,1,0,1,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{1,1,1,1,1,2,1,3},
{0,0,0,0,3,0,0,0},
{0,0,0,0,1,0,0,0},
{1,1,1,1,1,3,1,2}
};

intinlineexpression::precede(charc1,charc2){
returntable[mm[c1]][mm[c2]];
}
doubleexpression::operation(doublen1,charc,doublen2){
//
switch(c){
case'+':returnn1+n2;
case'-':returnn1-n2;
case'*':returnn1*n2;
case'/':returnn1/n2;
case'^':returnpow(n1,n2);
default:cout<<"badoperator!!!!"< }
}
doubleexpression::evalute(){
oo.push('#');
string::iteratorp=exp.begin();
chartheta;
doublea,b;
while(*p!='#'||oo.top()!='#'){
map::iteratorpp=mm.find(*p);
if(pp==mm.end()){ //ifthecurrentcharisnotanoperator.
if(*p<48||*p>58){
cout<<"Badnumoroperator!!!!"< exit(0);
}
nn.push(*p-48); //pushittothenumstack.
p++;
}
elseswitch(precede(oo.top(),*p)){
case1:
oo.push(*p);
p++;break;
case2:
if(!oo.empty())oo.pop();
p++;break;
case0:
if(!oo.empty()){
theta=oo.top();
oo.pop();
}
else{
cout<<"youenteredabadexpression"< <<"stackooError!!noelement,can'tpop"< exit(1);
}
if(!nn.empty()){
b=nn.top();nn.pop();
}
else{
cout<<"youenteredabadexpression"< <<"stacknnError!!noelement,can'tpop"< exit(1);
}
if(!nn.empty()){
a=nn.top();nn.pop();
}
else{
cout<<"youenteredabadexpression"< <<"stacknnError!!noelement,can'tpop"< exit(1);
}
nn.push(operation(a,theta,b));
break;
default:cout<<"badexpression!!!"< }
}
if(nn.empty()){
cout<<"badresult!!!"< exit(0);
}
returnnn.top();
}
expression::expression(stringexpress){
exp=express+'#';
mm.insert(map::value_type('+',0));
mm.insert(map::value_type('-',1));
mm.insert(map::value_type('*',2));
mm.insert(map::value_type('/',3));
mm.insert(map::value_type('(',4));
mm.insert(map::value_type(')',5));
mm.insert(map::value_type('^',6));
mm.insert(map::value_type('#',7));
}

voidmain(){
stringexpr="";
cout<<"Helloeveryone."< <<"Icanonlyhandleonedigitcaculation."< <<"so,don'tpuzzleme.*_*,"< <<"Iwillworkhardandlearnmoreinthefuture."< while(expr!="#"){
cout<<"Enteranexpression(Entera'#'willendtheprogram):"<
cin>>expr;
//cout< if(expr=="#")break;
expressione(expr);
cout<<"theresultof"< }
}
prcgolf 2006-04-13
  • 打赏
  • 举报
回复
up
---涛声依旧--- 2006-04-13
  • 打赏
  • 举报
回复
前提是这些表的连接条件要确定
難就難在這里啊(用戶自定義的﹐我沒法知道这些表的连接条件啊)﹐目前做特殊處理的﹐但不通用
撸大湿 2006-04-12
  • 打赏
  • 举报
回复
楼主参照libin_ftsafe(子陌红尘) 的动态语句
declare @s varchar(8000)
select @s='select '+V+' as val from #1' from #2 where ID=1


把PRINT @s 看看
子陌红尘 2006-04-12
  • 打赏
  • 举报
回复
單一一個表的蠻好處理﹐
如果再復雜點的話﹐如公式是其他几個表中的几個字段組合成的﹐怎么動態處理啊?
是在后台處理好﹐還是在前台處理好呢?
-----------------------------------------------------------------------------------------------------------------------
几个表可以通过SQL语句合并到一个查询里
  • 打赏
  • 举报
回复
to:华裔大魔王—抗日英雄—抗日要从娃娃抓起
妈的,我也抗日,我喜欢你的名字。
这样说话不像(交大)了吧
我以前是焦作大学毕业的,应该也是(焦大),现在是郑大。呵呵
---涛声依旧--- 2006-04-12
  • 打赏
  • 举报
回复
謝謝樓上几位

單一一個表的蠻好處理﹐
如果再復雜點的話﹐如公式是其他几個表中的几個字段組合成的﹐怎么動態處理啊?
是在后台處理好﹐還是在前台處理好呢?
撸大湿 2006-04-12
  • 打赏
  • 举报
回复



楼上说话口气怎么那么像交大才子-----"migthline (交大的Hejlsberg) "
  • 打赏
  • 举报
回复
既然是公式,那肯定就是有输入参数和返回值这两点。
如果需要用户写的公式存在数据库中,那是数据库的功能,数据库就是干这个的,你想怎么存都可以,这我就不多说了。
但如果要想执行这个公式,那也不难,但那不是数据库的事儿,数据库要做的其实就是把公式取出来,其它的就不归它管了。
那归谁管?当然归应用逻辑来管。比如你的开发工具是.net,写一个类,用来分析和执行这个公式字符串。
不会?晕,学过数据结构吗?就是严蔚敏那一版,那本书有个配套的练习册,册子上有很多案例程序,第二个就是写一个分析公式并执行的程序,不过没有答案,想学编程就要先学好数据结构和算法,把那本书好好看看,把练习册上的例子编完,你就是高手... ...
撸大湿 2006-04-12
  • 打赏
  • 举报
回复
忘了执行了


declare @a int,@b int ,@c int

declare @公式 nvarchar(4000),@sql varchar(8000)

select @公式='A*B-C',@a=100,@b=1000,@c=10

set @sql= 'SELECT '+REPLACE(
REPLACE(
REPLACE(
@公式,'A',cast(@a as nvarchar(1000))),
'B',cast(@b as nvarchar(1000))),
'C',cast(@c as nvarchar(1000)))+' AS 结果'


EXEC (@sql)


结果

99990
撸大湿 2006-04-12
  • 打赏
  • 举报
回复
declare @a int,@b int ,@c int

declare @公式 nvarchar(4000)

select @公式='A*B-C',@a=100,@b=1000,@c=10

print 'SELECT '+REPLACE(
REPLACE(
REPLACE(
@公式,'A',cast(@a as nvarchar(1000))),
'B',cast(@b as nvarchar(1000))),
'C',cast(@c as nvarchar(1000)))
子陌红尘 2006-04-12
  • 打赏
  • 举报
回复
create table #1(A int,B int,C int)
insert into #1 values(6,6,2)
insert into #1 values(2,2,2)
insert into #1 values(4,4,2)

create table #2(ID int,V varchar(1000))
insert into #2 values(1,'A*B/C')

declare @s varchar(8000)
select @s='select '+V+' as val from #1' from #2 where ID=1
exec(@s)

/*
val
-----------
18
2
8
*/

drop table #1,#2
---涛声依旧--- 2006-04-12
  • 打赏
  • 举报
回复
TO﹕dutguoyi(新鲜鱼排)
如果那樣的話﹐在前台處理(計算)就不方便了
若僅僅是存儲起來不參與計算的話﹐就可以像你那樣做

---涛声依旧--- 2006-04-12
  • 打赏
  • 举报
回复
TO﹕libin_ftsafe(子陌红尘)
我的目的是把用戶在前台自己設置的公式存起來﹐而且很方便的參與計算。

如何通过动态SQL调用执行Varchar中的公式啊?
能否舉個例子﹐謝謝!
子陌红尘 2006-04-12
  • 打赏
  • 举报
回复
如果只用于存放,而不用于计算,可以存放在二进制数据类型中,如varbinary/image

如果该公式需要在SQL语句中参与计算,则最好用varchar/nvarchar类型存放,然后通过动态SQL调用执行。
新鲜鱼排 2006-04-12
  • 打赏
  • 举报
回复
http://unicode.coeurlumiere.com/
如 x²
新鲜鱼排 2006-04-12
  • 打赏
  • 举报
回复
我觉得都是Unicode,只要类型Nvarchar,或者Nchar的类型,都不会出现问题。
Yang_ 2006-04-12
  • 打赏
  • 举报
回复
你的例子不是很复杂,因为只是+-*/()
你要做的是把字段名替换成 表名.字段名,这样的公式在确定查询哪些表,而且这些表的连接条件确定的情况下是可以用动态sql生成查询的

鑽針單價====〉 采購表.鑽針單價
加载更多回复(4)
可在线对数学方程式进行可视化编辑。编辑后有三种输出方式,一是将数学公式生成图片,放在WebServer上,链接地址由ASP/PHP/ASP.NET插入网页;二是直接生成静态网页,当访客打开含有数学公式的静态网页时,再激发WebServer上的CGI将数学公式生成图片输出;三是将编辑好的数学公式的TeX/LaTeX指令与网页一起存于数据库,在访客通过ASP/PHP/ASP.NET调用时,由WebServer生成图片并输出网页 主要功能和特点:   1、对于初学者,有直观易用、所见即所得(英文:What You See Is What You Get,缩写:WYSIWYG)的用户界面;对于TeX/LaTeX语法精通者,能所想即所得(英文:What You Think Is What You Get,缩写:WYTIWYG),随心所欲编辑数学公式,无需再像MS-WORD那样在工具栏选来选去,直接写下你心公式,编译一下,马上就能看到你心所想的数学公式,不行再改。   2、对于初学者,具有可视化的WEB编辑界面;对于精通者,可直接在网页插入公式TeX代码,存储一下,即可完成公式的网络发布,而不必先在MathTypeK或MS-WORD编好公式,再以在网页插图的方式来进行数学公式的网络发布。   3、能在Windows、Linux和FreeBSD等各种网络服务器运行。   4、自动智能改变公式的字体和格式,适合各种复杂的公式,支持多种字体。   5、支持TeX和LaTeX,并能够把公式转化为支持Web的各种图形。   6、超过500种公式符号和模版,涵盖数学、物理、化学、地理等科学领域。
WebTeX 网络公式可视化编辑器 的源码分为两部分。一部分是核心源码,是一个基于TeX/LaTeX的CGI应用程序、dll组件或浏览器插件。另一部分是基于ASP/PHP/ASP.NET/JSP的输入TeX/LaTeX指令的可视化编辑器源码,它可在线对数学方程式进行可视化编辑。编辑后有四种输出方式供选择。一是将数学公式生成图片,放在WebServer上,链接地址由ASP/PHP/ASP.NET插入网页。二是直接生成静态网页,当访客打开含有数学公式的静态网页时,再激发WebServer上的CGI将数学公式生成图片输出。三是将编辑好的数学公式的TeX/LaTeX指令与网页一起存于数据库,在访客通过ASP/PHP/ASP.NET/JSP调用时,由WebServer生成图片并输出网页。四是生成符合MathML标准的文本文件,再由浏览器插件解析为公式显示。   WebTeX 网络数学公式编辑器的主要特点:   1、对于初学者,有直观易用、所见即所得(英文:What You See Is What You Get,缩写:WYSIWYG)的用户界面;对于TeX/LaTeX语法精通者,能所想即所得(英文:What You Think Is What You Get,缩写:WYTIWYG),随心所欲编辑数学公式,无需再像MS-WORD那样在工具栏选来选去,直接写下你心公式,编译一下,马上就能看到你心所想的数学公式,不行再改。   2、对于初学者,具有可视化的WEB编辑界面;对于精通者,可直接在网页插入公式TeX代码,存储一下,即可完成公式的网络发布,而不必先在MathType或MS-WORD编好公式,再以在网页插图的方式来进行数学公式的网络发布。   3、能在Windows、Linux和FreeBSD等各种网络服务器运行。   4、自动智能改变公式的字体和格式,适合各种复杂的公式,支持多种字体。   5、支持TeX和LaTeX,并能够把公式转化为支持Web的各种图形。   6、超过600种公式符号和模版,涵盖数学、物理、化学、地理等科学领域,另外能生成围棋棋普、乐谱等。

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧