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;
            }
        }
Exemple #3
0
        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
        }
Exemple #5
0
        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;
            }
        }
Exemple #6
0
        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;
            }
        }
Exemple #7
0
        /// <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);
                        }
                    }
                }
            }
        }
Exemple #8
0
        /// <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);
                        }
                    }
                }
            }
        }