/* * File: TestTopSort.cpp * Author: ogur * * Created on July 25, 2012, 9:25 PM */ #include #include #include #include #include using namespace std; struct Course{ char code[10]; int id; int credit; int preCnt; int *pres; }; bool isTakenBefore(int cid, int sid); int semesters[50][8]; Course *courses; int main(int argc, char** argv) { int grade = 100; int courseCnt, semesterCnt, cid = 0, preCnt, sum = 0, preErr = 0, i = 0, j = 0, k = 0, s = 0; char infile[25], outfile[25], ccode[10]; bool correct = false; if (argc > 2){ strcpy(infile, argv[1]); strcpy(outfile, argv[2]); } else{ strcpy(infile, "courses.txt"); strcpy(outfile, "output.txt"); } ifstream readCourses, readOutput; readCourses.open(infile, ios::in); readOutput.open(outfile, ios::in); if(!readCourses || !readOutput){ cout << "cannot open file!\n"; return -1; } // read courses.txt file into the courses array readCourses >> courseCnt; cout << "infile is " << infile; // cout << "\nThere are " << courseCnt << " courses\n"; courses = (Course *) malloc(courseCnt * sizeof(Course)); for(i = 0; i < courseCnt; i++) { readCourses >> ccode; readCourses >> cid; strcpy( courses[cid].code, ccode); courses[cid].id = cid; readCourses >> courses[cid].credit; readCourses >> courses[cid].preCnt; courses[cid].pres = (int *) malloc(courses[cid].preCnt * sizeof(int)); // cout << courses[cid].code << " " << courses[cid].id << " "; for(j = 0; j < courses[cid].preCnt; j++){ readCourses >> courses[cid].pres[j]; // cout << courses[cid].pres[j] << " "; } // cout << "\n"; } //read output.txt file into semesters array readOutput >> semesterCnt; for (i = 0; i < semesterCnt; i++) { readOutput >> j; readOutput >> semesters[i][0]; for (j = 0; j < semesters[i][0]; j++) readOutput >> semesters[i][j+1]; } /* for (i = 0; i < semesterCnt; i++){ cout << "\nsemester" << i << ": "; for(j = 0; j < semesters[i][0]; j++) cout << semesters[i][j+1] << " "; } */ // GRADING // check if the number of semesters is btw 7 and 9 if (semesterCnt < 7 || semesterCnt > 9) grade -= 5 * min(4, abs(semesterCnt-8)); // check if the max 20 credits per semester is guaranteed for (i = 0; i < semesterCnt; i++) { sum = 0; for (j = 0; j < semesters[i][0]; j++) sum += courses[ semesters[i][j+1] ].credit; if (sum > 20){ grade -= 5; // cout << "\n in semester " << i << ", credits per semester = " << sum << "\n"; break; } } // check if the number of courses per semester is btw 3 and 8 for (i = 0; i < semesterCnt; i++) { if (semesters[i][0] > 8 || semesters[i][0] < 3){ grade -= 5; // cout << "\ntoo few or too many courses per semester\n"; break; } } // check if the prerequisite constraints are satisfied for (i = 0; i < semesterCnt; i++) { for (j = 0; j < semesters[i][0]; j++){ correct = courses[ semesters[i][j+1] ].preCnt == 0; for (k = 0; k < courses[ semesters[i][j+1] ].preCnt; k++) correct = correct || isTakenBefore(semesters[i][j+1], i); preErr = correct ? preErr : preErr + 1; } } grade -= 5 * min(6, preErr); // cout << "\nThere are " << preErr << " prerequisite errors \n" ; cout << "\nMax grade is: " << grade << "\n"; // Note that depending on the comments, indentation, etc. your final grade could be lower than this. return 0; } bool isTakenBefore(int cid, int sid) { int i, j; for (i = 0; i < sid; i++) for (j = 0; j < semesters[sid][0]; j++) if (semesters[sid][j+1] == cid) return true; return false; }