20231213 实验二《Python程序设计》实验报告
学号 2024-2025-2 《Python程序设计》实验x报告
课程:《Python程序设计》
班级: 2312
姓名: 蔡明辉
学号:20231213
实验教师:王志强
实验日期:2025年3月26日
必修/选修: 公选课
1.实验内容
-
设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
-
考核基本语法、判定语句、循环语句、逻辑运算等知识点
2. 实验过程及结果
基础版本:
简单运算功能支持 + - * / ^ log % sqrt
第一次优化:
模块化与错误处理
封装 \(getnumberinput()\) 和 \(getoperatorinput()\) 函数,确保输入有效性。处理除零错误、负数平方根、log参数限制等
符号优化使用$√、×、÷ $等符号提升显示友好性
代码结构化
分离单目运算符和双目运算符逻辑
第二次优化:复数支持扩展
兼容复数
限制特殊运算符
格式化输出优化
自动隐藏虚部为零的情况
# 日期 2025/3/26
#考虑双目运算加减乘除 和单目运算 开方 取对数
#增加考虑复数运算
#对于% log sqrt 运算仅支持实数 考虑分为复数四则运算和实数的科学运算两个模式
#为了直观方便 分模块
def select():
"""
选择模式
"""
while True:
print("\n请选择计算模式:")
print("1. 复数模式'支持 + - * / ^'")
print("2. 科学计算模式'支持 + - * / ^ sqrt % log'")
choice = input("请输入选项'1/2':").strip()
if choice in ('1', '2'):
return int(choice)
print("输入无效,请重新输入!")
def get_number_input(prompt):
"""
通用数字输入
还是防止一下错误吧,反正我预习过了
"""
while True:
try:
value = complex(input(prompt).replace(' ', ''))
return value
except ValueError:
print("输入无效!请输入有效的数字")
def format_number(num):
"""
格式化数字显示
"""
if num.imag == 0:
return f"{num.real:.4f}".rstrip('0').rstrip('.') if num.real%1 else f"{int(num.real)}"
return f"({num.real:.4f} + {num.imag:.4f}i)".replace('.0000','')#暂时定位4位小数
def complex_mode():#str complex
"""复数计算模式"""
print("\n--复数模式--")
v_op = ['+', '-', '*', '/', '^']
num1 = get_number_input("输入第一个复数:")
op = input(f"请选择运算符'{', '.join(v_op)}':").strip()#怎么总是输进去空格?
if op not in v_op:
return "错误:无效运算符", None
num2 = get_number_input("输入第二个复数:") if op != '^' else None#复数不支持幂次为复数,太麻烦了
if op == '+': result = num1 + num2
elif op == '-': result = num1 - num2
elif op == '*': result = num1 * num2
elif op == '/':
if num2 == 0: return "错误:除数不能为零", None
result = num1 / num2
elif op == '^': result = num1 ** num2
equation = f"({format_number(num1)}) {op} ({format_number(num2)})" if num2 else f"({format_number(num1)}){op}"
return equation, result
def scientific_mode():#str float
"""
科学计算模式
"""
print("\n--科学模式--")
v_op = ['+', '-', '*', '/', '^', 'sqrt', '%', 'log']
num1 = get_number_input("输入第一个数字:")
op = input(f"请选择运算符'{', '.join(v_op)}':").strip()
if op not in v_op:
return "错误:无效运算符", None
if op in ['sqrt', 'log']:
if op == 'sqrt':
result = cmath.sqrt(num1)
equation = f"√({format_number(num1)})"
elif op == 'log':
result = cmath.log10(num1)
equation = f"log10({format_number(num1)})"
return equation, result
num2 = get_number_input("输入第二个数字:")
if op == '+': result = num1 + num2
elif op == '-': result = num1 - num2
elif op == '*': result = num1 * num2
elif op == '/':
if num2 == 0: return "错误:除数不能为零", None
result = num1 / num2
elif op == '^': result = num1 ** num2
elif op == '%':
if num1.imag !=0 or num2.imag !=0:
return "错误:模运算需要实数", None
result = num1.real % num2.real
equation = f"({format_number(num1)}) {op} ({format_number(num2)})"
return equation, result
print("做个高级科学计算器可真麻烦,耽误我刷题准备蓝桥杯")
print('-'*10 +'欢迎使用'+'-'*10)
while True:
mode = select()
if mode == 1:
equation, result = complex_mode()
else:
equation, result = scientific_mode()
print("\n计算结果:")
print(f"{equation} =",end=' ')
if isinstance(result, str):
print(f"{result}")
elif result is not None:
print(f"{format_number(result)}")
else:
print("计算失败")
if input("输入q退出使用,任意键继续").lower() == 'q':
print("感谢使用!")
break
程序运行结果

https://gitee.com/cloud-lumiere/2025-python-course/blob/master/计算器.py
3. 实验过程中遇到的问题和解决过程
- 问题1:无法防止非法输入的情况,计算器鲁棒性极差
- 问题1解决方案:学习python的 try except语句,在抛出错误时重新修正
- 问题2:结果输出时标准过于随意,有严重的不规范现象
- 问题2解决方案:在运算同时生成规范的运算式,并通过格式化数字使输出统一
- 问题3:程序的退出机制过于严格,在运算错误等情况下没有修正机会
- 问题3解决方案:再潜在错误处均使用循环和检测,保证输入可修正。在结束使用处防呆设计,仅在输出q时可以退出
其他
程序设计需要渐进式开发,从核心功能入手,逐步扩展,避免一次性过度设计。每阶段完成后进行测试,确保稳定性再添加新功能
虽然没有应用到算法知识,但学会在实际设计时考虑用户等因素,更加注重程序的细节内容和使用体验

浙公网安备 33010602011771号