2012-09-23 3 views
0

Цель: * Записать программу python, которая повторно запрашивает ввод положительного числа до тех пор, пока сумма чисел не будет больше 179. Используйте в своем решении как минимум три модуля/функции. * Наибольшее введенное число не может превышать 42. * Когда сумма чисел превышает 179, напечатайте сумму чисел, наибольшее введенное число и наименьшее число.Постоянно запрашивать пользователя для ввода в Python

Мне просто нужно руководство, особенно для модуля «input_numbers». Должен быть более простой способ сделать это, чем сделать переменную для каждого числа. Код не является полным. Я еще не начал работу над двумя другими модулями. Заранее спасибо.

def input_numbers(): 
    while True: 
     num1 = raw_input("Enter a positive integer no greater than 42 ") 
     if num1 <= 0: 
      print "That is not a positive integer. Try again " 
     elif num1 > 42: 
      print "The number cannot exceed 42. Try again " 

     num2 = raw_input("Enter another positive integer ") 
      if num2 <= 0: 
       print "That is not a positive integer. Try again " 
     elif num2 > 42: 
      print "The number cannot exceed 42. Try again " 

     num3 = raw_input("Enter another positive integer ") 
     if num3 <= 0: 
      print "That is not a positive integer. Try again " 
     elif num3 > 42: 
      print "The number cannot exceed 42. Try again " 

     num4 = raw_input("Enter another positive integer ") 
     if num4 <= 0: 
      print "That is not a positive integer. Try again " 
     elif num4 > 42: 
      print "The number cannot exceed 42. Try again " 

     num5 = raw_input("Enter another positive integer ") 
     if num5 <= 0: 
      print "That is not a positive integer. Try again " 
     elif num5 > 42: 
      print "The number cannot exceed 42. Try again " 
     elif sum(num1, num2, num3, num4, num5) > 179: 
      print_numbers() 

add_numbers() 

def add_numbers(): 
print_numbers() 

def print_numbers(): 

input_numbers() 
+6

Как примечание, тег 'homework' находится в процессе удаления и поэтому его больше не следует использовать. – arshajii

ответ

2

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

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

0

Вы можете повторно опросить номер в цикле и добавить входы в список, например.

def input_numbers(): 
    user_inputs = [] # a list of all user's inputs 
    while True: 
     num = raw_input("Enter a positive integer no greater than 42 ") 
     try: 
      num = int(num) # convert input string to integer 
      if num <= 0: 
       print "That is not a positive integer. Try again " 
      elif num > 42: 
       print "The number cannot exceed 42. Try again " 
      user_inputs.append(num) 
     except ValueError: # conversion to integer may fail (e.g. int('string') ?) 
      print 'Not a Number:', num 

     if some_condition_regarding(user_inputs): 
      break # eventually break out of infinite while loop 
0

здесь некоторые хорошо известные приемы:

def min_and_max(your_num_list) 
     min=your_num_list[0] 
     max=your_num_list[0] 
     for num in your_num_list: 
      if num < min: 
       min=num 
      if max > num 
       max=num 
     return min,max 
+1

Это может быть переписано как просто 'return min (your_num_list), max (your_num_list)' ... 'min()' и 'max()' - встроенные функции Python. –

0

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

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

Так в основном это может выглядеть следующим образом:

def validate_entered_number(num): 
    """ 
    Checks if the number is positive and is less or equal to 42. 
    Returns True if the number matches these conditions, 
    otherwise it returns False. 
    """ 
    if num < 0: 
     print "That is not a positive integer." 
     return False 

    if num > 42: 
     print "The number cannot exceed 42." 
     return False 

    return True 

def main(): 
    entered_numbers = [] 

    while True: 
     try: 
      num = int(raw_input("Enter a positive integer less or equal to 42: ")) 
     except ValueError: 
      print "You should enter a number" 
      continue 
     if validate_entered_number(num): 
      entered_numbers.append(num) 
      if sum(entered_numbers) > 179: 
       print "The sum of the numbers is %s" % sum(entered_numbers) 
       print "The smallest number entered is %s" % min(entered_numbers) 
       print "The largest number entered is %s" % max(entered_numbers) 
       return 

if __name__ == "__main__": 
    main() 

На самом деле, я могу представить себе ситуацию, в которой вы хотели бы просто хранить сумму чисел, наименьшее количество и наибольшее число трех переменных и обновляйте эти переменные на каждой итерации (добавьте текущий номер в сумму и сравните его с известными в настоящее время наименьшими и большими числами и при необходимости обновите соответствующие переменные), но в этом случае самый длинный список, который у вас может быть, составляет всего 180 элементов (если все числа равны 1, а пользователь не вводит 0 или вы изменили программу, чтобы запретить ввод 0), что представляет собой очень небольшое количество элементов для списка в Python. Но если вам приходилось иметь дело с действительно большим количеством чисел, я бы рекомендовал переключиться на такое решение.

1
def get_int(prompt=''): 
    while True: 
     try: 
      return int(raw_input(prompt)) 
     except ValueError: 
      pass 

def get_values(): 
    values = [] 
    total = 0 
    while total <= 179: 
     val = get_int('Enter a positive integer <= 42: ') 
     if 0 <= val <= 42: 
      values.append(val) 
      total += val 
    return values 

def print_info(values): 
    print 'Sum is {}'.format(sum(values)) 
    print 'Largest value is {}'.format(max(values)) 
    print 'Smallest value is {}'.format(min(values)) 

def main(): 
    values = get_values() 
    print_info(values) 

if __name__=="__main__": 
    main() 
4

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

Давайте немного поработаем с вашей функцией input_numbers().

def get_input_number(): 
    num = int(raw_input("Enter a positive integer no greater than 42 ")) 
    if num <= 0 or num > 42: 
     print "Invalid input. Try again " 
     get_input_number() 
    else: 
     return num 

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

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

def get_greatest_number(input_list): 
    highest = input_list[0] 
    for i in input_list: 
     if i > highest: 
      highest = i 
    return highest 

Мы установили первый элемент списка в переменную highest, а затем проверить все другие элементы в списке против этого первоначального значения. Если мы найдем тот, который больше, мы затем переназначим переменную highest на элемент, который был больше. Как только мы сделаем это для каждого элемента в списке, число внутри самого высокого теперь будет именно таким, самым большим числом, и поэтому мы вернем его в основную программу.

Аналогичным образом, мы можем сделать то же самое для поиска самого маленького.

def get_smallest_number(input_list): 
    smallest = input_list[0] 
    for i in input_list: 
     if i < smallest: 
      smallest = i 
    return smallest 

Наконец, мы добираемся до нашей основной петли. Здесь мы объявляем пустой список, number_list, чтобы хранить все числа в. И мы используем сумму этого как наше условие цикла.

if __name__ == '__main__': 
    number_list = [] 
    while sum(number_list) < 179: 
     number_list.append(get_input_number()) 

В теле цикла, мы называем наш get_input_number() и добавить свой результат в списке мы сделали. Как только сумма чисел в списке превысит 179, цикл while завершится, и мы сможем наконец показать пользователю результаты.

print 
    print '-------------------------' 
    print 'total of numbers entered: %d' % sum(number_list) 
    print 'greatest number entered: %d' % get_greatest_number(number_list) 
    print 'smallest number entered: %d' % get_smallest_number(number_list) 

Здесь мы можем get_greatest_number и get_smallest_number мы сделали, и мы даем им список чисел в качестве аргумента. Они будут циклически перемещаться по спискам, а затем возвращать соответствующие значения в операторы печати.

0

Спасибо всем, кто ответил. Я написал следующий код, и он работает почти отлично, за исключением последнего модуля. Если вы выйдете из программы после первого запуска (нажав 0), он выйдет, но если вы запустите его, то второй раз нажатие 0 не приведет к его завершению. Он вернется к началу программы. Я не знаю почему.

Примечание: У задания есть различные требования, которые я должен был включить в свой код. Следовательно, ненужные модули, глобальные переменные и комментарии.

maxNum = 42 # declares global variable maxNum 
target = 179 # declares global variable target 

def user_input(): # prompts user to input a number 42 or less until all add up to 179 
    x = 0 
    nums = []  
    while sum(nums) <= target: 
     nums.append(int(raw_input("Enter a number: "))) 
     if int(nums[x]) > int(maxNum): 
      print "Number cannot exceed 42." 
      user_input() 
     else: 
      x += 1 
    print_nums(nums,x) 

def print_nums(nums,x): # prints the sum of the numbers, the smallest, and the largest 
    print "Sum of all numbers is", sum(nums) 
    nums.sort() 
    x -= 1 
    print "Largest number entered is", nums[x] 
    print "Smallest number entered is", nums[0] 
    decide() 

def decide(): # allows user to continue the program or exit 
    exit = raw_input("<9 to enter a new set of number. 0 to exit.> ") 
    while True: 
     if int(exit) == 0: 
      return 
     elif int(exit) == 9: 
      user_input() 

user_input() 
Смежные вопросы