Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Urgent need help fixing error with vectors: Using c++, I need to complete a grad

ID: 3582877 • Letter: U

Question

Urgent need help fixing error with vectors:

Using c++, I need to complete a gradebook app using classes and vectors.

I keep getting an error in my code that says it is out of memory location when I try to access average by category.

Here is my program thus far:

/*GradeBook application(must have classes - NO CIN in the Gradebook class)

Grade book should allow user to enter categories and weights

if weight doesn't add up to 100%, throw an exception

List of students - list of scores per category(score 0 - 100 points for the category)

List of categories - category name and percentage weight

When entering student name, if it isn't in the list, add it - otherwise update scores

Enter grades by student - then by category, prompt for score for each category

looping menu :

Grade Book should be able to return class average(final score)

return averages score for each category

given a student, return string individual student scores by category and final score
*/

#include<iostream>
#include<string>
#include<vector>
#include <algorithm>
#include"Student.h"
#include"Category.h"
using namespace std;

//in header.h file
class GradeBook
{
public:

   /*double calculateAverage(vector<double> avgVector)
   {
       double average, sum = 0;
       const double grade_count = avgVector.size();
       for (int index = 0; index < grade_count; index++) {
           sum += avgVector[index];
       }
       average = sum / grade_count;
       return average;
  
   }
   */

   void printMenu()
   {
       cout << "--- MENU ---" << endl;
       cout << "[2] Student Grade Report" << endl; //done
       cout << "[3] Total Class Final Grade Average" << endl; //done
       cout << "[4] Class Average Per Category" << endl; //done
       cout << "[5] Add Category and Grade Weights" << endl; //done
       cout << "[6] Add Grade By Student" << endl; //done
       cout << "[0] Quit" << endl;
   }
  
   double studentFinalGrade(int studentIndex)
   {
       double sum = 0;
       int size = students.at(studentIndex).returnGradesSize();
       for (int index = 0; index < size; index++)
       {
           sum += students.at(studentIndex).returnStudentGrades(index);
       }
       return sum;
   }

   void printStudentGradeReport(string name)
   {  
       int studentIndex = returnsStudentIndexFromName(name);
       cout << name << "'s ";
      
       int size = categories.size();

       for (int i = 0; i < size; i++)
       {
           cout << categories.at(i).getCategoryName() << "'s grade is ";
           cout << students.at(studentIndex).returnStudentGrades(i) / categories.at(i).returnWeight();
           cout << "Final grade is " << students.at(studentIndex).finalGrade() << endl;
       }

   }
   double returnStudentCategoryGrade(int categoryIndex, int studentIndex)
   {
       return students.at(studentIndex).returnStudentGrades(studentIndex) / categories.at(categoryIndex).returnWeight();

   }
   double returnCategoryAverage(int categoryIndex)
   {
       double average = 0;
       int size = students.size();
       for (int i = 0; i < size ; i++)
       {
           average += returnStudentCategoryGrade(categoryIndex, i);
       }
       average /= size;
       return average;
   }
   void printCategoryAverages()
   {
       int size = categories.size();
       cout << "Class Average for ";
       for (int i = 0; i < size - 1; i++)
       {
           cout << categories.at(i).getCategoryName() << " is " << returnCategoryAverage(i) << endl;
       }
       cout<< endl;
   }
   int returnsStudentIndexFromName(string name)
   {
       int size = students.size();
       for (int index = 0; index < size; index++)
       {

           if (students.at(index).getStudentName() == name)
               return index;
       }

   }

   double classFinalAverage()
   {
       int size = students.size();
       double sum = 0;
       for (int i = 0; i < size; i++)
       {
           sum += students.at(i).finalGrade();

       }
       sum /= size;
       return sum;
   }

   bool validWeights() //make sure weights add up to a hundred percent
   {
       int size = categories.size();
       double sum = 0;
       for (int i = 0; i < size; i++)
       {
           sum += categories.at(i).returnWeight();
       }
       if (sum == 1.0)
           return true;
       else
           return false;

   }
   void clearCategoryVector()
   {

       categories.clear();

   }

   void fillCategoryVector(string categoryName, int index)
   {
       categories.push_back(category);
       categories.at(index).setCategoryName(categoryName);
       //categories.push_back(categoryName);

   }

   void fillWeightsVector(double categoryWeight, int index)
   {
       categories.push_back(category);
       categories.at(index).setWeight(categoryWeight);
       //categories.push_back(categoryWeight);

   }

   void setName(string firstName, string lastname)
   {
       students.push_back(student);
       int size = students.size() -1;
       students.at(size).setStudentFullName(firstName, lastname);

   }
   string getName()
   {

       return student.getStudentName();
   }
   int returnCategorySize()
   {

       return categories.size();

   }
   string returnCategoryName(int index)
   {


       return categories.at(index).getCategoryName();
   }

   void fillGradesVector(double grade, int studentNumber, int categoryNumber)
   {
       double w = categories.at(categoryNumber).returnWeight(); //weight

       students.at(studentNumber).setGrades(grade, categoryNumber, w);
   }

   int findStudentIndex(string fullName)
   {
       int size = students.size();
       for (int i = 0; i < size; i++)
       {
           if (fullName == students.at(i).getStudentName())
               return i;
       }

   }
private:
   Category category;
   Student student;
   vector<Student> students;
   vector <Category> categories;
  
   double categoryGradeAverage;
   double cGrade;
   double Grade;
   double weight;
   double totalWeights;
   double averageGrade;
  
};

//in Student.h file:

#include<iostream>
#include<string>
#include<vector>
#include <algorithm>
using namespace std;

class Student {
public:

  
   string getStudentName()
   {
       return (fullName);
   }
   void setStudentFullName(string fName,string lName)
   {
       string fullName = fName + lName;
   }
   double returnStudentGrades(int index)
   {
       return grades.at(index); //error here: out of memory location

   }
   int returnGradesSize()
   {
       return grades.size();
   }
   double finalGrade()
   {
       int size = grades.size();
       double finalGrade = 0;
       for (int i = 0; i < size; i++)
       {
           finalGrade += grades.at(i);
       }
       return finalGrade;
   }
   void setGrades(double grade, int index, double weight)
   {
       grades.push_back(grade * weight);
       //grades.at(index) = grade * weight;

   }

private:
   string fullName; // First Name
   vector<double> grades;
  
};

//in Category.h file:

#include<string>
#include<vector>
#include <algorithm>
#include<iostream>
using namespace std;

class Category
{
public:

   void setCategoryName(string cName)
   {
       categoryName = cName;
   }
   string getCategoryName()
   {
       return categoryName;
   }
   double returnWeight()
   {
       return weight;
   }
   void setWeight(double w)
   {
       weight = w;
   }
private:

   double weight;
   string categoryName;
  

};

//in source.cpp file:

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


int main()
{
   int numberOfCategories;
   int running = 1;
GradeBook gradebook;
while (running != 0) {
  
   gradebook.printMenu();

   int choice;
   cin >> choice;
   if (choice == 2) //need to add function to print student grade report
   {
       string studentName;
       string firstName;
       string lastName;
      
       cout << "Enter Student first Name: " << endl;
       cin >> firstName;
       cout << "Enter Student last Name: " << endl;
       cin >> lastName;
       gradebook.setName(firstName, lastName);
       string fullName = gradebook.getName();

       gradebook.printStudentGradeReport(fullName);

   }
   else if (choice == 3)
   {
       cout << "The Class Final Average is " << gradebook.classFinalAverage() << endl;

   }
   else if (choice == 4)
   {
       gradebook.printCategoryAverages();
      
   }
   else if (choice == 5) //need to add grade weights
   {
       string categoryName;
       double categoryWeight;
       bool validInput = false;
       while (validInput != true)
       {

           cout << "Enter number of categories: " << endl;

           cin >> numberOfCategories;

           for (int i = 0; i < numberOfCategories; i++)
           {
               cout << "Enter Category Name: " << endl;
               cin >> categoryName;
               gradebook.fillCategoryVector(categoryName,i);
               cout << "Enter Category Weight: " << endl;
               cin >> categoryWeight;
               gradebook.fillWeightsVector(categoryWeight, i);

           }


           if (gradebook.validWeights() != true)
           {
               throw "Weights does not add up to 100 percent!";
               gradebook.clearCategoryVector();

           }
           else
           {
               validInput = true;
           }
       }

      

   }
   else if (choice == 6)
   {
       string studentName;
       string firstName;
       string lastName;
       double grade;
       cout << "Enter Student first Name: " << endl;
       cin >> firstName;
       cout << "Enter Student last Name: " << endl;
       cin >> lastName;
       gradebook.setName(firstName, lastName);
       string fullName = gradebook.getName();
       int studentIndex = gradebook.findStudentIndex(fullName);

       for (int i = 0; i < numberOfCategories; i++)
       {
           cout << "Enter Grade for " << gradebook.returnCategoryName(i) << endl;
           cin >> grade;
           gradebook.fillGradesVector(grade, studentIndex, i);

       }

   }

   else if (choice == 0)
   {
       running = 0;

   }
}
   system("pause");
   return 0;

}

Explanation / Answer

double returnCategoryAverage(int categoryIndex)
   {
       double average = 0;
       int size = = categories.size();

       for (int i = 0; i < size ; i++)
       {
           average += returnStudentCategoryGrade(categoryIndex, i);
       }
       average /= size;
       return average;
   }

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote