GPA Calculator

A GPA Calculator of WHU

  1. // ==UserScript==
  2. // @name GPA Calculator
  3. // @version 1.2.1
  4. // @description A GPA Calculator of WHU
  5. // @author Jeoy_Pei
  6. // @license MIT
  7. // @match https://jwgl.whu.edu.cn/cjcx/cjcx_cxDgXscj.html?*
  8. // @grant none
  9. // @namespace https://gf.qytechs.cn/users/929066
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. // Your code here...
  16. //方法count用来将该行表格统计入相应的数组
  17. function count(oTd, arr1, arr2)
  18. {
  19. var kcxz=oTd[5].innerText;
  20. kcxz=kcxz.substring(kcxz.length-2);
  21. var kcbj=oTd[13].innerText;
  22. var xf=Number(oTd[6].innerText);
  23. var xfj=Number(oTd[24].innerText);
  24. var cj=oTd[7].innerText;
  25. var xq=Number(oTd[2].innerText);
  26. var xfcj;
  27. var check=oTd[0].children[0];
  28. var checked=1;
  29. if(check.checked==true||check.checked==false)
  30. {
  31. checked=(check.checked?1:0);
  32. }
  33.  
  34. if(cj!=="缓考")
  35. {
  36. xfcj=Number(cj)*xf;
  37. if(kcbj=="主修")
  38. {
  39. if(kcxz=="必修")
  40. {
  41. arr1[xq*4-4]+=xfj*checked;
  42. arr2[xq*4-4]+=xfcj*checked;
  43. arr1[xq*4-3]+=xf*checked;
  44. arr2[xq*4-3]+=xf*checked;
  45. }
  46. else
  47. {
  48. arr1[xq*4-2]+=xfj*checked;
  49. arr2[xq*4-2]+=xfcj*checked;
  50. arr1[xq*4-1]+=xf*checked;
  51. arr2[xq*4-1]+=xf*checked;
  52. }
  53. }
  54. else
  55. {
  56. arr1[xq*2+10]+=xfj*checked;
  57. arr2[xq*2+10]+=xfcj*checked;
  58. arr1[xq*2+11]+=xf*checked;
  59. arr2[xq*2+11]+=xf*checked;
  60. }
  61. }
  62. }
  63.  
  64. //方法statistics用来将数据整理
  65. function statistics(term,score,avg,avgs)
  66. {
  67. avg[0]=term[0]/term[1];
  68. avg[1]=(term[0]+term[2])/(term[1]+term[3]);
  69. avg[2]=term[4]/term[5];
  70. avg[3]=(term[4]+term[6])/(term[5]+term[7]);
  71. avg[4]=term[8]/term[9];
  72. avg[5]=(term[8]+term[10])/(term[9]+term[11]);
  73. avg[6]=(term[0]+term[4]+term[8])/(term[1]+term[5]+term[9]);
  74. 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]);
  75. avg[8]=term[12]/term[13];
  76. avg[9]=term[14]/term[15];
  77. avg[10]=(term[12]+term[14])/(term[13]+term[15])
  78. avgs[0]= score[0]/ score[1];
  79. avgs[1]=( score[0]+ score[2])/( score[1]+ score[3]);
  80. avgs[2]= score[4]/ score[5];
  81. avgs[3]=( score[4]+ score[6])/( score[5]+ score[7]);
  82. avgs[4]= score[8]/ score[9];
  83. avgs[5]=( score[8]+ score[10])/( score[9]+ score[11]);
  84. avgs[6]=( score[0]+ score[4]+ score[8])/( score[1]+ score[5]+ score[9]);
  85. 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]);
  86. avgs[8]= score[12]/ score[13];
  87. avgs[9]= score[14]/ score[15];
  88. avgs[10]=( score[12]+ score[14])/( score[13]+ score[15])
  89. }
  90.  
  91. $(document).ready(function()
  92. {
  93. //插入统计表
  94. var div_data=document.getElementById("div-data");
  95. var innerContainer=document.getElementById("innerContainer");
  96. var oRes=document.createElement("div");
  97. 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>';
  98. innerContainer.insertBefore(oRes,div_data);
  99. var oResss=document.getElementById("du");
  100. oResss.style.cssText="text-align:right;padding:16px;width:10000px";
  101. oRes.style.cssText="padding:40px;width:500px;overflow:auto;";
  102. var oRess=document.getElementsByClassName("jsres");
  103. for(var i=0;i<oRess.length;i++)
  104. {
  105. oRess[i].style.cssText="border:1px solid silver;text-align:center;padding:4px";
  106. }
  107. var dudu=document.getElementById("dudu");
  108. var select=document.getElementById("select");
  109. var sel_all=document.getElementById("jqgh_tabGrid_ck");
  110. select.onclick=function()
  111. {
  112. //加入复选框
  113.  
  114. 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>';
  115. var oTab=document.getElementById("tabGrid");
  116. var oTr=oTab.getElementsByTagName("tr");
  117. for(var i=1;i<oTr.length;i++)
  118. {
  119. oTr[i].children[0].innerHTML='<td role="gridcell" style="text-align:center;" title="" aria-describedby="tabGrid_ck"><input type="checkbox" /></td>';
  120. }
  121.  
  122. }
  123.  
  124. //判断是否点击了全选
  125.  
  126. sel_all.onclick=function()
  127. {
  128. var checked=sel_all.children;
  129. checked=checked[0].children;
  130. checked=checked[0].checked;
  131. var oTab=document.getElementById("tabGrid");
  132. var oTr=oTab.getElementsByTagName("tr");
  133. if(checked)
  134. {
  135.  
  136. for(var i=1;i<oTr.length;i++)
  137. {
  138. oTr[i].children[0].children[0].checked=true;
  139. }
  140. }
  141. if(!checked)
  142. {
  143. for(var i=1;i<oTr.length;i++)
  144. {
  145. oTr[i].children[0].children[0].checked=false;
  146. }
  147. }
  148. }
  149.  
  150.  
  151. //按键后动作
  152. dudu.onclick=function()
  153. {
  154. //获取表格元素
  155. var oTab=document.getElementById("tabGrid");
  156. var oTr=oTab.getElementsByTagName("tr");
  157. //构建学年数组,字符串类型
  158. var term=['0'];
  159. for(var i=1;i<oTr.length;i++)
  160. { var flag=true;
  161. var oTrs=oTr[i];
  162. var xn;
  163. for(var j=0;j<term.length;j++)
  164. {
  165. var oTds=oTrs.children;
  166. if(oTds.length>2)
  167. xn=oTds[1].innerText;
  168. if(term[j]==xn)
  169. flag=false;
  170. }
  171. if(flag==true)
  172. term.push(xn);
  173. }
  174. term.sort;
  175. //构建四个学年的每学期的必修,选修,辅修的学分绩之和和学分和
  176. var term_1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  177. var term_2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  178. var term_3=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  179. var term_4=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  180. var score_1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  181. var score_2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  182. var score_3=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  183. var score_4=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  184. //遍历每一行,并将统计结果统计入上述四个数组
  185. for(i=1;i<oTr.length;i++)
  186. {
  187. var oTrs=oTr[i];
  188. var oTds=oTrs.children;
  189. if(oTds.length>1)
  190. {
  191. var xn=oTds[1].innerText;
  192. switch(xn)
  193. {
  194. case term[1]:
  195. count(oTds,term_1,score_1);
  196. break;
  197. case term[2]:
  198. count(oTds,term_2,score_2);
  199. break;
  200. case term[3]:
  201. count(oTds,term_3,score_3);
  202. break;
  203. case term[4]:
  204. count(oTds,term_4,score_4);
  205. break;
  206. }
  207. }
  208.  
  209. }
  210. //将统计结果整理
  211. var avg_1=[0,0,0,0,0,0,0,0,0,0,0];
  212. var avg_2=[0,0,0,0,0,0,0,0,0,0,0];
  213. var avg_3=[0,0,0,0,0,0,0,0,0,0,0];
  214. var avg_4=[0,0,0,0,0,0,0,0,0,0,0];
  215. var avgs_1=[0,0,0,0,0,0,0,0,0,0,0];
  216. var avgs_2=[0,0,0,0,0,0,0,0,0,0,0];
  217. var avgs_3=[0,0,0,0,0,0,0,0,0,0,0];
  218. var avgs_4=[0,0,0,0,0,0,0,0,0,0,0];
  219. statistics(term_1,score_1,avg_1,avgs_1);
  220. statistics(term_2,score_2,avg_2,avgs_2);
  221. statistics(term_3,score_3,avg_3,avgs_3);
  222. statistics(term_4,score_4,avg_4,avgs_4);
  223. var avg_all=[0,0,0];
  224. 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]);
  225. 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]);
  226. 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]);
  227. var avgs_all=[0,0,0];
  228. 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]);
  229. 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]);
  230. 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]);
  231.  
  232. //将结果插入表格
  233. var row_0=document.getElementById("row_0").children;
  234. for(var i=1;i<term.length;i++)
  235. {
  236. row_0[i].innerText=term[i];
  237. }
  238.  
  239. var row_1=document.getElementById("row_1").children;
  240. var row_2=document.getElementById("row_2").children;
  241. var row_3=document.getElementById("row_3").children;
  242. var row_4=document.getElementById("row_4").children;
  243. row_1[0].innerText=avg_all[0].toFixed(3)+"/"+avgs_all[0].toFixed(3);
  244. row_1[1].innerText=avg_all[1].toFixed(3)+"/"+avgs_all[1].toFixed(3);
  245. row_1[2].innerText=avg_all[2].toFixed(3)+"/"+avgs_all[2].toFixed(3);
  246. for(var i=0;i<3;i++)
  247. {
  248. if(row_1[i].innerText=="NaN/NaN")
  249. row_1[i].innerText=" ";
  250. }
  251.  
  252. for(var i=3;i<row_1.length;i++)
  253. {
  254. var avg;
  255. var avgs;
  256. var k=i-3;
  257. var j=Math.floor(k/4);
  258. switch(j)
  259. {
  260. case 0:avg=avg_1;avgs=avgs_1;break;
  261. case 1:avg=avg_2;avgs=avgs_2;break;
  262. case 2:avg=avg_3;avgs=avgs_3;break;
  263. case 3:avg=avg_4;avgs=avgs_4;break;
  264. }
  265. switch(k-4*j)
  266. {
  267. case 0:break;
  268. case 1:row_1[i].innerText=avg[0].toFixed(3)+"/"+avgs[0].toFixed(3);break;
  269. case 2:row_1[i].innerText=avg[1].toFixed(3)+"/"+avgs[1].toFixed(3);break;
  270. case 3:row_1[i].innerText=avg[8].toFixed(3)+"/"+avgs[8].toFixed(3);break;
  271. }
  272. if(row_1[i].innerText=="NaN/NaN")
  273. row_1[i].innerText=" ";
  274. }
  275.  
  276. for(var i=0;i<row_2.length;i++)
  277. {
  278. var avg;
  279. var k=i;
  280. var j=Math.floor(k/4);
  281. switch(j)
  282. {
  283. case 0:avg=avg_1;avgs=avgs_1;break;
  284. case 1:avg=avg_2;avgs=avgs_2;break;
  285. case 2:avg=avg_3;avgs=avgs_3;break;
  286. case 3:avg=avg_4;avgs=avgs_4;break;
  287. }
  288. switch(k-4*j)
  289. {
  290. case 0:break;
  291. case 1:row_2[i].innerText=avg[2].toFixed(3)+"/"+avgs[2].toFixed(3);break;
  292. case 2:row_2[i].innerText=avg[3].toFixed(3)+"/"+avgs[3].toFixed(3);break;
  293. case 3:row_2[i].innerText=avg[9].toFixed(3)+"/"+avgs[9].toFixed(3);break;
  294. }
  295. if(row_2[i].innerText=="NaN/NaN")
  296. row_2[i].innerText=" ";
  297. }
  298.  
  299. for(var i=0;i<row_3.length;i++)
  300. {
  301. var avg;
  302. var k=i;
  303. var j=Math.floor(k/4);
  304. switch(j)
  305. {
  306. case 0:avg=avg_1;avgs=avgs_1;break;
  307. case 1:avg=avg_2;avgs=avgs_2;break;
  308. case 2:avg=avg_3;avgs=avgs_3;break;
  309. case 3:avg=avg_4;avgs=avgs_4;break;
  310. }
  311. switch(k-4*j)
  312. {
  313. case 0:break;
  314. case 1:row_3[i].innerText=avg[4].toFixed(3)+"/"+avgs[4].toFixed(3);break;
  315. case 2:row_3[i].innerText=avg[5].toFixed(3)+"/"+avgs[5].toFixed(3);break;
  316. case 3:row_3[i].innerText="NaN";break;
  317. }
  318. if(row_3[i].innerText=="NaN/NaN"||row_3[i].innerText=="NaN")
  319. row_3[i].innerText=" ";
  320. }
  321.  
  322. for(var i=0;i<row_4.length;i++)
  323. {
  324. var avg;
  325. var k=i;
  326. var j=Math.floor(k/4);
  327. switch(j)
  328. {
  329. case 0:avg=avg_1;avgs=avgs_1;break;
  330. case 1:avg=avg_2;avgs=avgs_2;break;
  331. case 2:avg=avg_3;avgs=avgs_3;break;
  332. case 3:avg=avg_4;avgs=avgs_4;break;
  333. }
  334. switch(k-4*j)
  335. {
  336. case 0:break;
  337. case 1:row_4[i].innerText=avg[6].toFixed(3)+"/"+avgs[6].toFixed(3);break;
  338. case 2:row_4[i].innerText=avg[7].toFixed(3)+"/"+avgs[7].toFixed(3);break;
  339. case 3:row_4[i].innerText=avg[10].toFixed(3)+"/"+avgs[10].toFixed(3);break;
  340. }
  341. if(row_4[i].innerText=="NaN/NaN")
  342. row_4[i].innerText=" ";
  343. }
  344.  
  345. }
  346. }
  347. )})();

QingJ © 2025

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