//依名次排序副程式 private int CompareCode(StudentData a, StudentData b) { switch (cboReportSortType.Text) { case "班級總分排名": return a.ClassSumRank.CompareTo(b.ClassSumRank); case "班級加權總分排名": return a.ClassSumRankA.CompareTo(b.ClassSumRankA); case "班級平均排名": return a.ClassAvgRank.CompareTo(b.ClassAvgRank); case "班級加權平均排名": return a.ClassAvgRankA.CompareTo(b.ClassAvgRankA); case "總分年排名": return a.YearSumRank.CompareTo(b.YearSumRank); case "加權總分年排名": return a.YearSumRankA.CompareTo(b.YearSumRankA); case "加權平均年排名": return a.YearAvgRankA.CompareTo(b.YearAvgRankA); case "班級加權平均排名進步": return a.ClassAvgRankAD.CompareTo(b.ClassAvgRankAD); case "班級加權平均成績進步排名": return a.ClassAvgRankAS.CompareTo(b.ClassAvgRankAS); } return 0; }
private void Calc_ScoreAndRank() { bool chkBtn1 = true; bool chkBtn2 = true; if (rb01.Checked == true || rb02.Checked == true) if (cboSortType.Text == "" && cbClass.Checked == false && cbYear.Checked == false) chkBtn1 = false; if (rb05.Checked == true || rb06.Checked == true || rb04.Checked == true) if (cboExamlst.Text == "") chkBtn1 = false; if (rb01.Checked == false && rb02.Checked == false && rb03.Checked == false && rb05.Checked == false && rb06.Checked == false && rb04.Checked == false) chkBtn2 = false; // 加權總分 decimal SumSubjScoreA = 0; // 總分 decimal SumSubjScore = 0; // 學分數加總 int SumSubjCredits = 0; // 科目個數加總 int SumSubjCots = 0; // 前次試別 // 加權總分 decimal SumSubj1ScoreA = 0; // 總分 decimal SumSubj1Score = 0; // 學分數加總 int SumSubj1Credits = 0; // 科目個數加總 int SumSubj1Cots = 0; if (cboExam.Text != "" && chkBtn1 != false && chkBtn2 != false) { StudDatas.Clear(); StudMissingExam.Clear(); // 小郭. 2013/12/17 //foreach (ClassRecord cr in ClassRecs ) //{ foreach (StudentRecord StudRec in StudRecs) { // 檢查是否有缺考, 小郭. 2013/12/17 if (IsMissingExam(StudRec) == true) { StudMissingExam.Add(StudRec); continue; } StudentData sd = new StudentData(); sd.StudentID = StudRec.StudentID; sd.StudentNum = StudRec.StudentNumber; sd.ClassName = StudRec.RefClass.ClassName; sd.SeatNo = StudRec.SeatNo; sd.Name = StudRec.StudentName; sd.ClassYear = StudRec.RefClass.GradeYear; // 初始化 SumSubjCots = 0; SumSubjCredits = 0; SumSubjScoreA = 0; SumSubjScore = 0; // SumSubj1Cots = 0; SumSubj1Credits = 0; SumSubj1ScoreA = 0; SumSubj1Score = 0; sd.AvgScore = -1; sd.AvgScoreA = -1; sd.ClassAvgRank = 0; sd.ClassAvgRankA = 0; sd.ClassSumRank = 0; sd.ClassSumRankA = 0; sd.SumScore = -1; sd.SumScoreA = -1; sd.AvgScore1 = -1; sd.AvgScoreA1 = -1; sd.ClassAvgRank1 = 0; sd.ClassAvgRankA1 = 0; sd.ClassSumRank1 = 0; sd.ClassSumRankA1 = 0; sd.SumScore1 = -1; sd.SumScoreA1 = -1; string abc; // 加入考試成績 and 計算 foreach (ExamScoreInfo esi in StudRec.ExamScoreList) { abc = esi.ExamName + esi.Subject + esi.SubjectLevel + esi.StudentName; if (cboExam.Text == esi.ExamName || cboExamlst.Text == esi.ExamName) { if ((rb01.Checked == true || rb02.Checked == true) && cboSortType.Text == "科目排名") { if ((esi.Subject + esi.SubjectLevel) == lbxSubjct.Text) { ExamData ed = new ExamData(); ed.CousreID = esi.CourseID; ed.CourseName = esi.CourseName; ed.Credit = esi.Credit; ed.ExamName = esi.ExamName; ed.SubjectName = esi.Subject; ed.SubjectLevel = esi.SubjectLevel; ed.SchoolYear = esi.SchoolYear; ed.Semester = esi.Semester; ed.Score = esi.ExamScore; //判斷科目是否重覆,未重覆再加入 Boolean chkData = false; foreach (ExamData est in sd.lstStudExamScore) if ((ed.CousreID + ed.ExamName + ed.SubjectName + ed.SubjectLevel) == (est.CousreID + est.ExamName + est.SubjectName + est.SubjectLevel)) chkData = true; if (!chkData) { sd.lstStudExamScore.Add(ed); SumSubjScoreA += esi.ExamScore * esi.Credit; SumSubjScore += esi.ExamScore; SumSubjCredits += esi.Credit; SumSubjCots++; } ed = null; } } else { foreach (ListViewItem selSubject in lstSubject.CheckedItems) { if ((esi.Subject + esi.SubjectLevel) == selSubject.Text) { ExamData ed = new ExamData(); ed.CousreID = esi.CourseID; ed.CourseName = esi.CourseName; ed.Credit = esi.Credit; ed.ExamName = esi.ExamName; ed.SubjectName = esi.Subject; ed.SubjectLevel = esi.SubjectLevel; ed.SchoolYear = esi.SchoolYear; ed.Semester = esi.Semester; ed.Score = esi.ExamScore; //判斷科目是否重覆,未重覆再加入 Boolean chkData = false; foreach (ExamData est in sd.lstStudExamScore) if ((ed.CousreID + ed.ExamName + ed.SubjectName + ed.SubjectLevel) == (est.CousreID + est.ExamName + est.SubjectName + est.SubjectLevel)) chkData = true; if (!chkData) { if (cboExamlst.Text == esi.ExamName) { sd.lstStudExamScoreOld.Add(ed); SumSubj1ScoreA += esi.ExamScore * esi.Credit; SumSubj1Score += esi.ExamScore; SumSubj1Credits += esi.Credit; SumSubj1Cots++; } if (cboExam.Text == esi.ExamName) { sd.lstStudExamScore.Add(ed); SumSubjScoreA += esi.ExamScore * esi.Credit; SumSubjScore += esi.ExamScore; SumSubjCredits += esi.Credit; SumSubjCots++; } } ed = null; } } } } } // 有成績才計算 if (SumSubjCots > 0) { sd.SumScore = SumSubjScore; sd.SumScoreA = SumSubjScoreA; sd.AvgScore = Math.Round(SumSubjScore / SumSubjCots, 2, MidpointRounding.AwayFromZero); sd.AvgScoreA = Math.Round(SumSubjScoreA / SumSubjCredits, 2, MidpointRounding.AwayFromZero); } // 有成績才計算 if (SumSubj1Cots > 0) { sd.SumScore1 = SumSubj1Score; sd.SumScoreA1 = SumSubj1ScoreA; sd.AvgScore1 = Math.Round(SumSubj1Score / SumSubj1Cots, 2, MidpointRounding.AwayFromZero); sd.AvgScoreA1 = Math.Round(SumSubj1ScoreA / SumSubj1Credits, 2, MidpointRounding.AwayFromZero); } StudDatas.Add(sd); } // StudRec // 班排名 List<decimal> tmpSumRank = new List<decimal>(); List<decimal> tmpSumRankA = new List<decimal>(); List<decimal> tmpAvgRank = new List<decimal>(); List<decimal> tmpAvgRankA = new List<decimal>(); foreach (ClassRecord cr in ClassRecs) { foreach (StudentData sd in StudDatas) if (cr.ClassName == sd.ClassName) { tmpSumRank.Add(sd.SumScore); tmpSumRankA.Add(sd.SumScoreA); tmpAvgRank.Add(sd.AvgScore); tmpAvgRankA.Add(sd.AvgScoreA); } tmpAvgRank.Sort(); tmpAvgRank.Reverse(); tmpAvgRankA.Sort(); tmpAvgRankA.Reverse(); tmpSumRank.Sort(); tmpSumRank.Reverse(); tmpSumRankA.Sort(); tmpSumRankA.Reverse(); // 放入排名 foreach (StudentData sd in StudDatas) if (cr.ClassName == sd.ClassName) { sd.ClassSumRank = tmpSumRank.IndexOf(sd.SumScore) + 1; sd.ClassSumRankA = tmpSumRankA.IndexOf(sd.SumScoreA) + 1; sd.ClassAvgRank = tmpAvgRank.IndexOf(sd.AvgScore) + 1; sd.ClassAvgRankA = tmpAvgRankA.IndexOf(sd.AvgScoreA) + 1; } tmpAvgRank.Clear(); tmpAvgRankA.Clear(); tmpSumRank.Clear(); tmpSumRankA.Clear(); } // 年排名(select) foreach (StudentData sd in StudDatas) { tmpSumRank.Add(sd.SumScore); tmpSumRankA.Add(sd.SumScoreA); tmpAvgRank.Add(sd.AvgScore); tmpAvgRankA.Add(sd.AvgScoreA); } tmpAvgRank.Sort(); tmpAvgRank.Reverse(); tmpAvgRankA.Sort(); tmpAvgRankA.Reverse(); tmpSumRank.Sort(); tmpSumRank.Reverse(); tmpSumRankA.Sort(); tmpSumRankA.Reverse(); // 放入排名 foreach (StudentData sd in StudDatas) { sd.YearSumRank = tmpSumRank.IndexOf(sd.SumScore) + 1; sd.YearSumRankA = tmpSumRankA.IndexOf(sd.SumScoreA) + 1; sd.YearAvgRank = tmpAvgRank.IndexOf(sd.AvgScore) + 1; sd.YearAvgRankA = tmpAvgRankA.IndexOf(sd.AvgScoreA) + 1; } tmpAvgRank.Clear(); tmpAvgRankA.Clear(); tmpSumRank.Clear(); tmpSumRankA.Clear(); //計算前次試別排名 if (rb05.Checked == true || rb04.Checked == true) { List<decimal> tmpAvgRankAD = new List<decimal>(); List<decimal> tmpAvgRankAS = new List<decimal>(); //班排名 foreach (ClassRecord cr in ClassRecs) { foreach (StudentData sd in StudDatas) if (cr.ClassName == sd.ClassName) { tmpSumRank.Add(sd.SumScore1); tmpSumRankA.Add(sd.SumScoreA1); tmpAvgRank.Add(sd.AvgScore1); tmpAvgRankA.Add(sd.AvgScoreA1); } tmpAvgRank.Sort(); tmpAvgRank.Reverse(); tmpAvgRankA.Sort(); tmpAvgRankA.Reverse(); tmpSumRank.Sort(); tmpSumRank.Reverse(); tmpSumRankA.Sort(); tmpSumRankA.Reverse(); // 放入排名 foreach (StudentData sd in StudDatas) if (cr.ClassName == sd.ClassName) { sd.ClassSumRank1 = tmpSumRank.IndexOf(sd.SumScore1) + 1; sd.ClassSumRankA1 = tmpSumRankA.IndexOf(sd.SumScoreA1) + 1; sd.ClassAvgRank1 = tmpAvgRank.IndexOf(sd.AvgScore1) + 1; sd.ClassAvgRankA1 = tmpAvgRankA.IndexOf(sd.AvgScoreA1) + 1; if (sd.AvgScoreA != -1 && sd.AvgScoreA1 != -1) { tmpAvgRankAD.Add(sd.ClassAvgRankA1 - sd.ClassAvgRankA); tmpAvgRankAS.Add(sd.AvgScoreA - sd.AvgScoreA1); } } tmpAvgRankAD.Sort(); tmpAvgRankAD.Reverse(); tmpAvgRankAS.Sort(); tmpAvgRankAS.Reverse(); foreach (StudentData sd in StudDatas) if (cr.ClassName == sd.ClassName) { if (sd.AvgScoreA != -1 && sd.AvgScoreA1 != -1) { sd.ClassAvgRankAD = tmpAvgRankAD.IndexOf(sd.ClassAvgRankA1 - sd.ClassAvgRankA) + 1; sd.ClassAvgRankAS = tmpAvgRankAS.IndexOf(sd.AvgScoreA - sd.AvgScoreA1) + 1; } else { sd.ClassAvgRankAD = -99; sd.ClassAvgRankAS = -99; } } tmpAvgRankAD.Clear(); tmpAvgRank.Clear(); tmpAvgRankA.Clear(); tmpSumRank.Clear(); tmpSumRankA.Clear(); tmpAvgRankAS.Clear(); } // 年排名(select) foreach (StudentData sd in StudDatas) { tmpSumRank.Add(sd.SumScore1); tmpSumRankA.Add(sd.SumScoreA1); tmpAvgRank.Add(sd.AvgScore1); tmpAvgRankA.Add(sd.AvgScoreA1); } tmpAvgRank.Sort(); tmpAvgRank.Reverse(); tmpAvgRankA.Sort(); tmpAvgRankA.Reverse(); tmpSumRank.Sort(); tmpSumRank.Reverse(); tmpSumRankA.Sort(); tmpSumRankA.Reverse(); // 放入排名 foreach (StudentData sd in StudDatas) { sd.YearSumRank1 = tmpSumRank.IndexOf(sd.SumScore) + 1; sd.YearSumRankA1 = tmpSumRankA.IndexOf(sd.SumScoreA) + 1; sd.YearAvgRank1 = tmpAvgRank.IndexOf(sd.AvgScore) + 1; sd.YearAvgRankA1 = tmpAvgRankA.IndexOf(sd.AvgScoreA) + 1; } tmpAvgRank.Clear(); tmpAvgRankA.Clear(); tmpSumRank.Clear(); tmpSumRankA.Clear(); } if (lbxSubjct.Visible == true && cboExam.Text != "") { // 班科排名 List<Decimal> tmpSubjRank = new List<decimal>(); foreach (ClassRecord cr in ClassRecs) { foreach (StudentData sd in StudDatas) { if (cr.ClassName == sd.ClassName) foreach (ExamData ed in sd.lstStudExamScore) if ((ed.SubjectName + ed.SubjectLevel) == lbxSubjct.Text && (ed.ExamName == cboExam.Text)) tmpSubjRank.Add(ed.Score); } tmpSubjRank.Sort(); tmpSubjRank.Reverse(); foreach (StudentData sd in StudDatas) { if (cr.ClassName == sd.ClassName) foreach (ExamData ed in sd.lstStudExamScore) if ((ed.SubjectName + ed.SubjectLevel) == lbxSubjct.Text && (ed.ExamName == cboExam.Text)) ed.ClassScoreRank = tmpSubjRank.IndexOf(ed.Score) + 1; } tmpSubjRank.Clear(); } // 年科排名 foreach (StudentData sd in StudDatas) { foreach (ExamData ed in sd.lstStudExamScore) if ((ed.SubjectName + ed.SubjectLevel) == lbxSubjct.Text && (ed.ExamName == cboExam.Text)) tmpSubjRank.Add(ed.Score); } tmpSubjRank.Sort(); tmpSubjRank.Reverse(); foreach (StudentData sd in StudDatas) { foreach (ExamData ed in sd.lstStudExamScore) if ((ed.SubjectName + ed.SubjectLevel) == lbxSubjct.Text && (ed.ExamName == cboExam.Text)) ed.YearScoreRank = tmpSubjRank.IndexOf(ed.Score) + 1; } tmpSubjRank.Clear(); } } else MessageBox.Show("排名方式或排名名次設定不完整!"); }