GPA Calculator

A GPA Calculator of WHU

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         GPA Calculator
// @version      1.2.1
// @description  A GPA Calculator of WHU
// @author       Jeoy_Pei
// @license MIT
// @match        https://jwgl.whu.edu.cn/cjcx/cjcx_cxDgXscj.html?*
// @grant        none
// @namespace https://greasyfork.org/users/929066
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    //方法count用来将该行表格统计入相应的数组
    function count(oTd, arr1, arr2)
    {
        var kcxz=oTd[5].innerText;
        kcxz=kcxz.substring(kcxz.length-2);
        var kcbj=oTd[13].innerText;
        var xf=Number(oTd[6].innerText);
        var xfj=Number(oTd[24].innerText);
        var cj=oTd[7].innerText;
        var xq=Number(oTd[2].innerText);
        var xfcj;
        var check=oTd[0].children[0];
        var checked=1;
        if(check.checked==true||check.checked==false)
        {
            checked=(check.checked?1:0);
        }

        if(cj!=="缓考")
        {
            xfcj=Number(cj)*xf;
            if(kcbj=="主修")
            {
                if(kcxz=="必修")
                {
                     arr1[xq*4-4]+=xfj*checked;
                     arr2[xq*4-4]+=xfcj*checked;
                     arr1[xq*4-3]+=xf*checked;
                     arr2[xq*4-3]+=xf*checked;
                }
                else
                {
                     arr1[xq*4-2]+=xfj*checked;
                     arr2[xq*4-2]+=xfcj*checked;
                     arr1[xq*4-1]+=xf*checked;
                     arr2[xq*4-1]+=xf*checked;
                }
            }
            else
            {
                 arr1[xq*2+10]+=xfj*checked;
                 arr2[xq*2+10]+=xfcj*checked;
                 arr1[xq*2+11]+=xf*checked;
                 arr2[xq*2+11]+=xf*checked;
            }
        }
    }

    //方法statistics用来将数据整理
    function statistics(term,score,avg,avgs)
    {
        avg[0]=term[0]/term[1];
        avg[1]=(term[0]+term[2])/(term[1]+term[3]);
        avg[2]=term[4]/term[5];
        avg[3]=(term[4]+term[6])/(term[5]+term[7]);
        avg[4]=term[8]/term[9];
        avg[5]=(term[8]+term[10])/(term[9]+term[11]);
        avg[6]=(term[0]+term[4]+term[8])/(term[1]+term[5]+term[9]);
        avg[7]=(term[0]+term[4]+term[8]+term[2]+term[6]+term[10])/(term[1]+term[5]+term[9]+term[3]+term[7]+term[11]);
        avg[8]=term[12]/term[13];
        avg[9]=term[14]/term[15];
        avg[10]=(term[12]+term[14])/(term[13]+term[15])
        avgs[0]= score[0]/ score[1];
        avgs[1]=( score[0]+ score[2])/( score[1]+ score[3]);
        avgs[2]= score[4]/ score[5];
        avgs[3]=( score[4]+ score[6])/( score[5]+ score[7]);
        avgs[4]= score[8]/ score[9];
        avgs[5]=( score[8]+ score[10])/( score[9]+ score[11]);
        avgs[6]=( score[0]+ score[4]+ score[8])/( score[1]+ score[5]+ score[9]);
        avgs[7]=( score[0]+ score[4]+ score[8]+ score[2]+ score[6]+ score[10])/( score[1]+ score[5]+ score[9]+ score[3]+ score[7]+ score[11]);
        avgs[8]= score[12]/ score[13];
        avgs[9]= score[14]/ score[15];
        avgs[10]=( score[12]+ score[14])/( score[13]+ score[15])
    }

    $(document).ready(function()
    {
        //插入统计表
        var div_data=document.getElementById("div-data");
        var innerContainer=document.getElementById("innerContainer");
        var oRes=document.createElement("div");
        oRes.innerHTML='<table class="jsres">    <tr class="jsres" id="row_0">        <th class="jsres" colspan="3">总平均</th>        <th class="jsres" colspan="4">学年</th>        <th class="jsres" colspan="4">学年</th>        <th class="jsres" colspan="4">学年</th>        <th class="jsres" colspan="4">学年</th>    </tr>    <tr class="jsres">        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>        <th class="jsres" >学期</th>        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>        <th class="jsres" >学期</th>        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>        <th class="jsres" >学期</th>        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>        <th class="jsres" >学期</th>        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>    </tr>    <tr class="jsres" id="row_1">        <td class="jsres" rowspan="4"> </td>        <td class="jsres" rowspan="4"> </td>        <td class="jsres" rowspan="4"> </td>        <td class="jsres">1</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">1</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">1</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">1</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>    </tr>    <tr class="jsres" id="row_2">        <td class="jsres">2</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">2</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">2</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">2</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>    </tr>    <tr class="jsres" id="row_3">        <td class="jsres" >3</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >3</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >3</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >3</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>    </tr>        <tr class="jsres" id="row_4">        <td class="jsres" >总计</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >总计</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >总计</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >总计</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>    </tr>    </table><table><tr>        <td id="du" colspan="19" ><input type="button" id="select" value="多选模式"/>&nbsp&nbsp&nbsp<input type="button" id="dudu" value="嘟嘟"/></td>    </tr></table>';
        innerContainer.insertBefore(oRes,div_data);
        var oResss=document.getElementById("du");
        oResss.style.cssText="text-align:right;padding:16px;width:10000px";
        oRes.style.cssText="padding:40px;width:500px;overflow:auto;";
        var oRess=document.getElementsByClassName("jsres");
        for(var i=0;i<oRess.length;i++)
        {
            oRess[i].style.cssText="border:1px solid silver;text-align:center;padding:4px";
        }
        var dudu=document.getElementById("dudu");
        var select=document.getElementById("select");
        var sel_all=document.getElementById("jqgh_tabGrid_ck");
        select.onclick=function()
        {
            //加入复选框

            sel_all.innerHTML='<div id="jqgh_tabGrid_ck" class="ui-jqgrid-sortable"><input type="checkbox" /><span class="s-ico" style="display:none"><span sort="asc" class="ui-grid-ico-sort ui-icon-asc ui-state-disabled ui-icon ui-icon-triangle-1-n ui-sort-ltr"></span><span sort="desc" class="ui-grid-ico-sort ui-icon-desc ui-state-disabled ui-icon ui-icon-triangle-1-s ui-sort-ltr"></span></span></div>';
            var oTab=document.getElementById("tabGrid");
            var oTr=oTab.getElementsByTagName("tr");
            for(var i=1;i<oTr.length;i++)
            {
                oTr[i].children[0].innerHTML='<td role="gridcell" style="text-align:center;" title="" aria-describedby="tabGrid_ck"><input type="checkbox" /></td>';
            }

        }

        //判断是否点击了全选

        sel_all.onclick=function()
        {
            var checked=sel_all.children;
            checked=checked[0].children;
            checked=checked[0].checked;
            var oTab=document.getElementById("tabGrid");
            var oTr=oTab.getElementsByTagName("tr");
            if(checked)
            {

                for(var i=1;i<oTr.length;i++)
                {
                    oTr[i].children[0].children[0].checked=true;
                }
            }
            if(!checked)
            {
                for(var i=1;i<oTr.length;i++)
                {
                    oTr[i].children[0].children[0].checked=false;
                }
            }
        }


        //按键后动作
        dudu.onclick=function()
        {
            //获取表格元素
            var oTab=document.getElementById("tabGrid");
            var oTr=oTab.getElementsByTagName("tr");
            //构建学年数组,字符串类型
            var term=['0'];
            for(var i=1;i<oTr.length;i++)
            {   var flag=true;
                var oTrs=oTr[i];
                var xn;
                for(var j=0;j<term.length;j++)
                {
                    var oTds=oTrs.children;
                    if(oTds.length>2)
                    xn=oTds[1].innerText;
                    if(term[j]==xn)
                    flag=false;
                }
                if(flag==true)
                term.push(xn);
            }
            term.sort;
            //构建四个学年的每学期的必修,选修,辅修的学分绩之和和学分和
            var term_1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var term_2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var term_3=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var term_4=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var score_1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var score_2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var score_3=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var score_4=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            //遍历每一行,并将统计结果统计入上述四个数组
            for(i=1;i<oTr.length;i++)
            {
                var oTrs=oTr[i];
                var oTds=oTrs.children;
                if(oTds.length>1)
                {
                    var xn=oTds[1].innerText;
                    switch(xn)
                    {
                        case term[1]:
                            count(oTds,term_1,score_1);
                            break;
                        case term[2]:
                            count(oTds,term_2,score_2);
                            break;
                        case term[3]:
                            count(oTds,term_3,score_3);
                            break;
                        case term[4]:
                            count(oTds,term_4,score_4);
                            break;
                    }
                }

            }
            //将统计结果整理
            var avg_1=[0,0,0,0,0,0,0,0,0,0,0];
            var avg_2=[0,0,0,0,0,0,0,0,0,0,0];
            var avg_3=[0,0,0,0,0,0,0,0,0,0,0];
            var avg_4=[0,0,0,0,0,0,0,0,0,0,0];
            var avgs_1=[0,0,0,0,0,0,0,0,0,0,0];
            var avgs_2=[0,0,0,0,0,0,0,0,0,0,0];
            var avgs_3=[0,0,0,0,0,0,0,0,0,0,0];
            var avgs_4=[0,0,0,0,0,0,0,0,0,0,0];
            statistics(term_1,score_1,avg_1,avgs_1);
            statistics(term_2,score_2,avg_2,avgs_2);
            statistics(term_3,score_3,avg_3,avgs_3);
            statistics(term_4,score_4,avg_4,avgs_4);
            var avg_all=[0,0,0];
            avg_all[0]=(term_1[0]+term_1[4]+term_1[8]+term_2[0]+term_2[4]+term_2[8]+term_3[0]+term_3[4]+term_3[8]+term_4[0]+term_4[4]+term_4[8])/(term_1[1]+term_1[5]+term_1[9]+term_2[1]+term_2[5]+term_2[9]+term_3[1]+term_3[5]+term_3[9]+term_4[1]+term_4[5]+term_4[9]);
            avg_all[1]=(term_1[0]+term_1[4]+term_1[8]+term_2[0]+term_2[4]+term_2[8]+term_3[0]+term_3[4]+term_3[8]+term_4[0]+term_4[4]+term_4[8]+term_1[2]+term_1[6]+term_1[10]+term_2[2]+term_2[6]+term_2[10]+term_3[2]+term_3[6]+term_3[10]+term_4[2]+term_4[6]+term_4[10])/(term_1[1]+term_1[5]+term_1[9]+term_2[1]+term_2[5]+term_2[9]+term_3[1]+term_3[5]+term_3[9]+term_4[1]+term_4[5]+term_4[9]+term_1[3]+term_1[7]+term_1[11]+term_2[3]+term_2[7]+term_2[11]+term_3[3]+term_3[7]+term_3[11]+term_4[3]+term_4[7]+term_4[11]);
            avg_all[2]=(term_2[12]+term_2[14]+term_3[12]+term_3[14]+term_4[12]+term_4[14])/(term_2[13]+term_2[15]+term_3[13]+term_3[15]+term_4[13]+term_4[15]);
            var avgs_all=[0,0,0];
            avgs_all[0]=(score_1[0]+score_1[4]+score_1[8]+score_2[0]+score_2[4]+score_2[8]+score_3[0]+score_3[4]+score_3[8]+score_4[0]+score_4[4]+score_4[8])/(score_1[1]+score_1[5]+score_1[9]+score_2[1]+score_2[5]+score_2[9]+score_3[1]+score_3[5]+score_3[9]+score_4[1]+score_4[5]+score_4[9]);
            avgs_all[1]=(score_1[0]+score_1[4]+score_1[8]+score_2[0]+score_2[4]+score_2[8]+score_3[0]+score_3[4]+score_3[8]+score_4[0]+score_4[4]+score_4[8]+score_1[2]+score_1[6]+score_1[10]+score_2[2]+score_2[6]+score_2[10]+score_3[2]+score_3[6]+score_3[10]+score_4[2]+score_4[6]+score_4[10])/(score_1[1]+score_1[5]+score_1[9]+score_2[1]+score_2[5]+score_2[9]+score_3[1]+score_3[5]+score_3[9]+score_4[1]+score_4[5]+score_4[9]+score_1[3]+score_1[7]+score_1[11]+score_2[3]+score_2[7]+score_2[11]+score_3[3]+score_3[7]+score_3[11]+score_4[3]+score_4[7]+score_4[11]);
            avgs_all[2]=(score_2[12]+score_2[14]+score_3[12]+score_3[14]+score_4[12]+score_4[14])/(score_2[13]+score_2[15]+score_3[13]+score_3[15]+score_4[13]+score_4[15]);

            //将结果插入表格
            var row_0=document.getElementById("row_0").children;
            for(var i=1;i<term.length;i++)
            {
                row_0[i].innerText=term[i];
            }

            var row_1=document.getElementById("row_1").children;
            var row_2=document.getElementById("row_2").children;
            var row_3=document.getElementById("row_3").children;
            var row_4=document.getElementById("row_4").children;
            row_1[0].innerText=avg_all[0].toFixed(3)+"/"+avgs_all[0].toFixed(3);
            row_1[1].innerText=avg_all[1].toFixed(3)+"/"+avgs_all[1].toFixed(3);
            row_1[2].innerText=avg_all[2].toFixed(3)+"/"+avgs_all[2].toFixed(3);
            for(var i=0;i<3;i++)
            {
                if(row_1[i].innerText=="NaN/NaN")
                    row_1[i].innerText=" ";
            }

            for(var i=3;i<row_1.length;i++)
            {
                var avg;
                var avgs;
                var k=i-3;
                var j=Math.floor(k/4);
                switch(j)
                {
                    case 0:avg=avg_1;avgs=avgs_1;break;
                    case 1:avg=avg_2;avgs=avgs_2;break;
                    case 2:avg=avg_3;avgs=avgs_3;break;
                    case 3:avg=avg_4;avgs=avgs_4;break;
                }
                switch(k-4*j)
                {
                    case 0:break;
                    case 1:row_1[i].innerText=avg[0].toFixed(3)+"/"+avgs[0].toFixed(3);break;
                    case 2:row_1[i].innerText=avg[1].toFixed(3)+"/"+avgs[1].toFixed(3);break;
                    case 3:row_1[i].innerText=avg[8].toFixed(3)+"/"+avgs[8].toFixed(3);break;
                }
                if(row_1[i].innerText=="NaN/NaN")
                    row_1[i].innerText=" ";
            }

            for(var i=0;i<row_2.length;i++)
            {
                var avg;
                var k=i;
                var j=Math.floor(k/4);
                switch(j)
                {
                    case 0:avg=avg_1;avgs=avgs_1;break;
                    case 1:avg=avg_2;avgs=avgs_2;break;
                    case 2:avg=avg_3;avgs=avgs_3;break;
                    case 3:avg=avg_4;avgs=avgs_4;break;
                }
                switch(k-4*j)
                {
                    case 0:break;
                    case 1:row_2[i].innerText=avg[2].toFixed(3)+"/"+avgs[2].toFixed(3);break;
                    case 2:row_2[i].innerText=avg[3].toFixed(3)+"/"+avgs[3].toFixed(3);break;
                    case 3:row_2[i].innerText=avg[9].toFixed(3)+"/"+avgs[9].toFixed(3);break;
                }
                if(row_2[i].innerText=="NaN/NaN")
                    row_2[i].innerText=" ";
            }

            for(var i=0;i<row_3.length;i++)
            {
                var avg;
                var k=i;
                var j=Math.floor(k/4);
                switch(j)
                {
                    case 0:avg=avg_1;avgs=avgs_1;break;
                    case 1:avg=avg_2;avgs=avgs_2;break;
                    case 2:avg=avg_3;avgs=avgs_3;break;
                    case 3:avg=avg_4;avgs=avgs_4;break;
                }
                switch(k-4*j)
                {
                    case 0:break;
                    case 1:row_3[i].innerText=avg[4].toFixed(3)+"/"+avgs[4].toFixed(3);break;
                    case 2:row_3[i].innerText=avg[5].toFixed(3)+"/"+avgs[5].toFixed(3);break;
                    case 3:row_3[i].innerText="NaN";break;
                }
                if(row_3[i].innerText=="NaN/NaN"||row_3[i].innerText=="NaN")
                    row_3[i].innerText=" ";
            }

            for(var i=0;i<row_4.length;i++)
            {
                var avg;
                var k=i;
                var j=Math.floor(k/4);
                switch(j)
                {
                    case 0:avg=avg_1;avgs=avgs_1;break;
                    case 1:avg=avg_2;avgs=avgs_2;break;
                    case 2:avg=avg_3;avgs=avgs_3;break;
                    case 3:avg=avg_4;avgs=avgs_4;break;
                }
                switch(k-4*j)
                {
                    case 0:break;
                    case 1:row_4[i].innerText=avg[6].toFixed(3)+"/"+avgs[6].toFixed(3);break;
                    case 2:row_4[i].innerText=avg[7].toFixed(3)+"/"+avgs[7].toFixed(3);break;
                    case 3:row_4[i].innerText=avg[10].toFixed(3)+"/"+avgs[10].toFixed(3);break;
                }
                if(row_4[i].innerText=="NaN/NaN")
                    row_4[i].innerText=" ";
            }

        }
    }
)})();