каркас и все функции, все сделано и реализовано

This commit is contained in:
Зонов Роман 2026-04-24 21:50:24 +03:00
commit 2a2fc7c919
6 changed files with 203 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
.venv/
__pycache__/
*.pyc
.vscode/
.idea/

27
README.MD Normal file
View File

@ -0,0 +1,27 @@
# Система учета студентов-платников
обработка данных о студентах, обучающихся на платной основе.
## Функции программы
- загрузка данных из файла
- расчет задолженности
- поиск должников
- поиск полностью оплативших студентов
- подсчет общей суммы по договорам
- подсчет оплаченной суммы
- группировка студентов по курсам
- вывод топ-3 должников
- формирование общего отчета
- вывод данных в виде таблицы
## Структура проекта
student_payment_system/
- data/data.txt
- src/functions.py
- src/main.py
- requirements.txt
- .gitignore
- README.md

8
data/data.txt Normal file
View File

@ -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

BIN
requirements.txt Normal file

Binary file not shown.

112
src/functions.py Normal file
View File

@ -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
src/main.py Normal file
View File

@ -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()