Code:
#include <iostream.h>
#include <iomanip.h>
#include <string>
// function prototypes
void SortByGPAs( // Sort arrays by GPAs
int NextIndex, // IN: First unused position in arrays
int StudIds[], // IN/OUT: array of student nos - to be sorted
int SumOfGrades[], // IN/OUT: array of sums of grades - to be sorted
int NumSubjs[]);
void Swap( // Swap the two values
int &Candidate1,
int &Candidate2);
void SimpleMindedClrScr(void);// Clear the screen
bool MoreSubjects(void); // Prompt user for more subjects Y/N?
// routines from Study Guide
void ReadInteger(int &Integer); // function definition
void Clear(void);
void ReadChar(char &Char);
//my prototypes
char *read_course_name(char* course_name);
void print_welcome(void);
void read_subjects(char* course_name);
void read_subject(char* course_name);
void print_grade_distribution(
char* course_name,
char* subject_name,
int A,
int B,
int C,
int D);
void check_student_id();
const int MIN_STUDENT_ID = 1000;
const int MAX_STUDENT_ID = 9999;
const int SUBJ_LEN = 7;
int StudIds[MAX_STUDENT_ID - MIN_STUDENT_ID];
int NumSubjs[MAX_STUDENT_ID - MIN_STUDENT_ID];
int SumOfGrades[MAX_STUDENT_ID - MIN_STUDENT_ID];
int next_free = 0;
//function implementations
void main(void)
{
char course_name[80];
print_welcome();
read_course_name(course_name);
read_subjects(course_name);
//print_order_of_merit(course_name);
}
void print_welcome(void)
{
SimpleMindedClrScr();
cout<<setw(50);
cout<<"Course Profiling System\n";
cout<<endl;
cout<<endl;
cout<<"\t Generates a grade distribution and GPA for each subject and";
cout<<endl;
cout<<"\tstudent GPAs with recommendations for commendations & exclusion.\n";
cout<<endl;
cout<<endl;
}
char *read_course_name(char* course_name)
{
cout<< setw(50);
cout<<"Course and Subject Entry";
cout<< endl;
cout<< endl;
cout<<"\tCourse ==> ";
cin.getline(course_name, 80);
return course_name;
}
void read_subjects(char* course_name)
{
do
{
read_subject(course_name);
} while (MoreSubjects());
}
void read_subject(char* course_name)
{
char* subject_name;
int no_of_A = 0;
int no_of_B = 0;
int no_of_C = 0;
int no_of_D = 0;
cout<<endl;
cout<< "\tSubject ==>";
cin >> setw(SUBJ_LEN) >> subject_name;
SimpleMindedClrScr();
cout<<"\t\t";
cout<<course_name;
cout<<"\t";
cout<<subject_name;
cout<<endl;
cout<<endl;
cout<<setw(40);
cout<<"Student Grade Entry" << endl;
cout<< endl;
while (1)
{
int student_id;
char grade;
cout<<"\t Student Number (0 to exit) ==> ";
Clear();
check_student_id();
ReadInteger(student_id);
// Break out of the loop when a 0 student id is entered
if (student_id == 0)
break;
cout<<endl;
cout<<"\t Grade (A,B,C or D) ==> ";
ReadChar(grade);
// Search for student id in array
int i;
bool found = false;
for (i=0; i < next_free && !found; i++)
{
if (StudIds[i] == student_id)
found = true;
}
if (found)
{
// This student id has been used before
NumSubjs[i]++;
SumOfGrades[i] +=
static_cast<int>('C') - static_cast<int>(grade) + 1;
}
else
{
// This student id is new
StudIds[next_free] = student_id;
NumSubjs[next_free] = 1;
SumOfGrades[next_free] =
static_cast<int>('C') - static_cast<int>(grade) + 1;
}
// Increment the count of different grades
switch (grade)
{
case 'A': no_of_A++; break;
case 'B': no_of_B++; break;
case 'C': no_of_C++; break;
case 'D': no_of_D++; break;
}
} // Loop and read another student_id/grade
print_grade_distribution(course_name, subject_name, no_of_A, no_of_B, no_of_C, no_of_D);
}
void check_student_id()
{
while(StudIds==false)
{
cout<<"ERROR:Must in range 1000....9999 (0 to exit)";
cout<<endl;
cout<<endl;
cout<<"\t Student Number (0 to exit) ==> ";
}
}
void print_grade_distribution(
char* course_name, char* subject_name, int A, int B, int C, int D)
{
int total = A + B + C + D;
int gpa = ((3 * A) + (2 * B) + (1 * C) + (0 * D)) / total;
cout << course_name << " " << subject_name << endl;
cout << endl;
cout << "Grade Distribution" << endl;
cout << endl;
cout << "A B C D Total" << endl;
cout << A << " " << B << " " << C << " " << D << " ";
cout << A + B + C + D << endl;
cout << endl;
cout << "Subject GPA: " << gpa << endl;
cout << endl;
}
/****************************************************************************
SortByGPAs
Process: Sort arrays in descending order by GPA - insertion sort
When GPAs are equal, sort in descending order of NumSubjs
input: int NextIndex: First unused position in arrays
int StudIds[]: array of student nos - to be sorted
int SumOfGrades[]: array of sums of grades - to be sorted
int NumSubjs[]: array of number of subjects - to be sorted
output: int StudIds[]: array of student nos - sorted
int SumOfGrades[]: array of sums of grades - sorted
int NumSubjs[]: array of number of subjects - sorted
****************************************************************************/
void SortByGPAs( // Sort arrays by GPAs
int NextIndex, // IN: First unused position in arrays
int StudIds[], // IN/OUT: array of student nos - to be sorted
int SumOfGrades[], // IN/OUT: array of sums of grades - to be sorted
int NumSubjs[])
{
int
GPABy100, // GPA multiplied by 100 as an int
GPABy100Prev; // " "
// NextIndex is first unused position in arrays
for (int i = 1; i < NextIndex; i++)
{
// Sort into descending GPA order - when GPAs are equal sort
// into descending number-of-subjects order
// To avoid floating-point comparisons, multiply GPAs by 100 and
// do integer comparisons
for (int j = i; j > 0 &&
(GPABy100 = SumOfGrades[j] * 100 / NumSubjs[j]) >=
(GPABy100Prev = SumOfGrades[j-1] * 100 / NumSubjs[j-1]); j--)
{
// Swap elements if: 1) GPABy100 is greater
// 2) GPABy100s are equal and NumSubjs greater
if (GPABy100 > GPABy100Prev || (GPABy100 == GPABy100Prev &&
NumSubjs[j] > NumSubjs[j-1]))
{ // swap elements in all arrays
Swap(StudIds[j], StudIds[j-1]);
Swap(NumSubjs[j], NumSubjs[j-1]);
Swap(SumOfGrades[j], SumOfGrades[j-1]);
}
}
}
}
/****************************************************************************
Swap
Process: Swap 2 integer values
input: int &Candidate1: value to be swapped
int &Candidate2: value to be swapped
output: int &Candidate1: value swapped - old Candidate2
int &Candidate2: value swapped - old Candidate1
****************************************************************************/
void Swap(
int &Candidate1,
int &Candidate2)
{
int TmpSwap;
TmpSwap = Candidate1;
Candidate1 = Candidate2;
Candidate2 = TmpSwap;
}
/****************************************************************************
MoreSubjects
Process: Determine if the user wants to continue. Validate
respones (Y/y/N/n valid)
on entry:
on exit:
input:
output: bool function return value: true to continue, false to exit
****************************************************************************/
bool MoreSubjects(void)
{
char
More = ' ';
// loop until user enters Y/y or N/n, printing
// error msgs for invalid responses
while (More != 'Y' && More != 'N') {
cout << "Another Subject? ";
ReadChar(More);
cout << endl;
More = toupper(More); // change to upper case
cout << endl;
// output error message if response invalid
if (More != 'Y' && More != 'N')
cout << "ERROR: Valid responses are 'Y' or 'N'" << endl << endl;
} // end while
// return user response
return (More == 'Y');
}
/****************************************************************************
SimpleMindedClrScr
Process: Clear the screen.
input:
output:
****************************************************************************/
void SimpleMindedClrScr(void)
{
const int
SCREEN_LINES = 24;
for (int i = 0; i < SCREEN_LINES; i++)
cout << endl;
}
/****************************************************************************
Clear
process: Clear standard input to end of line
input:
output:
****************************************************************************/
void Clear(void)
{
char Char = ' ';
while (Char != '\n')
{
cin.get(Char);
}
}
/****************************************************************************
ReadChar
process: Read a character value from standard input
input:
output: int Integer: the value read
****************************************************************************/
void ReadChar(char &Char)
{
cin >> Char;
Clear(); // clear to end of line
}
/****************************************************************************
ReadInteger
process: Read (and validate) an integer value from standard input
input:
output: int Integer: the value read
****************************************************************************/
void ReadInteger(int &Integer) // function definition
{
cin >> Integer;
while (cin.fail())
{
cin.clear(); // clear input stream flags
Clear(); // clear to end of line
cout << "ERROR: You must enter an integer ==> ";
cin >> Integer; // try again
}
Clear(); // clear to end of line
}
Facemaster: nah, im just a beginner . .