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

运行截图:
image
image

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

(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()  # 调用主函数启动程序

运行截图:
image
image
image
image
image

(3)代码区别(deepseek版优点纯享)
1.具备完善的异常处理和健全性检查功能:通过try-except检查用户输入非数字时可能引发的ValueError异常,对除零操作、负数开平方根、对数定义域错误等边界情况进行标准完善的检查,避免程序因意外输入而崩溃。
2.高度模块化,函数封装设计。将基本运算、高级数学函数、数字属性判断、历史记录管理等不同功能拆分为独立函数,更便于后续功能的扩展与维护。
3.交互体验方面更具有观赏性,菜单导航层级分明。
4.功能更完整:支持更多种运算如三角函数等,可以进行数字属性判断,并新增了计算历史记录的查看与清空功能。
5.通过if name == "main"使文件既可独立运行亦可作为模块被导入复用。

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

  • 问题1:多层循环编写修改时反复出现逻辑问题,没有正确判入和判出循环
  • 问题1解决方案:进行反复运行调试,不断输入极端边界情况判断
  • 问题2:无法使用统一的参数类型直接适配实数和复数的各项运算,参考手机标准计算器的基础功能最终选择放弃复数运算

其他(感悟、思考等)

先整体写好框架,再逐一考虑多种输入类型和格式的检查,考虑不同运算的参数类型可能情况

附件资料

posted @ 2026-04-19 16:20  山河13  阅读(8)  评论(0)    收藏  举报