каркас и все функции, все сделано и реализовано
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