跳到主要内容

练习:命令行计算器 🧮

目标

写一个能在终端里跑的简易计算器。用户输入两个数字和一个运算符,程序输出结果。就像这样:

请输入第一个数字: 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) 无限循环。在循环里:

  1. 获取输入
  2. 如果用户输入了 q,就 break 跳出循环
  3. 否则继续计算

参考答案

真的先自己试过了吗? 那好吧,点开看看:

🔑 点击展开 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 练习

想挑战更高难度?试试给你的计算器加上这些功能:

  1. 幂运算:支持 **(Python)/ **(JS 中可以用 Math.pow()
  2. 平方根:输入 sqrt 时只需要一个数字
  3. 记忆功能:用一个变量保存上次计算的结果,输入 ans 可以引用它
  4. 表达式解析:直接输入 10 + 3 * 2,让程序自己拆分并计算(这个很有挑战性!)