Ignore the text\'s input validation . You can assume that all the data is presen
ID: 3556367 • Letter: I
Question
Ignore the text's input validation. You can assume that all the data is present for each student, that there will be the correct number of scores, and that the scores are all positive values. You can also assume that integers will be present when integers are expected.
There may be more records than the header record number indicated. This is not considered an error. In this case, read the number of records indicated by the header record value. However, fewer records is a problem. This error should be returned to main and main should terminate the program.
This function also calculates the average for each student and determines the student's grade. This data is stored in the student structure.
KEEP the ReadHeader Function!!
#include
#include
#include
#include
#include
using namespace std;
struct StudentData
{
string Name;
int Idnum;
int* Tests;
double Average;
char Grade;
};
void ReadHeader(int&, ifstream&);
StudentData DynamicallyAllocate(int);
void GetStudentData(StudentData[], int, int);
void calculateGrade(StudentData[], int, int);
void displayResults(StudentData[], int);
int main()
{
int firstRecord;
ifstream infile;
ReadHeader(firstRecord,infile);
int numberOfTests,
numberOfstudents;
//StudentData *StudentInfo = new StudentData[firstRecord];// Dynamically allocate a new array
cout <<"Enter number of tests: ";
cin >> numberOfTests;
cout <<"Enter number of students: ";
cin >> numberOfstudents;
StudentData *dataOfStudents = new StudentData[numberOfstudents];
int student = 0;
GetStudentData(dataOfStudents, numberOfstudents, numberOfTests);
calculateGrade(dataOfStudents,numberOfstudents,numberOfTests);
displayResults(dataOfStudents, numberOfstudents);
return 0;
}
void ReadHeader(int& firstRecord, ifstream& infile)
{
string filename;
cout <<"Enter the .txt file you wish to open: ";
cin >> filename;
infile.open(filename.c_str());
while(!infile)
{
cout <<"Please re-enter a valid .txt file to open: ";
cin >> filename;
infile.open(filename.c_str());
}
if(infile)
{
infile >> firstRecord;
if (firstRecord < 5)
{
cout <<"Error! program is now ending" << endl;
exit(1);
}
}
}
StudentData DynamicallyAllocate(int firstRecord)
{
StudentData *StudentInfo = new StudentData[firstRecord];
return *StudentInfo;
}
void GetStudentData(StudentData StudentInfo[], int NumOfStudents, int NumOfTests)
{
int testScore;
for(int student = 0; student < NumOfStudents; student++)
{
cout << endl;
cout << "Enter the name of the student " << (student+1) << ":";
cin >> StudentInfo[student].Name;
cout <<"Enter the id number of the student " << (student +1) << ":";
cin >> StudentInfo[student].Idnum;
for (int test = 0; test < NumOfTests; test++)
{
cout << " Enter the score for test " << (test+1) << ":";
cin >> testScore;
while(testScore < 0)
{
cout <<"Enter a positive test score value: ";
cin >> testScore;
}
StudentInfo[student].Tests[test] = testScore;
}
}
}
void calculateGrade(StudentData StudentInfo[], int NumOfStudents, int NumOfTests)
{
double TotalScore;
for( int student = 0; student < NumOfStudents; student++)
{
TotalScore = 0;
for(int test = 0; test < NumOfTests; test++)
TotalScore += StudentInfo[student].Tests[test];
StudentInfo[student].Average = TotalScore / NumOfTests;
if(StudentInfo[student].Average > 90)
StudentInfo[student].Grade = 'A';
else if(StudentInfo[student].Average > 80)
StudentInfo[student].Grade = 'B';
else if(StudentInfo[student].Average > 70)
StudentInfo[student].Grade = 'C';
else if(StudentInfo[student].Average > 60)
StudentInfo[student].Grade = 'D';
else
StudentInfo[student].Grade = 'F';
}
}
void displayResults(StudentData StudentInfo[], int NumOfStudents)
{
cout <<"Course Grades" << endl;
cout << setw(20) << "Name: " << setw(12) << "ID Number" << endl;
cout << setw(12) << setprecision(4)
<< "Average" << setw(6) << "Grade" << endl;
for(int student = 0; student < NumOfStudents; student++)
{
cout << setw(20) << StudentInfo[student].Name << setw(12) << StudentInfo[student].Idnum << endl;
cout << setw(12) << StudentInfo[student].Average << setw(6) << StudentInfo[student].Grade << endl;
}
}
here is the INPUT file that the program reads
10
Mark 2345A78 6 78 67 98 34 78 69
Emily 3246B59 5 89 56 74 59 98
Yao 8942A85 7 98 75 69 89 85 78 95
Claudette 6587C69 5 56 45 63 75 60
Niklos 5874B58 6 69 68 52 69 75 74
Channah 4587B32 7 98 95 100 96 89 96 94
Parissa 8524C84 5 98 96 85 91 90
Rodrick 9856C65 5 56 75 84 65 75
Chance 5648A67 6 100 89 96 89 82 86
Melissa 8786C78 5 80 63 75 77 72
Niels 4854A78 6 48 56 85 65 42 75
Explanation / Answer
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
struct student
{
string name;
string id;
int num;
int test[10];
double avg;
char grade;
};
ifstream infile;
void ReadHeader(int& firstRecord, ifstream& infile)
{
string filename;
cout <<"Enter the .txt file you wish to open: ";
cin >> filename;
infile.open(filename.c_str());
while(!infile)
{
cout <<"Please re-enter a valid .txt file to open: ";
cin >> filename;
infile.open(filename.c_str());
}
infile >> firstRecord;
if (firstRecord < 5)
{
cout <<"Error! program is now ending" << endl;
exit(1);
}
}
student* allo_dyn(int n)
{
student * info = new student[n];
return info;
}
int getdata(student info[], int n)
{
int i = 0;
while(n--)
{
if(infile.eof()) return 0;
infile>>info[i].name;
infile>>info[i].id;
infile>>info[i].num;
int sum = 0;
for(int j =0 ; j<info[i].num ;j++)
{
infile >> info[i].test[j];
sum += info[i].test[j];
}
info[i].avg = double(sum)/(double)info[i].num;
i++;
}
return 1;
}
void cal_grade(student info[],int n)
{
for( int student = 0; student < n; student++)
{
if(info[student].avg > 90)
info[student].grade = 'A';
else if(info[student].avg > 80)
info[student].grade = 'B';
else if(info[student].avg > 70)
info[student].grade = 'C';
else if(info[student].avg > 60)
info[student].grade = 'D';
else
info[student].grade = 'F';
}
}
void display(student StudentInfo[], int NumOfStudents)
{
cout <<"Course Grades" << endl << endl;
cout << setw(20) << "Name: " << setw(12) << "ID Number";
cout << setw(12) << setprecision(4)
<< "Average" << setw(6) << "Grade" << endl;
for(int student = 0; student < NumOfStudents; student++)
{
cout << setw(20) << StudentInfo[student].name << setw(12) << StudentInfo[student].id ;
cout << setw(12) << StudentInfo[student].avg << setw(6) << StudentInfo[student].grade << endl;
}
}
void dealloc(student info[],int n)
{
delete [] info;
}
int main()
{
int firstRecord;
ReadHeader(firstRecord,infile);
student *info = allo_dyn(firstRecord);
int ch =getdata(info,firstRecord);
if(ch == 0)
{
cout <<"Error! program is now ending" << endl;
exit(1);
}
cal_grade(info,firstRecord);
display(info,firstRecord);
dealloc(info,firstRecord);
return 0;
}