Олимпиадный тренинг

Задача . Проект: Консольная Записная Книжка


Задача

Темы:

📞 Проект: Консольная Записная Книжка

1. Структура данных (Словари и Списки)

Вся система будет основана на одном главном словаре, который хранит все контакты, и вложенных списках для деталей.

Структура Тип Роль Примеры операций
contacts Словарь (dict) Основной каталог. Ключ — уникальное имя контакта. Добавление нового контакта, удаление контакта.
Внутренний контакт Словарь (dict) Детали контакта. Доступ к phones, emails, notes.
phones / emails Список (list) Хранение нескольких телефонных номеров или адресов. Добавление нового номера (.append()), удаление старого номера.
contacts = {
    # ----------------------------------------------------
    # Димаш Кудайберген (Мировой певец)
    # ----------------------------------------------------
    'Димаш Кудайберген': {
        'phones': ['+77011234567'], 
        'emails': ['dimash.dears@official.kz', 'dima.kudaibergen@music.com'],
        'notes': 'Казахстанский певец, обладатель уникального вокального диапазона.'
    },
    
    # ----------------------------------------------------
    # Геннадий Головкин (Боксер)
    # ----------------------------------------------------
    'Геннадий Головкин': {
        'phones': ['+77770001122'],
        'emails': [], # Умышленно пустой список
        'notes': 'Профессиональный боксер, чемпион мира в среднем весе.'
    },

    # ----------------------------------------------------
    # Баян Алагузова (Продюсер, медиаперсона)
    # ----------------------------------------------------
    'Баян Алагузова': {
        'phones': ['+77079998877'], 
        'emails': ['bayan.maxatkyzy@media.kz'],
        'notes': 'Известный продюсер и телеведущая Казахстана.'
    },
    
    # ----------------------------------------------------
    # Илья Ильин (Тяжелоатлет)
    # ----------------------------------------------------
    'Илья Ильин': {
        'phones': ['+77053334455'], 
        'emails': ['ilya.ilin@sport.kz'],
        'notes': 'Тяжелоатлет, многократный чемпион мира.'
    }
}

2. Основные функции для реализации

Ученикам необходимо создать меню, которое позволяет выполнять следующие действия:

    1. Показать все контакты (view_all_names)

  • Задача: Вывести только имена (ключи) всех контактов в алфавитном порядке.

  • Использование: Итерирование по ключам словаря contacts.

 

    2. Добавить новый контакт (add_contact)

  • Задача: Запросить имя и создать новую запись в словаре.

  • Использование: Добавление новой пары ключ-значение в contacts.

    • Проверка: Проверить, что имя еще не является ключом в словаре.

    • Создание: contacts[новое_имя] = {'phones': [], 'emails': [], 'notes': ''}.

 

     3. Показать детали контакта (view_details)

  • Задача: По имени найти контакт и вывести все его детали.

  • Использование:

    • Доступ к словарю по ключу (имени): contacts[имя].

    • Далее доступ к вложенным спискам phones и emails и вывод их элементов.

 

    4. Изменить или добавить данные (modify_data)

  • Задача: Выбрать существующий контакт и добавить к нему новый телефон или email.

  • Использование:

    • Доступ к вложенной структуре: contacts[имя]['phones'].

    • Использование метода .append() для добавления нового элемента в список.

    • Изменение заметки: contacts[имя]['notes'] = новая_заметка.

 

    5. Удалить контакт (delete_contact)

  • Задача: Удалить запись из записной книжки по имени.

  • Использование: Использование метода .pop(имя) или оператора del contacts[имя].

 

    6. Поиск по данным (search_data)

  • Задача: Найти контакт по части имени, номеру телефона или тексту в заметках.

  • Использование: Итерирование по вложенным спискам и строкам для проверки условия. (Это сложная, но полезная задача для продвинутых учеников).

 

Теория
 

1. Фундамент: Словарь (dict)

Словарь contacts — это сердце вашей программы. Он хранит пары "Ключ: Значение", где ключ — это уникальное имя контакта, а значение — это словарь с его деталями.

Операция Синтаксис Назначение и Пример
Доступ к значению contacts[ключ] Получение всей информации о контакте (внутренний словарь): contacts['Баян Алагузова']
Проверка наличия ключ in contacts Проверка, существует ли контакт перед попыткой доступа: if name in contacts:
Добавление/Обновление contacts[новый_ключ] = новое_значение Создание нового контакта: contacts['Абай'] = {'phones': [], ...}
Удаление del contacts[ключ] или contacts.pop(ключ) Удаление контакта по имени: contacts.pop('Илья Ильин')
Получение ключей contacts.keys() Используется для вывода списка всех имен: for name in contacts.keys():

 

2. Детали: Список (list)

Списки используются как значения внутри словаря-деталей для хранения повторяющихся данных (телефоны, email), где порядок имеет значение, и может быть несколько одинаковых элементов.

Операция Синтаксис Назначение и Пример
Индексация my_list[индекс] Получение первого телефона: contact_data['phones'][0]
Добавление my_list.append(элемент) Добавление нового email: contact_data['emails'].append('new@mail.kz')
Удаление по значению my_list.remove(значение) Удаление конкретного номера: contact_data['phones'].remove('+7701...')
Проверка на пустоту if not my_list: Проверка, есть ли телефоны: if not contact_data['phones']:

3. Комбинированный Доступ (Вложенные Структуры)

Это ключевой момент в проекте. Для получения отдельной части данных вам нужно последовательно применить доступ по ключу и индексу.

Пример: Получить первый email Димаша

1) Получаем данные контакта (Словарь):
dimash_data = contacts['Димаш Кудайберген']
# dimash_data теперь {'phones': [...], 'emails': [...], 'notes': '...'}

2) Получаем список email (Список):
dimash_emails = dimash_data['emails']
# dimash_emails теперь ['dimash.dears@official.kz', 'dima.kudaibergen@music.com']

3) Получаем первый email (Строка):
first_email = dimash_emails[0]
# first_email теперь 'dimash.dears@official.kz'

Сокращенный вид:
first_email = contacts['Димаш Кудайберген']['emails'][0]

4. Управление Потоком (Консольный Интерфейс)

Для создания интерактивного консольного приложения вы будете использовать эти конструкции:

А. Главный цикл

Используется для поддержания работы программы до тех пор, пока пользователь не выберет команду "Выход".

while True:
    print("Меню: (1) Просмотр, (2) Добавить, (3) Удалить, (4) Выход")
    choice = input("Ваш выбор: ")
    
    if choice == '4':
        print("До свидания!")
        break # Выход из цикла
    
    # ... обработка других команд ...

Б. Условные операторы (if/elif/else)

Используются для проверки выбора пользователя и обработки исключительных ситуаций (например, когда контакт не найден).

name = input("Введите имя контакта: ")

if name in contacts:
    # 1. Контакт найден: выполняем операцию (просмотр, удаление)
    print(f"Контакт {name} найден.")
elif name.strip() == '':
    # 2. Пользователь ввел пустую строку
    print("Имя не может быть пустым.")
else:
    # 3. Контакт не найден
    print(f"Ошибка: Контакт {name} не найден в записной книжке.")

В. Получение и обработка ввода

Всегда используйте функцию input() для получения данных от пользователя. Помните, что input() всегда возвращает строку, и вам, возможно, потребуется удалить лишние пробелы с помощью метода .strip().

5. Задание на реализацию

Используя эту теорию, вы можете приступить к реализации следующей функции: Просмотр деталей контакта по имени.

  1. Запросить имя с помощью input().

  2. Использовать оператор in для проверки наличия имени в contacts.

  3. Если имя найдено, получить внутренний словарь и вывести данные, используя доступ к вложенным спискам (['phones'], ['emails']).

  4. Если имя не найдено, вывести сообщение об ошибке.

 

time 1000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
Комментарий учителя