HEU成绩助手

简单的统计和计算成绩,输出到控制台

// ==UserScript==
// @name         HEU成绩助手
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  简单的统计和计算成绩,输出到控制台
// @author       HC
// @match        http://edusys.hrbeu.edu.cn/jsxsd/kscj/cjcx_list
// @grant        none
// ==/UserScript==

// 解析表格
const table = [];
for (let tr of document.querySelector('#dataList > tbody').children) {
    const row = [];
    for (const th of tr.children) {
        row.push(th.innerText);
    }
    table.push(row);
}
const title = table[0]; // 表格的第一行,标题内容
const course = table.slice(1);  // 截取课程内容

function findTitle(name) {
    for (let i = 0; i < title.length; i++) {
        if (title[i] === name) return i;
    }
    console.error('未找到' + name + ',解析失败!');
    return -1;
}

// 表格数据加工
(function () {
    // 将评级转化为分数
    let index1 = findTitle('成绩');
    if (index1 === -1) return 0;
    for (let tr of course) {
        switch (tr[index1]) {
            case '优秀':
                tr[index1] = 95;
                break;
            case '良好':
                tr[index1] = 85;
                break;
            case '中等':
                tr[index1] = 75;
                break;
            case '及格':
                tr[index1] = 65;
                break;
            case '不及格':
                tr[index1] = 30;
                break;
            default:
                tr[index1] = parseInt(tr[index1]);
                if (isNaN(tr[index1])) {
                    tr[index1] = 0; // 无法转化成数字的,就当做0处理
                }
        }
    }

    // 剔除重复内容(补考/刷分,取最高分);
    let index2 = findTitle('课程编号');
    if (index2 === -1) return 0;
    course.sort((a, b) => a[index2] - b[index2]); // 按课程编号从小到大排序
    for (let i = 1; i < course.length; i++) {
        if (course[i - 1][index2] === course[i][index2]) {
            console.log("检测到重复课程数据,将自动保留最高分,剔除低分数据:", course[i - 1], course[i]);
            if (course[i - 1][index1] < course[i][index1]) {
                course.splice(i - 1, 1);
            } else course.splice(i, 1);
            i--;
        }
    }

    // 将学分转化为数字
    index1 = findTitle('学分');
    if (index1 === -1) return 0;
    for (const tr of course) {
        tr[index1] = parseFloat(tr[index1]);
    }
})();

// 课程分类与整理
const mustCourse = [];  // 必修
const publicCourse = [];// 公选
const otherCourse = []; // 其他
(function () {
    let index1 = findTitle('课程名称');
    let index2 = findTitle('成绩');
    let index3 = findTitle('学分');
    let index4 = findTitle('课程属性');
    let index5 = findTitle('课程性质');
    let index6 = findTitle('通识教育选修课程类别');
    if (index1 === -1 || index2 === -1 || index3 === -1 || index4 === -1 || index5 === -1 || index6 === -1) return 0;

    for (let tr of course) {
        if (tr[index4] === '必修') {
            mustCourse.push([tr[index1], tr[index2], tr[index3], tr[index5]]);
        } else if (tr[index4] === '公选') {
            publicCourse.push([tr[index1], tr[index2], tr[index3], tr[index5], tr[index6]])
        } else {    // 其它
            otherCourse.push([tr[index1], tr[index2], tr[index3], tr[index5]]);
        }
    }
    console.log('必修课程:', mustCourse);
    console.log('公选课程:', publicCourse);
    console.log('其它课程:', otherCourse);
})();

// 成绩计算与统计
(function () {
    // 统计必修课成绩
    const must = [0, 0];
    for (let tr of mustCourse) {
        must[0] += tr[1] * tr[2];
        must[1] += tr[2];
    }
    console.log('必修课成绩:', '加权平均分:' + must[0] / must[1], '总学分:' + must[1]);

    // 统计公选课程
    const publicC = [0, 0];
    for (let tr of publicCourse) {
        publicC[0] += tr[1] * tr[2];
        publicC[1] += tr[2];
    }
    console.log('公选课成绩:', '加权平均分:' + publicC[0] / publicC[1], '总学分:' + publicC[1]);

    // 统计其它专选课
    const other = [0, 0];
    for (let tr of otherCourse) {
        other[0] += tr[1] * tr[2];
        other[1] += tr[2];
    }
    console.log('其它课成绩:', '加权平均分:' + other[0] / other[1], '总学分:' + other[1]);

    console.log('公选课加上其它课成绩:', '加权平均分:' + (must[0] + other[0]) / (must[1] + other[1]), '总学分:' + (must[1] + other[1]));
})()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址