В вашем коде всё работает правильно, но есть несколько моментов, которые можно улучшить для более удобного и надежного использования:
1. Цикл: После выполнения кода для каждой категории, цикл не продолжается. Нужно снова запросить ввод категории в конце цикла, чтобы можно было обрабатывать несколько категорий, пока не будет введено 'off'.
2. Обработка неверного ввода: Если пользователь введет категорию, отличную от 'молочные продукты', 'выпечка' или 'off', программа просто запросит сумму и выведет её. Хорошо бы добавить сообщение, что введенная категория не распознана.
3. Обработка ошибок при вводе суммы: Пользователь может случайно ввести не число при запросе суммы. Нужно обработать эту ситуацию, чтобы программа не завершалась с ошибкой.
Вот исправленный и улучшенный код:
while True:
category = input('Категория (off - завершить): '

.lower() # Приводим к нижнему регистру для удобства
if category == 'off':
break # Выход из цикла, если введено 'off'
try:
price = int(input('Сумма: '

) # Теперь внутри блока try, чтобы отловить ошибку
if category == 'молочные продукты':
skidka = price * 0.1
total_price = price - skidka
print('Скидка 10%. К оплате:', total_price)
elif category == 'выпечка':
skidka = price * 0.3
total_price = price - skidka
print('Скидка 30%. К оплате:', total_price)
else:
print('К оплате:', price)
except ValueError:
print('Ошибка: введите числовое значение для суммы.'
except Exception as e: # Ловим другие возможные ошибки
print(f"Произошла ошибка: {e}"
print('Касса закрыта.'
Объяснение изменений:
• while True: Заменяет while category != 'off', чтобы цикл продолжался, пока явно не будет прерван командой break.
• category = input(...).lower(): Приводит введенную категорию к нижнему регистру. Это позволяет пользователю вводить "Молочные продукты", "мОлОчНыЕ пРоДуКтЫ" и т.д., и программа всё равно распознает категорию.
• try...except ValueError: Блок try пытается выполнить код, который может вызвать ошибку, а блок except ValueError перехватывает ошибку, если пользователь ввел не число. Это предотвращает крах программы. Дополнительно добавлен except Exception as e: для отлова других возможных ошибок.
• if category == 'off': break: Если введена команда 'off', цикл прерывается с помощью break.
• Более правильный порядок ввода, так как в случае неверной категории, пользователь все равно вводил сумму.
Этот улучшенный код более надежный и удобный в использовании. Он корректно обрабатывает различные категории, предотвращает ошибки при вводе суммы и позволяет пользователю завершить работу в любой момент.