Как использовать циклы while с несколькими операторами if / elif? - PullRequest
0 голосов
/ 09 февраля 2019

Попытка использовать оператор while для возврата к открывающей подсказке.Я прошу прощения за мой мусорный код.

Я попытался присвоить значение True / False значению цикла while, но программа просто завершает работу при получении любого ввода.

choice = eval(input('What would you like to convert? \n Farenheit to Celcius (1) \n Feet to Meters (2) \n Pounds to Kilograms (3) \n Ounces to Liters (4) \n : '))

 while choice:

    if choice == 1:

        degreesF = eval(input('Enter the temperature in degrees F: '))
        degreesC = 5/9*(degreesF - 32)
        print(degreesC, 'degrees Celcius')

    elif choice == 2: 

        distanceFeet = eval(input('Enter the distance in feet: '))
        distanceMeters = distanceFeet/3.28
        print(distanceMeters, 'm')

    elif choice == 3:

        Pounds = eval(input('Pounds: '))
        Kilograms = Pounds*0.45359237038
        print(Kilograms, 'kg')

    elif choice == 4:

        Ounces = eval(input('Ounces: '))
        Liters = Ounces*0.0295735
        print(Liters, 'L')

В настоящее время программа возвращает меня к тому, что я установилвход как.Например, если я ввожу 1, я могу преобразовать температуру, но я могу преобразовать только температуру.

Ответы [ 4 ]

0 голосов
/ 09 февраля 2019

Вам нужно сделать пару вещей, а сейчас вы должны сделать их явными:

  1. Ваша программа должна работать вечно или до тех пор, пока ей не сообщат о выходе.

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

  3. Ваши входные данные для числовых значений должны повторяться до тех пор, пока они не получат правильные ответы.

Общая форма решения

Как вы можете это делать?Как правило, начиная с неверных исходных данных и повторяя их до тех пор, пока вы не увидите хорошие данные:

some_value = bad_data()
while some_value is bad:
    some_value = input("Enter some value: ")

Хорошее значение по умолчанию для bad_data() - это специальное значение None.Вы можете написать:

some_value = None

С другой стороны, вашему тесту is bad может потребоваться другой тип неверных данных, например строка.Вы можете рассмотреть возможность использования '' в качестве неверного значения данных:

some_value = ''

Наконец, если ваш is bad тест требует целочисленного значения, возможно, стоит рассмотреть использование числа, которое вы считаете неправильным, или числа издиапазон (например, отрицательное значение):

some_value = 100
# or 
some_value = -1

Для ваших конкретных проблем:

1.Как мне работать вечно?

Вы можете работать вечно, используя цикл while, который никогда не завершается.Цикл while будет работать до тех пор, пока условие выполнено.Есть ли значение, которое всегда верно в Python?Да!Его имя True:

while True:
    # runs forever

2.Как выполнить цикл, пока мой выбор меню не будет действительным?

Использование общей формы, приведенной выше, для целочисленного выбора.Ваше меню просит пользователя ввести номер.Вы можете проверить допустимое значение, используя str .isdigit() или try:/except:.В python исключение - лучший выбор:

choice = -1                           # Known bad value
while choice not in {1, 2, 3, 4}:     # {a,b,c} is a set
    instr = input('Choose 1..4')
    try:
        choice = int(instr)
    except:
        choice = -1

3.Как я могу выполнить цикл, пока не получу действительное числовое значение?

Для чисел с плавающей запятой, таких как температура, вы не хотите пытаться изложить явный набор разрешенных ответов или диапазон значенийномера.Вместо этого используйте None (вы можете использовать Nan, но это больше символов для того же результата).

temp = None
while temp is None:
    instr = input('Enter a temp: ')

    try:
        temp = float(instr)
    except:
        temp = None

Имейте в виду, что 'nan' является допустимым значением с плавающей точкой.Так что вы можете проверить это и запретить.

Как мне объединить все эти вещи?

Вы собрали их вместе в блоки:

while True:   # run forever

    # Menu choice:
    choice = -1                           # Known bad value
    while choice not in {1, 2, 3, 4}:     # {a,b,c} is a set
        instr = input('Choose 1..4')
        try:
            choice = int(instr)
        except:
            choice = -1

    if choice == 1:
        # Now read temps
        temp = None
        while temp is None:
            instr = input('Enter a temp: ')

            try:
                temp = float(instr)
            except:
                temp = None
0 голосов
/ 09 февраля 2019

Вы хотите включить вход в цикл while:

while True:
    choice = int(input('What would you like to convert? \n Farenheit to Celcius (1) \n Feet to Meters (2) \n Pounds to Kilograms (3) \n Ounces to Liters (4) \n : '))

    if choice == 1:
        degreesF = float(input('Enter the temperature in degrees F: '))
        degreesC = 5/9*(degreesF - 32)
        print(degreesC, 'degrees Celcius')
    elif choice == 2: 
        distanceFeet = float(input('Enter the distance in feet: '))
        distanceMeters = distanceFeet/3.28
        print(distanceMeters, 'm')
    elif choice == 3:
        Pounds = float(input('Pounds: '))
        Kilograms = Pounds*0.45359237038
        print(Kilograms, 'kg')
    elif choice == 4:
        Ounces = float(input('Ounces: '))
        Liters = Ounces*0.0295735
        print(Liters, 'L')
    else:
        break
0 голосов
/ 09 февраля 2019

Вы должны поместить строку eval внутри цикла while, чтобы он запускался несколько раз.

непроверенный (псевдо) код:

while true:
your input line
your other code

это будет выполняться вечно, поэтому я предлагаю сделатьчто-то вроде этого

while true:
  your input line
  if input == 0:
    break
  your other code

это остановит цикл while при вводе 0

0 голосов
/ 09 февраля 2019

Помещение строки ниже while True может привести к тому, что вы ожидали:

choice = eval(input('What would you like to convert? \n Farenheit to Celcius (1) \n Feet to Meters (2) \n Pounds to Kilograms (3) \n Ounces to Liters (4) \n : '))

Если я не ошибаюсь, вам нужно что-то вроде ниже:

while True:
    choice = eval(input('What would you like to convert? \n Farenheit to Celcius (1) \n Feet to Meters (2) \n Pounds to Kilograms (3) \n Ounces to Liters (4) \n : '))

    if choice == 1:

        degreesF = eval(input('Enter the temperature in degrees F: '))
        degreesC = 5/9*(degreesF - 32)
        print(degreesC, 'degrees Celcius')

    elif choice == 2: 

        distanceFeet = eval(input('Enter the distance in feet: '))
        distanceMeters = distanceFeet/3.28
        print(distanceMeters, 'm')

    elif choice == 3:

        Pounds = eval(input('Pounds: '))
        Kilograms = Pounds*0.45359237038
        print(Kilograms, 'kg')

    elif choice == 4:

        Ounces = eval(input('Ounces: '))
        Liters = Ounces*0.0295735
        print(Liters, 'L')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...