// CIS22B - Fall 2020 Assignment 3 Solution /* 2-D array Column layout Stdnt Id Ex ------ Assignments ------- Tot Mi Fin CL Pts Pct Gr -------- -- -------------------------- --- -- --- -- --- --- -- Index Contents 0 Student Id 1 Lab Exercises (total) 2-12 Assignments (11) 13 Midterm 14 Final 15 CodeLab Points 16 Assignment total 17 Total Points 18 Percent of Total 19 Letter Grade 20 Grade suffix (+ or - or none) */ #include #include #include #include #include using namespace std; const string InputFilename = "c:/temp/ass3data.txt"; const string OutputFile1 = "c:/temp/ass3output1.txt"; const string OutputFile2 = "c:/temp/ass3output2.txt"; const unsigned short NumberOfStudents = 50; const unsigned short PointsPossible = 500; const unsigned short NumberOfAssignments = 11; const int NumCol = 21; // Number of columns in array const int IdIndex = 0; // Array column index for student ID const int LabExIndex = 1; // Array column index for lab exercise points const int FirstAssIndex = 2; // Array index for first assignment const int LastAssIndex = 12; // Array index for first assignment const int MidtermIndex = 13; // Array column index for midterm grade const int FinalIndex = 14; // Array column index for lab exercise points const int CodeLabIndex = 15; // Array column index for CodeLab points const int AssTotalIndex = 16; // Array column index for assignment total const int TotalPtsIndex = 17; // Array column index for total points const int TotalPctIndex = 18; // Array column index for total percent const int GradeIndex = 19; // Array column index for letter grade const int PlusOrMinusIndex = 20; // Array column index for grade + or - void readPointsFromFile(const string& filename,int[][NumCol]); int calculateAssTotalPoints(int[]); void calculateTotalPointsAndPercent(int[][NumCol]); void calculateGrades(int[][NumCol]); char getGradeFromPercent(int percent); char getPlusMinusFromPercent(int percent); void printReport(const string& filename, int[][NumCol]); void printStudentRecord(ostream& out, int data[NumCol]); void sortDataByColumn(int[][NumCol], int columnToSort=0, char AscendingDecending = 'A'); void swapRow(int a[], int b[]); void swap(int& a, int& b); int main() { int studentData[NumberOfStudents][NumCol] = {{0}}; readPointsFromFile(InputFilename,studentData); calculateTotalPointsAndPercent(studentData); calculateGrades(studentData); // sort data by student ID sortDataByColumn(studentData); printReport(OutputFile1,studentData); // sort data by total points descending sortDataByColumn(studentData,TotalPtsIndex,'D'); printReport(OutputFile2,studentData); } /* Stud Id LE ------- 11 assignment grades ------ Mi Fin CL ######## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## Student Id = 8 digit number LE = Lab Exercises 0 - 50 11 assignment grades 0 - 20 Mi = midterm grade 0 - 100 Fin = Final grade 0 - 120 CL = CodeLab 0 - 10 */ void readPointsFromFile(const string& filename,int data[][NumCol]) { ifstream fin(filename.c_str()); if (!fin) { cerr << "Unable to open file, " << InputFilename << endl; exit(1); } for (int i = 0; i < NumberOfStudents; i++) { for (int j = 0; j < AssTotalIndex; j++) { fin >> data[i][j]; } } fin.close(); } int calculateAssTotalPoints(int data[]) { int min, sum; min = data[FirstAssIndex]; sum = data[FirstAssIndex]; // Determine sum and minimum of assignments for (int i = FirstAssIndex + 1; i <= LastAssIndex; i++) { if (min > data[i]) min = data[i]; sum += data[i]; } sum -= min; return sum; } void calculateTotalPointsAndPercent(int data[][NumCol]) { for (int i = 0; i < NumberOfStudents; i++) { data[i][AssTotalIndex] = calculateAssTotalPoints(data[i]); data[i][TotalPtsIndex] = data[i][MidtermIndex] + data[i][LabExIndex] + +data[i][CodeLabIndex] + data[i][FinalIndex] + data[i][AssTotalIndex]; // Round points to the nearest int data[i][TotalPctIndex] = static_cast((100. * data[i][TotalPtsIndex] / PointsPossible +0.5)); } } void calculateGrades(int data[][NumCol]) { for (int i = 0; i < NumberOfStudents; i++) { data[i][GradeIndex] = getGradeFromPercent(data[i][TotalPctIndex]); data[i][PlusOrMinusIndex] = getPlusMinusFromPercent(data[i][TotalPctIndex]); } } char getGradeFromPercent(int pct) { switch (pct/10) { case 6: return 'D'; case 7: return 'C'; case 8: return 'B'; case 9: case 10: return 'A'; default: ; } return 'F'; } char getPlusMinusFromPercent(int points) { if (points == 100) return '+'; if (points > 59) { if (points % 10 > 7) return '+'; if (points % 10 < 2) return '-'; } return ' '; } void printReport(const string& filename, int data[][NumCol]) { ofstream fout(filename.c_str()); if (!fout) { cerr << "Unable to open file, " << filename << endl; exit(2); } // Print headings fout << "Stdnt Id Ex --------- Assignments ---------- Tot Mi Fin CL Pts Pct Gr" << endl; fout << "-------- -- -------------------------------- --- -- --- -- --- --- --" << endl; for (int i = 0; i < NumberOfStudents; i++) { printStudentRecord(fout,data[i]); } } void printStudentRecord(ostream& out, int data[NumCol]) { out << setfill('0') << setw(8) << data[IdIndex] << setfill(' ') << ' '; out << setw(3) << data[LabExIndex] << ' '; for (int j = FirstAssIndex ; j <= LastAssIndex; j++) out << setw(3) << data[j]; out << setw(5) << data[AssTotalIndex] << setw(4) << data[MidtermIndex] << setw(5) << data[FinalIndex] << setw(4) << data[CodeLabIndex] << setw(5) << data[TotalPtsIndex] << setw(5) << fixed << setprecision(1) << data[TotalPctIndex] << setw(3) << static_cast(data[GradeIndex]) << static_cast(data[PlusOrMinusIndex]) << endl; } void sortDataByColumn(int data[][NumCol], int columnToSort, char AscendingDecending) { int i, j; for (i = 0; i < NumberOfStudents - 1; i++) { for (j = i+1; j < NumberOfStudents; j++) { if (AscendingDecending == 'A') { if (data[i][columnToSort] > data[j][columnToSort]) swapRow(data[i],data[j]); } else { if (data[i][columnToSort] < data[j][columnToSort]) swapRow(data[i],data[j]); } } } } void swapRow(int a[], int b[]) { for (int i = 0; i < NumCol; i++) { swap(a[i],b[i]); } } void swap(int& a, int& b) { int temp; temp = a; a = b; b = temp; }