All Projects
intermediate

Student Management System

A comprehensive student management system using OOP with CRUD operations, grade calculations, and data persistence.

Features
  • Add/update/delete students
  • Grade calculation
  • Search functionality
  • Data persistence with JSON
  • Report generation
Technologies Used
OOPFile HandlingJSONException HandlingCollections
Explanation

Uses classes to model Student and StudentManager. Data is stored in JSON format. The system supports full CRUD operations with input validation.

Source Code
import json
import os

class Student:
    def __init__(self, roll_no, name, marks):
        self.roll_no = roll_no
        self.name = name
        self.marks = marks  # dict: {"Math": 85, "Python": 92}

    @property
    def average(self):
        return sum(self.marks.values()) / len(self.marks) if self.marks else 0

    @property
    def grade(self):
        avg = self.average
        if avg >= 90: return "A+"
        elif avg >= 80: return "A"
        elif avg >= 70: return "B"
        elif avg >= 60: return "C"
        elif avg >= 50: return "D"
        return "F"

    def to_dict(self):
        return {"roll_no": self.roll_no, "name": self.name, "marks": self.marks}

    def __str__(self):
        return f"Roll: {self.roll_no} | {self.name} | Avg: {self.average:.1f} | Grade: {self.grade}"

class StudentManager:
    def __init__(self, filename="students.json"):
        self.filename = filename
        self.students = self._load()

    def _load(self):
        if os.path.exists(self.filename):
            with open(self.filename) as f:
                data = json.load(f)
                return [Student(**s) for s in data]
        return []

    def _save(self):
        with open(self.filename, "w") as f:
            json.dump([s.to_dict() for s in self.students], f, indent=2)

    def add_student(self):
        roll = input("Roll Number: ")
        if any(s.roll_no == roll for s in self.students):
            print("Roll number already exists!")
            return
        name = input("Name: ")
        subjects = input("Subjects (comma-separated): ").split(",")
        marks = {}
        for sub in subjects:
            sub = sub.strip()
            marks[sub] = float(input(f"  Marks in {sub}: "))
        self.students.append(Student(roll, name, marks))
        self._save()
        print(f"✅ Student '{name}' added!")

    def view_all(self):
        if not self.students:
            print("No students found!")
            return
        print("\n--- All Students ---")
        for s in self.students:
            print(f"  {s}")

    def search(self):
        query = input("Search by name or roll: ").lower()
        results = [s for s in self.students if query in s.name.lower() or query == s.roll_no.lower()]
        if results:
            for s in results:
                print(s)
        else:
            print("No students found!")

    def delete(self):
        roll = input("Roll number to delete: ")
        self.students = [s for s in self.students if s.roll_no != roll]
        self._save()
        print("Student deleted!")

def main():
    mgr = StudentManager()
    while True:
        print("\n1.Add 2.View All 3.Search 4.Delete 5.Exit")
        ch = input("Choice: ")
        if ch == "1": mgr.add_student()
        elif ch == "2": mgr.view_all()
        elif ch == "3": mgr.search()
        elif ch == "4": mgr.delete()
        elif ch == "5": break

main()