//ASSIGNMENT 3&4
//GROUP-03
//NABIL RAYHAN-A20EC9107
//Tham Chuan Yew-A20EC0166
//Guo Xu-A20EC4022

#include <bits/stdc++.h>
#include <sstream>
using namespace std;

float grade_point(string grade){
    if ("A" == grade)
        return 4.0;
    if ("A-" == grade)
        return 3.67;
    if ("B+" == grade)
        return 3.33;
    if ("B" == grade)
        return 3.0;
    if ("B-" == grade)
        return 2.67;
    if ("C+" == grade)
        return 2.33;
    return 0.0;
}

int main()
{
    
    fstream file;
    string data[100][13], word;
    int k=0, r=-1, t=-1;
    file.open("student.txt");
    while (file >> word)
    {
        t++;
        if (t%7 == 0){
            k=0;
            r++;
        }
        data[r][k++]=word;
    }
    file.close();
    t = t/7+1;
    float avg_GPA = 0;
    string names[100];
    int l=-1;
    for (int i=0; i<t; i++){
        float GPA=0, temp[5];
        for (int j=0; j<5; j++){
            temp[j] = grade_point(data[i][2+j]);
            std::ostringstream ss;
            ss<<temp[j];
            data[i][7+j] = ss.str();
            if (data[i][7+j] == "0")
                data[i][7+j] = "0.0";
        }
        
        GPA = (temp[0]*3 + temp[1]*3 + temp[2]*3 +
                temp[3]*2 + temp[4]*2)/(3+3+3+2+2);
        avg_GPA += GPA;
        if (GPA >= 3.5)
            names[++l] = data[i][1];
        std::ostringstream ss;
        ss<<GPA;
        data[i][12] = ss.str();
    }
    std::ostringstream ss;
    ss<<avg_GPA/t;
    string average_GPA = ss.str();
    ofstream ofile;
    ofile.open("Grades.txt");
    ofile<<"Matric no   Name                     ";
    ofile<<"Sub1\tSub2\tSub3\tSub4\tSub5\tGPA\n";
    
    for (int i=0; i<t; i++){
        ofile<<data[i][0]<<"      ";
        ofile<<data[i][1];
        for(int j=0; j<25-data[i][1].size(); j++)
            ofile<<" ";
        for (int j=7; j<13; j++)
            ofile<<data[i][j]<<"\t";
        ofile<<"\n";
    }
    ofile<<"\n\nAverage GPA  of all students: "<<average_GPA;
    ofile<<"\n\nList of Students who get GPA 3.5 and above:\n\n";
    for (int i=0; i<=l; i++){
        std::ostringstream ss;
        ss<<i+1;
        ofile<<ss.str()<<"."<<names[i];
    }
    ofile.close();
    
    
    return 0;
}
