精华内容
下载资源
问答
  • 学生成绩分析系统

    2018-04-18 16:26:07
    学生成绩分析系统 学生成绩分析系统 学生成绩分析系统 学生成绩分析系统
  • 中学生成绩分析系统

    2011-11-19 15:48:15
    简易成绩分析系统使用说明四川省泸州市纳溪区大渡中学教务室制作使用 ※※※※一、特色 1、 EXCEL平台本作品采用EXCEL 公式+VBA制作,既可根据你平时使用EXCEL的习惯和方式操作充分发挥EXCEL的功能,又能利用本作品...
  • 学生成绩分析系统.zip

    2021-04-27 08:04:23
    学生成绩分析系统,采用excel直接处理学生成绩(不需要懂excel,只要会打字就会用)。不需要导入数据、导出数据等复杂操作。处理速度快,生成分析表丰富。功能强大。是处理成绩的理想软件。
  • excel学生成绩处理系统,操作简单,功能齐全。一键生成各种分析表,包括学生总分及各学科班级排名、全校排名。全校前N名学生各班分布,各班前N名学生各学科平均分。优秀率、合格率、关爱率、A等率、D等率、平均分。...
  • 本科毕业设计论文 题目 : 基于数据挖掘技术的学生成绩分析系统的设计与实现 姓 名 张宇恒 学 院 软件学院 专 业 软件工程 班 级 2010211503 学 号 10212099 班内序号 01 指导教师 牛琨 2014年 5月 基于数据挖掘技术...
  • 目前, 许多高校使用着国家教委推广使用的“ 高校学生管理信息系统” 或自己开发的“ 学生 成绩管理分析系统” 进行学生成绩管理和分析 ...为满足高校进行学生成绩分析的实际需要, 笔者开发了“ 学生成绩分析系统” 。
  • 可视化 学生成绩分析系统 MFC 难找
  • SV学生成绩分析系统

    2006-02-23 09:05:59
    学生成绩分析系统 需要TDBGrid7支持!
  • 学生成绩分析系统的设计与实现,杨阳,,数据挖掘技术就是通过对现实问题进行有效的模式提取,从大量的数据中发现隐藏于其后的规律或数据间的关系,从而分析、提取出有用
  • 基于php的大学生成绩分析系统以用户的身份在登录页面输入账号和密码,经过数据库身份验证,验证成功后登录系统主页,可以使用个人资料管理、成绩查询、管理等功能操作,以管理员的身份在登录页面输入账号和密码,...

    基于php的大学生成绩分析系统以用户的身份在登录页面输入账号和密码,经过数据库身份验证,验证成功后登录系统主页,可以使用个人资料管理、成绩查询、管理等功能操作,以管理员的身份在登录页面输入账号和密码,经过数据库身份验证,验证成功后登录系统主页,可以使用系统用户管理、学生信息管理、教师信息管理、课程信息管理、成绩信息管理等功能操作

    该系统包括三大模块:学生模块、管理员模块、教师模块。
    1.学生、教师权限
    用户登录授权:用户打开登录页面,可以选择教师或学生登录,验证表单正确后允许浏览页面。
    修改用户个人信息:学生和老师可以根据个人需要修改自己的信息,包括用户名和上传头像,为了方便管理,学生与老师的用户名与密码采用统一发放式,若需要修改必须进行登录,防止信息泄漏。
    查看成绩:学生可以在班级学生管理系统中查看自己的成绩,系统通过匹配学生信息中的学号和学生选择的学期将学生的成绩打印出来。
    2.学生基本信息录入
    在此输入学生的基本信息包含班级学号、姓名、性别、出生日期、文化程度、籍贯、民族、入学日期等,主要是对学生信息的登记。
    3.教师基本信息录入
    在此输入教师的基本信息包含教师工号、姓名、性别、出生日期、文化程度、籍贯、民族、主教课程等,主要是对教师信息的登记。
    4.课程信息录入.
    主要是对学生所学课程信息进行添加、修改和删除。管理员在课程名输入框中输入要添加的课程名称,点击添加按钮。
    5.成绩信息录入.
    管理员在此窗口输入要选择学生编号和考试编号,系统自动补全数据,然后输入该科考试课程的成绩。如果点击“对已输入成绩进行删除”按钮,则将已经输入的成绩信息删除。老师可以将成绩录入到班级学生管理系统中,老师录入成绩的时候,能通过网页直接导入excel表格录入到数据库,同时可以对其中的信息进行修改。
    6.学生奖惩管理
    管理员给学生添加奖惩记录,学生查询个人奖惩记录。在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    第1章 绪论 1
    1.1 选题背景 1
    1.2 开发意义 1
    1.3 研究内容 1
    1.4 论文的组成 2
    1.5 本章小结 2
    第2章 系统开发技术的介绍 3
    2.1 Apache服务器简介 3
    2.2HTML/CSS简介 3
    2.3php简介 3
    2.4Mysql数据库概念和特点 4
    2.5本章小结 4
    第3章 系统分析 5
    3.1功能需求分析 5
    3.2业务流程分析 6
    3.3数据流程分析 7
    3.4本章小结 10
    第4章 系统设计 12
    4.1系统网络架构设计 12
    4.2系统总体设计 12
    4.3系统功能模块设计 13
    4.4数据库设计 14
    4.5本章小结 18
    第5章 系统的实现 19
    5.1主页面的实现 19
    5.2登录模块的实现 20
    5.3学生成绩录入模块的实现 22
    5.4课程管理模块的实现 24
    5.5学生管理模块的实现 24
    5.6学生奖惩录入模块的实现 26
    5.7成绩分析模块的实现 28
    5.8本章小结 28
    第6章 系统测试 29
    6.1运行环境说明 29
    6.2界面测试 29
    6.3功能测试 29
    6.4测试结果 31
    6.5本章小结 31
    第7章 总结 32
    致 谢 33
    参考文献 34

    展开全文
  • 这是一份本人编辑的学生成绩分析系统,以java语言实现。 含有源代码。
  • 是一款学生成绩分析系统,供各中,小学及院校的老师使用,借助此软件老师可轻松管理和分析学生的成绩。不仅大大提高了老师的工作效率,而且同时还能通过报表对比,查询和图表解析快速的对一个学生或一个班级的成绩...
  • 学生成绩分析系统后端函数解释一、集成函数(总函数)1 .输入总的年级列表 输出各班每人绩点 排名2. 输入总的年级列表 输出各班平均绩点 排名3. 输入总的年级列表 输出每科目年级平均分4. 输入总的年级列表 输出班级...

    学生成绩分析系统后端函数解释

    一、集成函数(总函数)

    1 .输入总的年级列表 输出各班每人绩点 排名

    输入类型:list
    输出类型:dict

    all_classname_people_jidian_sort(alllist)
    

    2. 输入总的年级列表 输出各班平均绩点 排名

    输入类型:list
    输出类型:dict

    all_classname_jidian_sort(alllist)
    

    3. 输入总的年级列表 输出每科目年级平均分

    输入类型:list
    输出类型:dict

    all_courseaverage_allgrade(alllist)
    

    4. 输入总的年级列表 输出班级每科目年级平均分

    输入类型:list
    输出类型:dict

    all_courseaverage_allclass(alllist)
    

    5. 输入总的年级列表 输出挂科信息 人名:科目

    输入类型:list
    输出类型:dict

    all_failexam_people_withcoures(alllist)
    

    6. 输入总的年级列表 输出个人信息

    list[‘范博文’, ‘男’, ‘20大数据1’, ‘2010311115’]
    输入类型:list
    输出类型:list

    get_allpeople_information(alllist)
    

    7.输入总的年级列表 输出每人平均绩点 排名

    输入类型:list
    输出类型:dict

    all_jidian_sort(alllist)
    

    8.输入总的年级列表 输出前50名各班人数

    输入类型:list
    输出类型:dict

    all_top50_people_withclassname(alllist)
    

    9.输入总的年级列表 输出各班挂科名单

    输入类型:list
    输出类型:dict

    all_failexam_classname_withpeople(alllist)
    

    10.输入总的年级列表 输出每人每科目分

    输入类型:list
    输出类型:dict

    all_courser_allpeople(alllist)
    

    11.输入总的年级列表 输出每科目每人分

    输入类型:list
    输出类型:dict(dict)

    all_allcourse_allpeople(alllist)
    

    12. 输入总的年级列表 输出挂科信息 科目:人名

    输入类型:list
    输出类型:dict(dict)

    all_failexam_course_withpeople(alllist)
    

    特:重要函数

    1.输入总列表与保留的班级 删除不需要的班级成员信息(当兵或者休学)返回新的总列表

    输入类型:alllist list
    输出类型:alllist

    delete_some_classDATA(alllist, new_class)
    

    2.将列表信息按照年级分类 输出字典总列表

    输入类型:alllist
    输出类型:dict

    classfy_all_item_alllist(alllist)
    

    二、对excel表的操作

    1.将excel表格转化为理想格式

    输入类型:路径
    输出类型:excel

    Ture_excel(path)
    

    2. 将excel表格转化为列表

    输入类型:路径
    输出类型:list

    注:重名学生会在名字后自动加上学号辨认,请把输出结果存入数据库

    excel_to_list(path)
    

    三、信息获取

    1. 获取班级列表

    输入类型:list
    输出类型:list

    get_classname_by_list(alllist)
    

    2. 获取人名列表

    输入类型:list
    输出类型:list

    get_peoplrname_by_list(alllist)
    

    3. 获取课程列表

    输入类型:list
    输出类型:list

    get_coursename_by_list(alllist)
    

    4. 获取所有学号

    类型:list
    输出类型:list

    get_all_studentID(alllist)
    

    5. 获取所有名字+学号

    输入类型:list
    输出类型:list

    get_all_name_with_ID(alllist)
    

    6. 寻找重名

    输入类型:list
    输出类型:list

    get_multiple_name(alllist)
    

    7. 获取各班级名单

    输入类型:list
    输出类型:dict

    get_classname_with_name(alllist)
    

    8.获取学期列表

    输入类型:list
    输出类型:list

    get_all_item(alllist)
    

    9.获取公选课列表

    输入类型:list
    输出类型:list

    get_public_sourse_by_list(alllist)
    

    四、对总信息列表的分类操作

    1. 按班级名分类

    输入类型:list
    输出类型:dict

    classify_data_form_classname_by_list(alllist)
    

    2. 按人名分类

    输入类型:list
    输出类型:dict

    classify_data_alllist_to_namedict(alllist)
    

    3. 按课程名分类

    输入类型:list
    输出类型:dict

    classify_data_alllist_to_coursedict(alllist)
    

    4.# 将公选课列表提取出来 alllist->公选课列表

    输入类型:list
    输出类型:list

    classify_data_alllist_to_publiccourse_list(alllist)
    

    五、数据计算

    1. 算单课程绩点

    输入类型:list 总信息列表里的一行
    输出类型:float

    get_row_courese_jidian(onelist)
    

    2 . 获得列表的绩点

    输入类型:list
    输出类型:float
    输入的列表信息求总绩点

    get_people_jidian(alllist)
    

    六、标签查询

    1. 输入总列表与班级名称 输出平均绩点,每人绩点,科目平均分,挂科名单,人数,挂科信息

    输入 :list str
    输出:

    [2.9893, [('李巧', 3.82), ('王颖2010311226', 3.78), ('朱锡煜', 3.76), ('龚道军',
    3.6), ('胡思敏', 3.27), ('陶佳豪', 3.26), ('张欣雨', 3.25), ('孙中榜', 3.23), ('贺雪儿', 3.21), ('孔子恒', 3.19), ('张睿龙', 3.12), ('袁航宇', 3.08), ('汪容山',
    3.08), ('蒋博宣', 3.07), ('张羽美', 3.06), ('赵一安', 3.02), ('黄世鹏', 2.9), ('牛宇松', 2.9), ('邓方舟', 2.88), ('柳博涵', 2.88), ('杨文龙', 2.84), ('陈佳',
    2.74), ('彭叶秋阳', 2.72), ('刘德庆', 2.68), ('付帅', 2.67), ('程卓非', 2.35), ('王宇航', 2.06), ('王梓纯', 1.28)], {'大学生职业生涯规划': 86.71, '大学语文': 79.68, '程序设计基础(一)-C语言程序设计': 82.21, '大学英语-1': 77.0, '思想道德修养与法律基础': 81.18, '形势与政策(一)-1': 91.43, '高等数学(一)-1': 77.61, '数据科学与大数据技术导论': 83.54, '大学生安全教育': 79.54, '体育-1': 75.61}, ['程卓非', '王梓纯'], 2, {'程卓非': {'大学英语-1': 56}, '王梓纯': {'程序设计基础(一)-C语言程序设计': 44}}]
    
    get_oneclass_all_information(alllist: list, one_class: str)
    

    2. 输入总列表与人名 输出性别 班级 学号 平均绩点 每个科目的分数 挂科信息

    输入 :list str
    输出:

    ['男', '20计算类06', '2010300620', 1.85, {'思想道德修养与法律基础': '74', '程序设计基础(一)-C语言程序设计': '50', '体育-1': '70', '形势与政策(一)-1': '95', '高等数学(一)-1': '67', '计算机科学导论': '85', '大学生安全教育': '68', '大学生职业生涯规划': '77', '大学语文': '81', '大学英语-1': '71'}, {'程序设计基础(一)-C语言程序设计': 50}]
    
    get_onecpeople_all_information(alllist: list, one_people: str)
    

    3.# 输入总列表与课程 输出年级平均分 各班平均分 年级每人分 班级每人分 挂科名单

    输入 :list str
    输出:

    > [83.29, {'20大数据3': 83.68, '20大数据2': 83.54, '20大数据1': 82.69}, {'马晶晶':
    > '98', '陈紫烟': '97', '李雪钰': '97', '钟嫚': '96', '盛婉怡': '96', '蓝峰': '96',
    > '但梦悦': '96', '张欣雨': '94', '徐阳': '94', '王颖2010311226': '94', '黄子珊':
    > '93', '张睿龙': '93', '朱静茹': '93', '刘宇辰': '93', '康超超': '93', '贺雪儿': '93',
    > '李锦诚': '93', '张皓然': '93', '朱锡煜': '92', '沈金明': '92', '龚道军': '92',
    > '陶佳豪': '91', '罗茜怡': '91', '黄腾达': '90', '张欣瑶': '90', '李雯丽': '89',
    > '黄世鹏': '89', '程卓非': '88', '张柏源': '88', '张羽美': '88', '李波': '88', '雷浩然':
    > '88', '魏志成': '87', '吴栋': '87', '李积涛': '87', '林皓天': '87', '黄治': '86',
    > '高宇': '86', '蔡政洋': '86', '陈佳': '86', '胡思敏': '85', '孔子恒': '85', '石鑫科':
    > '84', '李巧': '84', '汪容山': '84', '袁航宇': '82', '关业成': '82', '向澳林': '82',
    > '范博文': '82', '付帅': '82', '刘力萌': '81', '刘德庆': '81', '柳博涵': '80', '陈宇婷':
    > '80', '熊晶晶': '80', '王宇航': '80', '于丰浩': '80', '邓方舟': '80', '蒋博宣': '80',
    > '余鹏飞': '79', '王凡': '79', '沈宇慧': '79', '顾实': '78', '詹必豪': '77', '孙中榜':
    > '77', '丰宇硕': '76', '葛梓安': '76', '丁搏阳': '76', '彭叶秋阳': '76', '伍子旋':
    > '75', '王海石': '75', '赵一安': '74', '关思卢': '74', '王文博': '72', '杨文龙': '71',
    > '林泽明': '71', '牛宇松': '71', '刘信': '70', '卢煜': '68', '魏金淘': '67', '吴彬豪':
    > '67', '王梓纯': '67', '王群源': '65', '黄国振': '64', '王泽瑞': '52'}, {'20大数据3':
    > {'马晶晶': '98', '徐阳': '94', '刘宇辰': '93', '张皓然': '93', '李锦诚': '93',
    > '朱静茹': '93', '沈金明': '92', '罗茜怡': '91', '黄腾达': '90', '李波': '88', '吴栋':
    > '87', '林皓天': '87', '魏志成': '87', '李积涛': '87', '蔡政洋': '86', '黄治': '86',
    > '石鑫科': '84', '关业成': '82', '刘力萌': '81', '熊晶晶': '80', '王凡': '79', '沈宇慧':
    > '79', '葛梓安': '76', '伍子旋': '75', '王海石': '75', '刘信': '70', '王群源': '65',
    > '王泽瑞': '52'}, '20计算类05': {}, '20计算类08': {}, '20计算类09': {}, '20计算类06':
    > {}, '20大数据2': {'王颖2010311226': '94', '张欣雨': '94', '贺雪儿': '93', '张睿龙':
    > '93', '龚道军': '92', '朱锡煜': '92', '陶佳豪': '91', '黄世鹏': '89', '程卓非': '88',
    > '张羽美': '88', '陈佳': '86', '胡思敏': '85', '孔子恒': '85', '汪容山': '84', '李巧':
    > '84', '袁航宇': '82', '付帅': '82', '刘德庆': '81', '邓方舟': '80', '蒋博宣': '80',
    > '柳博涵': '80', '王宇航': '80', '孙中榜': '77', '彭叶秋阳': '76', '赵一安': '74',
    > '牛宇松': '71', '杨文龙': '71', '王梓纯': '67'}, '20计算类02': {}, '20计算类03': {},
    > '20计算类01': {}, '20计算类07': {}, '20大数据1': {'李雪钰': '97', '陈紫烟': '97',
    > '钟嫚': '96', '盛婉怡': '96', '蓝峰': '96', '但梦悦': '96', '黄子珊': '93', '康超超':
    > '93', '张欣瑶': '90', '李雯丽': '89', '雷浩然': '88', '张柏源': '88', '高宇': '86',
    > '向澳林': '82', '范博文': '82', '陈宇婷': '80', '于丰浩': '80', '余鹏飞': '79', '顾实':
    > '78', '詹必豪': '77', '丁搏阳': '76', '丰宇硕': '76', '关思卢': '74', '王文博': '72',
    > '林泽明': '71', '卢煜': '68', '魏金淘': '67', '吴彬豪': '67', '黄国振': '64'},
    > '20计算类10': {}, '20计算类04': {}}, {'王泽瑞': 52}]
    
    get_onecourse_all_information(alllist: list, one_course: str)
    

    4.输入总列表与公选课 输出年级平均分 年级每人分

    输入 :list str
    输出:

    > [82.67, [['殷明珠', '19计算4', 86.0], ['吴优', '19计算4', 86.0], ['莫子谦',
    > '19计算1', 92.0], ['龚少文', '19计算4', 92.0], ['张荪宇', '19大数据1', 70.0],
    > ['魏宏涛', '19大数据2', 70.0]]]
    
    get_onepubliccourse_all_information(alllist: list, one_course: str)
    
    展开全文
  • 存储50名学生的信息,包括:学号,姓名,语文成绩,数学成绩,英语成绩成绩为随机生成0-100之间的整数)

    存储50名学生的信息,包括:学号,姓名,语文成绩,
    数学成绩,英语成绩(成绩为随机生成0-100之间的整数)
    (1)计算每名同学的平均成绩并排序
    (2)分别计算每门课程的平均分
    (3)输出每门课程最高分,最低分学生名单,统计各分段
    学生人数:0-59,60-69,70-79,80-89,90-100

    # @Time : 2020/10/5 18:04
    # @Author : Yurken
    # @File : 10.5日作业.py
    import random
    
    name = ['包乐山', '包咏琦', '杨强', '李晶晶', '於斌涛', '石卓', '贾玉盈', '石江南', '乔倩倩', '杨光', '王霖', '贺立松', '任可', '张翔', '王振强', '吕彦良',
            '黛肖黎', '秦斌', '包锐', '包礼军', '黄宁宁', '许杰', '吴娜', '后箫航', '杜玉曦', '赫倩倩', '杨玉倩', '张蕊', '王蕊蕊', '孝雪霞', '曹建', '曾嫖丽', '杜勇',
            '弥玉薇', '常睿娟', '后妙慧', '罗亚婷', '骆冰冰', '后田田', '包圆圆', '孙启浩', '周佳颖', '张孙辰', '黄砺锋', '周南', '严楚楚', '张乐缘', '刘瑛轩', '谭静',
            '吴逸菲']
    num = [0] * 50  # 学号
    f = 1804011001
    for i in range(0, 50):
        num[i] = f + i
    chinese = random.choices(range(0,100),k=50,weights=range(0,100))  # 随机生成语文成绩,成绩可重复,此随机方式导致每次都有不一样的成绩
    math = random.choices(range(0,100),k=50,weights=range(0,100))   # 随机生成数学成绩
    english = random.choices(range(0,100),k=50,weights=range(0,100))    # 随机生成英语成绩
    information = [name, num, chinese, math, english] # 学生信息生成
    avegrade=[0]*50
    for i in range(0,50):
        avegrade[i]=(chinese[i]+math[i]+english[i])/3 # 计算语数英三科平均成绩
    avegrade = [round(i,2) for i in avegrade] # 将总平均成绩保留两位小数
    a=[None]*50
    for i in range(0,50):
        a[i]=[name[i],num[i],avegrade[i]] # 将姓名,学号,总平均成绩合成a列表
    b=sorted(a, key=lambda x:x[2], reverse=True) # 将a列表降序成为b列表
    print("请选择你想要的操作:\n"
          "1.查看学生信息\n"
          "2.查看总平均成绩排序\n"
          "3.查看语文成绩平均分\n"
          "4.查看数学成绩平均分\n"
          "5.查看英语成绩平均分\n"
          "6.查看每门课程最低分名单\n"
          "7.查看每门课程最高分名单\n"
          "8.统计各分段学生人数\n"
          "0.退出")
    q=int(input())
    while q!=0:
        if q==1:
            information=[None]*50
            for i in range(0, 50):
                information[i] = [name[i], num[i], chinese[i],math[i],english[i]]
            for i in information:
                print(" ".join(str(k) for k in i)) # 将学生信息以空格分隔输出
            print("请继续输入:")
            q = int(input())
        elif q == 2:
            for i in b:
                print(" ".join(str(k) for k in i))
            print("请继续输入:")
            q = int(input())
        elif q==3:
            avechinese =0
            for i in chinese:
               avechinese+=i
            avechinese=avechinese/50
            avechinese= round(avechinese,3)
            print("语文平均成绩为:",avechinese)
            print("请继续输入:")
            q = int(input())
        elif q==4:
            avemath = 0
            for i in math:
                avemath += i
            avemath = avemath / 50
            avemath= round(avemath,3)
            print("数学平均成绩为:",avemath)
            print("请继续输入:")
            q = int(input())
        elif q==5:
            avenglish = 0
            for i in english:
                avenglish += i
            avenglish = avenglish / 50
            avenglish= round(avenglish,3)
            print("英语平均成绩为:", avenglish)
            print("请继续输入:")
            q = int(input())
        elif q==6:
            print("语文最低分为:")
            aveyw1 = [None] * 50
            for i in range(0, 50):
                aveyw1[i] = [name[i],  chinese[i]]
            for i in range(0,50):
                yw=min(chinese)
                if yw==aveyw1[i][1]:
                    print(aveyw1[i])
            print("数学最低分为:")
            avesx1 = [None] * 50
            for i in range(0, 50):
                avesx1[i] = [name[i], math[i]]
            for i in range(0, 50):
                sx = min(math)
                if sx == avesx1[i][1]:
                    print(avesx1[i])
            print("英语最低分为:")
            aveyy1 = [None] * 50
            for i in range(0, 50):
                aveyy1[i] = [name[i], english[i]]
            for i in range(0, 50):
                yy = min(english)
                if yy == aveyy1[i][1]:
                    print(aveyy1[i])
            print("请继续输入:")
            q = int(input())
        elif q==7:
            print("语文最高分为:")
            aveyw = [None] * 50
            for i in range(0, 50):
                aveyw[i] = [name[i],  chinese[i]]
            for i in range(0,50):
                yw=max(chinese)
                if yw==aveyw[i][1]:
                    print(aveyw[i])
            print("数学最高分为:")
            avesx = [None] * 50
            for i in range(0, 50):
                avesx[i] = [name[i], math[i]]
            for i in range(0, 50):
                sx = max(math)
                if sx == avesx[i][1]:
                    print(avesx[i])
            print("英语最高分为:")
            aveyy = [None] * 50
            for i in range(0, 50):
                aveyy[i] = [name[i], english[i]]
            for i in range(0, 50):
                yy = max(english)
                if yy == aveyy[i][1]:
                    print(aveyy[i])
            print("请继续输入:")
            q = int(input())
        elif q==8:
            ywe=0
            ywd=0
            ywc=0
            ywb=0
            ywa=0
            for i in chinese:
                if 0<=i<=59:
                    ywe+=1
                elif 60<=i<=69:
                    ywd+=1
                elif 70<=i<=79:
                    ywc+=1
                elif 80<=i<=89:
                    ywb+=1
                elif 90<=i<=100:
                    ywa+=1
            print('语文成绩分布:\n0-59:',ywe,'人\n60-69:',ywd,'人\n70-79:',ywc,'人\n80-89:',ywb,'人\n90-100:',ywa,'人')
            sxa=sxb=sxc=sxd=sxe=0
            for i in math:
                if 0 <= i <= 59:
                    sxe += 1
                elif 60 <= i <= 69:
                    sxd += 1
                elif 70 <= i <= 79:
                    sxc += 1
                elif 80 <= i <= 89:
                    sxb += 1
                elif 90 <= i <= 100:
                    sxa += 1
            print('数学成绩分布:\n0-59:', sxe, '人\n60-69:', sxd, '人\n70-79:', sxc, '人\n80-89:', sxb, '人\n90-100:', sxa, '人')
            yya=yyb=yyc=yyd=yye=0
            for i in english:
                if 0 <= i <= 59:
                    yye += 1
                elif 60 <= i <= 69:
                    yyd += 1
                elif 70 <= i <= 79:
                    yyc += 1
                elif 80 <= i <= 89:
                    yyb += 1
                elif 90 <= i <= 100:
                    yya += 1
            print('英语成绩分布:\n0-59:', yye, '人\n60-69:', yyd, '人\n70-79:', yyc, '人\n80-89:', yyb, '人\n90-100:', yya, '人')
            print("请继续输入:")
            q = int(input())
        elif q==0:
            print('程序已结束!')
            break
    
    展开全文
  • 学生成绩分析系统2.0

    2009-04-05 21:53:15
    通过本系统,班主任或代课老师可以以规范化方式轻松记录各科成绩,并可快速查找信息,统计、分析学生成绩,提高工作效率,摆脱繁琐的手工工作。系统重点实现了考试管理、成绩报表、成绩分析等功能。
  • 通过本系统,班主任或代课老师可以以规范化方式轻松记录各科成绩,并可快速查找信息,统计、分析学生成绩,提高工作效率,摆脱繁琐的手工工作。系统重点实现了考试管理、成绩报表、成绩分析等功能。
  • vb学生成绩分析系统

    2009-06-18 10:53:40
    系统包括管理员对学生的基本信息和成绩的管理
  • 基于数据挖掘的学生成绩分析系统

    热门讨论 2012-07-05 14:00:40
    是本科毕业设计,用的是C4.5数据挖掘算法,分析前导课程与后续课程的关系和平时成绩对期末成绩的关系。
  • 学生成绩分析系统sql

    2009-07-11 11:46:50
    sql server与power builder
  • 基于Spark的学生成绩分析系统

    千次阅读 2018-07-02 17:33:00
    平均成绩分析 取数据 根据课程id取出每个年级的各个学生此门课程的成绩,SQL语句如下: def sqlStr(courseId: Int): String = { s""" SELECT c.gradeId,sc.score FROM tb_student st LEFT JOIN...

    本文首发于我的个人博客QIMING.INFO,转载请带上链接及署名。

    本文是本人硕士期间云计算课程的一次大作业,所以可能部分内容有充字数的嫌疑,还望各位看官无视。。。但是也正因为此,本文对一些基础概念描述的也挺详细,包括但不限于Spark简介、Spark与Hadoop对比、Spark架构介绍、Pearson相关系数简介、Spark中的combineByKey函数简介、Spark中提交并运行作业的方法等。

    问题说明

    提出问题及目标

    学生成绩是评价学生学习效果和老师教学效果的重要指标,如何充分利用已有的学生成绩数据,发现其中的规律,提高教学质量是广大教育工作者普遍关注的问题。

    一般而言,学生各科成绩之间或多或少都存在联系,例如一个学习好的学生各科成绩普遍都比较高。研究者们对此进行了大量的数据采集、统计工作,从他们的研究结果来看,学生各科成绩之间的确存在一定的相关性,只是不同课程之间相关性的强弱不同而已。

    通过对学生成绩进行统计分析,可以发现学生成绩中隐藏的课程关联规则和模式,这些知识可以帮助老师更加合理地安排教学内容,从而对教学起到促进作用。

    现有西工大某学院2006级至2015级学生的全部成绩,我们想利用这些数据统计出:①各学科的整体情况;②各课程之间的相关性

    目标细化及难点

    经过讨论,我们决定用每个年级的各科平均成绩来反映该学科的整体情况,并分年级计算各个课程之间的Pearson相关系数以反映各课程间的相关性。并最后将分析的结果保存在HDFS上。

    要做到这些工作,我们需要解决以下难点:
    ① 2006至2015学生人数众多,且课程种类多,为分析带来了极大困难
    ② 用单机运行处理大量数据需要大量的时间
    所以我们便考虑使用分布式计算引擎Spark来克服这些难点。

    背景

    Spark简介

    Spark是专为大规模数据处理而设计的快速通用的计算引擎,最初在2009年由加州大学伯克利分校的AMP实验室用Scala语言开发,并于2010年成为Apache的开源项目。

    Spark是基于MapReduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是中间过程的输出和结果可以保存在内存中,从而不再需要读写HDFS,大大提高了速度。

    Spark和Hadoop的关系图如下:

    官方资料介绍,和Hadoop相比,Spark可以让你的程序在内存中运行时速度提升100倍,就算在硬盘上,运行速度也能提升10倍。

    Spark架构

    Spark的架构示意图如下:

    如图可见,Spark主要有以下模块:
    ① Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的。
    ② Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。
    ③ Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据
    ④ MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
    ⑤ GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。

    Spark RDD简介

    RDD(Resilient Distributed Dataset)即弹性分布式数据集。

    RDD是Spark的核心,在Spark中,对数据的所有操作不外乎创建RDD、转化已有RDD以及调用RDD操作进行求值。每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上。RDD可以包含Python、Java、Scala中任意类型的对象,甚至可以包含用户自定义的对象。

    RDD是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD。从编程的角度来看,RDD可以简单看成是一个数组。和普通数组的区别是,RDD中的数据是分区存储的,这样不同分区的数据就可以分布在不同的机器上,同时可以被并行处理。因此,Spark应用程序所做的无非是把需要处理的数据转换为RDD,然后对RDD进行一系列的变换和操作从而得到结果。

    更多内容可参考本站的这篇文章Spark RDD的简单使用

    Pearson相关系数简介

    Pearson相关系数 (Pearson Correlation Coefficient)是用来衡量两个数据集合是否在一条线上面,它用来衡量定距变量间的线性关系。Pearson是一个介于-1和1之间的值,用来描述两组线性的数据一同变化移动的趋势。

    Pearson系数的计算公式如下:

    注:Cov(X,Y)表示X和Y的协方差,E(X ) 表示X的平均值。

    Pearson 相关系数大小的含义如下表所示:

    相关性 负相关 正相关
    -0.09 至 0.0 0.0 至 0.09
    -0.3 至 -0.1 0.1 至 0.3
    -0.5 至 -0.3 0.3 至 0.5
    -1.0 至 -0.5 0.5 至 1.0

    实现步骤

    源数据是在MySQL数据库中存储的,所以在进行统计分析工作前要先将数据从MySQL数据库中读取出来。

    平均成绩分析

    取数据

    根据课程id取出每个年级的各个学生此门课程的成绩,SQL语句如下:

    def sqlStr(courseId: Int): String = {
      s"""SELECT c.gradeId,sc.score FROM tb_student st
          LEFT JOIN tb_score sc ON st.studentId = sc.studentId
          LEFT JOIN tb_class c  ON st.classId = c.classId
          WHERE sc.courseId = $courseId
          ORDER BY sc.studentId"""
    }

    转化数据

    从MySQL中取得的数据在Spark中是DataFrame类型的,为了方便计算,我们需要将其转化为一个键值对RDD,键为“科目+年级”,值为每个学生成绩,如( C语言2006级,89.0),代码如下:

    val scoreRdd = scoreDataFrame.map(x => (courseStr(courseId) + gradeStr(x.getLong(0).toInt), x.getDecimal(1).doubleValue)).rdd

    计算平均成绩

    调用RDD的combineByKey()方法来计算平均数,此方法先将相同键的值加起来,之后除以这个键的个数,得到这个键对应的平均成绩,代码如下:

    val averageScoreRdd = scoreRdd.combineByKey(
      createCombiner = (v: Double) => (v: Double, 1),
      mergeValue = (c: (Double, Int), v: Double) => (c._1 + v, c._2 + 1),
      mergeCombiners = (c1: (Double, Int), c2: (Double, Int)) => (c1._1 + c2._1, c1._2 + c2._2),
      numPartitions = 3
    ).map { case (k, v) => (k, v._1 / v._2) }

    代码说明:

    • createCombiner即当遇到一个新键时,创建一个此键对应的累加器,如第一次遇到(C语言2006级,89.0)时,创建(C语言2006级,(89.0,1));
    • mergeValue即当遇到之前已遇到过的键时,将该键的累加器与当前值合并,如再遇到(C语言2006级,90.5)时,合并为(C语言2006级,(179.5,2));
    • mergeCombiners即将各个分区的结果进行合并,得到每门课程对应不同年级的总成绩和总人数,如(C语言2006级,(19173.7,241));
    • numPartitions即表示Spark分了3个分区来并行处理数据;

    代码最后一行的map即为将每个键的累加器的总成绩除以总人数,得到一个值为平均成绩的RDD,如(C语言2006级,79.559)。

    保存结果

    调用saveAsTextFile()方法将计算出的平均成绩存储在HDFS中,每个科目的平均成绩保存在用该科目名命名的文件夹中,代码如下:

    averageScoreRdd.sortByKey().saveAsTextFile("hdfs://localhost:9000/user/hadoop/output/score-avg/" + courseStr(courseId))

    相关性分析

    取数据

    根据年级id取出当前年级每个学生所有科目的成绩,SQL语句如下:

    def allScoreSqlStr(gradeId: Int): String = {
      s"""SELECT
            MAX(case cou.courseId when '1' THEN IFNULL(sc.score, 0) END) '高等数学',
            MAX(case cou.courseId when '2' THEN IFNULL(sc.score, 0) END) '外语',
            MAX(case cou.courseId when '3' THEN IFNULL(sc.score, 0) END) '离散数学',
            MAX(case cou.courseId when '4' THEN IFNULL(sc.score, 0) END) 'C语言' ,
            MAX(case cou.courseId when '5' THEN IFNULL(sc.score, 0) END) '数据结构',
            MAX(case cou.courseId when '6' THEN IFNULL(sc.score, 0) END) '组成原理',
            MAX(case cou.courseId when '7' THEN IFNULL(sc.score, 0) END) '操作系统'
          FROM  tb_student st
          LEFT JOIN tb_score sc on st.studentId = sc.studentId
          LEFT JOIN tb_course cou on cou.courseId = sc.courseId
          LEFT JOIN tb_class cla ON  st.classId = cla.classId
          WHERE cla.gradeId = $gradeId
          GROUP BY st.studentId
          ORDER BY st.studentId"""
    }

    转化数据

    先将此DataFrame类型的数据转化成数值类型的RDD:

    val data = scoreDataFrame.map(x => x.toString).rdd.
      map(x => x.substring(1, x.length - 1).split(",")).
      map(x => x.map(x => x.toDouble))

    计算Pearson相关系数可以调用Spark MLlib库中的方法,但是该方法要求RDD为向量类型的RDD,所以继续转化:

    val data1 = data.map(x => Vectors.dense(x))

    计算Pearson相关系数

    直接调用Spark MLlib库中的Statistics.corr方法进行计算:

    val corr = Statistics.corr(data1, "pearson")

    保存结果

    经过上述计算,得到的corr是一个矩阵,我们想将结果保存成CSV以便于查看,所以应先将corr转化成一个数值类型的RDD,再将RDD转化成DataFrame以便于保存为CSV文件,最后将结果保存到HDFS上,每个年级的各科相关系数保存在以该年级命名的文件夹中,代码如下:

    val tmpRdd = sc.parallelize(corr.rowIter.toArray.map(x => x.toArray)).map(x => (x(0), x(1), x(2), x(3), x(4), x(5), x(6)))
    val tmpDF = tmpRdd.toDF("高等数学", "外语", "离散数学", "C语言", "数据结构", "组成原理", "操作系统")
    tmpDF.write.format("csv").save("hdfs://localhost:9000/user/hadoop/output/score-pearson/" + gradeStr(gradeId))

    提交运行

    代码编写完成后,我们需要将代码打包成jar文件(打包过程略),然后提交到spark集群上运行,有以下三步:

    启动master

    进入spark的安装目录,输入:

    ./sbin/start-master.sh

    启动worker

    ./bin/spark-class org.apache.spark.deploy.worker.Worker spark://localhost:7077  

    这里的地址为:启动master后,在浏览器输入localhost:8080,查看到的master地址:

    启动成功后,用jps查看进程:

    因本实验中还用到了HDFS,所以也必须启动它(使用start-dfs.sh),启动后再用jps查看一下进程:

    提交作业

    ./bin/spark-submit --master spark://localhost:7077 --class ScoreAnalysis /home/hadoop/scoreanalysis.jar

    注:这里将打包好的jar包放在了/home/hadoop/目录下

    可以在4040端口查看作业进度:

    结果展示

    上文说过,我们将结果保存在了HDFS中,所以当程序运行完成后,要查看结果,必须用Hadoop HDFS提供的命令或者进入namenode管理页面进行查看。

    在控制台上输入以下命令:

    $ hadoop fs –ls /user/hadoop/output/

    结果如下图:

    为了便于查看,我们也可以进入namenode管理页面。

    查看平均成绩

    进入score-avg文件夹,可以看到每个科目创建了一个文件夹。

    进入外语文件夹,可以看到有四个文件,_SUCCESS表示文件存储成功,其他三个文件即Spark保存时有三个分区,分别进行了保存。

    为了方便查看,我们使用cat命令,将所有文件内容整合到一个本地文件中,如下图所示:

    查看Pearson相关系数

    进入score-pearson文件夹,可以看到,我们将不同课程的相关性按年级分成了不同的文件夹。

    以2006级为例说明,进入2006级文件夹,看到5个文件,_SUCCSESS说明保存成功,其余四个文件即Spark保存时有四个分区,分别进行了保存。

    同样,我们用cat命令将其合并到一个文件中,即在控制台中输入:

    hadoop fs -cat /user/hadoop/output/score-pearson/2006级/part-* >  //home/hadoop/score-pearson/2006级.csv

    之后打开2006级.csv,便能清晰的看到2006级学生成绩各科的pearson相关系数了:

    从图中可以看出,组成原理和操作系统的Pearson相关系数最高,达到了0.62,说明组成原理和操作系统的相关性较强。

    总结

    在本次实验中,我们小组共同合作,完成了用Spark进行对西工大某学院学生2006级至2015级各课程的成绩统计与分析。

    在这个过程中,我们学习到了Hadoop、Spark环境的搭建,Spark RDD的使用,Scala语言的用法,以及分布式开发的思想,并成功得出了各课程的平均成绩与相关性。

    这次实践我们收获到了很多,但由于能力与时间有限,本实验还有很多可以改进的地方。以后还有很多值得学习与研究的地方,我们会再接再厉,努力做得更好。

    附完整代码

    import java.util.Properties
    
    import org.apache.spark.mllib.linalg.Vectors
    import org.apache.spark.mllib.stat.Statistics
    import org.apache.spark.sql.SparkSession
    
    /**
      * xu qi ming
      * 2018.06.15
      */
    object ScoreAnalysis {
    
      /**
        * 根据课程id查找每个学生的成绩和所在年级的SQL语句
        *
        */
      def sqlStr(courseId: Int): String = {
        s"""SELECT c.gradeId,sc.score FROM tb_student st
              LEFT JOIN tb_score sc ON st.studentId = sc.studentId
              LEFT JOIN tb_class c ON  st.classId = c.classId
              WHERE sc.courseId = $courseId
              ORDER BY sc.studentId"""
      }
    
      /**
        * 查找当前年级每个学生所有科目的成绩的SQL语句
        *
        */
      def allScoreSqlStr(gradeId: Int): String = {
        s"""SELECT
              MAX(case cou.courseId when '1' THEN IFNULL(sc.score, 0) END) '高等数学',
              MAX(case cou.courseId when '2' THEN IFNULL(sc.score, 0) END) '外语',
              MAX(case cou.courseId when '3' THEN IFNULL(sc.score, 0) END) '离散数学',
              MAX(case cou.courseId when '4' THEN IFNULL(sc.score, 0) END) 'C语言' ,
              MAX(case cou.courseId when '5' THEN IFNULL(sc.score, 0) END) '数据结构',
              MAX(case cou.courseId when '6' THEN IFNULL(sc.score, 0) END) '组成原理',
              MAX(case cou.courseId when '7' THEN IFNULL(sc.score, 0) END) '操作系统'
            FROM  tb_student st
            LEFT JOIN tb_score sc on st.studentId = sc.studentId
            LEFT JOIN tb_course cou on cou.courseId = sc.courseId
            LEFT JOIN tb_class cla ON  st.classId = cla.classId
            WHERE cla.gradeId = $gradeId
            GROUP BY st.studentId
            ORDER BY st.studentId"""
      }
    
    
      /**
        * 将年级id转换成字符串
        *
        */
      def gradeStr(gradeId: Int): String = {
        gradeId match {
          case 1 => "2006级"
          case 2 => "2007级"
          case 3 => "2008级"
          case 4 => "2009级"
          case 5 => "2010级"
          case 6 => "2011级"
          case 7 => "2012级"
          case 8 => "2013级"
          case 9 => "2014级"
          case 10 => "2015级"
        }
      }
    
      /**
        * 将课程id转换成相应课程名字符串
        *
        */
      def courseStr(corseId: Int): String = {
        corseId match {
          case 1 => "高等数学"
          case 2 => "外语"
          case 3 => "离散数学"
          case 4 => "C语言"
          case 5 => "数据结构"
          case 6 => "组成原理"
          case 7 => "操作系统"
        }
      }
    
      def main(args: Array[String]): Unit = {
    
        // 生成SparkSession对象
        val spark = new SparkSession.Builder().appName("ScoreAnalysis").getOrCreate()
        //生成SparkContext对象
        val sc = spark.sparkContext
    
        //建立与mysql数据库的连接
        val connProperties = new Properties()
        connProperties.put("driver", "com.mysql.jdbc.Driver")
        connProperties.put("user", "root")
        connProperties.put("password", "Root_1234")
        connProperties.put("fetchsize", "100")
    
        import spark.implicits._
    
        /**
          * 计算指定课程的每个年级的平均成绩
          *
          */
        def averageScore(courseId: Int): Unit = {
    
          //连接数据库,将取得的成绩保存成DataFrame
          val scoreDataFrame = spark.read.jdbc(
            "jdbc:mysql://localhost:3306/db_score",
            s"(${sqlStr(courseId)}) as table01",
            connProperties)
    
          //将DataFrame转化成一个键值对RDD,键是科目+年级,值是每个学生的成绩
          val scoreRdd = scoreDataFrame.map(x => (courseStr(courseId) + gradeStr(x.getLong(0).toInt), x.getDecimal(1).doubleValue)).rdd
    
          //计算每个年级的平均成绩
          val averageScoreRdd = scoreRdd.combineByKey(
            createCombiner = (v: Double) => (v: Double, 1),
            mergeValue = (c: (Double, Int), v: Double) => (c._1 + v, c._2 + 1),
            mergeCombiners = (c1: (Double, Int), c2: (Double, Int)) => (c1._1 + c2._1, c1._2 + c2._2),
            numPartitions = 3
          ).map { case (k, v) => (k, v._1 / v._2) }
    
          //保存到HDFS中
          averageScoreRdd.sortByKey().saveAsTextFile("hdfs://localhost:9000/user/hadoop/output/score-avg/" + courseStr(courseId))
        }
    
        //循环这7门课,求每个课程每个年级的平均成绩
        for (i <- 1 to 7) {
          averageScore(i)
        }
    
        /**
          * 计算指定年级的所有科目的pearson相关系数
          *
          */
        def pearsonCorr(gradeId: Int): Unit = {
    
          //连接数据库,将取得的成绩保存成DataFrame
          val scoreDataFrame = spark.read.jdbc(
            "jdbc:mysql://localhost:3306/db_score",
            s"(${allScoreSqlStr(gradeId)}) as table01",
            connProperties)
    
          //将DataFrame转成数值类型的RDD
          val data = scoreDataFrame.map(x => x.toString).rdd.
            map(x => x.substring(1, x.length - 1).split(",")).
            map(x => x.map(x => x.toDouble))
    
          //将数值RDD转为Vector类型的RDD
          val data1 = data.map(x => Vectors.dense(x))
    
          //调用机器学习库的统计学习中的算法计算pearson相关系数
          //将结果返回成一个矩阵
          val corr = Statistics.corr(data1, "pearson")
    
          //保存计算的结果到HDFS
          val tmpRdd = sc.parallelize(corr.rowIter.toArray.map(x => x.toArray)).map(x => (x(0), x(1), x(2), x(3), x(4), x(5), x(6)))
          val tmpDF = tmpRdd.toDF("高等数学", "外语", "离散数学", "C语言", "数据结构", "组成原理", "操作系统")
          tmpDF.write.format("csv").save("hdfs://localhost:9000/user/hadoop/output/score-pearson/" + gradeStr(gradeId))
        }
    
        //循环这10个年级,求每个年级的各科相关系数情况
        for (i <- 1 to 10) {
          pearsonCorr(i)
        }
      }
    
    }
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,188
精华内容 875
关键字:

学生成绩分析系统