20251231 2025-2026-2 《Python程序设计》实验二报告
20251231 2025-2026-2 《Python程序设计》实验二报告
课程:《Python程序设计》
班级: 2512
姓名: 石有琛
学号:20251231
实验教师:王志强
实验日期:2026年4月13日
必修/选修: 公选课
1.实验内容
(1)编写计算器程序
设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
考核基本语法、判定语句、循环语句、逻辑运算等知识点。
(2)用LLM生成一个计算器程序
介绍相关功能,并分析生成的程序代码含义。
对比分析自写程序与生成程序的区别(好与坏)。
2. 实验过程及结果
(1)人工设计
import math print("----计算器----") while True: print("\n请使用以下功能:") print("1.加法") print("2.减法") print("3.乘法") print("4.除法") print("5.平方") print("6.开方") print("7.log运算") print("8.退出程序") choice=int(input("\n请输入你的选择(1-8):")) if choice==8: print("已退出!!!") break elif choice==5 or choice==6 or choice==7: num=float(input("请输入一个数字:")) if choice==5: result=num**2 elif choice==6: result=num**0.5 elif choice==7: if num<=0: result="错误:对数定义域为正数!" else: result=math.log(num) print(f"计算结果:{result}") elif choice==1 or choice==2 or choice==3 or choice==4: num1=float(input("请输入第一个数字:")) num2=float(input("请输入第二个数字:")) if choice==1: result=num1+num2 elif choice==2: result=num1-num2 elif choice==3: result=num1*num2 elif choice==4: if num2==0: result="错误:除数不能为0!" else: result=num1/num2 print(f"计算结果:{result}") else: print("选择错误!请输入1-8的数!")
设计过程:
1.调用math函数以计算log。
2.分八种情况编写死循环,根据输入判断计算方式以及是否退出。
3.根据不同数字得出计算结果并输出。
(2)大模型生成
`import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
import math
import random
import threading
import time
from decimal import Decimal
class SuperThunderBombCalculator:
def init(self, root):
self.root = root
self.root.title("🔥螺旋飞天复杂雷霆球炸猪刚计算器🚀💥✨")
self.root.geometry("1050x780")
self.root.resizable(True, True)
self.root.configure(bg="#1A1A2E")
self.current_input = ""
self.calc_history = []
self.animation_running = False
self.emojis = ["🔥", "⚡️", "💥", "🚀", "🐷", "✨", "🌟", "🎉", "🎊", "💯", "😎", "🤯", "🥳", "🌀", "🌪️", "🧨", "🎆", "🎇"]
self.setup_styles()
self.create_widgets()
self.start_fly_animation()
def setup_styles(self):
self.style = ttk.Style()
self.style.theme_use("clam")
self.style.configure("Thunder.TButton", font=("微软雅黑", 14, "bold"), background="#FF4D00", foreground="white",
borderwidth=3)
self.style.map("Thunder.TButton", background=[("active", "#FF2D00"), ("pressed", "#CC0000")])
self.style.configure("Func.TButton", font=("微软雅黑", 12, "bold"), background="#4E4FEB", foreground="white")
self.style.configure("Num.TButton", font=("微软雅黑", 16, "bold"), background="#068FFF", foreground="white")
self.style.configure("Emoji.TButton", font=("微软雅黑", 18), background="#FFD700", foreground="#1A1A2E",
borderwidth=4)
def create_widgets(self):
title_frame = tk.Frame(self.root, bg="#1A1A2E", pady=10)
title_frame.pack(fill=tk.X)
tk.Label(title_frame, text="🐷⚡️螺旋飞天复杂雷霆球炸猪刚计算器💥🚀✨",
font=("华文琥珀", 26, "bold"), bg="#1A1A2E", fg="#FFD700").pack()
display_frame = tk.Frame(self.root, bg="#16213E", padx=20, pady=20)
display_frame.pack(fill=tk.X, padx=20, pady=10)
self.display_var = tk.StringVar(value="0")
tk.Entry(display_frame, textvariable=self.display_var, font=("Digital-7", 42, "bold"),
bg="#0F3460", fg="#00FF9C", justify=tk.RIGHT, bd=10, relief=tk.SUNKEN).pack(fill=tk.X, ipady=15)
self.status_label = tk.Label(display_frame, text=f"📊就绪 {random.choice(self.emojis)}",
font=("微软雅黑", 14), bg="#16213E", fg="#FFE600")
self.status_label.pack(anchor=tk.W, pady=5)
main_frame = tk.Frame(self.root, bg="#1A1A2E")
main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
btn_frame = tk.Frame(main_frame, bg="#1A1A2E")
btn_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
right_frame = tk.Frame(main_frame, bg="#1A1A2E", width=320)
right_frame.pack(side=tk.RIGHT, fill=tk.Y, padx=10)
btn_rows = [
["🌀螺旋", "🌪️雷霆", "🧨炸猪刚", "🎆清空", "🎇撤销"],
["sin", "cos", "tan", "π", "e"],
["log", "ln", "x²", "x³", "√"],
["2进制", "8进制", "10进制", "16进制", "1/x"],
["7", "8", "9", "/", "("],
["4", "5", "6", "*", ")"],
["1", "2", "3", "-", "%"],
["0", ".", "=", "+", "随机😜"]
]
for i, row in enumerate(btn_rows):
for j, text in enumerate(row):
if text in ["🌀螺旋", "🌪️雷霆", "🧨炸猪刚", "🎆清空", "🎇撤销"]:
s = "Emoji.TButton"
elif text in ["sin", "cos", "tan", "log", "ln", "π", "e", "x²", "x³", "√", "进制"]:
s = "Func.TButton"
elif text == "=":
s = "Thunder.TButton"
else:
s = "Num.TButton"
ttk.Button(btn_frame, text=text, style=s,
command=lambda t=text: self.on_btn_click(t)
).grid(row=i, column=j, padx=4, pady=4, ipadx=8, ipady=8, sticky=tk.NSEW)
btn_frame.grid_columnconfigure(j, weight=1)
btn_frame.grid_rowconfigure(i, weight=1)
unit_frame = tk.LabelFrame(right_frame, text=f"📏单位转换{random.choice(self.emojis)}",
font=("微软雅黑", 12, "bold"), bg="#16213E", fg="#FFD700")
unit_frame.pack(fill=tk.X, pady=5)
self.unit_type = tk.StringVar(value="温度")
ttk.Combobox(unit_frame, textvariable=self.unit_type, values=["温度", "长度", "重量", "时间"],
state="readonly", font=("微软雅黑", 11)).pack(fill=tk.X, padx=5, pady=5)
ttk.Button(unit_frame, text="🚀转换计算", style="Func.TButton",
command=self.unit_convert).pack(fill=tk.X, padx=5, pady=3)
hist_frame = tk.LabelFrame(right_frame, text=f"📜计算历史{random.choice(self.emojis)}",
font=("微软雅黑", 12, "bold"), bg="#16213E", fg="#FFD700")
hist_frame.pack(fill=tk.BOTH, expand=True, pady=5)
self.history_text = scrolledtext.ScrolledText(hist_frame, height=12, font=("Consolas", 10),
bg="#0F3460", fg="#00FF9C")
self.history_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
tk.Label(self.root, text="💥本计算器自带螺旋飞天+雷霆炸猪刚特效🤯",
font=("微软雅黑", 12, "italic"), bg="#1A1A2E", fg="#FF5555").pack(pady=5)
def on_btn_click(self, text):
self.status_label.config(text=f"📊计算中 {random.choice(self.emojis)}")
if text == "🎆清空":
self.current_input = ""
self.display_var.set("0")
return
if text == "🎇撤销":
self.current_input = self.current_input[:-1]
self.display_var.set(self.current_input or "0")
return
if text == "🌀螺旋":
self.start_fly_animation()
return
if text == "🌪️雷霆":
self.thunder_effect()
return
if text == "🧨炸猪刚":
self.bomb_pig_effect()
return
if text == "=":
self.calculate_result()
return
if text == "随机😜":
self.current_input += random.choice(self.emojis)
self.display_var.set(self.current_input)
return
funcs = {"sin": math.sin, "cos": math.cos, "tan": math.tan, "log": math.log10, "ln": math.log, "π": math.pi,
"e": math.e}
if text in funcs:
try:
v = float(self.current_input or 0)
r = funcs[text](v)
self.current_input = str(r)
self.display_var.set(round(r, 8))
return
except:
self.display_var.set("错误⚠️")
return
if text == "x²":
self.current_input += "**2"
elif text == "x³":
self.current_input += "**3"
elif text == "√":
self.current_input += "math.sqrt("
elif text == "1/x":
self.current_input = f"1/({self.current_input})"
elif text == "2进制":
self.convert_base(2)
elif text == "8进制":
self.convert_base(8)
elif text == "10进制":
self.convert_base(10)
elif text == "16进制":
self.convert_base(16)
else:
self.current_input += text
self.display_var.set(self.current_input)
def calculate_result(self):
try:
res = eval(self.current_input, {"math": math}, {})
his = f"{self.current_input} = {res}"
self.calc_history.append(his)
self.history_text.insert(tk.END, his + "\n")
self.current_input = str(res)
self.display_var.set(round(Decimal(res), 10))
self.status_label.config(text=f"✅完成 {random.choice(self.emojis)}")
except:
self.display_var.set("⚠️错误")
def convert_base(self, b):
try:
n = int(float(self.current_input))
self.display_var.set({2: bin, 8: oct, 10: str, 16: hex}[b](n))
except:
self.display_var.set("⚠️进制错误")
def unit_convert(self):
try:
v = float(self.current_input or 0)
t = self.unit_type.get()
r = {"温度": v * 9 / 5 + 32, "长度": v * 100, "重量": v * 1000, "时间": v * 60}[t]
self.display_var.set(f"{v}{t}→{r}")
self.current_input = str(r)
except:
self.display_var.set("⚠️单位错误")
def start_fly_animation(self):
if self.animation_running: return
self.animation_running = True
def a():
for _ in range(20):
self.root.title(f"🚀飞天{random.choice(['🌀', '✨', '🌟'])}雷霆{random.choice(['⚡️', '💥'])}")
time.sleep(0.1)
self.root.title("🔥螺旋飞天复杂雷霆球炸猪刚计算器🚀💥✨")
self.animation_running = False
threading.Thread(target=a, daemon=True).start()
def thunder_effect(self):
def s():
x, y = self.root.winfo_x(), self.root.winfo_y()
for _ in range(10):
self.root.geometry(f"+{x + random.randint(-4, 4)}+{y + random.randint(-4, 4)}")
time.sleep(0.05)
self.root.geometry(f"+{x}+{y}")
threading.Thread(target=s, daemon=True).start()
messagebox.showinfo("⚡️雷霆", random.choice(self.emojis) * 6)
def bomb_pig_effect(self):
e = ["💥", "🧨", "🎆", "🎇", "🐷", "🔥"]
messagebox.showwarning("💥炸猪刚", f"{' '.join(random.choices(e, k=8))}\n炸猪刚成功!螺旋飞天完成!")
self.root.config(bg=random.choice(["#F00", "#F80", "#FF0", "#F0F"]))
self.root.after(1000, lambda: self.root.config(bg="#1A1A2E"))
if name == "main":
root = tk.Tk()
app = SuperThunderBombCalculator(root)
root.mainloop()`
3. 实验过程中遇到的问题和解决过程
- 问题1:编写代码时不够熟练,出现了因为代码未对其导致代码报错的情况。
- 问题1解决方案:经过多次检查确认,得出最终结果。
- 问题2:不知道如何实现log计算。
- 问题2解决方案:通过上网搜索得出调用函数的方法。
其他(感悟、思考等)
1.今后编写代码时一定要更加细心严谨,养成认真细致的编码习惯。无论是基础的语法格式、符号拼写,还是核心的逻辑架构、功能实现,都要逐行检查、反复推敲,杜绝因粗心疏忽引发语法错误、逻辑漏洞等问题,逐步提升代码的规范性与准确性。
2.AI 生成的代码存在诸多值得借鉴学习的闪光点,无论是代码结构的搭建、功能逻辑的梳理,还是界面设计、效率优化等方面,都比我自主编写的代码更加完善成熟。后续我要多学习参考 AI 的优秀代码思路,认真拆解其编码技巧与实现逻辑,吸收其中的可取之处,不断弥补自身编程短板,稳步提升自己的代码编写能力与综合开发水平。

浙公网安备 33010602011771号