//------------------------------------------------------------------- // File :grades.C // Author :Alicia Thorsen // Course :CS1129 // // Program reads student names and numeric grades from an input file, calculates // their letter grades and writes it all to a file. //------------------------------------------------------------------- #include #include #include #include using namespace std; const int MAX_STUDENTS = 100; const int MAX_NAME_SIZE = 25; const int MAX_NUMERIC_GRADE_SIZE = 15; // NOTE: Cannot store filenames as strings if they are used by the file open // function. Must use character arrays. const char IN_FILE_NAME[] = "input.txt"; const char OUT_FILE_NAME[] = "output.txt"; int getStudentData(string [], double []); void outputStudentData(const string [], const double [], const string [], int); void calcLetterGrade(const double [], string [], int); //Main Function. int main() { string name[MAX_STUDENTS]; double numericGrade[MAX_STUDENTS]; string letterGrade[MAX_STUDENTS]; int numStudents = 0; // Read input from file. numStudents = getStudentData(name, numericGrade); // Calculate letter grades from numeric grades. calcLetterGrade(numericGrade, letterGrade, numStudents); // Output student info with letter grades to a file. outputStudentData(name, numericGrade, letterGrade, numStudents); cout << endl; return 0; } // end main(). // ------------------------------------------------------------ // Precondition :IN_FILE_NAME exists and contains student data. // Postcondion :Student data is stored in name[] and numericGrade[] // and the number of the students read is returned. // ------------------------------------------------------------ int getStudentData(string name[], double numericGrade[]) { ifstream inputFile; string studentName; int i = 0; // Open file for reading. inputFile.open(IN_FILE_NAME); // Read first line. getline(inputFile, studentName); // Keep reading until end-of-file. while (!inputFile.eof()) { // First line is student name. name[i] = studentName; // Second line is numeric grade. inputFile >> numericGrade[i]; // Discard newline left by >>. inputFile.ignore(); // Read next line. getline(inputFile, studentName); // Keep track of entries read. ++i; } // Close file. inputFile.close(); // Return number of students in file. return i; } // ------------------------------------------------------------ // Precondition :numericGrade[] contains students' numeric grades. // Postcondition :letterGrade[] contains students' letter grades. // ------------------------------------------------------------ void calcLetterGrade(const double numericGrade[], string letterGrade[], int numStudents) { // Determine letter grade. for (int i = 0; i < numStudents; ++i) if (numericGrade[i] >= 89.5) letterGrade[i] = "A"; else if (numericGrade[i] >= 86.5) letterGrade[i] = "AB"; else if (numericGrade[i] >= 79.5) letterGrade[i] = "B"; else if (numericGrade[i] >= 76.5) letterGrade[i] = "BC"; else if (numericGrade[i] >= 69.5) letterGrade[i] = "C"; else if (numericGrade[i] >= 66.5) letterGrade[i] = "CD"; else if (numericGrade[i] >= 59.5) letterGrade[i] = "D"; else letterGrade[i] = "F"; } // ------------------------------------------------------------ // Precondition :name[], numericGrade[], letterGrade[] have student data and // numStudents contains the size of the arrays. // Postcondition :All student data is written to the OUT_FILE_NAME file. // ------------------------------------------------------------ void outputStudentData(const string name[], const double numericGrade[], const string letterGrade[], int numStudents) { ofstream outputFile; // Open file for writing. outputFile.open(OUT_FILE_NAME); // Left align columns. outputFile.setf(ios::left); // Write headings to file: outputFile << setw(MAX_NAME_SIZE) << "Name" << setw(MAX_NUMERIC_GRADE_SIZE) << "Numeric Grade" << "Letter Grade\n\n"; // Write student data to file. for (int i = 0; i < numStudents; ++i) { outputFile << setw(MAX_NAME_SIZE) << name[i] << setw(MAX_NUMERIC_GRADE_SIZE) << numericGrade[i] << letterGrade[i] << endl; } // Close file. outputFile.close(); cout << "\nResults written to " << OUT_FILE_NAME << endl; }