каркас и все функции, все сделано и реализовано
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
from tabulate import tabulate
|
||||
|
||||
|
||||
def parse_student_line(line: str) -> dict:
|
||||
parts = line.strip().split(";")
|
||||
|
||||
return {
|
||||
"full_name": parts[0],
|
||||
"group": parts[1],
|
||||
"course": int(parts[2]),
|
||||
"tuition_fee": float(parts[3]),
|
||||
"paid_amount": float(parts[4]),
|
||||
"last_payment_date": parts[5]
|
||||
}
|
||||
|
||||
|
||||
def load_students(file_path: str) -> list:
|
||||
students = []
|
||||
|
||||
try:
|
||||
with open(file_path, "r", encoding="utf-8") as file:
|
||||
for line in file:
|
||||
if line.strip():
|
||||
students.append(parse_student_line(line))
|
||||
except FileNotFoundError:
|
||||
print("Ошибка: файл с данными не найден.")
|
||||
|
||||
return students
|
||||
|
||||
|
||||
def calculate_debt(student: dict) -> float:
|
||||
debt = student["tuition_fee"] - student["paid_amount"]
|
||||
|
||||
if debt < 0:
|
||||
return 0
|
||||
|
||||
return debt
|
||||
|
||||
|
||||
def filter_debtors(students: list) -> list:
|
||||
return [student for student in students if calculate_debt(student) > 0]
|
||||
|
||||
|
||||
def filter_fully_paid(students: list) -> list:
|
||||
return [student for student in students if calculate_debt(student) == 0]
|
||||
|
||||
|
||||
def get_total_expected_income(students: list) -> float:
|
||||
return sum(student["tuition_fee"] for student in students)
|
||||
|
||||
|
||||
def get_total_paid_amount(students: list) -> float:
|
||||
return sum(student["paid_amount"] for student in students)
|
||||
|
||||
|
||||
def group_students_by_course(students: list) -> dict:
|
||||
result = {}
|
||||
|
||||
for student in students:
|
||||
course = student["course"]
|
||||
|
||||
if course not in result:
|
||||
result[course] = []
|
||||
|
||||
result[course].append(student)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def get_top_debtors(students: list, limit: int) -> list:
|
||||
sorted_students = sorted(
|
||||
students,
|
||||
key=lambda student: calculate_debt(student),
|
||||
reverse=True
|
||||
)
|
||||
|
||||
return sorted_students[:limit]
|
||||
|
||||
|
||||
def generate_payment_report(students: list) -> dict:
|
||||
debtors = filter_debtors(students)
|
||||
fully_paid = filter_fully_paid(students)
|
||||
|
||||
return {
|
||||
"total_students": len(students),
|
||||
"debtors_count": len(debtors),
|
||||
"fully_paid_count": len(fully_paid),
|
||||
"total_expected_income": get_total_expected_income(students),
|
||||
"total_paid_amount": get_total_paid_amount(students),
|
||||
"total_debt": sum(calculate_debt(student) for student in students)
|
||||
}
|
||||
|
||||
|
||||
def print_students_table(students: list) -> None:
|
||||
table = []
|
||||
|
||||
for student in students:
|
||||
table.append([
|
||||
student["full_name"],
|
||||
student["group"],
|
||||
student["course"],
|
||||
student["tuition_fee"],
|
||||
student["paid_amount"],
|
||||
calculate_debt(student),
|
||||
student["last_payment_date"]
|
||||
])
|
||||
|
||||
print(tabulate(
|
||||
table,
|
||||
headers=["ФИО", "Группа", "Курс", "Стоимость", "Оплачено", "Долг", "Дата платежа"],
|
||||
tablefmt="grid"
|
||||
))
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
from functions import *
|
||||
|
||||
|
||||
def main():
|
||||
file_path = "data/data.txt"
|
||||
|
||||
students = load_students(file_path)
|
||||
|
||||
if not students:
|
||||
print("Нет данных для обработки.")
|
||||
return
|
||||
|
||||
print("ВСЕ СТУДЕНТЫ:")
|
||||
print_students_table(students)
|
||||
|
||||
print("\nОБЩИЙ ОТЧЕТ:")
|
||||
report = generate_payment_report(students)
|
||||
|
||||
for key, value in report.items():
|
||||
print(f"{key}: {value}")
|
||||
|
||||
print("\nДОЛЖНИКИ:")
|
||||
debtors = filter_debtors(students)
|
||||
print_students_table(debtors)
|
||||
|
||||
print("\nПОЛНОСТЬЮ ОПЛАТИЛИ:")
|
||||
fully_paid = filter_fully_paid(students)
|
||||
print_students_table(fully_paid)
|
||||
|
||||
print("\nТОП-3 ДОЛЖНИКОВ:")
|
||||
top_debtors = get_top_debtors(students, 3)
|
||||
print_students_table(top_debtors)
|
||||
|
||||
print("\nРАСПРЕДЕЛЕНИЕ ПО КУРСАМ:")
|
||||
students_by_course = group_students_by_course(students)
|
||||
|
||||
for course, course_students in students_by_course.items():
|
||||
print(f"{course} курс: {len(course_students)} человек")
|
||||
|
||||
print("\nОБЩАЯ СУММА ПО ДОГОВОРАМ:")
|
||||
print(get_total_expected_income(students))
|
||||
|
||||
print("\nОБЩАЯ ОПЛАЧЕННАЯ СУММА:")
|
||||
print(get_total_paid_amount(students))
|
||||
|
||||
print("\nПРОВЕРКА ДОЛГА ПЕРВОГО СТУДЕНТА:")
|
||||
print(calculate_debt(students[0]))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user