Untitled
unknown
plain_text
a year ago
14 kB
21
Indexable
import os
class GradeSystem:
FILE_NAME = 'GSM.txt'
MENU_OPTIONS = [
"1) Add grade",
"2) Update grade",
"3) Delete grade",
"4) Show all grades",
"5) Calculate average",
"6) Find and list",
"0) Exit"
]
@staticmethod
def print_menu():
print("╔" + "═" * 29 + "╗")
print("║" + " " * 10 + "☆ MENU ☆" + " " * 11 + "║")
print("╠" + "═" * 29 + "╣")
for option in GradeSystem.MENU_OPTIONS:
print(f"║ {' ' * 2}{option}{' ' * (29 - len(option) - 3)}║")
print("╚" + "═" * 29 + "╝")
@staticmethod
def is_valid_student_ID(student_ID):
return len(student_ID) == 8
@staticmethod
def is_valid_score(score):
try:
score = str(score)
return 0 <= float(score) <= 10
except ValueError:
return False
@staticmethod
def calculate_final_result(ws, pt, ass, pe, fe):
return 0.1 * (ws + pt + ass) + 0.4 * pe + 0.3 * fe
@staticmethod
def get_status(fr, ws, pt, ass, fe):
return 'Pass' if all([ws > 0, pt > 0, ass > 0, fe >= 4, fr >= 5]) else 'Failed'
@staticmethod
def input_score(prompt):
score = input(prompt)
while not GradeSystem.is_valid_score(score):
score = input("Invalid score. Must be between 0 and 10. Please re-enter: ")
return float(score)
def id_exists(self, student_ID):
with open(GradeSystem.FILE_NAME, 'r', encoding='utf-8') as file:
for line in file:
if line.startswith(student_ID):
return True
return False
def add_grade(self):
choice = input("Add (1) Class (2) Student: \nYour choice: ").strip()
if choice == "1":
name_class = input("Class name: ").strip()
with open(GradeSystem.FILE_NAME, 'a', encoding='utf-8') as file:
file.writelines(f"Class: {name_class}\n\n")
print("Class has been added successfully.")
elif choice == "2":
student_ID = input("Student ID: ").strip()
while not GradeSystem.is_valid_student_ID(student_ID) or self.id_exists(student_ID):
student_ID = input("Invalid or duplicate Student ID. Must be 8 digits and unique. Please re-enter: ").strip()
student_name = input("Student Name: ").strip()
ws = GradeSystem.input_score("Workshop: ")
pt = GradeSystem.input_score("Progress Test: ")
ass = GradeSystem.input_score("Assignment: ")
pe = GradeSystem.input_score("Practical Exam: ")
fe = GradeSystem.input_score("Final Exam: ")
fr = GradeSystem.calculate_final_result(ws, pt, ass, pe, fe)
status = GradeSystem.get_status(fr, ws, pt, ass, fe)
class_name = input("Class name: ").strip()
with open(GradeSystem.FILE_NAME, 'r', encoding='utf-8') as file:
lines = file.readlines()
new_lines = []
class_found = False
for line in lines:
new_lines.append(line)
if line.strip() == f"Class: {class_name}":
class_found = True
new_lines.append(f"{student_ID} {student_name} {ws} {pt} {ass} {pe} {fe} {fr:.2f} {status}\n")
if not class_found:
print("Invalid Class, try again.")
else:
print("---Finish Adding---")
with open(GradeSystem.FILE_NAME, 'w', encoding='utf-8') as file:
file.writelines(new_lines)
def update_grade(self):
student_ID = input("Student ID: ").strip()
while not GradeSystem.is_valid_student_ID(student_ID) or not self.id_exists(student_ID):
student_ID = input("Invalid or non-existent Student ID. Must be 8 digits and already in the system. Please re-enter: ").strip()
student_name = input("Student Name: ").strip()
ws = GradeSystem.input_score("Workshop: ")
pt = GradeSystem.input_score("Progress Test: ")
ass = GradeSystem.input_score("Assignment: ")
pe = GradeSystem.input_score("Practical Exam: ")
fe = GradeSystem.input_score("Final Exam: ")
fr = GradeSystem.calculate_final_result(ws, pt, ass, pe, fe)
status = GradeSystem.get_status(fr, ws, pt, ass, fe)
updated = False
with open(GradeSystem.FILE_NAME, 'r', encoding='utf-8') as file:
lines = file.readlines()
with open(GradeSystem.FILE_NAME, 'w', encoding='utf-8') as file:
for line in lines:
if line.startswith(f"{student_ID}"):
file.write(f"{student_ID} {student_name} {ws} {pt} {ass} {pe} {fe} {fr:.2f} {status}\n")
updated = True
else:
file.write(line)
if updated:
print("Grade has been updated successfully.")
else:
print("Student not found.")
def delete_grade(self):
choice = input("Delete: (one) or (all)\nYour choice: ").strip().lower()
if choice == "one" or choice == "1":
student_ID = input("Student ID: ").strip()
with open(GradeSystem.FILE_NAME, 'r', encoding='utf-8') as file:
lines = file.readlines()
with open(GradeSystem.FILE_NAME, 'w', encoding='utf-8') as file:
for line in lines:
if not line.startswith(f"{student_ID}"):
file.write(line)
print("Grade has been deleted.")
elif choice == "all":
open(GradeSystem.FILE_NAME, 'w', encoding='utf-8').close()
print("All grades have been deleted.")
def show_all_grades(self):
print("Grade List:")
print("=" * 24)
with open(GradeSystem.FILE_NAME, 'r', encoding='utf-8') as file:
content = file.read().strip()
if content:
print(content)
else:
print("No data available.")
print("=" * 24)
def calculate_average(self):
choice = input("Enter your choice, average Class(1) or Student(2): ").strip()
if choice == "1":
class_name = input("Enter the class name: ").strip()
totals = {'ws': 0, 'pt': 0, 'ass': 0, 'pe': 0, 'fe': 0, 'count': 0}
class_found = False
with open(GradeSystem.FILE_NAME, 'r', encoding='utf-8') as file:
lines = file.readlines()
for i, line in enumerate(lines):
if line.strip() == f"Class: {class_name}":
class_found = True
j = i + 1
while j < len(lines) and not lines[j].startswith("Class:"):
parts = lines[j].strip().split()
if len(parts) >= 8:
totals['ws'] += float(parts[2])
totals['pt'] += float(parts[3])
totals['ass'] += float(parts[4])
totals['pe'] += float(parts[5])
totals['fe'] += float(parts[6])
totals['count'] += 1
j += 1
break
if class_found:
if totals['count'] > 0:
print(f"Average Workshop for {class_name}: {totals['ws'] / totals['count']:.2f}")
print(f"Average Progress Test for {class_name}: {totals['pt'] / totals['count']:.2f}")
print(f"Average Assignment for {class_name}: {totals['ass'] / totals['count']:.2f}")
print(f"Average Practical Exam for {class_name}: {totals['pe'] / totals['count']:.2f}")
print(f"Average Final Exam for {class_name}: {totals['fe'] / totals['count']:.2f}")
else:
print("No data available to calculate averages for this class.")
else:
print("Class not found.")
elif choice == "2":
student_ID = input("Student ID: ").strip()
student_found = False
with open(GradeSystem.FILE_NAME, 'r', encoding='utf-8') as file:
for line in file:
if line.startswith(f"{student_ID}"):
parts = line.strip().split()
if len(parts) >= 8:
scores = [float(parts[i]) for i in range(2, 7)]
avg = sum(scores) / 5
print(f"Average grade for {student_ID}: {avg:.2f}")
student_found = True
break
if not student_found:
print("Student data not found.")
@staticmethod
def print_table_student(header, rows):
row_format = "|{:<12}|{:<14}|{:<14}|{:<16}|{:<14}|{:<15}|{:<12}|{:<12}|{:<10}|"
print(row_format.format(*header))
print("=" * 90)
for row in rows:
print(row_format.format(*row))
@staticmethod
def print_table_class(header, rows):
row_format = "|{:<12}|{:<14}|{:<14}|{:<16}|{:<14}|{:<12}|"
print(row_format.format(*header))
print("=" * 90)
for row in rows:
print(row_format.format(*row))
def find_and_list_student_class(self):
choice = input("Find and list Student (1) or Class (2)\nYour choice: ").strip()
if choice == '1':
search_ID = input("Enter Student ID (leave blank to skip): ").strip()
with open(GradeSystem.FILE_NAME, 'r', encoding='utf-8') as file:
student_info = []
for line in file:
parts = line.strip().split()
if parts and parts[0] == search_ID:
student_info.append(parts)
break
if student_info:
header = ["Student ID", "Student Name", "Workshop", "Progress Test", "Assignment", "Practical Exam", "Final Exam", "Final Result", "Status"]
GradeSystem.print_table_student(header, student_info)
else:
print("Student not found.")
elif choice == '2':
class_name = input("Class name: ").strip()
with open(GradeSystem.FILE_NAME, 'r', encoding='utf-8') as file:
lines = file.readlines()
info_class = []
collecting = False
for line in lines:
if line.startswith("Class:"):
parts = line.strip().split()
if parts[1] == class_name:
collecting = True
else:
collecting = False
elif collecting and line.strip():
info_class.append(line.strip().split())
if info_class:
workshop_total = 0
progress_test_total = 0
practical_exam_total = 0
final_exam_total = 0
count = len(info_class)
for row in info_class:
workshop_total += float(row[2])
progress_test_total += float(row[3])
practical_exam_total += float(row[4])
final_exam_total += float(row[5])
workshop_avg = workshop_total / count
progress_test_avg = progress_test_total / count
practical_exam_avg = practical_exam_total / count
final_exam_avg = final_exam_total / count
status = "Pass" if all(avg >= 5 for avg in [workshop_avg, progress_test_avg, practical_exam_avg, final_exam_avg]) else "Failed"
info_class = [[class_name, f"{workshop_avg:.2f}", f"{progress_test_avg:.2f}", f"{practical_exam_avg:.2f}", f"{final_exam_avg:.2f}", status]]
header = ["Class name", "Workshop", "Progress Test", "Practical Exam", "Final Exam", "Status"]
GradeSystem.print_table_class(header, info_class)
else:
print("Class not found.")
def main(self):
functions = [
self.add_grade,
self.update_grade,
self.delete_grade,
self.show_all_grades,
self.calculate_average,
self.find_and_list_student_class
]
while True:
os.system('cls')
GradeSystem.print_menu()
try:
choice = int(input("Enter your choice: ").strip())
if choice == 0:
break
elif 1 <= choice <= 6:
functions[choice - 1]()
input("\nPress Enter to return to the main menu.")
else:
print("Invalid choice. Please try again.")
except ValueError:
print("Invalid input. Please enter a number.")
except Exception as e:
print(f"An error occurred: {e}")
print("Program terminated.")
if __name__ == "__main__":
GradeSystem().main()
Editor is loading...
Leave a Comment