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

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

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

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

Задача«Долгожданный отпуск»

Анна мечтает об отпуске и хочет накопить на него определенную сумму. Она начинает с некоторой годовой зарплаты и планирует свои сбережения. Каждый год её работодатель обещает повышение, и её зарплата увеличивается на 15% по сравнению с предыдущим годом. Анна очень дисциплинированна и решает откладывать ровно 10% от своей годовой зарплаты в конце каждого года.

Напишите программу, которая поможет Анне рассчитать, через сколько полных лет она сможет накопить нужную сумму. Программа должна запросить у пользователя текущую годовую зарплату Анны и стоимость отпуска.

Дополнительное условие: После вывода основного результата (количества лет), программа должна спросить у пользователя, хочет ли он увидеть подробный отчет по годам. Если пользователь вводит "да", программа должна вывести для каждого года его номер, зарплату за этот год, сколько было отложено и какая общая сумма накоплений стала на конец года.

 

Формат ввода

Годовая зарплата Анны (число, float)
Стоимость отпуска (число, float)
Ответ на вопрос о подробном отчете (строка, str)

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

Основной результат: Строка с информацией о том, сколько лет потребуется (строка, str)
Дополнительный результат (опционально): Подробный отчет по каждому году накоплений (строки, str)

Пример

Ввод

100000
50000
да

Вывод

Анне потребуется 5 лет, чтобы накопить на отпуск.
Хотите увидеть подробный годовой отчет? (да/нет): 
--- Годовой отчет ---
Год 1: Зарплата 100000.00, Отложено 10000.00, Всего накоплено 10000.00
Год 2: Зарплата 115000.00, Отложено 11500.00, Всего накоплено 21500.00
Год 3: Зарплата 132250.00, Отложено 13225.00, Всего накоплено 34725.00
Год 4: Зарплата 152087.50, Отложено 15208.75, Всего накоплено 49933.75
Год 5: Зарплата 174900.62, Отложено 17490.06, Всего накоплено 67423.81

Подсказка

While в питоне

В языке программирования Python конструкция цикла while может иметь необязательный блок else. Этот блок выполняется только в том случае, когда цикл завершается своим естественным путем, то есть когда его условие становится ложным, а не в результате принудительного прерывания с помощью оператора break.

Синтаксис:

while условие:
    # тело цикла
    # ...код, который выполняется на каждой итерации...
else:
    # блок else
    # ...код, который выполняется, если цикл завершился без break...

Можно думать о блоке else как о "плане Б": он срабатывает, если основная цель внутри цикла (которая обычно завершается через break) не была достигнута.

Пример использования: Поиск элемента

Рассмотрим классическую задачу, где мы ищем число в списке. Если число найдено, мы немедленно прерываем цикл с помощью break. Если же мы проверили все элементы и так и не нашли искомое, выполняется блок else.

numbers = [1, 2, 3, 4, 5]
target = 8 # Попробуем найти число, которого нет в списке

index = 0
while index < len(numbers):
    if numbers[index] == target:
        print(f"Успех! Найден {target} по индексу {index}.")
        break # Цель достигнута, выходим из цикла
    index += 1
else:
    # Этот блок выполнится, так как break не был вызван
    print(f"Поиск завершен. {target} не найден в списке.")

Как это работает:

  1. Цикл while выполняется, пока условие index < len(numbers) истинно.
  2. Внутри цикла мы проверяем, равен ли текущий элемент искомому (target).
  3. Если мы находим значение, выводится сообщение об успехе и цикл немедленно прерывается оператором break. Блок else в этом случае игнорируется.
  4. Если же цикл доходит до конца (проверил все элементы), это означает, что break ни разу не сработал. Условие index < len(numbers) становится ложным, и тогда выполняется блок else, сообщая о неудачном поиске.

Полезный совет: Использование while...else помогает избежать "флаговых" переменных. Без этого блока код выглядел бы так:

# Альтернативный вариант с "флагом"
numbers = [1, 2, 3, 4, 5]
target = 8
found = False # Переменная-флаг

index = 0
while index < len(numbers):
    if numbers[index] == target:
        found = True
        break
    index += 1

if found:
    print(f"Успех! Найден {target}.")
else:
    print(f"Поиск завершен. {target} не найден в списке.")

Как видите, конструкция while...else делает код более чистым, лаконичным и "питоническим" (Pythonic), избавляя от необходимости вручную управлять флагом.

Если break отсутствует

Если в теле цикла while нет оператора break, то блок else будет выполняться всегда после завершения цикла.

count = 0
while count < 3:
    print(f"Итерация номер {count}")
    count += 1
else:
    print("Цикл завершился естественным образом, поэтому блок else выполнен.")

Здесь цикл while выполняется, пока count меньше 3. Как только count становится равным 3, условие цикла становится ложным, и управление передается в блок else.

Важные нюансы

  • Что насчет continue? Оператор continue не прерывает цикл, а лишь досрочно завершает текущую итерацию. Он никак не влияет на выполнение блока else.
  • Если цикл не выполнился ни разу? Если условие while изначально ложно, тело цикла не выполнится ни разу. Однако блок else все равно выполнится, так как цикл завершился "нормально" (не был прерван через break).
value = 10
while value < 5: # Условие сразу ложно
    print("Этот текст никогда не будет напечатан")
else:
    print("Цикл даже не начался, но завершился штатно, поэтому else сработал.")
  • Это работает и для циклов for! Та же самая логика применима и к циклам for...else. Блок else после for выполняется, если цикл прошел по всем элементам и не был прерван с помощью break.

Вывод

Конструкция while...else — это мощный и элегантный инструмент в Python. Он идеально подходит для ситуаций, когда нужно выполнить какое-то действие только в том случае, если цикл завершил свою работу полностью, не будучи прерванным. Это особенно полезно в алгоритмах поиска, проверки условий или при работе с потоками данных, где break сигнализирует об особом событии, а else — о штатном завершении без таковых.

main.py
Тест 1
Тест 2
Тест 3
Тест 4
Тест 5
Тест 6
Тест 7
Тест 8
Тест 9
Тест 10
Решение разработчика
# Запрашиваем у пользователя начальные данные
initial_salary = float(input())
vacation_cost = float(input())

# Проверяем корректность введенных данных
if initial_salary <= 0 or vacation_cost <= 0:
    print("Ошибка: Зарплата и стоимость отпуска должны быть положительными числами.")
else:
    # Инициализация переменных для цикла
    current_salary = initial_salary  # Текущая годовая зарплата
    total_savings = 0.0              # Общая сумма накоплений
    years = 0                        # Счетчик лет
    
    # Список для хранения детальной информации по годам
    yearly_details = []

    # Цикл while работает, пока накопленная сумма меньше стоимости отпуска
    while total_savings < vacation_cost:
        years += 1  # Увеличиваем счетчик лет на 1
        
        # Рассчитываем, сколько денег будет отложено в этом году (10%)
        saved_this_year = current_salary * 0.10
        
        # Добавляем отложенные деньги к общей сумме накоплений
        total_savings += saved_this_year
        
        # Сохраняем детали этого года для возможного отчета
        yearly_details.append((years, current_salary, saved_this_year, total_savings))
        
        # Увеличиваем зарплату на 15% для следующего года
        current_salary *= 1.15

    # Выводим основной результат
    print(f"Анне потребуется {years} лет, чтобы накопить на отпуск.")
    
    # Спрашиваем пользователя, нужен ли детальный отчет
    show_details = input("Хотите увидеть подробный годовой отчет? (да/нет): ")
    
    # Условие для вывода детального отчета
    if show_details.lower() == 'да':
        print("\n--- Годовой отчет ---")
        # Цикл for для вывода информации по каждому году
        for detail in yearly_details:
            year, salary, saved, total = detail
            # Выводим отформатированную строку с данными за год
            print(f"Год {year}: Зарплата {salary:.2f}, Отложено {saved:.2f}, Всего накоплено {total:.2f}")

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

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

AD

Реклама

red-snake blue-snake green-snake

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

Помощник ИИ

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