• 1
    Ввод и вывод данных
    • Задачи
  • 2
    Условия
    • Задачи
  • 3
    Цикл for
    • Задачи
  • 4
    Строки
    • Задачи
  • 5
    Цикл while
    • Задачи
  • 6
    Списки
    • Задачи
  • 7
    Двумерные массивы
    • Задачи
  • 8
    Словари
    • Задачи
  • 9
    Множества
    • Задачи
  • 10
    Функции и рекурсия
    • Задачи
  • к

Занятие 5. Цикл while

Уровень сложности:

иконка человека красный иконка человека белая иконка человека зеленая Pythonlib

Задача«Древние артефакты»

Вы работаете младшим специалистом в цифровом архиве. Ваша задача — создать программу-помощник для каталогизации древних артефактов. Каждый артефакт имеет уникальный числовой идентификатор (ID) и название.

Программа должна быть интерактивной и работать в цикле, ожидая от вас команд.

Команды программы:

  1. добавить — запускает процесс добавления нового артефакта. Программа запросит у вас данные в формате "ID:Название". Вы должны убедиться, что ID является целым числом. Если формат ввода некорректен (например, отсутствует двоеточие или ID не является числом), программа должна сообщить об ошибке и запросить ввод снова, пока не будут введены корректные данные.
  2. список — выводит на экран текущий список всех добавленных артефактов в том порядке, в котором они были добавлены.
  3. сортировать — выполняет сортировку всех артефактов по возрастанию их ID. Для сортировки необходимо использовать алгоритм пузырьковой сортировки. После выполнения сортировки программа должна сообщить об успехе.
  4. выход — завершает работу программы.

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

Формат ввода

Команда пользователя (строка). Может быть одной из: добавитьсписоксортироватьвыход.
Если команда добавить, то далее следует ввод данных об артефакте (строка) в формате ID:Название. ID должен быть представим в виде целого числа.

Формат Вывода

Ответы программы на команды, сообщения об ошибках, отсортированный или неотсортированный список артефактов (строки).

Пример

Ввод

добавить
30:Щит
добавить
10:Меч
сортировать
список
выход

Вывод

Артефакт успешно добавлен.
Артефакт успешно добавлен.
Архив успешно отсортирован по ID.
--- Каталог артефактов ---
ID: 10, Название: Меч
ID: 30, Название: Щит
--------------------------
Завершение работы программы. До свидания!

Подсказка

Тут подсказки не будет, решай сам!

main.py
Тест 1
Тест 2
Тест 3
Тест 4
Тест 5
Тест 6
Тест 7
Тест 8
Тест 9
Тест 10
Решение разработчика
# Создаем два пустых списка для хранения ID и названий артефактов.
# Мы используем два списка, чтобы ID и названия с одинаковыми индексами соответствовали друг другу.
artifact_ids = []
artifact_names = []

# Запускаем бесконечный цикл, который будет работать, пока пользователь не введет команду "выход".
while True:
    # Запрашиваем у пользователя ввод команды.
    command = input()

    # Условие для обработки команды "добавить".
    if command == "добавить":
        # Внутренний цикл для проверки корректности ввода данных об артефакте.
        while True:
            # Запрашиваем данные в формате "ID:Название".
            data_input = input()
            
            # Проверяем, есть ли в строке разделитель ':'.
            if ':' in data_input:
                # Разделяем строку на две части по первому вхождению ':'.
                parts = data_input.split(':', 1)
                id_str = parts[0]
                name_str = parts[1]
                
                # Проверяем, состоит ли часть с ID только из цифр (и возможно знака минус).
                if id_str.strip().isdigit():
                    # Если все проверки пройдены, преобразуем ID в целое число.
                    new_id = int(id_str)
                    # Добавляем ID и название в соответствующие списки.
                    artifact_ids.append(new_id)
                    artifact_names.append(name_str)
                    print("Артефакт успешно добавлен.")
                    # Прерываем внутренний цикл проверки, так как данные корректны.
                    break
                else:
                    # Сообщение об ошибке, если ID не является числом.
                    print("Ошибка: ID должен быть целым числом. Попробуйте снова.")
            else:
                # Сообщение об ошибке, если формат ввода неверный.
                print("Ошибка: неверный формат. Используйте ID:Название. Попробуйте снова.")

    # Условие для обработки команды "список".
    elif command == "список":
        print("--- Каталог артефактов ---")
        # Проверяем, есть ли артефакты в каталоге.
        if not artifact_ids:
            print("Архив пуст.")
        else:
            # Используем цикл for для перебора всех артефактов и их вывода.
            # range(len(artifact_ids)) генерирует последовательность индексов от 0 до N-1.
            for i in range(len(artifact_ids)):
                print(f"ID: {artifact_ids[i]}, Название: {artifact_names[i]}")
        print("--------------------------")
    
    # Условие для обработки команды "сортировать".
    elif command == "сортировать":
        # Получаем количество элементов для сортировки.
        n = len(artifact_ids)
        # Внешний цикл пузырьковой сортировки.
        for i in range(n):
            # Внутренний цикл, который сравнивает и меняет местами соседние элементы.
            # С каждым проходом внешнего цикла самый большой элемент "всплывает" в конец,
            # поэтому внутренний цикл можно сокращать на 'i'.
            for j in range(0, n-i-1):
                # Если текущий ID больше следующего, меняем их местами.
                if artifact_ids[j] > artifact_ids[j+1]:
                    # Меняем местами ID.
                    artifact_ids[j], artifact_ids[j+1] = artifact_ids[j+1], artifact_ids[j]
                    # ВАЖНО: одновременно меняем местами и названия, чтобы сохранить соответствие.
                    artifact_names[j], artifact_names[j+1] = artifact_names[j+1], artifact_names[j]
        print("Архив успешно отсортирован по ID.")

    # Условие для обработки команды "выход".
    elif command == "выход":
        print("Завершение работы программы. До свидания!")
        # Прерываем главный цикл while, что приводит к завершению программы.
        break

    # Если введена неизвестная команда.
    else:
        print("Неизвестная команда. Пожалуйста, используйте одну из следующих: добавить, список, сортировать, выход.")

🎉 Поздравляем! 🎉

Ты отлично справился с задачей! Это был непростой вызов, но ты нашёл правильное решение. Ты на шаг ближе к мастерству в программировании! Продолжай в том же духе, ведь каждый пройденный этап делает тебя ещё сильнее.

AD

Реклама

red-snake blue-snake green-snake

Запускаем ваш код...

Помощник ИИ

Привет! Я твой помощник по программированию. Задавай любые вопросы по Python, я могу рассказать о функциях, методах, обьяснить то, что тебе не понятно, а так же о текущей задаче!