社区
Delphi
帖子详情
delphi 中如何实现在一编辑框内输入数字及运算符自动返回运算结果?
lyq
2001-10-29 02:35:54
...全文
445
35
打赏
收藏
delphi 中如何实现在一编辑框内输入数字及运算符自动返回运算结果?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
Delphi
5开发人员指南
11.1.2 在
Delphi
程序
中
使用多线程 304 11.1.3 关于线程的滥用 305 11.2 TThread对象 305 11.2.1 TThread基础 305 11.2.2 TThread实例 307 11.2.3 线程的终止 307 11.2.4 与VCL同步 308 11.2.5 一个演示程序 310 ...
Delphi
5 经典教程
第一部分 快速开发的基础 第1章
Delphi
5下的Windows编程 1 1.1
Delphi
产品家族 1 1.2
Delphi
是什么 3 1.2.1 可视化开发环境 3 1.2.2 编译器的速度和已编译代码的效 率 4 1.2.3 编程语言的功能及其复杂性 4 1.2.4 ...
Delphi
XE10安卓开发(实战篇)
实战方式讲解
Delphi
XE10的安卓开发,从安卓开发开发环境配置开始讲解,实战讲解如何使用FMX进行安卓开发,App的创建,调试,UI设计、让学员快速入门
Delphi
安卓App的开发
oracle
中
特殊的比较
运算
符
,【学习笔记】oracle 比较
运算
符
,逻辑
运算
符
,特殊
运算
符
,判断空值,大小写敏感...
,^= 不等于逻辑
运算
符
运算
的优先顺序:NOT > AND > OR (如果要改变优先顺序,可以使用括号)特殊
运算
符
:[NOT]BETWEEN…AND…:用于测试是否在范围内;[NOT]IN (…):用于测试是否在列表
中
;[NOT]LIKE:用于进行...
Delphi
5,392
社区成员
262,731
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章