2026-04-02 14:51:44 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
"""
|
2026-04-02 15:03:50 +08:00
|
|
|
|
math.py - 数学运算工具
|
|
|
|
|
|
提供乘法和除法运算功能
|
2026-04-02 14:51:44 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
2026-04-02 15:03:50 +08:00
|
|
|
|
def multiply(a: float, b: float) -> float:
|
2026-04-02 14:51:44 +08:00
|
|
|
|
"""
|
2026-04-02 15:03:50 +08:00
|
|
|
|
计算两个数的乘积
|
2026-04-02 14:51:44 +08:00
|
|
|
|
|
|
|
|
|
|
参数:
|
2026-04-02 15:03:50 +08:00
|
|
|
|
a: 第一个数
|
|
|
|
|
|
b: 第二个数
|
2026-04-02 14:51:44 +08:00
|
|
|
|
|
|
|
|
|
|
返回:
|
2026-04-02 15:03:50 +08:00
|
|
|
|
两个数的乘积
|
2026-04-02 14:51:44 +08:00
|
|
|
|
"""
|
2026-04-02 15:03:50 +08:00
|
|
|
|
return a * b
|
2026-04-02 14:51:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-04-02 15:03:50 +08:00
|
|
|
|
def divide(a: float, b: float) -> float:
|
|
|
|
|
|
"""
|
|
|
|
|
|
计算两个数的除法
|
2026-04-02 14:51:44 +08:00
|
|
|
|
|
2026-04-02 15:03:50 +08:00
|
|
|
|
参数:
|
|
|
|
|
|
a: 被除数
|
|
|
|
|
|
b: 除数
|
|
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
|
除法结果
|
|
|
|
|
|
|
|
|
|
|
|
异常:
|
|
|
|
|
|
ValueError: 当除数为0时抛出
|
|
|
|
|
|
"""
|
|
|
|
|
|
if b == 0:
|
|
|
|
|
|
raise ValueError("除数不能为0")
|
|
|
|
|
|
return a / b
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_operations():
|
|
|
|
|
|
"""测试乘法和除法运算"""
|
|
|
|
|
|
print("测试乘法运算:")
|
|
|
|
|
|
print("-" * 30)
|
|
|
|
|
|
|
|
|
|
|
|
# 测试乘法
|
|
|
|
|
|
test_cases_multiply = [
|
|
|
|
|
|
(2, 3, 6),
|
|
|
|
|
|
(0, 5, 0),
|
|
|
|
|
|
(-3, 4, -12),
|
|
|
|
|
|
(2.5, 4, 10.0),
|
|
|
|
|
|
(-2.5, -4, 10.0),
|
|
|
|
|
|
(0, 0, 0),
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
for a, b, expected in test_cases_multiply:
|
|
|
|
|
|
result = multiply(a, b)
|
|
|
|
|
|
status = "✓" if abs(result - expected) < 1e-10 else "✗"
|
|
|
|
|
|
print(f"{a} × {b} = {result} {status} (期望: {expected})")
|
|
|
|
|
|
|
|
|
|
|
|
print("\n测试除法运算:")
|
|
|
|
|
|
print("-" * 30)
|
|
|
|
|
|
|
|
|
|
|
|
# 测试除法
|
|
|
|
|
|
test_cases_divide = [
|
|
|
|
|
|
(6, 2, 3),
|
|
|
|
|
|
(10, 4, 2.5),
|
|
|
|
|
|
(-12, 3, -4),
|
|
|
|
|
|
(0, 5, 0),
|
|
|
|
|
|
(7.5, 2.5, 3),
|
|
|
|
|
|
(-10, -2, 5),
|
2026-04-02 14:51:44 +08:00
|
|
|
|
]
|
|
|
|
|
|
|
2026-04-02 15:03:50 +08:00
|
|
|
|
for a, b, expected in test_cases_divide:
|
|
|
|
|
|
try:
|
|
|
|
|
|
result = divide(a, b)
|
|
|
|
|
|
status = "✓" if abs(result - expected) < 1e-10 else "✗"
|
|
|
|
|
|
print(f"{a} ÷ {b} = {result} {status} (期望: {expected})")
|
|
|
|
|
|
except ValueError as e:
|
|
|
|
|
|
print(f"{a} ÷ {b} = 错误: {e}")
|
2026-04-02 14:51:44 +08:00
|
|
|
|
|
2026-04-02 15:03:50 +08:00
|
|
|
|
# 测试除数为0的情况
|
|
|
|
|
|
print("\n测试除数为0的情况:")
|
|
|
|
|
|
print("-" * 30)
|
|
|
|
|
|
zero_test_cases = [
|
|
|
|
|
|
(5, 0),
|
|
|
|
|
|
(0, 0),
|
|
|
|
|
|
(-3, 0),
|
|
|
|
|
|
(10.5, 0),
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
for a, b in zero_test_cases:
|
|
|
|
|
|
try:
|
|
|
|
|
|
result = divide(a, b)
|
|
|
|
|
|
print(f"{a} ÷ {b} = {result} ✗ (应该抛出异常)")
|
|
|
|
|
|
except ValueError as e:
|
|
|
|
|
|
print(f"{a} ÷ {b} = 正确抛出异常: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def interactive_mode():
|
|
|
|
|
|
"""交互式模式"""
|
2026-04-02 14:51:44 +08:00
|
|
|
|
print("\n" + "=" * 40)
|
2026-04-02 15:03:50 +08:00
|
|
|
|
print("交互式计算模式 (输入 'exit' 退出)")
|
2026-04-02 14:51:44 +08:00
|
|
|
|
print("=" * 40)
|
|
|
|
|
|
|
|
|
|
|
|
while True:
|
2026-04-02 15:03:50 +08:00
|
|
|
|
print("\n选择操作:")
|
|
|
|
|
|
print("1. 乘法")
|
|
|
|
|
|
print("2. 除法")
|
|
|
|
|
|
print("exit. 退出")
|
|
|
|
|
|
|
|
|
|
|
|
choice = input("请选择 (1/2/exit): ").strip().lower()
|
|
|
|
|
|
|
|
|
|
|
|
if choice == 'exit':
|
|
|
|
|
|
print("退出交互模式。")
|
2026-04-02 14:51:44 +08:00
|
|
|
|
break
|
|
|
|
|
|
|
2026-04-02 15:03:50 +08:00
|
|
|
|
if choice not in ['1', '2']:
|
|
|
|
|
|
print("无效选择,请重新输入。")
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
2026-04-02 14:51:44 +08:00
|
|
|
|
try:
|
2026-04-02 15:03:50 +08:00
|
|
|
|
a = float(input("请输入第一个数: "))
|
|
|
|
|
|
b = float(input("请输入第二个数: "))
|
|
|
|
|
|
|
|
|
|
|
|
if choice == '1':
|
|
|
|
|
|
result = multiply(a, b)
|
|
|
|
|
|
print(f"{a} × {b} = {result}")
|
|
|
|
|
|
elif choice == '2':
|
|
|
|
|
|
try:
|
|
|
|
|
|
result = divide(a, b)
|
|
|
|
|
|
print(f"{a} ÷ {b} = {result}")
|
|
|
|
|
|
except ValueError as e:
|
|
|
|
|
|
print(f"错误: {e}")
|
|
|
|
|
|
|
2026-04-02 14:51:44 +08:00
|
|
|
|
except ValueError:
|
2026-04-02 15:03:50 +08:00
|
|
|
|
print("错误:请输入有效的数字。")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
|
"""主函数"""
|
|
|
|
|
|
print("数学运算工具测试")
|
|
|
|
|
|
print("=" * 40)
|
|
|
|
|
|
|
|
|
|
|
|
# 运行测试
|
|
|
|
|
|
test_operations()
|
|
|
|
|
|
|
|
|
|
|
|
# 询问是否进入交互模式
|
|
|
|
|
|
choice = input("\n是否进入交互式计算模式? (y/n): ").strip().lower()
|
|
|
|
|
|
if choice == 'y':
|
|
|
|
|
|
interactive_mode()
|
|
|
|
|
|
else:
|
|
|
|
|
|
print("程序结束。")
|
2026-04-02 14:51:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
main()
|