#include <bits/stdc++.h>
using namespace std;
class StudentGradesInfo {
private:
static int cnt;
string student_name;
string student_id;
vector<string> course_names;
vector<double> grades;
int idx = -1; // Iterator for grades
public:
friend class Printer;
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];
}
return to_string((int)sum) + "/" + to_string((int)total);
}
// Iterator functions
string getNext() {
if (!hasNext()) {
cout << "No more courses\n";
return "";
}
idx++;
return course_names[idx] + " = " + to_string((int)grades[idx]);
}
bool hasNext() {
return idx + 1 < (int)course_names.size();
}
};
int StudentGradesInfo::total_prints = 0;
int StudentGradesInfo::cnt = 0;
class Printer {
public:
string id, name;
StudentGradesInfo &obj;
Printer(StudentGradesInfo& obj) : obj(obj), id(obj.getId()), name(obj.student_name) {}
bool hasNext() {
return obj.hasNext();
}
string getNext() {
return obj.getNext();
}
void resetIterator() {
obj.idx=-1;
}
};
int main() {
StudentGradesInfo student("john", "1234");
Printer printer(student);
student.AddGrade(50, "Math");
student.AddGrade(60, "programming 1");
int limit = 3;
cout << "Print top " << limit << " Grades, if available:\n";
while (limit-- && printer.hasNext()) {
cout <<'\t'<< printer.getNext() << endl;
}
student.AddGrade(70, "allgorithm");
student.AddGrade(67, "Programming2");
printer.resetIterator();
limit = 3;
cout <<endl;
cout << "Print top " << limit << " Grades, if available:\n";
while (limit-- && printer.hasNext()) {
cout <<'\t' <<printer.getNext() << endl;
}
return 0;
}