练习:命令行计算器 🧮
目标
写一个能在终端里跑的简易计算器。用户输入两个数字和一个运算符,程序输出结果。就像这样:
请输入第一个数字: 10
请输入运算符 (+, -, *, /): *
请输入第二个数字: 3
结果: 10 * 3 = 30
听起来很简单对吧?但加上错误处理之后,事情就有趣了——用户可不会乖乖输入你想要的东西。
需求清单
你的计算器需要做到:
- ✅ 支持四种运算:
+、-、*、/ - ✅ 用户输入非数字时,给出友好提示(而不是直接崩溃)
- ✅ 除以零时,给出错误提示
- ✅ 输入不支持的运算符时,告诉用户"不认识这个符号"
- 🌟 加分项:让计算器能连续运算(循环),输入
q退出
骨架代码
先看看大体框架长什么样,核心逻辑需要你自己填:
加载代码编辑器中……
分步提示
别急着看答案!先试试自己写,卡住了再往下看。
提示 1:calculate 函数怎么写?
核心就是一组条件判断。Python 和 JS 的思路完全一样:
如果运算符是 "+" → 返回 num1 + num2
如果运算符是 "-" → 返回 num1 - num2
如果运算符是 "*" → 返回 num1 * num2
如果运算符是 "/" → 先检查 num2 是不是 0,是的话返回错误信息
其他情况 → 返回"不支持的运算符"
关键问题:函数应该返回什么?只返回数字?还是也可能返回错误信息?想想怎么设计最合理。
提示 2:怎么安全地获取数字输入?
用户可能输入 "abc" 而不是数字。你需要捕获这个错误:
加载代码编辑器中……
提示 3:循环怎么做?
主函数应该是一个 while True / while (true) 无限循环。在循环里:
- 获取输入
- 如果用户输入了
q,就break跳出循环 - 否则继续计算
参考答案
真的先自己试过了吗? 那好吧,点开看看:
🔑 点击展开 Python 参考答案
def calculate(num1, operator, num2):
if operator == "+":
return ("ok", num1 + num2)
elif operator == "-":
return ("ok", num1 - num2)
elif operator == "*":
return ("ok", num1 * num2)
elif operator == "/":
if num2 == 0:
return ("error", "除数不能为零!")
return ("ok", num1 / num2)
else:
return ("error", f"不支持的运算符: {operator}")
def get_number(prompt):
while True:
try:
return float(input(prompt))
except ValueError:
print("请输入一个有效的数字!")
def main():
print("欢迎使用计算器!输入 q 退出")
print("支持的运算: +, -, *, /")
print("-" * 30)
while True:
user_input = input("\n请输入第一个数字 (或 q 退出): ")
if user_input.lower() == "q":
print("再见!")
break
try:
num1 = float(user_input)
except ValueError:
print("请输入有效的数字!")
continue
operator = input("请输入运算符 (+, -, *, /): ").strip()
num2 = get_number("请输入第二个数字: ")
status, result = calculate(num1, operator, num2)
if status == "ok":
print(f"结果: {num1} {operator} {num2} = {result}")
else:
print(f"错误: {result}")
main()
🔑 点击展开 JavaScript 参考答案
const readline = require("readline")
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
})
function ask(question) {
return new Promise((resolve) => {
rl.question(question, (answer) => resolve(answer))
})
}
function calculate(num1, operator, num2) {
if (operator === "+") {
return { ok: true, value: num1 + num2 }
} else if (operator === "-") {
return { ok: true, value: num1 - num2 }
} else if (operator === "*") {
return { ok: true, value: num1 * num2 }
} else if (operator === "/") {
if (num2 === 0) {
return { ok: false, error: "除数不能为零!" }
}
return { ok: true, value: num1 / num2 }
} else {
return { ok: false, error: `不支持的运算符: ${operator}` }
}
}
async function main() {
console.log("欢迎使用计算器!输入 q 退出")
console.log("支持的运算: +, -, *, /")
console.log("-".repeat(30))
while (true) {
const input1 = await ask("\n请输入第一个数字 (或 q 退出): ")
if (input1.toLowerCase() === "q") {
console.log("再见!")
rl.close()
break
}
const num1 = parseFloat(input1)
if (Number.isNaN(num1)) {
console.log("请输入有效的数字!")
continue
}
const operator = (await ask("请输入运算符 (+, -, *, /): ")).trim()
let num2 = NaN
while (Number.isNaN(num2)) {
num2 = parseFloat(await ask("请输入第二个数字: "))
if (Number.isNaN(num2)) {
console.log("请输入有效的数字!")
}
}
const result = calculate(num1, operator, num2)
if (result.ok) {
console.log(`结果: ${num1} ${operator} ${num2} = ${result.value}`)
} else {
console.log(`错误: ${result.error}`)
}
}
}
main()
问问 AI
写完之后,把你的代码贴给 AI,问它:"帮我 review 一下这段计算器代码,有什么可以改进的地方?"
AI 可能会建议你用 match(Python 3.10+)或 switch(JS)来替代长长的 if/elif 链,也可能指出一些你没想到的边界情况。
🏋️AI 练习
想挑战更高难度?试试给你的计算器加上这些功能:
- 幂运算:支持
**(Python)/**(JS 中可以用Math.pow()) - 平方根:输入
sqrt时只需要一个数字 - 记忆功能:用一个变量保存上次计算的结果,输入
ans可以引用它 - 表达式解析:直接输入
10 + 3 * 2,让程序自己拆分并计算(这个很有挑战性!)