6.5. Самостоятельная работа¶
Примечание
При выполнении заданий используйте заготовки решений: -> Репозиторий.
Подробнее: см. Цикл выполнения и защиты заданий.
6.5.1. Комплексная задача¶
№6.5.1
Продолжите решение задачи № 5.5.1.
Используя результаты предыдущего решения, а также заготовку и Листинг 6.5.1, в строках документации укажите асимптотическую сложность для каждой из функций и для алгоритма в целом.
Листинг 6.5.1 - Пример решения с указанием сложности в строке документации¶
1"""Комплексная задача.
2
3Сложность: O(N).
4"""
5
6# Это пример кода, он может быть произвольно усложнен
7# в рамках ограничений темы
8#
9# Требования:
10#
11# в строках документации укажите асимптотическую сложность для:
12# * каждой из функций;
13# * алгоритма в целом.
14
15
16# Замените атрибуты словаря и др. на соответствующие своему варианту
17
18def load_db():
19 """Загрузить данные.
20
21 Результат: list of dict.
22
23 Сложность: O(1).
24 """
25 db = [
26 {
27 "name": "Иванов Иван",
28 "birthday": "01/12/2000",
29 "height": 170,
30 "weight": 70.5,
31 "car": True,
32 "languages": ["С++", "Python"]
33 },
34
35 ...
36 ]
37 return db
38
39
40def print_employee(item):
41 """Вывести объект 'item' на экран со всеми атрибутами.
42
43 Сложность: O(1).
44 """
45 print("Имя: {}".format(i, item["name"]))
46
47 ...
48
49
50def employees_filter(db, lang):
51 """Вернуть отфильтрованную базу 'db' (список сотрудников), у которых
52 в качестве языка программирования имеется 'lang'.
53
54 Аргументы:
55 - db (list of dict): база данных;
56 - lang (str): язык программирования.
57
58 Результат:
59 - (list of dict): отфильтрованная база данных.
60
61 Сложность: O(N).
62 """
63 # res - копия db, с сотрудниками, удовлетворяющими условию по языку
64 res = []
65 for item in db:
66 if lang in item["languages"]:
67 res.append(item)
68
69 return res
70
71
72def employee_employee_avg_height(db, younger_than):
73 """Вернуть средний рост среди сотрудников 'db', у которых
74 год рождения не менее 'younger_than'.
75
76 Аргументы:
77 - db (list of dict): база данных;
78 - younger_than (int): минимальный год рождения.
79
80 Результат:
81 - (float): если такие сотрудники есть;
82 (None): если таких сотрудников нет.
83
84 Сложность: O(N).
85 """
86
87 r_sum = 0
88 r_col = 0
89 for item in db:
90 year = int(item["birthday"][-4:])
91 if year >= younger_than:
92 r_sum += item["height"]
93 r_col += 1
94
95 if r_col > 0:
96 return r_sum / r_col
97
98
99db = load_db()
100while True:
101
102 print("\n-----")
103 print("Меню")
104 print("-----")
105 print("1. Список сотрудников.")
106 print("2. Фильтр по языку программирования.")
107 print("3. Средний рост сотрудников, моложе указанного г.р.")
108 print("\nВыберите пункт меню или нажмите ENTER для выхода: ", end="")
109
110 answer = input()
111
112 if answer == "1":
113 print("Содержимое базы данных ({}):".format(len(db)))
114 for i, item in enumerate(db, start=1):
115 print("{}.".format(i))
116 print_employee(item)
117
118 elif answer == "2":
119 lang = input("Введите язык программирования: ")
120 # "Нормализация" наименования языка на случай ошибки при вводе
121 lang = lang.capitalize()
122
123 res = employees_filter(db, lang)
124
125 if len(res) > 0:
126 print("Список сотрудников со знанием "
127 "языка программирования {} ({}):".format(lang, len(res)))
128 for i, item in enumerate(res, start=1):
129 print("{}.".format(i))
130 print_employee(item)
131 else:
132 print("Таких сотрудников нет.")
133
134 elif answer == "3":
135 younger_than = int(input("Введите год рождения сотрудника: "))
136
137 res = employee_employee_avg_height(db, younger_than)
138
139 if res is not None:
140 print("Средний рост сотрудников, {} г.р. и моложе: ({:.1f}) см.".
141 format(younger_than, res))
142 else:
143 print("Таких сотрудников нет.")
144
145 else:
146 break
147
148
149# --------------
150# Пример вывода:
151#
152# -----
153# Меню
154# -----
155# 1. Список сотрудников.
156# 2. Фильтр по языку программирования.
157# 3. Средний рост сотрудников, моложе указанного г.р.
158#
159# Выберите пункт меню или нажмите ENTER для выхода: 1
160# Содержимое базы данных (3):
161# 1.
162# Имя: Иванов Иван
163# День рождения: 01/12/2000
164# Рост (см.): 170
165# Вес (кг.): 70.5
166# Есть машина: True
167# Языки программирования: ['С++', 'Python']
168# 2.
169# Имя: Сергеев Сергей
170# День рождения: 01/06/2001
171# Рост (см.): 180
172# Вес (кг.): 110.4
173# Есть машина: False
174# Языки программирования: ['Pascal', 'Delphi']
175# 3.
176# Имя: Николаева Мария
177# День рождения: 14/07/1998
178# Рост (см.): 180
179# Вес (кг.): 66.9
180# Есть машина: True
181# Языки программирования: ['C#', 'C++', 'C']
182#
183# -----
184# Меню
185# -----
186# 1. Список сотрудников.
187# 2. Фильтр по языку программирования.
188# 3. Средний рост сотрудников, моложе указанного г.р.
189#
190# Выберите пункт меню или нажмите ENTER для выхода: 2
191# Введите язык программирования: Python
192# Список сотрудников со знанием языка программирования Python (1):
193# 1.
194# Имя: Иванов Иван
195# День рождения: 01/12/2000
196# Рост (см.): 170
197# Вес (кг.): 70.5
198# Есть машина: True
199# Языки программирования: ['С++', 'Python']
200# Результат поиска сохранен в файл.
201#
202# -----
203# Меню
204# -----
205# 1. Список сотрудников.
206# 2. Фильтр по языку программирования.
207# 3. Средний рост сотрудников, моложе указанного г.р.
208#
209# Выберите пункт меню или нажмите ENTER для выхода: 3
210# Введите год рождения сотрудника: 2000
211# Средний рост сотрудников, 2000 г.р. и моложе: (175.0) см.