python案例统计冲刺跑次数谁更多?

wen python案例 2

本文目录导读:

python案例统计冲刺跑次数谁更多?

  1. 方案一:简单版本(手动输入数据)
  2. 方案二:数据文件版本
  3. 方案三:图形界面版本(Tkinter)
  4. 使用说明
  5. 示例运行效果

我来帮你创建一个统计冲刺跑次数的Python程序,这个程序可以记录和分析不同运动员的冲刺跑数据。

简单版本(手动输入数据)

def count_sprints_manual():
    """手动输入数据统计冲刺跑次数"""
    sprint_data = {}
    print("=== 冲刺跑次数统计系统 ===")
    print("请输入运动员姓名和冲刺次数(输入'结束'退出)")
    while True:
        name = input("请输入运动员姓名(或输入'结束'):")
        if name == '结束':
            break
        try:
            count = int(input(f"请输入{name}的冲刺次数:"))
            sprint_data[name] = sprint_data.get(name, 0) + count
        except ValueError:
            print("请输入有效的数字!")
            continue
    if not sprint_data:
        print("没有录入任何数据!")
        return
    print("\n=== 统计结果 ===")
    for name, count in sprint_data.items():
        print(f"{name}: {count}次")
    # 找出最多的
    max_name = max(sprint_data, key=sprint_data.get)
    max_count = sprint_data[max_name]
    print(f"\n🏆 冲刺跑次数最多的是:{max_name},共{max_count}次!")
# 运行简单版本
if __name__ == "__main__":
    count_sprints_manual()

数据文件版本

import json
import os
from datetime import datetime
class SprintTracker:
    def __init__(self, filename='sprint_data.json'):
        self.filename = filename
        self.data = self.load_data()
    def load_data(self):
        """加载数据"""
        if os.path.exists(self.filename):
            with open(self.filename, 'r', encoding='utf-8') as f:
                return json.load(f)
        return {}
    def save_data(self):
        """保存数据"""
        with open(self.filename, 'w', encoding='utf-8') as f:
            json.dump(self.data, f, ensure_ascii=False, indent=2)
    def add_sprint(self, name, count=1):
        """添加冲刺记录"""
        today = datetime.now().strftime("%Y-%m-%d")
        if name not in self.data:
            self.data[name] = {'total': 0, 'daily': {}}
        self.data[name]['total'] += count
        self.data[name]['daily'][today] = self.data[name]['daily'].get(today, 0) + count
        self.save_data()
        print(f"✅ {name} 今日已累计 {self.data[name]['total']} 次冲刺")
    def get_stats(self):
        """获取统计信息"""
        if not self.data:
            return "暂无数据"
        stats = []
        for name, info in self.data.items():
            stats.append((name, info['total']))
        stats.sort(key=lambda x: x[1], reverse=True)
        result = "=== 冲刺跑排行榜 ===\n"
        for i, (name, count) in enumerate(stats, 1):
            medal = ['🥇', '🥈', '🥉'][i-1] if i <= 3 else f"{i}."
            result += f"{medal} {name}: {count}次\n"
        return result
def main_file_version():
    """文件版本的主程序"""
    tracker = SprintTracker()
    while True:
        print("\n" + "="*30)
        print("冲刺跑统计系统 - 文件版")
        print("1. 添加冲刺记录")
        print("2. 查看排行榜")
        print("3. 查看个人详情")
        print("4. 清除数据")
        print("5. 退出")
        print("="*30)
        choice = input("请选择操作:")
        if choice == '1':
            name = input("请输入姓名:")
            try:
                count = int(input("请输入冲刺次数(默认1):") or "1")
                tracker.add_sprint(name, count)
            except ValueError:
                print("⚠️ 请输入有效的数字!")
        elif choice == '2':
            print(tracker.get_stats())
        elif choice == '3':
            name = input("请输入姓名:")
            if name in tracker.data:
                print(f"\n{name}的总冲刺次数:{tracker.data[name]['total']}")
                print("每日记录:")
                for date, count in tracker.data[name]['daily'].items():
                    print(f"  {date}: {count}次")
            else:
                print(f"❌ 没有找到{name}的记录")
        elif choice == '4':
            confirm = input("确定要清除所有数据吗?(y/n):")
            if confirm.lower() == 'y':
                tracker.data = {}
                tracker.save_data()
                print("✅ 数据已清除")
        elif choice == '5':
            print("👋 再见!")
            break
        else:
            print("⚠️ 无效的选择!")
if __name__ == "__main__":
    main_file_version()

图形界面版本(Tkinter)

import tkinter as tk
from tkinter import ttk, messagebox
from collections import defaultdict
class SprintGUI:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("🏃 冲刺跑统计系统")
        self.root.geometry("500x400")
        # 数据存储
        self.sprint_data = defaultdict(int)
        # 创建界面
        self.create_widgets()
        self.root.mainloop()
    def create_widgets(self):
        # 标题
        title = tk.Label(self.root, text="🏃 冲刺跑记录系统", 
                        font=("Arial", 20, "bold"))
        title.pack(pady=20)
        # 输入框区域
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=10)
        tk.Label(input_frame, text="姓名:", font=("Arial", 12)).grid(row=0, column=0)
        self.name_entry = tk.Entry(input_frame, font=("Arial", 12), width=15)
        self.name_entry.grid(row=0, column=1, padx=5)
        tk.Label(input_frame, text="次数:", font=("Arial", 12)).grid(row=0, column=2)
        self.count_entry = tk.Entry(input_frame, font=("Arial", 12), width=8)
        self.count_entry.grid(row=0, column=3, padx=5)
        # 按钮
        button_frame = tk.Frame(self.root)
        button_frame.pack(pady=15)
        tk.Button(button_frame, text="➕ 添加记录", command=self.add_record,
                 font=("Arial", 12), bg="#4CAF50", fg="white").grid(row=0, column=0, padx=5)
        tk.Button(button_frame, text="📊 显示统计", command=self.show_stats,
                 font=("Arial", 12), bg="#2196F3", fg="white").grid(row=0, column=1, padx=5)
        tk.Button(button_frame, text="🗑️ 清空数据", command=self.clear_data,
                 font=("Arial", 12), bg="#f44336", fg="white").grid(row=0, column=2, padx=5)
        # 结果显示区域
        self.result_text = tk.Text(self.root, height=12, width=55, font=("Arial", 11))
        self.result_text.pack(pady=10, padx=20)
    def add_record(self):
        name = self.name_entry.get().strip()
        if not name:
            messagebox.showwarning("警告", "请输入姓名!")
            return
        try:
            count = int(self.count_entry.get() or "1")
            if count <= 0:
                raise ValueError
        except ValueError:
            messagebox.showwarning("警告", "请输入有效的正整数次数!")
            return
        self.sprint_data[name] += count
        messagebox.showinfo("成功", f"✅ {name} 已记录 {count} 次冲刺")
        # 清空输入
        self.name_entry.delete(0, tk.END)
        self.count_entry.delete(0, tk.END)
    def show_stats(self):
        if not self.sprint_data:
            self.result_text.delete(1.0, tk.END)
            self.result_text.insert(tk.END, "暂无数据,请先添加记录!")
            return
        # 排序
        sorted_data = sorted(self.sprint_data.items(), 
                           key=lambda x: x[1], reverse=True)
        result = "=== 冲刺跑排行榜 ===\n\n"
        for i, (name, count) in enumerate(sorted_data, 1):
            medal = ['🥇', '🥈', '🥉'][i-1] if i <= 3 else f"{i}."
            result += f"{medal} {name}: {count}次\n"
        # 找出最多者
        max_name, max_count = sorted_data[0]
        result += f"\n🏆 冠军:{max_name}({max_count}次)"
        self.result_text.delete(1.0, tk.END)
        self.result_text.insert(tk.END, result)
    def clear_data(self):
        if messagebox.askyesno("确认", "确定要清空所有数据吗?"):
            self.sprint_data.clear()
            self.result_text.delete(1.0, tk.END)
            messagebox.showinfo("成功", "数据已清空!")
if __name__ == "__main__":
    SprintGUI()

使用说明

  1. 简单版本:直接运行,手动输入数据
  2. 文件版本:数据会保存到JSON文件中,支持持久化存储
  3. GUI版本:带图形界面,适合非技术用户

示例运行效果

=== 冲刺跑排行榜 ===
🥇 张三: 15次
🥈 李四: 12次
🥉 王五: 8次
4. 赵六: 5次

选择哪个版本取决于你的需求:

  • 快速使用选方案一
  • 需要保存数据选方案二
  • 想要图形界面选方案三

需要我帮你定制其他功能吗?比如按日期统计、导出Excel等。

抱歉,评论功能暂时关闭!