#include <bits/stdc++.h>
using namespace std;
class Student {
public:
int id;
unordered_map<int, int> grades;
Student(int sId) : id(sId) {}
void addGrade(int aId, int grd) {
grades[aId] = grd;
}
float getAverageGrade() {
if (grades.empty()) {
cout << "No grades available for student " << id << "." << endl;
return -1.0f;
}
int total = 0;
for (auto const& p : grades) {
total += p.second;
}
return static_cast<float>(total) / grades.size();
}
};
class Assignment {
public:
int id;
Assignment(int aId) : id(aId) {}
};
class Course {
private:
unordered_map<int, Student> stds;
unordered_map<int, Assignment> asgns;
public:
Course() {}
void addAssignment(int aId) {
if (asgns.count(aId)) {
cout << "Assignment " << aId << " already exists." << endl;
return;
}
asgns.emplace(aId, Assignment(aId));
}
void enrollStudent(int sId) {
if (stds.count(sId)) {
cout << "Student " << sId << " is already enrolled." << endl;
return;
}
stds.emplace(sId, Student(sId));
}
void addStudentGrade(int sId, int aId, int grd) {
if (!stds.count(sId)) {
cout << "Student " << sId << " is not enrolled." << endl;
return;
}
if (!asgns.count(aId)) {
cout << "Assignment " << aId << " does not exist." << endl;
return;
}
stds.at(sId).addGrade(aId, grd);
}
float getStudentGrade(int sId) {
if (!stds.count(sId)) {
cout << "Student " << sId << " is not enrolled." << endl;
return -1.0f;
}
return stds.at(sId).getAverageGrade();
}
};
int main() {
Course course;
cout << "--- Initial Setup ---" << endl;
course.enrollStudent(101);
course.enrollStudent(102);
course.enrollStudent(103);
course.enrollStudent(104);
course.enrollStudent(101);
course.addAssignment(1);
course.addAssignment(2);
course.addAssignment(3);
course.addAssignment(1);
cout << "\n--- Adding Grades ---" << endl;
course.addStudentGrade(101, 1, 90);
course.addStudentGrade(101, 2, 80);
course.addStudentGrade(102, 1, 100);
course.addStudentGrade(102, 2, 95);
course.addStudentGrade(102, 3, 98);
course.addStudentGrade(103, 1, 85);
course.addStudentGrade(103, 2, 88);
course.addStudentGrade(105, 1, 90);
course.addStudentGrade(101, 4, 90);
cout << "\n--- Calculating Averages ---" << endl;
cout << "Student 101 Average: " << course.getStudentGrade(101) << endl;
cout << "Student 102 Average: " << course.getStudentGrade(102) << endl;
cout << "Student 104 Average: " << course.getStudentGrade(104) << endl;
}