20243410 实验二 《Python程序设计》实验报告

20243410 2025-2026-2 《Python程序设计》实验二报告

课程:《Python程序设计》
班级: 2434
姓名: 陈懿慜
学号: 20243410
实验教师:王志强
实验日期:2026年4月13日
必修/选修: 公选课

1.实验内容

(1)编写计算器程序
设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
考核基本语法、判定语句、循环语句、逻辑运算等知识点。
(2)用LLM生成一个计算器程序
介绍相关功能,并分析生成的程序代码含义。
对比分析自写程序与生成程序的区别(好与坏)。

2. 实验过程及结果

1)我编写的代码展示,能实现+、-、*、/、mod、//、log、pow、gcd、lcm、abs、sin、cos、tan的基本计算机功能,运用了Python的基本语法、if判定语句、while循环语句等编写程序。

i)通过自定义函数来实现计算机的基本功能。
Screenshot 2026-04-15 193522

ii)使用while语句达到一直循环输入的目的,elif语句选择对应功能。
Screenshot 2026-04-15 193539

iii)输入y继续,n退出(同时兼容大小写)
Screenshot 2026-04-15 193615

iv)运行的样例
Screenshot 2026-04-15 194255

2)用LLM生成一个计算器程序
ai的代码(标注了代码的具体含义)

点击查看代码
# 导入必要库:tkinter做GUI,math提供科学计算函数
import tkinter as tk
from tkinter import font
import math

# 卡西欧科学计算器主类
class CasioCalculator(tk.Tk):
    def __init__(self):
        super().__init__()
        # 窗口基础配置(模拟实体计算器尺寸)
        self.title("卡西欧科学计算器")
        self.geometry("320x420")  # 宽x高
        self.resizable(False, False)  # 禁止拉伸窗口
        self.config(bg="#2C3E50")  # 计算器主体背景色

        # 自定义字体(按键/显示区字体)
        self.display_font = font.Font(family="Arial", size=20, weight="bold")
        self.btn_font = font.Font(family="Arial", size=12, weight="bold")
        self.sci_btn_font = font.Font(family="Arial", size=10, weight="bold")

        # 存储输入表达式的变量
        self.expression = ""

        # 1. 创建显示区域(卡西欧顶部大屏)
        self.create_display()
        # 2. 创建按键区域(科学键+数字键+功能键)
        self.create_buttons()

    # -------------------------- 显示区创建 --------------------------
    def create_display(self):
        # 显示框:右对齐、只读、深色背景
        self.display_var = tk.StringVar()
        display = tk.Entry(
            self, textvariable=self.display_var, font=self.display_font,
            bg="#ECF0F1", fg="#2C3E50", justify=tk.RIGHT, bd=10, relief=tk.FLAT
        )
        display.grid(row=0, column=0, columnspan=5, padx=10, pady=15, sticky="nsew")
        # 禁止手动输入,只能按键输入
        display.config(state="normal")

    # -------------------------- 按键区创建 --------------------------
    def create_buttons(self):
        # 按键布局:按卡西欧实体按键排列(行=科学键→功能键→数字键→运算键)
        # 按键格式:(文本, 行, 列, 列跨度, 按键类型[科学/普通])
        button_layout = [
            # 第一行:科学计算键(sin、cos、tan、log、ln)
            ("sin", 1, 0, 1, "sci"), ("cos", 1, 1, 1, "sci"), ("tan", 1, 2, 1, "sci"),
            ("log", 1, 3, 1, "sci"), ("ln", 1, 4, 1, "sci"),
            # 第二行:幂运算、根号、平方、立方、阶乘
            ("x^y", 2, 0, 1, "sci"), ("√", 2, 1, 1, "sci"), ("x²", 2, 2, 1, "sci"),
            ("x³", 2, 3, 1, "sci"), ("n!", 2, 4, 1, "sci"),
            # 第三行:常数π、e、括号、清除(AC)、退格(DEL)
            ("π", 3, 0, 1, "num"), ("e", 3, 1, 1, "num"), ("(", 3, 2, 1, "num"),
            (")", 3, 3, 1, "num"), ("AC", 3, 4, 1, "func"),
            # 第四行:数字7-9 + 除法 + 取余
            ("7", 4, 0, 1, "num"), ("8", 4, 1, 1, "num"), ("9", 4, 2, 1, "num"),
            ("/", 4, 3, 1, "opt"), ("%", 4, 4, 1, "opt"),
            # 第五行:数字4-6 + 乘法 + 倒数
            ("4", 5, 0, 1, "num"), ("5", 5, 1, 1, "num"), ("6", 5, 2, 1, "num"),
            ("*", 5, 3, 1, "opt"), ("1/x", 5, 4, 1, "sci"),
            # 第六行:数字1-3 + 减法 + 正负号
            ("1", 6, 0, 1, "num"), ("2", 6, 1, 1, "num"), ("3", 6, 2, 1, "num"),
            ("-", 6, 3, 1, "opt"), ("+/-", 6, 4, 1, "func"),
            # 第七行:0、小数点、加法、等于
            ("0", 7, 0, 2, "num"), (".", 7, 2, 1, "num"),
            ("+", 7, 3, 1, "opt"), ("=", 7, 4, 1, "equal")
        ]

        # 循环创建所有按键
        for (text, row, col, colspan, btn_type) in button_layout:
            self.create_button(text, row, col, colspan, btn_type)

    # -------------------------- 单个按键创建 --------------------------
    def create_button(self, text, row, col, colspan, btn_type):
        # 按按键类型设置颜色(卡西欧配色:功能键蓝、运算键橙、数字键灰、科学键浅蓝)
        colors = {
            "sci": {"bg": "#3498DB", "fg": "white"},   # 科学键
            "num": {"bg": "#95A5A6", "fg": "white"},   # 数字/括号/常数
            "opt": {"bg": "#E67E22", "fg": "white"},   # 运算键
            "func": {"bg": "#E74C3C", "fg": "white"},  # 功能键(AC/DEL)
            "equal": {"bg": "#27AE60", "fg": "white"} # 等于键
        }
        bg, fg = colors[btn_type]["bg"], colors[btn_type]["fg"]
        font = self.sci_btn_font if btn_type == "sci" else self.btn_font

        # 创建按钮并绑定点击事件
        btn = tk.Button(
            self, text=text, font=font, bg=bg, fg=fg, relief=tk.FLAT,
            command=lambda t=text: self.on_button_click(t)
        )
        btn.grid(row=row, column=col, columnspan=colspan, padx=3, pady=3, sticky="nsew")
        # 按钮自适应拉伸
        self.grid_rowconfigure(row, weight=1)
        self.grid_columnconfigure(col, weight=1)

    # -------------------------- 核心:按键点击事件 --------------------------
    def on_button_click(self, text):
        # 1. 清除键:清空所有输入
        if text == "AC":
            self.expression = ""
            self.display_var.set(self.expression)

        # 2. 退格键:删除最后一个字符
        elif text == "DEL":
            self.expression = self.expression[:-1]
            self.display_var.set(self.expression)

        # 3. 等于键:计算表达式结果
        elif text == "=":
            self.calculate_result()

        # 4. 正负号键:切换正负
        elif text == "+/-":
            if self.expression:
                if self.expression[0] == "-":
                    self.expression = self.expression[1:]
                else:
                    self.expression = "-" + self.expression
                self.display_var.set(self.expression)

        # 5. 科学计算/数字/运算键:追加字符到表达式
        else:
            self.append_expression(text)

    # -------------------------- 表达式追加(自动转换科学函数) --------------------------
    def append_expression(self, text):
        # 把计算器按键文本转换为math库可识别的函数
        sci_map = {
            "sin": "math.sin(", "cos": "math.cos(", "tan": "math.tan(",
            "log": "math.log10(", "ln": "math.log(", "√": "math.sqrt(",
            "x²": "**2", "x³": "**3", "x^y": "**", "n!": "math.factorial(",
            "π": "math.pi", "e": "math.e", "1/x": "1/"
        }
        # 追加转换后的表达式
        self.expression += sci_map.get(text, text)
        self.display_var.set(self.expression)

    # -------------------------- 计算结果(容错处理) --------------------------
    def calculate_result(self):
        try:
            # 计算表达式(eval执行数学运算)
            result = eval(self.expression)
            # 结果格式化(避免科学计数法,保留8位小数)
            result = round(result, 8) if isinstance(result, float) else result
            self.display_var.set(result)
            self.expression = str(result)  # 结果可继续运算
        except ZeroDivisionError:
            self.display_var.set("除零错误")
            self.expression = ""
        except (SyntaxError, NameError):
            self.display_var.set("输入错误")
            self.expression = ""
        except ValueError:
            self.display_var.set("数值错误")
            self.expression = ""
        except:
            self.display_var.set("计算错误")
            self.expression = ""

# 启动计算器
if __name__ == "__main__":
    calculator = CasioCalculator()
    calculator.mainloop()
运行结果

Screenshot 2026-04-15 195822
Screenshot 2026-04-15 195832

代码分析
i)class CasioCalculator(tk.Tk):把计算器所有功能封装在一起。
借用Python 内置标准库 tkinter实现图形化交互
比如:
Screenshot 2026-04-15 200050
super().init():调用父类(tk.Tk)的初始化,创建窗口。
title:窗口标题。
geometry("320x420"):窗口宽 320,高 420。
resizable(False,False):禁止用户拉伸窗口。
bg="#2C3E50":窗口背景颜色(深蓝灰)

ii)calculate_result(self):计算结果 + 错误处理
比如:
image

iii)on_button_click(self):点击逻辑处理
由if-elif判断语句实现点击选择
比如:
Screenshot 2026-04-15 200358
self.expression = self.expression[:-1]删掉最后一位数。
self.display_var.set()把删除最后一位后的新计算式,更新显示到计算器的屏幕上。
3)对比分析自写程序与生成程序的区别(好与坏)。
i)我的代码
优点:代码量少、结构简单,无多余界面代码,运行高效,核心聚焦计算逻辑本身。
缺点:未做完善的异常处理,输入错误内容(除数为 0、字母、符号)会直接报错崩溃。相较之下,功能单一,纯黑框控制台交互,操作不直观。
ii)ai代码
优点:功能丰富专业,代码规范完整,图形交互体验好。
缺点:代码冗余繁琐,想改动界面、功能时,因代码结构复杂,容易引发连锁错误,难以独立调整。

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

  • 问题1:对math的函数库不太熟悉,不知道有哪些函数可以使用

  • 问题1解决方案:通过上网查询math的所有函数,以及询问同学解决了问题。

  • 问题2:进行除法(/)、取余(mod)、整除(//)运算时,输入除数为 0,程序直接触发报错并崩溃

  • 问题2解决方案:在除法、取余、整除的代码中添加条件判断 if b != 0,当除数为 0 时,不执行运算,直接返回中文错误提示,避免程序异常终止

  • ...

其他(感悟、思考等)

通过本次计算器编程实验,我不仅巩固了 Python 函数、循环与判断等基础语法,还深刻理解了程序逻辑与异常处理的重要性。自主编写的控制台程序虽界面简单、功能有限,但每一步逻辑均由我独立设计,有效锻炼了编程思维与问题解决能力。与 AI 生成的图形化计算器对比后,我认识到 AI 代码功能丰富、界面美观、开发高效,但结构复杂,初学者难以完全理解。这让我明白,自主编程是夯实基础、掌握核心的关键,而 AI 只是辅助工具。只有亲手编写、调试,才能真正理解编程本质。今后我会立足自主学习,合理借助 AI 拓展视野,扎实提升编程能力。

参考资料

posted @ 2026-04-15 20:22  山阁老  阅读(13)  评论(0)    收藏  举报