File size: 2,561 Bytes
445c3c5
e23d813
 
 
 
 
 
 
 
 
 
445c3c5
 
 
e23d813
445c3c5
 
 
 
 
e23d813
445c3c5
 
 
 
 
 
 
e23d813
445c3c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e23d813
445c3c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import gradio as gr
import pandas as pd

# Grade to grade point mapping
grade_points = {
    "A": 4.0, "A-": 3.7,
    "B+": 3.3, "B": 3.0, "B-": 2.7,
    "C+": 2.3, "C": 2.0, "C-": 1.7,
    "D+": 1.3, "D": 1.0, "F": 0.0
}

def calculate_gpa(subjects, prev_credits=0, prev_gpa=0):
    if not subjects:
        return 0, 0
    
    df = pd.DataFrame(subjects)
    df['Points'] = df['Grade'].map(grade_points) * df['Credit']
    current_points = df['Points'].sum()
    current_credits = df['Credit'].sum()
    current_gpa = round(current_points / current_credits, 2) if current_credits > 0 else 0
    
    if prev_credits > 0:
        total_credits = prev_credits + current_credits
        cgpa = round((prev_gpa * prev_credits + current_points) / total_credits, 2)
    else:
        cgpa = current_gpa
    
    return current_gpa, cgpa

with gr.Blocks(title="GPA Calculator") as demo:
    gr.Markdown("# πŸ“Š GPA/CGPA Calculator")
    
    with gr.Row():
        with gr.Column():
            subject = gr.Textbox(label="Subject Name")
            grade = gr.Dropdown(list(grade_points.keys()), label="Grade")
            credit = gr.Number(3.0, label="Credit Hours", minimum=0.5, step=0.5)
            add_btn = gr.Button("Add Subject")
            
        with gr.Column():
            subjects_table = gr.Dataframe(headers=["Subject", "Grade", "Credit"])
            clear_btn = gr.Button("Clear All")
    
    with gr.Accordion("Previous Semester Data (Optional)", open=False):
        prev_credits = gr.Number(0, label="Previous Total Credits")
        prev_gpa = gr.Number(0, label="Previous GPA", minimum=0, maximum=4.0)
    
    calculate_btn = gr.Button("Calculate GPA")
    
    with gr.Row():
        current_gpa = gr.Number(label="Current Semester GPA")
        overall_cgpa = gr.Number(label="Overall CGPA")
    
    subjects = gr.State([])
    
    def add_subject(subject, grade, credit, existing_subjects):
        new_subject = {"Subject": subject, "Grade": grade, "Credit": credit}
        return existing_subjects + [new_subject], pd.DataFrame(existing_subjects + [new_subject])
    
    add_btn.click(
        add_subject,
        inputs=[subject, grade, credit, subjects],
        outputs=[subjects, subjects_table]
    )
    
    clear_btn.click(
        lambda: ([], pd.DataFrame(columns=["Subject", "Grade", "Credit"])),
        outputs=[subjects, subjects_table]
    )
    
    calculate_btn.click(
        calculate_gpa,
        inputs=[subjects, prev_credits, prev_gpa],
        outputs=[current_gpa, overall_cgpa]
    )

demo.launch()