public void CalculateScore(ReportStudent student) { ItemWeightCollection subjectWeight = new ItemWeightCollection(); foreach (string each in Subjects) { if (student.Scores[SubjectToken].Contains(each)) { subjectWeight.Add(each, student.Scores[SubjectToken].Weights[each]); } } ItemWeightCollection domainWeight = new ItemWeightCollection(); foreach (string each in Domains) { if (student.Scores[DomainToken].Contains(each)) { domainWeight.Add(each, student.Scores[DomainToken].Weights[each]); } } if (subjectWeight.Count <= 0 && domainWeight.Count <= 0) { return; } student.Scores[TargetToken].Clear(); student.Scores[TargetToken].Add("加權平均", 加權平均(student, subjectWeight, domainWeight), 0); student.Scores[TargetToken].Add("加權總分", 加權總分(student, subjectWeight, domainWeight), 0); student.Scores[TargetToken].Add("合計總分", 合計總分(student, subjectWeight, domainWeight), 0); student.Scores[TargetToken].Add("算術平均", 算術平均(student, subjectWeight, domainWeight), 0); }
private decimal 加權平均(ReportStudent student, ItemWeightCollection subjectWeight, ItemWeightCollection domainWeight) { // 如果學生有成績計算規則使用學生,沒有使用預設2位。 if (student.StudScoreCalculator == null) { decimal sum = 0, weight = subjectWeight.GetWeightSum() + domainWeight.GetWeightSum(); foreach (string scoreItem in subjectWeight.Keys) { sum += (student.Scores[SubjectToken][scoreItem] * subjectWeight[scoreItem]); } foreach (string scoreItem in domainWeight.Keys) { sum += (student.Scores[DomainToken][scoreItem] * domainWeight[scoreItem]); } return(Round(sum / weight)); } else { decimal sumS = 0, sumD = 0, avgS = 0, avgD = 0, wS = subjectWeight.GetWeightSum(), wD = domainWeight.GetWeightSum(); decimal sumAll = 0, avgAll = 0; foreach (string scoreItem in subjectWeight.Keys) { sumS += (student.Scores[SubjectToken][scoreItem] * subjectWeight[scoreItem]); sumAll += (student.Scores[SubjectToken][scoreItem] * subjectWeight[scoreItem]); } foreach (string scoreItem in domainWeight.Keys) { sumD += (student.Scores[DomainToken][scoreItem] * domainWeight[scoreItem]); sumAll += (student.Scores[DomainToken][scoreItem] * domainWeight[scoreItem]); } // 當科目與領域混用,進位方式使用領域。 if (wS > 0 && wD > 0) { avgAll = student.StudScoreCalculator.ParseDomainScore(sumAll / (wS + wD)); return(avgAll); } else { if (wS > 0) { avgS = student.StudScoreCalculator.ParseSubjectScore(sumS / wS); } if (wD > 0) { avgD = student.StudScoreCalculator.ParseDomainScore(sumD / wD); } return(avgS + avgD); } } }
public MainForm(List <string> classes) { InitializeComponent(); //準備相關學生、班級資料。 ReportStudent.SetClassMapping(JHClass.SelectAll()); SelectedClasses = JHClass.SelectByIDs(classes); //要列印成績單的班級清單。 AllStudents = JHStudent.SelectAll().ToReportStudent(); }
private decimal 算術平均(ReportStudent student, ItemWeightCollection subjectWeight, ItemWeightCollection domainWeight) { // 如果學生有成績計算規則使用學生,沒有使用預設2位。 if (student.StudScoreCalculator == null) { decimal sum = 0, weight = subjectWeight.Count + domainWeight.Count; foreach (string scoreItem in subjectWeight.Keys) { sum += student.Scores[SubjectToken][scoreItem]; } foreach (string scoreItem in domainWeight.Keys) { sum += student.Scores[DomainToken][scoreItem]; } return(Round(sum / weight)); } else { decimal sumS = 0, sumD = 0, avgS = 0, avgD = 0, sumAll = 0, avgAll = 0; foreach (string scoreItem in subjectWeight.Keys) { sumS += student.Scores[SubjectToken][scoreItem]; sumAll += student.Scores[SubjectToken][scoreItem]; } foreach (string scoreItem in domainWeight.Keys) { sumD += student.Scores[DomainToken][scoreItem]; sumAll += student.Scores[DomainToken][scoreItem]; } // 當科目與領域混用,進位方式使用領域 if (subjectWeight.Count > 0 && domainWeight.Count > 0) { avgAll = student.StudScoreCalculator.ParseDomainScore(sumAll / (subjectWeight.Count + domainWeight.Count)); return(avgAll); } else { if (subjectWeight.Count > 0) { avgS = student.StudScoreCalculator.ParseSubjectScore(sumS / subjectWeight.Count); } if (domainWeight.Count > 0) { avgD = student.StudScoreCalculator.ParseDomainScore(sumD / domainWeight.Count); } return(avgS + avgD); } } }
private decimal 加權總分(ReportStudent student, ItemWeightCollection subjectWeight, ItemWeightCollection domainWeight) { decimal sum = 0; foreach (string scoreItem in subjectWeight.Keys) { sum += (student.Scores[SubjectToken][scoreItem] * subjectWeight[scoreItem]); } foreach (string scoreItem in domainWeight.Keys) { sum += (student.Scores[DomainToken][scoreItem] * domainWeight[scoreItem]); } return(sum); }
private decimal 算術平均(ReportStudent student, ItemWeightCollection subjectWeight, ItemWeightCollection domainWeight) { decimal sum = 0, weight = subjectWeight.Count + domainWeight.Count; foreach (string scoreItem in subjectWeight.Keys) { sum += student.Scores[SubjectToken][scoreItem]; } foreach (string scoreItem in domainWeight.Keys) { sum += student.Scores[DomainToken][scoreItem]; } return(Round(sum / weight)); }
private decimal 加權平均(ReportStudent student, ItemWeightCollection subjectWeight, ItemWeightCollection domainWeight) { decimal sum = 0, weight = subjectWeight.GetWeightSum() + domainWeight.GetWeightSum(); foreach (string scoreItem in subjectWeight.Keys) { sum += (student.Scores[SubjectToken][scoreItem] * subjectWeight[scoreItem]); } foreach (string scoreItem in domainWeight.Keys) { sum += (student.Scores[DomainToken][scoreItem] * domainWeight[scoreItem]); } return(Round(sum / weight)); }
private void MasterWorker_DoWork(object sender, DoWorkEventArgs e) { //1.Goup By 可選擇的科目清單。 //2.寫入成績資料到 ReportStudent 上。 int schoolYear = Semester.SelectedSchoolYear; int semester = Semester.SelectedSemester; FunctionSpliter <string, JHSemesterScoreRecord> selectData = new FunctionSpliter <string, JHSemesterScoreRecord>(1000, 5); selectData.Function = delegate(List <string> ps) { return(JHSemesterScore.SelectBySchoolYearAndSemester(ps, schoolYear, semester)); }; List <JHSemesterScoreRecord> semsScores = selectData.Execute(AllStudents.ToKeys()); GroupBySubjects(semsScores); //先把學生身上的成績、排名相關資料清掉。 foreach (ReportStudent each in AllStudents) { each.Clear(); each.Scores.Add(Utilities.SubjectToken, new ScoreCollection()); //科目成績。 each.Scores.Add(Utilities.DomainToken, new ScoreCollection()); //領域成績。 each.Scores.Add(Utilities.SummaryToken, new ScoreCollection()); //運算後的成績。 } //將成績填到學生身上。 Dictionary <string, ReportStudent> dicAllStudent = AllStudents.ToDictionary(); foreach (JHSemesterScoreRecord eachScore in semsScores) { //如果找不到該學生,跳到下一筆。 if (!dicAllStudent.ContainsKey(eachScore.RefStudentID)) { continue; } ReportStudent student = dicAllStudent[eachScore.RefStudentID]; //科目成績。 foreach (SubjectScore each in eachScore.Subjects.Values) { // 初始執 decimal ss = -1; if (Perference.UserSelScoreType == "原始成績") { if (each.ScoreOrigin.HasValue) { ss = each.ScoreOrigin.Value; } } if (Perference.UserSelScoreType == "原始補考擇優") { // 成績 if (each.Score.HasValue && each.Score.Value > ss) { ss = each.Score.Value; } } // if (!each.Score.HasValue) continue; //沒有分數不處理。 if (ss == -1) { continue; } if (!each.Credit.HasValue || each.Credit.Value < 0) { continue; //沒有節數不處理。 //2021-07 要求權重0也要印出 } if (!student.Scores[Utilities.SubjectToken].Contains(each.Subject)) { student.Scores[Utilities.SubjectToken].Add(each.Subject, ss, each.Credit.Value); if (Perference.UserSelScoreType == "原始補考擇優" && each.ScoreMakeup.HasValue) { student.Scores[Utilities.DomainToken].AddReExam(each.Subject, each.ScoreMakeup.Value); } } } //領域成績。 foreach (DomainScore each in eachScore.Domains.Values) { decimal dd = -1; if (Perference.UserSelScoreType == "原始成績") { if (each.ScoreOrigin.HasValue) { dd = each.ScoreOrigin.Value; } } if (Perference.UserSelScoreType == "原始補考擇優") { if (each.Score.HasValue && each.Score.Value > dd) { dd = each.Score.Value; } } //if (!each.Score.HasValue) continue; if (dd == -1) { continue; } if (!each.Credit.HasValue || each.Credit.Value < 0) { continue; //2021-07 要求權重0也要印出 } if (!student.Scores[Utilities.DomainToken].Contains(each.Domain)) { student.Scores[Utilities.DomainToken].Add(each.Domain, dd, each.Credit.Value); if (Perference.UserSelScoreType == "原始補考擇優" && each.ScoreMakeup.HasValue) { student.Scores[Utilities.DomainToken].AddReExam(each.Domain, each.ScoreMakeup.Value); } } } //運算後成績是在使用者按下列印時才計算。 //因為需要依據使用者選擇的科目進行計算。 } }
private void MasterWorker_DoWork(object sender, DoWorkEventArgs e) { //1.Goup By 可選擇的科目清單。 //2.寫入成績資料到 ReportStudent 上。 int schoolYear = Semester.SelectedSchoolYear; int semester = Semester.SelectedSemester; FunctionSpliter <string, JHSemesterScoreRecord> selectData = new FunctionSpliter <string, JHSemesterScoreRecord>(1000, 5); selectData.Function = delegate(List <string> ps) { return(JHSemesterScore.SelectBySchoolYearAndSemester(ps, schoolYear, semester)); }; List <JHSemesterScoreRecord> semsScores = selectData.Execute(AllStudents.ToKeys()); GroupBySubjects(semsScores); //先把學生身上的成績、排名相關資料清掉。 foreach (ReportStudent each in AllStudents) { each.Clear(); each.Scores.Add(Utilities.SubjectToken, new ScoreCollection()); //科目成績。 each.Scores.Add(Utilities.DomainToken, new ScoreCollection()); //領域成績。 each.Scores.Add(Utilities.SummaryToken, new ScoreCollection()); //運算後的成績。 } //將成績填到學生身上。 Dictionary <string, ReportStudent> dicAllStudent = AllStudents.ToDictionary(); foreach (JHSemesterScoreRecord eachScore in semsScores) { //如果找不到該學生,跳到下一筆。 if (!dicAllStudent.ContainsKey(eachScore.RefStudentID)) { continue; } ReportStudent student = dicAllStudent[eachScore.RefStudentID]; //科目成績。 foreach (SubjectScore each in eachScore.Subjects.Values) { if (!each.Score.HasValue) { continue; //沒有分數不處理。 } if (!each.Credit.HasValue || each.Credit.Value <= 0) { continue; //沒有節數不處理。 } if (!student.Scores[Utilities.SubjectToken].Contains(each.Subject)) { student.Scores[Utilities.SubjectToken].Add(each.Subject, each.Score.Value, each.Credit.Value); } } //領域成績。 foreach (DomainScore each in eachScore.Domains.Values) { if (!each.Score.HasValue) { continue; } if (!each.Credit.HasValue || each.Credit.Value <= 0) { continue; } student.Scores[Utilities.DomainToken].Add(each.Domain, each.Score.Value, each.Credit.Value); } //運算後成績是在使用者按下列印時才計算。 //因為需要依據使用者選擇的科目進行計算。 } }