#include <bits/stdc++.h>
using namespace std;
struct Student {
int id;
int totalScore{0};
unordered_map<int, int> grades;
};
struct Assignment {
int id;
};
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;
}
auto& std = stds.at(sId);
if (std.grades.count(aId)) {
std.totalScore -= std.grades[aId];
}
std.totalScore += grd;
std.grades[aId] = grd;
}
float getStudentGrade(int sId) {
if (!stds.count(sId)) {
cout << "Student " << sId << " is not enrolled." << endl;
return -1.0f;
}
auto& std = stds.at(sId);
if (std.grades.empty()) {
cout << "No grades available for student " << sId << "." << endl;
return -1.0f;
}
return static_cast<float>(std.totalScore) / std.grades.size();
}
};
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;
}