I have a problem that I have not been able to figure out with this assignment. The idea is to write a grading program that will calculate the letter grade, and average while also giving exam scores for 5 students, each student has 4 exams. I have built it up to this and even viewed a similar assignment posted but didn't find that helpful. I have gone through the book which also isn't very helpful in this regard. I am receiving errors regarding the highlighted sections that deal with processing the file data into the program. Error code in Visual Studio LNK1120:1 unresolved externals. If I remove "student.input(input, thisStudent);" this bit of code the program will run but with garbage values and that is where hopefully someone can help me with. How can I properly direct the data from a file into exam1-4. Am I missing something? If I can get the program to run with correct values I should be able figure out the rest. Thanks in advance.
#include <iostream>
#include <fstream> // I/O
#include <iomanip> // For setw()
using namespace std;
ofstream outputfile("output.txt"); // Output file
// Defined Constants
const int MAX_FILE_NAME = 35; // Max space allocated for file name
const int CLASS_SIZE = 5;
class StudentRecord
{
public:
**void input(ifstream& input,int studentid);** // reads exam scores for this student
void computeGrade(); //calculates the numeric average and letter grade.
void output(); //outputs the student record.
//outputs student record
private:
int studentNumber;
double exam1;
double exam2;
double exam3;
double exam4;
double average;
char grade;
};
void open_input(ifstream& input, char name[]); // Get file name & Open file
void process_file(ifstream& input); // Read each value & process
int main()
{
//StudentRecord student1, student2, student3,
// student4, student5;
char again; // Does user want to go through loop again?
char file_name[MAX_FILE_NAME + 1]; // Name of file to be processed
ifstream input_numbers; // For working with input file
cout << "This program will calculate student grades.\n"
<< "It will give exam scores and averages with letter grade.\n";
system("pause"); // Hold message on screen until key is pressed
do
{
system("cls"); // Clear screen
open_input(input_numbers, file_name); // Get file name & open file
process_file(input_numbers); // Process values in file
input_numbers.close(); // Close file
cout << "\nDo you want to process another file (Y/N)? ";
cin >> again;
cin.ignore(256, '\n'); // Remove Enter key from keyboard buffer
} while ( again == 'y' || again == 'Y');
cout << "\nEnd of Program!" << endl;
outputfile << "\n\nThanks for using Grade Pro!\f";
outputfile.close();
return 0;
} // End of main()
void process_file(ifstream& input)
// Parameters: Variable for file reference
// Returns: None
// Calls: Invoice::set_merchandise_value(), Invoice::output()
{
double thisStudent = 0; // Merchandise value from file
StudentRecord student = StudentRecord(); // Record for student
while (thisStudent++ < CLASS_SIZE)
{
**student.input(input, thisStudent);**
student.computeGrade();
student.output();
} // End of process_file()
}
void open_input(ifstream& input, char name[]) //Open file, exit on error
// Parameters: Variables for input file reference nad input file name
// Returns: None
// Calls: None
{ int count = 0; // Count number of tries
do // Continue until we get a valid file name and can open file
{ count++;
if (count != 1) // Issue error message if we are trying again.
{ cout << "\n\aInvalid file name or file does not exist. Please try again."
<< endl;
}
cout << "\nEnter the input file name (maximum of " << MAX_FILE_NAME
<< " characters please)\n:> ";
cin.get(name, MAX_FILE_NAME + 1);// Gets at most MAX_FILE_NAME characters
cin.ignore(256, '\n'); // Remove Enter key from keyboard buffer
input.clear(); // Clear all error flags, if any, from prev try
input.open(name,ios_base::in); // Open only if file exists
} while (input.fail() ); // If can't open file, try again
} // End of open_input()
void StudentRecord::computeGrade()
{
double average;
average = (exam1+exam2+exam3+exam4)/4;
//Letter grade: A => 90 > B => 80 > C => 70 > D => 60 > F
if(average>=90)
grade = 'A';
else if(average<90 && average>=80)
grade = 'B';
else if(average<80 && average>=70)
grade = 'C';
else if(average<70 && average>=60)
grade = 'D';
else if(average<60)
grade = 'F';
}
void StudentRecord::output()
{
cout << "\n\nExam1: " << setw(8) << exam1 << endl;
cout << "Exam2: " << setw(8) << exam2 << endl;
cout << "Exam3: " << setw(8) << exam3 << endl;
cout << "Exam4: " << setw(8) << exam4 << endl;
cout << "Avg: " << setw(8) << average<< endl;
cout << "Grade: " << setw(8) << grade << endl;
}