编辑代码

import sqlite3
from datetime import datetime
import sys

class SportsMeetSystem:
    def __init__(self):
        self.conn = sqlite3.connect('sports_meet.db')
        self.cursor = self.conn.cursor()
        self.create_tables()
    
    def create_tables(self):
        """创建数据库表"""
        # 学生表
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS students (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            student_id TEXT UNIQUE NOT NULL,
            name TEXT NOT NULL,
            gender TEXT NOT NULL,
            class TEXT NOT NULL,
            contact TEXT
        )
        ''')
        
        # 运动项目表
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS events (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            event_name TEXT NOT NULL,
            event_type TEXT NOT NULL,  # 田赛/径赛/球类等
            gender_limit TEXT,  # 男子/女子/不限
            max_participants INTEGER,
            start_time DATETIME,
            location TEXT
        )
        ''')
        
        # 参赛记录表
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS registrations (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            student_id TEXT NOT NULL,
            event_id INTEGER NOT NULL,
            register_time DATETIME DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (student_id) REFERENCES students (student_id),
            FOREIGN KEY (event_id) REFERENCES events (id)
        )
        ''')
        
        # 比赛成绩表
        self.cursor.execute('''
        CREATE TABLE IF NOT EXISTS results (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            registration_id INTEGER NOT NULL,
            score TEXT,  # 成绩/结果
            ranking INTEGER,
            remarks TEXT,
            FOREIGN KEY (registration_id) REFERENCES registrations (id)
        )
        ''')
        
        self.conn.commit()
    
    def add_student(self):
        """添加学生信息"""
        print("\n添加学生信息")
        student_id = input("学号: ")
        name = input("姓名: ")
        gender = input("性别(男/女): ")
        class_name = input("班级: ")
        contact = input("联系方式(可选): ")
        
        try:
            self.cursor.execute(
                "INSERT INTO students (student_id, name, gender, class, contact) VALUES (?, ?, ?, ?, ?)",
                (student_id, name, gender, class_name, contact)
            )
            self.conn.commit()
            print("学生信息添加成功!")
        except sqlite3.IntegrityError:
            print("错误: 该学号已存在!")
    
    def add_event(self):
        """添加运动项目"""
        print("\n添加运动项目")
        event_name = input("项目名称: ")
        event_type = input("项目类型(田赛/径赛/球类等): ")
        gender_limit = input("性别限制(男子/女子/不限): ")
        max_participants = input("最大参赛人数(可选): ")
        start_time = input("开始时间(YYYY-MM-DD HH:MM,可选): ")
        location = input("比赛地点: ")
        
        try:
            self.cursor.execute(
                "INSERT INTO events (event_name, event_type, gender_limit, max_participants, start_time, location) VALUES (?, ?, ?, ?, ?, ?)",
                (event_name, event_type, gender_limit, max_participants or None, start_time or None, location)
            )
            self.conn.commit()
            print("运动项目添加成功!")
        except Exception as e:
            print(f"添加失败: {e}")
    
    def register_for_event(self):
        """学生报名参赛"""
        print("\n学生报名参赛")
        student_id = input("请输入学号: ")
        event_id = input("请输入项目ID: ")
        
        # 检查学生是否存在
        self.cursor.execute("SELECT id FROM students WHERE student_id=?", (student_id,))
        if not self.cursor.fetchone():
            print("错误: 该学号不存在!")
            return
        
        # 检查项目是否存在
        self.cursor.execute("SELECT id FROM events WHERE id=?", (event_id,))
        if not self.cursor.fetchone():
            print("错误: 该项目不存在!")
            return
        
        # 检查是否已报名
        self.cursor.execute(
            "SELECT id FROM registrations WHERE student_id=? AND event_id=?",
            (student_id, event_id)
        )
        if self.cursor.fetchone():
            print("错误: 该学生已报名此项目!")
            return
        
        try:
            self.cursor.execute(
                "INSERT INTO registrations (student_id, event_id) VALUES (?, ?)",
                (student_id, event_id)
            )
            self.conn.commit()
            print("报名成功!")
        except Exception as e:
            print(f"报名失败: {e}")
    
    def record_result(self):
        """记录比赛成绩"""
        print("\n记录比赛成绩")
        registration_id = input("请输入报名记录ID: ")
        score = input("请输入成绩/结果: ")
        ranking = input("请输入名次(可选): ")
        remarks = input("请输入备注(可选): ")
        
        try:
            self.cursor.execute(
                "INSERT INTO results (registration_id, score, ranking, remarks) VALUES (?, ?, ?, ?)",
                (registration_id, score, ranking or None, remarks or None)
            )
            self.conn.commit()
            print("成绩记录成功!")
        except Exception as e:
            print(f"记录失败: {e}")
    
    def query_students(self):
        """查询学生信息"""
        print("\n学生信息查询")
        keyword = input("请输入学号或姓名(留空查询所有): ")
        
        if keyword:
            self.cursor.execute(
                "SELECT * FROM students WHERE student_id LIKE ? OR name LIKE ?",
                (f"%{keyword}%", f"%{keyword}%")
            )
        else:
            self.cursor.execute("SELECT * FROM students")
        
        students = self.cursor.fetchall()
        
        if not students:
            print("没有找到匹配的学生记录")
            return
        
        print("\n学生列表:")
        print("ID\t学号\t姓名\t性别\t班级\t联系方式")
        for student in students:
            print(f"{student[0]}\t{student[1]}\t{student[2]}\t{student[3]}\t{student[4]}\t{student[5] or '无'}")
    
    def query_events(self):
        """查询运动项目"""
        print("\n运动项目查询")
        keyword = input("请输入项目名称或类型(留空查询所有): ")
        
        if keyword:
            self.cursor.execute(
                "SELECT * FROM events WHERE event_name LIKE ? OR event_type LIKE ?",
                (f"%{keyword}%", f"%{keyword}%")
            )
        else:
            self.cursor.execute("SELECT * FROM events")
        
        events = self.cursor.fetchall()
        
        if not events:
            print("没有找到匹配的运动项目")
            return
        
        print("\n运动项目列表:")
        print("ID\t项目名称\t类型\t性别限制\t最大人数\t开始时间\t地点")
        for event in events:
            print(f"{event[0]}\t{event[1]}\t{event[2]}\t{event[3]}\t{event[4] or '无'}\t{event[5] or '未定'}\t{event[6]}")
    
    def query_registrations(self):
        """查询报名情况"""
        print("\n报名情况查询")
        event_id = input("请输入项目ID(留空查询所有): ")
        
        if event_id:
            self.cursor.execute('''
                SELECT r.id, s.student_id, s.name, s.class, e.event_name 
                FROM registrations r
                JOIN students s ON r.student_id = s.student_id
                JOIN events e ON r.event_id = e.id
                WHERE r.event_id=?
            ''', (event_id,))
        else:
            self.cursor.execute('''
                SELECT r.id, s.student_id, s.name, s.class, e.event_name 
                FROM registrations r
                JOIN students s ON r.student_id = s.student_id
                JOIN events e ON r.event_id = e.id
            ''')
        
        registrations = self.cursor.fetchall()
        
        if not registrations:
            print("没有找到报名记录")
            return
        
        print("\n报名记录:")
        print("报名ID\t学号\t姓名\t班级\t项目名称")
        for reg in registrations:
            print(f"{reg[0]}\t{reg[1]}\t{reg[2]}\t{reg[3]}\t{reg[4]}")
    
    def query_results(self):
        """查询比赛结果"""
        print("\n比赛结果查询")
        event_id = input("请输入项目ID(留空查询所有): ")
        
        if event_id:
            self.cursor.execute('''
                SELECT res.id, s.name, s.class, e.event_name, res.score, res.ranking, res.remarks
                FROM results res
                JOIN registrations reg ON res.registration_id = reg.id
                JOIN students s ON reg.student_id = s.student_id
                JOIN events e ON reg.event_id = e.id
                WHERE reg.event_id=?
            ''', (event_id,))
        else:
            self.cursor.execute('''
                SELECT res.id, s.name, s.class, e.event_name, res.score, res.ranking, res.remarks
                FROM results res
                JOIN registrations reg ON res.registration_id = reg.id
                JOIN students s ON reg.student_id = s.student_id
                JOIN events e ON reg.event_id = e.id
            ''')
        
        results = self.cursor.fetchall()
        
        if not results:
            print("没有找到比赛结果记录")
            return
        
        print("\n比赛结果:")
        print("记录ID\t姓名\t班级\t项目名称\t成绩\t名次\t备注")
        for res in results:
            print(f"{res[0]}\t{res[1]}\t{res[2]}\t{res[3]}\t{res[4]}\t{res[5] or '无'}\t{res[6] or '无'}")
    
    def generate_report(self):
        """生成班级积分报表"""
        print("\n班级积分报表")
        
        # 计算每个班级的总积分(假设前8名有积分: 9,7,6,5,4,3,2,1)
        self.cursor.execute('''
            SELECT s.class, SUM(
                CASE 
                    WHEN r.ranking = 1 THEN 9
                    WHEN r.ranking = 2 THEN 7
                    WHEN r.ranking = 3 THEN 6
                    WHEN r.ranking = 4 THEN 5
                    WHEN r.ranking = 5 THEN 4
                    WHEN r.ranking = 6 THEN 3
                    WHEN r.ranking = 7 THEN 2
                    WHEN r.ranking = 8 THEN 1
                    ELSE 0
                END
            ) as total_score
            FROM results r
            JOIN registrations reg ON r.registration_id = reg.id
            JOIN students s ON reg.student_id = s.student_id
            GROUP BY s.class
            ORDER BY total_score DESC
        ''')
        
        class_scores = self.cursor.fetchall()
        
        if not class_scores:
            print("没有找到积分数据")
            return
        
        print("\n班级积分排名:")
        print("排名\t班级\t总积分")
        for rank, (class_name, score) in enumerate(class_scores, start=1):
            print(f"{rank}\t{class_name}\t{score}")
    
    def menu(self):
        """显示主菜单"""
        while True:
            print("\n学校运动会编排系统")
            print("1. 添加学生信息")
            print("2. 添加运动项目")
            print("3. 学生报名参赛")
            print("4. 记录比赛成绩")
            print("5. 查询学生信息")
            print("6. 查询运动项目")
            print("7. 查询报名情况")
            print("8. 查询比赛结果")
            print("9. 生成班级积分报表")
            print("0. 退出系统")
            
            choice = input("请选择操作: ")
            
            if choice == "1":
                self.add_student()
            elif choice == "2":
                self.add_event()
            elif choice == "3":
                self.register_for_event()
            elif choice == "4":
                self.record_result()
            elif choice == "5":
                self.query_students()
            elif choice == "6":
                self.query_events()
            elif choice == "7":
                self.query_registrations()
            elif choice == "8":
                self.query_results()
            elif choice == "9":
                self.generate_report()
            elif choice == "0":
                print("感谢使用运动会编排系统,再见!")
                self.conn.close()
                sys.exit()
            else:
                print("无效的选择,请重新输入!")

if __name__ == "__main__":
    system = SportsMeetSystem()
    system.menu()