/
Roman88
/
contact_manager
Обзор
Документация
Войти
/
Roman88
/
contact_manager
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main_console.py
182 строки
7 KB
Roman88
16-05
28 май 2026, 11:29
28 май 2026, 11:29
83f03fe
Код
Авторство
О чём код?
""" Консольное приложение «Учёт контактов и задач». Демонстрация типовых паттернов консольного интерфейса. Все ключевые функции подробно прокомментированы. """ import sys # ────────────────────────────────────────────── # ИМИТАЦИЯ "БАЗЫ ДАННЫХ" # ────────────────────────────────────────────── contacts = {} # id : {name, phone, email} tasks = {} # id : {title, desc, contact_id, status} next_contact_id = 1 next_task_id = 1 # ---------- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ---------- def print_header(title: str, width: int = 60): print('\n' + '='*width) print(f"{title:^{width}}") print('='*width) def print_menu(items: list, width: int = 60): for item in items: print(' ' + item) print('-'*width) def input_int(prompt: str) -> int: """Безопасный ввод целого числа. При ошибке возвращает -1.""" try: return int(input(prompt)) except ValueError: return -1 # ── УПРАВЛЕНИЕ КОНТАКТАМИ ──────────────────── def handle_add_contact(): """Добавление нового контакта""" global next_contact_id print_header("ДОБАВЛЕНИЕ КОНТАКТА") name = input(" Имя: ").strip() if not name: print(" Имя не может быть пустым."); return phone = input(" Телефон: ").strip() email = input(" Email: ").strip() contacts[next_contact_id] = { "name": name, "phone": phone, "email": email } print(f"\n Контакт #{next_contact_id} добавлен: {name}") next_contact_id += 1 def handle_list_contacts(): """Список всех контактов""" print_header("СПИСОК КОНТАКТОВ") if not contacts: print(" Нет контактов."); return for cid, c in contacts.items(): print(f" [{cid}] {c['name']} | {c['phone']} | {c['email']}") def handle_find_contact(): """Поиск контакта по имени""" print_header("ПОИСК КОНТАКТА") query = input(" Поиск по имени: ").strip().lower() found = False for cid, c in contacts.items(): if query in c['name'].lower(): found = True print(f" [{cid}] {c['name']} | {c['phone']} | {c['email']}") if not found: print(" Совпадений не найдено.") def contacts_loop(): while True: print_header("УПРАВЛЕНИЕ КОНТАКТАМИ") print_menu([ "1. Добавить контакт", "2. Список контактов", "3. Найти контакт", "0. Назад" ]) ch = input("\n Выберите действие: ").strip() if ch == "1": handle_add_contact() elif ch == "2": handle_list_contacts() elif ch == "3": handle_find_contact() elif ch == "0": break else: print("\n Неверный выбор.") input("\n Нажмите Enter для продолжения...") # ── УПРАВЛЕНИЕ ЗАДАЧАМИ ────────────────────── def handle_add_task(): """Добавить задачу (можно связать с контактом по желанию)""" global next_task_id print_header("ДОБАВЛЕНИЕ ЗАДАЧИ") title = input(" Тема: ").strip() if not title: print(" Тема не может быть пустой."); return desc = input(" Описание: ").strip() cid = input_int(" ID контакта (0 - не связывать): ") if cid != 0 and cid not in contacts: print(" Контакт не найден."); return tasks[next_task_id] = { "title": title, "desc": desc, "contact_id": cid if cid in contacts else None, "status": "открыта" } print(f"\n Задача #{next_task_id} добавлена.") next_task_id += 1 def handle_list_tasks(): """Список всех задач""" print_header("СПИСОК ЗАДАЧ") if not tasks: print(" Нет задач."); return for tid, t in tasks.items(): link = f"→ {contacts[t['contact_id']]['name']}" if t['contact_id'] else "" print(f" [{tid}] {t['title']} [{t['status']}] {link}") def handle_find_task(): """Поиск задачи по теме""" print_header("ПОИСК ЗАДАЧИ") query = input(" Поиск по теме: ").strip().lower() found = False for tid, t in tasks.items(): if query in t['title'].lower(): found = True link = f"({contacts[t['contact_id']]['name']})" if t['contact_id'] else "" print(f" [{tid}] {t['title']} {link} [{t['status']}]") if not found: print(" Совпадений не найдено.") def handle_finish_task(): """Отметить задачу как выполненную""" tid = input_int(" ID задачи для завершения: ") if tid not in tasks: print(" Нет такой задачи."); return tasks[tid]['status'] = 'закрыта' print(" Задача завершена.") def tasks_loop(): while True: print_header("УПРАВЛЕНИЕ ЗАДАЧАМИ") print_menu([ "1. Добавить задачу", "2. Список задач", "3. Найти задачу", "4. Завершить задачу", "0. Назад" ]) ch = input("\n Выберите действие: ").strip() if ch == "1": handle_add_task() elif ch == "2": handle_list_tasks() elif ch == "3": handle_find_task() elif ch == "4": handle_finish_task() elif ch == "0": break else: print(" Неверный выбор.") input("\n Нажмите Enter для продолжения...") # ── ГЛАВНОЕ МЕНЮ ───────────────────────────── def show_main_menu(): print_header("УЧЁТ КОНТАКТОВ И ЗАДАЧ") print_menu([ "1. Работа с контактами", "2. Работа с задачами", "0. Выход" ]) def main_loop(): print("\n Добро пожаловать в систему учёта контактов и задач!") input(" Нажмите Enter для начала...") while True: show_main_menu() choice = input("\n Ваш выбор: ").strip() if choice == "1": contacts_loop() elif choice == "2": tasks_loop() elif choice == "0": print("\n Спасибо и до свидания!") break else: print(" Неверный выбор.") input("\n Нажмите Enter для продолжения...") if __name__ == "__main__": main_loop()