2016-11-30 1 views
0

Я нахожусь в середине очень сложного задания для школы. Я пробовал несколько дней, и я думаю, что я, наконец, почти закончил, но ... Я снова застрял и не знаю почему.A while цикл в моей программе имеет несколько ifs, но никогда не достигает нижней?

Я должен позволить пользователю заполнить номер invoer (Dutch)/input. Это число должно быть меньше или равно 50. Это число определяет, сколько еще вводимых данных пользователь может сделать - эти новые входы являются тестовыми примерами. Каждый тестовый пример должен быть числом больше 0, но равным или ниже 100. Не требуется углубляться в работу с плохим вводом, поэтому для этого я использую только базовую обработку.

Тогда то, что должно быть проверено для каждого тестового примера, является наименьшим числом, которое делится на тестовый пример, но сумма отдельных цифр этого наименьшего числа должна равняться самому тестовому случаю. Таким образом, в примере они указывают: input = 1 (что означает 1 тестовый пример, но они не утверждают, что), вход 2 = 10 (это означает, что ваш единственный тестовый пример - это номер 10, но они не указывают это). То, что он отправляет, - это номер 190 (это потому, что 190/10 = 19, так что это правильный результат, но 1 + 9 + 0 = 10, так что он проходит второй тест, но опять же, они этого не говорят. Я должен был все это выяснить, поэтому ассимиляция берет меня так долго ... сам вопрос находится на голландском языке и почти не дает вам никакой информации вообще).

Так что моя программа проверяет, если я вводю номер 25 в качестве тестового примера, например, 25/25 = 1, поэтому действительный и 2 + 5 = 7. Однако после вычисления этого числа 7 он никогда не кажется проверьте второе условие. Сумма цифр должна быть 25, а не 7. Теперь программа запускается в бесконечный цикл, и я не вижу, что не так.

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

import sys 

invoer = int(input('Vul het aantal testgevallen in: ')) 
if invoer <= 50: 
    invoer = invoer 
else: 
    print('Het getal moet groter kleiner dan of gelijk aan 50 zijn!!') 
    sys.exit() 

t = 0 
testgevallen = [] 

while t < invoer: 

    invoer2 = int(input('Vul een testgeval in groter dan 0 en kleiner of gelijk aan 100: ')) 
    if 0 < invoer2 <= 100: 
     print('Testgeval ', t + 1, 'is: ', invoer2) 
     testgevallen.append(invoer2) 
     t += 1 
     print('Array is ', testgevallen) 
    else: 
     print('Het getal moet groter zijn dan 0 en kleiner of gelijk aan 100!!') 
     sys.exit() 
t = 0 

while t < invoer: 
    print('Opgegeven nummer ', t + 1, ' is ', testgevallen[t]) 
    vermenigvuldiging = 1 

    doorgaan = True 

    while doorgaan == True: 
     getal = testgevallen[t] * vermenigvuldiging 

     if testgevallen[t] % getal == 0: 
      print(getal, ' - Dit getal is deelbaar door ', testgevallen[t]) 

      som = sum(map(int, str(getal))) 
      print(som) 

      if som == testgevallen[t]: 
       print('Output moet zijn: ', som) 
       doorgaan = False 

      else: 
       doorgaan = True 

     else: 
      doorgaan = True 
      vermenigvuldiging += 1 

    t += 1 
    doorgaan = doorgaan 

Надеюсь, вы, ребята, можете мне помочь. Большое спасибо за ваше время заранее, я знаю, что это довольно стена текста.

+0

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

+0

Я думаю, что вы забыли прирастить t ниже <"if som == testgevallen [t]: print ('Output moet zijn:', som) doorgaan = False> –

+1

Более питонический способ сделать первый' while t CAB

ответ

1

Есть несколько вопросов, под рукой:

В вашей внутренней петле (если сумма цифр совпадает) еще ветви второго теста в вы забыли, чтобы увеличить vermenigvuldiging, поэтому, когда он «находит» первый getal который удовлетворяет условию по модулю, он будет зацикливаться навсегда.

Обработка getal в тесте по модулю также сломана и будет соответствовать только тогда, когда vermenigvuldiging является 1, в противном случае testgevallen[t] % getal всегда равен testgevallen[t], так как getal больше. Это также приведет к бесконечному циклу. На самом деле вся

getal = testgevallen[t] * vermenigvuldiging 

кажется, что она предназначена для перебора чисел, делящихся на testgevallen[t] быстро в порядке возрастания. Это делает весь модульный тест избыточным.

рабочего раствора, по крайней мере, на вход может быть, например:

for tv in testgevallen: 
    print('Opgegeven nummer ', t + 1, ' is ', tv) 
    vermenigvuldiging = 1 

    while True: 
     getal = tv * vermenigvuldiging 
     # I've no idea what this says, but probably something along the lines 
     # of "is divisible by" and can be removed. Do print `getal` though 
     # when `som` is a match. 
     print(getal, ' - Dit getal is deelbaar door ', tv) 
     som = sum(map(int, str(getal))) 
     print(som) 

     if som == tv: 
      print('Output moet zijn: ', som) 
      break 

     # This is going to take a loooooong time for tv == 100  
     vermenigvuldiging += 1 

Следует отметить, что я удалил с помощью индексной переменной для перебора значений в списке. Просто перебирайте его напрямую. Кроме того, можно «улучшить» Ваше решение дальнейшего использования itertools.count, в этом случае вы бы заменить While-цикл с чем-то вроде:

for vermenigvuldiging in count(1): 
    ... 
+0

Спасибо тонну! Я смог понять это благодаря вам! И да, я время от времени делаю некоторые ненужные отпечатки, просто для себя, чтобы подтвердить что-то, пока я тестирую. Я всегда удаляю его после окончания. – DiaborMagics

1
while doorgaan == True: 
getal = testgevallen[t] * vermenigvuldiging 

if testgevallen[t] % getal == 0: 
    print(getal, ' - Dit getal is deelbaar door ', testgevallen[t]) 

    som = sum(map(int, str(getal))) 
    print(som) 

    if som == testgevallen[t]: 
     print('Output moet zijn: ', som) 
     doorgaan = False 

    else: 
     doorgaan = True 

else: 
    doorgaan = True 
    vermenigvuldiging += 1 

В этом время цикла t не изменяются, так что som == testgevallen[t] будет постоянным, вызывая бесконечный цикл.

+1

Николас показывает главное. добавьте, что в качестве хорошей практики вам не нужно читать все значения и сохранять их в списке. Вам не нужны все они в o nce, поэтому вы можете просто прочитать его, обработать, а затем прочитать следующий в той же переменной. Поскольку вы ограничиваете это до 50 номеров, это не проблема, но когда вы делаете большие данные, это будет. – TextGeek

+0

Я бы сказал, что 't' не должен увеличиваться во внутреннем цикле, но' vermenigvuldiging' есть, если он не соответствует обоим требованиям, которых он не находится во втором блоке else. –

+0

Я думал об этом, но без изменения 't' у вас никогда не будет возможности увеличивать' vermenigvuldiging', если 'testgevallen [t]% getal == 0' изначально' False' –

0

Во-первых, вы должны посмотреть на использование sys.exit() на docs here. Эта команда выйдет из программы при вызове, поэтому, если она вызывается в конце первого цикла while, второй цикл while никогда не будет запущен. Команда, которую вы должны использовать, чтобы выйти из цикла, пока перерыв, используемая ниже

while t < invoer: 

invoer2 = int(input('Vul een testgeval in groter dan 0 en kleiner of gelijk aan 100: ')) 
if 0 < invoer2 <= 100: 
    print('Testgeval ', t + 1, 'is: ', invoer2) 
    testgevallen.append(invoer2) 
    t += 1 
    print('Array is ', testgevallen) 
else: 
    print('Het getal moet groter zijn dan 0 en kleiner of gelijk aan 100!!') 
    break. 

Я подозреваю, что второй цикл, пока не получает работать, потому что вы используете sys.exit() вместо того, чтобы просто вырывается из цикла , Кроме того, во втором цикле while вам нужно изменить свою переменную t, иначе Output moet zijn: ', som будет постоянно печататься и застревать в этом цикле.

+0

Это была моя цель выйти из программы, когда вводные номера не соответствуют правилам того, что может быть брошено в программу. Очень простая обработка, как я объяснил. Но спасибо за попытку помочь: D – DiaborMagics

Смежные вопросы