Change the program to work without fstream being a global variable, remove any/a
ID: 3556377 • Letter: C
Question
Change the program to work without fstream being a global variable, remove any/all infinite loops while retaining the operation of the code.
using namespace std;
struct Student
{
string name;
string ID;
int testNumber;
int *tests;
double average;
char grade;
};
int readHeader();
Student *allocate(int);
void readRecords(Student*, int);
void print(Student*, int);
void deallocate(Student*);
ifstream inFile;
int main()
{
int n = readHeader();
if (n == -1){
return 0;
}
Student *s = allocate(n);
readRecords(s, n);
for (int i = 0; i print(s, i);
}
deallocate(s);
inFile.close();
cout << "Press Enter to end -->";
cin.ignore();
return 0;
}
int readHeader()
{
string filename;
int a;
while (true){
cout << "Please enter the input filename --> ";
cin >> filename;
inFile.open(filename.c_str(), ifstream::in);
if (inFile.is_open()){
inFile >> a;
if (a<5){
return -1;
}
cout << " ";
return a;
break;
}
}
return -1;
}
Student *allocate(int a)
{
return new Student[a];
}
void readRecords(Student *s, int a)
{
for (int i = 0; i int sum = 0;
inFile >> s[i].name;
inFile >> s[i].ID;
inFile >> s[i].testNumber;
s[i].tests = new int[s[i].testNumber];
for (int counter = 0; counter inFile >> s[i].tests[counter];
sum += s[i].tests[counter];
}
s[i].average = sum / (s[i].testNumber);
if (s[i].average >= 91){
s[i].grade = 'A';
}
else if (s[i].average >= 81){
s[i].grade = 'B';
}
else if (s[i].average >= 71){
s[i].grade = 'C';
}
else if (s[i].average >= 60){
s[i].grade = 'D';
}
else{
s[i].grade = 'F';
}
}
}
void print(Student *s, int i)
{
cout << "Name : " << s[i].name << " ID Number: " << s[i].ID << endl;
cout << "Test Scores: ";
for (int counter = 0; counter cout << s[i].tests[counter] << " ";
}
cout << " Average: " << s[i].average << " Grade: " << s[i].grade;
cout << " ";
}
void deallocate(Student *s)
{
delete[] s;
}
Explanation / Answer
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct Student
{
string name;
string ID;
int testNumber;
int *tests;
double average;
char grade;
};
int readHeader(ifstream&);
Student *allocate(int);
void readRecords(ifstream&, Student*, int);
void print(Student*, int);
void deallocate(Student*);
int main()
{
ifstream inFile;
int n = readHeader(inFile);
if (n == -1){
return 0;
}
Student *s = allocate(n);
readRecords(inFile,s, n);
for (int i = 0; i<n; i++){
print(s, i);
}
deallocate(s);
inFile.close();
cout << "Press Enter to end -->";
cin.ignore();
return 0;
}
int readHeader(ifstream& inFile)
{
int a;
string filename;
cout << "Please enter the input filename --> ";
cin >> filename;
inFile.open(filename.c_str(), ifstream::in);
while(!inFile.is_open())
{
cout << "Please enter the input filename --> ";
cin >> filename;
inFile.open(filename.c_str(), ifstream::in);
}
inFile >> a;
if (a<5)
{
return -1;
}
cout << " ";
return a;
}
Student *allocate(int a)
{
return new Student[a];
}
void readRecords(ifstream& inFile,Student *s, int a)
{
for (int i = 0; i<a; i++){
int sum = 0;
inFile >> s[i].name;
inFile >> s[i].ID;
inFile >> s[i].testNumber;
s[i].tests = new int[s[i].testNumber];
for (int counter = 0; counter<s[i].testNumber; counter++){
inFile >> s[i].tests[counter];
sum += s[i].tests[counter];
}
s[i].average = sum / (s[i].testNumber);
if (s[i].average >= 91){
s[i].grade = 'A';
}
else if (s[i].average >= 81){
s[i].grade = 'B';
}
else if (s[i].average >= 71){
s[i].grade = 'C';
}
else if (s[i].average >= 60){
s[i].grade = 'D';
}
else{
s[i].grade = 'F';
}
}
}
void print(Student *s, int i)
{
cout << "Name : " << s[i].name << " ID Number: " << s[i].ID << endl;
cout << "Test Scores: ";
for (int counter = 0; counter<s[i].testNumber; counter++){
cout << s[i].tests[counter] << " ";
}
cout << " Average: " << s[i].average << " Grade: " << s[i].grade;
cout << " ";
}
void deallocate(Student *s)
{
delete[] s;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.