精华内容
下载资源
问答
  • 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学...
    展开全文
  • 学生成绩管理系统欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...


    作者:潇
    版本:1.0
    面向对象,带日志,带异常处理的,带密码加密
    第一次执行会生成数据库和csv文件,以后添加的数据会自动保存到里面
    删除数据库再次执行程序。会初始化数据库

    管理员(超级账号,无法删除)
    账户:admin 密码:’’(空输入的意思)
    (为了调试方便,账号密码已经提前输入,直接点登录即可)

    DataProcess是我自己写的一个数据保存模块,在本博文的第三部分,即完整代码下面,需要单独成一个py文件

    1. 标准模块导入

    from tkinter import *
    from tkinter import messagebox
    from tkinter import ttk
    import time
    

    2.完整代码

    # _*_ coding:utf-8 _*_
    """
    @ 功能 : 本模块用于对窗口界面的定义
    @ author : 王子潇
    @ create : 2020/7
    """
    from tkinter import *
    from tkinter import messagebox
    from tkinter import ttk
    import DataProcess as Dp
    import time
    
    
    class FirstFrame(Frame):
        """程序首界面,用于选择执行的系统"""
        global Student   # 存放学生信息的列表
    
        def __init__(self, master=None):
            super().__init__(master)  # super()代表了父类的定义
            self.master = master
            self.pack(anchor='n')  # 创建frame时将其放置在master父模块上
            '''建造时创建组件'''
            # 初始化组件的属性
            self.label_tit = Label(self, text='学生成绩系统', width=24, height=1, fg='black', font=('黑体', 25))
            self.btn_stu = Button(self, text='学生成绩查询系统', width=18, height=1, bg='gray', font=('黑体', 15))
            self.btn_adm = Button(self, text='学生成绩管理系统', width=18, height=1, bg='gray', font=('黑体', 15))
            self.btnQuit = Button(self, text='退出', width=18, height=1, font=('黑体', 15), command=Exit)
            # 组件的放置位置
            self.label_tit.grid(row=0, column=2, columnspan=3, pady=30)
            self.btn_stu.grid(row=1, column=0, columnspan=3, pady=30, padx=50)
            self.btn_adm.grid(row=1, column=4, columnspan=3, pady=30, padx=50)
            self.btnQuit.grid(row=2, column=2, columnspan=3, pady=30)
            # 组件和事件的绑定
            self.btn_stu.bind('<Button-1>', self.btn_stu_ev)
            self.btn_adm.bind('<Button-1>', self.btn_adm_ev)
    
        def btn_stu_ev(self, event):
            """学生成绩查询系统 的操作"""
            global root
            RegisterFrame(master=root, TypeChoice='Student')
            self.destroy()
    
        def btn_adm_ev(self, event):
            """学生成绩管理系统 的操作"""
            global root
            RegisterFrame(master=root, TypeChoice='Admin')
            self.destroy()
    
    
    class RegisterFrame(Frame):
        """登录界面"""
    
        def __init__(self, master=None, TypeChoice=None):  # TypeChoice 用于判断学生查询界面或管理员登录界面
            super().__init__(master)  # super()代表了父类的定义
            self.master = master
            self.type = TypeChoice
            self.Save = 0
            self.pack(anchor='center')  # 创建时将Frame放置在master中
            if self.type == 'Student':
                self.type = '学生成绩查询系统登录界面'
            elif self.type == 'Admin':
                self.type = '学生成绩管理系统登录界面'
            else:
                self.type = '登陆界面函数参数错误'  # 通过判断 self.type 的值决定界面的标题抬头
            """创建组件"""
            # 初始化组件的属性
            self.label_tit = Label(self, text=self.type, width=24, height=1, fg='black', font=('黑体', 20))
            self.label_adm = Label(self, text='用户名(姓名):', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_pwd = Label(self, text='密  码(学号):', width=12, height=1, fg='black', font=('黑体', 15))
            self.btn_cfm = Button(self, text='确定', width=8, height=1, bg='gray', font=('黑体', 15))
            self.btn_cnc = Button(self, text='清空', width=8, height=1, bg='gray', font=('黑体', 15))
            self.btn_rtn = Button(self, text='返回', width=8, height=1, bg='gray', font=('黑体', 15))
            self.btnQuit = Button(self, text='退出系统', width=8, height=1, font=('黑体', 15), command=Exit)
            self.adm = StringVar()  # 将Entry框的内容与变量进行绑定
            self.pwd = StringVar()
            self.adm.set('admin')  # 设定Entry框显示的内容
            self.pwd.set('')
            self.entry_adm = Entry(self, textvariable=self.adm)
            self.entry_pwd = Entry(self, textvariable=self.pwd, show='*')
            # 设定组件在父Frame 中的位置
            self.label_tit.grid(row=0, column=0, columnspan=48, pady=30)
            self.label_adm.grid(row=1, column=0, pady=20, columnspan=12, sticky=W)
            self.label_pwd.grid(row=2, column=0, pady=20, columnspan=12, sticky=W)
            self.btn_cfm.grid(row=3, column=0, pady=20, padx=20, columnspan=8)
            self.btn_cnc.grid(row=3, column=10, pady=20, padx=20, columnspan=8)
            self.btn_rtn.grid(row=3, column=20, pady=20, padx=20, columnspan=8)
            self.btnQuit.grid(row=4, column=10, pady=20, columnspan=8)
            self.entry_adm.grid(row=1, column=20, columnspan=12, )
            self.entry_pwd.grid(row=2, column=20, columnspan=12, )
            # 设定组件绑定的事件
            self.btn_cfm.bind('<Button-1>', self.btn_cfm_ev)
            self.btn_cnc.bind('<Button-1>', self.btn_cnc_ev)
            self.btn_rtn.bind('<Button-1>', self.btn_rtn_ev)
            self.entry_adm.bind('<KeyPress-Return>', self.btn_cfm_ev)
            self.entry_pwd.bind('<KeyPress-Return>', self.btn_cfm_ev)
    
        def btn_cfm_ev(self, event):
            """确认按钮对应的事件"""
            global Admin, School, root, Empty, Student, adMenuFrame, showFrame, FindResult, findStudent
            if self.type == '学生成绩管理系统登录界面' and [self.adm.get(), self.pwd.get()] in Admin:  # 当在管理员登陆界面并且账号密码在管理员列表中
                if School.get('name') is None:  # 如果学校信息元组为空时,对学校信息进行初始化
                    messagebox.showinfo(title='提示信息', message='请初始化学校信息!')
                    self.destroy()
                    StudentSet(master=root)
                else:  # 转入管理员界面
                    self.destroy()
                    Empty.destroy()
                    adMenuFrame = AdMenuFrame(master=root)
                    showFrame = ShowFrame(master=root)
            elif self.adm.get() == '':  # 账号Entry框为空
                messagebox.showinfo(title='提示信息', message='账号(姓名)不能为空!')
            elif self.type == '学生成绩查询系统登录界面' and self.pwd.get() == '':
                messagebox.showinfo(title='提示信息', message='密码(学号)不能为空!')
            elif self.type == '学生成绩查询系统登录界面' and self.pwd.get() != '':
                for i in range(1, len(Student)):  # 学生成绩查询系统界面 判断学生姓名和学号是否存在并对应同一个人
                    if self.pwd.get() == Student[i][0] and self.adm.get() == Student[i][1]:
                        self.Save = i
                if self.Save != 0:
                    FindResult = Student[self.Save]
                    self.destroy()
                    Empty.destroy()
                    findStudent = FindStudent(master=root)
                else:
                    messagebox.showinfo(title='提示信息', message='姓名或学号输入错误,不存在该学生信息!')
            else:
                messagebox.showinfo(title='提示信息', message='账号或密码输入错误!')
    
        def btn_cnc_ev(self, event):
            """清空按钮对应的事件"""
            self.adm.set('')
            self.pwd.set('')
    
        def btn_rtn_ev(self, event):
            """返回按钮对应的事件"""
            global root
            self.destroy()
            FirstFrame(master=root)
    
    
    class StudentSet(Frame):
        """学校信息初始化界面"""
    
        def __init__(self, master=None):
            super().__init__(master)  # super()代表了父类的定义
            self.master = master
            self.pack(anchor='n')
            """创建组件"""
            # 组件内容的初始化
            self.label_tit = Label(self, text='学校信息初始化', width=24, height=1, fg='black', font=('黑体', 25))
            self.label_scn = Label(self, text='学  校名称:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_C_grade = Label(self, text='C 语言学分:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_M_grade = Label(self, text='数  学学分:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_E_grade = Label(self, text='英  语学分:', width=12, height=1, fg='black', font=('黑体', 15))
    
            self.btn_cfm = Button(self, text='确定', width=8, height=1, bg='gray', font=('黑体', 15))
            self.btn_rtn = Button(self, text='返回上一级', width=10, height=1, bg='gray', font=('黑体', 15))
            self.btn_cnc = Button(self, text='清空', width=8, height=1, bg='gray', font=('黑体', 15))
            self.btnQuit = Button(self, text='退出系统', width=8, height=1, font=('黑体', 15), command=Exit)
    
            self.v_Name = StringVar()
            self.v_C_grade = StringVar()
            self.v_M_grade = StringVar()
            self.v_E_grade = StringVar()
            self.entry_scn = Entry(self, textvariable=self.v_Name, width=24)
            self.entry_C_grade = Entry(self, textvariable=self.v_C_grade, width=24)
            self.entry_M_grade = Entry(self, textvariable=self.v_M_grade, width=24)
            self.entry_E_grade = Entry(self, textvariable=self.v_E_grade, width=24)
            # 组件的放置位置
            self.label_tit.grid(row=0, column=0, columnspan=24, pady=30)
            self.label_scn.grid(row=1, column=0, columnspan=12)
            self.label_C_grade.grid(row=2, column=0, columnspan=12)
            self.label_M_grade.grid(row=3, column=0, columnspan=12)
            self.label_E_grade.grid(row=4, column=0, columnspan=12)
    
            self.btn_cfm.grid(row=5, column=0, pady=20, padx=20, columnspan=8)
            self.btn_cnc.grid(row=5, column=10, pady=20, padx=20, columnspan=8)
            self.btn_rtn.grid(row=5, column=20, pady=20, padx=20, columnspan=8)
            self.btnQuit.grid(row=6, column=10, pady=20, columnspan=8)
    
            self.entry_scn.grid(row=1, column=15, pady=10, columnspan=24)
            self.entry_C_grade.grid(row=2, column=15, pady=10, columnspan=24)
            self.entry_M_grade.grid(row=3, column=15, pady=10, columnspan=24)
            self.entry_E_grade.grid(row=4, column=15, pady=10, columnspan=24)
            # 组件对应的事件
            self.btn_cfm.bind('<Button-1>', self.btn_cfm_ev)
            self.btn_cnc.bind('<Button-1>', self.btn_cnc_ev)
            self.btn_rtn.bind('<Button-1>', self.btn_rtn_ev)
    
        def btn_cfm_ev(self, event):
            """确定按钮"""
            global School, Empty, adMenuFrame, showFrame
            Name = self.v_Name.get()
            E_grade = self.v_E_grade.get()
            C_grade = self.v_C_grade.get()
            M_grade = self.v_M_grade.get()
            List = [Name, E_grade, C_grade, M_grade]
            try:
                if Name == '' or E_grade == '' or C_grade == '' or M_grade == '':
                    messagebox.showinfo(title='提示信息', message='数据不能为空!')
                elif 0 < float(E_grade) < 10 and 0 < float(C_grade) < 10 and 0 < float(M_grade) < 10:
                    School['name'] = Name
                    School['E_grade'] = float(E_grade)
                    School['C_grade'] = float(C_grade)
                    School['M_grade'] = float(M_grade)
                    Dp.Student.setting(School)
                    messagebox.showinfo(title='提示信息', message='初始化学校信息成功!')
                    self.destroy()
                    Empty.destroy()
                    adMenuFrame = AdMenuFrame(master=root)
                    showFrame = ShowFrame(master=root)
                else:
                    messagebox.showinfo(title='提示信息', message='学分必须在 0-10 之间!')
            except ValueError:
                messagebox.showinfo(title='提示信息', message='学分必须为数字!')
    
        def btn_cnc_ev(self, event):
            self.v_Name.set('')
            self.v_E_grade.set('')
            self.v_M_grade.set('')
            self.v_C_grade.set('')
    
        def btn_rtn_ev(self, event):
            global root
            self.destroy()
            FirstFrame(master=root)
    
    
    class AdMenuFrame(Frame):
        """管理员操作界面,用于对学生信息的操作"""
    
        def __init__(self, master=None):
            super().__init__(master)  # super()代表了父类的定义
            self.master = master
            self.pack(anchor='n')
            """创建组件"""
            self.label_tit = Label(self, text='学生成绩管理系统', width=24, height=1,
                                   fg='black', font=('黑体', 25))
            self.btn_add = Button(self, text='新增学生信息', width=12, height=1,
                                  bg='gray', font=('黑体', 15))
            self.btn_del = Button(self, text='删除学生信息', width=12, height=1,
                                  bg='gray', font=('黑体', 15))
            self.btn_adm = Button(self, text='登录账户管理', width=12, height=1,
                                  bg='gray', font=('黑体', 15))
            self.btn_rtn = Button(self, text='返回主界面', width=12, height=1,
                                  bg='gray', font=('黑体', 15))
            self.label_tit.grid(row=0, column=8, columnspan=24)
            self.btn_add.grid(row=1, column=0, pady=10, columnspan=12)
            self.btn_del.grid(row=1, column=12, pady=10, columnspan=12)
            self.btn_adm.grid(row=1, column=24, pady=10, columnspan=12)
            self.btn_rtn.grid(row=2, column=12, pady=10, columnspan=12)
    
            self.btn_add.bind('<Button-1>', self.btn_add_ev)
            self.btn_del.bind('<Button-1>', self.btn_del_ev)
            self.btn_adm.bind('<Button-1>', self.btn_adm_ev)
            self.btn_rtn.bind('<Button-1>', self.btn_rtn_ev)
    
        def btn_add_ev(self, event):
            global root, showFrame, Empty
            self.destroy()
            showFrame.destroy()
            Empty = Frame(root, height=100)
            Empty.pack()
            AddStudent(master=root)
    
        def btn_del_ev(self, event):
            global root, showFrame
            self.destroy()
            showFrame.destroy()
            DelStudent(master=root)
    
        def btn_adm_ev(self, event):
            global root, adminSetFrame, Empty
            self.destroy()
            showFrame.destroy()
            Empty = Frame(root, height=100)
            Empty.pack()
            adminSetFrame = AdminSetFrame(master=root)
    
        def btn_rtn_ev(self, event):
            global showFrame, Empty
            self.destroy()
            showFrame.destroy()
            Empty = Frame(root, height=100)
            Empty.pack()
            FirstFrame(master=root)
    
    
    class ShowFrame(Frame):
        """将学生信息以表格形式显示"""
    
        def __init__(self, master=None):
            super().__init__(master)  # super()代表了父类的定义
            self.master = master
            self.place(relx=0.1, y=150, relwidth=0.8, height=330)
            """创建组件"""
            global Student, count
            count = len(Student)
            columns = Student[0]
            self.widths = [100, 60, 60, 60, 60, 60, 60, 60, 90]
            self.canvas = Canvas(self, bg='blue')  # 创建canvas
            self.canvas.place(relx=0, y=30, relwidth=1, relheight=1)
            self.treeview = ttk.Treeview(self.canvas, show="headings", columns=columns)  # 表格
            self.treeview.place(relx=0, rely=0, relwidth=0.97, relheight=1)
            self.VScroll1 = Scrollbar(self.canvas, orient='vertical', command=self.treeview.yview)
            self.VScroll1.place(relx=0.97, rely=0, relwidth=0.03, height=300)
            self.treeview.configure(yscrollcommand=self.VScroll1.set)  # 给treeview添加配置
            for i in range(len(self.widths)):
                self.treeview.column(columns[i], width=self.widths[i], anchor='center')  # 表示列,不显示
                self.treeview.heading(columns[i], text=columns[i])  # 显示表头
    
            for i in range(len(Student) - 1):  # 写入数据
                self.treeview.insert('', i, values=Student[i + 1])
    
            self.entry = 1
            self.treeview.bind('<Double-1>', self.set_cell_value)  # 双击左键进入编辑
            self.btn_new = ttk.Button(self, text='新建学生信息', width=20, command=self.NewRow)
            self.btn_new.place(x=50, y=0)
    
            for col in columns:  # 绑定函数,使表头可排序
                self.treeview.heading(col, text=col,
                                      command=lambda _col=col: self.treeview_sort_column(self.treeview, _col, False))
    
        def treeview_sort_column(self, treeview, col, reverse):  # 'Treeview' 、列名、排列方式
            sort = [(treeview.set(k, col), k) for k in treeview.get_children('')]
            sort.sort(reverse=reverse)  # 排序方式
            # rearrange items in sorted positions
            for index, (val, k) in enumerate(sort):  # 根据排序后索引移动
                treeview.move(k, '', index)
            treeview.heading(col, command=lambda: self.treeview_sort_column(treeview, col, not reverse))  # 重写标题,使之成为再点倒序的标题
    
        def set_cell_value(self, event):  # 双击进入编辑状态
            if self.entry == 0:
                self.entryedit.destroy()
                self.okb.destroy()
            for self.item in self.treeview.selection():
                # item = I001
                self.item_text = self.treeview.item(self.item, "values")
                self.items = self.item
                # print(self.item_text[0:])  # 输出所选行的值
            self.column = self.treeview.identify_column(event.x)  # 列
            self.row = self.treeview.identify_row(event.y)  # 行
            self.cn = int(str(self.column).replace('#', ''))
            self.rn = int(eval(str(self.row).replace('I', '0X').lower()))
            self.VScroll1Place = [round(list(self.VScroll1.get())[0], 2), round(list(self.VScroll1.get())[1], 2)]
            if self.cn <= 6:
                self.v_entryedit = StringVar()
                self.entryedit = Entry(self.treeview, textvariable=self.v_entryedit, width=12)
                self.okb = ttk.Button(self.treeview, text='OK', width=4)
                if self.rn < len(Student):
                    self.v_entryedit.set(str(Student[self.rn][self.cn - 1]))
                else:
                    self.v_entryedit.set(str(Student[0][self.cn - 1]))
                self.entry = x = 0
                for i in range(self.cn - 1):
                    x += self.widths[i]
                if self.VScroll1Place[0] != 0:
                    self.entryedit.place(x=x, y=self.rn * 20 + 5 - count * 20 * self.VScroll1Place[0])
                    self.okb.place(x=x + 85, y=self.rn * 20 + 5 - count * 20 * self.VScroll1Place[0])
                else:
                    self.entryedit.place(x=x, y=self.rn * 20 + 5)
                    self.okb.place(x=x + 85, y=self.rn * 20 + 5)
                self.entryedit.bind('<KeyPress-Return>', self.save_edit)
                self.okb.bind('<Button-1>', self.save_edit)
            else:
                messagebox.showinfo(title='提示信息', message='该数据不能直接修改!')
    
        def save_edit(self, event):
            global Student, showFrame
            if self.rn < len(Student) and self.judge():
                Student[self.rn][self.cn - 1] = self.entryedit.get()
                if [i for i in range(3, 6) if Student[self.rn][i] != Student[0][i]] == [3, 4, 5]:
                    Student[self.rn] = Dp.Student.append(Student[self.rn][0:6])
            elif self.rn >= len(Student) and self.judge():
                Student.append(list(Student[0]))
                Student[-1][self.cn - 1] = self.entryedit.get()
                if [i for i in range(3, 6) if Student[self.rn][i] != Student[0][i]] == [3, 4, 5]:
                    Student[self.rn] = Dp.Student.append(Student[self.rn][0:6])
            self.destroy()
            showFrame = ShowFrame(master=root)
            self.entryedit.destroy()
            self.okb.destroy()
    
        def judge(self):
            try:
                if self.entryedit.get() == '':
                    messagebox.showinfo(title='提示信息', message='数据不能为空!')
                elif self.cn == 1 and len(self.entryedit.get()) != 10:
                    messagebox.showinfo(title='提示信息', message='学号必须为 10 位!')
                elif self.cn == 1 and self.entryedit.get() in [Student[i][0] for i in range(1, len(Student)) if
                                                               i != self.rn]:
                    messagebox.showinfo(title='提示信息', message='该学号已存在!')
                elif self.cn == 2 and self.entryedit.get() in ['男', '女']:
                    messagebox.showinfo(title='提示信息', message='性别必须为‘男’or‘女’!')
                elif 3 < self.cn < 7 and 0 < float(self.entryedit.get()) < 100:
                    return True
                elif 3 < self.cn < 7:
                    messagebox.showinfo(title='提示信息', message='成绩必须在 0-100 之间!')
                else:
                    return True
            except ValueError:
                messagebox.showinfo(title='提示信息', message='成绩必须为数字!')
    
        def NewRow(self):
            global count, Student
            self.treeview.insert('', count, values=Student[0])
            count += 1
            self.treeview.update()
            self.btn_new.update()
    
    
    class AddStudent(Frame):
        def __init__(self, master=None):
            super().__init__(master)  # super()代表了父类的定义
            self.master = master
            self.pack(anchor='n')
            """创建组件"""
            self.label_tit = Label(self, text='新增学生信息', width=12, height=1, fg='black', font=('黑体', 25))
            self.label_Num = Label(self, text='学      号:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_Name = Label(self, text='姓      名:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_Sex = Label(self, text='性      别:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_Cgrade = Label(self, text='C语言成绩:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_Mgrade = Label(self, text='数  学成绩:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_Egrade = Label(self, text='英  语成绩:', width=12, height=1, fg='black', font=('黑体', 15))
    
            self.btn_cfm = Button(self, text='确定', width=12, height=1, bg='gray', font=('黑体', 15))
            self.btn_del = Button(self, text='清空', width=12, height=1, bg='gray', font=('黑体', 15))
            self.btn_rtn = Button(self, text='返回上一级', width=12, height=1, bg='gray', font=('黑体', 15))
    
            self.v_num = StringVar()
            self.v_name = StringVar()
            self.v_Cgrade = StringVar()
            self.v_Mgrade = StringVar()
            self.v_Egrade = StringVar()
            self.entry_Num = Entry(self, textvariable=self.v_num)
            self.entry_Name = Entry(self, textvariable=self.v_name)
            self.sexvalue = StringVar()
            self.sexvalue.set('男')
            self.sexman = Radiobutton(self, text="男", value="男", variable=self.sexvalue)
            self.sexwoman = Radiobutton(self, text="女", value="女", variable=self.sexvalue)
            self.entry_Cgrade = Entry(self, textvariable=self.v_Cgrade)
            self.entry_Mgrade = Entry(self, textvariable=self.v_Mgrade)
            self.entry_Egrade = Entry(self, textvariable=self.v_Egrade)
    
            self.label_tit.grid(row=0, column=6, columnspan=24, pady=40)
            self.label_Num.grid(row=1, column=0, columnspan=12)
            self.label_Name.grid(row=2, column=0, columnspan=12)
            self.label_Sex.grid(row=3, column=0, columnspan=12)
            self.label_Cgrade.grid(row=4, column=0, columnspan=12)
            self.label_Mgrade.grid(row=5, column=0, columnspan=12)
            self.label_Egrade.grid(row=6, column=0, columnspan=12)
            self.entry_Num.grid(row=1, column=18, columnspan=18)
            self.entry_Name.grid(row=2, column=18, columnspan=18)
            self.sexman.grid(row=3, column=18, columnspan=9)
            self.sexwoman.grid(row=3, column=27, columnspan=9)
            self.entry_Cgrade.grid(row=4, column=18, columnspan=18)
            self.entry_Mgrade.grid(row=5, column=18, columnspan=18)
            self.entry_Egrade.grid(row=6, column=18, columnspan=18)
            self.btn_cfm.grid(row=7, column=0, pady=20, padx=5, columnspan=12)
            self.btn_del.grid(row=7, column=12, pady=20, padx=5, columnspan=12)
            self.btn_rtn.grid(row=7, column=24, pady=20, padx=5, columnspan=12)
    
            self.btn_cfm.bind('<Button-1>', self.btn_cfm_ev)
            self.btn_del.bind('<Button-1>', self.btn_del_ev)
            self.btn_rtn.bind('<Button-1>', self.btn_rtn_ev)
    
        def btn_cfm_ev(self, event):
            global Student
            AppendSet = list(
                [self.v_num.get(), self.v_name.get(), self.sexvalue.get(), self.v_Cgrade.get(), self.v_Mgrade.get(),
                 self.v_Egrade.get()])
            try:
                if [i for i in range(6) if AppendSet[i] != ''] != [0, 1, 2, 3, 4, 5]:
                    messagebox.showinfo(title='提示信息', message='数据不能为空!')
                elif len(AppendSet[0]) != 10:
                    messagebox.showinfo(title='提示信息', message='学号必须为 10 位!')
                elif AppendSet[0] in [Student[i][0] for i in range(1, len(Student))]:
                    messagebox.showinfo(title='提示信息', message='该学号已存在!')
                elif int(AppendSet[0]) > 0 and 0 < float(AppendSet[3]) < 100 and 0 < float(
                        AppendSet[4]) < 100 and 0 < float(AppendSet[5]) < 100:
                    Student.append(Dp.Student.append(AppendSet))
                    self.v_num.set('')
                    self.v_name.set('')
                    self.sexvalue.set('男')
                    self.v_Cgrade.set('')
                    self.v_Mgrade.set('')
                    self.v_Egrade.set('')
                else:
                    messagebox.showinfo(title='提示信息', message='成绩必须在 0-100 之间!')
            except BaseException:
                messagebox.showinfo(title='提示信息', message='学号和成绩必须为数字!')
    
        def btn_del_ev(self, event):
            self.v_num.set('')
            self.v_name.set('')
            self.sexvalue.set('男')
            self.v_Cgrade.set('')
            self.v_Mgrade.set('')
            self.v_Egrade.set('')
    
        def btn_rtn_ev(self, event):
            global Empty, adMenuFrame, showFrame
            self.destroy()
            Empty.destroy()
            adMenuFrame = AdMenuFrame(master=root)
            showFrame = ShowFrame(master=root)
    
    
    class DelStudent(Frame):
        """用于删除学生信息"""
    
        def __init__(self, master=None):
            super().__init__(master)  # super()代表了父类的定义
            self.master = master
            self.place(relx=0.1, relwidth=0.8, relheight=1)
            """创建组件"""
            self.label_tit = Label(self, text='删除学生信息', width=12, height=1, fg='black', font=('黑体', 25))
            self.label_Num = Label(self, text='学      号:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_Name = Label(self, text='姓      名:', width=12, height=1, fg='black', font=('黑体', 15))
            self.label_Rmd = Label(self, text='支持模糊搜索,双击需要删除的行并确定', width=40, height=1, fg='black', font=('黑体', 10))
    
            self.btn_cfm = Button(self, text='确定', width=12, height=1, bg='gray', font=('黑体', 15))
            self.btn_del = Button(self, text='清空', width=12, height=1, bg='gray', font=('黑体', 15))
            self.btn_rtn = Button(self, text='返回上一级', width=12, height=1, bg='gray', font=('黑体', 15))
    
            self.v_num = StringVar()
            self.v_name = StringVar()
            self.entry_Num = Entry(self, textvariable=self.v_num)
            self.entry_Name = Entry(self, textvariable=self.v_name)
    
            self.label_tit.grid(row=0, column=18, columnspan=24, pady=40)
            self.label_Num.grid(row=1, column=12, columnspan=12)
            self.label_Name.grid(row=2, column=12, columnspan=12)
            self.label_Rmd.grid(row=8, column=12, columnspan=40)
    
            self.entry_Num.grid(row=1, column=30, columnspan=18)
            self.entry_Name.grid(row=2, column=30, columnspan=18)
    
            self.btn_cfm.grid(row=7, column=12, pady=20, padx=5, columnspan=12)
            self.btn_del.grid(row=7, column=24, pady=20, padx=5, columnspan=12)
            self.btn_rtn.grid(row=7, column=36, pady=20, padx=5, columnspan=12)
    
            self.btn_cfm.bind('<Button-1>', self.btn_cfm_ev)
            self.btn_del.bind('<Button-1>', self.btn_del_ev)
            self.btn_rtn.bind('<Button-1>', self.btn_rtn_ev)
    
        def FindShowFrame(self):
            """用于显示查找到的学生信息"""
            global Student
            columns = Student[0]
            widths = [100, 60, 60, 60, 60, 60, 60, 60, 90]
            self.canvas = Canvas(self)  # 创建canvas
            self.canvas.place(relx=0, y=280, relwidth=1, height=250)
            self.treeview = ttk.Treeview(self.canvas, show="headings", columns=columns)  # 表格
            self.treeview.place(relx=0, rely=0, relwidth=0.97, relheight=1)
            self.treeview.bind('<Double-1>', self.del_value)  # 双击左键进入删除确定
            self.VScroll1 = Scrollbar(self.canvas, orient='vertical', command=self.treeview.yview)
            self.VScroll1.place(relx=0.97, rely=0, relwidth=0.03, relheight=1)
            for i in range(len(widths)):
                self.treeview.column(columns[i], width=widths[i], anchor='center')  # 表示列,不显示
                self.treeview.heading(columns[i], text=columns[i])  # 显示表头
    
            for i in range(len(self.Find)):  # 写入数据
                self.treeview.insert('', i, values=self.Find[i])
    
        def btn_cfm_ev(self, event):
            global Student
            self.Find = []
            num = name = Save = True
            for i in range(1, len(Student)):
                if self.v_num.get() != '' and self.v_num.get() in Student[i][0]:
                    num = Save = False
                if self.v_name.get() != '' and self.v_name.get() in Student[i][1]:
                    name = Save = False
                if not Save:
                    self.Find.append(Student[i])
                    Save = True
            self.FindShowFrame()
            if len(self.Find) > 1:
                messagebox.showinfo(title='提示信息', message='找到多个学生信息!')
            elif self.v_num.get() == self.v_name.get() == '':
                messagebox.showinfo(title='提示信息', message='请输入学生信息!')
            if self.v_num.get() != '' and num:
                messagebox.showinfo(title='提示信息', message='按“学号”不存在该生信息!')
            elif self.v_name.get() != '' and name:
                messagebox.showinfo(title='提示信息', message='按“姓名”不存在该生信息!')
    
        def btn_del_ev(self, event):
            self.v_num.set('')
            self.v_name.set('')
    
        def btn_rtn_ev(self, event):
            global Empty, adMenuFrame, showFrame
            self.destroy()
            adMenuFrame = AdMenuFrame(master=root)
            showFrame = ShowFrame(master=root)
    
        def del_value(self, event):  # 双击进行删除
            global Student
            for self.item in self.treeview.selection():
                # item = I001
                self.item_text = self.treeview.item(self.item, "values")
                self.items = self.item
            a = '是否删除学号为:{0},姓名为{1}的学生?'.format(self.item_text[0], self.item_text[1])
            res = messagebox.askokcancel(title='提示消息', message=a)
            if res == True:
                for i in range(1, len(Student)):
                    if list(self.item_text[0:]) == Student[i]:
                        del Student[i]
                for i in range(len(self.Find)):
                    if list(self.item_text[0:]) == self.Find[i]:
                        del self.Find[i]
                        self.canvas.destroy()
                        self.FindShowFrame()
    
    
    class FindStudent(Frame):
        """用于显示学生查询系统的查询结果"""
    
        def __init__(self, master=None):
            super().__init__(master)  # super()代表了父类的定义
            self.master = master
            self.place(relx=0.1, relwidth=0.8, relheight=1)
            '''创建组件'''
            global Student, FindResult
            columns = Student[0]
            widths = [100, 60, 60, 60, 60, 60, 60, 60, 90]
            self.label_tit = Label(self, text='查询结果', width=12, height=1, fg='black', font=('黑体', 25))
    
            self.btn_rtn = Button(self, text='返回上一级', width=12, height=1, bg='gray', font=('黑体', 15))
            self.btnQuit = Button(self, text='退出系统', width=12, height=1, font=('黑体', 15), command=Exit)
    
            self.canvas = Canvas(self)  # 创建canvas
            self.treeview = ttk.Treeview(self.canvas, show="headings", columns=columns)  # 表格
            for i in range(len(widths)):
                self.treeview.column(columns[i], width=widths[i], anchor='center')  # 表示列,不显示
                self.treeview.heading(columns[i], text=columns[i])  # 显示表头
            self.treeview.insert('', 1, values=FindResult)
            self.treeview.place(relx=0, rely=0, relwidth=1, relheight=1)
            self.canvas.place(relx=0, rely=0.2, relwidth=1, height=200)
            self.label_tit.place(relx=0.25, rely=0.1, relwidth=0.5, height=40)
            self.btnQuit.place(relx=0.2, rely=0.6, width=150, height=40)
            self.btn_rtn.place(relx=0.55, rely=0.6, width=150, height=40)
    
            self.btn_rtn.bind('<Button-1>', self.btn_rtn_ev)
    
        def btn_rtn_ev(self, event):
            global Empty, registerFrame
            self.destroy()
            Empty = Frame(root, height=100)
            Empty.pack()
            registerFrame = RegisterFrame(master=root, TypeChoice='Student')
    
    
    class AdminSetFrame(Frame):
        """学校信息初始化界面"""
    
        def __init__(self, master=None):
            super().__init__(master)  # super()代表了父类的定义
            self.master = master
            self.pack(anchor='n')
            """创建组件"""
            self.label_tit = Label(self, text='管理员账户设置', width=24, height=1,
                                   fg='black', font=('黑体', 25))
            self.label_adm = Label(self, text='请输入账号:      ', width=18, height=1,
                                   fg='black', font=('黑体', 15))
            self.label_rmd = Label(self, text='(可新增账号或修改已有账号密码)', width=18, height=1,
                                   fg='black', font=('黑体', 8))
            self.label_pwd = Label(self, text='请输入密码:      ', width=18, height=1,
                                   fg='black', font=('黑体', 15))
            self.label_pwdagn = Label(self, text='再次输入密码密码:', width=18, height=1,
                                      fg='black', font=('黑体', 15))
    
            self.btn_cfm = Button(self, text='确定', width=8, height=1, bg='gray', font=('黑体', 15))
            self.btn_rtn = Button(self, text='返回上一级', width=10, height=1, bg='gray', font=('黑体', 15))
            self.btn_cnc = Button(self, text='清空', width=8, height=1, bg='gray', font=('黑体', 15))
            self.btnQuit = Button(self, text='退出系统', width=8, height=1, font=('黑体', 15), command=Exit)
    
            self.v_adm = StringVar()
            self.v_pwd = StringVar()
            self.v_pwdagn = StringVar()
            self.entry_adm = Entry(self, textvariable=self.v_adm, width=24)
            self.entry_pwd = Entry(self, textvariable=self.v_pwd, width=24)
            self.entry_pwdagn = Entry(self, textvariable=self.v_pwdagn, width=24)
    
            self.label_tit.grid(row=0, column=0, columnspan=24, pady=30)
            self.label_adm.grid(row=1, column=0, columnspan=12)
            self.label_rmd.place(x=110, rely=0.2, width=200, height=20)
            self.label_pwd.grid(row=2, column=0, columnspan=12)
            self.label_pwdagn.grid(row=3, column=0, columnspan=12)
    
            self.btn_cfm.grid(row=5, column=0, pady=20, padx=20, columnspan=8)
            self.btn_cnc.grid(row=5, column=10, pady=20, padx=20, columnspan=8)
            self.btn_rtn.grid(row=5, column=20, pady=20, padx=20, columnspan=8)
            self.btnQuit.grid(row=6, column=10, pady=20, columnspan=8)
    
            self.entry_adm.grid(row=1, column=15, pady=10, columnspan=24)
            self.entry_pwd.grid(row=2, column=15, pady=10, columnspan=24)
            self.entry_pwdagn.grid(row=3, column=15, pady=10, columnspan=24)
    
            self.btn_cfm.bind('<Button-1>', self.btn_cfm_ev)
            self.btn_cnc.bind('<Button-1>', self.btn_cnc_ev)
            self.btn_rtn.bind('<Button-1>', self.btn_rtn_ev)
    
        def btn_cfm_ev(self, event):
            global Admin
            adm = pwd = Save = False
            if self.v_adm.get() == '':
                messagebox.showinfo(title='提示信息', message='请输入账号!')
            else:
                adm = True
            if self.v_pwd.get() != self.v_pwdagn.get():
                messagebox.showinfo(title='提示信息', message='两次输入密码不一致!')
            else:
                pwd = True
            if adm and pwd:
                for x in range(len(Admin)):
                    if self.v_adm.get() == Admin[x][0]:
                        Save = x
                if Save == 0 and messagebox.askokcancel(title='提示消息', message='该账号已存在,是否修改密码?'):
                    Admin.append(['admin', self.v_pwd.get()])
                elif not Save and messagebox.askokcancel(title='提示消息', message='是否新建账号?'):
                    Admin.append([self.v_adm.get(), self.v_pwd.get()])
                elif messagebox.askokcancel(title='提示消息', message='该账号已存在,是否修改密码?'):
                    Admin[Save] = [self.v_adm.get(), self.v_pwd.get()]
    
        def btn_cnc_ev(self, event):
            self.v_adm.set('')
            self.v_pwd.set('')
            self.v_pwdagn.set('')
    
        def btn_rtn_ev(self, event):
            global root, Empty, adMenuFrame, showFrame
            self.destroy()
            Empty.destroy()
            adMenuFrame = AdMenuFrame(master=root)
            showFrame = ShowFrame(master=root)
    
    
    def Windows(width, height, app='FirstFrame(master=root)', empty=True):
        global root, Student, Empty, School
        x = root.winfo_screenwidth()
        y = root.winfo_screenheight()
        align_str = '%dx%d+%d+%d' % (width, height, (x - width) / 2, (y - height) / 2)
        root.geometry(align_str)
        if Dp.Student.School is None:
            root.title('学生成绩系统')
        else:
            root.title('学生成绩系统 BY {0}'.format(Dp.Student.School))
        if empty:
            Empty = Frame(root, height=100)
            Empty.pack()
        eval(app)
        get_time()
        root.protocol('WM_DELETE_WINDOW', Exit)
        root.mainloop()
    
    
    def Save():
        if Dp.FileProcess('Save', Students=Student) and Dp.AdScProcess('Save', Admins=Admin, Schools=School):
            messagebox.showinfo(title='提示消息', message='数据保存成功,欢迎下次使用!')
    
    
    def Exit():
        # True or 'False'
        res = messagebox.askokcancel(title='提示消息', message='是否退出系统?')
        if res:
            Save()
            root.destroy()
    
    
    def get_time():  # 屏幕刷新时间
        global root, TimeNow
        time_str = time.strftime("%H:%M:%S", time.localtime())  # 获得系统现在时间
        TimeNow = Label(root, text=time_str, width=12, height=1, fg='black', font=('黑体', 25))
        TimeNow.place(relx=0.7, rely=0.9)
        time_str = time.strftime("%H:%M:%S", time.localtime())  # 获得系统现在时间
        TimeNow.configure(text=time_str)  # 重新设置文本标签
        root.after(1000, get_time)
    
    
    if __name__ == "__main__":
        '''当在该界面运行时的操作'''
        root = Tk()
        Student = Dp.FileProcess('Read')
        Admin, School = Dp.AdScProcess('Read')
        Windows(800, 600)
    
    

    3.文件保存模块

    # _*_ coding:utf-8 _*_
    """
    @ name: DataProcess.py
    @ 功能: 本模块用于储存学生成绩系统有关的函数
    @ author : 王子潇
    @ create : 2020/7
    """
    
    import csv
    import os
    import pickle
    
    
    class Student:
        """定义一个学生信息类,用于存储学生信息"""
        School = GPA_c_grade = GPA_m_grade = GPA_e_grade = None  # 类属性,用于存储学校的姓名及学分设置
    
        def __init__(self, num, name, sex, c_grade, m_grade, e_grade, total, ave, GPA):
            self.num = num  # 学号
            self.name = name  # 姓名
            self.sex = sex  # 性别
            self.c_grade = c_grade  # C语言成绩
            self.m_grade = m_grade  # 数学成绩
            self.e_grade = e_grade  # 英语成绩
            self.total = total  # 总分
            self.ave = ave  # 平均分
            self.GPA = GPA  # 平均绩点
    
        @classmethod  # 修饰器  方法==>属性
        def setting(cls, School):
            """通过元组 ’School‘ 对 ’Student‘ 类的类属性的初始化"""
            cls.School = School.get('name')
            cls.GPA_c_grade = float(School.get('C_grade'))
            cls.GPA_m_grade = float(School.get('M_grade'))
            cls.GPA_e_grade = float(School.get('E_grade'))
    
        @classmethod
        def append(cls, AppendSet):
            """通过一个包含六个数据的列表 ’AppendSet‘ 新增一个Students实例对象的方法,返回值为一个Students实例对象"""
            num = AppendSet[0]
            name = AppendSet[1]
            sex = AppendSet[2]
            c_grade = round(float(AppendSet[3]), 2)  # 使 c_grade 中的值保留两位小数
            m_grade = round(float(AppendSet[4]), 2)
            e_grade = round(float(AppendSet[5]), 2)
            total = c_grade + m_grade + e_grade
            ave = total / 3
            ave = round(ave, 2)
            a = G_grade(c_grade) * Student.GPA_c_grade + G_grade(m_grade) * Student.GPA_m_grade + G_grade(
                e_grade) * Student.GPA_e_grade
            b = Student.GPA_c_grade + Student.GPA_m_grade + Student.GPA_e_grade
            GPA = round(a / b, 2)  # 使GPA中的值保留两位小数
            a = Student(num, name, sex, c_grade, m_grade, e_grade, total, ave, GPA)
            return list([a.num, a.name, a.sex, a.c_grade, a.m_grade, a.e_grade, a.total, a.ave, a.GPA])
    
    
    def G_grade(grade):
        """用于将百分制成绩转换为5分制GPA"""
        if grade >= 90.0:
            return 5
        elif grade >= 85:
            return 4.5
        elif grade >= 80:
            return 4.0
        elif grade >= 75:
            return 3.5
        elif grade >= 70:
            return 3.0
        elif grade >= 65:
            return 2.5
        elif grade >= 60:
            return 2.0
        else:
            return 0
    
    
    def FileProcess(Kind, Students=None):
        """用于读取或保存学生信息的csv文件 kind取值为 Read or Save"""
        address = os.getcwd()  # 获取当前的工作目录
        if not os.path.exists('学生成绩系统数据'):
            os.mkdir('学生成绩系统数据')  # 如果工作目录不存在’学生成绩系统数据‘子目录,则创建目录
        address = os.path.join(address, '学生成绩系统数据')
        if Kind == 'Read':
            try:
                with open('{0}/Student.csv'.format(address), 'r'):
                    pass  # 尝试以’r‘类型打开文件,报错则说明文件不存在,则创建文件并进行初始化
            except FileNotFoundError:
                with open('{0}/Student.csv'.format(address), 'w+') as f:
                    Stu_csv = csv.writer(f)  # 将文件的标题写入文件中
                    Stu_csv.writerow(["学号", "姓名", "性别", "C语言", "数学", "英语", "总分", "平均分", "加权平均绩点"])
            finally:
                with open('{0}/Student.csv'.format(address), 'r') as f:
                    Students = list(csv.reader(f))  # 将文件中的信息读取到一个二维列表中,一个元素为一个学生的信息
                    StudentNew = []
                    for i in range(len(Students)):
                        if Students[i]:
                            StudentNew.append(Students[i])  # 删除所读取文件元素中的空元素,并返回一个新列表
                    return StudentNew
        elif Kind == 'Save':
            with open('{0}/Student.csv'.format(address), 'w+') as f:
                Stu_csv = csv.writer(f)  # 在进行保存时,已进行过’Read‘操作,无需判断文件是否存在
                Stu_csv.writerows(Students)
                return True
        else:
            print('函数调用传参错误!')  # 当调用函数时未进行’kind‘的赋值或赋值错误则在控制台打印
    
    
    def AdScProcess(Kind, Admins=None, Schools=None):
        """用于读取或保存系统账号以及学校信息"""
        address = os.getcwd()  # 获取当前工作目录
        if not os.path.exists('学生成绩系统数据'):  # 判断工作目录下是否存在子目录,无则创建
            os.mkdir('学生成绩系统数据')
        address = os.path.join(address, '学生成绩系统数据')
        if Kind == 'Read':
            try:
                with open('{0}/Admin.bat'.format(address), 'rb+'):  # 若文件不存在则创建新文件并存入基本信息
                    pass
            except FileNotFoundError:
                with open('{0}/Admin.bat'.format(address), 'wb+') as f:
                    Admins = [['admin', '']]
                    Schools = {'name': None, 'C_grade': None, 'M_grade': None, 'E_grade': None}
                    pickle.dump(Admins, f)
                    pickle.dump(Schools, f)  # 将数据依次存入新文件
            finally:
                with open('{0}/Admin.bat'.format(address), 'rb+') as f:
                    Admins = pickle.load(f)  # 从文件中以此取出数据并存入内存(取出顺序必须与存入顺序相同)
                    Schools = pickle.load(f)
                    if Schools.get('name') is not None:
                        Student.setting(Schools)  # 当元组’Schools‘的值不为空时,对’Student‘类进行类属性的初始化
                    return Admins, Schools
        elif Kind == 'Save':
            with open('{0}/Admin.bat'.format(address), 'wb+') as f:
                pickle.dump(Admins, f)
                pickle.dump(Schools, f)  # 将数据依次存入文件
                return True
        else:
            print('函数调用传参错误!')  # 当kind的值不为Read or Save 时,在控制台报错
    
    
    展开全文
  •  本系统参考了各类学生信息管理软件的精华,溶入了各自的优点并采纳了众多在学校工作的朋友的宝贵意见,真正地从用户的需要出发,极人性化的设计理念为客户需要而设计。现已广泛应用于各级各类学校,特别是中小学。...
  • 设计学生学籍管理系统

    热门讨论 2009-07-05 18:28:22
    如何运用Pb9.0设计学生学籍管理系统 海盐县澉浦中学 贺剑夫 内容提要 学生学籍管理工作是学校管理工作的重要组成部分,现在相当一部分学校的学生学籍管理工作仍沿用手工方式。随着学校规模的扩大、学生人数的增加...
  • 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学...

    写在前面,这是我学校编程练习题,我写的程序虽然能运行,但不完全正确,有些地方做了修改,
    给需要的同学应急。
    错误和修改我会在下文逐一指出,等大佬指正。
    笔者不怕丢人现眼,也请读者们不吝点赞,多多支持!!!
    5. 综合编程
    新建项目student, 使用数组编写一个程序完成班级学生成绩统计的工作。 程序功能情况如下:
    (1) 学生人数为30人, 成绩包括计算机、 数学、 英语、 语文、 体育五门课程的成绩(用int类 型表示) ;
    (2) 录入学生学号及各门课程的成绩;
    (3) 统计各门课程的最高分、 最低分和平均成绩;
    (4) 统计各门课程达到优秀(>=90) 和不及格的人数;
    (5) 对五门课程以平均成绩从高到低的顺序排序;
    (6) 按平均成绩从高到低的顺序, 以表格7-4的形式
    程序编写要求如下;
    (1) 分析程序功能设计要求, 按照模块化程序设计的方法, 划分各功能模块;
    (2) 分析程序中所涉及的各种数据, 并选择适当的数据类型来表示;
    (3) 分析各个模块之间的接口 , 完成函数原型的设计
    //函数功能: 显示菜单并返回选择的菜单编号
    //函数原型: int Menu(void);
    //函数参数: 无
    //返回值: 用户选择的菜单编号
    *********************************************
    (4)每个模块用一 个单独的c文件实现, 以多文件方式实现整个设计, 每个文件及函数的参考设 计如下表7-5所示;
    (4)每个模块用一 个单独的c文件实现, 以多文件方式实现整个设计, 每个文件及函数的参考设 计如下表7-5所示;
    @编程提示:
    (1)程序可划分为录入数据、 统计处理、 排序处理、 显示结果、 菜单处理等模块,其中统计处理还可以细化为统计分数(统计最高分、 统计最低分、 统计平均分)和统计人数(统计优秀人数、 统计不及格人数)。
    (2) 因最后程序结果以表格形式, 为方便统计结果的排序操作, 可将各科最高分、
    最低分、 平均成绩、 最高分学生学号、 优秀人数、 不及格人数的统计结果分别保存在大小为 5 (5 门课程) 的数组中。 在按平均分排序处理时,应同时对其它统计结果作相应处理;
    (3) 科目名称为宇符串常量, 可用宇符指针指示。 因题中涉及 5 门课程, 应有 5 个
    字符指针指示, 所以可用宇符指针数组表示。**
    在这里插入图片描述

    源代码:
    student.h

    #ifndef STUDENT_H
    #define STUDENT_H
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    
    #define StuCount 5
    #define SubCount 5
    
    
    extern char*cSubject[];//指示课程名称
    extern int iStuNo[];//全班学号
    extern int Computer[];//全班计算机课程成绩
    extern int Math[];//全班数学课程成绩
    extern int English[];//全班英语课程成绩
    extern int Chinese[];//全班语文课程成绩
    extern int Physics[];//全班体育课程成绩
    extern int iScoreHigh[];//以计算机,数学,英语,语文,体育的顺序存放最高分
    extern int iScoreLow[];//以计算机,数学,英语,语文,体育的顺序存放最低分
    extern int iScoreAve[];//以计算机,数学,英语,语文,体育的顺序存放各科平均分
    extern int iHighNo[];//以计算机,数学,英语,语文,体育的顺序存放各科最高分学生学号
    extern int iFineCount[];//以计算机,数学,英语,语文,体育的顺序存放各科优秀人数
    extern int iFailCount[];//以计算机,数学,英语,语文,体育的顺序存放各科不及格人数
    
    
    
    int Menu();//菜单处理
    int InputData();//输入原始数据,成功则返回1,反之则返回2;
    void StaticScore();//统计最高分,最低分,平均分,最高分学生学号
    int GetHigh(int *Score,int *Highest);//统计最高分及最高分学号
    int GetLow(int *Score);//统计最低分
    int GetAve(int *Score);//统计平均分
    void StaticPerson();//统计优秀和不及格人数
    void SortByAve();//以平均分为关键字对统计结果进行统计
    void DisplayStat();//显示学生成绩统计表
    void DisplaySort();//显示学生成绩排序结果
    #endif
    

    菜单处理的Menu函数本来有两个MenuHandel()和MenuSelect(),因为option的值传递有些问题,我就合为一处,对照原文的同学请注意.
    student.c

    #include "student.h"
    
    int iStuNo[SubCount];//全班学号
    int Computer[SubCount];//全班计算机课程成绩
    int Math[SubCount];//全班数学课程成绩
    int English[SubCount];//全班英语课程成绩
    int Chinese[SubCount];//全班语文课程成绩
    int Physics[SubCount];//全班体育课程成绩
    int iScoreHigh[SubCount];//以计算机,数学,英语,语文,体育的顺序存放最高分
    int iScoreLow[SubCount];//以计算机,数学,英语,语文,体育的顺序存放最低分
    int iScoreAve[SubCount];//以计算机,数学,英语,语文,体育的顺序存放各科平均分
    int iHighNo[SubCount];//以计算机,数学,英语,语文,体育的顺序存放各科最高分学生学号
    int iFineCount[SubCount];//以计算机,数学,英语,语文,体育的顺序存放各科优秀人数
    int iFailCount[SubCount];//以计算机,数学,英语,语文,体育的顺序存放各科不及格人数
    
    
    /*************************************
    函数功能:菜单处理
    参数返回:菜单项编号
    返回值:	返回0,选择其他菜单选项,程序继续运行;返回1,程序结束;
    /**************************************/
    int Menu()
    {
    	int option;
    	int input;
    	int quit=0;
    
    	system("cls");
    	printf("\n\n\n***********************************\n");
    	printf("\t1.	输入原始数据\n");
    	printf("\t2.	统计最高分,最低分,平均分,最高分学生学号\n");
    	printf("\t3.	统计优秀和不及格人数\n");
    	printf("\t4.	按平均分排序,并显示排序结果\n");
    	printf("\t5.	显示学生成绩统计表\n");
    	printf("\t6.	退出程序\n");
    	printf("\n\t数字对应功能, 请选择1-6:");
    
    
    	while(1)
    	{
    		input = scanf("%d",&option);
    		if(input!=1)
    		{
    			printf("\n\t输入错误,请重选1-6:");
    			fflush(stdin);
    		}
    		else if((option<1)||(option>6))
    		{
    			printf("\n\t选择错误,重选1-6:");
    		}
    		else break;
    	}
    
    	
    	switch(option)
    	{
    	case 1:if(InputData()==0)
    		   {
    			   printf("\n\n输入数据错误,程序退出");
    			   fflush(stdin);
    			   quit=1;
    		   }
    		else printf("\n完成数据输入,按任意键继续......");
    		getche();
    		break;
    	case 2:StaticScore();
    		printf("\n完成分数统计,按任意键继续......");
    		getche();
    		break;
    	case 3:StaticPerson();
    		printf("\n完成人数统计,按任意键继续......");
    		getche();
    		break;
    	case 4:SortByAve();
    		DisplaySort();
    		printf("\n完成排序,按任意键继续......");
    		getche();
    		break;
    	case 5:DisplayStat();
    		printf("\n按任意键继续......");
    		getche();
    		break;
    	case 6:quit=1;
    		break;
    	}
    	return quit;
    }
    /*****************************************************************
    主函数
    
    /****************************************************************/
    void main()
    {
    	
    	int quit;
    	
    	printf("\n\n\n\n\n");
    	printf("\t\t*********************************************\n");
    	printf("\t\t*                                           *\n");
    	printf("\t\t*                                           *\n");
    	printf("\t\t*                                           *\n");
    	printf("\t\t*                                           *\n");
    	printf("\t\t*                                           *\n");
        printf("\t\t*    学生成绩管理程序                       *\n");
    	printf("\t\t*                                           *\n");
    	printf("\t\t*                                           *\n");
    	printf("\t\t*                                           *\n");
    	printf("\t\t*                      按任意键继续......   *\n");
    	printf("\t\t*                                           *\n");
    	printf("\t\t*********************************************\n");
    	getche();
    	while(1)
    	{
    		
    		quit=Menu();
    		if(quit==1)break;
    	}
    }
    
    

    运行程序时,我发现将每门科目的平均成绩交换后,再按照 i=0; i< SubCount;输出不能实现4的功能,
    以平均分为关键字对各科目成绩进行输出。
    static.c

    #include "student.h"
    
    int iScoreHigh[SubCount];//以计算机,数学,英语,语文,体育的顺序存放最高分
    int iScoreLow[SubCount];//以计算机,数学,英语,语文,体育的顺序存放最低分
    int iScoreAve[SubCount];//以计算机,数学,英语,语文,体育的顺序存放各科平均分
    int iHighNo[SubCount];//以计算机,数学,英语,语文,体育的顺序存放各科最高分学生学号
    int iFineCount[SubCount];//以计算机,数学,英语,语文,体育的顺序存放各科优秀人数
    int iFailCount[SubCount];//以计算机,数学,英语,语文,体育的顺序存放各科不及格人数
    
    /************************************************
    函数功能:统计某课程最高分及最高分学号
    参数说明:Score指示某课程成绩,Highest指示最高分
    返回值:最高分学号
    *************************************************/
    
    int GetHighest(int Score[],int Highest[])
    {
    	int max=0;//课程最高分在数组中的序号,从0开始
    	int i;
    	static int j=0;
    
    	for(i=1; i<StuCount; i++)
    	{
    		if(Score[i] > Score[max])
    		{
    			max = i;
    		}
    	}
    
    	Highest[j] = Score[max];
    	j++;
    	return iStuNo[max];
    }
    
    /***********************************************
    函数功能:统计某课程最低分
    参数说明:Score指示某课程成绩
    返回值:该课程最低分
    ************************************************/
    
    int GetLow(int Score[])
    {
    	int low;
    	int i;
    
    	low = Score[0];
    	for(i=1; i < StuCount; i++)
    	{
    		if(low > Score[i])
    		{
    			low = Score[i];
    		}
    	}
    
    	return low;
    }
    /***********************************************
    函数功能:统计某课程平均分
    参数说明:Score指示某课程成绩
    返回值:该课程平均分
    ************************************************/
    
    int GetAve(int Score[])
    {
    	int sum=0, aver, i;
    
    	for(i=0; i < StuCount; i++)
    	{
    		sum += Score[i];
    	}
    
    	aver = (int)sum/StuCount;
    
    	return aver;
    }
    
    /************************************************
    函数功能:统计最高分,最低分,平均分,最高分学号
    参数说明:无
    返回值:无
    ************************************************/
    
    void StaticScore()
    {
    	int SubjectNo=0;
    	//SubjectNo=0,1,2,3,4分别对应计算机,数学,英语,语文,体育五个科目
    
    	//统计计算机课程相关信息
    	iHighNo[SubjectNo] = GetHighest(Computer,iScoreHigh);
    	iScoreLow[SubjectNo] = GetLow(Computer);
    	iScoreAve[SubjectNo] = GetAve(Computer);
    	
    	 SubjectNo++;
    
    	 //统计数学课程相关信息
    
    	 iHighNo[SubjectNo] = GetHighest(Math,iScoreHigh);
    	iScoreLow[SubjectNo] = GetLow(Math);
    	iScoreAve[SubjectNo] = GetAve(Math);
    	
    	 SubjectNo++;
    
    	 //统计英语课程相关信息
    	
    	 iHighNo[SubjectNo] = GetHighest(English,iScoreHigh);
    	iScoreLow[SubjectNo] = GetLow(English);
    	iScoreAve[SubjectNo] = GetAve(English);
    	
    	 SubjectNo++;
    
    	 //统计课语文程相关信息
    
    	 iHighNo[SubjectNo] = GetHighest(Chinese,iScoreHigh);
    	iScoreLow[SubjectNo] = GetLow(Chinese);
    	iScoreAve[SubjectNo] = GetAve(Chinese);
    	
    	 SubjectNo++;
    
    	 //统计课程体育相关信息
    
    	 iHighNo[SubjectNo] = GetHighest(Physics,iScoreHigh);
    	iScoreLow[SubjectNo] = GetLow(Physics);
    	iScoreAve[SubjectNo] = GetAve(Physics);
    
    }
    
    /************************************************
    函数功能:统计优秀人数和不及格人数
    参数说明:无
    返回值:无
    ************************************************/
    void StaticPerson()
    {
    	int i;
    	int SubjectNo = 0;
    	//SubjectNo=0,1,2,3,4分别对应计算机,数学,英语,语文,体育五个科目
    	
    	//初始化计数器
    	for(i=0; i< StuCount; i++)
    	{
    		iFineCount[i] = 0;
    		iFailCount[i] = 0;
    	}
    
    	//统计计算机课程优秀人数和不及格人数
    	for(i=0; i < StuCount; i++)
    	{
    		if(Computer[i] > 90)
    		{
    			iFineCount[SubjectNo]++;
    		}
    		if(Computer[i] < 60)
    		{
    			iFailCount[SubjectNo]++;
    		}
    	}
    	SubjectNo++;
    
    	//统计数学课程优秀人数和不及格人数
    	for(i=0; i < StuCount; i++)
    	{
    		if(Math[i] > 90)
    		{
    			iFineCount[SubjectNo]++;
    		}
    		if(Math[i] < 60)
    		{
    			iFailCount[SubjectNo]++;
    		}
    	}
    	SubjectNo++;
    
    	//统计英语课程优秀人数和不及格人数
    	for(i=0; i < StuCount; i++)
    	{
    		if(English[i] > 90)
    		{
    			iFineCount[SubjectNo]++;
    		}
    		if(English[i] < 60)
    		{
    			iFailCount[SubjectNo]++;
    		}
    	}
    	SubjectNo++;
    
    	//统计语文课程优秀人数和不及格人数
    	for(i=0; i < StuCount; i++)
    	{
    		if(Chinese[i] > 90)
    		{
    			iFineCount[SubjectNo]++;
    		}
    		if(Chinese[i] < 60)
    		{
    			iFailCount[SubjectNo]++;
    		}
    	}
    	SubjectNo++;
    
    	//统计体育课程优秀人数和不及格人数
    	for(i=0; i < StuCount; i++)
    	{
    		if(Physics[i] > 90)
    		{
    			iFineCount[SubjectNo]++;
    		}
    		if(Physics[i] < 60)
    		{
    			iFailCount[SubjectNo]++;
    		}
    	}
    	
    }
    

    运行程序时发现无法输出最高分学号。
    input.c

    #include "student.h"
    //定义全局变量
    int iStuNo[SubCount];//全班学号
    int Computer[SubCount];//全班计算机课程成绩
    int Math[SubCount];//全班数学课程成绩
    int English[SubCount];//全班英语课程成绩
    int Chinese[SubCount];//全班语文课程成绩
    int Physics[SubCount];//全班体育课程成绩
    //存放全班学生学号,计算机成绩,数学成绩,英语成绩,语文成绩,体育成绩
    /**********************************************************************
    函数功能:输入全班学生学号,计算机成绩,数学成绩,英语成绩,语文成绩,体育成绩
    参数说明:无
    返回值:输入操作正确放返回1,否则返回0
    /**********************************************************************/
    int InputData()
    {
    	int i;
    	int flag=0;
    
    	system("cls");
    	printf("\n\n请下面的顺序和格式输入原始数据:\n");
    	printf("学生学号,计算机成绩,数学成绩,英语成绩,语文成绩,体育成绩\n");
    	for(i=0;i<StuCount;i++)
    	{
    		//printf("%2d:",i);-------------------------------------
    		flag = scanf("%d%d%d%d%d%d",&iStuNo[i],&Computer[i], &Math[i], &English[i], &Chinese[i], &Physics[i]);//输入学生学号,计算机成绩,数学成绩,英语成绩,语文成绩,体育成绩
    		//若输入错误,则终止
    	}
    	if(flag==6)return 1;
    	else{
    			fflush(stdin);
    			return 0;
    	}
    }
    

    sort.c

    #include "student.h"
    
    char *cSubject[SubCount]={"计算机","数 学","英 语","语 文","体 育"};
    //指示课程名称
    /*********************************************************
    函数功能:以平均分为关键字对统计结果进行排序
    参数说明:无
    返回值:无
    **********************************************************/
    //采用冒泡算法
    void SortByAve()
    {
    	int i,j,temp;
    	char *strTemp;
    
    	for(i=1;i<SubCount;i++)
    	{
    		for(j=0;j<SubCount-i;j++)
    		{
    			if(iScoreAve[j]<iScoreAve[j+1])
    			{//将较小的平均分交换到后面
    				temp=iScoreAve[j];
    				iScoreAve[j]=iScoreAve[j+1];
    				iScoreAve[j+1]=temp;
    
    				//将对应的最高分信息交换
    				temp=iScoreHigh[j];
    				iScoreHigh[j]=iScoreHigh[j+1];
    				iScoreHigh[j+1]=temp;
    				//将对应的最低分信息交换
    				temp = iScoreLow[j];
    				iScoreLow[j] = iScoreLow[j+1];
    				iScoreLow[j+1] = temp;
    
    				//将对应的最高分学号信息交换
    				temp = iHighNo[j];
    				iHighNo[j] = iHighNo[j+1];
    				iHighNo[j+1] = temp;
    
    				//将对应的优秀人数信息交换
    				temp = iFineCount[j];
    				iFineCount[j] = iFineCount[j+1];
    				iFineCount[j+1] = temp;
    
    				//将对应的不及格人数信息交换
    				temp = iFailCount[j];
    				iFailCount[j] = iFailCount[j+1];
    				iFailCount[j+1] = temp;
    
    				//将对应的课程名称信息交换
    				strTemp = cSubject[j];
    				cSubject[j] = cSubject[j+1];
    				cSubject[j+1] = strTemp;
    					}
    				}
    			}
    		}
    	}
    }
    
    

    display.c

    #include "student.h"
    
    /************************************************
    	函数功能:显示学生成绩统计表
    	参数说明:无
    	返回值:无
    *************************************************/
    
    void DisplayStat()
    {
    	int i;
    
    	system("cls");//清屏
    	printf("\n\n\n");
    	printf("科 目  最高分  最低分  平均分 优秀人数 不及格人数 最高分学生学号\n");
    
    
    	for(i=0;i<SubCount;i++)
    	{
    		printf("%s %6d %6d %6d %7d %9d\n",
    		cSubject[i],iScoreHigh[i],iScoreLow[i],
    			iScoreAve[i],iFineCount[i],iFailCount[i],iHighNo[i]);
    	}
    }
    	/*************************************************
    
    		函数功能:显示学生的成绩排序表
    		参数说明:无 
    		返回值:无
    	******************************************************/
    void DisplaySort()
    {
    	int i ;
    
    
    	system("cls");
    	printf("\n\n\n");
    	printf("学生学号 计算机成绩 数学成绩 英语成绩 语文成绩 体育成绩 平均成绩\n");
    	for(i=0;i<StuCount;i++)
    	{
    		printf("%8d%10d%8d%8d%8d%8d%8d\n",iStuNo[i],Computer[i],Math[i], English[i],Chinese[i],Physics[i],iScoreAve[i]);
    	}
    	
    	
    }
    
    
    展开全文
  • 健康档案管理系统.RAR

    热门讨论 2010-03-16 21:40:14
    (1) 建立一个“健康档案管理系统”,使用计算机实现对学校学生健康信息的管理。要求不仅可用于一般的健康情况查询,而且可以对这些健康信息进行各种必要的数学统计和分析。系统主要的健康信息来自病历和体检,系统...
  • 适用于Windows的课堂管理系统 NetSupport School 是一流的培训软件解决方案,让教师能够以个别方式、按预定小组或者对整个班级进行辅导、监视,并与学生们互动交流。 监听 最新版本的 NetSupport School v11.41....
  • jsp33126学生管理系统sshMySQL.mp4 题目名称列,可以按CTRL+F搜索需要的题目 jsp33131家电购物商城MySQLssh.mp4 jsp33132-1鞋店购物商城SQLSERVERssh.mp4 jsp33135机房管理MySQLssh.mp4 jsp33136客户管理系统...
  • 适用于Windows的课堂管理系统 NetSupport School 是一流的培训软件解决方案,让教师能够以个别方式、按预定小组或者对整个班级进行辅导、监视,并与学生们互动交流。 监听 最新版本的 NetSupport School v11.41....
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    Excel文件的导入和导出操作 主要的实现在CMyExcel类中。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    Excel文件的导入和导出操作 主要的实现在CMyExcel类中。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    Excel文件的导入和导出操作 主要的实现在CMyExcel类中。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    Excel文件的导入和导出操作 主要的实现在CMyExcel类中。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    Excel文件的导入和导出操作 主要的实现在CMyExcel类中。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    Excel文件的导入和导出操作 主要的实现在CMyExcel类中。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,...
  • Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥 Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的...保存、如何文件中得到公钥编码的字节数组、如何从字节数组解码公钥...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节...保存、如何文件中得到公钥编码的字节数组、如何从字节数组解码公钥...
  • 本书主要介绍系统软件的运行机制和原理,涉及在Windows和Linux两个系统平台上,一个应用程序在编译、链接和运行时刻所发生的各种事项,包括:代码指令是如何保存的,库文件如何 与应用程序代码静态链接,应用程序...
  • C#开发典型模块大全

    2014-03-12 18:11:22
    11.2.3 获取系统文件及文件夹图标 262 11.2.4 获取指定目录下的所有文件及文件夹 265 11.2.5 Word操作技术 266 11.2.6 进度条的显示 266 11.2.7 对ListView控件中的项进行排序 267 11.3 设计过程 267 ...
  • 请假管理系统 http://leave.rain1024.com,测试账号:admin,admin 新版系统说明(2020-10-25) 为了更好的支持部分同学使用,修复了其中的一些bug,完善整体系统功能 下载代码后将Public,ThinkPHP文件夹名称...
  • 1. 在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段和数据库系统阶段。在这几个阶段中,数据独立性最高的是 数据库系统 阶段。 2. 对数据库物理存储方式的描述称为( 内模式 ) 3. 在数据库三级模式...
  • Python+Vue+Django前后端分离项目实战

    千人学习 2020-02-12 09:38:05
    学生管理系统v4.0的开发,项目包含了如下几个内容:项目的总体介绍、基本功能的演示、Vuejs的初始化、Element UI的使用、在Django中实现针对数据的增删改查的接口、在Vuejs中实现前端增删改查的调用、实现文件的上传...
  • 本书是第I卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java Web进行程序开发的各个方面的知识和技巧,主要包括Java Web编程基础、文件操作管理、图形图像与多媒体技术、窗体应用...
  • 介绍了应用Visual Basic进行程序开发的多方面的知识和技巧,主要包括Visual Basic的多媒体开发、数据库应用、网络技术与Web开发、安全防护与入侵破解、打印技术与报表图表、程序控制与磁盘管理系统与硬件设备等...
  • 介绍了应用Visual Basic进行程序开发的多方面的知识和技巧,主要包括Visual Basic的多媒体开发、数据库应用、网络技术与Web开发、安全防护与入侵破解、打印技术与报表图表、程序控制与磁盘管理系统与硬件设备等...
  • 三、气体安全管理系统 (一)、功能特点 采集数据端口,支持串口端口+网络端口,串口支持自由设置串口号+波特率,网络支持自由设置IP地址+通讯端口,每个端口支持采集周期,默认1秒钟一个地址,支持设置通讯超时...
  • 实例049 客户管理系统中动态组成用户新密码 82 实例050 用户密码设置简单化 83 实例051 动态替换用户密码信息 84 2.6 常用日期操作 85 实例052 获得服务器当前日期和时间 85 实例053 获取当前日期是星期几 86 实例...

空空如也

空空如也

1 2 3 4
收藏数 75
精华内容 30
关键字:

学生管理系统如何导出文件