jce-manager/src/jceData/Grades/gradePage.cpp

227 lines
5.6 KiB
C++
Raw Normal View History

2014-09-08 15:54:52 +00:00
#include "gradePage.h"
2014-10-07 14:26:11 +00:00
static int maxYear = 0;
static int minYear = 9999;
GradePage::GradePage(QString html) : Page()
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
courses = new std::list<gradeCourse*>();
tempHtml = getString(html);
coursesListInit(tempHtml);
2014-09-08 15:54:52 +00:00
}
GradePage::~GradePage()
{
2014-10-07 14:26:11 +00:00
for(Course* c : *courses)
delete c;
delete courses;
2014-09-08 15:54:52 +00:00
}
void GradePage::removeCourse(QString courseSerialID)
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
for(gradeCourse* c : *courses)
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
if (c->getSerialNum() == courseSerialID.toInt())
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
courses->remove(c);
delete c;
return;
2014-09-08 15:54:52 +00:00
}
}
}
void GradePage::coursesListInit(QString &linesTokinzedString)
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
std::list<QString> stringHolder;
QString temp;
gradeCourse* cTemp = NULL;
char* tok;
char* textToTok = strdup(linesTokinzedString.toStdString().c_str());
tok = strtok(textToTok,"\n");
while (tok != NULL) //putting every line in a string holder before parsing it
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
temp = tok;
stringHolder.push_back(temp);
tok = strtok(NULL, "\n");
2014-09-08 15:54:52 +00:00
}
2014-10-07 14:26:11 +00:00
for (QString temp: stringHolder)
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
cTemp = lineToCourse(temp);
if (cTemp != NULL)
courses->push_back(cTemp);
2014-09-08 15:54:52 +00:00
}
}
gradeCourse* GradePage::lineToCourse(QString line)
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
gradeCourse *tempC = NULL;
QString templinearray[COURSE_FIELDS];//[serial,name,type,points,hours,grade,additions]
int serial,year,semester,courseNumInList;
double points,hours,grade;
QString name,type, additions;
QString tempS = "";
int i = 0;
char* tok;
char* cLine = strdup(line.toStdString().c_str());
tok = strtok(cLine, "\t");
while(tok != NULL)
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
tempS = tok;
2014-10-05 11:16:01 +00:00
2014-10-07 14:26:11 +00:00
if (i == gradeCourse::CourseScheme::SERIAL) //we need to extract the serial manually
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
tempS = "";
char *tokTemp;
tokTemp = tok;
while (!(isdigit((int)*tokTemp))) //getting to serial number starting pointer
tokTemp++;
2014-09-08 15:54:52 +00:00
2014-10-07 14:26:11 +00:00
while (isdigit((int)*tokTemp)) //serial number
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
tempS += QString(*tokTemp);
tokTemp++;
2014-09-08 15:54:52 +00:00
}
2014-10-07 14:26:11 +00:00
templinearray[i] = tempS.trimmed();
templinearray[i+1] = QString(tokTemp).trimmed();
i +=2; //skipping on serial and course name
2014-09-08 15:54:52 +00:00
}
2014-10-07 14:26:11 +00:00
else
{
2014-10-07 14:26:11 +00:00
templinearray[i] = tempS.trimmed();
i++;
}
2014-10-05 11:16:01 +00:00
2014-10-07 14:26:11 +00:00
if (i == COURSE_FIELDS)
break;
tok=strtok(NULL, "\t");
2014-09-08 15:54:52 +00:00
}
2014-10-07 14:26:11 +00:00
if (templinearray[0] == "") //empty parsing
2014-10-05 11:16:01 +00:00
{
2014-10-07 14:26:11 +00:00
qCritical() << Q_FUNC_INFO << "empty parsing";
return NULL;
2014-10-05 11:16:01 +00:00
}
2014-09-08 15:54:52 +00:00
2014-10-07 14:26:11 +00:00
year = templinearray[gradeCourse::CourseScheme::YEAR].toInt();
semester = templinearray[gradeCourse::CourseScheme::SEMESTER].toInt();
courseNumInList = templinearray[gradeCourse::CourseScheme::COURSE_NUMBER_IN_LIST].toInt();
serial = templinearray[gradeCourse::CourseScheme::SERIAL].toInt();
name = templinearray[gradeCourse::CourseScheme::NAME];
type = templinearray[gradeCourse::CourseScheme::TYPE];
points = templinearray[gradeCourse::CourseScheme::POINTS].toDouble();
hours = templinearray[gradeCourse::CourseScheme::HOURS].toDouble();
2014-09-08 15:54:52 +00:00
2014-10-07 14:26:11 +00:00
if (isGradedYet(templinearray[gradeCourse::CourseScheme::GRADE]))
grade = templinearray[gradeCourse::CourseScheme::GRADE].toDouble();
else
grade = NO_GRADE_YET;
2014-09-08 15:54:52 +00:00
2014-10-07 14:26:11 +00:00
additions = templinearray[gradeCourse::CourseScheme::ADDITION];
2014-09-08 15:54:52 +00:00
2014-10-07 14:26:11 +00:00
if (year >= maxYear)
maxYear = year;
2014-09-08 15:54:52 +00:00
2014-10-07 14:26:11 +00:00
if (year <= minYear)
minYear = year;
2014-09-08 15:54:52 +00:00
2014-10-07 14:26:11 +00:00
tempC = new gradeCourse(year,semester,courseNumInList,serial,name,type,points,hours,grade,additions);
return tempC;
2014-09-08 15:54:52 +00:00
}
//checking if one of the chars inside grade is not a number
bool GradePage::isGradedYet(QString grade)
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
if (strlen(grade.toStdString().c_str()) <= 1)
return false;
2014-09-08 15:54:52 +00:00
2014-10-07 14:26:11 +00:00
for (char c: grade.toStdString())
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
if (c == '\0')
break;
if (((!isdigit((int)c)) && (!isspace((int)c)))) //48 = 0, 57 = 9
return false;
2014-09-08 15:54:52 +00:00
}
2014-10-07 14:26:11 +00:00
return true;
2014-09-08 15:54:52 +00:00
}
2014-10-07 14:26:11 +00:00
/**
* @brief GradePage::getAvg getting avg
* @return - gpa avg of all courses
*/
2014-09-08 15:54:52 +00:00
double GradePage::getAvg()
{
2014-10-07 14:26:11 +00:00
double avg = 0;
double points = 0;
for (gradeCourse* c : *courses)
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
if ((c->getGrade() != 0))
2014-09-08 15:54:52 +00:00
{
2014-10-07 14:26:11 +00:00
avg += c->getGrade() * c->getPoints();
points += c->getPoints();
2014-09-08 15:54:52 +00:00
}
}
2014-10-07 14:26:11 +00:00
avg /= points;
return avg;
}
/**
* @brief GradePage::getAvg getting avg of given year
* @param year - year (yyyy)
* @return - gpa avg of given year
*/
double GradePage::getAvg(int year)
{
double avg = 0;
double points = 0;
for (gradeCourse* c : *courses)
{
if ((c->getGrade() != 0) && (c->getYear() == year))
{
avg += c->getGrade() * c->getPoints();
points += c->getPoints();
}
}
if (points != 0)
2014-09-08 15:54:52 +00:00
avg /= points;
2014-10-07 14:26:11 +00:00
else
avg=0;
return avg;
}
/**
* @brief GradePage::getAvg
* @param year - year (yyyy)
* @param semester - semeser (1-3)
* @return -gpa avg of given year in given semester
*/
double GradePage::getAvg(int year, int semester)
{
double avg = 0;
double points = 0;
for (gradeCourse* c : *courses)
{
if ((c->getGrade() != 0) && (c->getYear() == year) && (c->getSemester() == semester))
{
avg += c->getGrade() * c->getPoints();
points += c->getPoints();
}
}
if (points != 0)
avg /= points;
else
avg=0;
return avg;
}
/**
* @brief GradePage::getMinYearInList
* @return the minimal year inside courses list
*/
int GradePage::getMinYearInList()
{
return minYear;
}
int GradePage::getMaxYearInList()
{
return maxYear;
2014-09-08 15:54:52 +00:00
}