Lua实现计算器功能

lua实现一个计算器

最近用lua写了一个计算器,可以完成(+ - * /)的功能,并且加入了对括号优先级的计算。

  1. 先定义打印函数和无括号的公式处理函数

无括号的公式处理函数:
定义两个表num和sig,一个存放数字,一个存放符号,读取公式字符串按照公式的顺序分别存字符和数字到两个表。这样两个表有隐式联系,比如

(3*1-2)num={3,1,2},sig={”*“,”-“},
(3*1-2)=num[1]..sig[1]..num[2]..sig[2]..num[3]
第i步计算:num[i]..sig[i]..num[i+1]

但是有例外情况,就是公式中有负数时(3*-2+1)做额外处理,符号部分还是存入sig,数字部分存入num

--打印函数
function printTable(t)
	for i,v in pairs(t) do
		print(v)
	end
end

-- 1 、无括号的公式处理函数
function calculator(s)
	-- 存放数字的表
	local num={}
	-- 存放符号的表
	local sig={}

	-- 给负号开头的数据进行优化	(-5)->(0-5)
	if(string.find(s,"-")==1)
		then
		s="0"..s
	end
	if(string.find(s,"%a"))
		then
		print("格式错误!")
	else
		while(s) do
			-- 处理数字,数字存入sum表中
			if(string.find(s,"%d")==1)
				then
				-- 查找一个或多个数字
				d1,d2=string.find(s,"%d*%d")
				-- 插入表中
				table.insert(num,string.sub(s,d1,d2))
				-- 字符串缩短
				s=string.sub(s,d2+1)

			--处理(*-3)(/-3)(+-3)(--3)负数类型
			-- 数字存入sum表中,符号存入sig表中
			elseif(string.find(s,"%p%p%d*%d")==1)
				then
				d1,d2=string.find(s,"%p%p%d*%d")
				-- 符号部分插入sig
				table.insert(sig,string.sub(s,d1,d1))
				-- 负数部分插入num
				table.insert(num,string.sub(s,d1+1,d2))
				s=string.sub(s,d2+1)

			-- 处理单个符号,符号存入sig表中
			elseif(string.find(s,"%p")==1)
				then
				d1,d2=string.find(s,"%p")
				table.insert(sig,string.sub(s,d1,d2))
				s=string.sub(s,d2+1)

			else
				print("输入有误")
			end
			-- 字符串截完后退出循环
			if(#s==0)
				then break end
		end
	end
  1. 计算顺序,先乘除,后加减
-- 先乘除
	for i=1,#sig do 
		if(sig[i]=="*")
			then
			num[i]=num[i]*num[i+1]
			table.remove(sig,i)
			table.remove(num,i+1)
		end
	end
	for i=1,#sig do 

		if(sig[i]=="/")
			then
			num[i]=num[i]/num[i+1]
			table.remove(sig,i)
			table.remove(num,i+1)
		end
	end

	-- 乘除完 只剩加减 必须按顺序进行加减运算
	while(#sig~=0) do
		if(sig[1]=="+")
		then
			num[1]=num[1]+num[2]
			table.remove(num,2)
			table.remove(sig,1)
		elseif(sig[1]=="-")
			then
			num[1]=num[1]-num[2]
			table.remove(num,2)
			table.remove(sig,1)
		end
	end
	-- 返回表中最终的结果
	return num[1]
end
  1. 括号优先级的处理
    原理:
    1、寻找s2中第一个“)”右括号下标M
    2、在s2的第1~M个数中,寻找最后一个“(”左括号下标N
    3、截取s2中MN之间的字符串,传入函数,得到的返回值替换该位置(删除括号)
    4.、继续循环,知道查找不到“)”右括号为止
    5、括号处理完,将无括号的字符串传入函数 得到最终结果

-- 2、接收输入的公式
print("请输入要计算的公式:")
s2=io.read()

-- 3、根据优先级先计算嵌套括号内的数据
while(string.find(s2,"%)")) do
	-- 获取第一个右括号的下标
	dr=string.find(s2,"%)")
	-- 截取右括号之前的字符串
	s11=string.sub(s2,1,dr)
	-- 倒转字符串方便查询
	sr11=string.reverse(s11)
	-- 获取离第一个右括号下标最近的左括号下标
	dl=#sr11-string.find(sr11,"%(")+1
	-- 截取字符串中括号内数据
	ns=string.sub(s2,dl+1,dr-1)
	-- 传入计算器得到返回值
	rs=calculator(ns)
	-- 结果替换括号内容
	s2=string.sub(s2,1,dl-1)..rs..string.sub(s2,dr+1)
	-- print(s2)
end
-- 4、输出最终结果
print("最终结果:")
print(calculator(s2))

测试
测试结果

问题:
目前测试加减乘除加括号优先级,运算结果都没问题
只有-- 括号中运算结果是小数时会处理错误(缺乏带小数的数字处理,4*5.0),以后有时间再补充吧

有部分思路参考了
https://blog.csdn.net/a598211757/article/details/100134804

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Urho3D 是一个跨平台的游戏引擎,支持使用 C++ 和 Lua 进行游戏开发。下面是使用 Lua 实现对话功能的基本步骤: 1. 创建对话内容 可以在代码中创建对话内容,也可以从文件中读取对话内容。例如,可以将对话内容存储在 XML 或 JSON 文件中,然后使用 Lua 解析文件内容并将其加载到游戏中。 2. 创建对话界面 可以使用 Urho3D 的 UI 系统创建对话界面,例如创建一个包含文本框和按钮的窗口。也可以使用 Urho3D 的 SceneGraph 创建对话框作为 3D 对象。 3. 显示对话内容 在对话开始时,将对话内容加载到对话框中。当玩家与 NPC 交互时,显示下一个对话内容。可以使用 Lua 控制对话框的显示和隐藏,以及对话内容的更新。 4. 处理对话选项 对话通常包含多个选项供玩家选择,例如“接受任务”或“拒绝任务”。可以使用 Urho3D 的 UI 系统创建按钮来表示选项,当玩家选择一个选项时,使用 Lua 处理对应的逻辑。 下面是一个简单的示例代码,演示如何使用 Urho3D 和 Lua 实现对话功能: ```lua -- 加载对话内容 local dialog = require("dialog") local currentLine = 1 -- 创建对话界面 local dialogWindow = CreateDialogWindow() -- 显示对话内容 function ShowNextLine() if currentLine <= #dialog.lines then local line = dialog.lines[currentLine] dialogWindow:SetText(line.text) currentLine = currentLine + 1 else -- 对话结束 dialogWindow:SetVisible(false) end end -- 处理对话选项 function OnAcceptButtonPressed() -- 处理“接受任务”选项 end function OnDeclineButtonPressed() -- 处理“拒绝任务”选项 end -- 初始化对话 dialogWindow:SetVisible(true) ShowNextLine() ``` 在此示例中,`dialog` 表示对话内容,`currentLine` 表示当前对话的行数。`CreateDialogWindow()` 函数用于创建对话框界面,`SetText()` 用于设置对话框的文本内容。`OnAcceptButtonPressed()` 和 `OnDeclineButtonPressed()` 用于处理对话选项的逻辑。最后,`SetVisible()` 用于显示或隐藏对话框。 需要注意的是,此示例代码仅作为参考,实际应用中需要根据具体需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值