20241207 实验二《Python程序设计》实验报告
20241207 2025-2026-2 《Python程序设计》实验报告
课程:《Python程序设计》
班级: 2412
姓名: 陈琪雅
学号:20241207
实验教师:王志强
实验日期:2026年4月13日
必修/选修: 公选课
1.实验内容
(1)编写计算器程序
设计并完成一个完整的计算机应用程序(超简陋版)
支持双操作数运算:加、减、乘、除、取模、求商,幂运算(开平方根等可以用幂运算一起实现)、对数运算;
单运算数运算:阶乘;
功能描述:可以循环使用直到确认退出,可以进行输入运算符有误,除数不为零,确认语句输入不正确等健壮性检验;不支持复数运算
(2)用LLM生成一个计算器程序
对比分析自写程序与生成程序的区别。
2. 实验过程及结果
(1)计算器程序编写:
import math
def sum(a,b):
return a+b
def sub(a,b):
return a-b
def multi(a,b):
return a*b
def div(a,b):
return a/b
def shan(a,b):
return a//b
def yu(a,b):
return a%b
def log(a,b):
return math.log(b,a)
def pow(a,b):
return math.pow(a,b)
choice=True
while choice:
operator=input("欢迎使用多功能计算器(●'◡'●)!\n请选择你喜欢的运算!(+、-、*、/、%、//、log、pow、!)\n")
while True:
if operator not in ["+", "-", "*", "/", "//", "%", "log", "pow","!"]:
print("操作符输入错了哦,再检查一下吧😖")
operator = input("请选择你喜欢的运算!(+、-、*、/、%、//、log、pow、!)\n")
else:
break
if operator in ["+", "-", "*", "/", "//", "%", "log", "pow"]:
a = eval(input("请输入运算数a:\n"))
b = eval(input("请输入运算符b:\n"))
# 对于除法类运算,检查除数是否为零,为零则循环重新输入
while operator in ["/", "//", "%"] and b == 0:
print("错啦!除数不能为零哦,请重新输入叭!及时修改就不会把我弄废哦!")
b = eval(input("请重新输入运算数b:\n"))
# 然后进行计算
if operator == "+":
print(f"{a}{operator}{b} =", sum(a, b))
elif operator == "-":
print(f"{a}{operator}{b} =", sub(a, b))
elif operator == "*":
print(f"{a}{operator}{b} =", multi(a, b))
elif operator == "/":
print(f"{a}{operator}{b} =", div(a, b))
elif operator == "//":
print(f"{a}{operator}{b} =", shan(a, b))
elif operator == "%":
print(f"{a}{operator}{b} =", yu(a, b))
elif operator == "log":
print(f"{operator}{a} {b} =", log(a, b))
elif operator == "pow":
print(f"{a}{operator}{b} =", pow(a, b))
else:
a = eval(input("请输入运算数:\n"))
print(f"{a}{operator} =", math.factorial(a))
while True:
con=input("要关掉计算器了吗(っ °Д °;)っ?Y(离开) or N(不走啦!)\n")
if con.upper()=="Y":
choice = False
break
elif con.upper()=="N":
break
else :
print("计算器的大脑无法理解这么复杂的问题,请输入正确的选择哦(●'◡'●)!")
if choice == False:
break
运行截图:


健壮性检验:除法除数不为零检验

(2)deepseek版完整计算器程序
import math
# 定义全局列表 history,用于存储所有计算历史记录
# 每条记录为字符串类型,例如 "3 + 5 = 8"
history = []
def show_menu():
print("\n" + "=" * 40)
print(" 多功能计算器 (Python版)")
print("=" * 40)
print("1. 基本运算 (+, -, *, /, %, //, **)")
print("2. 高级数学函数 (sqrt, sin, cos, tan, log, 阶乘等)")
print("3. 数字属性判断 (奇偶、正负、质数等)")
print("4. 查看计算历史")
print("5. 清空历史")
print("0. 退出程序")
print("=" * 40)
def basic_calculation():
"""
功能1:基本算术运算(双操作数)
+, -, *, /, %, //, ** 运算
包含异常处理、除零检查,并将成功运算记录到历史
"""
print("\n--- 基本运算 ---")
try:
num1 = float(input("请输入第一个数字: "))
# 获取运算符,strip() 去除两端空白字符
op = input("请输入运算符 (+, -, *, /, %, //, **): ").strip()
num2 = float(input("请输入第二个数字: "))
result = None # 初始化结果变量
# 根据运算符执行对应操作(判定语句)
if op == '+':
result = num1 + num2
elif op == '-':
result = num1 - num2
elif op == '*':
result = num1 * num2
elif op == '/':
if num2 == 0:
print("错误: 除数不能为零!")
return
result = num1 / num2
elif op == '%':
result = num1 % num2
elif op == '//':
if num2 == 0:
print("错误: 除数不能为零!")
return
result = num1 // num2
elif op == '**':
result = num1 ** num2
else:
print("不支持的运算符!")
return
# 构造表达式字符串并显示结果
expr = f"{num1} {op} {num2} = {result}"
print("结果:", expr)
# 将本次运算记录追加到全局历史列表
history.append(expr)
except ValueError:
# 入非数字时 float() 转换引异常
print("输入错误: 请输入有效的数字!")
def advanced_calculation():
"""
功能2:单操作数运算
支持 sqrt, sin, cos, tan, log, log10, factorial
包含输入有效性检查(如负数不能开平方、对数定义域、阶乘参数类型)
"""
print("\n--- 高级数学函数 ---")
print("可选函数: sqrt(平方根), sin, cos, tan, log(自然对数), log10, factorial(阶乘)")
func = input("请输入函数名: ").strip().lower()
try:
# 处理需要浮点数参数的函数(sin, cos, tan, sqrt, log, log10)
if func in ['sin', 'cos', 'tan', 'sqrt', 'log', 'log10']:
num = float(input("请输入参数: "))
if func == 'sqrt':
if num < 0:
print("错误: 不能对负数开平方根!")
return
result = math.sqrt(num)
elif func == 'sin':
# math.sin 接受弧度,用户输入角度,使用 radians 转换
result = math.sin(math.radians(num))
elif func == 'cos':
result = math.cos(math.radians(num))
elif func == 'tan':
result = math.tan(math.radians(num))
elif func == 'log':
if num <= 0:
print("错误: 对数参数必须大于0!")
return
result = math.log(num)
elif func == 'log10':
if num <= 0:
print("错误: 对数参数必须大于0!")
return
result = math.log10(num)
elif func == 'factorial':
num = int(input("请输入一个非负整数: "))
if num < 0:
print("错误: 阶乘定义域为非负整数!")
return
result = math.factorial(num)
else:
print("不支持的函数!")
return
# 构造表达式并记录历史
expr = f"{func}({num}) = {result}"
print("结果:", expr)
history.append(expr)
except ValueError:
# 参数类型错误(如输入字母而非数字)
print("输入错误: 参数类型不正确!")
except OverflowError:
# 数值过大溢出错误(例如阶乘结果太大)
print("错误: 数值过大导致溢出!")
def number_properties():
"""
功能3:数字属性判断
判断一个整数的奇偶性、正负性、是否为质数、是否为完全平方数
"""
print("\n--- 数字属性判断 ---")
try:
num = int(input("请输入一个整数: "))
if num > 0 and num % 2 == 0:
sign_even = "正偶数"
elif num > 0 and num % 2 != 0:
sign_even = "正奇数"
elif num < 0 and num % 2 == 0:
sign_even = "负偶数"
elif num < 0 and num % 2 != 0:
sign_even = "负奇数"
else:
sign_even = "零"
# 判断是否为质数
is_prime = True
if num <= 1:
is_prime = False # 1 和负数、0 不是质数
else:
# 循环语句:遍历从 2 到 sqrt(num) 的整数,检查是否存在因子
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
is_prime = False
break
# 判断是否为完全平方数(即某个整数的平方)
# 使用 math.isqrt 计算整数平方根,比较平方值
sqrt_num = math.isqrt(abs(num))
# 逻辑运算:平方根平方等于原数且原数非负
is_perfect_square = (sqrt_num * sqrt_num == abs(num)) and num >= 0
# 输出属性结果
print(f"数字 {num} 是 {sign_even}")
print(f"是否为质数: {'是' if is_prime else '不是'}")
# 使用 not 逻辑:not is_perfect_square 等价于取反
print(f"是否为完全平方数: {'是' if is_perfect_square else '不是'}")
# 记录属性字符串到历史
prop_str = f"{num}: {sign_even}, 质数={is_prime}, 完全平方={is_perfect_square}"
history.append(prop_str)
except ValueError:
print("输入错误: 请输入一个整数!")
def show_history():
"""
功能4:查看计算历史记录
遍历全局 history 列表并打印每条记录,若列表为空则提示
"""
print("\n--- 计算历史 ---")
# 逻辑运算 not:判断列表是否为空
if not history:
print("暂无历史记录。")
else:
# enumerate 生成索引和内容,从 1 开始编号
for idx, record in enumerate(history, 1):
print(f"{idx}. {record}")
def clear_history():
"""
功能5:清空历史记录
调用列表的 clear() 方法移除所有元素
"""
history.clear()
print("历史记录已清空。")
def main():
"""
主程序入口函数
包含一个无限循环(while True),持续显示菜单并根据用户选择调用对应功能
"""
while True:
show_menu() # 显示菜单
choice = input("请输入你的选择 (0-5): ").strip()
if choice == '1':
basic_calculation()
elif choice == '2':
advanced_calculation()
elif choice == '3':
number_properties()
elif choice == '4':
show_history()
elif choice == '5':
clear_history()
elif choice == '0':
print("感谢使用,再见!")
break
else:
print("无效选择,请重新输入!")
# Python 程序入口点判断,既可以让代码作为脚本直接运行:启动完整的计算器交互界面;也可以作为库被导入:只提供函数和变量,不自动运行主程序。
if __name__ == "__main__":
main() # 调用主函数启动程序
运行截图:





(3)代码区别(deepseek版优点纯享)
1.具备完善的异常处理和健全性检查功能:通过try-except检查用户输入非数字时可能引发的ValueError异常,对除零操作、负数开平方根、对数定义域错误等边界情况进行标准完善的检查,避免程序因意外输入而崩溃。
2.高度模块化,函数封装设计。将基本运算、高级数学函数、数字属性判断、历史记录管理等不同功能拆分为独立函数,更便于后续功能的扩展与维护。
3.交互体验方面更具有观赏性,菜单导航层级分明。
4.功能更完整:支持更多种运算如三角函数等,可以进行数字属性判断,并新增了计算历史记录的查看与清空功能。
5.通过if name == "main"使文件既可独立运行亦可作为模块被导入复用。
3. 实验过程中遇到的问题和解决过程
- 问题1:多层循环编写修改时反复出现逻辑问题,没有正确判入和判出循环
- 问题1解决方案:进行反复运行调试,不断输入极端边界情况判断
- 问题2:无法使用统一的参数类型直接适配实数和复数的各项运算,参考手机标准计算器的基础功能最终选择放弃复数运算
其他(感悟、思考等)
先整体写好框架,再逐一考虑多种输入类型和格式的检查,考虑不同运算的参数类型可能情况