Repository navigation
Expand file tree
/
Copy pathmain.py
More file actions
198 lines (159 loc) · 5.65 KB
/
Copy pathmain.py
File metadata and controls
198 lines (159 loc) · 5.65 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
"""
main.py
Entry point for the Student Manager command-line application.
Displays a menu and lets the user add, view, search, edit, delete,
and analyze student records, which are stored persistently in
students.json.
"""
from student_manager import StudentManager
MENU = """
==========================================
STUDENT MANAGER
==========================================
1. Add Student
2. View All Students
3. Search Student
4. Edit Student
5. Delete Student
6. Calculate Student Average
7. Find Top-Performing Student
8. Exit
==========================================
"""
def get_int_input(prompt):
"""Keep asking until the user enters a valid integer."""
while True:
value = input(prompt).strip()
try:
return int(value)
except ValueError:
print("❌ Please enter a valid whole number.")
def get_non_empty_string(prompt):
"""Keep asking until the user enters some non-empty text."""
while True:
value = input(prompt).strip()
if value:
return value
print("❌ This field cannot be empty.")
def get_marks_from_user():
"""
Ask the user for subject/marks pairs, one at a time.
Returns a dictionary like {"Math": 90.0, "Science": 85.0}.
"""
marks = {}
print("Enter subjects and marks (type 'done' as the subject name to stop).")
while True:
subject = input(" Subject: ").strip()
if subject.lower() == "done":
break
if not subject:
print(" ❌ Subject name cannot be empty.")
continue
while True:
score_input = input(f" Marks for {subject} (0-100): ").strip()
try:
score = float(score_input)
if 0 <= score <= 100:
marks[subject] = score
break
print(" ❌ Marks must be between 0 and 100.")
except ValueError:
print(" ❌ Please enter a valid number.")
return marks
def add_student(manager):
print("\n--- Add Student ---")
roll_no = get_int_input("Enter roll number: ")
if manager.search_student(roll_no):
print(f"❌ A student with roll number {roll_no} already exists.")
return
name = get_non_empty_string("Enter student name: ")
marks = get_marks_from_user()
if manager.add_student(roll_no, name, marks):
print(f"✅ Student '{name}' added successfully.")
else:
print("❌ Could not add student (roll number already exists).")
def view_students(manager):
print("\n--- All Students ---")
students = manager.view_students()
if not students:
print("No students found. Add one from the main menu!")
return
for student in students:
print(student)
def search_student(manager):
print("\n--- Search Student ---")
roll_no = get_int_input("Enter roll number to search: ")
student = manager.search_student(roll_no)
if student:
print("✅ Student found:")
print(student)
else:
print(f"❌ No student found with roll number {roll_no}.")
def edit_student(manager):
print("\n--- Edit Student ---")
roll_no = get_int_input("Enter roll number to edit: ")
student = manager.search_student(roll_no)
if not student:
print(f"❌ No student found with roll number {roll_no}.")
return
print(f"Current details -> {student}")
new_name = input("Enter new name (leave blank to keep unchanged): ").strip()
update_marks_choice = input("Do you want to update marks? (y/n): ").strip().lower()
new_marks = get_marks_from_user() if update_marks_choice == "y" else None
manager.edit_student(roll_no, new_name if new_name else None, new_marks)
print("✅ Student updated successfully.")
def delete_student(manager):
print("\n--- Delete Student ---")
roll_no = get_int_input("Enter roll number to delete: ")
confirm = input(f"Are you sure you want to delete roll number {roll_no}? (y/n): ").strip().lower()
if confirm != "y":
print("Deletion cancelled.")
return
if manager.delete_student(roll_no):
print("✅ Student deleted successfully.")
else:
print(f"❌ No student found with roll number {roll_no}.")
def calculate_average(manager):
print("\n--- Calculate Student Average ---")
roll_no = get_int_input("Enter roll number: ")
average = manager.calculate_average(roll_no)
if average is None:
print(f"❌ No student found with roll number {roll_no}.")
else:
print(f"📊 Average marks: {average:.2f}")
def top_student(manager):
print("\n--- Top-Performing Student ---")
student = manager.top_student()
if student is None:
print("No students found yet.")
else:
print("🏆 Top student:")
print(student)
def main():
manager = StudentManager("students.json")
actions = {
"1": add_student,
"2": view_students,
"3": search_student,
"4": edit_student,
"5": delete_student,
"6": calculate_average,
"7": top_student,
}
while True:
print(MENU)
choice = input("Enter your choice (1-8): ").strip()
if choice == "8":
print("👋 Goodbye! Your data has been saved.")
break
action = actions.get(choice)
if action is None:
print("❌ Invalid choice. Please enter a number from 1 to 8.")
continue
try:
action(manager)
except Exception as e:
# Catch-all so an unexpected error never crashes the whole program
print(f"⚠️ Something went wrong: {e}")
if __name__ == "__main__":
main()