Загрузка данных
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()