25级第六次实验报告
| 2025010089 | 1 |
| 2025010090 | |
| 2025010091 | 1 |
| 2025010092 | 1 |
| 2025010093 | 1 |
| 2025010094 | 1 |
| 2025010095 | 1 |
| 2025010096 | |
| 2025010097 | |
| 2025010098 | 1 |
| 2025010099 | 1 |
| 2025010100 | |
| 2025010101 | 1 |
| 2025010102 | 1 |
| 2025010103 | 1 |
| 2025010104 | |
| 2025010105 | |
| 2025010106 | |
| 2025010107 | 1 |
| 2025010108 | |
| 2025010109 | 1 |
| 2025010110 | |
| 2025010112 | |
| 2025010113 | 1 |
| 2025010114 | |
| 2025010115 | 1 |
| 2025010117 | 1 |
| 2025010118 | 1 |
| 2025010119 | 1 |
| 2025010120 | |
| 2025010121 | 1 |
| 2025010122 | 1 |
| 2025010124 | 1 |
| 2025010125 | 1 |
| 2025010126 | |
| 2025010127 | |
| 2025010128 | 1 |
| 2025010130 | 1 |
| 2025010131 | 1 |
| 2025010132 | 1 |
2025010089张静文
三维马鞍面
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 生成数据
x = np.linspace(-3, 3, 50)
y = np.linspace(-3, 3, 50)
X, Y = np.meshgrid(x, y)
Z = X**2 - Y**2
# 绘图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='coolwarm')
plt.show()

2025010090殷慧湘
import os
import shutil
class FileClassifier:
def __init__(self, source_dir):
# 源文件夹路径
self.source_dir = source_dir
# 定义分类规则:文件夹名 : 匹配后缀
self.category_map = {
"图片": [".jpg", ".png", ".jpeg", ".gif"],
"文档": [".txt", ".docx", ".pdf", ".xlsx"],
"视频": [".mp4", ".avi", ".mov"],
"音频": [".mp3", ".wav"],
"程序": [".py", ".exe"],
"压缩包": [".zip", ".rar", ".7z"]
}
def create_folder(self, folder_name):
"""创建分类文件夹"""
full_path = os.path.join(self.source_dir, folder_name)
if not os.path.exists(full_path):
os.mkdir(full_path)
print(f"已创建文件夹:{folder_name}")
def get_file_category(self, file_suffix):
"""根据后缀判断文件所属分类"""
for folder, suffix_list in self.category_map.items():
if file_suffix.lower() in suffix_list:
return folder
return "其他文件"
def sort_all_files(self):
"""核心:遍历文件并分类移动"""
# 先创建所有分类文件夹
for folder in self.category_map.keys():
self.create_folder(folder)
self.create_folder("其他文件")
# 遍历源目录下所有内容
for name in os.listdir(self.source_dir):
file_path = os.path.join(self.source_dir, name)
# 跳过文件夹,只处理文件
if os.path.isdir(file_path):
continue
# 获取文件后缀
_, suffix = os.path.splitext(name)
target_folder = self.get_file_category(suffix)
target_path = os.path.join(self.source_dir, target_folder, name)
# 移动文件
shutil.move(file_path, target_path)
print(f"移动 {name} --> {target_folder}")
if __name__ == "__main__":
# 修改这里为你要分类的文件夹绝对路径
target_folder = r"D:\LenovoSoftstore"
sorter = FileClassifier(target_folder)
sorter.sort_all_files()
2025010090殷慧湘
import os
import shutil
class FileClassifier:
def __init__(self, source_dir):
self.source_path = source_dir
# 新增图片、文档分类
self.file_type = {
"视频": [".mp4", ".avi", ".mov"],
"音频": [".mp3", ".wav"],
"程序": [".py", ".exe"],
"压缩包": [".zip", ".rar", ".7z"],
"图片": [".png", ".jpg", ".jpeg", ".bmp"],
"文档": [".docx", ".doc", ".xlsx", ".pdf", ".txt"]
}
def create_folder(self, folder_name):
full_path = os.path.join(self.source_path, folder_name)
if not os.path.exists(full_path):
os.mkdir(full_path)
print(f"已创建文件夹: {folder_name}")
def get_file_category(self, file_suffix):
for category, suffix_list in self.file_type.items():
if file_suffix.lower() in suffix_list:
return category
return "其他文件"
def sort_all_files(self):
all_cate = list(self.file_type.keys()) + ["其他文件"]
for cate in all_cate:
self.create_folder(cate)
for file_name in os.listdir(self.source_path):
file_full_path = os.path.join(self.source_path, file_name)
if os.path.isdir(file_full_path):
continue
_, suffix = os.path.splitext(file_name)
target_cate = self.get_file_category(suffix)
target_folder = os.path.join(self.source_path, target_cate)
target_path = os.path.join(target_folder, file_name)
shutil.move(file_full_path, target_path)
print(f"移动: {file_name} → {target_cate}")
# 新增完成提示
print("✅ 全部文件分类移动完成!")
if __name__ == "__main__":
# 改装:路径改为桌面
target_folder = r"C:\Users\30256\Desktop"
sorter = FileClassifier(target_folder)
sorter.sort_all_files()

2025010091张译心
import matplotlib.pyplot as plt
# 解决中文显示
plt.rcParams["font.family"] = "SimHei"
# 解决负号'-'显示方块问题
plt.rcParams["axes.unicode_minus"] = False
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
# 自定义参数 a、b
a, b = 2, 2
x = np.linspace(-5, 5, 200)
y = np.linspace(-5, 5, 200)
X, Y = np.meshgrid(x, y)
# 通用马鞍面公式
Z = (X**2)/(a**2) - (Y**2)/(b**2)
# 绘制曲面,关闭网格线更美观
ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none', alpha=0.9)
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title(f'马鞍面 $z = \\frac{{x^2}}{{{a}^2}} - \\frac{{y^2}}{{{b}^2}}$')
plt.tight_layout()
plt.show()

2025010092朱翔鸽
import os
import pandas as pd
def generate_score_excel(folder_path, output_excel="scores.xlsx", max_score=100):
"""
扫描文件夹,生成包含文件名、文件大小、排序和打分的Excel文件。
参数:
folder_path: 文件夹路径
output_excel: 输出的Excel文件名
max_score: 满分值(文件最大时得满分,0得0分)
"""
# 获取文件夹下所有文件(不包括子目录)
files = []
for entry in os.listdir(folder_path):
full_path = os.path.join(folder_path, entry)
if os.path.isfile(full_path):
size = os.path.getsize(full_path)
# 文件名作为学生姓名(不含扩展名,可根据需要调整)
name = os.path.splitext(entry)[0] # 去掉扩展名
files.append({"姓名": name, "文件大小(字节)": size})
if not files:
print("文件夹中没有文件,无法生成表格。")
return
# 创建DataFrame
df = pd.DataFrame(files)
# 按文件大小降序排序
df = df.sort_values(by="文件大小(字节)", ascending=False).reset_index(drop=True)
# 计算分数:线性映射,最大值得满分,0得0分
max_size = df["文件大小(字节)"].max()
if max_size > 0:
df["分数"] = (df["文件大小(字节)"] / max_size) * max_score
else:
df["分数"] = 0 # 所有文件大小都为0
# 保留整数或保留两位小数
df["分数"] = df["分数"].round(2)
# 输出Excel
df.to_excel(output_excel, index=False, sheet_name="成绩")
print(f"已生成Excel文件: {output_excel}")
print(df)
if __name__ == "__main__":
# 使用示例:请将 'your_folder_path' 替换为实际文件夹路径
folder = input("请输入文件夹路径(默认当前目录): ").strip()
if not folder:
folder = "." # 当前目录
generate_score_excel(folder)

2025010093惠盾
爬取股票生成柱状图
import os
import struct
import matplotlib.pyplot as plt
# ===================== 配置区域(按需修改)=====================
# 通达信 vipdoc 根目录
TDX_VIPDOC = r"D:\tdx\vipdoc"
# 股票列表:(股票名称, 市场sh/sz, 股票代码)
stock_list = [
("贵州茅台", "sh", "600519"),
("招商银行", "sh", "600036"),
("宁德时代", "sz", "300750"),
("五粮液", "sz", "000858")
]
# 取最近N个交易日的收盘价做对比
last_days = 1
# =============================================================
def read_tdx_day_data(vip_path, market, code):
"""
读取通达信日线.day文件,返回收盘价列表
:param vip_path: vipdoc路径
:param market: 市场 sh/sz
:param code: 股票代码
:return: 收盘价列表 / None(文件不存在)
"""
file_path = os.path.join(vip_path, market, "lday", f"{market}{code}.day")
if not os.path.exists(file_path):
print(f"警告:未找到 {code} 本地数据文件,请在通达信中打开该股票下载数据!")
return None
close_price = []
with open(file_path, "rb") as f:
while True:
buf = f.read(32)
if len(buf) < 32:
break
# 解析二进制数据,收盘价/100还原真实价格
_, _, _, _, close, _, _, _ = struct.unpack("<IIIIIIII", buf)
close_price.append(close / 100.0)
return close_price
# 批量读取数据
stock_names = []
final_prices = []
for name, mkt, code in stock_list:
price_list = read_tdx_day_data(TDX_VIPDOC, mkt, code)
if price_list and len(price_list) >= last_days:
stock_names.append(name)
# 取最后N日最后一天价格
final_prices.append(price_list[-last_days])
print(f"{name} 最新收盘价:{price_list[-last_days]:.2f} 元")
# 绘制柱状图
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(10, 6))
bars = plt.bar(stock_names, final_prices, color="#1f77b4", alpha=0.8, edgecolor="#000000")
# 在柱顶标注价格
for bar, price in zip(bars, final_prices):
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 10,
f"{price:.2f}", ha="center", fontsize=11)
plt.title("多股票收盘价对比图(数据源:通达信本地文件)", fontsize=16, pad=20)
plt.ylabel("收盘价(元)", fontsize=12)
plt.grid(axis="y", alpha=0.3)
plt.tight_layout()
plt.show()

2025010094谢润泽
import cv2
import tkinter as tk
from tkinter import filedialog, ttk
from PIL import Image, ImageTk
import threading
import time
class VideoPlayer:
def __init__(self, root):
self.root = root
self.root.title("简易视频播放器")
self.root.geometry("800x600")
# 视频相关变量
self.cap = None
self.is_playing = False
self.is_pause = False
self.frame_rate = 30
self.video_path = ""
# 界面布局
self.create_widgets()
# 定时刷新画面
self.update_frame()
def create_widgets(self):
# 视频显示区域
self.video_label = ttk.Label(self.root)
self.video_label.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 按钮区域
btn_frame = ttk.Frame(self.root)
btn_frame.pack(pady=5)
self.btn_open = ttk.Button(btn_frame, text="打开视频", command=self.open_video)
self.btn_open.grid(row=0, column=0, padx=5)
self.btn_play = ttk.Button(btn_frame, text="播放", command=self.play_video)
self.btn_play.grid(row=0, column=1, padx=5)
self.btn_pause = ttk.Button(btn_frame, text="暂停", command=self.pause_video)
self.btn_pause.grid(row=0, column=2, padx=5)
self.btn_stop = ttk.Button(btn_frame, text="停止", command=self.stop_video)
self.btn_stop.grid(row=0, column=3, padx=5)
def open_video(self):
"""打开本地视频文件"""
self.stop_video()
file_path = filedialog.askopenfilename(
title="选择视频文件",
filetypes=[("视频文件", "*.mp4 *.avi *.mov *.mkv"), ("所有文件", "*.*")]
)
if not file_path:
return
self.video_path = file_path
self.cap = cv2.VideoCapture(file_path)
self.frame_rate = int(self.cap.get(cv2.CAP_PROP_FPS))
def play_video(self):
"""播放视频"""
if self.cap is None:
self.open_video()
if not self.is_playing:
self.is_playing = True
self.is_pause = False
# 子线程播放,避免界面卡顿
threading.Thread(target=self.play_loop, daemon=True).start()
elif self.is_pause:
self.is_pause = False
def pause_video(self):
"""暂停视频"""
if self.is_playing:
self.is_pause = True
def stop_video(self):
"""停止视频,重置状态"""
self.is_playing = False
self.is_pause = False
if self.cap is not None:
self.cap.release()
self.cap = None
# 清空画面
self.video_label.config(image="")
def play_loop(self):
"""视频播放循环(子线程)"""
while self.is_playing and self.cap.isOpened():
if self.is_pause:
time.sleep(0.1)
continue
ret, frame = self.cap.read()
if not ret:
# 视频播放完毕,自动停止
self.stop_video()
break
# OpenCV图像转RGB + 缩放适配窗口
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame)
# 自适应缩放
win_w, win_h = self.video_label.winfo_width(), self.video_label.winfo_height()
if win_w > 10 and win_h > 10:
img = img.resize((win_w, win_h), Image.Resampling.LANCZOS)
# 更新界面
self.tk_img = ImageTk.PhotoImage(image=img)
self.video_label.config(image=self.tk_img)
# 控制帧率
time.sleep(1 / self.frame_rate)
def update_frame(self):
self.root.after(10, self.update_frame)
if __name__ == "__main__":
root = tk.Tk()
app = VideoPlayer(root)
root.mainloop()

2025010095徐雨轩
知识图谱
import networkx as nx
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.backend_bases import MouseButton
import numpy as np
# 中文设置
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# ==========1.构建知识点结构==========
G = nx.Graph()
main_nodes = ["小学语文", "小学数学", "小学英语"]
chinese_nodes = ["拼音", "汉字", "词语", "句子", "阅读理解", "作文", "古诗文"]
math_nodes = ["数的认识", "四则运算", "图形几何", "单位换算", "应用题", "统计初步"]
english_nodes = ["26字母", "单词", "句型", "语法", "情景对话", "阅读理解"]
G.add_nodes_from(main_nodes)
G.add_nodes_from(chinese_nodes)
G.add_nodes_from(math_nodes)
G.add_nodes_from(english_nodes)
# 上下级连线
for n in chinese_nodes:
G.add_edge("小学语文", n)
for n in math_nodes:
G.add_edge("小学数学", n)
for n in english_nodes:
G.add_edge("小学英语", n)
# 跨学科
G.add_edge("词语", "单词")
G.add_edge("句子", "句型")
all_nodes = list(G.nodes())
# 配色
color_map = {}
for n in main_nodes:
color_map[n] = "#FF9999"
for n in chinese_nodes:
color_map[n] = "#87CEEB"
for n in math_nodes:
color_map[n] = "#90EE90"
for n in english_nodes:
color_map[n] = "#FFD700"
# ==========2.初始化3D坐标==========
np.random.seed(42)
pos_3d = {}
pos2d = nx.spring_layout(G, seed=42, k=2.8)
for node, (x, y) in pos2d.items():
if node in main_nodes:
z = np.random.uniform(0.8, 1.2)
else:
z = np.random.uniform(-0.6, 0.3)
pos_3d[node] = np.array([x, y, z], dtype=np.float64)
# ==========3.画布与拖拽全局变量==========
fig = plt.figure(figsize=(14, 10), dpi=100)
ax = fig.add_subplot(111, projection='3d')
drag_node = None # 当前拖拽节点
# 绘制全图函数
def draw_all():
ax.clear()
ax.set_title("3D可拖拽知识点图谱|左键选中拖动节点,右键拖动旋转视角", fontsize=15)
ax.set_axis_off()
# 画边
for u, v in G.edges():
p1 = pos_3d[u]
p2 = pos_3d[v]
ax.plot3D([p1[0], p2[0]], [p1[1], p2[1]], [p1[2], p2[2]], c="#777777", lw=1.1, alpha=0.5)
# 画节点
xs, ys, zs, cs, ss = [], [], [], [], []
for nd in all_nodes:
x,y,z = pos_3d[nd]
xs.append(x)
ys.append(y)
zs.append(z)
cs.append(color_map[nd])
if nd in main_nodes:
ss.append(220)
else:
ss.append(110)
ax.scatter(xs, ys, zs, s=ss, c=cs, alpha=0.82)
# 文字标签
for nd in all_nodes:
x,y,z = pos_3d[nd]
ax.text(x,y,z, nd, fontsize=9, weight="bold")
fig.canvas.draw()
# 初始绘图
draw_all()
# ==========4.鼠标事件:拖拽逻辑==========
def on_press(event):
global drag_node
if event.button != MouseButton.LEFT or event.inaxes != ax:
return
# 查找点击最近节点
click_x, click_y = event.xdata, event.ydata
min_dist = 9999
select_nd = None
for nd, (x,y,z) in pos_3d.items():
# 投影到画布简易判定
dist = ((click_x - x)**2 + (click_y - y)**2)**0.5
if dist < min_dist and dist < 0.12:
min_dist = dist
select_nd = nd
drag_node = select_nd
def on_move(event):
global drag_node
if drag_node is None or event.inaxes != ax or event.button != MouseButton.LEFT:
return
# 更新节点xy坐标,z不动
pos_3d[drag_node][0] = event.xdata
pos_3d[drag_node][1] = event.ydata
draw_all()
def on_release(event):
global drag_node
if event.button == MouseButton.LEFT:
drag_node = None
# 绑定事件
fig.canvas.mpl_connect("button_press_event", on_press)
fig.canvas.mpl_connect("motion_notify_event", on_move)
fig.canvas.mpl_connect("button_release_event", on_release)
plt.tight_layout()
plt.show()

2025010097马浩
鼠标拖尾
import turtle
# 1. 设置画布
screen = turtle.Screen()
screen.title("鼠标拖尾特效 (最终修复版)")
screen.bgcolor("black")
screen.setup(600, 600)
# 2. 设置画笔
pen = turtle.Turtle()
pen.shape("circle")
pen.shapesize(0.5)
pen.color("cyan")
pen.width(3) # 线条宽度
pen.speed(0)
# 3. 定义拖拽时的动作
def drag_handler(x, y):
# 当鼠标按住画笔拖动时,让它跟随坐标 x, y 移动
pen.ondrag(None) # 暂时移除监听,防止递归冲突
pen.goto(x, y) # 移动到鼠标位置
pen.dot(8) # 画一个点,制造拖尾感
pen.ondrag(drag_handler) # 重新绑定监听
# 4. 绑定事件到画笔 (注意:这里是 pen.ondrag 而不是 screen.ondrag)
pen.ondrag(drag_handler)
# 5. 让程序保持运行
turtle.done()

2025010098韩晓媛
双缝干涉条纹
#数值计算,生成坐标;以及绘图,画出曲线和干涉条纹
import numpy as np
import matplotlib.pyplot as plt
# 可自由修改的物理参数
wavelength = 520e-9 # 光波长,单位m(520e-9)
double_gap = 0.3e-3 # 双缝间距,单位m(0.3e-3)
screen_distance = 1.2 # 双缝到观测屏距离,单位m(1.2)
view_range = 0.1 # 屏幕横向显示范围,单位m(0.06)
# 生成屏幕坐标(在-0.06~0.06m之间,均匀生成3000个坐标点)
y = np.linspace(-view_range, view_range, 3000)
# 光程差计算(双缝干涉公式:Delta x = d*y/L)
path_diff = double_gap * y / screen_distance
# 双缝干涉光强公式(i=i0cos²((Π*Delta x)/λ))
light_intensity = np.cos(np.pi * path_diff / wavelength) ** 2
# 绘制光强曲线
plt.figure(figsize=(11, 5))
plt.subplot(211)
plt.plot(y, light_intensity)
plt.xlabel("y / m")
plt.ylabel("Relative Intensity")
plt.grid(alpha=0.25)
# 绘制干涉条纹效果图
plt.subplot(212)
plt.imshow(light_intensity.reshape(1, -1), cmap="gray", extent=[-view_range, view_range, 0, 1], aspect="auto")
plt.yticks([])
plt.xlabel("y / m")
#自动调整布局,展示图象
plt.tight_layout()
plt.show()

2025010099张嘉诚
用多态实现英雄攻击
import random
# 父类:英雄
class Hero:
def __init__(self, hp):
self.hp = hp # 血量属性
def attack(self):
pass
# 受伤方法:受到伤害扣血
def hurt(self, damage):
self.hp -= damage
if self.hp < 0:
self.hp = 0
print(f"自身剩余血量:{self.hp}")
# 战士
class Warrior(Hero):
def __init__(self):
super().__init__(hp=180) # 战士血量180
def attack(self):
damage = 50
print(f"【战士】挥舞大剑,造成{damage}物理伤害")
return damage
# 法师
class Mage(Hero):
def __init__(self):
super().__init__(hp=100) # 法师血量100
def attack(self):
damage = 60
print(f"【法师】释放火球术,造成{damage}魔法伤害")
return damage
# 弓箭手
class Archer(Hero):
def __init__(self):
super().__init__(hp=130) # 弓箭手血量130
def attack(self):
damage = 35
print(f"【弓箭手】拉弓射箭,造成{damage}穿刺伤害")
return damage
# 多态调用函数
def hero_fight(attacker, target):
dmg = attacker.attack()
target.hurt(dmg)
# 主程序测试
if __name__ == '__main__':
zs = Warrior()
fs = Mage()
gj = Archer()
岳飞=Warrior()
print("=====战士攻击法师=====")
hero_fight(zs, fs)
print("\n=====法师攻击弓箭手=====")
hero_fight(fs, gj)
print("\n=====弓箭手攻击战士=====")
hero_fight(gj, zs)
print(岳飞.attack())

2025010100霍延萌
表格
from docx import Document
from openpyxl import Workbook
import os
def create_test_word():
"""自动生成带表格的demo.docx,解决文件找不到报错"""
doc = Document()
doc.add_heading("班级信息表", level=1)
# 创建4列5行带边框表格
table = doc.add_table(rows=5, cols=4)
table.style = "Table Grid"
# 表头
headers = ["学号", "姓名", "专业", "成绩"]
for i, val in enumerate(headers):
table.cell(0, i).text = val
# 填充测试数据
data = [
["202601", "小明", "数学", "91"],
["202602", "小红", "统计", "86"],
["202603", "小李", "计算机", "94"],
["202604", "小张", "英语", "82"]
]
for row_idx, row_data in enumerate(data, start=1):
for col_idx, text in enumerate(row_data):
table.cell(row_idx, col_idx).text = text
doc.save("demo.docx")
print("✅ 已自动生成 demo.docx(内含测试表格)")
def docx_table_to_excel(docx_path, excel_save_path):
"""docx表格提取并导出Excel"""
# 打开word文档
doc = Document(docx_path)
# 创建excel工作簿
wb = Workbook()
sheet = wb.active
# 判断是否存在表格
if len(doc.tables) == 0:
print("❌ Word文档中没有表格!")
return
# 取文档第一个表格
word_table = doc.tables[0]
# 遍历表格写入Excel
for row_num, row in enumerate(word_table.rows, start=1):
for col_num, cell in enumerate(row.cells, start=1):
cell_content = cell.text.strip()
sheet.cell(row=row_num, column=col_num, value=cell_content)
# 保存Excel文件
wb.save(excel_save_path)
print(f"✅ 转换完成!输出文件:{excel_save_path}")
if __name__ == "__main__":
# 第一步:生成word文件(解决你之前找不到demo.docx的报错)
create_test_word()
# 第二步:执行转换
docx_table_to_excel("demo.docx", "输出表格.xlsx")

2025010101袁泉
成绩表
import pandas as pd
# ===================== 配置区域(自行修改路径)=====================
# 原始成绩表文件路径
input_excel = "原始实验成绩表.xlsx"
# 输出汇总成绩表文件路径
output_excel = "成绩汇总及等级表.xlsx"
# =================================================================
def score_statistics():
# 1. 读取原始Excel成绩表
df = pd.read_excel(input_excel, engine="openpyxl")
# 2. 计算总分、平均分(假设除姓名列外,其余都是科目分数列)
score_cols = df.columns[1:] # 第一列默认为姓名,后面全是分数
df["总分"] = df[score_cols].sum(axis=1)
df["平均分"] = df[score_cols].mean(axis=1).round(2) # 保留2位小数
# 3. 按平均分划分等级 A/B/C
def get_level(avg):
if avg >= 80:
return "A"
elif avg >= 60:
return "B"
else:
return "C"
df["等级"] = df["平均分"].apply(get_level)
# 4. 保存为新Excel文件
df.to_excel(output_excel, index=False, engine="openpyxl")
print(f"统计完成!汇总表已保存至:{output_excel}")
print("\n预览数据:")
print(df)
if __name__ == "__main__":
score_statistics()

2025010102沈玉婷
给文件分到相应文件夹里
import os
import shutil
# 你的目标文件夹路径(就是你说的“新建文件夹”)
# 注意:Windows路径里要用双反斜杠 \\ 或者 原始字符串 r""
source_dir = r"C:\新建文件夹"
# 新建两个分类文件夹
py_dir = os.path.join(source_dir, "Python文件")
other_dir = os.path.join(source_dir, "其他文件")
# 创建文件夹(如果不存在就创建)
os.makedirs(py_dir, exist_ok=True)
os.makedirs(other_dir, exist_ok=True)
# 遍历源文件夹里的所有文件(跳过子文件夹)
for item in os.listdir(source_dir):
item_path = os.path.join(source_dir, item)
if os.path.isfile(item_path): # 只处理文件,不处理子文件夹
if item.endswith(".py"):
# 是Python文件,复制/移动到py_dir
shutil.move(item_path, os.path.join(py_dir, item))
else:
# 其他文件,复制/移动到other_dir
shutil.move(item_path, os.path.join(other_dir, item))
print("文件分类完成!")
print(f"Python文件存放位置:{py_dir}")
print(f"其他文件存放位置:{other_dir}")

2025010103黄俊
录音
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import sounddevice as sd
from scipy.io.wavfile import write
# 指定1号麦克风
sd.default.device = 1
CHUNK = 1024
SAMPLE_RATE = 44100
all_audio = []
fig, ax = plt.subplots(figsize=(10, 4))
x_axis = np.arange(CHUNK)
line, = ax.plot(x_axis, np.zeros(CHUNK), color="#0099ff", linewidth=1)
ax.set_ylim(-1, 1)
ax.set_title("实时麦克风波形(关窗口自动保存录音)")
def refresh(_):
data = sd.rec(frames=CHUNK, samplerate=SAMPLE_RATE, channels=1)
all_audio.extend(data)
line.set_ydata(data[:, 0])
return line,
ani = FuncAnimation(fig, refresh, interval=20, blit=True, cache_frame_data=False)
# 关闭窗口自动存录音
def on_close(event):
if all_audio:
audio_np = np.array(all_audio)
write("record.wav", SAMPLE_RATE, audio_np)
print("✅ 录音保存成功:项目文件夹 record.wav")
fig.canvas.mpl_connect('close_event', on_close)
plt.show()

2025010107孙瑞妍
按文件大小分类到不同文件夹里
import os
import shutil
# 配置区,自行修改
source_dir = r"D:\test_files" # 待分类文件的根目录
target_root = r"D:\file_sort" # 分类文件夹总目录
# 大小划分,单位MB
size_rule = [
("小于10MB", 0, 10),
("10MB~100MB", 10, 100),
("100MB~1GB", 100, 1024),
("大于1GB", 1024, float("inf"))
]
# 创建目标分类文件夹
for folder_name, _, _ in size_rule:
full_path = os.path.join(target_root, folder_name)
os.makedirs(full_path, exist_ok=True)
# 遍历源文件夹所有文件
for filename in os.listdir(source_dir):
file_path = os.path.join(source_dir, filename)
# 跳过文件夹,只处理文件
if not os.path.isfile(file_path):
continue
# 获取文件大小 MB
file_size_byte = os.path.getsize(file_path)
file_size_mb = file_size_byte / 1024 / 1024
# 判断归属文件夹
dest_folder = ""
for name, min_mb, max_mb in size_rule:
if min_mb <= file_size_mb < max_mb:
dest_folder = name
break
# 复制/移动文件,move移动,copy2复制
dest_path = os.path.join(target_root, dest_folder, filename)
try:
shutil.move(file_path, dest_path)
print(f"已移动:{filename} → {dest_folder}")
except Exception as e:
print(f"失败 {filename} : {str(e)}")

2025010109 黄帅豪
图像处理,卷积魔法
import cv2
import numpy as np
import matplotlib.pyplot as plt
# ========== 图片路径 ==========
img_path = "test.png"
img = cv2.imread(img_path)
if img is None:
raise FileNotFoundError("图片不存在,请修改文件路径!")
# opencv默认BGR,转为RGB用于matplotlib显示
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
h, w = img.shape[:2]
# ---------------------- 2. 高斯模糊 ----------------------
blur_img = cv2.GaussianBlur(img_rgb, (15, 15), sigmaX=0)
# ---------------------- 3. 图像锐化 ----------------------
sharpen_kernel = np.array([
[-0.5, -0.5, -0.5],
[-0.5, 5.0, -0.5],
[-0.5, -0.5, -0.5]
])
sharpen_img = cv2.filter2D(img_rgb, -1, sharpen_kernel)
# ---------------------- 4. Canny边缘检测 ----------------------
gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
gray_blur = cv2.GaussianBlur(gray, (3, 3), 0)
edge_img = cv2.Canny(gray_blur, threshold1=50, threshold2=150)
# ---------------------- 5. 浮雕效果 ----------------------
emboss_kernel = np.array([
[-2, -1, 0],
[-1, 1, 1],
[ 0, 1, 2]
])
emboss_img = cv2.filter2D(img_rgb, -1, emboss_kernel)
emboss_img = cv2.normalize(emboss_img, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
# ---------------------- 绘图展示 ----------------------
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示乱码
plt.figure(figsize=(14, 10))
plt.subplot(2, 3, 1)
plt.imshow(img_rgb)
plt.title("原图")
plt.axis("off")
plt.subplot(2, 3, 2)
plt.imshow(blur_img)
plt.title("高斯模糊")
plt.axis("off")
plt.subplot(2, 3, 3)
plt.imshow(sharpen_img)
plt.title("图像锐化")
plt.axis("off")
plt.subplot(2, 3, 4)
plt.imshow(edge_img, cmap="gray")
plt.title("Canny边缘检测")
plt.axis("off")
plt.subplot(2, 3, 5)
plt.imshow(emboss_img)
plt.title("浮雕效果")
plt.axis("off")
plt.tight_layout()
plt.show()
# ---------------------- 保存图片 ----------------------
cv2.imwrite("blur.jpg", cv2.cvtColor(blur_img, cv2.COLOR_RGB2BGR))
cv2.imwrite("sharpen.jpg", cv2.cvtColor(sharpen_img, cv2.COLOR_RGB2BGR))
cv2.imwrite("edge.jpg", edge_img)
cv2.imwrite("emboss.jpg", cv2.cvtColor(emboss_img, cv2.COLOR_RGB2BGR))
print("所有效果图已保存至当前文件夹!")

2025010113 石蕊鑫
合并两个csv文件,将csv文件转换为txt文件
import csv
csv_file1 = "文件1.csv"
csv_file2 = "文件二.csv"
output_file = "合并结果.csv"
with open(csv_file1, "r", encoding="utf-8", newline="") as f1, \
open(csv_file2, "r", encoding="utf-8", newline="") as f2, \
open(output_file, "w", encoding="utf-8", newline="") as f_out:
reader1 = csv.reader(f1)
reader2 = csv.reader(f2)
writer = csv.writer(f_out)
# 写入第一个文件全部内容
for row in reader1:
writer.writerow(row)
# 跳过第二个文件表头,再写入内容
next(reader2)
for row in reader2:
writer.writerow(row)
print("合并完成!")
import csv
def csv_to_txt(csv_path, txt_path, sep="\t"):
"""
将CSV文件转换为TXT文件
:param csv_path: 输入的CSV文件路径
:param txt_path: 输出的TXT文件路径
:param sep: 列分隔符,默认用制表符(\t),也可以用逗号、空格等
"""
with open(csv_path, "r", encoding="utf-8") as csv_file, \
open(txt_path, "w", encoding="utf-8") as txt_file:
reader = csv.reader(csv_file)
for row in reader:
line = sep.join(row) + "\n"
txt_file.write(line)
print(f"转换完成!已保存为:{txt_path}")
if __name__ == "__main__":
input_csv = "文件1.csv"
output_txt = "文件1.txt"
csv_to_txt(input_csv, output_txt)

2025010115 康静茹
新建文件夹{将文件按不同类型分到不同文件夹
import os
import shutil
def classify_files(src:str, dst:str)->None:
# 定义文件类型映射
types = {
"图片": [".jpg", ".png", ".gif", ".bmp"],
"文档": [".txt", ".doc", ".docx", ".pdf", ".xls", ".xlsx"],
"视频": [".mp4", ".avi", ".mkv"],
"音频": [".mp3", ".wav"],
"压缩包": [".zip", ".rar", ".7z"]
}
# 遍历文件
for name in os.listdir(src):
path = os.path.join(src, name)
if os.path.isfile(path):
ext = os.path.splitext(name)[1].lower()
# 判断文件类型
folder = "其他"
for t, exts in types.items():
if ext in exts:
folder = t
break
# 目标路径
target_dir = os.path.join(dst, folder)
os.makedirs(target_dir, exist_ok=True)
target_path = os.path.join(target_dir, name)
# 防重名
count = 1
while os.path.exists(target_path):
base, e = os.path.splitext(name)
target_path = os.path.join(target_dir, f"{base}_{count}{e}")
count += 1
# 复制文件
shutil.copy2(path, target_path)
print(f"已复制: {name} -> {folder}")
if __name__ == "__main__":
# 直接在这里写你的路径,用r字符串
source = r"C:\Users\康静茹\Downloads" # 你的源文件夹
dest = r"C:\Users\康静茹\Desktop\分类结果" # 你的目标文件夹
classify_files(source, dest)



2025010117 李欣栎
人脸框选
import cv2 # 导入opencv库
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalFace_default.xml') #加载人脸检测器
cap = cv2.VideoCapture(0) #打开摄像头
# 循环读取画面
while True:
ret, img = cap.read() #读取一帧画面
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转变度图(检测人脸更快)
faces = face_cascade.detectMultiScale(gray, 1.1, 4) #检测人脸
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) #給每个人脸画方框
cv2.imshow("人脸检测", img) #显示画面
k = cv2.waitKey(30) & 0xff
if k == 27:
break #按ESC退出
# 释放资源
cap.release()
cv2.destroyAllWindows()


2025010118 陈影
文件收集到excel表里
import os
import pandas as pd
# 自动获取当前文件夹
path = os.getcwd()
data = []
# 遍历所有内容
for root, dirs, files in os.walk(path):
# 过滤PyCharm系统配置文件夹
dirs[:] = [d for d in dirs if not d in ('.idea','inspectionProfiles')]
# 记录文件夹
for d in dirs:
data.append([root, d, "文件夹", "包含"])
# 记录正常作业文件
for f in files:
if not f.endswith(('.xml','.iml','.gitignore')):
data.append([root, f, "文件", "包含"])
# 构建DataFrame+强制生成标准表格
df = pd.DataFrame(data, columns=["父目录", "名称", "类型", "包含关系"])
df.to_excel("文件目录表格.xlsx", index=False, engine="openpyxl")
print(f"成功生成!")
print(f"表格保存在:{path}")


2025010119 淡郑雪
酒店管理
# 酒店管理系统
# 房间数据:{房间号: [状态, 价格, 入住人姓名]}
# 状态:0空闲 1已入住
rooms = {
101: [0, 180, ""],
102: [0, 180, ""],
201: [0, 260, ""],
202: [0, 260, ""],
301: [0, 380, ""]
}
total_income = 0 # 总营业额
def show_menu():
print("===== 酒店客房管理系统 =====")
print("1. 查看所有房间状态")
print("2. 办理入住")
print("3. 办理退房")
print("4. 新增客房")
print("5. 查询营业额")
print("0. 退出系统")
print("============================")
def show_rooms():
print("\n【房间信息】")
print("房间号\t房价\t状态\t入住客人")
for num, info in rooms.items():
status = "空闲" if info[0] == 0 else "已入住"
name = info[2] if info[2] else "无"
print(f"{num}\t{info[1]}元\t{status}\t{name}")
def check_in():
global rooms
try:
room_num = int(input("请输入入住房间号:"))
if room_num not in rooms:
print("该房间不存在!")
return
if rooms[room_num][0] == 1:
print("房间已有人入住,无法办理!")
return
name = input("请输入入住客人姓名:")
days = int(input("入住天数:"))
rooms[room_num][0] = 1
rooms[room_num][2] = name
price = rooms[room_num][1] * days
print(f"办理成功!总费用:{price}元")
except ValueError:
print("输入数字错误!")
def check_out():
global rooms, total_income
try:
room_num = int(input("请输入退房房间号:"))
if room_num not in rooms:
print("该房间不存在!")
return
if rooms[room_num][0] == 0:
print("该房间无人入住!")
return
days = int(input("实际入住天数:"))
cost = rooms[room_num][1] * days
total_income += cost
# 房间重置
rooms[room_num][0] = 0
rooms[room_num][2] = ""
print(f"退房完成,本次消费{cost}元,已计入营收")
except ValueError:
print("输入数字错误!")
def add_room():
try:
new_num = int(input("输入新房间号:"))
if new_num in rooms:
print("房间已存在!")
return
price = int(input("输入房间单价:"))
rooms[new_num] = [0, price, ""]
print("新增客房成功!")
except ValueError:
print("数字输入有误!")
# 主程序循环
while True:
show_menu()
opt = input("请选择功能:")
if opt == "1":
show_rooms()
elif opt == "2":
check_in()
elif opt == "3":
check_out()
elif opt == "4":
add_room()
elif opt == "5":
print(f"\n酒店总营业额:{total_income} 元")
elif opt == "0":
print("系统退出,再见!")
break
else:
print("输入错误,请选择0-5!")
input("\n按回车返回菜单...")

2025010121郑舒萍
建立一个窗口,加载音乐文件,可以播放音乐
import tkinter as tk
from tkinter import filedialog
import os
import os.path
win = tk.Tk()
win.title("MP3播放器")
song_paths = []
def load_dir():
global song_paths
folder = filedialog.askdirectory()
listbox.delete(0, tk.END)
song_paths.clear()
# 只读取mp3文件
for file_name in os.listdir(folder):
if file_name.lower().endswith(".mp3"):
full_path = os.path.join(folder, file_name)
song_paths.append(full_path)
listbox.insert(tk.END, file_name)
def play_song():
select = listbox.curselection()
if not select:
return
path = song_paths[select[0]]
# Windows系统自带打开音频,不会失效
os.startfile(path)
tk.Button(win, text="打开歌曲文件夹", command=load_dir).pack(pady=5)
listbox = tk.Listbox(win, width=40, height=10)
listbox.pack(pady=5)
tk.Button(win, text="播放选中歌曲", command=play_song).pack(pady=5)
win.mainloop()

2025010122 田昌盛
人物类游戏有血量普攻
import time
import os
import random
# 跨平台清屏,实现动画刷新
def clear_screen():
os.system("cls" if os.name == "nt" else "clear")
# 角色单位类:封装血量、攻击、小人图标、血条、攻击逻辑
class Unit:
def __init__(self, name, job, hp, max_hp, atk, symbol):
self.name = name
self.job = job
self.hp = hp
self.max_hp = max_hp
self.atk = atk
self.symbol = symbol # 小人emoji图标
self.alive = True
# 可视化方块血条
def get_hp_bar(self):
bar_length = 15
fill_block = int(bar_length * self.hp / self.max_hp)
bar = "■" * fill_block + "□" * (bar_length - fill_block)
return f"[{bar}] {self.hp}/{self.max_hp}"
# 承受伤害,血量最低为0
def take_damage(self, damage):
self.hp = max(0, self.hp - damage)
if self.hp <= 0:
self.alive = False
# 普攻攻击目标
def attack(self, target):
if not self.alive or not target.alive:
return
hurt = self.atk
target.take_damage(hurt)
print(f"{self.symbol}{self.job}{self.name} → {target.symbol}{target.job}{target.name} 造成 {hurt} 点伤害!")
# 绘制战场画面(固定站位:前排战士、中排弓手、后排法师)
def draw_battle_scene(warrior, archer, mage, boss):
print("===== 卡通小人对战动画 =====")
print("【我方阵容站位】前排坦克|中排输出|后排法师")
print(f" {warrior.symbol} {warrior.job} {warrior.name} {warrior.get_hp_bar()}")
print(f" {archer.symbol} {archer.job} {archer.name} {archer.get_hp_bar()}")
print(f" {mage.symbol} {mage.job} {mage.name} {mage.get_hp_bar()}")
print("-" * 45)
print("【敌方BOSS】")
print(f" {boss.symbol} {boss.job} {boss.name} {boss.get_hp_bar()}")
print("=" * 45)
# 创建三个职业角色 + BOSS
def create_character():
warrior = Unit("铁山", "战士", 160, 160, 24, "🧔")
archer = Unit("风羽", "弓箭手", 115, 115, 28, "🏹")
mage = Unit("星灵", "法师", 75, 75, 40, "🧙")
boss = Unit("暗影巨兽", "魔物", 320, 320, 32, "👹")
return warrior, archer, mage, boss
# 战斗动画主流程
def start_battle():
war, arch, mag, boss = create_character()
round_count = 1
while True:
# 刷新画面动画
clear_screen()
draw_battle_scene(war, arch, mag, boss)
print(f"当前:第 {round_count} 回合")
time.sleep(0.8)
# 我方存活角色依次攻击BOSS
if war.alive:
war.attack(boss)
time.sleep(0.6)
if arch.alive:
arch.attack(boss)
time.sleep(0.6)
if mag.alive:
mag.attack(boss)
time.sleep(0.6)
# BOSS战败,胜利
if not boss.alive:
clear_screen()
draw_battle_scene(war, arch, mag, boss)
print("\n🎉 怪物BOSS被击倒!我方全员胜利!")
break
# BOSS随机挑选一名存活队友反击
alive_team = []
if war.alive: alive_team.append(war)
if arch.alive: alive_team.append(arch)
if mag.alive: alive_team.append(mag)
hit_target = random.choice(alive_team)
boss.attack(hit_target)
time.sleep(0.8)
# 我方全部阵亡,失败
if not war.alive and not arch.alive and not mag.alive:
clear_screen()
draw_battle_scene(war, arch, mag, boss)
print("\n💀 我方所有角色全部倒下,战斗失败!")
break
round_count += 1
time.sleep(1)
# 启动游戏
if __name__ == "__main__":
start_battle()

2025010124 胡鑫
连连看
# 导入所需库
import cv2
import numpy as np
import os
# ===================== 1. 图片加载与合法性校验 =====================
# 图片路径(确保图片和代码放在同一文件夹)
img_path = "lianliankan.jpg"
# 判断文件是否存在
if not os.path.exists(img_path):
print(f"❌ 图片不存在!绝对路径:{os.path.abspath(img_path)}")
exit()
# 使用OpenCV读取图片
img = cv2.imread(img_path)
if img is None:
print("❌ 图片加载失败,请检查文件是否损坏或格式异常!")
exit()
print("✅ 图片加载成功!")
# 展示原始图片
cv2.imshow("原图", img)
print("按任意键开始连连看配对模拟...")
cv2.waitKey(0)
cv2.destroyAllWindows()
# ===================== 2. 初始化绘图画布 =====================
# 复制原图,避免修改原始图像
work_img = img.copy()
# 获取图像高度、宽度
h, w = work_img.shape[:2]
# ===================== 3. 随机生成两个点位(模拟点击格子) =====================
# 生成随机坐标 (x, y)
p1 = (np.random.randint(0, w), np.random.randint(0, h))
p2 = (np.random.randint(0, w), np.random.randint(0, h))
# 提取两个点位的像素颜色(OpenCV 为 BGR 格式)
color1 = work_img[p1[1], p1[0]]
color2 = work_img[p2[1], p2[0]]
# 在选中位置绘制红色实心圆点做标记
cv2.circle(work_img, p1, 5, (0, 0, 255), -1)
cv2.circle(work_img, p2, 5, (0, 0, 255), -1)
# ===================== 4. 颜色比对,判断配对结果 =====================
if np.array_equal(color1, color2):
print("✅ 配对成功!两点颜色相同")
# 配对成功,绘制绿色连线
cv2.line(work_img, p1, p2, (0, 255, 0), 2)
else:
print("❌ 配对失败!两点颜色不同")
# ===================== 5. 展示最终结果 =====================
cv2.imshow("连连看配对结果", work_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2025010125 刘芮孜
学生管理系统
class StudentManager:
def __init__(self):
# 属性:存储全部学生数据,实例初始化自带空列表
self.student_list = []
# 1.添加学生(方法)
def add_student(self):
sid = input("输入学生学号:")
# 查重
for stu in self.student_list:
if stu["sid"] == sid:
print("该学号已存在,添加失败!")
return
name = input("输入姓名:")
age = input("输入年龄:")
clazz = input("输入班级:")
self.student_list.append({"sid": sid, "name": name, "age": age, "clazz": clazz})
print("✅ 添加成功")
# 2.删除学生
def del_student(self):
sid = input("输入要删除学生的学号:")
for idx, stu in enumerate(self.student_list):
if stu["sid"] == sid:
del self.student_list[idx]
print("✅ 删除完成")
return
print("❌ 未找到该学生")
#3.修改信息
def modify_student(self):
sid = input("输入要修改的学号:")
for stu in self.student_list:
if stu["sid"] == sid:
new_name = input("新姓名(回车不修改):") or stu["name"]
new_age = input("新年龄(回车不修改):") or stu["age"]
new_clazz = input("新班级(回车不修改):") or stu["clazz"]
stu["name"] = new_name
stu["age"] = new_age
stu["clazz"] = new_clazz
print("✅ 修改成功")
return
print("❌ 查无此人")
#4.查找学生
def search_student(self):
key = input("输入学号/姓名查询:")
res = [s for s in self.student_list if key in s["sid"] or key in s["name"]]
if not res:
print("无匹配信息")
return
print(f"{'学号':<8}{'姓名':<6}{'年龄':<6}{'班级':<8}")
for s in res:
print(f"{s['sid']:<8}{s['name']:<6}{s['age']:<6}{s['clazz']:<8}")
#5.展示全部
def show_all(self):
if not self.student_list:
print("暂无学生数据")
return
print(f"{'学号':<8}{'姓名':<6}{'年龄':<6}{'班级':<8}")
for s in self.student_list:
print(f"{s['sid']:<8}{s['name']:<6}{s['age']:<6}{s['clazz']:<8}")
#菜单
def menu(self):
while True:
print("\n====学生管理系统====")
print("1新增 | 2删除 |3修改 |4查询 |5全部 |0退出")
opt = input("请输入序号:")
if opt == "1":
self.add_student()
elif opt == "2":
self.del_student()
elif opt == "3":
self.modify_student()
elif opt == "4":
self.search_student()
elif opt == "5":
self.show_all()
elif opt == "0":
print("程序退出")
break
else:
print("输入有误!")
# 实例化:用类创建一个管理系统对象
if __name__ == "__main__":
manage = StudentManager()
manage.menu()

2025010127 刘杨龙
import tkinter as tk
class LineDrawApp:
def __init__(self, root):
self.root = root
self.canvas = tk.Canvas(root, bg="white", width=800, height=600)
self.canvas.pack(fill=tk.BOTH, expand=True)
self.start_x = None
self.start_y = None
self.temp_line = None # 拖动时预览虚线
# 绑定鼠标事件
self.canvas.bind("<ButtonPress-1>", self.mouse_down)
self.canvas.bind("<B1-Motion>", self.mouse_move)
self.canvas.bind("<ButtonRelease-1>", self.mouse_up)
self.canvas.bind("<Button-3>", self.clear_all)
def mouse_down(self, event):
# 起点
self.start_x, self.start_y = event.x, event.y
self.temp_line = None
def mouse_move(self, event):
# 拖动实时预览虚线
if self.temp_line:
self.canvas.delete(self.temp_line)
self.temp_line = self.canvas.create_line(
self.start_x, self.start_y,
event.x, event.y,
fill="gray", dash=(4, 2)
)
def mouse_up(self, event):
# 松手删除预览线,绘制实线直线
if self.temp_line:
self.canvas.delete(self.temp_line)
self.canvas.create_line(
self.start_x, self.start_y,
event.x, event.y,
fill="black", width=2
)
self.start_x = self.start_y = None
def clear_all(self, event):
# 右键清空画布
self.canvas.delete(tk.ALL)
if __name__ == "__main__":
win = tk.Tk()
win.title("拖拽绘制直线")
app = LineDrawApp(win)
win.mainloop()

2025010128 贾姝慧
礼花绽放
import turtle # 导入海龟绘图库
import random # 导入随机数库
turtle.bgcolor("black") # 设置画布背景为黑色
t = turtle.Turtle() # 创建画笔对象t
t.speed(0) # 画笔最快速度(0最快,1~10变快)
t.hideturtle() # 隐藏画笔箭头
colors = ["red", "orange", "yellow", "green", "blue", "purple", "white"] # 定义颜色列表
def firework(x, y): # 定义烟花函数,x,y是鼠标点击坐标
t.penup() # 抬笔,移动不留线
t.goto(x, y) # 画笔移动到鼠标点击位置
t.pendown() # 落笔,开始绘图
t.color(random.choice(colors)) # 随机选一种颜色
for _ in range(50): # 循环50次画出烟花射线
t.forward(120) # 向前走120像素
t.backward(120) # 退回原点
t.right(15) # 右转15度
turtle.onscreenclick(firework) # 鼠标点击画布触发烟花函数
turtle.done() # 保持画布不关闭

2025010130任鸿杰
坦克
import pygame
from pygame.locals import *
import sys
def play_tank():
pygame.init()
width, height = 600, 400
speed = [1, 1]
color_bg = (255, 255, 255)
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('自由移动的坦克')
# 自建小坦克Surface,不用文件
tank_size = (32, 32)
tank_image = pygame.Surface(tank_size)
tank_image.fill((50, 70, 30))
# 画炮管
pygame.draw.rect(tank_image, (20, 20, 20), (12, 0, 8, 18))
tank_rect = tank_image.get_rect()
fpsClock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
tank_rect = tank_rect.move(speed)
if tank_rect.left < 0 or tank_rect.right > width:
speed[0] = -speed[0]
if tank_rect.top < 0 or tank_rect.bottom > height:
speed[1] = -speed[1]
screen.fill(color_bg)
screen.blit(tank_image, tank_rect)
pygame.display.update()
fpsClock.tick(50)
if __name__ == '__main__':
play_tank()

2025010131 董玥卓
搞一个销量表
from openpyxl import load_workbook
# 文件名和表格名完全对应:sales.xlsx
wb = load_workbook("sales.xlsx")
ws = wb.active
# 张三
print("===== 张三 销售数据 =====")
print(f"3月:{ws[2][1].value} 件,4月:{ws[2][2].value} 件,5月:{ws[2][3].value} 件")
# 李四
print("\n===== 李四 销售数据 =====")
print(f"3月:{ws[3][1].value} 件,4月:{ws[3][2].value} 件,5月:{ws[3][3].value} 件")
# 王二
print("\n===== 王二 销售数据 =====")
print(f"3月:{ws[4][1].value} 件,4月:{ws[4][2].value} 件,5月:{ws[4][3].value} 件")

2025010132 李佳雨
图像描边
import cv2
import numpy as np
# 你的图片文件名
img_name = "1.jpg"
# 读取图片
img = cv2.imread(img_name)
if img is None:
print("未找到图片,请核对名称!")
else:
# 1. 先缩小图片(这里是关键,你可以改 scale 调整大小)
scale = 0.5 # 0.5 就是缩小到原来的 50%,0.3就是30%,越大越清晰、越大
width = int(img.shape[1] * scale)
height = int(img.shape[0] * scale)
img_resized = cv2.resize(img, (width, height), interpolation=cv2.INTER_AREA)
# 2. 描边处理
gray = cv2.cvtColor(img_resized, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3, 3), 0)
edge = cv2.Canny(blur, 50, 150)
# 3. 显示和保存
cv2.imshow("原图", img_resized)
cv2.imshow("描边效果", edge)
cv2.imwrite("描边成品.png", edge)
print("描边图片已保存为 描边成品.png")
cv2.waitKey(0)
cv2.destroyAllWindows()


浙公网安备 33010602011771号