2017-04-15 35 views
1

當用戶輸入無效值以存儲到「數字」變量中時,我無法保護腳本不會崩潰。在不使用max的情況下打印列表中的最大數()

程序目的:允許用戶輸入整數,將它們存儲到列表中,然後找到並打印出最大的數字。不允許輸入字符串或浮點數。

功能:

  1. getNum(prompt) - 測試和將輸入的值整數和返回y。
  2. swap(A, x, y) - 簡單交換例程函數對數據進行排序。 (目前未使用)
  3. sortNum(A) - 在列表中排序和使用Swap例程。
  4. maxIt(numbers) - 查找列表中最高的數字。 (IN USE),如果我使用這個max函數,我認爲我甚至不需要對列表進行排序。
  5. main()

代碼:輸入一個STR或漂浮到getNum當

Please enter an integer or < 0 to finish >: 222 
Please enter an integer or < 0 to finish >: 333 
Please enter an integer or < 0 to finish >: 444 
Please enter an integer or < 0 to finish >: 555 
Please enter an integer or < 0 to finish >: 666 
Please enter an integer or < 0 to finish >: 777 
Please enter an integer or < 0 to finish >: 888 
Please enter an integer or < 0 to finish >: 999 
Please enter an integer or < 0 to finish >: 0 
The maximum value is: 999 

錯誤:

def getNum(prompt): 
    # Function to call when asking for the numbers later. 
    # Try/except to catch crashes if failing to store integer. 
    try: 
     x = input(prompt) 
     y = int(x) 
     return y 

    # Message to print when excepting. 
    except: 
     print("I was expecting an integer number, please try again... \n") 


# Function to swap to highest # in list 'numbers'. 
def swap(A, x, y): 
    temp1 = A[x] 
    A[x] = A[y] 
    A[y] = temp1 

# Function to perform the looping/swap routine. 
# Program can find max with separate function. 
## This function is to sort the numbers in the list. 
def sortNum(A): 
    for i in range(len(A)): 
     for k in range(len(A) - 1): 
      first = k 
      second = k + 1 

      if (A[first] > A[second]): 
       # Uses Swap function 
       swap(A, first, second) 

# Function to find the highest number in the list. 
def maxIt(numbers): 
    maxNum = numbers[0] 
    for i in numbers: 
     if i > maxNum: 
      maxNum = i 
    return maxNum 

# Start main 
def main(): 

    # Creates the numbers array. 
    numbers = [] 

    # Starts the loop to enter numbers into the array. 
    done = False 
    while not done: 
     numInput = getNum("Please enter an integer or < 0 to finish >: ") 

     # Stores every input from numInput into numbers. 
     numbers.append(numInput) 

     # Test condition to break out of loop '0'. 
     if numInput is 0: 

      # Prints the resulting max number once finished. 
      print("The maximum value is: " + str(maxIt(numbers))) 

      # Flag to stop the program once finished. 
      done = True 

main() 

電流輸出時不失敗getNum的測試(STR或浮動)/numInput:

Please enter an integer or < 0 to finish >: 222 
Please enter an integer or < 0 to finish >: 333 
Please enter an integer or < 0 to finish >: 444 
Please enter an integer or < 0 to finish >: test 
I was expecting an integer number, please try again... 

Please enter an integer or < 0 to finish >: 555 
Please enter an integer or < 0 to finish >: 666 
Please enter an integer or < 0 to finish >: 0 
Traceback (most recent call last): 
    File "C:\Users\Bar\Desktop\IS115\Peretz_A9.py", line 64, in <module> 
    main() 
    File "C:\Users\Bar\Desktop\IS115\Peretz_A9.py", line 59, in main 
    print("The maximum value is: " + str(maxIt(numbers))) 
    File "C:\Users\Bar\Desktop\IS115\Peretz_A9.py", line 37, in maxIt 
    if i > maxNum: 
TypeError: '>' not supported between instances of 'NoneType' and 'int' 
+4

問題是,您的嘗試除了返回null而不是循環 –

+1

此外,您應該更具體的錯誤處理 - 「ValueError'除外 - 並保持try塊儘可能短。 – jonrsharpe

回答

2

好了,問題是,你的函數getNum返回時的數量是無效的一個無,儘量速戰速決如下:

if numInput is not None: 
    numbers.append(numInput) 

但我也建議您閱讀:

Why is "except: pass" a bad programming practice?

並嘗試避免代碼中空的except子句!

1

的問題是你的try..except不返回任何東西在特殊情況下(返回None):

def getNum(prompt): 
    # Function to call when asking for the numbers later. 
    # Try/except to catch crashes if failing to store integer. 
    while True: 
     try: 
      x = input(prompt) 
      y = int(x) 
      return y 

     # Message to print when excepting. 
     except ValueError: 
      print("I was expecting an integer number, please try again... \n") 
0

問題:

def getNum(prompt): 
    # Function to call when asking for the numbers later. 
    # Try/except to catch crashes if failing to store integer. 
    try: 
     x = input(prompt) 
     y = int(x) 
     return y 

    # Message to print when excepting. 
    except: 
     print("I was expecting an integer number, please try again... \n") 
     # Returns None resulting in your error 

您可以將您的輸入在循環中避免這種情況位於功能getNum。實際上,當您在輸入中鍵入一些文本時,函數getNum會發生異常,因爲您試圖將非數字str轉換爲int,然後打印該消息並返回函數... None。將None存儲到numInput中,然後添加到列表中。你知道後面。

爲了使這項工作,你應該測試getNum的輸出。

0

您的getNum返回int或None(打印消息後)。 main無條件追加返回值,即使無。因此比較消息。更改

numbers.append(numInput) 

if isinstance(numInput, int): 
     numbers.append(numInput) 
相關問題