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) см.