TC官方合作论坛

 找回密码
 立即注册
查看: 1088|回复: 1

[问题] 写了一个计算器,问题多多,请教大神们

[复制链接]
发表于 2016-7-18 14:58:00 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 wang220211 于 2016-7-18 15:02 编辑

这段时间宽带坏了就自己没事写个计算器试试。我写的是输入完一个带括号的算式后按等号计算。后来没有找到把字符串转为计算式的命令,就找了一下这方面的介绍,看到一个介绍栈的文章,勉强写出来了,但有些问题请教一下大神们。
1,问题一,tc中有把字符串直接转为计算式(比如"1-(1+1)")的命令吗?还是我没有找到?
2,问题二, 延时到底应该加在什么样的语句后面?当我连续点击数字时反应节奏非常慢,改了半天延时也只是略有不同,看看我的应该怎么改?
      功能 点击(b,qw)
      变量 a, f=数组(),g
      分割字符串(a,f,g)
      变量 re=字符串截取右侧(a,1)   
       等待(20)
      如果(a=="0")        
          变量 ret=字符串移除(a,1,假)
          等待(20)
          编辑框设置文本("编辑框0",ret&b)
          等待(20)
      否则如果(re==qw)
          错误()
      否则        
          编辑框设置文本("编辑框0",a&b)
          等待(20)
      结束
  结束
3,问题三,上面这段必须先获得文本再设置文本吗?有没有其他写法?
4,问题四,比如
        如果((f="+")||(f="-")||(f="*"))
    这样的语句到底可不可以写成
        如果(f=("+"||"-"||"*"))
    怎么我这样写有语句正常判断,有的就不行呢?
5, 问题五,其中我有几句是这样的
        否则如果(k==0)
            字符栈[k]=f   k=k+1
否则如果(f=="(")
            字符栈[k]=f
            k=k+1
        否则如果(字符栈[k-1]=="(")
            字符栈[k]=f
            k=k+1
    我要是写成
        否则如果((k==0)||(f=="(")||(字符栈[k-1]=="(")}
    就会有问题,但如果
        否则如果((k==0)||(f=="(")}
    只并列两个条件就可以,这是什么原因啊?我单独实验并列多个条件可以执行啊。
6,问题六,其中一部分命令相同我想改成单独定义一个功能,就出现了问题
    其中一句是:
        否则如果(f==")")
           j=j-1
           k=k-1
           循环(真)
            如果(字符栈[k-1]=="(")
            ……
        另外一句是:
           j=j-1
           k=k-1
           循环(真)
             如果(k==0)
             ……
   这样两句怎么写才能定义一个功能使用,其中j,k传址,我改了半天也不对。
7,问题七,请教字符串转计算式有么有没有简单点的写法?
8,问题八,看看我写的能精简不?
谢谢了!
   下面我写的代码(等号部分)


   变量 线程ID
//从这里开始执行
功能 执行()
    //从这里开始你的代码
    转数值()
结束
//终止热键操作
功能 终止_热键()
    线程关闭(线程ID)
结束

功能 转数值()
    变量 a=编辑框获取文本("编辑框0")
    a=字符串替换(a,"(","(|")
    a=字符串替换(a,")","|)")
    a=字符串替换(a,"+","|+|")
    a=字符串替换(a,"-","|-|")
    a=字符串替换(a,"*","|*|")
    a=字符串替换(a,"/","|/|")
    变量 f=数组(),h
    变量 g=字符串分割(a,"|",f)
    变量 数字栈=数组(),字符栈=数组(),j=0,k=0

    遍历(变量 i = 0; i < g; i++)
        如果( h=是否浮点型(f) )
            数字栈[j]=f
            j=j+1
        否则如果(h=是否整型(f))
            数字栈[j]= 转浮点型(f)
            j=j+1
        否则如果(k==0)
            字符栈[k]=f
            k=k+1
        否则如果(f=="(")
            字符栈[k]=f
            k=k+1
        否则如果(字符栈[k-1]=="(")
            字符栈[k]=f
            k=k+1
        否则如果((字符栈[k-1]=="+"||字符栈[k-1]=="-")&&(f=="*"||f=="/"))
            字符栈[k]=f
            k=k+1
        否则如果((字符栈[k-1]=="+"||字符栈[k-1]=="-")&&(f=="+"||f=="-"))
            数字栈[j-2]=计算(数字栈[j-2],数字栈[j-1],字符栈[k-1])
            字符栈[k-1]=f
            j=j-1
        否则如果((字符栈[k-1]=="*"||字符栈[k-1]=="/")&&(f=="*"||f=="/"))
            数字栈[j-2]=计算(数字栈[j-2],数字栈[j-1],字符栈[k-1])
            字符栈[k-1]=f
            j=j-1
        否则如果((字符栈[k-1]=="*"||字符栈[k-1]=="/")&&(f=="+"||f=="-"))
            数字栈[j-2]=计算(数字栈[j-2],数字栈[j-1],字符栈[k-1])
            字符栈[k-1]=f
            j=j-1
        否则如果(f==")")
            j=j-1
            k=k-1
            循环(真)
                如果(字符栈[k-1]=="(")
                    数字栈[j-1]=计算(数字栈[j-1],数字栈[j],字符栈[k])
                    数组指定位置删除(数字栈,j)
                    数组指定位置删除(字符栈,k)
                    k=k-1
                    数组指定位置删除(字符栈,k)
                    跳出
                否则如果((字符栈[k-1]=="+"||字符栈[k-1]=="-")&&(字符栈[k]=="*"||字符栈[k]=="/"))
                    数字栈[j-1]=计算(数字栈[j-1],数字栈[j],字符栈[k])
                    数组指定位置删除(数字栈,j)
                    j=j-1
                    数组指定位置删除(字符栈,k)
                    k=k-1
                否则如果(字符栈[k-1]=="+")
                    数字栈[j-1]=计算(数字栈[j-1],数字栈[j],字符栈[k])
                    数组指定位置删除(数字栈,j)
                    j=j-1
                    数组指定位置删除(字符栈,k)
                    k=k-1
                否则如果(字符栈[k-1]=="-")
                    数字栈[j-1]=反计算(数字栈[j-1],数字栈[j],字符栈[k])
                    数组指定位置删除(数字栈,j)
                    j=j-1
                    数组指定位置删除(字符栈,k)
                    k=k-1
                结束
            结束
            //            最后计算(字符栈[k-1],"\"(\"",j,k,数字栈,字符栈)
            //            k=k-1
            //            数组指定位置删除(字符栈,k)
        否则
            编辑框设置文本("编辑框0","无法计算")
        结束
    结束
    j=j-1
    k=k-1
    循环(真)
        如果(k==0)
            数字栈[j-1]=计算(数字栈[j-1],数字栈[j],字符栈[k])
            数组指定位置删除(数字栈,j)
            数组指定位置删除(字符栈,k)
            跳出
        否则如果((字符栈[k-1]=="+"||字符栈[k-1]=="-")&&(字符栈[k]=="*"||字符栈[k]=="/"))
            数字栈[j-1]=计算(数字栈[j-1],数字栈[j],字符栈[k])
            数组指定位置删除(数字栈,j)
            j=j-1
            数组指定位置删除(字符栈,k)
            k=k-1
        否则如果(字符栈[k-1]=="+")
            数字栈[j-1]=计算(数字栈[j-1],数字栈[j],字符栈[k])
            数组指定位置删除(数字栈,j)
            j=j-1
            数组指定位置删除(字符栈,k)
            k=k-1
        否则如果(字符栈[k-1]=="-")
            数字栈[j-1]=反计算(数字栈[j-1],数字栈[j],字符栈[k])
            数组指定位置删除(数字栈,j)
            j=j-1
            数组指定位置删除(字符栈,k)
            k=k-1
        结束
    结束
    //    最后计算(k,0,j,k,数字栈,字符栈)
    调试输出(数字栈)
    调试输出(字符栈)
结束

功能 计算(a,b,c)
    变量 d
    选择(c)
        条件 "+"
        d=a+b
        条件 "-"
        d=a-b
        条件 "*"
        d=a*b
        条件 "/"
        d=a/b
    结束
    返回 d
结束

功能 反计算(a,b,c)
    变量 d
    选择(c)
        条件 "+"
        d=a-b
        条件 "-"
        d=a+b
    结束
    返回 d
结束

功能 按钮0_点击()
    //这里添加你要执行的代码
    线程ID=线程开启("执行","")
结束



最后完整程序及代码

计算器.rar (3.8 MB, 下载次数: 289)
回复

使用道具 举报

 楼主| 发表于 2016-7-20 14:51:04 | 显示全部楼层
怎么没人理
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-9-29 02:47 , Processed in 0.041561 second(s), 26 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表