fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. class StudentGradesInfo {
  6. private:
  7. static int cnt;
  8. string student_name;
  9. string student_id;
  10. vector<string> course_names;
  11. vector<double> grades;
  12. int idx = -1; // Iterator for grades
  13.  
  14. public:
  15. friend class Printer;
  16. static int total_prints;
  17.  
  18. StudentGradesInfo(string name, string id) : student_name(name), student_id(id) {
  19. cnt++;
  20. }
  21.  
  22. double GetGrade(double grade) {
  23. if (grade < 0 || grade > 100) {
  24. cout << "Invalid grade entered.\n";
  25. return -1;
  26. }
  27. return grade;
  28. }
  29.  
  30. bool AddGrade(double grade, string course_name) {
  31. grade = GetGrade(grade);
  32. if (grade == -1) return false;
  33.  
  34. for (auto course : course_names) {
  35. if (course == course_name) {
  36. cout << "Course already exists.\n";
  37. return false;
  38. }
  39. }
  40. grades.push_back(grade);
  41. course_names.push_back(course_name);
  42. return true;
  43. }
  44.  
  45. string getId() {
  46. return student_id;
  47. }
  48.  
  49. void PrintAllCourses() {
  50. total_prints++;
  51. cout << "Grades for student: " << student_id << "\n";
  52. for (size_t i = 0; i < course_names.size(); ++i)
  53. cout << course_names[i] << " = " << grades[i] << "\n";
  54.  
  55. cout << "-------------------------------------\n";
  56. }
  57.  
  58. int getCourseTotalCount() {
  59. return course_names.size();
  60. }
  61.  
  62. string getCourseName_Grade(int idx) {
  63. if (idx < 0 || idx >= (int)course_names.size()) {
  64. return "invalid";
  65. }
  66. string ans = course_names[idx] + "_" + to_string(grades[idx]);
  67. return ans;
  68. }
  69.  
  70. string get_total_gradesSum() {
  71. double sum = 0;
  72. double total = getCourseTotalCount() * 100.0;
  73. for (size_t i = 0; i < grades.size(); ++i) {
  74. sum += grades[i];
  75. }
  76. return to_string((int)sum) + "/" + to_string((int)total);
  77. }
  78.  
  79. // Iterator functions
  80. string getNext() {
  81. if (!hasNext()) {
  82. cout << "No more courses\n";
  83. return "";
  84. }
  85. idx++;
  86. return course_names[idx] + " = " + to_string((int)grades[idx]);
  87. }
  88.  
  89. bool hasNext() {
  90. return idx + 1 < (int)course_names.size();
  91. }
  92.  
  93. };
  94.  
  95. int StudentGradesInfo::total_prints = 0;
  96. int StudentGradesInfo::cnt = 0;
  97.  
  98. class Printer {
  99. public:
  100. string id, name;
  101. StudentGradesInfo &obj;
  102.  
  103. Printer(StudentGradesInfo& obj) : obj(obj), id(obj.getId()), name(obj.student_name) {}
  104.  
  105. bool hasNext() {
  106. return obj.hasNext();
  107. }
  108.  
  109. string getNext() {
  110. return obj.getNext();
  111. }
  112.  
  113. void resetIterator() {
  114. obj.idx=-1;
  115. }
  116. };
  117.  
  118. int main() {
  119. StudentGradesInfo student("john", "1234");
  120. Printer printer(student);
  121.  
  122. student.AddGrade(50, "Math");
  123. student.AddGrade(60, "programming 1");
  124.  
  125. int limit = 3;
  126. cout << "Print top " << limit << " Grades, if available:\n";
  127. while (limit-- && printer.hasNext()) {
  128. cout <<'\t'<< printer.getNext() << endl;
  129. }
  130.  
  131. student.AddGrade(70, "allgorithm");
  132. student.AddGrade(67, "Programming2");
  133.  
  134. printer.resetIterator();
  135.  
  136. limit = 3;
  137. cout <<endl;
  138. cout << "Print top " << limit << " Grades, if available:\n";
  139. while (limit-- && printer.hasNext()) {
  140. cout <<'\t' <<printer.getNext() << endl;
  141. }
  142.  
  143. return 0;
  144. }
  145.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Print top 3 Grades, if available:
	Math = 50
	programming 1 = 60

Print top 3 Grades, if available:
	Math = 50
	programming 1 = 60
	allgorithm = 70