// File: student.cpp
// Implementation file for class Student operations
// This class represents the information about a student in a class
// ----------------------------------------------------------------------
// Class: CS 210                     Instructor: Drs. Hwang & Roberts
// Assignment: In-class exercise for 4/4/07 & 4/5/07
// Programmer(s): <fill in your name (s)>

#include <iostream>
#include <string>
#include <vector>
#include "student.h"
using namespace std;

// Utility function
void ComputeAverageAndLetterGrade(const vector<double> & scores,
                                  double & average, char & grade);

// Function: Default constructor
Student::Student()
{ 
   average = 0; 
   grade = 'F'; 
}  // end default constructor

// Function: Explicit value constructor
Student::Student(const string & initialName,           // REC'D: initial name
                 const vector<double> & initialScores) // REC'D: initial scores
{
   // Initialize name and scores vector
   name = initialName;
   scores = initialScores;

   // Compute average and grade from scores
   ComputeAverageAndLetterGrade (scores, average, grade);
}  // end explicit-value constructor
   
// Function: Name
// Returns: student's name
string Student::Name() const
{
   return name;
}  // Name
 
// Function: AverageScore
// Returns: student's average score
double Student::AverageScore() const
{
   return average;
}  // end AverageScore

// Function: LetterGrade
// Returns: student's grade
char Student::LetterGrade () const
{
   return grade;
}  // end LetterGrade

// Function: operator==, friend function
// Returns: true if names of operands match, false otherwise
bool operator==(const Student & left,   // REC'D: two Student objects
                const Student & right)
{
   return left.name == right.name;
}  // end operator==

// Function: operator>, friend function
// Returns: true if left operand's average is greater than the 
//          right operand's average, false otherwise
bool operator>(const Student & left,    // REC'D: two Student objects
               const Student & right)
{
   return left.average > right.average;
}  // end operator>

// Function: ComputeAverageAndLetterGrade, free utility function
// Computes the average and letter grade of the scores
void ComputeAverageAndLetterGrade(
   const vector<double> & scores, // REC'D: vector of scores
   double & average,              // PASSED BACK: average of scores
   char & grade)                  // PASSED BACK: grade based on average
{
   double sum = 0.0;   // sum of scores

   // Compute sum of scores
   for (unsigned int i = 0; i < scores.size(); i++)
      sum = sum + scores[i];

   // Compute average
   average = sum/scores.size();

   // Compute letter grade
   if (average >= 90)
      grade = 'A';
   else if (average >= 80)
      grade = 'B';
   else if (average >= 70)
      grade = 'C';
   else if (average >= 60)
      grade = 'D';
   else
      grade = 'F';
}  // end ComputeAverageAndLetterGrade


// ***** Add code here for friend operator>> and operator<< *****

// Function: operator>>, friend function
// Inputs student data in the following format:
//      name
//      score1 score2 ... scoren negative#
// Assumes that the first character in the stream is the first
// character of the name.  Removes the trailing newline after
// the negative number like getline()
// Returns: input stream


// Function: operator<<, friend function
// Outputs student data in the format expected by operator>>:
//
//      name
//      score1 score2 ... scoren negative#
// Assumes calling program will decide whether to put in a trailing newline
// Returns: out
