Project Goal
Build a student management system that tracks students, their grades, GPA, and generates class reports. This project covers OOP, collections, sorting, statistics, and data formatting.
Design
Grade record: subject + scoreStudent class with GPA calculationStudentManager with CRUD, search, rankings- Report generation
Full Code
class Grade {
final String subject;
final double score;
Grade(this.subject, this.score);
String get letterGrade {
if (score >= 90) return 'A';
if (score >= 80) return 'B';
if (score >= 70) return 'C';
if (score >= 60) return 'D';
return 'F';
}
}
class Student {
final int id;
final String name;
final int age;
final List<Grade> grades = [];
Student({required this.id, required this.name, required this.age});
double get gpa {
if (grades.isEmpty) return 0.0;
return grades.fold(0.0, (sum, g) => sum + g.score) / grades.length;
}
String get gpaGrade {
var g = gpa;
if (g >= 90) return 'A (Distinction)';
if (g >= 80) return 'B (Merit)';
if (g >= 70) return 'C (Pass)';
if (g >= 60) return 'D (Borderline)';
return 'F (Fail)';
}
void addGrade(String subject, double score) {
if (score < 0 || score > 100) throw RangeError('Score must be 0–100');
grades.add(Grade(subject, score));
}
@override String toString() =>
'Student($id: $name, Age: $age, GPA: $${gpa.toStringAsFixed(1)} $gpaGrade)';
}
class StudentManager {
final Map<int, Student> _students = {};
int _nextId = 1;
Student add(String name, int age) {
var s = Student(id: _nextId++, name: name, age: age);
_students[s.id] = s;
return s;
}
Student? find(int id) => _students[id];
List<Student> get all => _students.values.toList();
List<Student> get ranked =>
[...all]..sort((a, b) => b.gpa.compareTo(a.gpa));
List<Student> search(String query) =>
all.where((s) => s.name.toLowerCase().contains(query.toLowerCase())).toList();
void report() {
if (all.isEmpty) { print('No students.'); return; }
print('\n===== CLASS REPORT =====');
print('Total students: $${all.length}');
var gpas = all.map((s) => s.gpa).toList();
var avg = gpas.reduce((a, b) => a + b) / gpas.length;
print('Class average GPA: $${avg.toStringAsFixed(2)}');
print('Highest GPA: $${gpas.reduce((a, b) => a > b ? a : b).toStringAsFixed(2)}');
print('\n--- Rankings ---');
var r = ranked;
for (var i = 0; i < r.length; i++) {
print('$${i + 1}. $${r[i]}');
for (var g in r[i].grades) {
print(' $${g.subject}: $${g.score.toStringAsFixed(1)} ($${g.letterGrade})');
}
}
}
}
void main() {
var mgr = StudentManager();
var alice = mgr.add('Alice Johnson', 20);
alice.addGrade('Math', 95.0);
alice.addGrade('Science', 88.5);
alice.addGrade('English', 92.0);
var bob = mgr.add('Bob Smith', 21);
bob.addGrade('Math', 72.0);
bob.addGrade('Science', 68.0);
bob.addGrade('English', 75.5);
var carol = mgr.add('Carol Lee', 19);
carol.addGrade('Math', 98.0);
carol.addGrade('Science', 94.0);
carol.addGrade('English', 96.5);
mgr.report();
print('\n--- Search: "smith" ---');
mgr.search('smith').forEach(print);
}
Challenges
- Add course credit weights for weighted GPA
- Add export to CSV
- Add attendance tracking
- Build a Flutter UI with charts for grade visualization