#include <bits/stdc++.h>
using namespace std;
class StudentGradesInfoWrapper;
class StudentGradesInfo {
private:
static int cnt;
string student_name;
string student_id;
vector<string> course_names;
vector<double> grades;
public:
friend class StudentGradesInfoWrapper;
static int total_prints;
StudentGradesInfo(string name, string id) : student_name(name), student_id(id) {
cnt++;
}
double GetGrade(double grade) {
if (grade < 0 || grade > 100) {
cout << "Invalid grade entered.\n";
return -1;
}
return grade;
}
bool AddGrade(double grade, string course_name) {
grade = GetGrade(grade);
if (grade == -1) return false;
for (auto course : course_names) {
if (course == course_name) {
cout << "Course already exists.\n";
return false;
}
}
grades.push_back(grade);
course_names.push_back(course_name);
return true;
}
string getId() {
return student_id;
}
void PrintAllCourses() {
total_prints++;
cout << "Grades for student: " << student_id << "\n";
for (size_t i = 0; i < course_names.size(); ++i)
cout << course_names[i] << " = " << grades[i] << "\n";
cout << "-------------------------------------\n";
}
int getCourseTotalCount() {
return course_names.size();
}
string getCourseName_Grade(int idx) {
if (idx < 0 || idx >= (int)course_names.size()) {
return "invalid";
}
string ans = course_names[idx] + "_" + to_string(grades[idx]);
return ans;
}
string get_total_gradesSum() {
double sum = 0;
double total = getCourseTotalCount() * 100.0;
for (size_t i = 0; i < grades.size(); ++i) {
sum += grades[i];
}
string ans = to_string((int)sum) + "/" + to_string((int)total);
return ans;
}
};
int StudentGradesInfo::total_prints = 0;
int StudentGradesInfo::cnt = 0;
class StudentGradesInfoWrapper {
public:
string name, id;
StudentGradesInfo obj;
StudentGradesInfoWrapper() = default;
StudentGradesInfoWrapper(string name, string id) : name(name), id(id), obj(name, id) {}
bool add_grade(double grade, string course_n) {
return obj.AddGrade(grade, course_n);
}
string getTotalGradeSuM() {
return obj.get_total_gradesSum();
}
void print() {
obj.PrintAllCourses();
}
int getNumberOfPrints() {
return StudentGradesInfo::total_prints;
}
static int totalStudents() {
return StudentGradesInfo::cnt;
}
};
int main() {
StudentGradesInfoWrapper st1("Mostafa", "5000123");
st1.add_grade(70, "Math");
st1.add_grade(70, "Programming 1");
st1.add_grade(85, "Programming 2");
st1.print();
StudentGradesInfoWrapper st2("Manar", "5000193");
st2.add_grade(75, "Math");
st2.add_grade(77, "Programming 1");
st2.add_grade(95, "Programming 2");
st2.print();
st2.print();
st2.print();
cout << st1.getTotalGradeSuM() << "\n";
cout << st2.getTotalGradeSuM() << "\n";
cout << "Number of Printings : " << StudentGradesInfo::total_prints << endl;
cout << "Number of Students : " << StudentGradesInfoWrapper::totalStudents() << endl;
cout << "Bye\n";
return 0;
}