@P_1991

Как исключить ввод пустой строки?

Добрый день! Изучаю программирование на Python. В качестве тренировки решил написать программу которая решает и выводит решение квадратных уравнений. Код ниже:

print("* Данная программа получает значения A, B и C квадратного уравнения,\n\
вычисляет и выводит результат и решение уравнения.")
value = 1

while value == 1:
    quit = input("\nНажмите ENTER чтобы продолжить или Q чтобы выйти: ").lower()
    if quit == 'q':
        exit
        break
    else:
        # получаем исходные данные и выводим структуру уравнения
        a = float(input("\n* Введите значение для Ax\u00B2: "))
        b = float(input("* Введите значение для Bx: "))
        c = float(input("* Введите значение для C: "))
        equals = 0
        if a == 0:
            print("\nАргумент А не должен быть равен нулю")
        else:
            square_equalignment = "{:.0f}x\u00B2{:+.0f}x{:+.0f}={:.0f}".format(a, b, c, equals)
            print(f"\n* Общий вид квадратного уравнения: {square_equalignment}")

            # вычисляем дискриминант
            D = (b ** 2) - (4 * a * c)
            print("\n* Вычисляем дискриминант по формуле: D = b\u00B2 - 4ac = {:.0f} - 4 * {:.0f} * {:.0f} = {:.0f}".format(b ** 2, a, c, D))

            # Проверяем имеет ли уравнение корни или нет
            if D < equals:
                print("\n* У исходного уравнения корней нет, поскольку квадрат любого числа не должен быть отрицательным.")
            elif D > equals:
                print("\n* У исходного уравнения два корня, так как дискриминант больше нуля:")
                x_1 = ((-b) + (D ** 0.5)) / (2 * a)
                x_2 = ((-b) - (D ** 0.5)) / (2 * a)
                print("\n* Значение переменной Х 1 равняется: {:.2f}".format(x_1))
                print("* Значение переменной Х 2 равняется: {:.2f}".format(x_2))
                print("\nУравнение решено")
            else:
                print("\n* У исходного уравнения один корень, так как дискриминант равен нулю:")
                x = - (b / (2 * a))
                print("* Значение переменной Х равняется: {:.2f}".format(x))
                print("\nУравнение решено")


Если пользователь при запросе "Введите значение для..." вводит пустую строку, то программа закрывается с ошибкой:
Traceback (most recent call last):
  File "D:\pyt\discr.py", line 12, in <module>
    a = float(input("\n* Введите значение для Ax\u00B2: "))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: could not convert string to float: ''


так как программа ожидает аргумент, но не получает его. Подскажите как реализовать проверку корая сообщит пользователю, что он ввел пустую строку и предложит заново ввести аргументы. Еще одну конструкцию из if else на мой взгляд не нужно делать. Ну и общие рекомендации тоже приветствуются. Заранее спасибо.

P.S. Функции и вообщем то циклы еще не изучал.
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Тебе нужно повторять ввод аргументов, пока пользователь не введёт их правильно? Ну вот и повод почитать про циклы.
while True:  # бесконечный цикл
  x_str = input('Введите x:')  # вводим число
  try:  # внутри блока try мы будем отлавливать ошибки - исключения
    x = float(x_str)  # пробуем преобразовать строку в число
  except ValueError:  # в случае чего float() выкинет исключение ValueError
    print(x_str, 'это не число. Попробуйте ещё раз.')  # сообщаем пользователю
  else:  # если ошибки не было
    break  #  то прерываем цикл, у нас в x лежит нужное значение
  # мы делаем break только в ветке else - значит, пока отрабатывает ветка except, цикл продолжится

В принципе, если тебе нужна только одна попытка, ты можешь вытащить блок try-except из цикла, убрать ветку else, и заменить ветку except на что-то типа:
except ValueError:
  print(x_str, 'это не число. У вас есть ещё одна попытка')  # сообщаем пользователю
  x_str = input('Введите x: ')
  x = float(x_str)

Тогда получится обойтись без циклов.

Но без try-except обойтись сложнее. Да, ты можешь предварительно проверить строку на соответствие шаблону десятичного дробного числа, но честно? try-except куда проще, так что стоит его освоить. Главное - не "глотай" ошибки, реагируй на них.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@LanskoyGames
У модераторов первое место, но только с конца...
Try/except/else
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы