каркас и все функции, все сделано и реализовано
This commit is contained in:
commit
2a2fc7c919
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.venv/
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
27
README.MD
Normal file
27
README.MD
Normal 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
8
data/data.txt
Normal 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
BIN
requirements.txt
Normal file
Binary file not shown.
112
src/functions.py
Normal file
112
src/functions.py
Normal 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
51
src/main.py
Normal 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()
|
||||||
Loading…
Reference in New Issue
Block a user