1) Add the following menu items and implement functions that take care of their
ID: 3669871 • Letter: 1
Question
1) Add the following menu items and implement functions that take care of their respective selection:
a. Sorting the students based on the graduation date
b. Sorting the students based on GPA You must use member function(s) of the corresponding struct to perform the comparison. You must use constructor(s) to initialize all data variables with default values at the beginning of the program.
2.Your task for this portion of the assignment is to choose one of these member functions which you used in part-1 of this assignment to perform the comparison and make it a non-member of the struct. You will need to make the appropriate changes accordingly. Your program should also compile and run. The user of the program should not notice any difference when running the program with any of your implementations for Part-1 and Part-2 of this assignment.
Heres what i have:
#include <iostream> //for cout, cin
#include <iomanip> // for setw, fixed, setprecision() manipulators
#include <fstream> //for file input/output
#include <string.h> //for string types usage
#include <cstdlib>
using namespace std;
/*
Structure to store the date
*/
struct Date
{
int month;
int day;
int year;
};
/*
Structure to store students data
*/
struct Student
{
string firstname;
string lastname;
string uin;
string major;
float gpa;
char graduationStatus;
Date graduationDate;
};
Student* readStudentsFromFile(int &totalStudents);
void menu(Student *students, int totalStudents);
void printHorizontalLine( int width, char border_char );
void printStudents(Student *students, int totalStudents, char graduationStatusFlag = 'N', float gpaThreshold = -1, string majorFilter = "");
/*
* Entry point
*/
int main()
{
Student *allStudentsPointer;
int totalStudents = 0;
allStudentsPointer = readStudentsFromFile(totalStudents);
menu(allStudentsPointer, totalStudents);
if( allStudentsPointer == NULL )
{
return 0;
}
return 0;
}
/*
* Responsible for reading students records from students.txt into students array of structs
*
*
* @param totalStudents: reference variable which post execution, contains size of students
* @param return: pointer pointing to the array of structs containing students' data
*/
Student* readStudentsFromFile(int &totalStudents)
{
Student *allStudentsPointer;
//input stream for students data
ifstream allStudentsInFile;
//open students file
allStudentsInFile.open("students.txt");
//error handling in case file does not exist - start
if( !allStudentsInFile )
{
cout << "Error opening students.txt" << endl;
return NULL;
}
//error handling in case file does not exist - end
cout << "Success opening students.txt" << endl;
allStudentsInFile >> totalStudents;
allStudentsPointer = new Student[totalStudents];
cout << "totalStudents: " << totalStudents << endl;
for(int i = 0; i < totalStudents; i++)
{
allStudentsInFile >> allStudentsPointer[i].firstname;
allStudentsInFile >> allStudentsPointer[i].lastname;
allStudentsInFile >> allStudentsPointer[i].id;
allStudentsInFile >> allStudentsPointer[i].major;
allStudentsInFile >> allStudentsPointer[i].gpa;
allStudentsInFile >> allStudentsPointer[i].graduationStatus;
//graduationDate only exists when graduationStatus = 'Y'
if( allStudentsPointer[i].graduationStatus == 'Y' )
{
char delimiter;
allStudentsInFile >> allStudentsPointer[i].graduationDate.month;
allStudentsInFile >> delimiter;
allStudentsInFile >> allStudentsPointer[i].graduationDate.day;
allStudentsInFile >> delimiter;
allStudentsInFile >> allStudentsPointer[i].graduationDate.year;
}
}
allStudentsInFile.close();
return allStudentsPointer;
}
/*
* Responsible for printing menu and handling user selection
*
*
* @param students: pointer pointing to the array of structs containing students' data
* @param totalStudents: size of students
*/
void menu(Student *students, int totalStudents)
{
int input;
cout << endl;
cout << "Press 0 to print all students" <<endl;
cout << "Press 1 to print only students who graduated" << endl;
cout << "Press 2 to print only students with gpa >= value" << endl;
cout << "Press 3 to print only students of a given major" << endl;
cout << "Press 4 to exit: ";
while( true )
{
cin >> input;
if( input == 0 )
{
printStudents(students, totalStudents);
}
else if( input == 1 )
{
//graduated students
printStudents(students, totalStudents, 'Y');
}
else if( input == 2 )
{
float gpaThreshold;
cout << "Enter gpa filter value: ";
cin >> gpaThreshold;
//gpa filter
printStudents(students, totalStudents, 'N', gpaThreshold);
}
else if( input == 3 )
{
//major filter
string majorFilter;
cout << "Enter major filter value: ";
cin >> majorFilter;
printStudents(students, totalStudents, 'N', -1, majorFilter);
}
else if( input == 4 )
{
exit(0);
}
}
}
/*
* Responsible for printing the students array of structs
*
*
* @param students: pointer pointing to the array of structs containing students' data
* @param totalStudents: size of students
* @param graduationStatusFlag: flag to activate print for students who have graduated
* @param gpaThreshold: flag to activate print for students with gpa > gpaThreshold
* @param majorFilter: variable to activate print for students with major, majorFilter
*/
void printStudents(Student *students, int totalStudents, char graduationStatusFlag, float gpaThreshold, string majorFilter)
{
if( students == NULL || totalStudents < 1 )
{
return;
}
printHorizontalLine(80, '*');
printHorizontalLine(80, '*');
for(int i = 0; i < totalStudents; i++)
{
// filter - start
if( graduationStatusFlag == 'Y' )
{
// skip students who haven't graduated
if( students[i].graduationStatus == 'N' )
{
continue;
}
}
else if( gpaThreshold != -1 )
{
// skip students with gpa < gpaThreshold
if( students[i].gpa < gpaThreshold )
{
continue;
}
}
else if( majorFilter.length() != 0 )
{
// skip students with major != majorFilter
if( students[i].major != majorFilter )
{
continue;
}
}
// filter - end
cout.clear();
cout.fill(' ');
cout << left << setw(3)
<< i
<< left << setw(10)
<< students[i].firstname
<< left << setw(10)
<< students[i].lastname
<< left << setw(15)
<< students[i].id
<< left << setw(10)
<< students[i].major
<< setw(10)
<< fixed
<< setprecision(2)
<< showpoint
<< students[i].gpa
<< left
<< setw(5)
<< students[i].graduationStatus;
if( students[i].graduationStatus == 'Y' )
{
cout
<< right <<setw(2) << setfill('0')
<< students[i].graduationDate.month
<< ":"
<< right <<setw(2) << setfill('0')
<< students[i].graduationDate.day
<< ":"
<< right <<setw(2) << setfill('0')
<< students[i].graduationDate.year;
}
cout << endl;
}
printHorizontalLine(80, '*');
printHorizontalLine(80, '*');
cout << endl;
cout << "Press 0 to print all students" <<endl;
cout << "Press 1 to print only students who graduated" << endl;
cout << "Press 2 to print only students with gpa >= value" << endl;
cout << "Press 3 to print only students of a given major" << endl;
cout << "Press 4 to exit: ";
}
/*
* Responsible for printing a horizontal line which consists of border_char characters
*
*
* @param width: count of border_char
* @param border_char: width made out of characters
*/
void printHorizontalLine( int width, char border_char )
{
cout.fill( border_char );
cout << setw( width ) << border_char << " ";
cout.fill(' ');
}
Students.txt
10
Alex Plat 000000000 CSC 4.0 N
Bruno Mars 000000001 ENG 2.0 Y 08:04:2015
Nick Burten 000000002 PHY 3.5 Y 02:03:2015
Chloe Tig 000000003 CSC 4.0 N
Clint Salonop 000000004 PHY 3.0 N
Val Zim 000000005 ENG 3.0 Y 11:09:2015
Brad Prashe 000000006 MUS 4.0 N
David Armstrong 000000007 SOC 3.5 Y 06:11:2014
Jorge Rutyio 000000008 PHY 3.0 Y 09:11:2013
Ruby Kanty 000000009 POL 2.8 Y 09:11:2012
Explanation / Answer
Hi, You can modify you Student structure like this
/*
Structure to store the date
*/
struct Date
{
int month;
int day;
int year;
};
/*
Structure to store students data
*/
struct Student
{
string firstname;
string lastname;
string id;
string major;
float gpa;
char graduationStatus;
Date graduationDate;
//a
static bool customCompare(const Student &x, const Student &y)
{
return dateCompare(x.graduationDate,y.graduationDate);
//(x.graduationDate < y.graduationDate);
}
static bool dateCompare(const Date &x, const Date &y)
{
return (x.day < y.day)&&
(x.month < y.month)&&
(x.year < y.year);
}
//b
static bool gpaCompare(const Student &x, const Student &y)
{
return (x.gpa < y.gpa);
}
};
and you can add extra menu in menu function and call a sort function where you can pass student pointer and along with one of compare methods.
Part2:
bool dateCompare(Student s1, Student s1)
{
Date x = s1.graduationDate;
Date y = s2.graduationDate;
return (x.day < y.day)&&
(x.month < y.month)&&
(x.year < y.year);
}
bool gpaCompare(Student s1, Student s1)
{
return s1.gpa < s2.gpa;
}
Add these methoda parallel to main method .
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.