-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.py
114 lines (92 loc) · 4.04 KB
/
main.py
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import streamlit as st
import json
def load_semesters():
try:
with open('semesters.json', 'r') as file:
data = json.load(file)
return data
except FileNotFoundError:
st.error("Error: semesters.json file not found.")
return {}
except json.JSONDecodeError:
st.error("Error: Invalid JSON in semesters.json file.")
return {}
def calculate_grade_point(marks, full_marks):
if marks/full_marks >= 0.8:
return 4.0
elif marks/full_marks >= 0.75:
return 3.7
elif marks/full_marks >= 0.70:
return 3.3
elif marks/full_marks >= 0.65:
return 3.0
elif marks/full_marks >= 0.60:
return 2.7
elif marks/full_marks >= 0.55:
return 2.3
elif marks/full_marks >= 0.50:
return 2.0
elif marks/full_marks >= 0.45:
return 1.7
else:
return 1.0
def calculate_gpa(marks_list, credit_hours, full_marks_list):
total_points = sum(calculate_grade_point(marks, full_marks) * credit for marks, credit, full_marks in zip(marks_list, credit_hours, full_marks_list))
total_credits = sum(credit_hours)
return total_points / total_credits if total_credits != 0 else 0
st.set_page_config(page_title="IOE CGPA Calculator", page_icon=":chart_with_upwards_trend:", layout="wide")
# Custom CSS to reduce input field padding
st.markdown("""
<style>
.stNumberInput>div>div>input {
padding: 0.2rem 0.4rem;
}
.stNumberInput>div>div>div {
padding: 0.1rem 0.2rem;
}
</style>
""", unsafe_allow_html=True)
st.title("IOE CGPA Calculator")
data = load_semesters()
# Field selection
field = st.selectbox("Select your field of study:", ["BCT", "BEI"])
if field in data:
semesters = data[field]
selected_semester = st.selectbox("Select the semester to calculate CGPA up to:", list(semesters.keys()))
all_marks = []
full_marks = []
all_credits = []
for sem, subjects in semesters.items():
if sem > selected_semester:
break
st.header(f"Year: {sem.split('/')[0]}, Semester: {sem.split('/')[1]}")
for subject in subjects:
st.subheader(f"{subject['title']} ({subject['code']})")
col1, col2, col3, col4, col5 = st.columns([2,2,2,2,1], gap="small")
with col1:
theory_ass = st.number_input(
"Theory Ass", min_value=0, max_value=subject['theory_ass'] or 0,
key=f"{field}_{sem}_{subject['code']}_theory_ass") if subject['theory_ass'] is not None else None
with col2:
theory_final = st.number_input(
"Theory Final", min_value=0, max_value=subject['theory_final'] or 0,
key=f"{field}_{sem}_{subject['code']}_theory_final") if subject['theory_final'] is not None else None
with col3:
practical_ass = st.number_input(
"Practical Ass", min_value=0, max_value=subject['practical_ass'] or 0,
key=f"{field}_{sem}_{subject['code']}_practical_ass") if subject['practical_ass'] is not None else None
with col4:
practical_final = st.number_input(
"Practical Final", min_value=0, max_value=subject['practical_final'] or 0,
key=f"{field}_{sem}_{subject['code']}_practical_final") if subject['practical_final'] is not None else None
total_marks = sum(filter(None, [theory_ass, theory_final, practical_ass, practical_final]))
full_marks.append(sum(filter(None, [subject['theory_ass'], subject['theory_final'], subject['practical_ass'], subject['practical_final']])))
all_marks.append(total_marks)
all_credits.append(subject['credits'])
with col5:
st.metric("Total", total_marks)
st.divider()
cgpa = calculate_gpa(all_marks, all_credits, full_marks)
st.write(f"CGPA up to Semester {selected_semester}: {cgpa:.3f}")
else:
st.error(f"No data available for {field}. Please check your semesters.json file.")