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;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.