25级第六次实验报告

2025010089  1
2025010090  
2025010091  1
2025010092  1
2025010093  1
2025010094  1
2025010095  1
2025010096  
2025010097  
2025010098 1
2025010099
2025010100  
2025010101 1
2025010102  1
2025010103  1
2025010104  
2025010105  
2025010106  
2025010107  1
2025010108  
2025010109  1
2025010110  
2025010112  
2025010113  1
2025010114  
2025010115  1
2025010117
2025010118  1
2025010119  1
2025010120  
2025010121
2025010122  1
2025010124  1
2025010125  1
2025010126  
2025010127  
2025010128
2025010130  1
2025010131
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()

屏幕截图 2026-06-02 001543

 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()

  屏幕截图 2026-06-17 203531

 

 

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()

dac08f61ece6398333f3c870adea30cc

 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)

屏幕截图 2026-06-17 192815

 

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()

屏幕截图 2026-06-14 222423

 

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()

屏幕截图 2026-06-02 222419

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()

屏幕截图 2026-06-02 215413

 

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()

屏幕截图 2026-06-02 214852

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()

屏幕截图 2026-06-17 160124

 

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())

屏幕截图 2026-06-03 110735

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")

  屏幕截图 2026-06-17 191019

 

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()

屏幕截图 2026-05-31 224827

 

 

 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}")

屏幕截图 2026-06-01 235939

 

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()

屏幕截图 2026-06-09 214912

 

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)}")

 

屏幕截图 2026-06-01 220319

 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("所有效果图已保存至当前文件夹!")

 

 

image

 

 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)

屏幕截图 2026-06-01 015231

 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)

局部截取_20260601_235824

局部截取_20260601_235721

局部截取_20260602_000338

 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()

0ed81b8653b8613c94d3c651f0316152

6ccc50843b70777d61c38acd395d83f6

 

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}")

image

 

image

 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按回车返回菜单...")

屏幕截图 2026-06-17 172347

 

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()

  屏幕截图 2026-06-13 153804

 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()

  屏幕截图 2026-06-13 164022

 

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()

截屏2026-06-10 11.40.33

 

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()

屏幕截图 2026-06-17 134433

 

 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()  # 保持画布不关闭

 屏幕截图 2026-06-02 220301

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()

  屏幕截图 2026-06-17 125647

 

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} 件")

屏幕截图 2026-06-14 150123

 

 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()

屏幕截图 2026-06-13 214355

 

posted @ 2026-06-17 21:34  szmtjs10  阅读(4)  评论(0)    收藏  举报