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

                //運算後成績是在使用者按下列印時才計算。
                //因為需要依據使用者選擇的科目進行計算。
            }
        }
Exemple #9
0
        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);
                }

                //運算後成績是在使用者按下列印時才計算。
                //因為需要依據使用者選擇的科目進行計算。
            }
        }