#include #include #include #include using namespace std; const int NUM_EXAMS = 3; struct student { string name; double ave; char grade; int examScores[NUM_EXAMS]; }; // function prototypes void readAllStu(ifstream& ins, student[], int&, int); void readOneStu(ifstream&, student&, int); void calcStuAverage(student[], int, int); void calcClassAverage(student[], int, double[], int); void display(ofstream&, student[], int, double[], int); void assignGrade(student[], int, int[]); double calcAve(int[], int); int main() { const int SIZE = 20; student cis67[SIZE]; const int NUM_EXAMS = 3; double classAve[NUM_EXAMS]; int minScore[4] = {90, 80, 70, 60}; int numStu; ifstream ins; ofstream outs; ins.open("myStudentData.txt"); // connects fstream ins to disk file outs.open("stuOutput.txt"); // Read all student data readAllStu(ins, cis67, numStu, NUM_EXAMS); // Calculate each student's exam ave calcStuAverage(cis67, numStu, NUM_EXAMS); // Calculate class ave for each exam calcClassAverage(cis67, numStu, classAve, NUM_EXAMS); // Assign a letter grade. assignGrade(cis67, numStu, minScore); // Display all results display(outs, cis67, numStu, classAve, NUM_EXAMS); ins.close(); outs.close(); return 0; } void assignGrade(student cis67[], int numStu, int minScore[4]) { for (int nextStu = 0; nextStu < numStu; nextStu++) { if (cis67[nextStu].ave >= minScore[0]) cis67[nextStu].grade = 'A'; else if (cis67[nextStu].ave >= minScore[1]) cis67[nextStu].grade = 'B'; else if (cis67[nextStu].ave >= minScore[2]) cis67[nextStu].grade = 'C'; else if (cis67[nextStu].ave >= minScore[3]) cis67[nextStu].grade = 'D'; else cis67[nextStu].grade = 'F'; } } void readOneStu(ifstream& ins, student& aStu, int NUM_EXAMS) { ins >> aStu.name; for (int i = 0; i < NUM_EXAMS; i++) { ins >> aStu.examScores[i]; } ins.ignore(20, '\n'); // skip end of line } void readAllStu(ifstream& ins, student cis67[], int& numStu, int NUM_EXAMS) { ins >> numStu; for (int i = 0; i < numStu; i++) readOneStu(ins, cis67[i], NUM_EXAMS); } void calcStuAverage(student cis67[], int numStu, int NUM_EXAMS) { for (int nextStu = 0; nextStu < numStu; nextStu++) { cis67[nextStu].ave = calcAve(cis67[nextStu].examScores, NUM_EXAMS); } } double calcAve(int x[], int size) { int sum = 0; for (int i = 0; i < size; i++) sum += x[i]; return (double) sum / size; } void calcClassAverage(student cis67[], int numStu, double classAve[], int NUM_EXAMS) { int sum; for (int nextExam = 0; nextExam < NUM_EXAMS; nextExam++) { sum = 0; for (int nextStu = 0; nextStu < numStu; nextStu++) sum += cis67[nextStu].examScores[nextExam]; classAve[nextExam] = (double) sum / numStu; } } void displayOneStu(ofstream& outs, student aStu, int NUM_EXAMS) { outs << setw(10) << setiosflags(ios::left) << aStu.name; outs << setiosflags(ios::right) << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1); for (int i = 0; i < NUM_EXAMS; i++) outs << setw(10) << aStu.examScores[i]; outs << setprecision(1) << setw(10) << aStu.ave << setw(5) << setiosflags(ios::right) << " " << aStu.grade << endl; } void display(ofstream& outs, student cis67[], int numStu, double classAve[], int NUM_EXAMS) { for (int nextStu = 0; nextStu < numStu; nextStu++) { displayOneStu(outs, cis67[nextStu], NUM_EXAMS); } outs << setw(10) << setiosflags(ios::left) << "average "; outs << setprecision(1) << setiosflags(ios::right) << setiosflags(ios::fixed) << setiosflags(ios::showpoint); for (int nextExam = 0; nextExam < NUM_EXAMS; nextExam++) outs << setw(10) << classAve[nextExam]; outs << endl; }