Как мне убедиться, что одномерный массив действителен с помощью оператора while? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь проверить правильность каждого целого числа (массива) (от 0 до 30).Возникает проблема, когда запускается строка, сообщающая пользователю, что оценка неверна, но переменная не кажется ложной, и я не знаю почему, кто-нибудь может это исправить?

Вот код, о котором идет речь:

while valid_score == True and program_running == True:
      for counter in range(0,6):
            print("How mant points did player", counter + 1 ,"earn?") 
            score_earned[counter] = int(input())

            if score_earned[counter] < 0 or score_earned[counter] > 30: 
                  print("That value was invalid as it was lower than 0 or `above 30!")`
                  valid_score = False

            else:
                  valid_score = True


            total_score = score_earned[counter] + total_score

      valid_score = False

Ответы [ 4 ]

0 голосов
/ 10 октября 2018

Назначение цикла for несколько сбивает с толку, поскольку вы периодически повторяете цикл от 0 до 6, когда вы, вероятно, просто хотите использовать только цикл while и увеличивать значение счетчика, пока оно меньше 6.

Я написал этот пример, который преобразовал то, что я мог понять из логики вашего кода, только в одно выражение while:

counter = 0
valid_score = True
program_running = True

while valid_score and counter < 6 and program_running:
    print("How mant points did player", counter + 1 ,"earn?") 
    score_earned[counter] = int(input())

    if score_earned[counter] < 0 or score_earned[counter] > 30: 
        print("That value was invalid as it was lower than 0 or `above 30!")`
        valid_score = False

    total_score += score_earned[counter]  # Not sure you want to add to the total score when invalid
                                          # Probably better to add to total score in else statement
    counter += 1  # Increment counter variable keeping track of number of iterations

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

0 голосов
/ 10 октября 2018

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

score_earned = {}  
players = 5

for i in range(1, players +1):
    points = -1
    while points < 0 or points > 30:
        try:
            points = int(input('Enter points for player {} between 0 and 30: '.format(i)))
        except ValueError:
            print('Please enter points between 0 and 30')
    score_earned[i] = points

total_score = sum(score_earned.values())
print('The total score is: {}'.format(total_score))
0 голосов
/ 10 октября 2018

Я пошел вперед и сделал рабочую версию вашего кода.Вы, кажется, делаете несколько ошибок.Это должно помочь прояснить ваши заблуждения.Попробуйте добавить проверку типа (), если кто-то решит ввести строку.

score_earned = {} #python dictionary is an associative array
counter = 1
valid_score = True

while valid_score == True: #and program_running == True: #program_running variable is never assigned
    print("How mant points did player", counter, "earn?") 
    score_earned[counter] = int(input())

    if score_earned[counter] < 0 or score_earned[counter] > 30: 
        print("That value was invalid as it was lower than 0 or above 30!")
        valid_score = False

    total_score = score_earned[counter] + total_score #currently doing nothing with total_score
    counter += 1
0 голосов
/ 10 октября 2018

Полагаю, вы неправильно поняли, как работают циклы

while valid_score == True and program_running == True: # <-- This will not break while running inner loop
      for counter in range(0,6): # <-- this loops independently
            ....

Я предлагаю настроить код так, чтобы он выглядел следующим образом:

  for counter in range(0,6):
        print("How mant points did player", counter + 1 ,"earn?") 
        score_earned[counter] = int(input())

        if score_earned[counter] < 0 or score_earned[counter] > 30: 
              print("That value was invalid as it was lower than 0 or `above 30!")`
              valid_score = False
              break # <-- this ends the loop early

        else:
              valid_score = True

        total_score = score_earned[counter] + total_score
        if not program_running == True:
              break
...