4.5. Самостоятельная работа

Примечание

При выполнении заданий используйте заготовки решений: -> Репозиторий.

Подробнее: см. Цикл выполнения и защиты заданий.

4.5.1. Комплексная задача

№4.5.1

Продолжите решение задачи № 3.5.1.

Используя результаты предыдущего решения, а также заготовку и Листинг 4.5.1:

  • устраните дублирование кода при выводе списка объектов, используя циклы;

  • добавьте меню с пунктами:

    • список объектов;

    • фильтр по атрибуту (одному или нескольким) объекта;

    • средний показатель по атрибуту объекта.

  • перенесите вывод списка объектов в соответствующий пункт меню и реализуйте два новых.

Листинг 4.5.1 - Пример реализации меню, фильтра и среднего показателя
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# Это пример кода, он может быть произвольно усложнен
# в рамках ограничений темы
#
# Требования:
#
# * устраните дублирование кода при выводе списка объектов,
#   используя циклы;
# * добавьте меню с пунктами:
#   * список объектов;
#   * фильтр по атрибуту (одному или нескольким) объекта;
#   * средний показатель по атрибуту объекта.
# * перенесите вывод списка объектов в соответствующий пункт меню и
#   реализуйте два новых.


# Замените атрибуты словаря и др. на соответствующие своему варианту

db = [
    {
        "name": "Иванов Иван",
        "birthday": "01/12/2000",
        "height": 170,
        "weight": 70.5,
        "car": True,
        "languages": ["С++", "Python"]
    },

    ...
]

while True:
    print("\n-----")
    print("Меню")
    print("-----")
    print("1. Список сотрудников.")
    print("2. Фильтр по языку программирования.")
    print("3. Средний рост сотрудников, моложе указанного г.р.")
    print("\nВыберите пункт меню или нажмите ENTER для выхода: ", end="")

    answer = input()

    if answer == "1":
        print("Содержимое базы данных ({}):".format(len(db)))
        for i, item in enumerate(db, start=1):
            print("{}.".format(i))
            print("Имя: {}".format(item["name"]))

            ...

    elif answer == "2":
        lang = input("Введите язык программирования: ")
        # "Нормализация" наименования языка на случай ошибки при вводе
        lang = lang.capitalize()

        # res - копия db, с сотрудниками, удовлетворяющими условию по языку
        res = []
        for item in db:
            if lang in item["languages"]:
                res.append(item)

        if len(res) > 0:
            print("Список сотрудников со знанием "
                  "языка программирования {} ({}):".format(lang, len(res)))
            for i, item in enumerate(res, start=1):
                print("{}.".format(i))
                print("Имя: {}".format(item["name"]))

                ...
        else:
            print("Таких сотрудников нет.")

    elif answer == "3":
        younger_than = int(input("Введите год рождения сотрудника: "))

        r_sum = 0
        r_col = 0
        for item in db:
            year = int(item["birthday"][-4:])
            if year >= younger_than:
                r_sum += item["height"]
                r_col += 1

        if r_col > 0:
            print("Средний рост сотрудников, {} г.р. и моложе: ({:.1f}) см.".
                  format(younger_than, r_sum / r_col))
        else:
            print("Таких сотрудников нет.")

    else:
        break


# --------------
# Пример вывода:
#
# -----
# Меню
# -----
# 1. Список сотрудников.
# 2. Фильтр по языку программирования.
# 3. Средний рост сотрудников, моложе указанного г.р.
#
# Выберите пункт меню или нажмите ENTER для выхода: 1
# Содержимое базы данных (3):
# 1.
# Имя: Иванов Иван
# День рождения: 01/12/2000
# Рост (см.): 170
# Вес (кг.): 70.5
# Есть машина: True
# Языки программирования: ['С++', 'Python']
# 2.
# Имя: Сергеев Сергей
# День рождения: 01/06/2001
# Рост (см.): 180
# Вес (кг.): 110.4
# Есть машина: False
# Языки программирования: ['Pascal', 'Delphi']
# 3.
# Имя: Николаева Мария
# День рождения: 14/07/1998
# Рост (см.): 180
# Вес (кг.): 66.9
# Есть машина: True
# Языки программирования: ['C#', 'C++', 'C']
#
# -----
# Меню
# -----
# 1. Список сотрудников.
# 2. Фильтр по языку программирования.
# 3. Средний рост сотрудников, моложе указанного г.р.
#
# Выберите пункт меню или нажмите ENTER для выхода: 2
# Введите язык программирования: Python
# Список сотрудников со знанием языка программирования Python (1):
# 1.
# Имя: Иванов Иван
# День рождения: 01/12/2000
# Рост (см.): 170
# Вес (кг.): 70.5
# Есть машина: True
# Языки программирования: ['С++', 'Python']
# Результат поиска сохранен в файл.
#
# -----
# Меню
# -----
# 1. Список сотрудников.
# 2. Фильтр по языку программирования.
# 3. Средний рост сотрудников, моложе указанного г.р.
#
# Выберите пункт меню или нажмите ENTER для выхода: 3
# Введите год рождения сотрудника: 2000
# Средний рост сотрудников, 2000 г.р. и моложе: (175.0) см.