Загрузка данных


import copy
import matplotlib.pyplot as plt


class Worker:
    def __init__(self, name="", days=0, salary=0.0, pay=0.0):
        self.name = name
        self.days = days
        self.salary = salary
        self.pay = pay


def Load(filename):
    workers = []
    with open(filename, "r", encoding="utf-8") as f:
        days_in_month = int(f.readline().strip())
        while True:
            name = f.readline()
            if not name:
                break
            name = name.strip()
            if not name:
                continue
            line = f.readline().strip().split()
            days = int(line[0])
            salary = float(line[1])
            workers.append(Worker(name, days, salary))
    print(f"Считано записей: {len(workers)}")
    return workers, days_in_month


def Calc(workers, days_in_month):
    total = 0.0
    for w in workers:
        w.pay = round(w.salary * w.days / days_in_month, 2)
        total += w.pay
    return total


def Save(filename, workers, total):
    with open(filename, "w", encoding="utf-8") as f:
        sep1 = "+" + "-" * 31 + "+" + "-" * 4 + "+" + "-" * 11 + "+" + "-" * 11 + "+"
        sep2 = "+" + "-" * 31 + "+" + "-" * 4 + "+" + "-" * 21 + "+"
        f.write(sep1 + "\n")
        f.write(f"|{'Фамилия':^30}|{'Дни':^3}|{'Оклад':^10}|{'Зарплата':^10}|\n")
        f.write(sep1 + "\n")
        for w in workers:
            f.write(f"|{w.name:<30}|{w.days:>3}|{w.salary:>10.2f}|{w.pay:>10.2f}|\n")
        f.write(sep1 + "\n")
        f.write(f"|{'Итого':<30}|{'':^3}|{'':^10}|{total:>10.2f}|\n")
        f.write(sep2 + "\n")


def SortByName(workers):
    comps = 0
    n = len(workers)
    for i in range(n):
        swapped = False
        for j in range(n - i - 1):
            comps += 1
            if workers[j].name > workers[j + 1].name:
                workers[j], workers[j + 1] = workers[j + 1], workers[j]
                swapped = True
        if not swapped:
            break
    return comps


def SortByPay(workers):
    comps = 0
    n = len(workers)
    for i in range(n):
        swapped = False
        for j in range(n - i - 1):
            comps += 1
            if workers[j].pay > workers[j + 1].pay:
                workers[j], workers[j + 1] = workers[j + 1], workers[j]
                swapped = True
        if not swapped:
            break
    return comps


def main():
    workers, days_in_month = Load("Workers.txt")
    total = Calc(workers, days_in_month)
    print("Промежуточный вывод: Зарплата рассчитана корректно.")

    Save("Pay.txt", workers, total)

    comps_name = SortByName(copy.deepcopy(workers))
    workers_sorted_name = copy.deepcopy(workers)
    SortByName(workers_sorted_name)
    Save("ByName.txt", workers_sorted_name, total)
    print(f"Промежуточный вывод: Сортировка по имени выполнена корректно. Сравнений: {comps_name}")

    comps_pay = SortByPay(copy.deepcopy(workers))
    workers_sorted_pay = copy.deepcopy(workers)
    SortByPay(workers_sorted_pay)
    Save("ByPay.txt", workers_sorted_pay, total)
    print(f"Промежуточный вывод: Сортировка по зарплате выполнена корректно. Сравнений: {comps_pay}")


def test_sizes():
    sizes = [5, 10, 15]
    results = []
    for n in sizes:
        workers = []
        import random
        names = [f"Worker_{i}" for i in range(n)]
        random.shuffle(names)
        for name in names:
            workers.append(Worker(name, random.randint(10, 25), random.randint(3000, 9000)))
        _, dim = Load("Workers.txt") if False else (None, 24)
        dim = 24
        Calc(workers, dim)
        c1 = SortByName(copy.deepcopy(workers))
        c2 = SortByPay(copy.deepcopy(workers))
        results.append((n, c1, c2, max(c1, c2)))
        print(f"Размер {n}: по имени = {c1}, по зарплате = {c2}, макс = {max(c1, c2)}")

    x = [r[0] for r in results]
    y = [r[3] for r in results]
    plt.plot(x, y, marker="o")
    plt.xlabel("Количество элементов")
    plt.ylabel("Максимальное количество сравнений")
    plt.title("Зависимость сравнений от длины списка")
    plt.grid(True)
    plt.savefig("graph.png")
    plt.show()


if __name__ == "__main__":
    main()
    print("\n--- Тестирование на разных размерах ---")
    test_sizes()