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

程序运行结果
image
https://gitee.com/cloud-lumiere/2025-python-course/blob/master/计算器.py

3. 实验过程中遇到的问题和解决过程

  • 问题1:无法防止非法输入的情况,计算器鲁棒性极差
  • 问题1解决方案:学习python的 try except语句,在抛出错误时重新修正
  • 问题2:结果输出时标准过于随意,有严重的不规范现象
  • 问题2解决方案:在运算同时生成规范的运算式,并通过格式化数字使输出统一
  • 问题3:程序的退出机制过于严格,在运算错误等情况下没有修正机会
  • 问题3解决方案:再潜在错误处均使用循环和检测,保证输入可修正。在结束使用处防呆设计,仅在输出q时可以退出

其他

程序设计需要渐进式开发,从核心功能入手,逐步扩展,避免一次性过度设计。每阶段完成后进行测试,确保稳定性再添加新功能

虽然没有应用到算法知识,但学会在实际设计时考虑用户等因素,更加注重程序的细节内容和使用体验

参考资料

posted @ 2025-04-02 16:19  lumiere_cloud  阅读(25)  评论(0)    收藏  举报