delphi 中如何实现在一编辑框内输入数字及运算符自动返回运算结果?

lyq 2001-10-29 02:35:54
...全文
445 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
njhhack 2001-10-30
  • 打赏
  • 举报
回复
看来我要来回答这个问题了,我没有用数据结构书上说的算法,这是我自已的方法,我用了递规,不过不用递规了是可以的,其实就是做一个表达式运算器,在算24游戏中有点用:)
{
******** 一个表达式运算器(快速优先法) ***********
* 作者: 倪建华 *
* 最后更新:2001.2.24 *
* 信箱: njhhack@china.com *
* 主页: http://njhhack.at.china.com *
* 欢迎使用本软件,转载此源码者请加上以上信息 *
* 请尊重作者劳动,谢谢合作! *
* HackSoft Workgroup 2001.2.24 *
**************************************************
}

int fun_min(int km,int *a2)
{
int i,min=25536;
for(i=km-1;i>0;i--)if(min>a2[i])min=a2[i];
for(i=km-1;i>0;i--)if(min==a2[i])break;
return i;
}
float fun_2(int km,float *f1,char *a1,int *a2)
{
int i,j;
float ff1,ff2,ff3;
if(km<=1){ff3=f1[0];}
else if(km<=2){ff1=f1[0];ff2=f1[1];i=1;}
else
{
i=fun_min(km,a2);
if(i>=2)ff1=fun_2(i,f1,a1,a2);
else ff1=f1[i-1];
if(km-i>=2)ff2=fun_2(km-i,f1+i,a1+i,a2+i);
else ff2=f1[km-1];
}
switch(a1[i])
{
case '+':ff3=ff1+ff2;break;
case '-':ff3=ff1-ff2;break;
case '*':ff3=ff1*ff2;break;
case '/':ff3=ff1/ff2;break;
}
return ff3;
}
char *fun_num(char *s1,float *f1)
{
*f1=0;
while(1)
{
if(*s1>='0'&&*s1<='9')*f1=*f1*10+(*s1-'0');
else break;
s1++;
}
return s1;
}
int fun_1(char *s1,float *f1,char *a1,int *a2)
{
int k=0,std=0;
while(1)
{
if(*s1>='0'&&*s1<='9'){s1=fun_num(s1,&f1[k]);k++;}
else if(*s1=='-'||*s1=='+'){a1[k]=*s1;a2[k]=std;s1++;}
else if(*s1=='*'||*s1=='/'){a1[k]=*s1;a2[k]=std+1;s1++;}
else if(*s1=='('){std+=2;s1++;}
else if(*s1==')'){std-=2;s1++;}
else if(*s1==0)break;
}
return k;
}
main(int argc,char *argv[])
{
char *s0,*s1="1+(2*(3-4)+3)/((5+3*2)*3-2)+2*(3-6)";
float f1[100];char a1[100];int a2[100];
int i,j,k;
if(argc<=1)
{
s0=s1;
printf("Error,Useage as follow:\ne4 %s",s0);
}
else
{
s0=argv[1];
while(1)
{
if(*s0==0)break;
if(!(*s0>='0'&&*s0<='9'||*s0=='+'||*s0=='-'||*s0=='/'||*s0=='*'||*s0=='('||*s0==')'))
{
printf("\nError Use:%c",*s0);
return;
}
s0++;
}
s0=argv[1];
printf("Exp=%s",s0);
}
k=fun_1(s0,f1,a1,a2);
printf("\nask=%6.2f ",fun_2(k,f1,a1,a2));
}
delphi_user 2001-10-30
  • 打赏
  • 举报
回复
建议你看一下编译原理,我上大学实习的时候做过,现在记得不是很清楚了。
提示你一下吧。
首先你要做一个词法分析,实际上也就是把数字和运算符分离开。然后对运算符设定优先级。
读取字符串,如果是数字或者是低优先级的运算符(如'(','+','-' )把他压入堆栈,如果遇到高优先级的(如‘*‘,‘/’)就取出堆栈得数字和后面的数字进行运算,然后把结果压入堆栈。如果遇到‘)‘那就顺次取出堆栈的数据计算。直到遇到‘(’为止。然后把结果压入堆栈。
这个程序我已经好几年没接触过了,可能说的不是很对,只是作为提示。不过大概思路应该正确。
利用循环太慢,太蠢。而且利用堆栈可以分析更复杂的语法,原来我们做的程序可以编译简单c语言程序。
堆栈得建立,就是数组。只不过你要建立后进先出就可以了。
liang_z 2001-10-29
  • 打赏
  • 举报
回复
把字串转换为SQL语句,让服务器去算比较简单
taxi 2001-10-29
  • 打赏
  • 举报
回复
数据结构,堆栈。
randyamis 2001-10-29
  • 打赏
  • 举报
回复
你看看数据结构方面的书,因为牵涉到优先的问题(例如*就比+优先计算,括号又比其他优先等等),所以必须用到数据结构方面的知识,还要用到栈,有兴趣可以来信一起探讨:randyamis@21cn.com
panxiaosen 2001-10-29
  • 打赏
  • 举报
回复
我用VB做了一个,如果需要请与我联系
可以实现自动运算
panxiaosen@163.com
rodney_hao 2001-10-29
  • 打赏
  • 举报
回复
对此字符串进行处理:建立一个所有运算符号的集合,或者是常量数组,建立一个循环,利用pos函数对运算符进行定位,然后将运算符前的字符转变为数字,后面的雷同,如果有多个,也类似处理。大体思想就是这样,代码懒得写了。
hotyei 2001-10-29
  • 打赏
  • 举报
回复
学过数据结构的不难,不过如果控件与数据关联的话,我也不太会。
hellion 2001-10-29
  • 打赏
  • 举报
回复
很早以前(win31)时代用vc写过,支持多种数学函数和运算符。
hymen1 2001-10-29
  • 打赏
  • 举报
回复
to FourLegFlyCat(老猫):
怎样从一个STRING里然后取出操作符的位置再提取数字呢?

这个才是关键所在?
Triumph 2001-10-29
  • 打赏
  • 举报
回复
看一看数据结构吧,用栈可以实现。
FourLegFlyCat 2001-10-29
  • 打赏
  • 举报
回复
弄错了是StrToFloat
hymen1 2001-10-29
  • 打赏
  • 举报
回复
to Focus(老鱼) 
多少分你才给???
yaopeng521@263.net
FourLegFlyCat 2001-10-29
  • 打赏
  • 举报
回复
把编辑框的TEXT放在一个STRING里然后取出操作符的位置再提取数字,最后用STRTOINT,FLOATTOINT判断一下即可
bubble 2001-10-29
  • 打赏
  • 举报
回复
同意dq(独轻)的意见,Focus(老鱼)你先说说,看能值多少银子。
大家认为怎么样?
yaoyaozhang 2001-10-29
  • 打赏
  • 举报
回复
应该可以做个控件用用,那样大家也可以用用。要么你找个控件得了,有几控件是可以下拉出来一个计算器的list来计算的。
hymen1 2001-10-29
  • 打赏
  • 举报
回复
不就是计算器的原理吗?
我来试一试。
看行不行。
yopeng 2001-10-29
  • 打赏
  • 举报
回复
yopeng,欢迎您,您的专家分:186、可用分:1134、参与分:2444
老鱼大哥,你看着办把!!!
dq 2001-10-29
  • 打赏
  • 举报
回复
说说能实现什么样的功能?支持哪些运算?参数接口是不是复杂(给个例子)?
看看值多少银子。
lyq 2001-10-29
  • 打赏
  • 举报
回复
多少分?
tl_lyq@sohu.com
加载更多回复(8)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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