// req. libraries
#include <fstream>
#include <iomanip>
#include <iostream>
// macros //
// letter grade macro
#define letterGrade(e) \
((e >= 90) \
? 'A' \
: ((e >= 80) ? 'B' : ((e >= 70) ? 'C' : ((e >= 60) ? 'D' : 'F'))))
// get .tsv filename and read.
std::ifstream &openTsv(const std::string &name) {
// create object
std::ifstream *tsv = new std::ifstream(name + ".tsv");
if (!(*tsv)) {
std::cerr << "File does not exist." << std::endl;
delete tsv;
tsv = nullptr;
}
return *tsv;
}
int main(int ac, char *av[]) {
// temp name
std::string tmp;
// get input from user
std::cout << "Enter the name of the tsv file: ";
std::cin >> tmp;
// call function
std::ifstream &obj = openTsv(tmp);
// arrays to store some stuff
double sums[4]; //[0] is exam1, [1] is exam2 and [2] is final. [3] stores the
// number of students
std::string last_name, first_name;
double exam1, exam2, finalexam;
std::ofstream output_file("report.txt");
while (obj >> last_name >> first_name >> exam1 >> exam2 >> finalexam) {
// Calculate the sum of each exam
sums[0] += exam1;
sums[1] += exam2;
sums[2] += finalexam;
// Write student information to the output file
output_file << last_name << "\t" << first_name << "\t" << exam1 << "\t"
<< exam2 << "\t" << finalexam << "\t"
<< letterGrade((exam1 + exam2 + finalexam) / 3.0) << std::endl;
sums[3]++;
}
double ex2sum = sums[1] / sums[3];
// Write the averages to the output file
output_file << "Averages: midterm1 " << std::fixed << std::setprecision(2)
<< sums[0] / sums[3] << ", midterm2 " << ex2sum << ", final "
<< sums[2] / sums[3] << std::endl;
// Close the files
obj.close();
output_file.close();
std::cout << "Grades have been recorded in report.txt." << std::endl;
return 0;
}