private static void CalculateKHAttendEffort(AttendScore attend) { decimal sum = 0, weight = 0; if (attend.OrdinarilyEffort.HasValue) { sum += attend.OrdinarilyEffort.Value; weight++; } decimal?avgEffort = attend.Subscores.GetAverageEffort(); if (avgEffort.HasValue) { sum += avgEffort.Value; weight++; } //如果權重小於零,代表兩個成績都沒有,就維持原來成績。 if (weight != 0) { decimal result = Math.Ceiling(sum / weight); attend.Effort = (int)((result >= 5) ? 5 : result); } else { attend.Effort = null; } }
private static void CalculateKHAttendScore(AttendScore attend) { decimal sum = 0, weight = 0; if (attend.OrdinarilyScore.HasValue) { sum += attend.OrdinarilyScore.Value; weight++; } decimal?avgScore = attend.Subscores.GetWeightAverageScore(); if (avgScore.HasValue) { sum += avgScore.Value; weight++; } if (weight != 0) { attend.Value = (sum / weight); } else { attend.Value = null; } }
public List <StudentScore> Calculate() { List <StudentScore> noneCalcs = new List <StudentScore>(); foreach (StudentScore student in Students) { if (student.AttendScore.Count <= 0) { noneCalcs.Add(student); continue; } foreach (string subject in student.AttendScore) { if (string.IsNullOrEmpty(subject)) { continue; //沒有科目名稱,不計算成績。 } AttendScore attend = student.AttendScore[subject]; if (Program.Mode == ModuleMode.HsinChu) //新竹課程文字描述是從評量文字描述加總。 { //沒有任何定考成績的話,就維持原來的修課成績。 decimal?v = attend.Subscores.GetWeightAverageScore(); attend.Value = v.HasValue ? v : null; if (attend.Value != null) { attend.Value = student.CalculationRule.ParseAttendScore(attend.Value.Value); } attend.Text = attend.Subscores.GetJoinText(); } if (Program.Mode == ModuleMode.KaoHsiung) //高雄的課程平時評量計算。 { /** 以下兩段程式在 2010/6/28 號討論後修改算法,與會人:蔡主任、呂韻如、黃耀明、張騉翔*/ //if (attend.OrdinarilyScore.HasValue && attend.Value.HasValue) //attend.Value = (attend.Value + attend.OrdinarilyScore.Value) / 2m; CalculateKHAttendScore(attend); //if (attend.OrdinarilyEffort.HasValue && attend.Effort.HasValue) //{ // decimal result = Math.Ceiling((attend.Effort.Value + attend.OrdinarilyEffort.Value) / 2m); // attend.Effort = (int)((result >= 5) ? 5 : result); //} CalculateKHAttendEffort(attend); if (attend.Value != null) { attend.Value = student.CalculationRule.ParseAttendScore(attend.Value.Value); } } } } return(noneCalcs); }
public void Save() { #region 儲存課程成績。 List <JHSCAttendRecord> attends = new List <JHSCAttendRecord>(); foreach (StudentScore student in Students) { foreach (string subject in student.AttendScore) { if (FilterSubject.Contains(subject) || FilterSubject.Count <= 0) { AttendScore attend = student.AttendScore[subject]; JHSCAttendRecord DALAttend = attend.RawAttend; DALAttend.Score = attend.Value; DALAttend.Effort = attend.Effort; DALAttend.Text = attend.Text; attends.Add(DALAttend); } } } if (attends.Count <= 0) { return; } FunctionSpliter <JHSCAttendRecord, JHSCAttendRecord> spliter = new FunctionSpliter <JHSCAttendRecord, JHSCAttendRecord>(300 * 10, Util.MaxThread); spliter.Function = delegate(List <JHSCAttendRecord> attendPart) { JHSCAttend.Update(attendPart); return(new List <JHSCAttendRecord>()); }; spliter.ProgressChange = delegate(int progress) { Reporter.Feedback("儲存計算結果...", Util.CalculatePercentage(attends.Count, progress)); }; spliter.Execute(attends); #endregion }
private static void CalculateKHAttendEffort(AttendScore attend) { decimal sum = 0, weight = 0; decimal ordinarilyWeight = 60, avgScoreWeight = 40; //103學年度前的成績以50:50比例計算 if (attend.SchoolYear.HasValue && attend.SchoolYear.Value <= 102) { ordinarilyWeight = 50; avgScoreWeight = 50; } if (attend.OrdinarilyEffort.HasValue) { sum += (attend.OrdinarilyEffort.Value * ordinarilyWeight); weight += ordinarilyWeight; } decimal?avgEffort = attend.Subscores.GetAverageEffort(); if (avgEffort.HasValue) { sum += (avgEffort.Value * avgScoreWeight); weight += avgScoreWeight; } //如果權重小於零,代表兩個成績都沒有,就維持原來成績。 if (weight != 0) { decimal result = Math.Ceiling(sum / weight); attend.Effort = (int)((result >= 5) ? 5 : result); } else { attend.Effort = null; } }
private static void CalculateKHAttendScore(AttendScore attend) { decimal sum = 0, weight = 0; decimal ordinarilyWeight = 60, avgScoreWeight = 40; //103學年度前的成績以50:50比例計算 if (attend.SchoolYear.HasValue && attend.SchoolYear.Value <= 102) { ordinarilyWeight = 50; avgScoreWeight = 50; } if (attend.OrdinarilyScore.HasValue) { sum += (attend.OrdinarilyScore.Value * ordinarilyWeight); weight += ordinarilyWeight; } decimal?avgScore = attend.Subscores.GetWeightAverageScore(); if (avgScore.HasValue) { sum += (avgScore.Value * avgScoreWeight); weight += avgScoreWeight; } if (weight != 0) { attend.Value = (sum / weight); } else { attend.Value = null; } }
/// <summary> /// 計算科目成績 /// </summary> public void CalculateSubjectScore() { foreach (StudentScore student in Students) { if (student.CalculationRule == null) { continue; //沒有成績計算規則就不計算。 } SCSemsScore Sems = student.SemestersScore[SemesterData.Empty]; //對全部的學期科目成績作一次擇優 foreach (string subject in Sems.Subject) { if (Sems.Subject.Contains(subject)) { SemesterSubjectScore sss = Sems.Subject[subject]; //沒有原始成績就將既有的成績填入 if (!sss.ScoreOrigin.HasValue) { sss.ScoreOrigin = sss.Value; } //有原始或補考成績才做擇優 if (sss.ScoreOrigin.HasValue || sss.ScoreMakeup.HasValue) { sss.BetterScoreSelection(); } } } // 2016/7/13 穎驊註解,原本為整理重覆科目使用,後來功能被另外取代掉,又保留Dic_StudentAttendScore 的話, // 如果再 //處理修課課程 foreach (string subject in student.AttendScore),不使用in student.AttendScore 而是用 in Dic_StudentAttendScore // 則會出現 下一個學生使用上一個學生的修課紀錄,假如上一個學生有著下一個學生沒有的修課內容,就會造成錯誤 //foreach (string subject in student.AttendScore) //{ // if (!Dic_StudentAttendScore.ContainsKey(subject)) // { // Dic_StudentAttendScore.Add(subject, subject); // } // else { // //MessageBox.Show("科目:" + subject + "在課程科目名稱有重覆," + "如繼續匯入將導致學期科目成績遺漏誤植,請確認您在" + subject + "這一科的課程資料無誤"); // } //} //處理修課課程 foreach (string subject in student.AttendScore) { if (!IsValidItem(subject)) { continue; //慮掉不算的科目。 } AttendScore attend = student.AttendScore[subject]; SemesterSubjectScore SemsSubj = null; if (Sems.Subject.Contains(subject)) { SemsSubj = Sems.Subject[subject]; } else { SemsSubj = new SemesterSubjectScore(); } if (attend.ToSemester) //列入學期成績。 { //分數、權數都有資料才進行計算科目成績。 if (attend.Value.HasValue && attend.Weight.HasValue && attend.Period.HasValue) { decimal score = student.CalculationRule.ParseSubjectScore(attend.Value.Value); //進位處理。 //SemsSubj.Value = score; SemsSubj.Weight = attend.Weight.Value; SemsSubj.Period = attend.Period.Value; SemsSubj.Effort = attend.Effort; SemsSubj.Text = attend.Text; SemsSubj.Domain = attend.Domain; //填到原始成績 SemsSubj.ScoreOrigin = score; //擇優成績 SemsSubj.BetterScoreSelection(); } else //資料不合理,保持原來的分數狀態。 { continue; } if (!Sems.Subject.Contains(subject)) { Sems.Subject.Add(subject, SemsSubj); } } else { //不計入學期成績,就將其刪除掉。 if (Sems.Subject.Contains(subject)) { Sems.Subject.Remove(subject); } } } } }
/// <summary> /// 計算科目成績 /// </summary> public void CalculateSubjectScore() { foreach (StudentScore student in Students) { if (student.CalculationRule == null) { continue; //沒有成績計算規則就不計算。 } foreach (string subject in student.AttendScore) { if (!IsValidItem(subject)) { continue; //慮掉不算的科目。 } AttendScore attend = student.AttendScore[subject]; SemesterSubjectScore SemsSubj = null; SCSemsScore Sems = student.SemestersScore[SemesterData.Empty]; if (Sems.Subject.Contains(subject)) { SemsSubj = Sems.Subject[subject]; } else { SemsSubj = new SemesterSubjectScore(); } if (attend.ToSemester) //列入學期成績。 { //分數、權數都有資料才進行計算科目成績。 if (attend.Value.HasValue && attend.Weight.HasValue && attend.Period.HasValue) { decimal score = student.CalculationRule.ParseSubjectScore(attend.Value.Value); //進位處理。 SemsSubj.Value = score; SemsSubj.Weight = attend.Weight.Value; SemsSubj.Period = attend.Period.Value; SemsSubj.Effort = attend.Effort; SemsSubj.Text = attend.Text; SemsSubj.Domain = attend.Domain; } else //資料不合理,保持原來的分數狀態。 { continue; } if (!Sems.Subject.Contains(subject)) { Sems.Subject.Add(subject, SemsSubj); } } else { //不計入學期成績,就將其刪除掉。 if (Sems.Subject.Contains(subject)) { Sems.Subject.Remove(subject); } } } } }