PowerBuilder——实现一个简单计算器

  • 计算器布局如下:
    PowerBuilder——实现一个简单计算器
  • 实现步骤
      1.定义实例变量(由于运算符有挂在窗口,所以将变量定义为全局变量,以便菜单项也可以使用)
      
        decimal num //存放操作数,decimal带符号数据,18位有效数字
	character operator //存放操作符,character单个字符
	int flag //标志位,判断一次计算是否成功
	string sle //记录运算过程,连续运算时将输入的过程显示在文本框1中 
      
      
      2.编写代码,实现当点击数字或小数点按钮时,其值能显示到文本框中
     
     if flag=0 then    //第一次输入,将文本框显示的初始值赋空
		sle_1.text = "" 
		flag = 1  
	end if
	sle_1.text = sle_1.text+this.text   //若不是第一次输入,就将该数字按键的值追加在文本框中
	sle = sle+this.text
     
     
      3.实现运算符(+ 、-、*、/),计算功能
              string()可将任意的数据类型转换成字符串类型
 	      dec()把获取的字符型数据转换成数字
	      mid(string,start,length)  截取字符串的子串
              match(str,textpattern) 确定字符串中是否包含指定模式的字符 
     
   //加减运算,不会出现+++的情况
      choose case operator
	   case '+'
		sle_2.text = string(dec(sle_1.text)+num)  
		sle_1.text = sle_2.text
		//sle_1.text = string(num)+operator+sle_1.text
           case '-'
		sle_2.text = string(num - dec(sle_1.text))
		sle_1.text = sle_2.text
	   case '*'
		sle_2.text = string(num * dec(sle_1.text))
		sle_1.text = sle_2.text
           case '/'
		sle_2.text = string(num/dec(sle_1.text))
		sle_1.text = sle_2.text
      end choose
      num = dec(sle_1.text)   //保留中间结果
      operator = this.text       //保留本次运算,当前输入的运算符
      flag = 0          //准备输入下一个操作数
      //sle_1.text = sle_1.text + this.text
      sle = sle+this.text
      if mid(sle,len(sle)-1,1)= this.text  then 
	   sle = mid(sle,0,len(sle)-1)
      end if
      sle_1.text =  sle
     
      //乘除运算,还存在问题:连按*或/按钮时,文本跨会显示****或/////
      choose case operator
	   case '+'
		sle_2.text = string(dec(sle_1.text)+num)  
		sle_1.text = sle_2.text
	   case '-'
		sle_2.text = string(num - dec(sle_1.text))
		sle_1.text = sle_2.text
	   case '*'
		if match(sle_1.text,"^[0-9]$") = true then  //出现***后,匹配传过来以便下次运算的sle_1.text的内容是否由数字组成
			sle_2.text = string(num * dec(sle_1.text))
		elseif  match(sle_1.text,"^[0-9]$") = false then
		//将sle_1.text的值改为1,进行运算。
			sle_2.text = string(num)
		end if 	
		sle_1.text = sle_2.text
	   case '/'
		if match(sle_1.text,"^[0-9]$") = true then  //出现////后,匹配传过来以便下次运算的sle_1.text的内容是否由数字组成
			sle_2.text = string(num/dec(sle_1.text))
		elseif  match(sle_1.text,"^[0-9]$") = false then
		//将sle_1.text的值改为1,进行运算。这样连按//,不会出现逻辑错误
			sle_2.text = string(num)
	        end if 	
		sle_1.text = sle_2.text
      end choose
      num = dec(sle_1.text)   //保留中间结果
      operator = this.text       //保留本次运算,当前输入的运算符
      flag = 0          //准备输入下一个操作数
      sle = sle+this.text
      if mid(sle,len(sle)-1)= this.text then 
	      sle = mid(sle,0,len(sle)-2)  
      end if
      sle_1.text = sle
      

      4.实现点击=按钮,显示运算的最终结果
      choose case operator
           case '+'
		sle_2.text = string(dec(sle_1.text)+num) 
           case '-'
		sle_2.text = string(num - dec(sle_1.text))
           case '*'
		sle_2.text = string(dec(sle_1.text) * num)
           case '/'
		if sle_1.text ="0" then 
			sle_2.text = "不能除以0"
		else
			sle_2.text = string(num/dec(sle_1.text))
		end if
		//sle_1.text = string(num)+operator+sle_1.text 
     end choose    
     num = dec(sle_1.text)   //保留此次计算的数据,即输入的后一个数字,即A+B中的B
     operator = " "      //保留本次运算,当前输入的运算符
     flag = 0          //准备下一个操作数的输入
     sle = sle+operator
     sle_1.text =  sle


      5.实现清空和退格删除功能
      sle_1.text = " "    
      sle_2.text = " "
      flag = 0
      operator = ''
      num = 0   //清空,需将两个文本框的内容赋空即可    
      if len(mid(sle,0,len(sle)-1)) = 0 then  //判断显示的文本框是否为空,
	      sle = ""
      else
	      sle = mid(sle,0,len(sle)-1)  //退格,删除一个数字或是运算符
      end if 
      //messagebox("sle",sle)   
      sle_1.text = sle 


      6.添加菜单(运算符),可通过菜单项的运算符来实现计算器的运算功能
      //加、减运算符
      choose case operator
           case '+'
		w_operator.sle_2.text = string(dec(w_operator.sle_1.text)+num)   
		w_operator.sle_1.text = w_operator.sle_2.text
           case '-'
		w_operator.sle_2.text = string(num - dec(w_operator.sle_1.text))
		w_operator.sle_1.text = w_operator.sle_2.text
           case '*'
		w_operator.sle_2.text = string(num*dec(w_operator.sle_1.text))
		w_operator.sle_1.text = w_operator.sle_2.text
           case '/'
		w_operator.sle_2.text = string(num/dec(w_operator.sle_1.text))
		w_operator.sle_1.text = w_operator.sle_2.text
      end choose
      num = dec(w_operator.sle_1.text)   //保留中间结果  num=A 或是 A+B的结果
      operator = "+"       //保留本次运算,当前输入的运算符
      flag = 0          //准备下一个操作数的输入
      sle = sle+ "+"   //若出现++,则截断最后多的+后再往下计算
      if mid(sle,len(sle)-1,1)= "+"  then 
            sle = mid(sle,0,len(sle)-1)
      end if
      w_operator.sle_1.text =  sle

      //乘、除运算符
      choose case operator
           case '+'
		w_operator.sle_2.text = string(dec(w_operator.sle_1.text)+num)   
		w_operator.sle_1.text = w_operator.sle_2.text
           case '-'
		w_operator.sle_2.text = string(num - dec(w_operator.sle_1.text))
		w_operator.sle_1.text = w_operator.sle_2.text
           case '*'
		if match(w_operator.sle_1.text,"^[0-9]$") = true then  //出现**后,匹配传过来以便下次运算的sle_1.text的内容是否由数字组成
			w_operator.sle_2.text = string(num*dec(w_operator.sle_1.text))
		elseif  match(w_operator.sle_1.text,"^[0-9]$") = false then
		//      **  后 sle_1.text=A*B*C即文本框的内容, 不能转换成数字类型进行运算计算
		//将sle_1.text的值改为1,进行运算。这样连按**,不会出现计算错误
			w_operator.sle_2.text = string(num)
		end if 
		w_operator.sle_1.text = w_operator.sle_2.text
           case '/'
		w_operator.sle_2.text = string(num/dec(w_operator.sle_1.text))
		w_operator.sle_1.text = w_operator.sle_2.text
      end choose
      num = dec(w_operator.sle_1.text)   //保留输入的前一个数
      operator = "*"       //保留本次运算,当前输入的运算符
      flag = 0          //准备下一个操作数的输入
      sle = sle+"*" 
      if mid(sle,len(sle)-1)= "*"  then 
		sle = mid(sle,0,len(sle)-2)
		//sle_1.text = "1"
      else
		w_operator.sle_1.text = sle
      end if

  • 显示问题
    1.按了 = 按钮后,不能接着上次的计算过程进行后续运算
    2. 第一次输入,先按-号再输数字,如-2,文本框只会显示数字2,不影响后续输入的加减计算,但是若后续运算中由乘除运算则会出错
    3.按下小数点按钮,不能在小数点前加上0,显示0.n,在后续运算中若直接先输入小数点,仍会只显示.n,不影响啊计算
    4.按照用户输入的顺序进行计算和显示(输入一个数计算一个数),不能正确计算输入的混合算式
    5.连按乘或除/按钮是,文本跨中会连续显示**或////,但不影响计算功能
上一篇:《Graph Representation Learning》【3】——Neighborhood Reconstruction Methods


下一篇:十进制转十六进制