106 lines
2.7 KiB
TypeScript
106 lines
2.7 KiB
TypeScript
/**
|
|
* This is an utility class to calculate GPA.
|
|
*/
|
|
import {Course} from '@/components/app/app';
|
|
|
|
export class GPAUtils
|
|
{
|
|
// [[Min score, Letter grade, Base GPA], ...]
|
|
public static SCALE =
|
|
[
|
|
[96.5, 'A+', 4.00],
|
|
[92.5, 'A' , 3.75],
|
|
[89.5, 'A-', 3.50],
|
|
[86.5, 'B+', 3.25],
|
|
[82.5, 'B' , 3.00],
|
|
[79.5, 'B-', 2.75],
|
|
[76.5, 'C+', 2.50],
|
|
[72.5, 'C' , 2.25],
|
|
[70.5, 'C-', 2.00],
|
|
[69.5, 'D' , 1.00],
|
|
[0 , 'F' , 0.00]
|
|
];
|
|
|
|
// Keywords
|
|
public static MIN = 0;
|
|
public static LETTER = 1;
|
|
public static GPA = 2;
|
|
|
|
/**
|
|
* Calculate GPA for a list of couses
|
|
*
|
|
* @param coursesOriginal List of courses
|
|
*/
|
|
public static getGPA(coursesOriginal: Course[]): {gpa: number, accurate: boolean, max: number}
|
|
{
|
|
// Clone array
|
|
let courses: Course[] = [];
|
|
|
|
// Accurate or not
|
|
let accurate: boolean = true;
|
|
|
|
// Remove all courses that does not have a grade
|
|
coursesOriginal.forEach(course =>
|
|
{
|
|
if (course.letterGrade == null || course.letterGrade == '')
|
|
{
|
|
accurate = false;
|
|
}
|
|
else if (course.level != 'none')
|
|
{
|
|
courses.push(course);
|
|
}
|
|
});
|
|
|
|
// If no course have grade, return -1
|
|
if (courses.length == 0)
|
|
{
|
|
return {gpa: -1, accurate: false, max: -1};
|
|
}
|
|
|
|
// Count total GPA
|
|
let totalGPA = 0;
|
|
let maxTotal = 0;
|
|
courses.forEach(course =>
|
|
{
|
|
totalGPA += this.getGP(course, course.letterGrade);
|
|
maxTotal += this.getGP(course, 'A+');
|
|
});
|
|
|
|
// Get average GPA, round to two decimal places
|
|
let gpa = Math.round(totalGPA / courses.length * 100) / 100;
|
|
let maxGPA = Math.round(maxTotal / courses.length * 100) / 100;
|
|
|
|
// Return results
|
|
return {gpa: gpa, accurate: accurate, max: maxGPA};
|
|
}
|
|
|
|
/**
|
|
* Calculate GPA for a course
|
|
*
|
|
* @param course Course
|
|
* @param letterGrade Letter grade
|
|
*/
|
|
public static getGP(course: Course, letterGrade?: string): number
|
|
{
|
|
// Find the GPA for this course.
|
|
for (let scale of this.SCALE)
|
|
{
|
|
// Letter grades are the same
|
|
if (scale[this.LETTER] == letterGrade)
|
|
{
|
|
// Get grade and add it
|
|
let grade = <number> scale[this.GPA];
|
|
|
|
// Add scaleUp if not failed.
|
|
if (grade != 0) grade += course.scaleUp;
|
|
|
|
// That's it
|
|
return grade;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
}
|