commit 2a2fc7c919557a4f7ac9109c4ae5c34c5edcb26b Author: Зонов Роман Date: Fri Apr 24 21:50:24 2026 +0300 каркас и все функции, все сделано и реализовано diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dba64b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.venv/ +__pycache__/ +*.pyc +.vscode/ +.idea/ \ No newline at end of file diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..f454d13 --- /dev/null +++ b/README.MD @@ -0,0 +1,27 @@ +# Система учета студентов-платников + +обработка данных о студентах, обучающихся на платной основе. + +## Функции программы + +- загрузка данных из файла +- расчет задолженности +- поиск должников +- поиск полностью оплативших студентов +- подсчет общей суммы по договорам +- подсчет оплаченной суммы +- группировка студентов по курсам +- вывод топ-3 должников +- формирование общего отчета +- вывод данных в виде таблицы + +## Структура проекта + +student_payment_system/ +- data/data.txt +- src/functions.py +- src/main.py +- requirements.txt +- .gitignore +- README.md + diff --git a/data/data.txt b/data/data.txt new file mode 100644 index 0000000..5c3e3e5 --- /dev/null +++ b/data/data.txt @@ -0,0 +1,8 @@ +Иванов Иван Иванович;ИС-21;2;120000;90000;2026-03-15 +Петров Петр Сергеевич;ПИ-11;1;110000;110000;2026-02-10 +Сидоров Алексей Игоревич;ИБ-31;3;130000;70000;2026-04-01 +Кузнецов Максим Олегович;ИС-22;2;120000;120000;2026-03-22 +Морозова Анна Дмитриевна;ПИ-12;1;110000;50000;2026-03-30 +Фролов Денис Павлович;ИБ-41;4;140000;100000;2026-04-10 +Смирнова Екатерина Андреевна;ИС-31;3;130000;130000;2026-04-05 +Волков Артем Николаевич;ПИ-21;2;120000;30000;2026-02-25 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..83efc91 Binary files /dev/null and b/requirements.txt differ diff --git a/src/functions.py b/src/functions.py new file mode 100644 index 0000000..f60fa11 --- /dev/null +++ b/src/functions.py @@ -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" + )) \ No newline at end of file diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..1f5aa0d --- /dev/null +++ b/src/main.py @@ -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() \ No newline at end of file